Add an advanced per-browser streaming opt-in with Cloudflare CPU risk guidance, while preserving progressive output when enabled.\n\nFixes #238
2695 lines
82 KiB
JSON
2695 lines
82 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"
|
|
},
|
|
"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/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": "Uploads an image or attachment resource for a memo. 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/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}": {
|
|
"parameters": [
|
|
{ "name": "id", "in": "path", "required": true, "schema": { "type": "string" } }
|
|
],
|
|
"put": {
|
|
"summary": "Import one resource from an EdgeEver ZIP",
|
|
"description": "Interactive-user-only resource import. The multipart metadata field contains the structured EdgeEver ZIP resource record.",
|
|
"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"]
|
|
},
|
|
"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"]
|
|
},
|
|
"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"]
|
|
}
|
|
}
|
|
}
|
|
}
|