{ "openapi": "3.1.0", "info": { "title": "EdgeEver API", "version": "0.1.0", "description": "REST API for EdgeEver notebooks, memos, resources, API tokens, and Agent integrations." }, "servers": [ { "url": "/" } ], "security": [ { "bearerAuth": [] }, { "cookieAuth": [] } ], "paths": { "/api/health": { "get": { "summary": "Health check", "security": [], "responses": { "200": { "description": "Runtime health", "content": { "application/json": { "schema": { "type": "object", "properties": { "ok": { "type": "boolean" }, "name": { "type": "string" }, "runtime": { "type": "string" }, "containerImageSource": { "type": "string", "enum": ["official-ghcr", "official-cn-mirror", "custom", "unknown"], "description": "Current container image repository classification for Docker deployments. Custom repository addresses are not exposed." }, "authMode": { "type": "string", "enum": ["required", "disabled"] }, "deployment": { "type": "object", "description": "Deployment trigger and execution method reported by the running instance.", "properties": { "trigger": { "type": "string", "enum": ["github_release", "main_push", "manual", "unknown"] }, "method": { "type": "string", "enum": ["github_actions", "cloudflare_workers_builds", "local_cli", "unknown"] } }, "required": ["trigger", "method"] } }, "required": ["ok", "name", "runtime", "authMode", "deployment"] } } } }, "503": { "$ref": "#/components/responses/Error" } } } }, "/api/openapi.json": { "get": { "summary": "OpenAPI schema", "security": [], "responses": { "200": { "description": "OpenAPI 3.1 schema" } } } }, "/api/v1/ai/settings": { "get": { "summary": "List AI providers, their models, and the workspace default model", "responses": { "200": { "description": "AI settings with all API keys omitted", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/AiSettings" } } } }, "401": { "$ref": "#/components/responses/Error" }, "403": { "$ref": "#/components/responses/Error" } } } }, "/api/v1/ai/providers": { "post": { "summary": "Add an AI provider service", "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/AiProviderCreateInput" } } } }, "responses": { "201": { "description": "Provider created" }, "400": { "$ref": "#/components/responses/Error" }, "401": { "$ref": "#/components/responses/Error" }, "403": { "$ref": "#/components/responses/Error" } } } }, "/api/v1/ai/providers/{providerConfigId}": { "parameters": [{ "name": "providerConfigId", "in": "path", "required": true, "schema": { "type": "string" } }], "put": { "summary": "Update or enable/disable an AI provider service", "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/AiProviderUpdateInput" } } } }, "responses": { "200": { "description": "Provider updated" }, "400": { "$ref": "#/components/responses/Error" }, "401": { "$ref": "#/components/responses/Error" }, "403": { "$ref": "#/components/responses/Error" }, "404": { "$ref": "#/components/responses/Error" } } }, "delete": { "summary": "Delete an AI provider and all of its models", "responses": { "200": { "description": "Provider deleted" }, "401": { "$ref": "#/components/responses/Error" }, "403": { "$ref": "#/components/responses/Error" }, "404": { "$ref": "#/components/responses/Error" } } } }, "/api/v1/ai/providers/{providerConfigId}/test": { "post": { "summary": "Test a saved AI provider with a model ID", "parameters": [{ "name": "providerConfigId", "in": "path", "required": true, "schema": { "type": "string" } }], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "properties": { "modelId": { "type": "string", "minLength": 1, "maxLength": 200 } }, "required": ["modelId"] } } } }, "responses": { "200": { "description": "The model endpoint responded successfully" }, "400": { "$ref": "#/components/responses/Error" }, "401": { "$ref": "#/components/responses/Error" }, "403": { "$ref": "#/components/responses/Error" } } } }, "/api/v1/ai/providers/{providerConfigId}/discover-models": { "post": { "summary": "Discover models exposed by a saved provider service", "parameters": [{ "name": "providerConfigId", "in": "path", "required": true, "schema": { "type": "string" } }], "responses": { "200": { "description": "Discovered models" }, "400": { "$ref": "#/components/responses/Error" }, "401": { "$ref": "#/components/responses/Error" }, "404": { "$ref": "#/components/responses/Error" } } } }, "/api/v1/ai/providers/{providerConfigId}/models": { "post": { "summary": "Add a model to an AI provider service", "parameters": [{ "name": "providerConfigId", "in": "path", "required": true, "schema": { "type": "string" } }], "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/AiModelCreateInput" } } } }, "responses": { "201": { "description": "Model added" }, "400": { "$ref": "#/components/responses/Error" }, "401": { "$ref": "#/components/responses/Error" }, "403": { "$ref": "#/components/responses/Error" }, "404": { "$ref": "#/components/responses/Error" } } } }, "/api/v1/ai/providers/{providerConfigId}/models/{modelConfigId}": { "delete": { "summary": "Remove a model from an AI provider service", "parameters": [ { "name": "providerConfigId", "in": "path", "required": true, "schema": { "type": "string" } }, { "name": "modelConfigId", "in": "path", "required": true, "schema": { "type": "string" } } ], "responses": { "200": { "description": "Model removed" }, "401": { "$ref": "#/components/responses/Error" }, "403": { "$ref": "#/components/responses/Error" }, "404": { "$ref": "#/components/responses/Error" } } } }, "/api/v1/ai/default-model": { "put": { "summary": "Choose or clear the workspace default AI model", "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "properties": { "modelConfigId": { "type": ["string", "null"] } }, "required": ["modelConfigId"] } } } }, "responses": { "200": { "description": "Default model updated" }, "400": { "$ref": "#/components/responses/Error" }, "401": { "$ref": "#/components/responses/Error" }, "403": { "$ref": "#/components/responses/Error" } } } }, "/api/v1/ai/direct-target": { "get": { "summary": "Return the default model endpoint without credentials", "description": "Used by the web app to probe whether the model host allows CORS before requesting a decrypted API key.", "responses": { "200": { "description": "Provider, base URL, and model ID for the workspace default model", "content": { "application/json": { "schema": { "type": "object", "properties": { "provider": { "type": "string", "enum": ["openai-compatible", "anthropic", "google"] }, "baseUrl": { "type": "string" }, "modelId": { "type": "string" } }, "required": ["provider", "baseUrl", "modelId"] } } } }, "401": { "$ref": "#/components/responses/Error" }, "409": { "$ref": "#/components/responses/Error" } } } }, "/api/v1/ai/generate/prepare": { "post": { "summary": "Resolve a note AI action into a provider request for native, desktop, or CORS-capable web clients", "description": "Returns the decrypted workspace model credentials and the resolved prompt. Native and desktop clients always use this, then call the model API directly. The web app uses it only after a CORS probe succeeds; otherwise it keeps using /api/v1/ai/generate so the API key stays off the page.", "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "properties": { "action": { "type": "string", "enum": ["summarize", "extract-key-points", "extract-todos", "rewrite-proofread", "translate", "improve-writing", "fix-spelling-grammar", "make-shorter", "make-longer", "simplify-language", "change-tone", "continue-writing", "custom"] }, "promptId": { "type": "string", "minLength": 1, "maxLength": 200 }, "locale": { "type": "string", "maxLength": 35 }, "title": { "type": "string", "maxLength": 160 }, "contentMarkdown": { "type": "string", "maxLength": 300000 }, "stream": { "type": "boolean", "default": false }, "targetLanguage": { "type": "string", "enum": ["en", "zh-CN", "zh-TW", "ja", "ko", "es", "fr", "de", "pt"] }, "tone": { "type": "string", "enum": ["professional", "friendly", "casual", "direct"] }, "instruction": { "type": "string", "minLength": 1, "maxLength": 2000 } }, "required": ["action", "title", "contentMarkdown"] } } } }, "responses": { "200": { "description": "Prepared provider request, including the decrypted API key", "content": { "application/json": { "schema": { "type": "object", "properties": { "provider": { "type": "string", "enum": ["openai-compatible", "anthropic", "google"] }, "baseUrl": { "type": "string" }, "apiKey": { "type": "string" }, "modelId": { "type": "string" }, "system": { "type": "string" }, "prompt": { "type": "string" }, "maxOutputTokens": { "type": "integer" }, "resultBoundary": { "type": "object", "properties": { "start": { "type": "string" }, "end": { "type": "string" } }, "required": ["start", "end"] } }, "required": ["provider", "baseUrl", "apiKey", "modelId", "system", "prompt", "maxOutputTokens", "resultBoundary"] } } } }, "400": { "$ref": "#/components/responses/Error" }, "401": { "$ref": "#/components/responses/Error" }, "403": { "$ref": "#/components/responses/Error" }, "404": { "$ref": "#/components/responses/Error" }, "409": { "$ref": "#/components/responses/Error" } } } }, "/api/v1/ai/generate": { "post": { "summary": "Run a note AI action using the current workspace model", "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "properties": { "action": { "type": "string", "enum": ["summarize", "extract-key-points", "extract-todos", "rewrite-proofread", "translate", "improve-writing", "fix-spelling-grammar", "make-shorter", "make-longer", "simplify-language", "change-tone", "continue-writing", "custom"] }, "promptId": { "type": "string", "minLength": 1, "maxLength": 200, "description": "Saved prompt to resolve inside the authenticated workspace" }, "locale": { "type": "string", "maxLength": 35 }, "title": { "type": "string", "maxLength": 160 }, "contentMarkdown": { "type": "string", "maxLength": 300000 }, "stream": { "type": "boolean", "default": false, "description": "Stream normalized text deltas when enabled; disabled by default for lower Worker CPU usage" }, "targetLanguage": { "type": "string", "enum": ["en", "zh-CN", "zh-TW", "ja", "ko", "es", "fr", "de", "pt"], "description": "Required when the action or selected prompt requests a target language" }, "tone": { "type": "string", "enum": ["professional", "friendly", "casual", "direct"] }, "instruction": { "type": "string", "minLength": 1, "maxLength": 2000, "description": "Freeform instruction; ignored when promptId is supplied" } }, "required": ["action", "title", "contentMarkdown"] } } } }, "responses": { "200": { "description": "Server-sent events containing start, text-delta, finish, or error events", "content": { "text/event-stream": { "schema": { "type": "string" } } } }, "400": { "$ref": "#/components/responses/Error" }, "401": { "$ref": "#/components/responses/Error" }, "403": { "$ref": "#/components/responses/Error" }, "404": { "$ref": "#/components/responses/Error" } } } }, "/api/v1/ai/prompts": { "get": { "summary": "List the current workspace prompt library", "parameters": [{ "name": "locale", "in": "query", "schema": { "type": "string" } }], "responses": { "200": { "description": "Localized prompt templates", "content": { "application/json": { "schema": { "type": "object", "properties": { "prompts": { "type": "array", "items": { "$ref": "#/components/schemas/AiPromptTemplate" } } }, "required": ["prompts"] } } } }, "401": { "$ref": "#/components/responses/Error" }, "403": { "$ref": "#/components/responses/Error" } } }, "post": { "summary": "Create a reusable prompt", "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/AiPromptCreateInput" } } } }, "responses": { "201": { "description": "Prompt created", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/AiPromptResponse" } } } }, "400": { "$ref": "#/components/responses/Error" }, "401": { "$ref": "#/components/responses/Error" }, "403": { "$ref": "#/components/responses/Error" } } } }, "/api/v1/ai/prompts/{promptId}": { "parameters": [{ "name": "promptId", "in": "path", "required": true, "schema": { "type": "string" } }], "patch": { "summary": "Update prompt text or execution behavior", "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/AiPromptUpdateInput" } } } }, "responses": { "200": { "description": "Prompt updated", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/AiPromptResponse" } } } }, "400": { "$ref": "#/components/responses/Error" }, "401": { "$ref": "#/components/responses/Error" }, "403": { "$ref": "#/components/responses/Error" }, "404": { "$ref": "#/components/responses/Error" } } }, "delete": { "summary": "Delete a prompt", "responses": { "200": { "$ref": "#/components/responses/Ok" }, "401": { "$ref": "#/components/responses/Error" }, "403": { "$ref": "#/components/responses/Error" }, "404": { "$ref": "#/components/responses/Error" } } } }, "/api/v1/ai/prompts/restore-defaults": { "post": { "summary": "Restore missing factory prompts without overwriting edits", "parameters": [{ "name": "locale", "in": "query", "schema": { "type": "string" } }], "responses": { "200": { "description": "Updated prompt list and restored count" }, "401": { "$ref": "#/components/responses/Error" }, "403": { "$ref": "#/components/responses/Error" } } } }, "/api/v1/restores/json/ai-prompts": { "post": { "summary": "Restore prompt templates from an EdgeEver ZIP backup", "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "properties": { "prompts": { "type": "array", "maxItems": 100, "items": { "$ref": "#/components/schemas/AiPromptTemplate" } } }, "required": ["prompts"] } } } }, "responses": { "200": { "$ref": "#/components/responses/Ok" }, "400": { "$ref": "#/components/responses/Error" }, "401": { "$ref": "#/components/responses/Error" }, "403": { "$ref": "#/components/responses/Error" } } } }, "/api/v1/auth/session": { "get": { "summary": "Read interactive session", "security": [], "responses": { "200": { "description": "Current session", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/AuthSession" } } } }, "503": { "$ref": "#/components/responses/Error" } } } }, "/api/v1/auth/sessions": { "get": { "summary": "List the current user's active login sessions", "responses": { "200": { "description": "Active login sessions ordered by latest activity", "content": { "application/json": { "schema": { "type": "object", "properties": { "sessions": { "type": "array", "items": { "$ref": "#/components/schemas/LoginDeviceSession" } } }, "required": ["sessions"] } } } }, "401": { "$ref": "#/components/responses/Error" } } }, "delete": { "summary": "Revoke all login sessions except the current session", "responses": { "200": { "description": "Other sessions revoked", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Ok" } } } }, "401": { "$ref": "#/components/responses/Error" } } }, "patch": { "summary": "Update a login device label", "parameters": [ { "name": "sessionId", "in": "path", "required": true, "schema": { "type": "string" } } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "properties": { "label": { "type": ["string", "null"], "maxLength": 80 } }, "required": ["label"] } } } }, "responses": { "200": { "description": "Device label updated", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Ok" } } } }, "401": { "$ref": "#/components/responses/Error" }, "404": { "$ref": "#/components/responses/Error" } } } }, "/api/v1/auth/sessions/{sessionId}": { "delete": { "summary": "Revoke one of the current user's other login sessions", "parameters": [ { "name": "sessionId", "in": "path", "required": true, "schema": { "type": "string" } } ], "responses": { "200": { "description": "Session revoked", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Ok" } } } }, "400": { "$ref": "#/components/responses/Error" }, "401": { "$ref": "#/components/responses/Error" }, "404": { "$ref": "#/components/responses/Error" } } } }, "/api/v1/auth/login": { "post": { "summary": "Create interactive session", "security": [], "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/LoginInput" } } } }, "responses": { "200": { "description": "Authenticated session", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/AuthSession" } } } }, "401": { "$ref": "#/components/responses/Error" }, "429": { "$ref": "#/components/responses/Error" }, "503": { "$ref": "#/components/responses/Error" } } } }, "/api/v1/auth/change-password": { "post": { "summary": "Change the current user's password", "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ChangePasswordInput" } } } }, "responses": { "200": { "description": "Password changed", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Ok" } } } }, "400": { "$ref": "#/components/responses/Error" }, "401": { "$ref": "#/components/responses/Error" } } } }, "/api/v1/auth/logout": { "post": { "summary": "Revoke interactive session", "responses": { "200": { "description": "Logout result", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Ok" } } } } } } }, "/api/v1/users": { "get": { "summary": "List instance users (owner only)", "responses": { "200": { "description": "Instance user list", "content": { "application/json": { "schema": { "type": "object", "properties": { "users": { "type": "array", "items": { "$ref": "#/components/schemas/InstanceUser" } } }, "required": ["users"] } } } }, "403": { "$ref": "#/components/responses/Error" } } }, "post": { "summary": "Create an isolated user workspace (owner only)", "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/UserCreateInput" } } } }, "responses": { "201": { "description": "Created user", "content": { "application/json": { "schema": { "type": "object", "properties": { "user": { "$ref": "#/components/schemas/InstanceUser" } }, "required": ["user"] } } } }, "403": { "$ref": "#/components/responses/Error" }, "409": { "$ref": "#/components/responses/Error" } } } }, "/api/v1/users/{id}": { "patch": { "summary": "Update, disable, or reset a user (owner only)", "parameters": [{ "name": "id", "in": "path", "required": true, "schema": { "type": "string" } }], "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/UserUpdateInput" } } } }, "responses": { "200": { "description": "Updated user", "content": { "application/json": { "schema": { "type": "object", "properties": { "user": { "$ref": "#/components/schemas/InstanceUser" } }, "required": ["user"] } } } }, "403": { "$ref": "#/components/responses/Error" }, "404": { "$ref": "#/components/responses/Error" } } } }, "/api/v1/instance/object-storage": { "get": { "summary": "Read instance object storage settings (owner only)", "responses": { "200": { "description": "Active and saved external object storage settings", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ObjectStorageSettingsResponse" } } } }, "403": { "$ref": "#/components/responses/Error" } } }, "put": { "summary": "Test and update instance object storage settings (owner only)", "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ObjectStorageSettingsUpdateInput" } } } }, "responses": { "200": { "description": "Updated object storage settings", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ObjectStorageSettingsResponse" } } } }, "400": { "$ref": "#/components/responses/Error" }, "403": { "$ref": "#/components/responses/Error" } } } }, "/api/v1/instance/object-storage/test": { "post": { "summary": "Test S3-compatible object storage with an upload/read/delete probe (owner only)", "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ObjectStorageConnectionTestInput" } } } }, "responses": { "200": { "$ref": "#/components/responses/Ok" }, "400": { "$ref": "#/components/responses/Error" }, "403": { "$ref": "#/components/responses/Error" } } } }, "/api/v1/notebooks": { "get": { "summary": "List notebooks", "responses": { "200": { "description": "Notebook list", "content": { "application/json": { "schema": { "type": "object", "properties": { "notebooks": { "type": "array", "items": { "$ref": "#/components/schemas/Notebook" } } }, "required": ["notebooks"] } } } } } }, "post": { "summary": "Create notebook", "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/NotebookCreateInput" } } } }, "responses": { "201": { "$ref": "#/components/responses/NotebookResponse" } } } }, "/api/v1/notebooks/{id}": { "parameters": [ { "$ref": "#/components/parameters/NotebookId" } ], "patch": { "summary": "Update notebook", "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/NotebookUpdateInput" } } } }, "responses": { "200": { "$ref": "#/components/responses/NotebookResponse" }, "409": { "$ref": "#/components/responses/Error" } } }, "delete": { "summary": "Soft-delete empty notebook", "responses": { "200": { "$ref": "#/components/responses/Ok" }, "409": { "$ref": "#/components/responses/Error" } } } }, "/api/v1/scheduled-tasks": { "get": { "summary": "List scheduled plugin commands", "parameters": [{ "name": "executorDeviceId", "in": "query", "schema": { "type": "string" } }], "responses": { "200": { "description": "Scheduled task list", "content": { "application/json": { "schema": { "type": "object", "properties": { "tasks": { "type": "array", "items": { "$ref": "#/components/schemas/ScheduledTask" } } }, "required": ["tasks"] } } } }, "403": { "$ref": "#/components/responses/Error" } } }, "post": { "summary": "Create a device-bound scheduled plugin command", "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ScheduledTaskCreateInput" } } } }, "responses": { "201": { "description": "Created scheduled task", "content": { "application/json": { "schema": { "type": "object", "properties": { "task": { "$ref": "#/components/schemas/ScheduledTask" } }, "required": ["task"] } } } }, "400": { "$ref": "#/components/responses/Error" }, "403": { "$ref": "#/components/responses/Error" } } } }, "/api/v1/scheduled-task-runs": { "get": { "summary": "List system-wide scheduled task execution history", "parameters": [ { "name": "offset", "in": "query", "schema": { "type": "integer", "minimum": 0, "default": 0 } }, { "name": "limit", "in": "query", "schema": { "type": "integer", "minimum": 1, "maximum": 100, "default": 50 } } ], "responses": { "200": { "description": "Workspace scheduled task execution history", "content": { "application/json": { "schema": { "type": "object", "properties": { "runs": { "type": "array", "items": { "$ref": "#/components/schemas/ScheduledTaskRunHistoryItem" } }, "totalCount": { "type": "integer" }, "nextOffset": { "type": ["integer", "null"] } }, "required": ["runs", "totalCount", "nextOffset"] } } } }, "403": { "$ref": "#/components/responses/Error" } } } }, "/api/v1/scheduled-tasks/{id}": { "parameters": [{ "name": "id", "in": "path", "required": true, "schema": { "type": "string" } }], "patch": { "summary": "Update a scheduled plugin command", "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ScheduledTaskUpdateInput" } } } }, "responses": { "200": { "description": "Updated scheduled task" }, "404": { "$ref": "#/components/responses/Error" } } }, "delete": { "summary": "Delete a scheduled plugin command", "responses": { "200": { "$ref": "#/components/responses/Ok" }, "404": { "$ref": "#/components/responses/Error" } } } }, "/api/v1/scheduled-tasks/plugin-upsert": { "post": { "summary": "Idempotently create or update a plugin-owned schedule", "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/PluginScheduleUpsertInput" } } } }, "responses": { "200": { "description": "Plugin-owned scheduled task", "content": { "application/json": { "schema": { "type": "object", "properties": { "task": { "$ref": "#/components/schemas/ScheduledTask" } }, "required": ["task"] } } } }, "400": { "$ref": "#/components/responses/Error" }, "403": { "$ref": "#/components/responses/Error" } } } }, "/api/v1/scheduled-tasks/plugin/{pluginId}": { "parameters": [{ "name": "pluginId", "in": "path", "required": true, "schema": { "type": "string" } }], "get": { "summary": "List schedules owned by one plugin", "responses": { "200": { "description": "Plugin schedule list" }, "403": { "$ref": "#/components/responses/Error" } } } }, "/api/v1/scheduled-tasks/plugin/{pluginId}/{scheduleKey}": { "parameters": [ { "name": "pluginId", "in": "path", "required": true, "schema": { "type": "string" } }, { "name": "scheduleKey", "in": "path", "required": true, "schema": { "type": "string" } } ], "delete": { "summary": "Delete a schedule owned by one plugin", "responses": { "200": { "$ref": "#/components/responses/Ok" }, "404": { "$ref": "#/components/responses/Error" } } } }, "/api/v1/scheduled-tasks/{id}/runs/claim": { "parameters": [{ "name": "id", "in": "path", "required": true, "schema": { "type": "string" } }], "post": { "summary": "Atomically claim one scheduled occurrence", "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ScheduledTaskClaimInput" } } } }, "responses": { "201": { "description": "Claimed task run" }, "409": { "$ref": "#/components/responses/Error" } } } }, "/api/v1/scheduled-tasks/{id}/runs": { "parameters": [{ "name": "id", "in": "path", "required": true, "schema": { "type": "string" } }], "get": { "summary": "List execution history for a scheduled task", "parameters": [ { "name": "offset", "in": "query", "schema": { "type": "integer", "minimum": 0, "default": 0 } }, { "name": "limit", "in": "query", "schema": { "type": "integer", "minimum": 1, "maximum": 100, "default": 50 } } ], "responses": { "200": { "description": "Scheduled task execution history", "content": { "application/json": { "schema": { "type": "object", "properties": { "runs": { "type": "array", "items": { "$ref": "#/components/schemas/ScheduledTaskRun" } }, "totalCount": { "type": "integer" }, "nextOffset": { "type": ["integer", "null"] } }, "required": ["runs", "totalCount", "nextOffset"] } } } }, "404": { "$ref": "#/components/responses/Error" } } } }, "/api/v1/scheduled-tasks/{taskId}/runs/{runId}/finish": { "parameters": [ { "name": "taskId", "in": "path", "required": true, "schema": { "type": "string" } }, { "name": "runId", "in": "path", "required": true, "schema": { "type": "string" } } ], "post": { "summary": "Finish a scheduled task run", "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ScheduledTaskFinishInput" } } } }, "responses": { "200": { "description": "Finished task run" }, "409": { "$ref": "#/components/responses/Error" } } } }, "/api/v1/workspace-extensions": { "get": { "summary": "List the workspace plugin and theme install catalog", "responses": { "200": { "description": "Workspace extension catalog, including tombstones", "content": { "application/json": { "schema": { "type": "object", "properties": { "extensions": { "type": "array", "items": { "$ref": "#/components/schemas/WorkspaceExtension" } } }, "required": ["extensions"] } } } }, "403": { "$ref": "#/components/responses/Error" } } } }, "/api/v1/workspace-extensions/{extensionId}": { "parameters": [{ "name": "extensionId", "in": "path", "required": true, "schema": { "type": "string" } }], "put": { "summary": "Create or update one workspace extension catalog entry", "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/WorkspaceExtensionUpsertInput" } } } }, "responses": { "200": { "description": "Upserted workspace extension", "content": { "application/json": { "schema": { "type": "object", "properties": { "extension": { "$ref": "#/components/schemas/WorkspaceExtension" } }, "required": ["extension"] } } } }, "400": { "$ref": "#/components/responses/Error" }, "403": { "$ref": "#/components/responses/Error" } } }, "delete": { "summary": "Tombstone a workspace extension catalog entry", "responses": { "200": { "description": "Tombstoned workspace extension", "content": { "application/json": { "schema": { "type": "object", "properties": { "extension": { "$ref": "#/components/schemas/WorkspaceExtension" } }, "required": ["extension"] } } } }, "403": { "$ref": "#/components/responses/Error" }, "404": { "$ref": "#/components/responses/Error" } } } }, "/api/v1/tags": { "get": { "summary": "List tag summaries", "responses": { "200": { "description": "Tag summaries", "content": { "application/json": { "schema": { "type": "object", "properties": { "tags": { "type": "array", "items": { "$ref": "#/components/schemas/TagSummary" } } }, "required": ["tags"] } } } } } } }, "/api/v1/tags/{tag}": { "parameters": [ { "name": "tag", "in": "path", "required": true, "schema": { "type": "string" } } ], "patch": { "summary": "Rename tag across active memos", "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/TagRenameInput" } } } }, "responses": { "200": { "$ref": "#/components/responses/UpdatedCount" } } }, "delete": { "summary": "Remove tag across active memos", "responses": { "200": { "$ref": "#/components/responses/UpdatedCount" } } } }, "/api/v1/api-tokens": { "get": { "summary": "List API tokens", "responses": { "200": { "description": "API token list", "content": { "application/json": { "schema": { "type": "object", "properties": { "apiTokens": { "type": "array", "items": { "$ref": "#/components/schemas/ApiToken" } }, "availableScopes": { "type": "array", "items": { "type": "string" } } }, "required": ["apiTokens", "availableScopes"] } } } } } }, "post": { "summary": "Create API token", "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiTokenCreateInput" } } } }, "responses": { "201": { "description": "Created token; plaintext token is shown once", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/CreatedApiToken" } } } } } } }, "/api/v1/api-tokens/{id}": { "parameters": [ { "$ref": "#/components/parameters/ApiTokenId" } ], "delete": { "summary": "Revoke API token", "responses": { "200": { "$ref": "#/components/responses/Ok" } } } }, "/api/v1/memos": { "get": { "summary": "List or search memos", "parameters": [ { "name": "notebookId", "in": "query", "schema": { "type": "string" } }, { "name": "includeDescendants", "in": "query", "description": "Include memos from all descendant notebooks when notebookId is set.", "schema": { "type": "string", "enum": ["1"] } }, { "name": "q", "in": "query", "schema": { "type": "string" } }, { "name": "trash", "in": "query", "schema": { "type": "string", "enum": ["1"] } }, { "name": "limit", "in": "query", "schema": { "type": "integer", "minimum": 1, "maximum": 200, "default": 100 } }, { "name": "cursor", "in": "query", "schema": { "type": "string" } }, { "name": "sort", "in": "query", "schema": { "type": "string", "enum": ["updated-desc", "created-desc", "title-asc"], "default": "updated-desc" } }, { "name": "filter", "in": "query", "schema": { "type": "string", "enum": ["all", "tagged", "untagged", "pinned"], "default": "all" } } ], "responses": { "200": { "description": "Memo summaries", "content": { "application/json": { "schema": { "type": "object", "properties": { "memos": { "type": "array", "items": { "$ref": "#/components/schemas/MemoSummary" } }, "totalCount": { "type": "integer", "minimum": 0 }, "nextCursor": { "type": ["string", "null"] } }, "required": ["memos", "totalCount", "nextCursor"] } } } } } }, "post": { "summary": "Create memo", "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/MemoCreateInput" } } } }, "responses": { "201": { "$ref": "#/components/responses/MemoResponse" } } } }, "/api/v1/memos/batch/move": { "post": { "summary": "Move memos to notebook", "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/MoveMemosInput" } } } }, "responses": { "200": { "description": "Move result", "content": { "application/json": { "schema": { "type": "object", "properties": { "ok": { "type": "boolean" }, "moved": { "type": "integer" } }, "required": ["ok", "moved"] } } } } } } }, "/api/v1/memos/batch/delete": { "post": { "summary": "Delete memos", "description": "Soft-deletes active memos, or permanently deletes trashed memos when permanent is true.", "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/DeleteMemosInput" } } } }, "responses": { "200": { "description": "Delete result", "content": { "application/json": { "schema": { "type": "object", "properties": { "ok": { "type": "boolean" }, "deleted": { "type": "integer" } }, "required": ["ok", "deleted"] } } } } } } }, "/api/v1/memos/trash/empty": { "delete": { "summary": "Empty trash", "description": "Permanently deletes all trashed memos and their remaining resource objects.", "responses": { "200": { "description": "Empty trash result", "content": { "application/json": { "schema": { "type": "object", "properties": { "ok": { "type": "boolean" }, "deleted": { "type": "integer" } }, "required": ["ok", "deleted"] } } } } } } }, "/api/v1/memos/merge": { "post": { "summary": "Merge memos", "description": "Creates a new memo, joins source Markdown with separators, soft-deletes source memos, and re-points resources to the new memo.", "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/MergeMemosInput" } } } }, "responses": { "201": { "$ref": "#/components/responses/MemoResponse" } } } }, "/api/v1/memos/{id}": { "parameters": [ { "$ref": "#/components/parameters/MemoId" } ], "get": { "summary": "Get memo detail", "parameters": [ { "name": "includeDeleted", "in": "query", "schema": { "type": "string", "enum": ["1"] } } ], "responses": { "200": { "$ref": "#/components/responses/MemoResponse" } } }, "patch": { "summary": "Update memo", "description": "Use expectedRevision for optimistic concurrency. A mismatch returns revision_conflict.", "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/MemoUpdateInput" } } } }, "responses": { "200": { "$ref": "#/components/responses/MemoResponse" }, "409": { "$ref": "#/components/responses/Error" } } }, "delete": { "summary": "Soft-delete or permanently delete memo", "parameters": [ { "name": "permanent", "in": "query", "schema": { "type": "string", "enum": ["1"] } } ], "responses": { "200": { "$ref": "#/components/responses/Ok" } } } }, "/api/v1/memos/{id}/edit-sessions": { "parameters": [ { "$ref": "#/components/parameters/MemoId" } ], "post": { "summary": "Start a bound memo edit session", "description": "Binds an edit session to the memo id, current revision, current content hash, and authenticated actor.", "responses": { "200": { "description": "Bound edit session", "content": { "application/json": { "schema": { "type": "object", "properties": { "editSession": { "$ref": "#/components/schemas/MemoEditSession" } }, "required": ["editSession"] } } } } } } }, "/api/v1/memos/{id}/share": { "parameters": [ { "$ref": "#/components/parameters/MemoId" } ], "get": { "summary": "Read the active public share for a memo", "responses": { "200": { "description": "Current share status", "content": { "application/json": { "schema": { "type": "object", "properties": { "share": { "oneOf": [ { "$ref": "#/components/schemas/MemoShare" }, { "type": "null" } ] } }, "required": ["share"] } } } } } }, "post": { "summary": "Create or return a public read-only share link", "responses": { "200": { "description": "Existing share", "content": { "application/json": { "schema": { "type": "object", "properties": { "share": { "$ref": "#/components/schemas/MemoShare" } }, "required": ["share"] } } } }, "201": { "description": "Share created", "content": { "application/json": { "schema": { "type": "object", "properties": { "share": { "$ref": "#/components/schemas/MemoShare" } }, "required": ["share"] } } } } } }, "delete": { "summary": "Revoke a public memo share", "responses": { "200": { "$ref": "#/components/responses/Ok" }, "404": { "$ref": "#/components/responses/Error" } } } }, "/api/v1/memos/{id}/restore": { "parameters": [ { "$ref": "#/components/parameters/MemoId" } ], "post": { "summary": "Restore memo from trash", "responses": { "200": { "$ref": "#/components/responses/MemoResponse" } } } }, "/api/v1/memos/{id}/revisions": { "parameters": [ { "$ref": "#/components/parameters/MemoId" } ], "get": { "summary": "List memo revisions", "parameters": [ { "name": "limit", "in": "query", "schema": { "type": "integer", "minimum": 1, "maximum": 100, "default": 50 } } ], "responses": { "200": { "description": "Memo revisions", "content": { "application/json": { "schema": { "type": "object", "properties": { "revisions": { "type": "array", "items": { "$ref": "#/components/schemas/MemoRevision" } } }, "required": ["revisions"] } } } } } } }, "/api/v1/memos/{id}/revisions/{revisionId}/restore": { "parameters": [ { "$ref": "#/components/parameters/MemoId" }, { "name": "revisionId", "in": "path", "required": true, "schema": { "type": "string" } } ], "post": { "summary": "Restore a memo revision", "responses": { "200": { "$ref": "#/components/responses/MemoResponse" } } } }, "/api/v1/memos/{id}/resources": { "parameters": [ { "$ref": "#/components/parameters/MemoId" } ], "post": { "summary": "Upload an image or attachment resource for a memo", "description": "Legacy single-request upload for files up to 100 MiB. New clients should use the resumable multipart upload endpoints. Images are stored as provided; server-side compression is disabled.", "requestBody": { "required": true, "content": { "multipart/form-data": { "schema": { "type": "object", "properties": { "file": { "type": "string", "format": "binary" } }, "required": ["file"] } } } }, "responses": { "201": { "description": "Uploaded resource", "content": { "application/json": { "schema": { "type": "object", "properties": { "resource": { "$ref": "#/components/schemas/Resource" } }, "required": ["resource"] } } } } } } }, "/api/v1/memos/{id}/resource-uploads": { "parameters": [ { "$ref": "#/components/parameters/MemoId" } ], "post": { "summary": "Initialize a resumable resource upload", "description": "Creates an 8 MiB-part upload session. Attachments support up to 1 GiB; images support up to 100 MiB to keep decoding and previews bounded. The session expires after 24 hours.", "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "properties": { "filename": { "type": "string" }, "mimeType": { "type": "string" }, "byteSize": { "type": "integer", "minimum": 1, "maximum": 1073741824 } }, "required": ["filename", "mimeType", "byteSize"] } } } }, "responses": { "201": { "description": "Initialized upload", "content": { "application/json": { "schema": { "type": "object", "properties": { "upload": { "$ref": "#/components/schemas/ResourceUpload" } }, "required": ["upload"] } } } } } } }, "/api/v1/resource-uploads/{uploadId}/parts/{partNumber}": { "parameters": [ { "name": "uploadId", "in": "path", "required": true, "schema": { "type": "string" } }, { "name": "partNumber", "in": "path", "required": true, "schema": { "type": "integer", "minimum": 1 } } ], "put": { "summary": "Upload or replace one resource part", "description": "Streams one exact-sized part to object storage. Repeating a part number safely replaces that part.", "requestBody": { "required": true, "content": { "application/octet-stream": { "schema": { "type": "string", "format": "binary" } } } }, "responses": { "200": { "description": "Part stored" } } } }, "/api/v1/resource-uploads/{uploadId}/complete": { "parameters": [ { "name": "uploadId", "in": "path", "required": true, "schema": { "type": "string" } } ], "post": { "summary": "Complete a resource upload", "responses": { "201": { "description": "Completed resource", "content": { "application/json": { "schema": { "type": "object", "properties": { "resource": { "$ref": "#/components/schemas/Resource" } }, "required": ["resource"] } } } } } } }, "/api/v1/resource-uploads/{uploadId}": { "parameters": [ { "name": "uploadId", "in": "path", "required": true, "schema": { "type": "string" } } ], "delete": { "summary": "Abort a resource upload", "responses": { "200": { "description": "Upload aborted" } } } }, "/api/v1/exports/markdown": { "get": { "summary": "Read a page of Markdown export data", "description": "Returns active memo details and their resource metadata for browser-side Markdown ZIP generation. Requires read:memos and read:resources scopes.", "parameters": [ { "name": "offset", "in": "query", "schema": { "type": "integer", "minimum": 0, "default": 0 } }, { "name": "limit", "in": "query", "schema": { "type": "integer", "minimum": 1, "maximum": 100, "default": 50 } } ], "responses": { "200": { "description": "A page of active memos and related resources", "content": { "application/json": { "schema": { "type": "object", "properties": { "memos": { "type": "array", "items": { "$ref": "#/components/schemas/MemoDetail" } }, "resources": { "type": "array", "items": { "$ref": "#/components/schemas/Resource" } }, "totalCount": { "type": "integer" }, "nextOffset": { "type": ["integer", "null"] } }, "required": ["memos", "resources", "totalCount", "nextOffset"] } } } } } } }, "/api/v1/backups/json": { "get": { "summary": "Read a page of EdgeEver ZIP recovery data", "description": "Returns active memo details, revision history, and resource metadata for browser-side EdgeEver ZIP generation. The resulting archive also contains human-readable Markdown. Trash is excluded.", "parameters": [ { "name": "offset", "in": "query", "schema": { "type": "integer", "minimum": 0, "default": 0 } }, { "name": "limit", "in": "query", "schema": { "type": "integer", "minimum": 1, "maximum": 50, "default": 25 } } ], "responses": { "200": { "description": "A page of logical backup data", "content": { "application/json": { "schema": { "type": "object", "properties": { "memos": { "type": "array", "items": { "$ref": "#/components/schemas/MemoDetail" } }, "resources": { "type": "array", "items": { "$ref": "#/components/schemas/Resource" } }, "revisions": { "type": "array", "items": { "type": "object", "additionalProperties": true } }, "totalCount": { "type": "integer" }, "nextOffset": { "type": ["integer", "null"] } }, "required": ["memos", "resources", "revisions", "totalCount", "nextOffset"] } } } } } } }, "/api/v1/restores/json/notebooks": { "post": { "summary": "Import a batch of notebooks from an EdgeEver ZIP", "description": "Interactive-user-only merge restore. Matching EdgeEver notebook IDs are overwritten.", "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "properties": { "notebooks": { "type": "array", "minItems": 1, "maxItems": 100, "items": { "type": "object", "additionalProperties": true } } }, "required": ["notebooks"] } } } }, "responses": { "200": { "$ref": "#/components/responses/Ok" } } } }, "/api/v1/restores/json/memos": { "post": { "summary": "Import a batch of memos from an EdgeEver ZIP", "description": "Interactive-user-only merge restore, including current content and revision history. Matching EdgeEver memo IDs are overwritten.", "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "properties": { "memos": { "type": "array", "minItems": 1, "maxItems": 10, "items": { "type": "object", "additionalProperties": true } } }, "required": ["memos"] } } } }, "responses": { "200": { "$ref": "#/components/responses/Ok" } } } }, "/api/v1/restores/json/resources/{id}/uploads": { "parameters": [ { "name": "id", "in": "path", "required": true, "schema": { "type": "string" } } ], "post": { "summary": "Initialize a resumable resource restore", "description": "Interactive-user-only restore session that preserves the resource ID from an EdgeEver ZIP. The client streams decompressed bytes through the shared 8 MiB multipart endpoints, supporting attachments up to 1 GiB without buffering the resource or archive in memory.", "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true } } } }, "responses": { "201": { "description": "Initialized restore upload", "content": { "application/json": { "schema": { "type": "object", "properties": { "upload": { "$ref": "#/components/schemas/ResourceUpload" } }, "required": ["upload"] } } } } } } }, "/api/v1/restores/json/resources/{id}": { "parameters": [ { "name": "id", "in": "path", "required": true, "schema": { "type": "string" } } ], "put": { "summary": "Import one small resource from an EdgeEver ZIP (legacy)", "description": "Interactive-user-only compatibility endpoint for resources up to 100 MiB. Larger restores use the resumable restore session so request parsing remains memory-bounded.", "requestBody": { "required": true, "content": { "multipart/form-data": { "schema": { "type": "object", "properties": { "metadata": { "type": "string" }, "file": { "type": "string", "format": "binary" } }, "required": ["metadata", "file"] } } } }, "responses": { "200": { "$ref": "#/components/responses/Ok" } } } }, "/api/v1/resources": { "get": { "summary": "List resources and storage summary", "parameters": [ { "name": "limit", "in": "query", "schema": { "type": "integer", "minimum": 1, "maximum": 500, "default": 500 } } ], "responses": { "200": { "description": "Resource list", "content": { "application/json": { "schema": { "type": "object", "properties": { "resources": { "type": "array", "items": { "$ref": "#/components/schemas/ResourceListItem" } }, "summary": { "$ref": "#/components/schemas/ResourceStorageSummary" } }, "required": ["resources", "summary"] } } } } } } }, "/api/v1/resources/{id}": { "parameters": [ { "name": "id", "in": "path", "required": true, "schema": { "type": "string" } } ], "patch": { "summary": "Rename a resource", "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "properties": { "filename": { "type": "string", "minLength": 1, "maxLength": 160 } }, "required": ["filename"] } } } }, "responses": { "200": { "description": "Renamed resource", "content": { "application/json": { "schema": { "type": "object", "properties": { "resource": { "$ref": "#/components/schemas/Resource" } }, "required": ["resource"] } } } }, "404": { "$ref": "#/components/responses/Error" } } }, "delete": { "summary": "Delete a resource", "responses": { "200": { "$ref": "#/components/responses/Ok" }, "404": { "$ref": "#/components/responses/Error" } } } }, "/api/v1/resources/{id}/blob": { "parameters": [ { "name": "id", "in": "path", "required": true, "schema": { "type": "string" } } ], "get": { "summary": "Read resource bytes", "responses": { "200": { "description": "Resource blob" } } } }, "/api/public/shares/{token}": { "parameters": [ { "name": "token", "in": "path", "required": true, "schema": { "type": "string" } } ], "get": { "summary": "Read a publicly shared note", "security": [], "responses": { "200": { "description": "Public read-only note", "content": { "application/json": { "schema": { "type": "object", "properties": { "share": { "$ref": "#/components/schemas/PublicMemoShare" } }, "required": ["share"] } } } }, "404": { "$ref": "#/components/responses/Error" } } } }, "/api/public/shares/{token}/resources/{resourceId}/blob": { "parameters": [ { "name": "token", "in": "path", "required": true, "schema": { "type": "string" } }, { "name": "resourceId", "in": "path", "required": true, "schema": { "type": "string" } } ], "get": { "summary": "Read an attachment belonging to a publicly shared note", "security": [], "responses": { "200": { "description": "Shared resource blob" }, "404": { "$ref": "#/components/responses/Error" } } } }, "/mcp": { "get": { "summary": "Describe MCP endpoint", "security": [], "responses": { "200": { "description": "MCP endpoint metadata" } } }, "post": { "summary": "MCP Streamable HTTP JSON-RPC endpoint", "description": "Supports initialize, tools/list, tools/call, notifications/initialized, and batch requests.", "requestBody": { "required": true, "content": { "application/json": { "schema": { "oneOf": [ { "$ref": "#/components/schemas/JsonRpcRequest" }, { "type": "array", "items": { "$ref": "#/components/schemas/JsonRpcRequest" } } ] } } } }, "responses": { "200": { "description": "JSON-RPC response" }, "204": { "description": "Notification accepted" } } } } }, "components": { "securitySchemes": { "bearerAuth": { "type": "http", "scheme": "bearer" }, "cookieAuth": { "type": "apiKey", "in": "cookie", "name": "edgeever_session" } }, "parameters": { "NotebookId": { "name": "id", "in": "path", "required": true, "schema": { "type": "string" } }, "MemoId": { "name": "id", "in": "path", "required": true, "schema": { "type": "string" } }, "ApiTokenId": { "name": "id", "in": "path", "required": true, "schema": { "type": "string" } } }, "responses": { "Ok": { "description": "OK", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Ok" } } } }, "Error": { "description": "API error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } } }, "NotebookResponse": { "description": "Notebook response", "content": { "application/json": { "schema": { "type": "object", "properties": { "notebook": { "$ref": "#/components/schemas/Notebook" } }, "required": ["notebook"] } } } }, "MemoResponse": { "description": "Memo response", "content": { "application/json": { "schema": { "type": "object", "properties": { "memo": { "$ref": "#/components/schemas/MemoDetail" } }, "required": ["memo"] } } } }, "UpdatedCount": { "description": "Updated count", "content": { "application/json": { "schema": { "type": "object", "properties": { "ok": { "type": "boolean" }, "updated": { "type": "integer" } }, "required": ["ok", "updated"] } } } } }, "schemas": { "Ok": { "type": "object", "properties": { "ok": { "type": "boolean" } }, "required": ["ok"] }, "ScheduledTaskRun": { "type": "object", "properties": { "id": { "type": "string" }, "taskId": { "type": "string" }, "scheduledFor": { "type": "string", "format": "date-time" }, "executorDeviceId": { "type": "string" }, "status": { "type": "string", "enum": ["running", "succeeded", "failed"] }, "errorMessage": { "type": ["string", "null"] }, "startedAt": { "type": "string", "format": "date-time" }, "finishedAt": { "type": ["string", "null"], "format": "date-time" } }, "required": ["id", "taskId", "scheduledFor", "executorDeviceId", "status", "errorMessage", "startedAt", "finishedAt"] }, "ScheduledTaskRunHistoryItem": { "allOf": [ { "$ref": "#/components/schemas/ScheduledTaskRun" }, { "type": "object", "properties": { "taskName": { "type": "string" }, "pluginId": { "type": "string" }, "ownerPluginId": { "type": ["string", "null"] }, "pluginScheduleKey": { "type": ["string", "null"] } }, "required": ["taskName", "pluginId", "ownerPluginId", "pluginScheduleKey"] } ] }, "ScheduledTask": { "type": "object", "properties": { "id": { "type": "string" }, "name": { "type": "string" }, "taskType": { "type": "string", "const": "plugin-command" }, "taskPayload": { "$ref": "#/components/schemas/ScheduledTaskPayload" }, "ownerPluginId": { "type": ["string", "null"] }, "pluginScheduleKey": { "type": ["string", "null"] }, "cronExpression": { "type": "string" }, "timezone": { "type": "string" }, "executorDeviceId": { "type": "string" }, "missedRunPolicy": { "type": "string", "enum": ["run-once", "skip"] }, "isEnabled": { "type": "boolean" }, "createdAt": { "type": "string", "format": "date-time" }, "updatedAt": { "type": "string", "format": "date-time" }, "lastRun": { "oneOf": [{ "$ref": "#/components/schemas/ScheduledTaskRun" }, { "type": "null" }] } }, "required": ["id", "name", "taskType", "taskPayload", "ownerPluginId", "pluginScheduleKey", "cronExpression", "timezone", "executorDeviceId", "missedRunPolicy", "isEnabled", "createdAt", "updatedAt", "lastRun"] }, "ScheduledTaskPayload": { "type": "object", "properties": { "pluginId": { "type": "string" }, "commandId": { "type": "string" } }, "required": ["pluginId", "commandId"] }, "ScheduledTaskCreateInput": { "type": "object", "properties": { "name": { "type": "string", "maxLength": 120 }, "taskType": { "type": "string", "const": "plugin-command" }, "taskPayload": { "$ref": "#/components/schemas/ScheduledTaskPayload" }, "cronExpression": { "type": "string", "maxLength": 160 }, "timezone": { "type": "string", "maxLength": 80 }, "executorDeviceId": { "type": "string" }, "missedRunPolicy": { "type": "string", "enum": ["run-once", "skip"], "default": "run-once" }, "isEnabled": { "type": "boolean", "default": true } }, "required": ["name", "taskType", "taskPayload", "cronExpression", "timezone", "executorDeviceId"] }, "ScheduledTaskUpdateInput": { "type": "object", "properties": { "name": { "type": "string", "maxLength": 120 }, "taskPayload": { "$ref": "#/components/schemas/ScheduledTaskPayload" }, "cronExpression": { "type": "string", "maxLength": 160 }, "timezone": { "type": "string", "maxLength": 80 }, "executorDeviceId": { "type": "string" }, "missedRunPolicy": { "type": "string", "enum": ["run-once", "skip"] }, "isEnabled": { "type": "boolean" } } }, "PluginScheduleUpsertInput": { "type": "object", "properties": { "pluginId": { "type": "string" }, "scheduleKey": { "type": "string", "maxLength": 120 }, "name": { "type": "string", "maxLength": 120 }, "commandId": { "type": "string", "maxLength": 200 }, "cronExpression": { "type": "string", "maxLength": 160 }, "timezone": { "type": "string", "maxLength": 80 }, "executorDeviceId": { "type": "string" }, "missedRunPolicy": { "type": "string", "enum": ["run-once", "skip"], "default": "run-once" }, "isEnabled": { "type": "boolean" } }, "required": ["pluginId", "scheduleKey", "name", "commandId", "cronExpression", "timezone", "executorDeviceId"] }, "ScheduledTaskClaimInput": { "type": "object", "properties": { "scheduledFor": { "type": "string", "format": "date-time" }, "executorDeviceId": { "type": "string" } }, "required": ["scheduledFor", "executorDeviceId"] }, "ScheduledTaskFinishInput": { "type": "object", "properties": { "executorDeviceId": { "type": "string" }, "status": { "type": "string", "enum": ["succeeded", "failed"] }, "errorMessage": { "type": ["string", "null"], "maxLength": 2000 } }, "required": ["executorDeviceId", "status"] }, "WorkspaceExtension": { "type": "object", "properties": { "extensionId": { "type": "string" }, "type": { "type": "string", "enum": ["plugin", "theme"] }, "version": { "type": "string" }, "enabled": { "type": "boolean" }, "installedAt": { "type": "string", "format": "date-time" }, "updatedAt": { "type": "string", "format": "date-time" }, "deletedAt": { "type": ["string", "null"], "format": "date-time" }, "manifestUrl": { "type": "string", "format": "uri" }, "sourceKind": { "type": "string", "enum": ["marketplace", "github", "manifest"] }, "verified": { "type": "boolean" }, "repositoryUrl": { "type": ["string", "null"], "format": "uri" }, "releaseTag": { "type": ["string", "null"] }, "publisher": { "type": ["string", "null"], "enum": ["edgeever", null] } }, "required": ["extensionId", "type", "version", "enabled", "installedAt", "updatedAt", "deletedAt", "manifestUrl", "sourceKind", "verified", "repositoryUrl", "releaseTag", "publisher"] }, "WorkspaceExtensionUpsertInput": { "type": "object", "properties": { "type": { "type": "string", "enum": ["plugin", "theme"] }, "version": { "type": "string" }, "enabled": { "type": "boolean" }, "installedAt": { "type": "string", "format": "date-time" }, "manifestUrl": { "type": "string", "format": "uri" }, "sourceKind": { "type": "string", "enum": ["marketplace", "github", "manifest"] }, "verified": { "type": "boolean" }, "repositoryUrl": { "type": ["string", "null"], "format": "uri" }, "releaseTag": { "type": ["string", "null"] }, "publisher": { "type": ["string", "null"], "enum": ["edgeever", null] } }, "required": ["type", "version", "enabled", "installedAt", "manifestUrl", "sourceKind", "verified"] }, "ApiError": { "type": "object", "properties": { "error": { "type": "object", "properties": { "code": { "type": "string" }, "message": { "type": "string" }, "details": {} }, "required": ["code", "message"] } }, "required": ["error"] }, "AuthSession": { "type": "object", "properties": { "authRequired": { "type": "boolean" }, "authenticated": { "type": "boolean" }, "demoMode": { "type": "boolean" }, "user": { "oneOf": [ { "$ref": "#/components/schemas/AuthUser" }, { "type": "null" } ] } }, "required": ["authRequired", "authenticated", "demoMode", "user"] }, "LoginDeviceSession": { "type": "object", "properties": { "id": { "type": "string" }, "userAgent": { "type": ["string", "null"] }, "label": { "type": ["string", "null"] }, "ipAddress": { "type": ["string", "null"] }, "ipCountry": { "type": ["string", "null"] }, "ipRegion": { "type": ["string", "null"] }, "isCurrent": { "type": "boolean" }, "createdAt": { "type": "string", "format": "date-time" }, "lastSeenAt": { "type": "string", "format": "date-time" }, "expiresAt": { "type": "string", "format": "date-time" } }, "required": ["id", "userAgent", "label", "ipAddress", "ipCountry", "ipRegion", "isCurrent", "createdAt", "lastSeenAt", "expiresAt"] }, "AuthUser": { "type": "object", "properties": { "id": { "type": "string" }, "username": { "type": "string" }, "displayName": { "type": ["string", "null"] }, "role": { "type": "string", "enum": ["owner", "member"] } }, "required": ["id", "username", "displayName", "role"] }, "InstanceUser": { "allOf": [ { "$ref": "#/components/schemas/AuthUser" }, { "type": "object", "properties": { "isDisabled": { "type": "boolean" }, "lastLoginAt": { "type": ["string", "null"], "format": "date-time" }, "createdAt": { "type": "string", "format": "date-time" } }, "required": ["isDisabled", "lastLoginAt", "createdAt"] } ] }, "UserCreateInput": { "type": "object", "properties": { "username": { "type": "string", "minLength": 1, "maxLength": 80 }, "displayName": { "type": ["string", "null"], "maxLength": 80 }, "password": { "type": "string", "minLength": 8, "maxLength": 512 } }, "required": ["username", "password"] }, "UserUpdateInput": { "type": "object", "properties": { "displayName": { "type": ["string", "null"], "maxLength": 80 }, "password": { "type": "string", "minLength": 8, "maxLength": 512 }, "isDisabled": { "type": "boolean" } }, "minProperties": 1 }, "ObjectStorageSettings": { "type": "object", "properties": { "provider": { "type": "string", "enum": ["builtin", "s3"] }, "displayName": { "type": "string" }, "endpoint": { "type": ["string", "null"] }, "region": { "type": ["string", "null"] }, "bucket": { "type": ["string", "null"] }, "accessKeyId": { "type": ["string", "null"] }, "hasSecretAccessKey": { "type": "boolean" }, "forcePathStyle": { "type": "boolean" }, "objectPrefix": { "type": "string" }, "encryptionConfigured": { "type": "boolean" } }, "required": ["provider", "displayName", "endpoint", "region", "bucket", "accessKeyId", "hasSecretAccessKey", "forcePathStyle", "objectPrefix", "encryptionConfigured"] }, "ObjectStorageSettingsResponse": { "type": "object", "properties": { "settings": { "$ref": "#/components/schemas/ObjectStorageSettings" }, "externalSettings": { "oneOf": [{ "$ref": "#/components/schemas/ObjectStorageSettings" }, { "type": "null" }] } }, "required": ["settings"] }, "ObjectStorageS3Input": { "type": "object", "properties": { "endpoint": { "type": "string", "format": "uri", "maxLength": 500 }, "region": { "type": "string", "minLength": 1, "maxLength": 80 }, "bucket": { "type": "string", "minLength": 1, "maxLength": 255 }, "accessKeyId": { "type": "string", "minLength": 1, "maxLength": 256 }, "secretAccessKey": { "type": "string", "minLength": 1, "maxLength": 1024 }, "forcePathStyle": { "type": "boolean", "default": true }, "objectPrefix": { "type": "string", "maxLength": 500, "default": "" } }, "required": ["endpoint", "region", "bucket", "accessKeyId"] }, "ObjectStorageConnectionTestInput": { "$ref": "#/components/schemas/ObjectStorageS3Input" }, "ObjectStorageSettingsUpdateInput": { "oneOf": [ { "type": "object", "properties": { "provider": { "const": "builtin" } }, "required": ["provider"] }, { "allOf": [ { "$ref": "#/components/schemas/ObjectStorageS3Input" }, { "type": "object", "properties": { "provider": { "const": "s3" }, "displayName": { "type": "string", "minLength": 1, "maxLength": 80 } }, "required": ["provider", "displayName"] } ] } ] }, "AiModel": { "type": "object", "properties": { "id": { "type": "string" }, "providerConfigId": { "type": "string" }, "modelId": { "type": "string" }, "displayName": { "type": "string" } }, "required": ["id", "providerConfigId", "modelId", "displayName"] }, "AiProvider": { "type": "object", "properties": { "id": { "type": "string" }, "provider": { "type": "string", "enum": ["openai-compatible", "anthropic", "google"] }, "displayName": { "type": "string" }, "baseUrl": { "type": "string", "format": "uri" }, "isEnabled": { "type": "boolean" }, "hasApiKey": { "type": "boolean" }, "models": { "type": "array", "items": { "$ref": "#/components/schemas/AiModel" } } }, "required": ["id", "provider", "displayName", "baseUrl", "isEnabled", "hasApiKey", "models"] }, "AiSettings": { "type": "object", "properties": { "providers": { "type": "array", "items": { "$ref": "#/components/schemas/AiProvider" } }, "defaultModelId": { "type": ["string", "null"] }, "encryptionConfigured": { "type": "boolean" }, "readOnly": { "type": "boolean" } }, "required": ["providers", "defaultModelId", "encryptionConfigured", "readOnly"] }, "AiProviderCreateInput": { "type": "object", "properties": { "provider": { "type": "string", "enum": ["openai-compatible", "anthropic", "google"] }, "displayName": { "type": "string", "minLength": 1, "maxLength": 80 }, "baseUrl": { "type": "string", "format": "uri", "maxLength": 500 }, "apiKey": { "type": "string", "minLength": 1, "maxLength": 4096 }, "isEnabled": { "type": "boolean", "default": true }, "initialModelId": { "type": "string", "minLength": 1, "maxLength": 200 } }, "required": ["provider", "displayName", "baseUrl", "apiKey"] }, "AiProviderUpdateInput": { "type": "object", "properties": { "provider": { "type": "string", "enum": ["openai-compatible", "anthropic", "google"] }, "displayName": { "type": "string", "minLength": 1, "maxLength": 80 }, "baseUrl": { "type": "string", "format": "uri", "maxLength": 500 }, "apiKey": { "type": "string", "minLength": 1, "maxLength": 4096 }, "isEnabled": { "type": "boolean", "default": true } }, "required": ["provider", "displayName", "baseUrl"] }, "AiModelCreateInput": { "type": "object", "properties": { "modelId": { "type": "string", "minLength": 1, "maxLength": 200 }, "displayName": { "type": "string", "minLength": 1, "maxLength": 200 } }, "required": ["modelId"] }, "AiPromptTemplate": { "type": "object", "properties": { "id": { "type": "string" }, "origin": { "type": "string", "enum": ["default", "custom"] }, "seedKey": { "type": ["string", "null"] }, "action": { "type": "string", "enum": ["summarize", "extract-key-points", "extract-todos", "rewrite-proofread", "translate", "improve-writing", "fix-spelling-grammar", "make-shorter", "make-longer", "simplify-language", "change-tone", "continue-writing", "custom"] }, "parameterKind": { "type": "string", "enum": ["none", "target-language", "tone"] }, "resultMode": { "type": "string", "enum": ["append", "replace", "both"] }, "nameCustomized": { "type": "boolean" }, "descriptionCustomized": { "type": "boolean" }, "instructionCustomized": { "type": "boolean" }, "name": { "type": "string", "minLength": 1, "maxLength": 80 }, "description": { "type": ["string", "null"], "maxLength": 200 }, "instruction": { "type": "string", "minLength": 1, "maxLength": 2000 }, "createdAt": { "type": "string", "format": "date-time" }, "updatedAt": { "type": "string", "format": "date-time" } }, "required": ["id", "origin", "seedKey", "action", "parameterKind", "resultMode", "nameCustomized", "descriptionCustomized", "instructionCustomized", "name", "description", "instruction", "createdAt", "updatedAt"] }, "AiPromptCreateInput": { "type": "object", "properties": { "name": { "type": "string", "minLength": 1, "maxLength": 80 }, "description": { "type": "string", "maxLength": 200 }, "instruction": { "type": "string", "minLength": 1, "maxLength": 2000 }, "parameterKind": { "type": "string", "enum": ["none", "target-language", "tone"], "default": "none" }, "resultMode": { "type": "string", "enum": ["append", "replace", "both"], "default": "both" } }, "required": ["name", "instruction"] }, "AiPromptUpdateInput": { "type": "object", "minProperties": 1, "properties": { "name": { "type": "string", "minLength": 1, "maxLength": 80 }, "description": { "type": ["string", "null"], "maxLength": 200 }, "instruction": { "type": "string", "minLength": 1, "maxLength": 2000 }, "parameterKind": { "type": "string", "enum": ["none", "target-language", "tone"] }, "resultMode": { "type": "string", "enum": ["append", "replace", "both"] } } }, "AiPromptResponse": { "type": "object", "properties": { "prompt": { "$ref": "#/components/schemas/AiPromptTemplate" } }, "required": ["prompt"] }, "LoginInput": { "type": "object", "properties": { "username": { "type": "string" }, "password": { "type": "string" }, "deviceId": { "type": "string", "minLength": 16, "maxLength": 160, "description": "Stable client installation identifier used to replace older sessions from the same device" } }, "required": ["username", "password"] }, "ChangePasswordInput": { "type": "object", "properties": { "currentPassword": { "type": "string", "minLength": 1, "maxLength": 512 }, "newPassword": { "type": "string", "minLength": 8, "maxLength": 512 }, "confirmPassword": { "type": "string", "minLength": 8, "maxLength": 512 } }, "required": ["currentPassword", "newPassword", "confirmPassword"] }, "Notebook": { "type": "object", "properties": { "id": { "type": "string" }, "parentId": { "type": ["string", "null"] }, "name": { "type": "string" }, "slug": { "type": ["string", "null"] }, "icon": { "type": ["string", "null"] }, "color": { "type": ["string", "null"] }, "sortOrder": { "type": "integer" }, "memoCount": { "type": "integer" }, "lastMemoUpdatedAt": { "type": ["string", "null"], "format": "date-time" }, "createdAt": { "type": "string", "format": "date-time" }, "updatedAt": { "type": "string", "format": "date-time" } }, "required": ["id", "parentId", "name", "slug", "icon", "color", "sortOrder", "memoCount", "lastMemoUpdatedAt", "createdAt", "updatedAt"] }, "NotebookCreateInput": { "type": "object", "properties": { "name": { "type": "string", "minLength": 1, "maxLength": 80 }, "parentId": { "type": ["string", "null"] } }, "required": ["name"] }, "NotebookUpdateInput": { "type": "object", "properties": { "name": { "type": "string", "minLength": 1, "maxLength": 80 }, "parentId": { "type": ["string", "null"] }, "sortOrder": { "type": "integer" } } }, "MemoSummary": { "type": "object", "properties": { "id": { "type": "string" }, "notebookId": { "type": "string" }, "title": { "type": ["string", "null"] }, "excerpt": { "type": "string" }, "tags": { "type": "array", "items": { "type": "string" } }, "isPinned": { "type": "boolean" }, "isArchived": { "type": "boolean" }, "isDeleted": { "type": "boolean" }, "revision": { "type": "integer" }, "createdAt": { "type": "string", "format": "date-time" }, "updatedAt": { "type": "string", "format": "date-time" }, "deletedAt": { "type": ["string", "null"], "format": "date-time" } }, "required": ["id", "notebookId", "title", "excerpt", "tags", "isPinned", "isArchived", "isDeleted", "revision", "createdAt", "updatedAt", "deletedAt"] }, "MemoDetail": { "allOf": [ { "$ref": "#/components/schemas/MemoSummary" }, { "type": "object", "properties": { "contentJson": { "$ref": "#/components/schemas/TiptapDoc" }, "contentMarkdown": { "type": "string" }, "contentText": { "type": "string" }, "contentHash": { "type": "string", "minLength": 64, "maxLength": 64 }, "sourceMemoIds": { "type": "array", "items": { "type": "string" } }, "mergeSourceCount": { "type": "integer" }, "mergedIntoMemoId": { "type": ["string", "null"] } }, "required": ["contentJson", "contentMarkdown", "contentText", "contentHash", "sourceMemoIds", "mergeSourceCount", "mergedIntoMemoId"] } ] }, "MemoShare": { "type": "object", "properties": { "memoId": { "type": "string" }, "token": { "type": "string" }, "createdAt": { "type": "string", "format": "date-time" }, "updatedAt": { "type": "string", "format": "date-time" } }, "required": ["memoId", "token", "createdAt", "updatedAt"] }, "PublicMemoShare": { "type": "object", "properties": { "title": { "type": ["string", "null"] }, "contentJson": { "$ref": "#/components/schemas/TiptapDoc" }, "contentMarkdown": { "type": "string" }, "tags": { "type": "array", "items": { "type": "string" } }, "updatedAt": { "type": "string", "format": "date-time" } }, "required": ["title", "contentJson", "contentMarkdown", "tags", "updatedAt"] }, "MemoCreateInput": { "type": "object", "properties": { "notebookId": { "type": "string" }, "title": { "type": "string", "maxLength": 160 }, "contentMarkdown": { "type": "string" }, "tags": { "type": "array", "items": { "type": "string" } } }, "required": ["notebookId"] }, "MemoUpdateInput": { "type": "object", "properties": { "expectedRevision": { "type": "integer", "minimum": 0 }, "expectedContentHash": { "type": "string", "minLength": 64, "maxLength": 64 }, "editSessionId": { "type": "string" }, "notebookId": { "type": "string" }, "title": { "type": "string", "maxLength": 160 }, "isPinned": { "type": "boolean" }, "contentJson": { "$ref": "#/components/schemas/TiptapDoc" }, "contentMarkdown": { "type": "string" }, "tags": { "type": "array", "items": { "type": "string" } } } }, "MemoEditSession": { "type": "object", "properties": { "id": { "type": "string" }, "memoId": { "type": "string" }, "baseRevision": { "type": "integer", "minimum": 0 }, "baseContentHash": { "type": "string", "minLength": 64, "maxLength": 64 }, "expiresAt": { "type": "string", "format": "date-time" } }, "required": ["id", "memoId", "baseRevision", "baseContentHash", "expiresAt"] }, "MoveMemosInput": { "type": "object", "properties": { "memoIds": { "type": "array", "minItems": 1, "maxItems": 100, "items": { "type": "string" } }, "notebookId": { "type": "string" } }, "required": ["memoIds", "notebookId"] }, "DeleteMemosInput": { "type": "object", "properties": { "memoIds": { "type": "array", "minItems": 1, "maxItems": 100, "items": { "type": "string" } }, "permanent": { "type": "boolean" } }, "required": ["memoIds"] }, "MergeMemosInput": { "type": "object", "properties": { "memoIds": { "type": "array", "minItems": 2, "maxItems": 50, "items": { "type": "string" } }, "notebookId": { "type": "string" }, "title": { "type": "string", "maxLength": 160 } }, "required": ["memoIds"] }, "MemoRevision": { "type": "object", "properties": { "id": { "type": "string" }, "memoId": { "type": "string" }, "revision": { "type": "integer" }, "title": { "type": ["string", "null"] }, "tags": { "type": "array", "items": { "type": "string" } }, "contentMarkdown": { "type": "string" }, "contentText": { "type": "string" }, "contentHash": { "type": "string" }, "createdBy": { "type": "string" }, "createdAt": { "type": "string", "format": "date-time" } }, "required": ["id", "memoId", "revision", "title", "tags", "contentMarkdown", "contentText", "contentHash", "createdBy", "createdAt"] }, "TagSummary": { "type": "object", "properties": { "name": { "type": "string" }, "memoCount": { "type": "integer" }, "updatedAt": { "type": ["string", "null"], "format": "date-time" } }, "required": ["name", "memoCount", "updatedAt"] }, "TagRenameInput": { "type": "object", "properties": { "name": { "type": "string", "minLength": 1, "maxLength": 80 } }, "required": ["name"] }, "ApiToken": { "type": "object", "properties": { "id": { "type": "string" }, "name": { "type": "string" }, "token": { "type": ["string", "null"] }, "scopes": { "type": "array", "items": { "type": "string" } }, "lastUsedAt": { "type": ["string", "null"], "format": "date-time" }, "expiresAt": { "type": ["string", "null"], "format": "date-time" }, "isRevoked": { "type": "boolean" }, "createdAt": { "type": "string", "format": "date-time" } }, "required": ["id", "name", "token", "scopes", "lastUsedAt", "expiresAt", "isRevoked", "createdAt"] }, "ApiTokenCreateInput": { "type": "object", "properties": { "name": { "type": "string", "minLength": 1, "maxLength": 80 }, "scopes": { "type": "array", "minItems": 1, "maxItems": 32, "items": { "type": "string" } }, "expiresAt": { "type": ["string", "null"], "format": "date-time" } }, "required": ["name", "scopes"] }, "CreatedApiToken": { "type": "object", "properties": { "token": { "type": "string" }, "apiToken": { "$ref": "#/components/schemas/ApiToken" } }, "required": ["token", "apiToken"] }, "Resource": { "type": "object", "properties": { "id": { "type": "string" }, "memoId": { "type": "string" }, "originalMemoId": { "type": ["string", "null"] }, "kind": { "type": "string", "enum": ["image", "attachment"] }, "mimeType": { "type": ["string", "null"] }, "filename": { "type": ["string", "null"] }, "byteSize": { "type": "integer" }, "sha256": { "type": ["string", "null"] }, "width": { "type": ["integer", "null"] }, "height": { "type": ["integer", "null"] }, "createdAt": { "type": "string", "format": "date-time" }, "updatedAt": { "type": "string", "format": "date-time" }, "url": { "type": "string" } }, "required": ["id", "memoId", "originalMemoId", "kind", "mimeType", "filename", "byteSize", "sha256", "width", "height", "createdAt", "updatedAt", "url"] }, "ResourceUpload": { "type": "object", "properties": { "id": { "type": "string" }, "resourceId": { "type": "string" }, "partSize": { "type": "integer", "const": 8388608 }, "partCount": { "type": "integer", "minimum": 1, "maximum": 50 }, "byteSize": { "type": "integer", "minimum": 1, "maximum": 1073741824 }, "expiresAt": { "type": "string", "format": "date-time" } }, "required": ["id", "resourceId", "partSize", "partCount", "byteSize", "expiresAt"] }, "ResourceListItem": { "allOf": [ { "$ref": "#/components/schemas/Resource" }, { "type": "object", "properties": { "memoTitle": { "type": ["string", "null"] }, "memoExcerpt": { "type": ["string", "null"] }, "memoDeleted": { "type": "boolean" } }, "required": ["memoTitle", "memoExcerpt", "memoDeleted"] } ] }, "ResourceStorageSummary": { "type": "object", "properties": { "totalCount": { "type": "integer" }, "totalBytes": { "type": "integer" }, "imageCount": { "type": "integer" }, "attachmentCount": { "type": "integer" } }, "required": ["totalCount", "totalBytes", "imageCount", "attachmentCount"] }, "TiptapDoc": { "type": "object", "additionalProperties": true, "properties": { "type": { "type": "string", "const": "doc" }, "content": { "type": "array", "items": { "type": "object", "additionalProperties": true } } }, "required": ["type", "content"] }, "JsonRpcRequest": { "type": "object", "properties": { "jsonrpc": { "type": "string", "const": "2.0" }, "id": { "type": ["string", "number", "null"] }, "method": { "type": "string" }, "params": {} }, "required": ["jsonrpc", "method"] } } } }