Files
edgeever/docs/openapi.json
T

3083 lines
99 KiB
JSON

{
"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"]
}
},
"required": ["ok", "name", "runtime", "authMode"]
}
}
}
},
"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/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/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"]
},
"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"]
}
}
}
}