From 782963ae66a0d129ab3a7c54a5cd789f7af5b367 Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Tue, 5 May 2026 20:47:29 +0100 Subject: [PATCH] refactor: compact generated protocol metadata --- .../json/DynamicToolCallParams.json | 20 +- .../json/v2/ErrorNotification.json | 69 +- .../json/v2/GetAccountResponse.json | 35 +- .../json/v2/ModelListResponse.json | 108 +- .../json/v2/ThreadResumeResponse.json | 1066 +- .../json/v2/ThreadStartResponse.json | 1066 +- .../json/v2/TurnCompletedNotification.json | 668 +- .../json/v2/TurnStartResponse.json | 665 +- .../codex/src/app-server/run-attempt.ts | 2 +- scripts/check-codex-app-server-protocol.ts | 6 +- ...enerate-bundled-channel-config-metadata.ts | 29 +- scripts/lib/plugin-npm-package-manifest.mjs | 43 +- scripts/sync-codex-app-server-protocol.ts | 6 +- ...ndled-channel-config-metadata.generated.ts | 18203 +--------------- src/plugin-sdk/agent-harness-runtime.ts | 2 +- 15 files changed, 821 insertions(+), 21167 deletions(-) diff --git a/extensions/codex/src/app-server/protocol-generated/json/DynamicToolCallParams.json b/extensions/codex/src/app-server/protocol-generated/json/DynamicToolCallParams.json index 7b884b6f205..812682bdce3 100644 --- a/extensions/codex/src/app-server/protocol-generated/json/DynamicToolCallParams.json +++ b/extensions/codex/src/app-server/protocol-generated/json/DynamicToolCallParams.json @@ -5,20 +5,10 @@ "required": ["arguments", "callId", "threadId", "tool", "turnId"], "properties": { "arguments": true, - "callId": { - "type": "string" - }, - "namespace": { - "type": ["string", "null"] - }, - "threadId": { - "type": "string" - }, - "tool": { - "type": "string" - }, - "turnId": { - "type": "string" - } + "callId": { "type": "string" }, + "namespace": { "type": ["string", "null"] }, + "threadId": { "type": "string" }, + "tool": { "type": "string" }, + "turnId": { "type": "string" } } } diff --git a/extensions/codex/src/app-server/protocol-generated/json/v2/ErrorNotification.json b/extensions/codex/src/app-server/protocol-generated/json/v2/ErrorNotification.json index 0ec20b64cf4..1f02701b0e7 100644 --- a/extensions/codex/src/app-server/protocol-generated/json/v2/ErrorNotification.json +++ b/extensions/codex/src/app-server/protocol-generated/json/v2/ErrorNotification.json @@ -4,18 +4,10 @@ "type": "object", "required": ["error", "threadId", "turnId", "willRetry"], "properties": { - "error": { - "$ref": "#/definitions/TurnError" - }, - "threadId": { - "type": "string" - }, - "turnId": { - "type": "string" - }, - "willRetry": { - "type": "boolean" - } + "error": { "$ref": "#/definitions/TurnError" }, + "threadId": { "type": "string" }, + "turnId": { "type": "string" }, + "willRetry": { "type": "boolean" } }, "definitions": { "CodexErrorInfo": { @@ -43,11 +35,7 @@ "httpConnectionFailed": { "type": "object", "properties": { - "httpStatusCode": { - "type": ["integer", "null"], - "format": "uint16", - "minimum": 0.0 - } + "httpStatusCode": { "type": ["integer", "null"], "format": "uint16", "minimum": 0 } } } }, @@ -62,11 +50,7 @@ "responseStreamConnectionFailed": { "type": "object", "properties": { - "httpStatusCode": { - "type": ["integer", "null"], - "format": "uint16", - "minimum": 0.0 - } + "httpStatusCode": { "type": ["integer", "null"], "format": "uint16", "minimum": 0 } } } }, @@ -81,11 +65,7 @@ "responseStreamDisconnected": { "type": "object", "properties": { - "httpStatusCode": { - "type": ["integer", "null"], - "format": "uint16", - "minimum": 0.0 - } + "httpStatusCode": { "type": ["integer", "null"], "format": "uint16", "minimum": 0 } } } }, @@ -100,11 +80,7 @@ "responseTooManyFailedAttempts": { "type": "object", "properties": { - "httpStatusCode": { - "type": ["integer", "null"], - "format": "uint16", - "minimum": 0.0 - } + "httpStatusCode": { "type": ["integer", "null"], "format": "uint16", "minimum": 0 } } } }, @@ -119,11 +95,7 @@ "activeTurnNotSteerable": { "type": "object", "required": ["turnKind"], - "properties": { - "turnKind": { - "$ref": "#/definitions/NonSteerableTurnKind" - } - } + "properties": { "turnKind": { "$ref": "#/definitions/NonSteerableTurnKind" } } } }, "additionalProperties": false, @@ -131,31 +103,16 @@ } ] }, - "NonSteerableTurnKind": { - "type": "string", - "enum": ["review", "compact"] - }, + "NonSteerableTurnKind": { "type": "string", "enum": ["review", "compact"] }, "TurnError": { "type": "object", "required": ["message"], "properties": { - "additionalDetails": { - "default": null, - "type": ["string", "null"] - }, + "additionalDetails": { "default": null, "type": ["string", "null"] }, "codexErrorInfo": { - "anyOf": [ - { - "$ref": "#/definitions/CodexErrorInfo" - }, - { - "type": "null" - } - ] + "anyOf": [{ "$ref": "#/definitions/CodexErrorInfo" }, { "type": "null" }] }, - "message": { - "type": "string" - } + "message": { "type": "string" } } } } diff --git a/extensions/codex/src/app-server/protocol-generated/json/v2/GetAccountResponse.json b/extensions/codex/src/app-server/protocol-generated/json/v2/GetAccountResponse.json index 0dea51020f8..e5e26fe695c 100644 --- a/extensions/codex/src/app-server/protocol-generated/json/v2/GetAccountResponse.json +++ b/extensions/codex/src/app-server/protocol-generated/json/v2/GetAccountResponse.json @@ -4,19 +4,8 @@ "type": "object", "required": ["requiresOpenaiAuth"], "properties": { - "account": { - "anyOf": [ - { - "$ref": "#/definitions/Account" - }, - { - "type": "null" - } - ] - }, - "requiresOpenaiAuth": { - "type": "boolean" - } + "account": { "anyOf": [{ "$ref": "#/definitions/Account" }, { "type": "null" }] }, + "requiresOpenaiAuth": { "type": "boolean" } }, "definitions": { "Account": { @@ -25,11 +14,7 @@ "type": "object", "required": ["type"], "properties": { - "type": { - "type": "string", - "enum": ["apiKey"], - "title": "ApiKeyAccountType" - } + "type": { "type": "string", "enum": ["apiKey"], "title": "ApiKeyAccountType" } }, "title": "ApiKeyAccount" }, @@ -37,17 +22,9 @@ "type": "object", "required": ["email", "planType", "type"], "properties": { - "email": { - "type": "string" - }, - "planType": { - "$ref": "#/definitions/PlanType" - }, - "type": { - "type": "string", - "enum": ["chatgpt"], - "title": "ChatgptAccountType" - } + "email": { "type": "string" }, + "planType": { "$ref": "#/definitions/PlanType" }, + "type": { "type": "string", "enum": ["chatgpt"], "title": "ChatgptAccountType" } }, "title": "ChatgptAccount" }, diff --git a/extensions/codex/src/app-server/protocol-generated/json/v2/ModelListResponse.json b/extensions/codex/src/app-server/protocol-generated/json/v2/ModelListResponse.json index e5fdee037ca..7f4c9ca9444 100644 --- a/extensions/codex/src/app-server/protocol-generated/json/v2/ModelListResponse.json +++ b/extensions/codex/src/app-server/protocol-generated/json/v2/ModelListResponse.json @@ -4,12 +4,7 @@ "type": "object", "required": ["data"], "properties": { - "data": { - "type": "array", - "items": { - "$ref": "#/definitions/Model" - } - }, + "data": { "type": "array", "items": { "$ref": "#/definitions/Model" } }, "nextCursor": { "description": "Opaque cursor to pass to the next call to continue after the last item. If None, there are no more items to return.", "type": ["string", "null"] @@ -44,101 +39,46 @@ "supportedReasoningEfforts" ], "properties": { - "additionalSpeedTiers": { - "default": [], - "type": "array", - "items": { - "type": "string" - } - }, + "additionalSpeedTiers": { "default": [], "type": "array", "items": { "type": "string" } }, "availabilityNux": { - "anyOf": [ - { - "$ref": "#/definitions/ModelAvailabilityNux" - }, - { - "type": "null" - } - ] - }, - "defaultReasoningEffort": { - "$ref": "#/definitions/ReasoningEffort" - }, - "description": { - "type": "string" - }, - "displayName": { - "type": "string" - }, - "hidden": { - "type": "boolean" - }, - "id": { - "type": "string" + "anyOf": [{ "$ref": "#/definitions/ModelAvailabilityNux" }, { "type": "null" }] }, + "defaultReasoningEffort": { "$ref": "#/definitions/ReasoningEffort" }, + "description": { "type": "string" }, + "displayName": { "type": "string" }, + "hidden": { "type": "boolean" }, + "id": { "type": "string" }, "inputModalities": { "default": ["text", "image"], "type": "array", - "items": { - "$ref": "#/definitions/InputModality" - } - }, - "isDefault": { - "type": "boolean" - }, - "model": { - "type": "string" + "items": { "$ref": "#/definitions/InputModality" } }, + "isDefault": { "type": "boolean" }, + "model": { "type": "string" }, "supportedReasoningEfforts": { "type": "array", - "items": { - "$ref": "#/definitions/ReasoningEffortOption" - } - }, - "supportsPersonality": { - "default": false, - "type": "boolean" - }, - "upgrade": { - "type": ["string", "null"] + "items": { "$ref": "#/definitions/ReasoningEffortOption" } }, + "supportsPersonality": { "default": false, "type": "boolean" }, + "upgrade": { "type": ["string", "null"] }, "upgradeInfo": { - "anyOf": [ - { - "$ref": "#/definitions/ModelUpgradeInfo" - }, - { - "type": "null" - } - ] + "anyOf": [{ "$ref": "#/definitions/ModelUpgradeInfo" }, { "type": "null" }] } } }, "ModelAvailabilityNux": { "type": "object", "required": ["message"], - "properties": { - "message": { - "type": "string" - } - } + "properties": { "message": { "type": "string" } } }, "ModelUpgradeInfo": { "type": "object", "required": ["model"], "properties": { - "migrationMarkdown": { - "type": ["string", "null"] - }, - "model": { - "type": "string" - }, - "modelLink": { - "type": ["string", "null"] - }, - "upgradeCopy": { - "type": ["string", "null"] - } + "migrationMarkdown": { "type": ["string", "null"] }, + "model": { "type": "string" }, + "modelLink": { "type": ["string", "null"] }, + "upgradeCopy": { "type": ["string", "null"] } } }, "ReasoningEffort": { @@ -150,12 +90,8 @@ "type": "object", "required": ["description", "reasoningEffort"], "properties": { - "description": { - "type": "string" - }, - "reasoningEffort": { - "$ref": "#/definitions/ReasoningEffort" - } + "description": { "type": "string" }, + "reasoningEffort": { "$ref": "#/definitions/ReasoningEffort" } } } } diff --git a/extensions/codex/src/app-server/protocol-generated/json/v2/ThreadResumeResponse.json b/extensions/codex/src/app-server/protocol-generated/json/v2/ThreadResumeResponse.json index 9792e37d2d5..eac156d5773 100644 --- a/extensions/codex/src/app-server/protocol-generated/json/v2/ThreadResumeResponse.json +++ b/extensions/codex/src/app-server/protocol-generated/json/v2/ThreadResumeResponse.json @@ -15,86 +15,36 @@ "activePermissionProfile": { "description": "Named or implicit built-in profile that produced the active permissions, when known.", "default": null, - "anyOf": [ - { - "$ref": "#/definitions/ActivePermissionProfile" - }, - { - "type": "null" - } - ] - }, - "approvalPolicy": { - "$ref": "#/definitions/AskForApproval" + "anyOf": [{ "$ref": "#/definitions/ActivePermissionProfile" }, { "type": "null" }] }, + "approvalPolicy": { "$ref": "#/definitions/AskForApproval" }, "approvalsReviewer": { "description": "Reviewer currently used for approval requests on this thread.", - "allOf": [ - { - "$ref": "#/definitions/ApprovalsReviewer" - } - ] - }, - "cwd": { - "$ref": "#/definitions/AbsolutePathBuf" + "allOf": [{ "$ref": "#/definitions/ApprovalsReviewer" }] }, + "cwd": { "$ref": "#/definitions/AbsolutePathBuf" }, "instructionSources": { "description": "Instruction source files currently loaded for this thread.", "default": [], "type": "array", - "items": { - "$ref": "#/definitions/AbsolutePathBuf" - } - }, - "model": { - "type": "string" - }, - "modelProvider": { - "type": "string" + "items": { "$ref": "#/definitions/AbsolutePathBuf" } }, + "model": { "type": "string" }, + "modelProvider": { "type": "string" }, "permissionProfile": { "description": "Full active permissions for this thread. `activePermissionProfile` carries display/provenance metadata for this runtime profile.", "default": null, - "anyOf": [ - { - "$ref": "#/definitions/PermissionProfile" - }, - { - "type": "null" - } - ] + "anyOf": [{ "$ref": "#/definitions/PermissionProfile" }, { "type": "null" }] }, "reasoningEffort": { - "anyOf": [ - { - "$ref": "#/definitions/ReasoningEffort" - }, - { - "type": "null" - } - ] + "anyOf": [{ "$ref": "#/definitions/ReasoningEffort" }, { "type": "null" }] }, "sandbox": { "description": "Legacy sandbox policy retained for compatibility. Experimental clients should prefer `permissionProfile` when they need exact runtime permissions.", - "allOf": [ - { - "$ref": "#/definitions/SandboxPolicy" - } - ] + "allOf": [{ "$ref": "#/definitions/SandboxPolicy" }] }, - "serviceTier": { - "anyOf": [ - { - "$ref": "#/definitions/ServiceTier" - }, - { - "type": "null" - } - ] - }, - "thread": { - "$ref": "#/definitions/Thread" - } + "serviceTier": { "anyOf": [{ "$ref": "#/definitions/ServiceTier" }, { "type": "null" }] }, + "thread": { "$ref": "#/definitions/Thread" } }, "definitions": { "AbsolutePathBuf": { @@ -118,9 +68,7 @@ "description": "Bounded user-requested modifications applied on top of the named profile, if any.", "default": [], "type": "array", - "items": { - "$ref": "#/definitions/ActivePermissionProfileModification" - } + "items": { "$ref": "#/definitions/ActivePermissionProfileModification" } } } }, @@ -131,9 +79,7 @@ "type": "object", "required": ["path", "type"], "properties": { - "path": { - "$ref": "#/definitions/AbsolutePathBuf" - }, + "path": { "$ref": "#/definitions/AbsolutePathBuf" }, "type": { "type": "string", "enum": ["additionalWritableRoot"], @@ -144,9 +90,7 @@ } ] }, - "AgentPath": { - "type": "string" - }, + "AgentPath": { "type": "string" }, "ApprovalsReviewer": { "description": "Configures who approval requests are routed to for review. Examples include sandbox escapes, blocked network access, MCP approval prompts, and ARC escalations. Defaults to `user`. `auto_review` uses a carefully prompted subagent to gather relevant context and apply a risk-based decision framework before approving or denying the request. The legacy value `guardian_subagent` is accepted for compatibility.", "type": "string", @@ -154,10 +98,7 @@ }, "AskForApproval": { "oneOf": [ - { - "type": "string", - "enum": ["untrusted", "on-failure", "on-request", "never"] - }, + { "type": "string", "enum": ["untrusted", "on-failure", "on-request", "never"] }, { "type": "object", "required": ["granular"], @@ -166,23 +107,11 @@ "type": "object", "required": ["mcp_elicitations", "rules", "sandbox_approval"], "properties": { - "mcp_elicitations": { - "type": "boolean" - }, - "request_permissions": { - "default": false, - "type": "boolean" - }, - "rules": { - "type": "boolean" - }, - "sandbox_approval": { - "type": "boolean" - }, - "skill_approval": { - "default": false, - "type": "boolean" - } + "mcp_elicitations": { "type": "boolean" }, + "request_permissions": { "default": false, "type": "boolean" }, + "rules": { "type": "boolean" }, + "sandbox_approval": { "type": "boolean" }, + "skill_approval": { "default": false, "type": "boolean" } } } }, @@ -195,16 +124,8 @@ "type": "object", "required": ["end", "start"], "properties": { - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - } + "end": { "type": "integer", "format": "uint", "minimum": 0 }, + "start": { "type": "integer", "format": "uint", "minimum": 0 } } }, "CodexErrorInfo": { @@ -232,11 +153,7 @@ "httpConnectionFailed": { "type": "object", "properties": { - "httpStatusCode": { - "type": ["integer", "null"], - "format": "uint16", - "minimum": 0.0 - } + "httpStatusCode": { "type": ["integer", "null"], "format": "uint16", "minimum": 0 } } } }, @@ -251,11 +168,7 @@ "responseStreamConnectionFailed": { "type": "object", "properties": { - "httpStatusCode": { - "type": ["integer", "null"], - "format": "uint16", - "minimum": 0.0 - } + "httpStatusCode": { "type": ["integer", "null"], "format": "uint16", "minimum": 0 } } } }, @@ -270,11 +183,7 @@ "responseStreamDisconnected": { "type": "object", "properties": { - "httpStatusCode": { - "type": ["integer", "null"], - "format": "uint16", - "minimum": 0.0 - } + "httpStatusCode": { "type": ["integer", "null"], "format": "uint16", "minimum": 0 } } } }, @@ -289,11 +198,7 @@ "responseTooManyFailedAttempts": { "type": "object", "properties": { - "httpStatusCode": { - "type": ["integer", "null"], - "format": "uint16", - "minimum": 0.0 - } + "httpStatusCode": { "type": ["integer", "null"], "format": "uint16", "minimum": 0 } } } }, @@ -308,11 +213,7 @@ "activeTurnNotSteerable": { "type": "object", "required": ["turnKind"], - "properties": { - "turnKind": { - "$ref": "#/definitions/NonSteerableTurnKind" - } - } + "properties": { "turnKind": { "$ref": "#/definitions/NonSteerableTurnKind" } } } }, "additionalProperties": false, @@ -324,12 +225,8 @@ "type": "object", "required": ["status"], "properties": { - "message": { - "type": ["string", "null"] - }, - "status": { - "$ref": "#/definitions/CollabAgentStatus" - } + "message": { "type": ["string", "null"] }, + "status": { "$ref": "#/definitions/CollabAgentStatus" } } }, "CollabAgentStatus": { @@ -358,20 +255,10 @@ "type": "object", "required": ["command", "name", "path", "type"], "properties": { - "command": { - "type": "string" - }, - "name": { - "type": "string" - }, - "path": { - "$ref": "#/definitions/AbsolutePathBuf" - }, - "type": { - "type": "string", - "enum": ["read"], - "title": "ReadCommandActionType" - } + "command": { "type": "string" }, + "name": { "type": "string" }, + "path": { "$ref": "#/definitions/AbsolutePathBuf" }, + "type": { "type": "string", "enum": ["read"], "title": "ReadCommandActionType" } }, "title": "ReadCommandAction" }, @@ -379,12 +266,8 @@ "type": "object", "required": ["command", "type"], "properties": { - "command": { - "type": "string" - }, - "path": { - "type": ["string", "null"] - }, + "command": { "type": "string" }, + "path": { "type": ["string", "null"] }, "type": { "type": "string", "enum": ["listFiles"], @@ -397,20 +280,10 @@ "type": "object", "required": ["command", "type"], "properties": { - "command": { - "type": "string" - }, - "path": { - "type": ["string", "null"] - }, - "query": { - "type": ["string", "null"] - }, - "type": { - "type": "string", - "enum": ["search"], - "title": "SearchCommandActionType" - } + "command": { "type": "string" }, + "path": { "type": ["string", "null"] }, + "query": { "type": ["string", "null"] }, + "type": { "type": "string", "enum": ["search"], "title": "SearchCommandActionType" } }, "title": "SearchCommandAction" }, @@ -418,14 +291,8 @@ "type": "object", "required": ["command", "type"], "properties": { - "command": { - "type": "string" - }, - "type": { - "type": "string", - "enum": ["unknown"], - "title": "UnknownCommandActionType" - } + "command": { "type": "string" }, + "type": { "type": "string", "enum": ["unknown"], "title": "UnknownCommandActionType" } }, "title": "UnknownCommandAction" } @@ -445,9 +312,7 @@ "type": "object", "required": ["text", "type"], "properties": { - "text": { - "type": "string" - }, + "text": { "type": "string" }, "type": { "type": "string", "enum": ["inputText"], @@ -460,9 +325,7 @@ "type": "object", "required": ["imageUrl", "type"], "properties": { - "imageUrl": { - "type": "string" - }, + "imageUrl": { "type": "string" }, "type": { "type": "string", "enum": ["inputImage"], @@ -473,28 +336,16 @@ } ] }, - "DynamicToolCallStatus": { - "type": "string", - "enum": ["inProgress", "completed", "failed"] - }, - "FileSystemAccessMode": { - "type": "string", - "enum": ["read", "write", "none"] - }, + "DynamicToolCallStatus": { "type": "string", "enum": ["inProgress", "completed", "failed"] }, + "FileSystemAccessMode": { "type": "string", "enum": ["read", "write", "none"] }, "FileSystemPath": { "oneOf": [ { "type": "object", "required": ["path", "type"], "properties": { - "path": { - "$ref": "#/definitions/AbsolutePathBuf" - }, - "type": { - "type": "string", - "enum": ["path"], - "title": "PathFileSystemPathType" - } + "path": { "$ref": "#/definitions/AbsolutePathBuf" }, + "type": { "type": "string", "enum": ["path"], "title": "PathFileSystemPathType" } }, "title": "PathFileSystemPath" }, @@ -502,9 +353,7 @@ "type": "object", "required": ["pattern", "type"], "properties": { - "pattern": { - "type": "string" - }, + "pattern": { "type": "string" }, "type": { "type": "string", "enum": ["glob_pattern"], @@ -517,14 +366,8 @@ "type": "object", "required": ["type", "value"], "properties": { - "type": { - "type": "string", - "enum": ["special"], - "title": "SpecialFileSystemPathType" - }, - "value": { - "$ref": "#/definitions/FileSystemSpecialPath" - } + "type": { "type": "string", "enum": ["special"], "title": "SpecialFileSystemPathType" }, + "value": { "$ref": "#/definitions/FileSystemSpecialPath" } }, "title": "SpecialFileSystemPath" } @@ -534,12 +377,8 @@ "type": "object", "required": ["access", "path"], "properties": { - "access": { - "$ref": "#/definitions/FileSystemAccessMode" - }, - "path": { - "$ref": "#/definitions/FileSystemPath" - } + "access": { "$ref": "#/definitions/FileSystemAccessMode" }, + "path": { "$ref": "#/definitions/FileSystemPath" } } }, "FileSystemSpecialPath": { @@ -547,75 +386,43 @@ { "type": "object", "required": ["kind"], - "properties": { - "kind": { - "type": "string", - "enum": ["root"] - } - }, + "properties": { "kind": { "type": "string", "enum": ["root"] } }, "title": "RootFileSystemSpecialPath" }, { "type": "object", "required": ["kind"], - "properties": { - "kind": { - "type": "string", - "enum": ["minimal"] - } - }, + "properties": { "kind": { "type": "string", "enum": ["minimal"] } }, "title": "MinimalFileSystemSpecialPath" }, { "type": "object", "required": ["kind"], "properties": { - "kind": { - "type": "string", - "enum": ["project_roots"] - }, - "subpath": { - "type": ["string", "null"] - } + "kind": { "type": "string", "enum": ["project_roots"] }, + "subpath": { "type": ["string", "null"] } }, "title": "KindFileSystemSpecialPath" }, { "type": "object", "required": ["kind"], - "properties": { - "kind": { - "type": "string", - "enum": ["tmpdir"] - } - }, + "properties": { "kind": { "type": "string", "enum": ["tmpdir"] } }, "title": "TmpdirFileSystemSpecialPath" }, { "type": "object", "required": ["kind"], - "properties": { - "kind": { - "type": "string", - "enum": ["slash_tmp"] - } - }, + "properties": { "kind": { "type": "string", "enum": ["slash_tmp"] } }, "title": "SlashTmpFileSystemSpecialPath" }, { "type": "object", "required": ["kind", "path"], "properties": { - "kind": { - "type": "string", - "enum": ["unknown"] - }, - "path": { - "type": "string" - }, - "subpath": { - "type": ["string", "null"] - } + "kind": { "type": "string", "enum": ["unknown"] }, + "path": { "type": "string" }, + "subpath": { "type": ["string", "null"] } } } ] @@ -624,106 +431,55 @@ "type": "object", "required": ["diff", "kind", "path"], "properties": { - "diff": { - "type": "string" - }, - "kind": { - "$ref": "#/definitions/PatchChangeKind" - }, - "path": { - "type": "string" - } + "diff": { "type": "string" }, + "kind": { "$ref": "#/definitions/PatchChangeKind" }, + "path": { "type": "string" } } }, "GitInfo": { "type": "object", "properties": { - "branch": { - "type": ["string", "null"] - }, - "originUrl": { - "type": ["string", "null"] - }, - "sha": { - "type": ["string", "null"] - } + "branch": { "type": ["string", "null"] }, + "originUrl": { "type": ["string", "null"] }, + "sha": { "type": ["string", "null"] } } }, "HookPromptFragment": { "type": "object", "required": ["hookRunId", "text"], - "properties": { - "hookRunId": { - "type": "string" - }, - "text": { - "type": "string" - } - } + "properties": { "hookRunId": { "type": "string" }, "text": { "type": "string" } } }, "McpToolCallError": { "type": "object", "required": ["message"], - "properties": { - "message": { - "type": "string" - } - } + "properties": { "message": { "type": "string" } } }, "McpToolCallResult": { "type": "object", "required": ["content"], "properties": { "_meta": true, - "content": { - "type": "array", - "items": true - }, + "content": { "type": "array", "items": true }, "structuredContent": true } }, - "McpToolCallStatus": { - "type": "string", - "enum": ["inProgress", "completed", "failed"] - }, + "McpToolCallStatus": { "type": "string", "enum": ["inProgress", "completed", "failed"] }, "MemoryCitation": { "type": "object", "required": ["entries", "threadIds"], "properties": { - "entries": { - "type": "array", - "items": { - "$ref": "#/definitions/MemoryCitationEntry" - } - }, - "threadIds": { - "type": "array", - "items": { - "type": "string" - } - } + "entries": { "type": "array", "items": { "$ref": "#/definitions/MemoryCitationEntry" } }, + "threadIds": { "type": "array", "items": { "type": "string" } } } }, "MemoryCitationEntry": { "type": "object", "required": ["lineEnd", "lineStart", "note", "path"], "properties": { - "lineEnd": { - "type": "integer", - "format": "uint32", - "minimum": 0.0 - }, - "lineStart": { - "type": "integer", - "format": "uint32", - "minimum": 0.0 - }, - "note": { - "type": "string" - }, - "path": { - "type": "string" - } + "lineEnd": { "type": "integer", "format": "uint32", "minimum": 0 }, + "lineStart": { "type": "integer", "format": "uint32", "minimum": 0 }, + "note": { "type": "string" }, + "path": { "type": "string" } } }, "MessagePhase": { @@ -741,14 +497,8 @@ } ] }, - "NetworkAccess": { - "type": "string", - "enum": ["restricted", "enabled"] - }, - "NonSteerableTurnKind": { - "type": "string", - "enum": ["review", "compact"] - }, + "NetworkAccess": { "type": "string", "enum": ["restricted", "enabled"] }, + "NonSteerableTurnKind": { "type": "string", "enum": ["review", "compact"] }, "PatchApplyStatus": { "type": "string", "enum": ["inProgress", "completed", "failed", "declined"] @@ -759,11 +509,7 @@ "type": "object", "required": ["type"], "properties": { - "type": { - "type": "string", - "enum": ["add"], - "title": "AddPatchChangeKindType" - } + "type": { "type": "string", "enum": ["add"], "title": "AddPatchChangeKindType" } }, "title": "AddPatchChangeKind" }, @@ -771,11 +517,7 @@ "type": "object", "required": ["type"], "properties": { - "type": { - "type": "string", - "enum": ["delete"], - "title": "DeletePatchChangeKindType" - } + "type": { "type": "string", "enum": ["delete"], "title": "DeletePatchChangeKindType" } }, "title": "DeletePatchChangeKind" }, @@ -783,14 +525,8 @@ "type": "object", "required": ["type"], "properties": { - "move_path": { - "type": ["string", "null"] - }, - "type": { - "type": "string", - "enum": ["update"], - "title": "UpdatePatchChangeKindType" - } + "move_path": { "type": ["string", "null"] }, + "type": { "type": "string", "enum": ["update"], "title": "UpdatePatchChangeKindType" } }, "title": "UpdatePatchChangeKind" } @@ -803,12 +539,8 @@ "type": "object", "required": ["fileSystem", "network", "type"], "properties": { - "fileSystem": { - "$ref": "#/definitions/PermissionProfileFileSystemPermissions" - }, - "network": { - "$ref": "#/definitions/PermissionProfileNetworkPermissions" - }, + "fileSystem": { "$ref": "#/definitions/PermissionProfileFileSystemPermissions" }, + "network": { "$ref": "#/definitions/PermissionProfileNetworkPermissions" }, "type": { "type": "string", "enum": ["managed"], @@ -835,9 +567,7 @@ "type": "object", "required": ["network", "type"], "properties": { - "network": { - "$ref": "#/definitions/PermissionProfileNetworkPermissions" - }, + "network": { "$ref": "#/definitions/PermissionProfileNetworkPermissions" }, "type": { "type": "string", "enum": ["external"], @@ -856,15 +586,9 @@ "properties": { "entries": { "type": "array", - "items": { - "$ref": "#/definitions/FileSystemSandboxEntry" - } - }, - "globScanMaxDepth": { - "type": ["integer", "null"], - "format": "uint", - "minimum": 1.0 + "items": { "$ref": "#/definitions/FileSystemSandboxEntry" } }, + "globScanMaxDepth": { "type": ["integer", "null"], "format": "uint", "minimum": 1 }, "type": { "type": "string", "enum": ["restricted"], @@ -890,11 +614,7 @@ "PermissionProfileNetworkPermissions": { "type": "object", "required": ["enabled"], - "properties": { - "enabled": { - "type": "boolean" - } - } + "properties": { "enabled": { "type": "boolean" } } }, "ReasoningEffort": { "description": "See https://platform.openai.com/docs/guides/reasoning?api-mode=responses#get-started-with-reasoning", @@ -919,15 +639,8 @@ "type": "object", "required": ["type"], "properties": { - "networkAccess": { - "default": false, - "type": "boolean" - }, - "type": { - "type": "string", - "enum": ["readOnly"], - "title": "ReadOnlySandboxPolicyType" - } + "networkAccess": { "default": false, "type": "boolean" }, + "type": { "type": "string", "enum": ["readOnly"], "title": "ReadOnlySandboxPolicyType" } }, "title": "ReadOnlySandboxPolicy" }, @@ -937,11 +650,7 @@ "properties": { "networkAccess": { "default": "restricted", - "allOf": [ - { - "$ref": "#/definitions/NetworkAccess" - } - ] + "allOf": [{ "$ref": "#/definitions/NetworkAccess" }] }, "type": { "type": "string", @@ -955,18 +664,9 @@ "type": "object", "required": ["type"], "properties": { - "excludeSlashTmp": { - "default": false, - "type": "boolean" - }, - "excludeTmpdirEnvVar": { - "default": false, - "type": "boolean" - }, - "networkAccess": { - "default": false, - "type": "boolean" - }, + "excludeSlashTmp": { "default": false, "type": "boolean" }, + "excludeTmpdirEnvVar": { "default": false, "type": "boolean" }, + "networkAccess": { "default": false, "type": "boolean" }, "type": { "type": "string", "enum": ["workspaceWrite"], @@ -975,44 +675,28 @@ "writableRoots": { "default": [], "type": "array", - "items": { - "$ref": "#/definitions/AbsolutePathBuf" - } + "items": { "$ref": "#/definitions/AbsolutePathBuf" } } }, "title": "WorkspaceWriteSandboxPolicy" } ] }, - "ServiceTier": { - "type": "string", - "enum": ["fast", "flex"] - }, + "ServiceTier": { "type": "string", "enum": ["fast", "flex"] }, "SessionSource": { "oneOf": [ - { - "type": "string", - "enum": ["cli", "vscode", "exec", "appServer", "unknown"] - }, + { "type": "string", "enum": ["cli", "vscode", "exec", "appServer", "unknown"] }, { "type": "object", "required": ["custom"], - "properties": { - "custom": { - "type": "string" - } - }, + "properties": { "custom": { "type": "string" } }, "additionalProperties": false, "title": "CustomSessionSource" }, { "type": "object", "required": ["subAgent"], - "properties": { - "subAgent": { - "$ref": "#/definitions/SubAgentSource" - } - }, + "properties": { "subAgent": { "$ref": "#/definitions/SubAgentSource" } }, "additionalProperties": false, "title": "SubAgentSessionSource" } @@ -1020,10 +704,7 @@ }, "SubAgentSource": { "oneOf": [ - { - "type": "string", - "enum": ["review", "compact", "memory_consolidation"] - }, + { "type": "string", "enum": ["review", "compact", "memory_consolidation"] }, { "type": "object", "required": ["thread_spawn"], @@ -1032,32 +713,14 @@ "type": "object", "required": ["depth", "parent_thread_id"], "properties": { - "agent_nickname": { - "default": null, - "type": ["string", "null"] - }, + "agent_nickname": { "default": null, "type": ["string", "null"] }, "agent_path": { "default": null, - "anyOf": [ - { - "$ref": "#/definitions/AgentPath" - }, - { - "type": "null" - } - ] + "anyOf": [{ "$ref": "#/definitions/AgentPath" }, { "type": "null" }] }, - "agent_role": { - "default": null, - "type": ["string", "null"] - }, - "depth": { - "type": "integer", - "format": "int32" - }, - "parent_thread_id": { - "$ref": "#/definitions/ThreadId" - } + "agent_role": { "default": null, "type": ["string", "null"] }, + "depth": { "type": "integer", "format": "int32" }, + "parent_thread_id": { "$ref": "#/definitions/ThreadId" } } } }, @@ -1067,11 +730,7 @@ { "type": "object", "required": ["other"], - "properties": { - "other": { - "type": "string" - } - }, + "properties": { "other": { "type": "string" } }, "additionalProperties": false, "title": "OtherSubAgentSource" } @@ -1083,11 +742,7 @@ "properties": { "byteRange": { "description": "Byte range in the parent `text` buffer that this element occupies.", - "allOf": [ - { - "$ref": "#/definitions/ByteRange" - } - ] + "allOf": [{ "$ref": "#/definitions/ByteRange" }] }, "placeholder": { "description": "Optional human-readable placeholder for the element, displayed in the UI.", @@ -1130,11 +785,7 @@ }, "cwd": { "description": "Working directory captured for the thread.", - "allOf": [ - { - "$ref": "#/definitions/AbsolutePathBuf" - } - ] + "allOf": [{ "$ref": "#/definitions/AbsolutePathBuf" }] }, "ephemeral": { "description": "Whether the thread is ephemeral and should not be materialized on disk.", @@ -1146,26 +797,14 @@ }, "gitInfo": { "description": "Optional Git metadata captured when the thread was created.", - "anyOf": [ - { - "$ref": "#/definitions/GitInfo" - }, - { - "type": "null" - } - ] - }, - "id": { - "type": "string" + "anyOf": [{ "$ref": "#/definitions/GitInfo" }, { "type": "null" }] }, + "id": { "type": "string" }, "modelProvider": { "description": "Model provider used for this thread (for example, 'openai').", "type": "string" }, - "name": { - "description": "Optional user-facing thread title.", - "type": ["string", "null"] - }, + "name": { "description": "Optional user-facing thread title.", "type": ["string", "null"] }, "path": { "description": "[UNSTABLE] Path to the thread on disk.", "type": ["string", "null"] @@ -1176,26 +815,16 @@ }, "source": { "description": "Origin of the thread (CLI, VSCode, codex exec, codex app-server, etc.).", - "allOf": [ - { - "$ref": "#/definitions/SessionSource" - } - ] + "allOf": [{ "$ref": "#/definitions/SessionSource" }] }, "status": { "description": "Current runtime status for the thread.", - "allOf": [ - { - "$ref": "#/definitions/ThreadStatus" - } - ] + "allOf": [{ "$ref": "#/definitions/ThreadStatus" }] }, "turns": { "description": "Only populated on `thread/resume`, `thread/rollback`, `thread/fork`, and `thread/read` (when `includeTurns` is true) responses. For all other responses and notifications returning a Thread, the turns field will be an empty list.", "type": "array", - "items": { - "$ref": "#/definitions/Turn" - } + "items": { "$ref": "#/definitions/Turn" } }, "updatedAt": { "description": "Unix timestamp (in seconds) when the thread was last updated.", @@ -1204,28 +833,16 @@ } } }, - "ThreadActiveFlag": { - "type": "string", - "enum": ["waitingOnApproval", "waitingOnUserInput"] - }, - "ThreadId": { - "type": "string" - }, + "ThreadActiveFlag": { "type": "string", "enum": ["waitingOnApproval", "waitingOnUserInput"] }, + "ThreadId": { "type": "string" }, "ThreadItem": { "oneOf": [ { "type": "object", "required": ["content", "id", "type"], "properties": { - "content": { - "type": "array", - "items": { - "$ref": "#/definitions/UserInput" - } - }, - "id": { - "type": "string" - }, + "content": { "type": "array", "items": { "$ref": "#/definitions/UserInput" } }, + "id": { "type": "string" }, "type": { "type": "string", "enum": ["userMessage"], @@ -1240,13 +857,9 @@ "properties": { "fragments": { "type": "array", - "items": { - "$ref": "#/definitions/HookPromptFragment" - } - }, - "id": { - "type": "string" + "items": { "$ref": "#/definitions/HookPromptFragment" } }, + "id": { "type": "string" }, "type": { "type": "string", "enum": ["hookPrompt"], @@ -1259,34 +872,16 @@ "type": "object", "required": ["id", "text", "type"], "properties": { - "id": { - "type": "string" - }, + "id": { "type": "string" }, "memoryCitation": { "default": null, - "anyOf": [ - { - "$ref": "#/definitions/MemoryCitation" - }, - { - "type": "null" - } - ] + "anyOf": [{ "$ref": "#/definitions/MemoryCitation" }, { "type": "null" }] }, "phase": { "default": null, - "anyOf": [ - { - "$ref": "#/definitions/MessagePhase" - }, - { - "type": "null" - } - ] - }, - "text": { - "type": "string" + "anyOf": [{ "$ref": "#/definitions/MessagePhase" }, { "type": "null" }] }, + "text": { "type": "string" }, "type": { "type": "string", "enum": ["agentMessage"], @@ -1300,17 +895,9 @@ "type": "object", "required": ["id", "text", "type"], "properties": { - "id": { - "type": "string" - }, - "text": { - "type": "string" - }, - "type": { - "type": "string", - "enum": ["plan"], - "title": "PlanThreadItemType" - } + "id": { "type": "string" }, + "text": { "type": "string" }, + "type": { "type": "string", "enum": ["plan"], "title": "PlanThreadItemType" } }, "title": "PlanThreadItem" }, @@ -1318,28 +905,10 @@ "type": "object", "required": ["id", "type"], "properties": { - "content": { - "default": [], - "type": "array", - "items": { - "type": "string" - } - }, - "id": { - "type": "string" - }, - "summary": { - "default": [], - "type": "array", - "items": { - "type": "string" - } - }, - "type": { - "type": "string", - "enum": ["reasoning"], - "title": "ReasoningThreadItemType" - } + "content": { "default": [], "type": "array", "items": { "type": "string" } }, + "id": { "type": "string" }, + "summary": { "default": [], "type": "array", "items": { "type": "string" } }, + "type": { "type": "string", "enum": ["reasoning"], "title": "ReasoningThreadItemType" } }, "title": "ReasoningThreadItem" }, @@ -1351,24 +920,15 @@ "description": "The command's output, aggregated from stdout and stderr.", "type": ["string", "null"] }, - "command": { - "description": "The command to be executed.", - "type": "string" - }, + "command": { "description": "The command to be executed.", "type": "string" }, "commandActions": { "description": "A best-effort parsing of the command to understand the action(s) it will perform. This returns a list of CommandAction objects because a single shell command may be composed of many commands piped together.", "type": "array", - "items": { - "$ref": "#/definitions/CommandAction" - } + "items": { "$ref": "#/definitions/CommandAction" } }, "cwd": { "description": "The command's working directory.", - "allOf": [ - { - "$ref": "#/definitions/AbsolutePathBuf" - } - ] + "allOf": [{ "$ref": "#/definitions/AbsolutePathBuf" }] }, "durationMs": { "description": "The duration of the command execution in milliseconds.", @@ -1380,24 +940,16 @@ "type": ["integer", "null"], "format": "int32" }, - "id": { - "type": "string" - }, + "id": { "type": "string" }, "processId": { "description": "Identifier for the underlying PTY process (when available).", "type": ["string", "null"] }, "source": { "default": "agent", - "allOf": [ - { - "$ref": "#/definitions/CommandExecutionSource" - } - ] - }, - "status": { - "$ref": "#/definitions/CommandExecutionStatus" + "allOf": [{ "$ref": "#/definitions/CommandExecutionSource" }] }, + "status": { "$ref": "#/definitions/CommandExecutionStatus" }, "type": { "type": "string", "enum": ["commandExecution"], @@ -1410,18 +962,9 @@ "type": "object", "required": ["changes", "id", "status", "type"], "properties": { - "changes": { - "type": "array", - "items": { - "$ref": "#/definitions/FileUpdateChange" - } - }, - "id": { - "type": "string" - }, - "status": { - "$ref": "#/definitions/PatchApplyStatus" - }, + "changes": { "type": "array", "items": { "$ref": "#/definitions/FileUpdateChange" } }, + "id": { "type": "string" }, + "status": { "$ref": "#/definitions/PatchApplyStatus" }, "type": { "type": "string", "enum": ["fileChange"], @@ -1441,40 +984,16 @@ "format": "int64" }, "error": { - "anyOf": [ - { - "$ref": "#/definitions/McpToolCallError" - }, - { - "type": "null" - } - ] - }, - "id": { - "type": "string" - }, - "mcpAppResourceUri": { - "type": ["string", "null"] + "anyOf": [{ "$ref": "#/definitions/McpToolCallError" }, { "type": "null" }] }, + "id": { "type": "string" }, + "mcpAppResourceUri": { "type": ["string", "null"] }, "result": { - "anyOf": [ - { - "$ref": "#/definitions/McpToolCallResult" - }, - { - "type": "null" - } - ] - }, - "server": { - "type": "string" - }, - "status": { - "$ref": "#/definitions/McpToolCallStatus" - }, - "tool": { - "type": "string" + "anyOf": [{ "$ref": "#/definitions/McpToolCallResult" }, { "type": "null" }] }, + "server": { "type": "string" }, + "status": { "$ref": "#/definitions/McpToolCallStatus" }, + "tool": { "type": "string" }, "type": { "type": "string", "enum": ["mcpToolCall"], @@ -1490,30 +1009,18 @@ "arguments": true, "contentItems": { "type": ["array", "null"], - "items": { - "$ref": "#/definitions/DynamicToolCallOutputContentItem" - } + "items": { "$ref": "#/definitions/DynamicToolCallOutputContentItem" } }, "durationMs": { "description": "The duration of the dynamic tool call in milliseconds.", "type": ["integer", "null"], "format": "int64" }, - "id": { - "type": "string" - }, - "namespace": { - "type": ["string", "null"] - }, - "status": { - "$ref": "#/definitions/DynamicToolCallStatus" - }, - "success": { - "type": ["boolean", "null"] - }, - "tool": { - "type": "string" - }, + "id": { "type": "string" }, + "namespace": { "type": ["string", "null"] }, + "status": { "$ref": "#/definitions/DynamicToolCallStatus" }, + "success": { "type": ["boolean", "null"] }, + "tool": { "type": "string" }, "type": { "type": "string", "enum": ["dynamicToolCall"], @@ -1537,9 +1044,7 @@ "agentsStates": { "description": "Last known status of the target agents, when available.", "type": "object", - "additionalProperties": { - "$ref": "#/definitions/CollabAgentState" - } + "additionalProperties": { "$ref": "#/definitions/CollabAgentState" } }, "id": { "description": "Unique identifier for this collab tool call.", @@ -1555,21 +1060,12 @@ }, "reasoningEffort": { "description": "Reasoning effort requested for the spawned agent, when applicable.", - "anyOf": [ - { - "$ref": "#/definitions/ReasoningEffort" - }, - { - "type": "null" - } - ] + "anyOf": [{ "$ref": "#/definitions/ReasoningEffort" }, { "type": "null" }] }, "receiverThreadIds": { "description": "Thread ID of the receiving agent, when applicable. In case of spawn operation, this corresponds to the newly spawned agent.", "type": "array", - "items": { - "type": "string" - } + "items": { "type": "string" } }, "senderThreadId": { "description": "Thread ID of the agent issuing the collab request.", @@ -1577,19 +1073,11 @@ }, "status": { "description": "Current status of the collab tool call.", - "allOf": [ - { - "$ref": "#/definitions/CollabAgentToolCallStatus" - } - ] + "allOf": [{ "$ref": "#/definitions/CollabAgentToolCallStatus" }] }, "tool": { "description": "Name of the collab tool that was invoked.", - "allOf": [ - { - "$ref": "#/definitions/CollabAgentTool" - } - ] + "allOf": [{ "$ref": "#/definitions/CollabAgentTool" }] }, "type": { "type": "string", @@ -1604,26 +1092,11 @@ "required": ["id", "query", "type"], "properties": { "action": { - "anyOf": [ - { - "$ref": "#/definitions/WebSearchAction" - }, - { - "type": "null" - } - ] + "anyOf": [{ "$ref": "#/definitions/WebSearchAction" }, { "type": "null" }] }, - "id": { - "type": "string" - }, - "query": { - "type": "string" - }, - "type": { - "type": "string", - "enum": ["webSearch"], - "title": "WebSearchThreadItemType" - } + "id": { "type": "string" }, + "query": { "type": "string" }, + "type": { "type": "string", "enum": ["webSearch"], "title": "WebSearchThreadItemType" } }, "title": "WebSearchThreadItem" }, @@ -1631,17 +1104,9 @@ "type": "object", "required": ["id", "path", "type"], "properties": { - "id": { - "type": "string" - }, - "path": { - "$ref": "#/definitions/AbsolutePathBuf" - }, - "type": { - "type": "string", - "enum": ["imageView"], - "title": "ImageViewThreadItemType" - } + "id": { "type": "string" }, + "path": { "$ref": "#/definitions/AbsolutePathBuf" }, + "type": { "type": "string", "enum": ["imageView"], "title": "ImageViewThreadItemType" } }, "title": "ImageViewThreadItem" }, @@ -1649,28 +1114,13 @@ "type": "object", "required": ["id", "result", "status", "type"], "properties": { - "id": { - "type": "string" - }, - "result": { - "type": "string" - }, - "revisedPrompt": { - "type": ["string", "null"] - }, + "id": { "type": "string" }, + "result": { "type": "string" }, + "revisedPrompt": { "type": ["string", "null"] }, "savedPath": { - "anyOf": [ - { - "$ref": "#/definitions/AbsolutePathBuf" - }, - { - "type": "null" - } - ] - }, - "status": { - "type": "string" + "anyOf": [{ "$ref": "#/definitions/AbsolutePathBuf" }, { "type": "null" }] }, + "status": { "type": "string" }, "type": { "type": "string", "enum": ["imageGeneration"], @@ -1683,12 +1133,8 @@ "type": "object", "required": ["id", "review", "type"], "properties": { - "id": { - "type": "string" - }, - "review": { - "type": "string" - }, + "id": { "type": "string" }, + "review": { "type": "string" }, "type": { "type": "string", "enum": ["enteredReviewMode"], @@ -1701,12 +1147,8 @@ "type": "object", "required": ["id", "review", "type"], "properties": { - "id": { - "type": "string" - }, - "review": { - "type": "string" - }, + "id": { "type": "string" }, + "review": { "type": "string" }, "type": { "type": "string", "enum": ["exitedReviewMode"], @@ -1719,9 +1161,7 @@ "type": "object", "required": ["id", "type"], "properties": { - "id": { - "type": "string" - }, + "id": { "type": "string" }, "type": { "type": "string", "enum": ["contextCompaction"], @@ -1750,11 +1190,7 @@ "type": "object", "required": ["type"], "properties": { - "type": { - "type": "string", - "enum": ["idle"], - "title": "IdleThreadStatusType" - } + "type": { "type": "string", "enum": ["idle"], "title": "IdleThreadStatusType" } }, "title": "IdleThreadStatus" }, @@ -1776,15 +1212,9 @@ "properties": { "activeFlags": { "type": "array", - "items": { - "$ref": "#/definitions/ThreadActiveFlag" - } + "items": { "$ref": "#/definitions/ThreadActiveFlag" } }, - "type": { - "type": "string", - "enum": ["active"], - "title": "ActiveThreadStatusType" - } + "type": { "type": "string", "enum": ["active"], "title": "ActiveThreadStatusType" } }, "title": "ActiveThreadStatus" } @@ -1806,56 +1236,31 @@ }, "error": { "description": "Only populated when the Turn's status is failed.", - "anyOf": [ - { - "$ref": "#/definitions/TurnError" - }, - { - "type": "null" - } - ] - }, - "id": { - "type": "string" + "anyOf": [{ "$ref": "#/definitions/TurnError" }, { "type": "null" }] }, + "id": { "type": "string" }, "items": { "description": "Only populated on a `thread/resume` or `thread/fork` response. For all other responses and notifications returning a Turn, the items field will be an empty list.", "type": "array", - "items": { - "$ref": "#/definitions/ThreadItem" - } + "items": { "$ref": "#/definitions/ThreadItem" } }, "startedAt": { "description": "Unix timestamp (in seconds) when the turn started.", "type": ["integer", "null"], "format": "int64" }, - "status": { - "$ref": "#/definitions/TurnStatus" - } + "status": { "$ref": "#/definitions/TurnStatus" } } }, "TurnError": { "type": "object", "required": ["message"], "properties": { - "additionalDetails": { - "default": null, - "type": ["string", "null"] - }, + "additionalDetails": { "default": null, "type": ["string", "null"] }, "codexErrorInfo": { - "anyOf": [ - { - "$ref": "#/definitions/CodexErrorInfo" - }, - { - "type": "null" - } - ] + "anyOf": [{ "$ref": "#/definitions/CodexErrorInfo" }, { "type": "null" }] }, - "message": { - "type": "string" - } + "message": { "type": "string" } } }, "TurnStatus": { @@ -1868,22 +1273,14 @@ "type": "object", "required": ["text", "type"], "properties": { - "text": { - "type": "string" - }, + "text": { "type": "string" }, "text_elements": { "description": "UI-defined spans within `text` used to render or persist special elements.", "default": [], "type": "array", - "items": { - "$ref": "#/definitions/TextElement" - } + "items": { "$ref": "#/definitions/TextElement" } }, - "type": { - "type": "string", - "enum": ["text"], - "title": "TextUserInputType" - } + "type": { "type": "string", "enum": ["text"], "title": "TextUserInputType" } }, "title": "TextUserInput" }, @@ -1891,14 +1288,8 @@ "type": "object", "required": ["type", "url"], "properties": { - "type": { - "type": "string", - "enum": ["image"], - "title": "ImageUserInputType" - }, - "url": { - "type": "string" - } + "type": { "type": "string", "enum": ["image"], "title": "ImageUserInputType" }, + "url": { "type": "string" } }, "title": "ImageUserInput" }, @@ -1906,14 +1297,8 @@ "type": "object", "required": ["path", "type"], "properties": { - "path": { - "type": "string" - }, - "type": { - "type": "string", - "enum": ["localImage"], - "title": "LocalImageUserInputType" - } + "path": { "type": "string" }, + "type": { "type": "string", "enum": ["localImage"], "title": "LocalImageUserInputType" } }, "title": "LocalImageUserInput" }, @@ -1921,17 +1306,9 @@ "type": "object", "required": ["name", "path", "type"], "properties": { - "name": { - "type": "string" - }, - "path": { - "type": "string" - }, - "type": { - "type": "string", - "enum": ["skill"], - "title": "SkillUserInputType" - } + "name": { "type": "string" }, + "path": { "type": "string" }, + "type": { "type": "string", "enum": ["skill"], "title": "SkillUserInputType" } }, "title": "SkillUserInput" }, @@ -1939,17 +1316,9 @@ "type": "object", "required": ["name", "path", "type"], "properties": { - "name": { - "type": "string" - }, - "path": { - "type": "string" - }, - "type": { - "type": "string", - "enum": ["mention"], - "title": "MentionUserInputType" - } + "name": { "type": "string" }, + "path": { "type": "string" }, + "type": { "type": "string", "enum": ["mention"], "title": "MentionUserInputType" } }, "title": "MentionUserInput" } @@ -1961,20 +1330,9 @@ "type": "object", "required": ["type"], "properties": { - "queries": { - "type": ["array", "null"], - "items": { - "type": "string" - } - }, - "query": { - "type": ["string", "null"] - }, - "type": { - "type": "string", - "enum": ["search"], - "title": "SearchWebSearchActionType" - } + "queries": { "type": ["array", "null"], "items": { "type": "string" } }, + "query": { "type": ["string", "null"] }, + "type": { "type": "string", "enum": ["search"], "title": "SearchWebSearchActionType" } }, "title": "SearchWebSearchAction" }, @@ -1987,9 +1345,7 @@ "enum": ["openPage"], "title": "OpenPageWebSearchActionType" }, - "url": { - "type": ["string", "null"] - } + "url": { "type": ["string", "null"] } }, "title": "OpenPageWebSearchAction" }, @@ -1997,17 +1353,13 @@ "type": "object", "required": ["type"], "properties": { - "pattern": { - "type": ["string", "null"] - }, + "pattern": { "type": ["string", "null"] }, "type": { "type": "string", "enum": ["findInPage"], "title": "FindInPageWebSearchActionType" }, - "url": { - "type": ["string", "null"] - } + "url": { "type": ["string", "null"] } }, "title": "FindInPageWebSearchAction" }, @@ -2015,11 +1367,7 @@ "type": "object", "required": ["type"], "properties": { - "type": { - "type": "string", - "enum": ["other"], - "title": "OtherWebSearchActionType" - } + "type": { "type": "string", "enum": ["other"], "title": "OtherWebSearchActionType" } }, "title": "OtherWebSearchAction" } diff --git a/extensions/codex/src/app-server/protocol-generated/json/v2/ThreadStartResponse.json b/extensions/codex/src/app-server/protocol-generated/json/v2/ThreadStartResponse.json index 37cc6b49fd4..6315e981dd5 100644 --- a/extensions/codex/src/app-server/protocol-generated/json/v2/ThreadStartResponse.json +++ b/extensions/codex/src/app-server/protocol-generated/json/v2/ThreadStartResponse.json @@ -15,86 +15,36 @@ "activePermissionProfile": { "description": "Named or implicit built-in profile that produced the active permissions, when known.", "default": null, - "anyOf": [ - { - "$ref": "#/definitions/ActivePermissionProfile" - }, - { - "type": "null" - } - ] - }, - "approvalPolicy": { - "$ref": "#/definitions/AskForApproval" + "anyOf": [{ "$ref": "#/definitions/ActivePermissionProfile" }, { "type": "null" }] }, + "approvalPolicy": { "$ref": "#/definitions/AskForApproval" }, "approvalsReviewer": { "description": "Reviewer currently used for approval requests on this thread.", - "allOf": [ - { - "$ref": "#/definitions/ApprovalsReviewer" - } - ] - }, - "cwd": { - "$ref": "#/definitions/AbsolutePathBuf" + "allOf": [{ "$ref": "#/definitions/ApprovalsReviewer" }] }, + "cwd": { "$ref": "#/definitions/AbsolutePathBuf" }, "instructionSources": { "description": "Instruction source files currently loaded for this thread.", "default": [], "type": "array", - "items": { - "$ref": "#/definitions/AbsolutePathBuf" - } - }, - "model": { - "type": "string" - }, - "modelProvider": { - "type": "string" + "items": { "$ref": "#/definitions/AbsolutePathBuf" } }, + "model": { "type": "string" }, + "modelProvider": { "type": "string" }, "permissionProfile": { "description": "Full active permissions for this thread. `activePermissionProfile` carries display/provenance metadata for this runtime profile.", "default": null, - "anyOf": [ - { - "$ref": "#/definitions/PermissionProfile" - }, - { - "type": "null" - } - ] + "anyOf": [{ "$ref": "#/definitions/PermissionProfile" }, { "type": "null" }] }, "reasoningEffort": { - "anyOf": [ - { - "$ref": "#/definitions/ReasoningEffort" - }, - { - "type": "null" - } - ] + "anyOf": [{ "$ref": "#/definitions/ReasoningEffort" }, { "type": "null" }] }, "sandbox": { "description": "Legacy sandbox policy retained for compatibility. Experimental clients should prefer `permissionProfile` when they need exact runtime permissions.", - "allOf": [ - { - "$ref": "#/definitions/SandboxPolicy" - } - ] + "allOf": [{ "$ref": "#/definitions/SandboxPolicy" }] }, - "serviceTier": { - "anyOf": [ - { - "$ref": "#/definitions/ServiceTier" - }, - { - "type": "null" - } - ] - }, - "thread": { - "$ref": "#/definitions/Thread" - } + "serviceTier": { "anyOf": [{ "$ref": "#/definitions/ServiceTier" }, { "type": "null" }] }, + "thread": { "$ref": "#/definitions/Thread" } }, "definitions": { "AbsolutePathBuf": { @@ -118,9 +68,7 @@ "description": "Bounded user-requested modifications applied on top of the named profile, if any.", "default": [], "type": "array", - "items": { - "$ref": "#/definitions/ActivePermissionProfileModification" - } + "items": { "$ref": "#/definitions/ActivePermissionProfileModification" } } } }, @@ -131,9 +79,7 @@ "type": "object", "required": ["path", "type"], "properties": { - "path": { - "$ref": "#/definitions/AbsolutePathBuf" - }, + "path": { "$ref": "#/definitions/AbsolutePathBuf" }, "type": { "type": "string", "enum": ["additionalWritableRoot"], @@ -144,9 +90,7 @@ } ] }, - "AgentPath": { - "type": "string" - }, + "AgentPath": { "type": "string" }, "ApprovalsReviewer": { "description": "Configures who approval requests are routed to for review. Examples include sandbox escapes, blocked network access, MCP approval prompts, and ARC escalations. Defaults to `user`. `auto_review` uses a carefully prompted subagent to gather relevant context and apply a risk-based decision framework before approving or denying the request. The legacy value `guardian_subagent` is accepted for compatibility.", "type": "string", @@ -154,10 +98,7 @@ }, "AskForApproval": { "oneOf": [ - { - "type": "string", - "enum": ["untrusted", "on-failure", "on-request", "never"] - }, + { "type": "string", "enum": ["untrusted", "on-failure", "on-request", "never"] }, { "type": "object", "required": ["granular"], @@ -166,23 +107,11 @@ "type": "object", "required": ["mcp_elicitations", "rules", "sandbox_approval"], "properties": { - "mcp_elicitations": { - "type": "boolean" - }, - "request_permissions": { - "default": false, - "type": "boolean" - }, - "rules": { - "type": "boolean" - }, - "sandbox_approval": { - "type": "boolean" - }, - "skill_approval": { - "default": false, - "type": "boolean" - } + "mcp_elicitations": { "type": "boolean" }, + "request_permissions": { "default": false, "type": "boolean" }, + "rules": { "type": "boolean" }, + "sandbox_approval": { "type": "boolean" }, + "skill_approval": { "default": false, "type": "boolean" } } } }, @@ -195,16 +124,8 @@ "type": "object", "required": ["end", "start"], "properties": { - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - } + "end": { "type": "integer", "format": "uint", "minimum": 0 }, + "start": { "type": "integer", "format": "uint", "minimum": 0 } } }, "CodexErrorInfo": { @@ -232,11 +153,7 @@ "httpConnectionFailed": { "type": "object", "properties": { - "httpStatusCode": { - "type": ["integer", "null"], - "format": "uint16", - "minimum": 0.0 - } + "httpStatusCode": { "type": ["integer", "null"], "format": "uint16", "minimum": 0 } } } }, @@ -251,11 +168,7 @@ "responseStreamConnectionFailed": { "type": "object", "properties": { - "httpStatusCode": { - "type": ["integer", "null"], - "format": "uint16", - "minimum": 0.0 - } + "httpStatusCode": { "type": ["integer", "null"], "format": "uint16", "minimum": 0 } } } }, @@ -270,11 +183,7 @@ "responseStreamDisconnected": { "type": "object", "properties": { - "httpStatusCode": { - "type": ["integer", "null"], - "format": "uint16", - "minimum": 0.0 - } + "httpStatusCode": { "type": ["integer", "null"], "format": "uint16", "minimum": 0 } } } }, @@ -289,11 +198,7 @@ "responseTooManyFailedAttempts": { "type": "object", "properties": { - "httpStatusCode": { - "type": ["integer", "null"], - "format": "uint16", - "minimum": 0.0 - } + "httpStatusCode": { "type": ["integer", "null"], "format": "uint16", "minimum": 0 } } } }, @@ -308,11 +213,7 @@ "activeTurnNotSteerable": { "type": "object", "required": ["turnKind"], - "properties": { - "turnKind": { - "$ref": "#/definitions/NonSteerableTurnKind" - } - } + "properties": { "turnKind": { "$ref": "#/definitions/NonSteerableTurnKind" } } } }, "additionalProperties": false, @@ -324,12 +225,8 @@ "type": "object", "required": ["status"], "properties": { - "message": { - "type": ["string", "null"] - }, - "status": { - "$ref": "#/definitions/CollabAgentStatus" - } + "message": { "type": ["string", "null"] }, + "status": { "$ref": "#/definitions/CollabAgentStatus" } } }, "CollabAgentStatus": { @@ -358,20 +255,10 @@ "type": "object", "required": ["command", "name", "path", "type"], "properties": { - "command": { - "type": "string" - }, - "name": { - "type": "string" - }, - "path": { - "$ref": "#/definitions/AbsolutePathBuf" - }, - "type": { - "type": "string", - "enum": ["read"], - "title": "ReadCommandActionType" - } + "command": { "type": "string" }, + "name": { "type": "string" }, + "path": { "$ref": "#/definitions/AbsolutePathBuf" }, + "type": { "type": "string", "enum": ["read"], "title": "ReadCommandActionType" } }, "title": "ReadCommandAction" }, @@ -379,12 +266,8 @@ "type": "object", "required": ["command", "type"], "properties": { - "command": { - "type": "string" - }, - "path": { - "type": ["string", "null"] - }, + "command": { "type": "string" }, + "path": { "type": ["string", "null"] }, "type": { "type": "string", "enum": ["listFiles"], @@ -397,20 +280,10 @@ "type": "object", "required": ["command", "type"], "properties": { - "command": { - "type": "string" - }, - "path": { - "type": ["string", "null"] - }, - "query": { - "type": ["string", "null"] - }, - "type": { - "type": "string", - "enum": ["search"], - "title": "SearchCommandActionType" - } + "command": { "type": "string" }, + "path": { "type": ["string", "null"] }, + "query": { "type": ["string", "null"] }, + "type": { "type": "string", "enum": ["search"], "title": "SearchCommandActionType" } }, "title": "SearchCommandAction" }, @@ -418,14 +291,8 @@ "type": "object", "required": ["command", "type"], "properties": { - "command": { - "type": "string" - }, - "type": { - "type": "string", - "enum": ["unknown"], - "title": "UnknownCommandActionType" - } + "command": { "type": "string" }, + "type": { "type": "string", "enum": ["unknown"], "title": "UnknownCommandActionType" } }, "title": "UnknownCommandAction" } @@ -445,9 +312,7 @@ "type": "object", "required": ["text", "type"], "properties": { - "text": { - "type": "string" - }, + "text": { "type": "string" }, "type": { "type": "string", "enum": ["inputText"], @@ -460,9 +325,7 @@ "type": "object", "required": ["imageUrl", "type"], "properties": { - "imageUrl": { - "type": "string" - }, + "imageUrl": { "type": "string" }, "type": { "type": "string", "enum": ["inputImage"], @@ -473,28 +336,16 @@ } ] }, - "DynamicToolCallStatus": { - "type": "string", - "enum": ["inProgress", "completed", "failed"] - }, - "FileSystemAccessMode": { - "type": "string", - "enum": ["read", "write", "none"] - }, + "DynamicToolCallStatus": { "type": "string", "enum": ["inProgress", "completed", "failed"] }, + "FileSystemAccessMode": { "type": "string", "enum": ["read", "write", "none"] }, "FileSystemPath": { "oneOf": [ { "type": "object", "required": ["path", "type"], "properties": { - "path": { - "$ref": "#/definitions/AbsolutePathBuf" - }, - "type": { - "type": "string", - "enum": ["path"], - "title": "PathFileSystemPathType" - } + "path": { "$ref": "#/definitions/AbsolutePathBuf" }, + "type": { "type": "string", "enum": ["path"], "title": "PathFileSystemPathType" } }, "title": "PathFileSystemPath" }, @@ -502,9 +353,7 @@ "type": "object", "required": ["pattern", "type"], "properties": { - "pattern": { - "type": "string" - }, + "pattern": { "type": "string" }, "type": { "type": "string", "enum": ["glob_pattern"], @@ -517,14 +366,8 @@ "type": "object", "required": ["type", "value"], "properties": { - "type": { - "type": "string", - "enum": ["special"], - "title": "SpecialFileSystemPathType" - }, - "value": { - "$ref": "#/definitions/FileSystemSpecialPath" - } + "type": { "type": "string", "enum": ["special"], "title": "SpecialFileSystemPathType" }, + "value": { "$ref": "#/definitions/FileSystemSpecialPath" } }, "title": "SpecialFileSystemPath" } @@ -534,12 +377,8 @@ "type": "object", "required": ["access", "path"], "properties": { - "access": { - "$ref": "#/definitions/FileSystemAccessMode" - }, - "path": { - "$ref": "#/definitions/FileSystemPath" - } + "access": { "$ref": "#/definitions/FileSystemAccessMode" }, + "path": { "$ref": "#/definitions/FileSystemPath" } } }, "FileSystemSpecialPath": { @@ -547,75 +386,43 @@ { "type": "object", "required": ["kind"], - "properties": { - "kind": { - "type": "string", - "enum": ["root"] - } - }, + "properties": { "kind": { "type": "string", "enum": ["root"] } }, "title": "RootFileSystemSpecialPath" }, { "type": "object", "required": ["kind"], - "properties": { - "kind": { - "type": "string", - "enum": ["minimal"] - } - }, + "properties": { "kind": { "type": "string", "enum": ["minimal"] } }, "title": "MinimalFileSystemSpecialPath" }, { "type": "object", "required": ["kind"], "properties": { - "kind": { - "type": "string", - "enum": ["project_roots"] - }, - "subpath": { - "type": ["string", "null"] - } + "kind": { "type": "string", "enum": ["project_roots"] }, + "subpath": { "type": ["string", "null"] } }, "title": "KindFileSystemSpecialPath" }, { "type": "object", "required": ["kind"], - "properties": { - "kind": { - "type": "string", - "enum": ["tmpdir"] - } - }, + "properties": { "kind": { "type": "string", "enum": ["tmpdir"] } }, "title": "TmpdirFileSystemSpecialPath" }, { "type": "object", "required": ["kind"], - "properties": { - "kind": { - "type": "string", - "enum": ["slash_tmp"] - } - }, + "properties": { "kind": { "type": "string", "enum": ["slash_tmp"] } }, "title": "SlashTmpFileSystemSpecialPath" }, { "type": "object", "required": ["kind", "path"], "properties": { - "kind": { - "type": "string", - "enum": ["unknown"] - }, - "path": { - "type": "string" - }, - "subpath": { - "type": ["string", "null"] - } + "kind": { "type": "string", "enum": ["unknown"] }, + "path": { "type": "string" }, + "subpath": { "type": ["string", "null"] } } } ] @@ -624,106 +431,55 @@ "type": "object", "required": ["diff", "kind", "path"], "properties": { - "diff": { - "type": "string" - }, - "kind": { - "$ref": "#/definitions/PatchChangeKind" - }, - "path": { - "type": "string" - } + "diff": { "type": "string" }, + "kind": { "$ref": "#/definitions/PatchChangeKind" }, + "path": { "type": "string" } } }, "GitInfo": { "type": "object", "properties": { - "branch": { - "type": ["string", "null"] - }, - "originUrl": { - "type": ["string", "null"] - }, - "sha": { - "type": ["string", "null"] - } + "branch": { "type": ["string", "null"] }, + "originUrl": { "type": ["string", "null"] }, + "sha": { "type": ["string", "null"] } } }, "HookPromptFragment": { "type": "object", "required": ["hookRunId", "text"], - "properties": { - "hookRunId": { - "type": "string" - }, - "text": { - "type": "string" - } - } + "properties": { "hookRunId": { "type": "string" }, "text": { "type": "string" } } }, "McpToolCallError": { "type": "object", "required": ["message"], - "properties": { - "message": { - "type": "string" - } - } + "properties": { "message": { "type": "string" } } }, "McpToolCallResult": { "type": "object", "required": ["content"], "properties": { "_meta": true, - "content": { - "type": "array", - "items": true - }, + "content": { "type": "array", "items": true }, "structuredContent": true } }, - "McpToolCallStatus": { - "type": "string", - "enum": ["inProgress", "completed", "failed"] - }, + "McpToolCallStatus": { "type": "string", "enum": ["inProgress", "completed", "failed"] }, "MemoryCitation": { "type": "object", "required": ["entries", "threadIds"], "properties": { - "entries": { - "type": "array", - "items": { - "$ref": "#/definitions/MemoryCitationEntry" - } - }, - "threadIds": { - "type": "array", - "items": { - "type": "string" - } - } + "entries": { "type": "array", "items": { "$ref": "#/definitions/MemoryCitationEntry" } }, + "threadIds": { "type": "array", "items": { "type": "string" } } } }, "MemoryCitationEntry": { "type": "object", "required": ["lineEnd", "lineStart", "note", "path"], "properties": { - "lineEnd": { - "type": "integer", - "format": "uint32", - "minimum": 0.0 - }, - "lineStart": { - "type": "integer", - "format": "uint32", - "minimum": 0.0 - }, - "note": { - "type": "string" - }, - "path": { - "type": "string" - } + "lineEnd": { "type": "integer", "format": "uint32", "minimum": 0 }, + "lineStart": { "type": "integer", "format": "uint32", "minimum": 0 }, + "note": { "type": "string" }, + "path": { "type": "string" } } }, "MessagePhase": { @@ -741,14 +497,8 @@ } ] }, - "NetworkAccess": { - "type": "string", - "enum": ["restricted", "enabled"] - }, - "NonSteerableTurnKind": { - "type": "string", - "enum": ["review", "compact"] - }, + "NetworkAccess": { "type": "string", "enum": ["restricted", "enabled"] }, + "NonSteerableTurnKind": { "type": "string", "enum": ["review", "compact"] }, "PatchApplyStatus": { "type": "string", "enum": ["inProgress", "completed", "failed", "declined"] @@ -759,11 +509,7 @@ "type": "object", "required": ["type"], "properties": { - "type": { - "type": "string", - "enum": ["add"], - "title": "AddPatchChangeKindType" - } + "type": { "type": "string", "enum": ["add"], "title": "AddPatchChangeKindType" } }, "title": "AddPatchChangeKind" }, @@ -771,11 +517,7 @@ "type": "object", "required": ["type"], "properties": { - "type": { - "type": "string", - "enum": ["delete"], - "title": "DeletePatchChangeKindType" - } + "type": { "type": "string", "enum": ["delete"], "title": "DeletePatchChangeKindType" } }, "title": "DeletePatchChangeKind" }, @@ -783,14 +525,8 @@ "type": "object", "required": ["type"], "properties": { - "move_path": { - "type": ["string", "null"] - }, - "type": { - "type": "string", - "enum": ["update"], - "title": "UpdatePatchChangeKindType" - } + "move_path": { "type": ["string", "null"] }, + "type": { "type": "string", "enum": ["update"], "title": "UpdatePatchChangeKindType" } }, "title": "UpdatePatchChangeKind" } @@ -803,12 +539,8 @@ "type": "object", "required": ["fileSystem", "network", "type"], "properties": { - "fileSystem": { - "$ref": "#/definitions/PermissionProfileFileSystemPermissions" - }, - "network": { - "$ref": "#/definitions/PermissionProfileNetworkPermissions" - }, + "fileSystem": { "$ref": "#/definitions/PermissionProfileFileSystemPermissions" }, + "network": { "$ref": "#/definitions/PermissionProfileNetworkPermissions" }, "type": { "type": "string", "enum": ["managed"], @@ -835,9 +567,7 @@ "type": "object", "required": ["network", "type"], "properties": { - "network": { - "$ref": "#/definitions/PermissionProfileNetworkPermissions" - }, + "network": { "$ref": "#/definitions/PermissionProfileNetworkPermissions" }, "type": { "type": "string", "enum": ["external"], @@ -856,15 +586,9 @@ "properties": { "entries": { "type": "array", - "items": { - "$ref": "#/definitions/FileSystemSandboxEntry" - } - }, - "globScanMaxDepth": { - "type": ["integer", "null"], - "format": "uint", - "minimum": 1.0 + "items": { "$ref": "#/definitions/FileSystemSandboxEntry" } }, + "globScanMaxDepth": { "type": ["integer", "null"], "format": "uint", "minimum": 1 }, "type": { "type": "string", "enum": ["restricted"], @@ -890,11 +614,7 @@ "PermissionProfileNetworkPermissions": { "type": "object", "required": ["enabled"], - "properties": { - "enabled": { - "type": "boolean" - } - } + "properties": { "enabled": { "type": "boolean" } } }, "ReasoningEffort": { "description": "See https://platform.openai.com/docs/guides/reasoning?api-mode=responses#get-started-with-reasoning", @@ -919,15 +639,8 @@ "type": "object", "required": ["type"], "properties": { - "networkAccess": { - "default": false, - "type": "boolean" - }, - "type": { - "type": "string", - "enum": ["readOnly"], - "title": "ReadOnlySandboxPolicyType" - } + "networkAccess": { "default": false, "type": "boolean" }, + "type": { "type": "string", "enum": ["readOnly"], "title": "ReadOnlySandboxPolicyType" } }, "title": "ReadOnlySandboxPolicy" }, @@ -937,11 +650,7 @@ "properties": { "networkAccess": { "default": "restricted", - "allOf": [ - { - "$ref": "#/definitions/NetworkAccess" - } - ] + "allOf": [{ "$ref": "#/definitions/NetworkAccess" }] }, "type": { "type": "string", @@ -955,18 +664,9 @@ "type": "object", "required": ["type"], "properties": { - "excludeSlashTmp": { - "default": false, - "type": "boolean" - }, - "excludeTmpdirEnvVar": { - "default": false, - "type": "boolean" - }, - "networkAccess": { - "default": false, - "type": "boolean" - }, + "excludeSlashTmp": { "default": false, "type": "boolean" }, + "excludeTmpdirEnvVar": { "default": false, "type": "boolean" }, + "networkAccess": { "default": false, "type": "boolean" }, "type": { "type": "string", "enum": ["workspaceWrite"], @@ -975,44 +675,28 @@ "writableRoots": { "default": [], "type": "array", - "items": { - "$ref": "#/definitions/AbsolutePathBuf" - } + "items": { "$ref": "#/definitions/AbsolutePathBuf" } } }, "title": "WorkspaceWriteSandboxPolicy" } ] }, - "ServiceTier": { - "type": "string", - "enum": ["fast", "flex"] - }, + "ServiceTier": { "type": "string", "enum": ["fast", "flex"] }, "SessionSource": { "oneOf": [ - { - "type": "string", - "enum": ["cli", "vscode", "exec", "appServer", "unknown"] - }, + { "type": "string", "enum": ["cli", "vscode", "exec", "appServer", "unknown"] }, { "type": "object", "required": ["custom"], - "properties": { - "custom": { - "type": "string" - } - }, + "properties": { "custom": { "type": "string" } }, "additionalProperties": false, "title": "CustomSessionSource" }, { "type": "object", "required": ["subAgent"], - "properties": { - "subAgent": { - "$ref": "#/definitions/SubAgentSource" - } - }, + "properties": { "subAgent": { "$ref": "#/definitions/SubAgentSource" } }, "additionalProperties": false, "title": "SubAgentSessionSource" } @@ -1020,10 +704,7 @@ }, "SubAgentSource": { "oneOf": [ - { - "type": "string", - "enum": ["review", "compact", "memory_consolidation"] - }, + { "type": "string", "enum": ["review", "compact", "memory_consolidation"] }, { "type": "object", "required": ["thread_spawn"], @@ -1032,32 +713,14 @@ "type": "object", "required": ["depth", "parent_thread_id"], "properties": { - "agent_nickname": { - "default": null, - "type": ["string", "null"] - }, + "agent_nickname": { "default": null, "type": ["string", "null"] }, "agent_path": { "default": null, - "anyOf": [ - { - "$ref": "#/definitions/AgentPath" - }, - { - "type": "null" - } - ] + "anyOf": [{ "$ref": "#/definitions/AgentPath" }, { "type": "null" }] }, - "agent_role": { - "default": null, - "type": ["string", "null"] - }, - "depth": { - "type": "integer", - "format": "int32" - }, - "parent_thread_id": { - "$ref": "#/definitions/ThreadId" - } + "agent_role": { "default": null, "type": ["string", "null"] }, + "depth": { "type": "integer", "format": "int32" }, + "parent_thread_id": { "$ref": "#/definitions/ThreadId" } } } }, @@ -1067,11 +730,7 @@ { "type": "object", "required": ["other"], - "properties": { - "other": { - "type": "string" - } - }, + "properties": { "other": { "type": "string" } }, "additionalProperties": false, "title": "OtherSubAgentSource" } @@ -1083,11 +742,7 @@ "properties": { "byteRange": { "description": "Byte range in the parent `text` buffer that this element occupies.", - "allOf": [ - { - "$ref": "#/definitions/ByteRange" - } - ] + "allOf": [{ "$ref": "#/definitions/ByteRange" }] }, "placeholder": { "description": "Optional human-readable placeholder for the element, displayed in the UI.", @@ -1130,11 +785,7 @@ }, "cwd": { "description": "Working directory captured for the thread.", - "allOf": [ - { - "$ref": "#/definitions/AbsolutePathBuf" - } - ] + "allOf": [{ "$ref": "#/definitions/AbsolutePathBuf" }] }, "ephemeral": { "description": "Whether the thread is ephemeral and should not be materialized on disk.", @@ -1146,26 +797,14 @@ }, "gitInfo": { "description": "Optional Git metadata captured when the thread was created.", - "anyOf": [ - { - "$ref": "#/definitions/GitInfo" - }, - { - "type": "null" - } - ] - }, - "id": { - "type": "string" + "anyOf": [{ "$ref": "#/definitions/GitInfo" }, { "type": "null" }] }, + "id": { "type": "string" }, "modelProvider": { "description": "Model provider used for this thread (for example, 'openai').", "type": "string" }, - "name": { - "description": "Optional user-facing thread title.", - "type": ["string", "null"] - }, + "name": { "description": "Optional user-facing thread title.", "type": ["string", "null"] }, "path": { "description": "[UNSTABLE] Path to the thread on disk.", "type": ["string", "null"] @@ -1176,26 +815,16 @@ }, "source": { "description": "Origin of the thread (CLI, VSCode, codex exec, codex app-server, etc.).", - "allOf": [ - { - "$ref": "#/definitions/SessionSource" - } - ] + "allOf": [{ "$ref": "#/definitions/SessionSource" }] }, "status": { "description": "Current runtime status for the thread.", - "allOf": [ - { - "$ref": "#/definitions/ThreadStatus" - } - ] + "allOf": [{ "$ref": "#/definitions/ThreadStatus" }] }, "turns": { "description": "Only populated on `thread/resume`, `thread/rollback`, `thread/fork`, and `thread/read` (when `includeTurns` is true) responses. For all other responses and notifications returning a Thread, the turns field will be an empty list.", "type": "array", - "items": { - "$ref": "#/definitions/Turn" - } + "items": { "$ref": "#/definitions/Turn" } }, "updatedAt": { "description": "Unix timestamp (in seconds) when the thread was last updated.", @@ -1204,28 +833,16 @@ } } }, - "ThreadActiveFlag": { - "type": "string", - "enum": ["waitingOnApproval", "waitingOnUserInput"] - }, - "ThreadId": { - "type": "string" - }, + "ThreadActiveFlag": { "type": "string", "enum": ["waitingOnApproval", "waitingOnUserInput"] }, + "ThreadId": { "type": "string" }, "ThreadItem": { "oneOf": [ { "type": "object", "required": ["content", "id", "type"], "properties": { - "content": { - "type": "array", - "items": { - "$ref": "#/definitions/UserInput" - } - }, - "id": { - "type": "string" - }, + "content": { "type": "array", "items": { "$ref": "#/definitions/UserInput" } }, + "id": { "type": "string" }, "type": { "type": "string", "enum": ["userMessage"], @@ -1240,13 +857,9 @@ "properties": { "fragments": { "type": "array", - "items": { - "$ref": "#/definitions/HookPromptFragment" - } - }, - "id": { - "type": "string" + "items": { "$ref": "#/definitions/HookPromptFragment" } }, + "id": { "type": "string" }, "type": { "type": "string", "enum": ["hookPrompt"], @@ -1259,34 +872,16 @@ "type": "object", "required": ["id", "text", "type"], "properties": { - "id": { - "type": "string" - }, + "id": { "type": "string" }, "memoryCitation": { "default": null, - "anyOf": [ - { - "$ref": "#/definitions/MemoryCitation" - }, - { - "type": "null" - } - ] + "anyOf": [{ "$ref": "#/definitions/MemoryCitation" }, { "type": "null" }] }, "phase": { "default": null, - "anyOf": [ - { - "$ref": "#/definitions/MessagePhase" - }, - { - "type": "null" - } - ] - }, - "text": { - "type": "string" + "anyOf": [{ "$ref": "#/definitions/MessagePhase" }, { "type": "null" }] }, + "text": { "type": "string" }, "type": { "type": "string", "enum": ["agentMessage"], @@ -1300,17 +895,9 @@ "type": "object", "required": ["id", "text", "type"], "properties": { - "id": { - "type": "string" - }, - "text": { - "type": "string" - }, - "type": { - "type": "string", - "enum": ["plan"], - "title": "PlanThreadItemType" - } + "id": { "type": "string" }, + "text": { "type": "string" }, + "type": { "type": "string", "enum": ["plan"], "title": "PlanThreadItemType" } }, "title": "PlanThreadItem" }, @@ -1318,28 +905,10 @@ "type": "object", "required": ["id", "type"], "properties": { - "content": { - "default": [], - "type": "array", - "items": { - "type": "string" - } - }, - "id": { - "type": "string" - }, - "summary": { - "default": [], - "type": "array", - "items": { - "type": "string" - } - }, - "type": { - "type": "string", - "enum": ["reasoning"], - "title": "ReasoningThreadItemType" - } + "content": { "default": [], "type": "array", "items": { "type": "string" } }, + "id": { "type": "string" }, + "summary": { "default": [], "type": "array", "items": { "type": "string" } }, + "type": { "type": "string", "enum": ["reasoning"], "title": "ReasoningThreadItemType" } }, "title": "ReasoningThreadItem" }, @@ -1351,24 +920,15 @@ "description": "The command's output, aggregated from stdout and stderr.", "type": ["string", "null"] }, - "command": { - "description": "The command to be executed.", - "type": "string" - }, + "command": { "description": "The command to be executed.", "type": "string" }, "commandActions": { "description": "A best-effort parsing of the command to understand the action(s) it will perform. This returns a list of CommandAction objects because a single shell command may be composed of many commands piped together.", "type": "array", - "items": { - "$ref": "#/definitions/CommandAction" - } + "items": { "$ref": "#/definitions/CommandAction" } }, "cwd": { "description": "The command's working directory.", - "allOf": [ - { - "$ref": "#/definitions/AbsolutePathBuf" - } - ] + "allOf": [{ "$ref": "#/definitions/AbsolutePathBuf" }] }, "durationMs": { "description": "The duration of the command execution in milliseconds.", @@ -1380,24 +940,16 @@ "type": ["integer", "null"], "format": "int32" }, - "id": { - "type": "string" - }, + "id": { "type": "string" }, "processId": { "description": "Identifier for the underlying PTY process (when available).", "type": ["string", "null"] }, "source": { "default": "agent", - "allOf": [ - { - "$ref": "#/definitions/CommandExecutionSource" - } - ] - }, - "status": { - "$ref": "#/definitions/CommandExecutionStatus" + "allOf": [{ "$ref": "#/definitions/CommandExecutionSource" }] }, + "status": { "$ref": "#/definitions/CommandExecutionStatus" }, "type": { "type": "string", "enum": ["commandExecution"], @@ -1410,18 +962,9 @@ "type": "object", "required": ["changes", "id", "status", "type"], "properties": { - "changes": { - "type": "array", - "items": { - "$ref": "#/definitions/FileUpdateChange" - } - }, - "id": { - "type": "string" - }, - "status": { - "$ref": "#/definitions/PatchApplyStatus" - }, + "changes": { "type": "array", "items": { "$ref": "#/definitions/FileUpdateChange" } }, + "id": { "type": "string" }, + "status": { "$ref": "#/definitions/PatchApplyStatus" }, "type": { "type": "string", "enum": ["fileChange"], @@ -1441,40 +984,16 @@ "format": "int64" }, "error": { - "anyOf": [ - { - "$ref": "#/definitions/McpToolCallError" - }, - { - "type": "null" - } - ] - }, - "id": { - "type": "string" - }, - "mcpAppResourceUri": { - "type": ["string", "null"] + "anyOf": [{ "$ref": "#/definitions/McpToolCallError" }, { "type": "null" }] }, + "id": { "type": "string" }, + "mcpAppResourceUri": { "type": ["string", "null"] }, "result": { - "anyOf": [ - { - "$ref": "#/definitions/McpToolCallResult" - }, - { - "type": "null" - } - ] - }, - "server": { - "type": "string" - }, - "status": { - "$ref": "#/definitions/McpToolCallStatus" - }, - "tool": { - "type": "string" + "anyOf": [{ "$ref": "#/definitions/McpToolCallResult" }, { "type": "null" }] }, + "server": { "type": "string" }, + "status": { "$ref": "#/definitions/McpToolCallStatus" }, + "tool": { "type": "string" }, "type": { "type": "string", "enum": ["mcpToolCall"], @@ -1490,30 +1009,18 @@ "arguments": true, "contentItems": { "type": ["array", "null"], - "items": { - "$ref": "#/definitions/DynamicToolCallOutputContentItem" - } + "items": { "$ref": "#/definitions/DynamicToolCallOutputContentItem" } }, "durationMs": { "description": "The duration of the dynamic tool call in milliseconds.", "type": ["integer", "null"], "format": "int64" }, - "id": { - "type": "string" - }, - "namespace": { - "type": ["string", "null"] - }, - "status": { - "$ref": "#/definitions/DynamicToolCallStatus" - }, - "success": { - "type": ["boolean", "null"] - }, - "tool": { - "type": "string" - }, + "id": { "type": "string" }, + "namespace": { "type": ["string", "null"] }, + "status": { "$ref": "#/definitions/DynamicToolCallStatus" }, + "success": { "type": ["boolean", "null"] }, + "tool": { "type": "string" }, "type": { "type": "string", "enum": ["dynamicToolCall"], @@ -1537,9 +1044,7 @@ "agentsStates": { "description": "Last known status of the target agents, when available.", "type": "object", - "additionalProperties": { - "$ref": "#/definitions/CollabAgentState" - } + "additionalProperties": { "$ref": "#/definitions/CollabAgentState" } }, "id": { "description": "Unique identifier for this collab tool call.", @@ -1555,21 +1060,12 @@ }, "reasoningEffort": { "description": "Reasoning effort requested for the spawned agent, when applicable.", - "anyOf": [ - { - "$ref": "#/definitions/ReasoningEffort" - }, - { - "type": "null" - } - ] + "anyOf": [{ "$ref": "#/definitions/ReasoningEffort" }, { "type": "null" }] }, "receiverThreadIds": { "description": "Thread ID of the receiving agent, when applicable. In case of spawn operation, this corresponds to the newly spawned agent.", "type": "array", - "items": { - "type": "string" - } + "items": { "type": "string" } }, "senderThreadId": { "description": "Thread ID of the agent issuing the collab request.", @@ -1577,19 +1073,11 @@ }, "status": { "description": "Current status of the collab tool call.", - "allOf": [ - { - "$ref": "#/definitions/CollabAgentToolCallStatus" - } - ] + "allOf": [{ "$ref": "#/definitions/CollabAgentToolCallStatus" }] }, "tool": { "description": "Name of the collab tool that was invoked.", - "allOf": [ - { - "$ref": "#/definitions/CollabAgentTool" - } - ] + "allOf": [{ "$ref": "#/definitions/CollabAgentTool" }] }, "type": { "type": "string", @@ -1604,26 +1092,11 @@ "required": ["id", "query", "type"], "properties": { "action": { - "anyOf": [ - { - "$ref": "#/definitions/WebSearchAction" - }, - { - "type": "null" - } - ] + "anyOf": [{ "$ref": "#/definitions/WebSearchAction" }, { "type": "null" }] }, - "id": { - "type": "string" - }, - "query": { - "type": "string" - }, - "type": { - "type": "string", - "enum": ["webSearch"], - "title": "WebSearchThreadItemType" - } + "id": { "type": "string" }, + "query": { "type": "string" }, + "type": { "type": "string", "enum": ["webSearch"], "title": "WebSearchThreadItemType" } }, "title": "WebSearchThreadItem" }, @@ -1631,17 +1104,9 @@ "type": "object", "required": ["id", "path", "type"], "properties": { - "id": { - "type": "string" - }, - "path": { - "$ref": "#/definitions/AbsolutePathBuf" - }, - "type": { - "type": "string", - "enum": ["imageView"], - "title": "ImageViewThreadItemType" - } + "id": { "type": "string" }, + "path": { "$ref": "#/definitions/AbsolutePathBuf" }, + "type": { "type": "string", "enum": ["imageView"], "title": "ImageViewThreadItemType" } }, "title": "ImageViewThreadItem" }, @@ -1649,28 +1114,13 @@ "type": "object", "required": ["id", "result", "status", "type"], "properties": { - "id": { - "type": "string" - }, - "result": { - "type": "string" - }, - "revisedPrompt": { - "type": ["string", "null"] - }, + "id": { "type": "string" }, + "result": { "type": "string" }, + "revisedPrompt": { "type": ["string", "null"] }, "savedPath": { - "anyOf": [ - { - "$ref": "#/definitions/AbsolutePathBuf" - }, - { - "type": "null" - } - ] - }, - "status": { - "type": "string" + "anyOf": [{ "$ref": "#/definitions/AbsolutePathBuf" }, { "type": "null" }] }, + "status": { "type": "string" }, "type": { "type": "string", "enum": ["imageGeneration"], @@ -1683,12 +1133,8 @@ "type": "object", "required": ["id", "review", "type"], "properties": { - "id": { - "type": "string" - }, - "review": { - "type": "string" - }, + "id": { "type": "string" }, + "review": { "type": "string" }, "type": { "type": "string", "enum": ["enteredReviewMode"], @@ -1701,12 +1147,8 @@ "type": "object", "required": ["id", "review", "type"], "properties": { - "id": { - "type": "string" - }, - "review": { - "type": "string" - }, + "id": { "type": "string" }, + "review": { "type": "string" }, "type": { "type": "string", "enum": ["exitedReviewMode"], @@ -1719,9 +1161,7 @@ "type": "object", "required": ["id", "type"], "properties": { - "id": { - "type": "string" - }, + "id": { "type": "string" }, "type": { "type": "string", "enum": ["contextCompaction"], @@ -1750,11 +1190,7 @@ "type": "object", "required": ["type"], "properties": { - "type": { - "type": "string", - "enum": ["idle"], - "title": "IdleThreadStatusType" - } + "type": { "type": "string", "enum": ["idle"], "title": "IdleThreadStatusType" } }, "title": "IdleThreadStatus" }, @@ -1776,15 +1212,9 @@ "properties": { "activeFlags": { "type": "array", - "items": { - "$ref": "#/definitions/ThreadActiveFlag" - } + "items": { "$ref": "#/definitions/ThreadActiveFlag" } }, - "type": { - "type": "string", - "enum": ["active"], - "title": "ActiveThreadStatusType" - } + "type": { "type": "string", "enum": ["active"], "title": "ActiveThreadStatusType" } }, "title": "ActiveThreadStatus" } @@ -1806,56 +1236,31 @@ }, "error": { "description": "Only populated when the Turn's status is failed.", - "anyOf": [ - { - "$ref": "#/definitions/TurnError" - }, - { - "type": "null" - } - ] - }, - "id": { - "type": "string" + "anyOf": [{ "$ref": "#/definitions/TurnError" }, { "type": "null" }] }, + "id": { "type": "string" }, "items": { "description": "Only populated on a `thread/resume` or `thread/fork` response. For all other responses and notifications returning a Turn, the items field will be an empty list.", "type": "array", - "items": { - "$ref": "#/definitions/ThreadItem" - } + "items": { "$ref": "#/definitions/ThreadItem" } }, "startedAt": { "description": "Unix timestamp (in seconds) when the turn started.", "type": ["integer", "null"], "format": "int64" }, - "status": { - "$ref": "#/definitions/TurnStatus" - } + "status": { "$ref": "#/definitions/TurnStatus" } } }, "TurnError": { "type": "object", "required": ["message"], "properties": { - "additionalDetails": { - "default": null, - "type": ["string", "null"] - }, + "additionalDetails": { "default": null, "type": ["string", "null"] }, "codexErrorInfo": { - "anyOf": [ - { - "$ref": "#/definitions/CodexErrorInfo" - }, - { - "type": "null" - } - ] + "anyOf": [{ "$ref": "#/definitions/CodexErrorInfo" }, { "type": "null" }] }, - "message": { - "type": "string" - } + "message": { "type": "string" } } }, "TurnStatus": { @@ -1868,22 +1273,14 @@ "type": "object", "required": ["text", "type"], "properties": { - "text": { - "type": "string" - }, + "text": { "type": "string" }, "text_elements": { "description": "UI-defined spans within `text` used to render or persist special elements.", "default": [], "type": "array", - "items": { - "$ref": "#/definitions/TextElement" - } + "items": { "$ref": "#/definitions/TextElement" } }, - "type": { - "type": "string", - "enum": ["text"], - "title": "TextUserInputType" - } + "type": { "type": "string", "enum": ["text"], "title": "TextUserInputType" } }, "title": "TextUserInput" }, @@ -1891,14 +1288,8 @@ "type": "object", "required": ["type", "url"], "properties": { - "type": { - "type": "string", - "enum": ["image"], - "title": "ImageUserInputType" - }, - "url": { - "type": "string" - } + "type": { "type": "string", "enum": ["image"], "title": "ImageUserInputType" }, + "url": { "type": "string" } }, "title": "ImageUserInput" }, @@ -1906,14 +1297,8 @@ "type": "object", "required": ["path", "type"], "properties": { - "path": { - "type": "string" - }, - "type": { - "type": "string", - "enum": ["localImage"], - "title": "LocalImageUserInputType" - } + "path": { "type": "string" }, + "type": { "type": "string", "enum": ["localImage"], "title": "LocalImageUserInputType" } }, "title": "LocalImageUserInput" }, @@ -1921,17 +1306,9 @@ "type": "object", "required": ["name", "path", "type"], "properties": { - "name": { - "type": "string" - }, - "path": { - "type": "string" - }, - "type": { - "type": "string", - "enum": ["skill"], - "title": "SkillUserInputType" - } + "name": { "type": "string" }, + "path": { "type": "string" }, + "type": { "type": "string", "enum": ["skill"], "title": "SkillUserInputType" } }, "title": "SkillUserInput" }, @@ -1939,17 +1316,9 @@ "type": "object", "required": ["name", "path", "type"], "properties": { - "name": { - "type": "string" - }, - "path": { - "type": "string" - }, - "type": { - "type": "string", - "enum": ["mention"], - "title": "MentionUserInputType" - } + "name": { "type": "string" }, + "path": { "type": "string" }, + "type": { "type": "string", "enum": ["mention"], "title": "MentionUserInputType" } }, "title": "MentionUserInput" } @@ -1961,20 +1330,9 @@ "type": "object", "required": ["type"], "properties": { - "queries": { - "type": ["array", "null"], - "items": { - "type": "string" - } - }, - "query": { - "type": ["string", "null"] - }, - "type": { - "type": "string", - "enum": ["search"], - "title": "SearchWebSearchActionType" - } + "queries": { "type": ["array", "null"], "items": { "type": "string" } }, + "query": { "type": ["string", "null"] }, + "type": { "type": "string", "enum": ["search"], "title": "SearchWebSearchActionType" } }, "title": "SearchWebSearchAction" }, @@ -1987,9 +1345,7 @@ "enum": ["openPage"], "title": "OpenPageWebSearchActionType" }, - "url": { - "type": ["string", "null"] - } + "url": { "type": ["string", "null"] } }, "title": "OpenPageWebSearchAction" }, @@ -1997,17 +1353,13 @@ "type": "object", "required": ["type"], "properties": { - "pattern": { - "type": ["string", "null"] - }, + "pattern": { "type": ["string", "null"] }, "type": { "type": "string", "enum": ["findInPage"], "title": "FindInPageWebSearchActionType" }, - "url": { - "type": ["string", "null"] - } + "url": { "type": ["string", "null"] } }, "title": "FindInPageWebSearchAction" }, @@ -2015,11 +1367,7 @@ "type": "object", "required": ["type"], "properties": { - "type": { - "type": "string", - "enum": ["other"], - "title": "OtherWebSearchActionType" - } + "type": { "type": "string", "enum": ["other"], "title": "OtherWebSearchActionType" } }, "title": "OtherWebSearchAction" } diff --git a/extensions/codex/src/app-server/protocol-generated/json/v2/TurnCompletedNotification.json b/extensions/codex/src/app-server/protocol-generated/json/v2/TurnCompletedNotification.json index d048766fd02..80bef4b7275 100644 --- a/extensions/codex/src/app-server/protocol-generated/json/v2/TurnCompletedNotification.json +++ b/extensions/codex/src/app-server/protocol-generated/json/v2/TurnCompletedNotification.json @@ -3,14 +3,7 @@ "title": "TurnCompletedNotification", "type": "object", "required": ["threadId", "turn"], - "properties": { - "threadId": { - "type": "string" - }, - "turn": { - "$ref": "#/definitions/Turn" - } - }, + "properties": { "threadId": { "type": "string" }, "turn": { "$ref": "#/definitions/Turn" } }, "definitions": { "AbsolutePathBuf": { "description": "A path that is guaranteed to be absolute and normalized (though it is not guaranteed to be canonicalized or exist on the filesystem).\n\nIMPORTANT: When deserializing an `AbsolutePathBuf`, a base path must be set using [AbsolutePathBufGuard::new]. If no base path is set, the deserialization will fail unless the path being deserialized is already absolute.", @@ -20,16 +13,8 @@ "type": "object", "required": ["end", "start"], "properties": { - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - } + "end": { "type": "integer", "format": "uint", "minimum": 0 }, + "start": { "type": "integer", "format": "uint", "minimum": 0 } } }, "CodexErrorInfo": { @@ -57,11 +42,7 @@ "httpConnectionFailed": { "type": "object", "properties": { - "httpStatusCode": { - "type": ["integer", "null"], - "format": "uint16", - "minimum": 0.0 - } + "httpStatusCode": { "type": ["integer", "null"], "format": "uint16", "minimum": 0 } } } }, @@ -76,11 +57,7 @@ "responseStreamConnectionFailed": { "type": "object", "properties": { - "httpStatusCode": { - "type": ["integer", "null"], - "format": "uint16", - "minimum": 0.0 - } + "httpStatusCode": { "type": ["integer", "null"], "format": "uint16", "minimum": 0 } } } }, @@ -95,11 +72,7 @@ "responseStreamDisconnected": { "type": "object", "properties": { - "httpStatusCode": { - "type": ["integer", "null"], - "format": "uint16", - "minimum": 0.0 - } + "httpStatusCode": { "type": ["integer", "null"], "format": "uint16", "minimum": 0 } } } }, @@ -114,11 +87,7 @@ "responseTooManyFailedAttempts": { "type": "object", "properties": { - "httpStatusCode": { - "type": ["integer", "null"], - "format": "uint16", - "minimum": 0.0 - } + "httpStatusCode": { "type": ["integer", "null"], "format": "uint16", "minimum": 0 } } } }, @@ -133,11 +102,7 @@ "activeTurnNotSteerable": { "type": "object", "required": ["turnKind"], - "properties": { - "turnKind": { - "$ref": "#/definitions/NonSteerableTurnKind" - } - } + "properties": { "turnKind": { "$ref": "#/definitions/NonSteerableTurnKind" } } } }, "additionalProperties": false, @@ -149,12 +114,8 @@ "type": "object", "required": ["status"], "properties": { - "message": { - "type": ["string", "null"] - }, - "status": { - "$ref": "#/definitions/CollabAgentStatus" - } + "message": { "type": ["string", "null"] }, + "status": { "$ref": "#/definitions/CollabAgentStatus" } } }, "CollabAgentStatus": { @@ -183,20 +144,10 @@ "type": "object", "required": ["command", "name", "path", "type"], "properties": { - "command": { - "type": "string" - }, - "name": { - "type": "string" - }, - "path": { - "$ref": "#/definitions/AbsolutePathBuf" - }, - "type": { - "type": "string", - "enum": ["read"], - "title": "ReadCommandActionType" - } + "command": { "type": "string" }, + "name": { "type": "string" }, + "path": { "$ref": "#/definitions/AbsolutePathBuf" }, + "type": { "type": "string", "enum": ["read"], "title": "ReadCommandActionType" } }, "title": "ReadCommandAction" }, @@ -204,12 +155,8 @@ "type": "object", "required": ["command", "type"], "properties": { - "command": { - "type": "string" - }, - "path": { - "type": ["string", "null"] - }, + "command": { "type": "string" }, + "path": { "type": ["string", "null"] }, "type": { "type": "string", "enum": ["listFiles"], @@ -222,20 +169,10 @@ "type": "object", "required": ["command", "type"], "properties": { - "command": { - "type": "string" - }, - "path": { - "type": ["string", "null"] - }, - "query": { - "type": ["string", "null"] - }, - "type": { - "type": "string", - "enum": ["search"], - "title": "SearchCommandActionType" - } + "command": { "type": "string" }, + "path": { "type": ["string", "null"] }, + "query": { "type": ["string", "null"] }, + "type": { "type": "string", "enum": ["search"], "title": "SearchCommandActionType" } }, "title": "SearchCommandAction" }, @@ -243,14 +180,8 @@ "type": "object", "required": ["command", "type"], "properties": { - "command": { - "type": "string" - }, - "type": { - "type": "string", - "enum": ["unknown"], - "title": "UnknownCommandActionType" - } + "command": { "type": "string" }, + "type": { "type": "string", "enum": ["unknown"], "title": "UnknownCommandActionType" } }, "title": "UnknownCommandAction" } @@ -270,9 +201,7 @@ "type": "object", "required": ["text", "type"], "properties": { - "text": { - "type": "string" - }, + "text": { "type": "string" }, "type": { "type": "string", "enum": ["inputText"], @@ -285,9 +214,7 @@ "type": "object", "required": ["imageUrl", "type"], "properties": { - "imageUrl": { - "type": "string" - }, + "imageUrl": { "type": "string" }, "type": { "type": "string", "enum": ["inputImage"], @@ -298,100 +225,52 @@ } ] }, - "DynamicToolCallStatus": { - "type": "string", - "enum": ["inProgress", "completed", "failed"] - }, + "DynamicToolCallStatus": { "type": "string", "enum": ["inProgress", "completed", "failed"] }, "FileUpdateChange": { "type": "object", "required": ["diff", "kind", "path"], "properties": { - "diff": { - "type": "string" - }, - "kind": { - "$ref": "#/definitions/PatchChangeKind" - }, - "path": { - "type": "string" - } + "diff": { "type": "string" }, + "kind": { "$ref": "#/definitions/PatchChangeKind" }, + "path": { "type": "string" } } }, "HookPromptFragment": { "type": "object", "required": ["hookRunId", "text"], - "properties": { - "hookRunId": { - "type": "string" - }, - "text": { - "type": "string" - } - } + "properties": { "hookRunId": { "type": "string" }, "text": { "type": "string" } } }, "McpToolCallError": { "type": "object", "required": ["message"], - "properties": { - "message": { - "type": "string" - } - } + "properties": { "message": { "type": "string" } } }, "McpToolCallResult": { "type": "object", "required": ["content"], "properties": { "_meta": true, - "content": { - "type": "array", - "items": true - }, + "content": { "type": "array", "items": true }, "structuredContent": true } }, - "McpToolCallStatus": { - "type": "string", - "enum": ["inProgress", "completed", "failed"] - }, + "McpToolCallStatus": { "type": "string", "enum": ["inProgress", "completed", "failed"] }, "MemoryCitation": { "type": "object", "required": ["entries", "threadIds"], "properties": { - "entries": { - "type": "array", - "items": { - "$ref": "#/definitions/MemoryCitationEntry" - } - }, - "threadIds": { - "type": "array", - "items": { - "type": "string" - } - } + "entries": { "type": "array", "items": { "$ref": "#/definitions/MemoryCitationEntry" } }, + "threadIds": { "type": "array", "items": { "type": "string" } } } }, "MemoryCitationEntry": { "type": "object", "required": ["lineEnd", "lineStart", "note", "path"], "properties": { - "lineEnd": { - "type": "integer", - "format": "uint32", - "minimum": 0.0 - }, - "lineStart": { - "type": "integer", - "format": "uint32", - "minimum": 0.0 - }, - "note": { - "type": "string" - }, - "path": { - "type": "string" - } + "lineEnd": { "type": "integer", "format": "uint32", "minimum": 0 }, + "lineStart": { "type": "integer", "format": "uint32", "minimum": 0 }, + "note": { "type": "string" }, + "path": { "type": "string" } } }, "MessagePhase": { @@ -409,10 +288,7 @@ } ] }, - "NonSteerableTurnKind": { - "type": "string", - "enum": ["review", "compact"] - }, + "NonSteerableTurnKind": { "type": "string", "enum": ["review", "compact"] }, "PatchApplyStatus": { "type": "string", "enum": ["inProgress", "completed", "failed", "declined"] @@ -423,11 +299,7 @@ "type": "object", "required": ["type"], "properties": { - "type": { - "type": "string", - "enum": ["add"], - "title": "AddPatchChangeKindType" - } + "type": { "type": "string", "enum": ["add"], "title": "AddPatchChangeKindType" } }, "title": "AddPatchChangeKind" }, @@ -435,11 +307,7 @@ "type": "object", "required": ["type"], "properties": { - "type": { - "type": "string", - "enum": ["delete"], - "title": "DeletePatchChangeKindType" - } + "type": { "type": "string", "enum": ["delete"], "title": "DeletePatchChangeKindType" } }, "title": "DeletePatchChangeKind" }, @@ -447,14 +315,8 @@ "type": "object", "required": ["type"], "properties": { - "move_path": { - "type": ["string", "null"] - }, - "type": { - "type": "string", - "enum": ["update"], - "title": "UpdatePatchChangeKindType" - } + "move_path": { "type": ["string", "null"] }, + "type": { "type": "string", "enum": ["update"], "title": "UpdatePatchChangeKindType" } }, "title": "UpdatePatchChangeKind" } @@ -471,11 +333,7 @@ "properties": { "byteRange": { "description": "Byte range in the parent `text` buffer that this element occupies.", - "allOf": [ - { - "$ref": "#/definitions/ByteRange" - } - ] + "allOf": [{ "$ref": "#/definitions/ByteRange" }] }, "placeholder": { "description": "Optional human-readable placeholder for the element, displayed in the UI.", @@ -489,15 +347,8 @@ "type": "object", "required": ["content", "id", "type"], "properties": { - "content": { - "type": "array", - "items": { - "$ref": "#/definitions/UserInput" - } - }, - "id": { - "type": "string" - }, + "content": { "type": "array", "items": { "$ref": "#/definitions/UserInput" } }, + "id": { "type": "string" }, "type": { "type": "string", "enum": ["userMessage"], @@ -512,13 +363,9 @@ "properties": { "fragments": { "type": "array", - "items": { - "$ref": "#/definitions/HookPromptFragment" - } - }, - "id": { - "type": "string" + "items": { "$ref": "#/definitions/HookPromptFragment" } }, + "id": { "type": "string" }, "type": { "type": "string", "enum": ["hookPrompt"], @@ -531,34 +378,16 @@ "type": "object", "required": ["id", "text", "type"], "properties": { - "id": { - "type": "string" - }, + "id": { "type": "string" }, "memoryCitation": { "default": null, - "anyOf": [ - { - "$ref": "#/definitions/MemoryCitation" - }, - { - "type": "null" - } - ] + "anyOf": [{ "$ref": "#/definitions/MemoryCitation" }, { "type": "null" }] }, "phase": { "default": null, - "anyOf": [ - { - "$ref": "#/definitions/MessagePhase" - }, - { - "type": "null" - } - ] - }, - "text": { - "type": "string" + "anyOf": [{ "$ref": "#/definitions/MessagePhase" }, { "type": "null" }] }, + "text": { "type": "string" }, "type": { "type": "string", "enum": ["agentMessage"], @@ -572,17 +401,9 @@ "type": "object", "required": ["id", "text", "type"], "properties": { - "id": { - "type": "string" - }, - "text": { - "type": "string" - }, - "type": { - "type": "string", - "enum": ["plan"], - "title": "PlanThreadItemType" - } + "id": { "type": "string" }, + "text": { "type": "string" }, + "type": { "type": "string", "enum": ["plan"], "title": "PlanThreadItemType" } }, "title": "PlanThreadItem" }, @@ -590,28 +411,10 @@ "type": "object", "required": ["id", "type"], "properties": { - "content": { - "default": [], - "type": "array", - "items": { - "type": "string" - } - }, - "id": { - "type": "string" - }, - "summary": { - "default": [], - "type": "array", - "items": { - "type": "string" - } - }, - "type": { - "type": "string", - "enum": ["reasoning"], - "title": "ReasoningThreadItemType" - } + "content": { "default": [], "type": "array", "items": { "type": "string" } }, + "id": { "type": "string" }, + "summary": { "default": [], "type": "array", "items": { "type": "string" } }, + "type": { "type": "string", "enum": ["reasoning"], "title": "ReasoningThreadItemType" } }, "title": "ReasoningThreadItem" }, @@ -623,24 +426,15 @@ "description": "The command's output, aggregated from stdout and stderr.", "type": ["string", "null"] }, - "command": { - "description": "The command to be executed.", - "type": "string" - }, + "command": { "description": "The command to be executed.", "type": "string" }, "commandActions": { "description": "A best-effort parsing of the command to understand the action(s) it will perform. This returns a list of CommandAction objects because a single shell command may be composed of many commands piped together.", "type": "array", - "items": { - "$ref": "#/definitions/CommandAction" - } + "items": { "$ref": "#/definitions/CommandAction" } }, "cwd": { "description": "The command's working directory.", - "allOf": [ - { - "$ref": "#/definitions/AbsolutePathBuf" - } - ] + "allOf": [{ "$ref": "#/definitions/AbsolutePathBuf" }] }, "durationMs": { "description": "The duration of the command execution in milliseconds.", @@ -652,24 +446,16 @@ "type": ["integer", "null"], "format": "int32" }, - "id": { - "type": "string" - }, + "id": { "type": "string" }, "processId": { "description": "Identifier for the underlying PTY process (when available).", "type": ["string", "null"] }, "source": { "default": "agent", - "allOf": [ - { - "$ref": "#/definitions/CommandExecutionSource" - } - ] - }, - "status": { - "$ref": "#/definitions/CommandExecutionStatus" + "allOf": [{ "$ref": "#/definitions/CommandExecutionSource" }] }, + "status": { "$ref": "#/definitions/CommandExecutionStatus" }, "type": { "type": "string", "enum": ["commandExecution"], @@ -682,18 +468,9 @@ "type": "object", "required": ["changes", "id", "status", "type"], "properties": { - "changes": { - "type": "array", - "items": { - "$ref": "#/definitions/FileUpdateChange" - } - }, - "id": { - "type": "string" - }, - "status": { - "$ref": "#/definitions/PatchApplyStatus" - }, + "changes": { "type": "array", "items": { "$ref": "#/definitions/FileUpdateChange" } }, + "id": { "type": "string" }, + "status": { "$ref": "#/definitions/PatchApplyStatus" }, "type": { "type": "string", "enum": ["fileChange"], @@ -713,40 +490,16 @@ "format": "int64" }, "error": { - "anyOf": [ - { - "$ref": "#/definitions/McpToolCallError" - }, - { - "type": "null" - } - ] - }, - "id": { - "type": "string" - }, - "mcpAppResourceUri": { - "type": ["string", "null"] + "anyOf": [{ "$ref": "#/definitions/McpToolCallError" }, { "type": "null" }] }, + "id": { "type": "string" }, + "mcpAppResourceUri": { "type": ["string", "null"] }, "result": { - "anyOf": [ - { - "$ref": "#/definitions/McpToolCallResult" - }, - { - "type": "null" - } - ] - }, - "server": { - "type": "string" - }, - "status": { - "$ref": "#/definitions/McpToolCallStatus" - }, - "tool": { - "type": "string" + "anyOf": [{ "$ref": "#/definitions/McpToolCallResult" }, { "type": "null" }] }, + "server": { "type": "string" }, + "status": { "$ref": "#/definitions/McpToolCallStatus" }, + "tool": { "type": "string" }, "type": { "type": "string", "enum": ["mcpToolCall"], @@ -762,30 +515,18 @@ "arguments": true, "contentItems": { "type": ["array", "null"], - "items": { - "$ref": "#/definitions/DynamicToolCallOutputContentItem" - } + "items": { "$ref": "#/definitions/DynamicToolCallOutputContentItem" } }, "durationMs": { "description": "The duration of the dynamic tool call in milliseconds.", "type": ["integer", "null"], "format": "int64" }, - "id": { - "type": "string" - }, - "namespace": { - "type": ["string", "null"] - }, - "status": { - "$ref": "#/definitions/DynamicToolCallStatus" - }, - "success": { - "type": ["boolean", "null"] - }, - "tool": { - "type": "string" - }, + "id": { "type": "string" }, + "namespace": { "type": ["string", "null"] }, + "status": { "$ref": "#/definitions/DynamicToolCallStatus" }, + "success": { "type": ["boolean", "null"] }, + "tool": { "type": "string" }, "type": { "type": "string", "enum": ["dynamicToolCall"], @@ -809,9 +550,7 @@ "agentsStates": { "description": "Last known status of the target agents, when available.", "type": "object", - "additionalProperties": { - "$ref": "#/definitions/CollabAgentState" - } + "additionalProperties": { "$ref": "#/definitions/CollabAgentState" } }, "id": { "description": "Unique identifier for this collab tool call.", @@ -827,21 +566,12 @@ }, "reasoningEffort": { "description": "Reasoning effort requested for the spawned agent, when applicable.", - "anyOf": [ - { - "$ref": "#/definitions/ReasoningEffort" - }, - { - "type": "null" - } - ] + "anyOf": [{ "$ref": "#/definitions/ReasoningEffort" }, { "type": "null" }] }, "receiverThreadIds": { "description": "Thread ID of the receiving agent, when applicable. In case of spawn operation, this corresponds to the newly spawned agent.", "type": "array", - "items": { - "type": "string" - } + "items": { "type": "string" } }, "senderThreadId": { "description": "Thread ID of the agent issuing the collab request.", @@ -849,19 +579,11 @@ }, "status": { "description": "Current status of the collab tool call.", - "allOf": [ - { - "$ref": "#/definitions/CollabAgentToolCallStatus" - } - ] + "allOf": [{ "$ref": "#/definitions/CollabAgentToolCallStatus" }] }, "tool": { "description": "Name of the collab tool that was invoked.", - "allOf": [ - { - "$ref": "#/definitions/CollabAgentTool" - } - ] + "allOf": [{ "$ref": "#/definitions/CollabAgentTool" }] }, "type": { "type": "string", @@ -876,26 +598,11 @@ "required": ["id", "query", "type"], "properties": { "action": { - "anyOf": [ - { - "$ref": "#/definitions/WebSearchAction" - }, - { - "type": "null" - } - ] + "anyOf": [{ "$ref": "#/definitions/WebSearchAction" }, { "type": "null" }] }, - "id": { - "type": "string" - }, - "query": { - "type": "string" - }, - "type": { - "type": "string", - "enum": ["webSearch"], - "title": "WebSearchThreadItemType" - } + "id": { "type": "string" }, + "query": { "type": "string" }, + "type": { "type": "string", "enum": ["webSearch"], "title": "WebSearchThreadItemType" } }, "title": "WebSearchThreadItem" }, @@ -903,17 +610,9 @@ "type": "object", "required": ["id", "path", "type"], "properties": { - "id": { - "type": "string" - }, - "path": { - "$ref": "#/definitions/AbsolutePathBuf" - }, - "type": { - "type": "string", - "enum": ["imageView"], - "title": "ImageViewThreadItemType" - } + "id": { "type": "string" }, + "path": { "$ref": "#/definitions/AbsolutePathBuf" }, + "type": { "type": "string", "enum": ["imageView"], "title": "ImageViewThreadItemType" } }, "title": "ImageViewThreadItem" }, @@ -921,28 +620,13 @@ "type": "object", "required": ["id", "result", "status", "type"], "properties": { - "id": { - "type": "string" - }, - "result": { - "type": "string" - }, - "revisedPrompt": { - "type": ["string", "null"] - }, + "id": { "type": "string" }, + "result": { "type": "string" }, + "revisedPrompt": { "type": ["string", "null"] }, "savedPath": { - "anyOf": [ - { - "$ref": "#/definitions/AbsolutePathBuf" - }, - { - "type": "null" - } - ] - }, - "status": { - "type": "string" + "anyOf": [{ "$ref": "#/definitions/AbsolutePathBuf" }, { "type": "null" }] }, + "status": { "type": "string" }, "type": { "type": "string", "enum": ["imageGeneration"], @@ -955,12 +639,8 @@ "type": "object", "required": ["id", "review", "type"], "properties": { - "id": { - "type": "string" - }, - "review": { - "type": "string" - }, + "id": { "type": "string" }, + "review": { "type": "string" }, "type": { "type": "string", "enum": ["enteredReviewMode"], @@ -973,12 +653,8 @@ "type": "object", "required": ["id", "review", "type"], "properties": { - "id": { - "type": "string" - }, - "review": { - "type": "string" - }, + "id": { "type": "string" }, + "review": { "type": "string" }, "type": { "type": "string", "enum": ["exitedReviewMode"], @@ -991,9 +667,7 @@ "type": "object", "required": ["id", "type"], "properties": { - "id": { - "type": "string" - }, + "id": { "type": "string" }, "type": { "type": "string", "enum": ["contextCompaction"], @@ -1020,56 +694,31 @@ }, "error": { "description": "Only populated when the Turn's status is failed.", - "anyOf": [ - { - "$ref": "#/definitions/TurnError" - }, - { - "type": "null" - } - ] - }, - "id": { - "type": "string" + "anyOf": [{ "$ref": "#/definitions/TurnError" }, { "type": "null" }] }, + "id": { "type": "string" }, "items": { "description": "Only populated on a `thread/resume` or `thread/fork` response. For all other responses and notifications returning a Turn, the items field will be an empty list.", "type": "array", - "items": { - "$ref": "#/definitions/ThreadItem" - } + "items": { "$ref": "#/definitions/ThreadItem" } }, "startedAt": { "description": "Unix timestamp (in seconds) when the turn started.", "type": ["integer", "null"], "format": "int64" }, - "status": { - "$ref": "#/definitions/TurnStatus" - } + "status": { "$ref": "#/definitions/TurnStatus" } } }, "TurnError": { "type": "object", "required": ["message"], "properties": { - "additionalDetails": { - "default": null, - "type": ["string", "null"] - }, + "additionalDetails": { "default": null, "type": ["string", "null"] }, "codexErrorInfo": { - "anyOf": [ - { - "$ref": "#/definitions/CodexErrorInfo" - }, - { - "type": "null" - } - ] + "anyOf": [{ "$ref": "#/definitions/CodexErrorInfo" }, { "type": "null" }] }, - "message": { - "type": "string" - } + "message": { "type": "string" } } }, "TurnStatus": { @@ -1082,22 +731,14 @@ "type": "object", "required": ["text", "type"], "properties": { - "text": { - "type": "string" - }, + "text": { "type": "string" }, "text_elements": { "description": "UI-defined spans within `text` used to render or persist special elements.", "default": [], "type": "array", - "items": { - "$ref": "#/definitions/TextElement" - } + "items": { "$ref": "#/definitions/TextElement" } }, - "type": { - "type": "string", - "enum": ["text"], - "title": "TextUserInputType" - } + "type": { "type": "string", "enum": ["text"], "title": "TextUserInputType" } }, "title": "TextUserInput" }, @@ -1105,14 +746,8 @@ "type": "object", "required": ["type", "url"], "properties": { - "type": { - "type": "string", - "enum": ["image"], - "title": "ImageUserInputType" - }, - "url": { - "type": "string" - } + "type": { "type": "string", "enum": ["image"], "title": "ImageUserInputType" }, + "url": { "type": "string" } }, "title": "ImageUserInput" }, @@ -1120,14 +755,8 @@ "type": "object", "required": ["path", "type"], "properties": { - "path": { - "type": "string" - }, - "type": { - "type": "string", - "enum": ["localImage"], - "title": "LocalImageUserInputType" - } + "path": { "type": "string" }, + "type": { "type": "string", "enum": ["localImage"], "title": "LocalImageUserInputType" } }, "title": "LocalImageUserInput" }, @@ -1135,17 +764,9 @@ "type": "object", "required": ["name", "path", "type"], "properties": { - "name": { - "type": "string" - }, - "path": { - "type": "string" - }, - "type": { - "type": "string", - "enum": ["skill"], - "title": "SkillUserInputType" - } + "name": { "type": "string" }, + "path": { "type": "string" }, + "type": { "type": "string", "enum": ["skill"], "title": "SkillUserInputType" } }, "title": "SkillUserInput" }, @@ -1153,17 +774,9 @@ "type": "object", "required": ["name", "path", "type"], "properties": { - "name": { - "type": "string" - }, - "path": { - "type": "string" - }, - "type": { - "type": "string", - "enum": ["mention"], - "title": "MentionUserInputType" - } + "name": { "type": "string" }, + "path": { "type": "string" }, + "type": { "type": "string", "enum": ["mention"], "title": "MentionUserInputType" } }, "title": "MentionUserInput" } @@ -1175,20 +788,9 @@ "type": "object", "required": ["type"], "properties": { - "queries": { - "type": ["array", "null"], - "items": { - "type": "string" - } - }, - "query": { - "type": ["string", "null"] - }, - "type": { - "type": "string", - "enum": ["search"], - "title": "SearchWebSearchActionType" - } + "queries": { "type": ["array", "null"], "items": { "type": "string" } }, + "query": { "type": ["string", "null"] }, + "type": { "type": "string", "enum": ["search"], "title": "SearchWebSearchActionType" } }, "title": "SearchWebSearchAction" }, @@ -1201,9 +803,7 @@ "enum": ["openPage"], "title": "OpenPageWebSearchActionType" }, - "url": { - "type": ["string", "null"] - } + "url": { "type": ["string", "null"] } }, "title": "OpenPageWebSearchAction" }, @@ -1211,17 +811,13 @@ "type": "object", "required": ["type"], "properties": { - "pattern": { - "type": ["string", "null"] - }, + "pattern": { "type": ["string", "null"] }, "type": { "type": "string", "enum": ["findInPage"], "title": "FindInPageWebSearchActionType" }, - "url": { - "type": ["string", "null"] - } + "url": { "type": ["string", "null"] } }, "title": "FindInPageWebSearchAction" }, @@ -1229,11 +825,7 @@ "type": "object", "required": ["type"], "properties": { - "type": { - "type": "string", - "enum": ["other"], - "title": "OtherWebSearchActionType" - } + "type": { "type": "string", "enum": ["other"], "title": "OtherWebSearchActionType" } }, "title": "OtherWebSearchAction" } diff --git a/extensions/codex/src/app-server/protocol-generated/json/v2/TurnStartResponse.json b/extensions/codex/src/app-server/protocol-generated/json/v2/TurnStartResponse.json index 4e0933cfb23..8a88784e23b 100644 --- a/extensions/codex/src/app-server/protocol-generated/json/v2/TurnStartResponse.json +++ b/extensions/codex/src/app-server/protocol-generated/json/v2/TurnStartResponse.json @@ -3,11 +3,7 @@ "title": "TurnStartResponse", "type": "object", "required": ["turn"], - "properties": { - "turn": { - "$ref": "#/definitions/Turn" - } - }, + "properties": { "turn": { "$ref": "#/definitions/Turn" } }, "definitions": { "AbsolutePathBuf": { "description": "A path that is guaranteed to be absolute and normalized (though it is not guaranteed to be canonicalized or exist on the filesystem).\n\nIMPORTANT: When deserializing an `AbsolutePathBuf`, a base path must be set using [AbsolutePathBufGuard::new]. If no base path is set, the deserialization will fail unless the path being deserialized is already absolute.", @@ -17,16 +13,8 @@ "type": "object", "required": ["end", "start"], "properties": { - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - } + "end": { "type": "integer", "format": "uint", "minimum": 0 }, + "start": { "type": "integer", "format": "uint", "minimum": 0 } } }, "CodexErrorInfo": { @@ -54,11 +42,7 @@ "httpConnectionFailed": { "type": "object", "properties": { - "httpStatusCode": { - "type": ["integer", "null"], - "format": "uint16", - "minimum": 0.0 - } + "httpStatusCode": { "type": ["integer", "null"], "format": "uint16", "minimum": 0 } } } }, @@ -73,11 +57,7 @@ "responseStreamConnectionFailed": { "type": "object", "properties": { - "httpStatusCode": { - "type": ["integer", "null"], - "format": "uint16", - "minimum": 0.0 - } + "httpStatusCode": { "type": ["integer", "null"], "format": "uint16", "minimum": 0 } } } }, @@ -92,11 +72,7 @@ "responseStreamDisconnected": { "type": "object", "properties": { - "httpStatusCode": { - "type": ["integer", "null"], - "format": "uint16", - "minimum": 0.0 - } + "httpStatusCode": { "type": ["integer", "null"], "format": "uint16", "minimum": 0 } } } }, @@ -111,11 +87,7 @@ "responseTooManyFailedAttempts": { "type": "object", "properties": { - "httpStatusCode": { - "type": ["integer", "null"], - "format": "uint16", - "minimum": 0.0 - } + "httpStatusCode": { "type": ["integer", "null"], "format": "uint16", "minimum": 0 } } } }, @@ -130,11 +102,7 @@ "activeTurnNotSteerable": { "type": "object", "required": ["turnKind"], - "properties": { - "turnKind": { - "$ref": "#/definitions/NonSteerableTurnKind" - } - } + "properties": { "turnKind": { "$ref": "#/definitions/NonSteerableTurnKind" } } } }, "additionalProperties": false, @@ -146,12 +114,8 @@ "type": "object", "required": ["status"], "properties": { - "message": { - "type": ["string", "null"] - }, - "status": { - "$ref": "#/definitions/CollabAgentStatus" - } + "message": { "type": ["string", "null"] }, + "status": { "$ref": "#/definitions/CollabAgentStatus" } } }, "CollabAgentStatus": { @@ -180,20 +144,10 @@ "type": "object", "required": ["command", "name", "path", "type"], "properties": { - "command": { - "type": "string" - }, - "name": { - "type": "string" - }, - "path": { - "$ref": "#/definitions/AbsolutePathBuf" - }, - "type": { - "type": "string", - "enum": ["read"], - "title": "ReadCommandActionType" - } + "command": { "type": "string" }, + "name": { "type": "string" }, + "path": { "$ref": "#/definitions/AbsolutePathBuf" }, + "type": { "type": "string", "enum": ["read"], "title": "ReadCommandActionType" } }, "title": "ReadCommandAction" }, @@ -201,12 +155,8 @@ "type": "object", "required": ["command", "type"], "properties": { - "command": { - "type": "string" - }, - "path": { - "type": ["string", "null"] - }, + "command": { "type": "string" }, + "path": { "type": ["string", "null"] }, "type": { "type": "string", "enum": ["listFiles"], @@ -219,20 +169,10 @@ "type": "object", "required": ["command", "type"], "properties": { - "command": { - "type": "string" - }, - "path": { - "type": ["string", "null"] - }, - "query": { - "type": ["string", "null"] - }, - "type": { - "type": "string", - "enum": ["search"], - "title": "SearchCommandActionType" - } + "command": { "type": "string" }, + "path": { "type": ["string", "null"] }, + "query": { "type": ["string", "null"] }, + "type": { "type": "string", "enum": ["search"], "title": "SearchCommandActionType" } }, "title": "SearchCommandAction" }, @@ -240,14 +180,8 @@ "type": "object", "required": ["command", "type"], "properties": { - "command": { - "type": "string" - }, - "type": { - "type": "string", - "enum": ["unknown"], - "title": "UnknownCommandActionType" - } + "command": { "type": "string" }, + "type": { "type": "string", "enum": ["unknown"], "title": "UnknownCommandActionType" } }, "title": "UnknownCommandAction" } @@ -267,9 +201,7 @@ "type": "object", "required": ["text", "type"], "properties": { - "text": { - "type": "string" - }, + "text": { "type": "string" }, "type": { "type": "string", "enum": ["inputText"], @@ -282,9 +214,7 @@ "type": "object", "required": ["imageUrl", "type"], "properties": { - "imageUrl": { - "type": "string" - }, + "imageUrl": { "type": "string" }, "type": { "type": "string", "enum": ["inputImage"], @@ -295,100 +225,52 @@ } ] }, - "DynamicToolCallStatus": { - "type": "string", - "enum": ["inProgress", "completed", "failed"] - }, + "DynamicToolCallStatus": { "type": "string", "enum": ["inProgress", "completed", "failed"] }, "FileUpdateChange": { "type": "object", "required": ["diff", "kind", "path"], "properties": { - "diff": { - "type": "string" - }, - "kind": { - "$ref": "#/definitions/PatchChangeKind" - }, - "path": { - "type": "string" - } + "diff": { "type": "string" }, + "kind": { "$ref": "#/definitions/PatchChangeKind" }, + "path": { "type": "string" } } }, "HookPromptFragment": { "type": "object", "required": ["hookRunId", "text"], - "properties": { - "hookRunId": { - "type": "string" - }, - "text": { - "type": "string" - } - } + "properties": { "hookRunId": { "type": "string" }, "text": { "type": "string" } } }, "McpToolCallError": { "type": "object", "required": ["message"], - "properties": { - "message": { - "type": "string" - } - } + "properties": { "message": { "type": "string" } } }, "McpToolCallResult": { "type": "object", "required": ["content"], "properties": { "_meta": true, - "content": { - "type": "array", - "items": true - }, + "content": { "type": "array", "items": true }, "structuredContent": true } }, - "McpToolCallStatus": { - "type": "string", - "enum": ["inProgress", "completed", "failed"] - }, + "McpToolCallStatus": { "type": "string", "enum": ["inProgress", "completed", "failed"] }, "MemoryCitation": { "type": "object", "required": ["entries", "threadIds"], "properties": { - "entries": { - "type": "array", - "items": { - "$ref": "#/definitions/MemoryCitationEntry" - } - }, - "threadIds": { - "type": "array", - "items": { - "type": "string" - } - } + "entries": { "type": "array", "items": { "$ref": "#/definitions/MemoryCitationEntry" } }, + "threadIds": { "type": "array", "items": { "type": "string" } } } }, "MemoryCitationEntry": { "type": "object", "required": ["lineEnd", "lineStart", "note", "path"], "properties": { - "lineEnd": { - "type": "integer", - "format": "uint32", - "minimum": 0.0 - }, - "lineStart": { - "type": "integer", - "format": "uint32", - "minimum": 0.0 - }, - "note": { - "type": "string" - }, - "path": { - "type": "string" - } + "lineEnd": { "type": "integer", "format": "uint32", "minimum": 0 }, + "lineStart": { "type": "integer", "format": "uint32", "minimum": 0 }, + "note": { "type": "string" }, + "path": { "type": "string" } } }, "MessagePhase": { @@ -406,10 +288,7 @@ } ] }, - "NonSteerableTurnKind": { - "type": "string", - "enum": ["review", "compact"] - }, + "NonSteerableTurnKind": { "type": "string", "enum": ["review", "compact"] }, "PatchApplyStatus": { "type": "string", "enum": ["inProgress", "completed", "failed", "declined"] @@ -420,11 +299,7 @@ "type": "object", "required": ["type"], "properties": { - "type": { - "type": "string", - "enum": ["add"], - "title": "AddPatchChangeKindType" - } + "type": { "type": "string", "enum": ["add"], "title": "AddPatchChangeKindType" } }, "title": "AddPatchChangeKind" }, @@ -432,11 +307,7 @@ "type": "object", "required": ["type"], "properties": { - "type": { - "type": "string", - "enum": ["delete"], - "title": "DeletePatchChangeKindType" - } + "type": { "type": "string", "enum": ["delete"], "title": "DeletePatchChangeKindType" } }, "title": "DeletePatchChangeKind" }, @@ -444,14 +315,8 @@ "type": "object", "required": ["type"], "properties": { - "move_path": { - "type": ["string", "null"] - }, - "type": { - "type": "string", - "enum": ["update"], - "title": "UpdatePatchChangeKindType" - } + "move_path": { "type": ["string", "null"] }, + "type": { "type": "string", "enum": ["update"], "title": "UpdatePatchChangeKindType" } }, "title": "UpdatePatchChangeKind" } @@ -468,11 +333,7 @@ "properties": { "byteRange": { "description": "Byte range in the parent `text` buffer that this element occupies.", - "allOf": [ - { - "$ref": "#/definitions/ByteRange" - } - ] + "allOf": [{ "$ref": "#/definitions/ByteRange" }] }, "placeholder": { "description": "Optional human-readable placeholder for the element, displayed in the UI.", @@ -486,15 +347,8 @@ "type": "object", "required": ["content", "id", "type"], "properties": { - "content": { - "type": "array", - "items": { - "$ref": "#/definitions/UserInput" - } - }, - "id": { - "type": "string" - }, + "content": { "type": "array", "items": { "$ref": "#/definitions/UserInput" } }, + "id": { "type": "string" }, "type": { "type": "string", "enum": ["userMessage"], @@ -509,13 +363,9 @@ "properties": { "fragments": { "type": "array", - "items": { - "$ref": "#/definitions/HookPromptFragment" - } - }, - "id": { - "type": "string" + "items": { "$ref": "#/definitions/HookPromptFragment" } }, + "id": { "type": "string" }, "type": { "type": "string", "enum": ["hookPrompt"], @@ -528,34 +378,16 @@ "type": "object", "required": ["id", "text", "type"], "properties": { - "id": { - "type": "string" - }, + "id": { "type": "string" }, "memoryCitation": { "default": null, - "anyOf": [ - { - "$ref": "#/definitions/MemoryCitation" - }, - { - "type": "null" - } - ] + "anyOf": [{ "$ref": "#/definitions/MemoryCitation" }, { "type": "null" }] }, "phase": { "default": null, - "anyOf": [ - { - "$ref": "#/definitions/MessagePhase" - }, - { - "type": "null" - } - ] - }, - "text": { - "type": "string" + "anyOf": [{ "$ref": "#/definitions/MessagePhase" }, { "type": "null" }] }, + "text": { "type": "string" }, "type": { "type": "string", "enum": ["agentMessage"], @@ -569,17 +401,9 @@ "type": "object", "required": ["id", "text", "type"], "properties": { - "id": { - "type": "string" - }, - "text": { - "type": "string" - }, - "type": { - "type": "string", - "enum": ["plan"], - "title": "PlanThreadItemType" - } + "id": { "type": "string" }, + "text": { "type": "string" }, + "type": { "type": "string", "enum": ["plan"], "title": "PlanThreadItemType" } }, "title": "PlanThreadItem" }, @@ -587,28 +411,10 @@ "type": "object", "required": ["id", "type"], "properties": { - "content": { - "default": [], - "type": "array", - "items": { - "type": "string" - } - }, - "id": { - "type": "string" - }, - "summary": { - "default": [], - "type": "array", - "items": { - "type": "string" - } - }, - "type": { - "type": "string", - "enum": ["reasoning"], - "title": "ReasoningThreadItemType" - } + "content": { "default": [], "type": "array", "items": { "type": "string" } }, + "id": { "type": "string" }, + "summary": { "default": [], "type": "array", "items": { "type": "string" } }, + "type": { "type": "string", "enum": ["reasoning"], "title": "ReasoningThreadItemType" } }, "title": "ReasoningThreadItem" }, @@ -620,24 +426,15 @@ "description": "The command's output, aggregated from stdout and stderr.", "type": ["string", "null"] }, - "command": { - "description": "The command to be executed.", - "type": "string" - }, + "command": { "description": "The command to be executed.", "type": "string" }, "commandActions": { "description": "A best-effort parsing of the command to understand the action(s) it will perform. This returns a list of CommandAction objects because a single shell command may be composed of many commands piped together.", "type": "array", - "items": { - "$ref": "#/definitions/CommandAction" - } + "items": { "$ref": "#/definitions/CommandAction" } }, "cwd": { "description": "The command's working directory.", - "allOf": [ - { - "$ref": "#/definitions/AbsolutePathBuf" - } - ] + "allOf": [{ "$ref": "#/definitions/AbsolutePathBuf" }] }, "durationMs": { "description": "The duration of the command execution in milliseconds.", @@ -649,24 +446,16 @@ "type": ["integer", "null"], "format": "int32" }, - "id": { - "type": "string" - }, + "id": { "type": "string" }, "processId": { "description": "Identifier for the underlying PTY process (when available).", "type": ["string", "null"] }, "source": { "default": "agent", - "allOf": [ - { - "$ref": "#/definitions/CommandExecutionSource" - } - ] - }, - "status": { - "$ref": "#/definitions/CommandExecutionStatus" + "allOf": [{ "$ref": "#/definitions/CommandExecutionSource" }] }, + "status": { "$ref": "#/definitions/CommandExecutionStatus" }, "type": { "type": "string", "enum": ["commandExecution"], @@ -679,18 +468,9 @@ "type": "object", "required": ["changes", "id", "status", "type"], "properties": { - "changes": { - "type": "array", - "items": { - "$ref": "#/definitions/FileUpdateChange" - } - }, - "id": { - "type": "string" - }, - "status": { - "$ref": "#/definitions/PatchApplyStatus" - }, + "changes": { "type": "array", "items": { "$ref": "#/definitions/FileUpdateChange" } }, + "id": { "type": "string" }, + "status": { "$ref": "#/definitions/PatchApplyStatus" }, "type": { "type": "string", "enum": ["fileChange"], @@ -710,40 +490,16 @@ "format": "int64" }, "error": { - "anyOf": [ - { - "$ref": "#/definitions/McpToolCallError" - }, - { - "type": "null" - } - ] - }, - "id": { - "type": "string" - }, - "mcpAppResourceUri": { - "type": ["string", "null"] + "anyOf": [{ "$ref": "#/definitions/McpToolCallError" }, { "type": "null" }] }, + "id": { "type": "string" }, + "mcpAppResourceUri": { "type": ["string", "null"] }, "result": { - "anyOf": [ - { - "$ref": "#/definitions/McpToolCallResult" - }, - { - "type": "null" - } - ] - }, - "server": { - "type": "string" - }, - "status": { - "$ref": "#/definitions/McpToolCallStatus" - }, - "tool": { - "type": "string" + "anyOf": [{ "$ref": "#/definitions/McpToolCallResult" }, { "type": "null" }] }, + "server": { "type": "string" }, + "status": { "$ref": "#/definitions/McpToolCallStatus" }, + "tool": { "type": "string" }, "type": { "type": "string", "enum": ["mcpToolCall"], @@ -759,30 +515,18 @@ "arguments": true, "contentItems": { "type": ["array", "null"], - "items": { - "$ref": "#/definitions/DynamicToolCallOutputContentItem" - } + "items": { "$ref": "#/definitions/DynamicToolCallOutputContentItem" } }, "durationMs": { "description": "The duration of the dynamic tool call in milliseconds.", "type": ["integer", "null"], "format": "int64" }, - "id": { - "type": "string" - }, - "namespace": { - "type": ["string", "null"] - }, - "status": { - "$ref": "#/definitions/DynamicToolCallStatus" - }, - "success": { - "type": ["boolean", "null"] - }, - "tool": { - "type": "string" - }, + "id": { "type": "string" }, + "namespace": { "type": ["string", "null"] }, + "status": { "$ref": "#/definitions/DynamicToolCallStatus" }, + "success": { "type": ["boolean", "null"] }, + "tool": { "type": "string" }, "type": { "type": "string", "enum": ["dynamicToolCall"], @@ -806,9 +550,7 @@ "agentsStates": { "description": "Last known status of the target agents, when available.", "type": "object", - "additionalProperties": { - "$ref": "#/definitions/CollabAgentState" - } + "additionalProperties": { "$ref": "#/definitions/CollabAgentState" } }, "id": { "description": "Unique identifier for this collab tool call.", @@ -824,21 +566,12 @@ }, "reasoningEffort": { "description": "Reasoning effort requested for the spawned agent, when applicable.", - "anyOf": [ - { - "$ref": "#/definitions/ReasoningEffort" - }, - { - "type": "null" - } - ] + "anyOf": [{ "$ref": "#/definitions/ReasoningEffort" }, { "type": "null" }] }, "receiverThreadIds": { "description": "Thread ID of the receiving agent, when applicable. In case of spawn operation, this corresponds to the newly spawned agent.", "type": "array", - "items": { - "type": "string" - } + "items": { "type": "string" } }, "senderThreadId": { "description": "Thread ID of the agent issuing the collab request.", @@ -846,19 +579,11 @@ }, "status": { "description": "Current status of the collab tool call.", - "allOf": [ - { - "$ref": "#/definitions/CollabAgentToolCallStatus" - } - ] + "allOf": [{ "$ref": "#/definitions/CollabAgentToolCallStatus" }] }, "tool": { "description": "Name of the collab tool that was invoked.", - "allOf": [ - { - "$ref": "#/definitions/CollabAgentTool" - } - ] + "allOf": [{ "$ref": "#/definitions/CollabAgentTool" }] }, "type": { "type": "string", @@ -873,26 +598,11 @@ "required": ["id", "query", "type"], "properties": { "action": { - "anyOf": [ - { - "$ref": "#/definitions/WebSearchAction" - }, - { - "type": "null" - } - ] + "anyOf": [{ "$ref": "#/definitions/WebSearchAction" }, { "type": "null" }] }, - "id": { - "type": "string" - }, - "query": { - "type": "string" - }, - "type": { - "type": "string", - "enum": ["webSearch"], - "title": "WebSearchThreadItemType" - } + "id": { "type": "string" }, + "query": { "type": "string" }, + "type": { "type": "string", "enum": ["webSearch"], "title": "WebSearchThreadItemType" } }, "title": "WebSearchThreadItem" }, @@ -900,17 +610,9 @@ "type": "object", "required": ["id", "path", "type"], "properties": { - "id": { - "type": "string" - }, - "path": { - "$ref": "#/definitions/AbsolutePathBuf" - }, - "type": { - "type": "string", - "enum": ["imageView"], - "title": "ImageViewThreadItemType" - } + "id": { "type": "string" }, + "path": { "$ref": "#/definitions/AbsolutePathBuf" }, + "type": { "type": "string", "enum": ["imageView"], "title": "ImageViewThreadItemType" } }, "title": "ImageViewThreadItem" }, @@ -918,28 +620,13 @@ "type": "object", "required": ["id", "result", "status", "type"], "properties": { - "id": { - "type": "string" - }, - "result": { - "type": "string" - }, - "revisedPrompt": { - "type": ["string", "null"] - }, + "id": { "type": "string" }, + "result": { "type": "string" }, + "revisedPrompt": { "type": ["string", "null"] }, "savedPath": { - "anyOf": [ - { - "$ref": "#/definitions/AbsolutePathBuf" - }, - { - "type": "null" - } - ] - }, - "status": { - "type": "string" + "anyOf": [{ "$ref": "#/definitions/AbsolutePathBuf" }, { "type": "null" }] }, + "status": { "type": "string" }, "type": { "type": "string", "enum": ["imageGeneration"], @@ -952,12 +639,8 @@ "type": "object", "required": ["id", "review", "type"], "properties": { - "id": { - "type": "string" - }, - "review": { - "type": "string" - }, + "id": { "type": "string" }, + "review": { "type": "string" }, "type": { "type": "string", "enum": ["enteredReviewMode"], @@ -970,12 +653,8 @@ "type": "object", "required": ["id", "review", "type"], "properties": { - "id": { - "type": "string" - }, - "review": { - "type": "string" - }, + "id": { "type": "string" }, + "review": { "type": "string" }, "type": { "type": "string", "enum": ["exitedReviewMode"], @@ -988,9 +667,7 @@ "type": "object", "required": ["id", "type"], "properties": { - "id": { - "type": "string" - }, + "id": { "type": "string" }, "type": { "type": "string", "enum": ["contextCompaction"], @@ -1017,56 +694,31 @@ }, "error": { "description": "Only populated when the Turn's status is failed.", - "anyOf": [ - { - "$ref": "#/definitions/TurnError" - }, - { - "type": "null" - } - ] - }, - "id": { - "type": "string" + "anyOf": [{ "$ref": "#/definitions/TurnError" }, { "type": "null" }] }, + "id": { "type": "string" }, "items": { "description": "Only populated on a `thread/resume` or `thread/fork` response. For all other responses and notifications returning a Turn, the items field will be an empty list.", "type": "array", - "items": { - "$ref": "#/definitions/ThreadItem" - } + "items": { "$ref": "#/definitions/ThreadItem" } }, "startedAt": { "description": "Unix timestamp (in seconds) when the turn started.", "type": ["integer", "null"], "format": "int64" }, - "status": { - "$ref": "#/definitions/TurnStatus" - } + "status": { "$ref": "#/definitions/TurnStatus" } } }, "TurnError": { "type": "object", "required": ["message"], "properties": { - "additionalDetails": { - "default": null, - "type": ["string", "null"] - }, + "additionalDetails": { "default": null, "type": ["string", "null"] }, "codexErrorInfo": { - "anyOf": [ - { - "$ref": "#/definitions/CodexErrorInfo" - }, - { - "type": "null" - } - ] + "anyOf": [{ "$ref": "#/definitions/CodexErrorInfo" }, { "type": "null" }] }, - "message": { - "type": "string" - } + "message": { "type": "string" } } }, "TurnStatus": { @@ -1079,22 +731,14 @@ "type": "object", "required": ["text", "type"], "properties": { - "text": { - "type": "string" - }, + "text": { "type": "string" }, "text_elements": { "description": "UI-defined spans within `text` used to render or persist special elements.", "default": [], "type": "array", - "items": { - "$ref": "#/definitions/TextElement" - } + "items": { "$ref": "#/definitions/TextElement" } }, - "type": { - "type": "string", - "enum": ["text"], - "title": "TextUserInputType" - } + "type": { "type": "string", "enum": ["text"], "title": "TextUserInputType" } }, "title": "TextUserInput" }, @@ -1102,14 +746,8 @@ "type": "object", "required": ["type", "url"], "properties": { - "type": { - "type": "string", - "enum": ["image"], - "title": "ImageUserInputType" - }, - "url": { - "type": "string" - } + "type": { "type": "string", "enum": ["image"], "title": "ImageUserInputType" }, + "url": { "type": "string" } }, "title": "ImageUserInput" }, @@ -1117,14 +755,8 @@ "type": "object", "required": ["path", "type"], "properties": { - "path": { - "type": "string" - }, - "type": { - "type": "string", - "enum": ["localImage"], - "title": "LocalImageUserInputType" - } + "path": { "type": "string" }, + "type": { "type": "string", "enum": ["localImage"], "title": "LocalImageUserInputType" } }, "title": "LocalImageUserInput" }, @@ -1132,17 +764,9 @@ "type": "object", "required": ["name", "path", "type"], "properties": { - "name": { - "type": "string" - }, - "path": { - "type": "string" - }, - "type": { - "type": "string", - "enum": ["skill"], - "title": "SkillUserInputType" - } + "name": { "type": "string" }, + "path": { "type": "string" }, + "type": { "type": "string", "enum": ["skill"], "title": "SkillUserInputType" } }, "title": "SkillUserInput" }, @@ -1150,17 +774,9 @@ "type": "object", "required": ["name", "path", "type"], "properties": { - "name": { - "type": "string" - }, - "path": { - "type": "string" - }, - "type": { - "type": "string", - "enum": ["mention"], - "title": "MentionUserInputType" - } + "name": { "type": "string" }, + "path": { "type": "string" }, + "type": { "type": "string", "enum": ["mention"], "title": "MentionUserInputType" } }, "title": "MentionUserInput" } @@ -1172,20 +788,9 @@ "type": "object", "required": ["type"], "properties": { - "queries": { - "type": ["array", "null"], - "items": { - "type": "string" - } - }, - "query": { - "type": ["string", "null"] - }, - "type": { - "type": "string", - "enum": ["search"], - "title": "SearchWebSearchActionType" - } + "queries": { "type": ["array", "null"], "items": { "type": "string" } }, + "query": { "type": ["string", "null"] }, + "type": { "type": "string", "enum": ["search"], "title": "SearchWebSearchActionType" } }, "title": "SearchWebSearchAction" }, @@ -1198,9 +803,7 @@ "enum": ["openPage"], "title": "OpenPageWebSearchActionType" }, - "url": { - "type": ["string", "null"] - } + "url": { "type": ["string", "null"] } }, "title": "OpenPageWebSearchAction" }, @@ -1208,17 +811,13 @@ "type": "object", "required": ["type"], "properties": { - "pattern": { - "type": ["string", "null"] - }, + "pattern": { "type": ["string", "null"] }, "type": { "type": "string", "enum": ["findInPage"], "title": "FindInPageWebSearchActionType" }, - "url": { - "type": ["string", "null"] - } + "url": { "type": ["string", "null"] } }, "title": "FindInPageWebSearchAction" }, @@ -1226,11 +825,7 @@ "type": "object", "required": ["type"], "properties": { - "type": { - "type": "string", - "enum": ["other"], - "title": "OtherWebSearchActionType" - } + "type": { "type": "string", "enum": ["other"], "title": "OtherWebSearchActionType" } }, "title": "OtherWebSearchAction" } diff --git a/extensions/codex/src/app-server/run-attempt.ts b/extensions/codex/src/app-server/run-attempt.ts index b8c5f1b611d..8f5c56af6bd 100644 --- a/extensions/codex/src/app-server/run-attempt.ts +++ b/extensions/codex/src/app-server/run-attempt.ts @@ -1466,7 +1466,7 @@ type DynamicToolBuildParams = { sandboxSessionKey: string; sandbox: Awaited>; runAbortController: AbortController; - sessionAgentId: string | undefined; + sessionAgentId: string; pluginConfig: CodexPluginConfig; onYieldDetected: () => void; }; diff --git a/scripts/check-codex-app-server-protocol.ts b/scripts/check-codex-app-server-protocol.ts index 4a3f2a6ef6a..1fb6741b1f5 100644 --- a/scripts/check-codex-app-server-protocol.ts +++ b/scripts/check-codex-app-server-protocol.ts @@ -160,12 +160,16 @@ async function compareGeneratedProtocolMirror( failures.push(`protocol-generated/json/${schema}: missing local schema (${String(error)})`); continue; } - if (source !== target) { + if (normalizeJsonSchema(source) !== normalizeJsonSchema(target)) { failures.push(`protocol-generated/json/${schema}: differs from source schema`); } } } +function normalizeJsonSchema(source: string): string { + return JSON.stringify(JSON.parse(source)); +} + async function listFiles(root: string, suffix: string): Promise { const files: string[] = []; async function visit(dir: string): Promise { diff --git a/scripts/generate-bundled-channel-config-metadata.ts b/scripts/generate-bundled-channel-config-metadata.ts index 9ec283cc4d3..867f5fa346a 100644 --- a/scripts/generate-bundled-channel-config-metadata.ts +++ b/scripts/generate-bundled-channel-config-metadata.ts @@ -6,6 +6,7 @@ import { loadChannelConfigSurfaceModule } from "./load-channel-config-surface.ts const GENERATED_BY = "scripts/generate-bundled-channel-config-metadata.ts"; const DEFAULT_OUTPUT_PATH = "src/config/bundled-channel-config-metadata.generated.ts"; +const GENERATED_JSON_CHUNK_SIZE = 16 * 1024; type BundledPluginSource = { dirName: string; @@ -141,6 +142,15 @@ function formatTypeScriptModule(source: string, outputPath: string, repoRoot: st }); } +function formatJsonStringChunks(value: unknown): string { + const json = JSON.stringify(value); + const chunks: string[] = []; + for (let index = 0; index < json.length; index += GENERATED_JSON_CHUNK_SIZE) { + chunks.push(JSON.stringify(json.slice(index, index + GENERATED_JSON_CHUNK_SIZE))); + } + return chunks.join(",\n "); +} + function resolveChannelUnsupportedSecretRefSurfacePatterns( source: BundledPluginSource, channelId: string, @@ -223,10 +233,27 @@ export async function writeBundledChannelConfigMetadataModule(params?: { const repoRoot = path.resolve(params?.repoRoot ?? process.cwd()); const outputPath = params?.outputPath ?? DEFAULT_OUTPUT_PATH; const entries = await collectBundledChannelConfigMetadata({ repoRoot }); + const chunks = formatJsonStringChunks(entries); const next = formatTypeScriptModule( `// Auto-generated by ${GENERATED_BY}. Do not edit directly. -export const GENERATED_BUNDLED_CHANNEL_CONFIG_METADATA = ${JSON.stringify(entries, null, 2)} as const; +type BundledChannelConfigMetadata = { + pluginId: string; + channelId: string; + label?: string; + description?: string; + schema: Record; + uiHints?: Record; + unsupportedSecretRefSurfacePatterns?: readonly string[]; +}; + +const RAW_BUNDLED_CHANNEL_CONFIG_METADATA = [ + ${chunks}, +].join(""); + +export const GENERATED_BUNDLED_CHANNEL_CONFIG_METADATA = JSON.parse( + RAW_BUNDLED_CHANNEL_CONFIG_METADATA, +) as readonly BundledChannelConfigMetadata[]; `, outputPath, repoRoot, diff --git a/scripts/lib/plugin-npm-package-manifest.mjs b/scripts/lib/plugin-npm-package-manifest.mjs index e5094485c93..86365cf8a68 100644 --- a/scripts/lib/plugin-npm-package-manifest.mjs +++ b/scripts/lib/plugin-npm-package-manifest.mjs @@ -102,19 +102,7 @@ export function readGeneratedBundledChannelConfigs(repoRoot) { return new Map(); } const source = fs.readFileSync(metadataPath, "utf8"); - const match = source.match( - /export const GENERATED_BUNDLED_CHANNEL_CONFIG_METADATA = ([\s\S]*?) as const;/u, - ); - if (!match?.[1]) { - return new Map(); - } - - let entries; - try { - entries = JSON5.parse(match[1]); - } catch { - return new Map(); - } + const entries = readGeneratedBundledChannelConfigEntries(source); if (!Array.isArray(entries)) { return new Map(); } @@ -145,6 +133,35 @@ export function readGeneratedBundledChannelConfigs(repoRoot) { return byPlugin; } +function readGeneratedBundledChannelConfigEntries(source) { + const legacyMatch = source.match( + /export const GENERATED_BUNDLED_CHANNEL_CONFIG_METADATA = ([\s\S]*?) as const;/u, + ); + if (legacyMatch?.[1]) { + try { + return JSON5.parse(legacyMatch[1]); + } catch { + return undefined; + } + } + + const compactMatch = source.match( + /const RAW_BUNDLED_CHANNEL_CONFIG_METADATA = \[([\s\S]*?)\]\.join\(""\);/u, + ); + if (!compactMatch?.[1]) { + return undefined; + } + try { + const chunks = JSON5.parse(`[${compactMatch[1]}]`); + if (!Array.isArray(chunks) || chunks.some((chunk) => typeof chunk !== "string")) { + return undefined; + } + return JSON.parse(chunks.join("")); + } catch { + return undefined; + } +} + export function mergeGeneratedChannelConfigs(manifest, generatedChannelConfigs) { if (!generatedChannelConfigs || Object.keys(generatedChannelConfigs).length === 0) { return manifest; diff --git a/scripts/sync-codex-app-server-protocol.ts b/scripts/sync-codex-app-server-protocol.ts index 4e63e4a0a2c..254b451b14d 100644 --- a/scripts/sync-codex-app-server-protocol.ts +++ b/scripts/sync-codex-app-server-protocol.ts @@ -20,7 +20,11 @@ try { for (const schema of selectedCodexAppServerJsonSchemas) { await fs.mkdir(path.dirname(path.join(targetRoot, "json", schema)), { recursive: true }); - await fs.copyFile(path.join(source.jsonRoot, schema), path.join(targetRoot, "json", schema)); + const schemaSource = await fs.readFile(path.join(source.jsonRoot, schema), "utf8"); + await fs.writeFile( + path.join(targetRoot, "json", schema), + `${JSON.stringify(JSON.parse(schemaSource))}\n`, + ); } } finally { await source.cleanup(); diff --git a/src/config/bundled-channel-config-metadata.generated.ts b/src/config/bundled-channel-config-metadata.generated.ts index e4afbad8ab0..340a349a949 100644 --- a/src/config/bundled-channel-config-metadata.generated.ts +++ b/src/config/bundled-channel-config-metadata.generated.ts @@ -1,18174 +1,33 @@ // Auto-generated by scripts/generate-bundled-channel-config-metadata.ts. Do not edit directly. -export const GENERATED_BUNDLED_CHANNEL_CONFIG_METADATA = [ - { - pluginId: "bluebubbles", - channelId: "bluebubbles", - label: "BlueBubbles", - description: "iMessage via the BlueBubbles mac app + REST API.", - schema: { - $schema: "http://json-schema.org/draft-07/schema#", - type: "object", - properties: { - name: { - type: "string", - }, - enabled: { - type: "boolean", - }, - markdown: { - type: "object", - properties: { - tables: { - type: "string", - enum: ["off", "bullets", "code", "block"], - }, - }, - additionalProperties: false, - }, - actions: { - type: "object", - properties: { - reactions: { - default: true, - type: "boolean", - }, - edit: { - default: true, - type: "boolean", - }, - unsend: { - default: true, - type: "boolean", - }, - reply: { - default: true, - type: "boolean", - }, - sendWithEffect: { - default: true, - type: "boolean", - }, - renameGroup: { - default: true, - type: "boolean", - }, - setGroupIcon: { - default: true, - type: "boolean", - }, - addParticipant: { - default: true, - type: "boolean", - }, - removeParticipant: { - default: true, - type: "boolean", - }, - leaveGroup: { - default: true, - type: "boolean", - }, - sendAttachment: { - default: true, - type: "boolean", - }, - }, - required: [ - "reactions", - "edit", - "unsend", - "reply", - "sendWithEffect", - "renameGroup", - "setGroupIcon", - "addParticipant", - "removeParticipant", - "leaveGroup", - "sendAttachment", - ], - additionalProperties: false, - }, - serverUrl: { - type: "string", - }, - password: { - anyOf: [ - { - type: "string", - }, - { - oneOf: [ - { - type: "object", - properties: { - source: { - type: "string", - const: "env", - }, - provider: { - type: "string", - pattern: "^[a-z][a-z0-9_-]{0,63}$", - }, - id: { - type: "string", - pattern: "^[A-Z][A-Z0-9_]{0,127}$", - }, - }, - required: ["source", "provider", "id"], - additionalProperties: false, - }, - { - type: "object", - properties: { - source: { - type: "string", - const: "file", - }, - provider: { - type: "string", - pattern: "^[a-z][a-z0-9_-]{0,63}$", - }, - id: { - type: "string", - }, - }, - required: ["source", "provider", "id"], - additionalProperties: false, - }, - { - type: "object", - properties: { - source: { - type: "string", - const: "exec", - }, - provider: { - type: "string", - pattern: "^[a-z][a-z0-9_-]{0,63}$", - }, - id: { - type: "string", - }, - }, - required: ["source", "provider", "id"], - additionalProperties: false, - }, - ], - }, - ], - }, - webhookPath: { - type: "string", - }, - dmPolicy: { - type: "string", - enum: ["pairing", "allowlist", "open", "disabled"], - }, - allowFrom: { - type: "array", - items: { - anyOf: [ - { - type: "string", - }, - { - type: "number", - }, - ], - }, - }, - groupAllowFrom: { - type: "array", - items: { - anyOf: [ - { - type: "string", - }, - { - type: "number", - }, - ], - }, - }, - groupPolicy: { - type: "string", - enum: ["open", "disabled", "allowlist"], - }, - enrichGroupParticipantsFromContacts: { - default: true, - type: "boolean", - }, - historyLimit: { - type: "integer", - minimum: 0, - maximum: 9007199254740991, - }, - dmHistoryLimit: { - type: "integer", - minimum: 0, - maximum: 9007199254740991, - }, - textChunkLimit: { - type: "integer", - exclusiveMinimum: 0, - maximum: 9007199254740991, - }, - sendTimeoutMs: { - type: "integer", - exclusiveMinimum: 0, - maximum: 9007199254740991, - }, - chunkMode: { - type: "string", - enum: ["length", "newline"], - }, - mediaMaxMb: { - type: "integer", - exclusiveMinimum: 0, - maximum: 9007199254740991, - }, - mediaLocalRoots: { - type: "array", - items: { - type: "string", - }, - }, - sendReadReceipts: { - type: "boolean", - }, - network: { - type: "object", - properties: { - dangerouslyAllowPrivateNetwork: { - type: "boolean", - }, - }, - additionalProperties: false, - }, - catchup: { - type: "object", - properties: { - enabled: { - type: "boolean", - }, - maxAgeMinutes: { - type: "integer", - exclusiveMinimum: 0, - maximum: 9007199254740991, - }, - perRunLimit: { - type: "integer", - exclusiveMinimum: 0, - maximum: 9007199254740991, - }, - firstRunLookbackMinutes: { - type: "integer", - exclusiveMinimum: 0, - maximum: 9007199254740991, - }, - maxFailureRetries: { - type: "integer", - exclusiveMinimum: 0, - maximum: 9007199254740991, - }, - }, - additionalProperties: false, - }, - blockStreaming: { - type: "boolean", - }, - replyContextApiFallback: { - type: "boolean", - }, - groups: { - type: "object", - properties: {}, - additionalProperties: { - type: "object", - properties: { - requireMention: { - type: "boolean", - }, - tools: { - type: "object", - properties: { - allow: { - type: "array", - items: { - type: "string", - }, - }, - alsoAllow: { - type: "array", - items: { - type: "string", - }, - }, - deny: { - type: "array", - items: { - type: "string", - }, - }, - }, - additionalProperties: false, - }, - systemPrompt: { - type: "string", - }, - }, - additionalProperties: false, - }, - }, - coalesceSameSenderDms: { - type: "boolean", - }, - accounts: { - type: "object", - properties: {}, - additionalProperties: { - type: "object", - properties: { - name: { - type: "string", - }, - enabled: { - type: "boolean", - }, - markdown: { - type: "object", - properties: { - tables: { - type: "string", - enum: ["off", "bullets", "code", "block"], - }, - }, - additionalProperties: false, - }, - actions: { - type: "object", - properties: { - reactions: { - default: true, - type: "boolean", - }, - edit: { - default: true, - type: "boolean", - }, - unsend: { - default: true, - type: "boolean", - }, - reply: { - default: true, - type: "boolean", - }, - sendWithEffect: { - default: true, - type: "boolean", - }, - renameGroup: { - default: true, - type: "boolean", - }, - setGroupIcon: { - default: true, - type: "boolean", - }, - addParticipant: { - default: true, - type: "boolean", - }, - removeParticipant: { - default: true, - type: "boolean", - }, - leaveGroup: { - default: true, - type: "boolean", - }, - sendAttachment: { - default: true, - type: "boolean", - }, - }, - required: [ - "reactions", - "edit", - "unsend", - "reply", - "sendWithEffect", - "renameGroup", - "setGroupIcon", - "addParticipant", - "removeParticipant", - "leaveGroup", - "sendAttachment", - ], - additionalProperties: false, - }, - serverUrl: { - type: "string", - }, - password: { - anyOf: [ - { - type: "string", - }, - { - oneOf: [ - { - type: "object", - properties: { - source: { - type: "string", - const: "env", - }, - provider: { - type: "string", - pattern: "^[a-z][a-z0-9_-]{0,63}$", - }, - id: { - type: "string", - pattern: "^[A-Z][A-Z0-9_]{0,127}$", - }, - }, - required: ["source", "provider", "id"], - additionalProperties: false, - }, - { - type: "object", - properties: { - source: { - type: "string", - const: "file", - }, - provider: { - type: "string", - pattern: "^[a-z][a-z0-9_-]{0,63}$", - }, - id: { - type: "string", - }, - }, - required: ["source", "provider", "id"], - additionalProperties: false, - }, - { - type: "object", - properties: { - source: { - type: "string", - const: "exec", - }, - provider: { - type: "string", - pattern: "^[a-z][a-z0-9_-]{0,63}$", - }, - id: { - type: "string", - }, - }, - required: ["source", "provider", "id"], - additionalProperties: false, - }, - ], - }, - ], - }, - webhookPath: { - type: "string", - }, - dmPolicy: { - type: "string", - enum: ["pairing", "allowlist", "open", "disabled"], - }, - allowFrom: { - type: "array", - items: { - anyOf: [ - { - type: "string", - }, - { - type: "number", - }, - ], - }, - }, - groupAllowFrom: { - type: "array", - items: { - anyOf: [ - { - type: "string", - }, - { - type: "number", - }, - ], - }, - }, - groupPolicy: { - type: "string", - enum: ["open", "disabled", "allowlist"], - }, - enrichGroupParticipantsFromContacts: { - default: true, - type: "boolean", - }, - historyLimit: { - type: "integer", - minimum: 0, - maximum: 9007199254740991, - }, - dmHistoryLimit: { - type: "integer", - minimum: 0, - maximum: 9007199254740991, - }, - textChunkLimit: { - type: "integer", - exclusiveMinimum: 0, - maximum: 9007199254740991, - }, - sendTimeoutMs: { - type: "integer", - exclusiveMinimum: 0, - maximum: 9007199254740991, - }, - chunkMode: { - type: "string", - enum: ["length", "newline"], - }, - mediaMaxMb: { - type: "integer", - exclusiveMinimum: 0, - maximum: 9007199254740991, - }, - mediaLocalRoots: { - type: "array", - items: { - type: "string", - }, - }, - sendReadReceipts: { - type: "boolean", - }, - network: { - type: "object", - properties: { - dangerouslyAllowPrivateNetwork: { - type: "boolean", - }, - }, - additionalProperties: false, - }, - catchup: { - type: "object", - properties: { - enabled: { - type: "boolean", - }, - maxAgeMinutes: { - type: "integer", - exclusiveMinimum: 0, - maximum: 9007199254740991, - }, - perRunLimit: { - type: "integer", - exclusiveMinimum: 0, - maximum: 9007199254740991, - }, - firstRunLookbackMinutes: { - type: "integer", - exclusiveMinimum: 0, - maximum: 9007199254740991, - }, - maxFailureRetries: { - type: "integer", - exclusiveMinimum: 0, - maximum: 9007199254740991, - }, - }, - additionalProperties: false, - }, - blockStreaming: { - type: "boolean", - }, - replyContextApiFallback: { - type: "boolean", - }, - groups: { - type: "object", - properties: {}, - additionalProperties: { - type: "object", - properties: { - requireMention: { - type: "boolean", - }, - tools: { - type: "object", - properties: { - allow: { - type: "array", - items: { - type: "string", - }, - }, - alsoAllow: { - type: "array", - items: { - type: "string", - }, - }, - deny: { - type: "array", - items: { - type: "string", - }, - }, - }, - additionalProperties: false, - }, - systemPrompt: { - type: "string", - }, - }, - additionalProperties: false, - }, - }, - coalesceSameSenderDms: { - type: "boolean", - }, - }, - required: ["enrichGroupParticipantsFromContacts"], - additionalProperties: false, - }, - }, - defaultAccount: { - type: "string", - }, - }, - required: ["enrichGroupParticipantsFromContacts"], - additionalProperties: false, - }, - uiHints: { - "": { - label: "BlueBubbles", - help: "BlueBubbles channel provider configuration used for Apple messaging bridge integrations. Keep DM policy aligned with your trusted sender model in shared deployments.", - }, - dmPolicy: { - label: "BlueBubbles DM Policy", - help: 'Direct message access control ("pairing" recommended). "open" requires channels.bluebubbles.allowFrom=["*"].', - }, - }, - }, - { - pluginId: "discord", - channelId: "discord", - label: "Discord", - description: "very well supported right now.", - schema: { - $schema: "http://json-schema.org/draft-07/schema#", - type: "object", - properties: { - name: { - type: "string", - }, - capabilities: { - type: "array", - items: { - type: "string", - }, - }, - markdown: { - type: "object", - properties: { - tables: { - type: "string", - enum: ["off", "bullets", "code", "block"], - }, - }, - additionalProperties: false, - }, - enabled: { - type: "boolean", - }, - commands: { - type: "object", - properties: { - native: { - anyOf: [ - { - type: "boolean", - }, - { - type: "string", - const: "auto", - }, - ], - }, - nativeSkills: { - anyOf: [ - { - type: "boolean", - }, - { - type: "string", - const: "auto", - }, - ], - }, - }, - additionalProperties: false, - }, - configWrites: { - type: "boolean", - }, - token: { - anyOf: [ - { - type: "string", - }, - { - oneOf: [ - { - type: "object", - properties: { - source: { - type: "string", - const: "env", - }, - provider: { - type: "string", - pattern: "^[a-z][a-z0-9_-]{0,63}$", - }, - id: { - type: "string", - pattern: "^[A-Z][A-Z0-9_]{0,127}$", - }, - }, - required: ["source", "provider", "id"], - additionalProperties: false, - }, - { - type: "object", - properties: { - source: { - type: "string", - const: "file", - }, - provider: { - type: "string", - pattern: "^[a-z][a-z0-9_-]{0,63}$", - }, - id: { - type: "string", - }, - }, - required: ["source", "provider", "id"], - additionalProperties: false, - }, - { - type: "object", - properties: { - source: { - type: "string", - const: "exec", - }, - provider: { - type: "string", - pattern: "^[a-z][a-z0-9_-]{0,63}$", - }, - id: { - type: "string", - }, - }, - required: ["source", "provider", "id"], - additionalProperties: false, - }, - ], - }, - ], - }, - applicationId: { - type: "string", - }, - proxy: { - type: "string", - }, - gatewayInfoTimeoutMs: { - type: "integer", - exclusiveMinimum: 0, - maximum: 120000, - }, - gatewayReadyTimeoutMs: { - type: "integer", - exclusiveMinimum: 0, - maximum: 120000, - }, - gatewayRuntimeReadyTimeoutMs: { - type: "integer", - exclusiveMinimum: 0, - maximum: 120000, - }, - allowBots: { - anyOf: [ - { - type: "boolean", - }, - { - type: "string", - const: "mentions", - }, - ], - }, - dangerouslyAllowNameMatching: { - type: "boolean", - }, - mentionAliases: { - type: "object", - propertyNames: { - type: "string", - }, - additionalProperties: { - type: "string", - pattern: "^\\d+$", - }, - }, - groupPolicy: { - default: "allowlist", - type: "string", - enum: ["open", "disabled", "allowlist"], - }, - contextVisibility: { - type: "string", - enum: ["all", "allowlist", "allowlist_quote"], - }, - historyLimit: { - type: "integer", - minimum: 0, - maximum: 9007199254740991, - }, - dmHistoryLimit: { - type: "integer", - minimum: 0, - maximum: 9007199254740991, - }, - dms: { - type: "object", - propertyNames: { - type: "string", - }, - additionalProperties: { - type: "object", - properties: { - historyLimit: { - type: "integer", - minimum: 0, - maximum: 9007199254740991, - }, - }, - additionalProperties: false, - }, - }, - textChunkLimit: { - type: "integer", - exclusiveMinimum: 0, - maximum: 9007199254740991, - }, - streaming: { - type: "object", - properties: { - mode: { - type: "string", - enum: ["off", "partial", "block", "progress"], - }, - chunkMode: { - type: "string", - enum: ["length", "newline"], - }, - preview: { - type: "object", - properties: { - chunk: { - type: "object", - properties: { - minChars: { - type: "integer", - exclusiveMinimum: 0, - maximum: 9007199254740991, - }, - maxChars: { - type: "integer", - exclusiveMinimum: 0, - maximum: 9007199254740991, - }, - breakPreference: { - anyOf: [ - { - type: "string", - const: "paragraph", - }, - { - type: "string", - const: "newline", - }, - { - type: "string", - const: "sentence", - }, - ], - }, - }, - additionalProperties: false, - }, - toolProgress: { - type: "boolean", - }, - commandText: { - type: "string", - enum: ["raw", "status"], - }, - }, - additionalProperties: false, - }, - progress: { - type: "object", - properties: { - label: { - anyOf: [ - { - type: "string", - }, - { - type: "boolean", - const: false, - }, - ], - }, - labels: { - type: "array", - items: { - type: "string", - }, - }, - maxLines: { - type: "integer", - exclusiveMinimum: 0, - maximum: 9007199254740991, - }, - render: { - type: "string", - enum: ["text", "rich"], - }, - toolProgress: { - type: "boolean", - }, - commandText: { - type: "string", - enum: ["raw", "status"], - }, - }, - additionalProperties: false, - }, - block: { - type: "object", - properties: { - enabled: { - type: "boolean", - }, - coalesce: { - type: "object", - properties: { - minChars: { - type: "integer", - exclusiveMinimum: 0, - maximum: 9007199254740991, - }, - maxChars: { - type: "integer", - exclusiveMinimum: 0, - maximum: 9007199254740991, - }, - idleMs: { - type: "integer", - minimum: 0, - maximum: 9007199254740991, - }, - }, - additionalProperties: false, - }, - }, - additionalProperties: false, - }, - }, - additionalProperties: false, - }, - maxLinesPerMessage: { - type: "integer", - exclusiveMinimum: 0, - maximum: 9007199254740991, - }, - mediaMaxMb: { - type: "number", - exclusiveMinimum: 0, - }, - retry: { - type: "object", - properties: { - attempts: { - type: "integer", - minimum: 1, - maximum: 9007199254740991, - }, - minDelayMs: { - type: "integer", - minimum: 0, - maximum: 9007199254740991, - }, - maxDelayMs: { - type: "integer", - minimum: 0, - maximum: 9007199254740991, - }, - jitter: { - type: "number", - minimum: 0, - maximum: 1, - }, - }, - additionalProperties: false, - }, - actions: { - type: "object", - properties: { - reactions: { - type: "boolean", - }, - stickers: { - type: "boolean", - }, - emojiUploads: { - type: "boolean", - }, - stickerUploads: { - type: "boolean", - }, - polls: { - type: "boolean", - }, - permissions: { - type: "boolean", - }, - messages: { - type: "boolean", - }, - threads: { - type: "boolean", - }, - pins: { - type: "boolean", - }, - search: { - type: "boolean", - }, - memberInfo: { - type: "boolean", - }, - roleInfo: { - type: "boolean", - }, - roles: { - type: "boolean", - }, - channelInfo: { - type: "boolean", - }, - voiceStatus: { - type: "boolean", - }, - events: { - type: "boolean", - }, - moderation: { - type: "boolean", - }, - channels: { - type: "boolean", - }, - presence: { - type: "boolean", - }, - }, - additionalProperties: false, - }, - replyToMode: { - anyOf: [ - { - type: "string", - const: "off", - }, - { - type: "string", - const: "first", - }, - { - type: "string", - const: "all", - }, - { - type: "string", - const: "batched", - }, - ], - }, - thread: { - type: "object", - properties: { - inheritParent: { - type: "boolean", - }, - }, - additionalProperties: false, - }, - dmPolicy: { - type: "string", - enum: ["pairing", "allowlist", "open", "disabled"], - }, - allowFrom: { - type: "array", - items: { - type: "string", - }, - }, - defaultTo: { - type: "string", - }, - dm: { - type: "object", - properties: { - enabled: { - type: "boolean", - }, - policy: { - type: "string", - enum: ["pairing", "allowlist", "open", "disabled"], - }, - allowFrom: { - type: "array", - items: { - type: "string", - }, - }, - groupEnabled: { - type: "boolean", - }, - groupChannels: { - type: "array", - items: { - type: "string", - }, - }, - }, - additionalProperties: false, - }, - guilds: { - type: "object", - propertyNames: { - type: "string", - }, - additionalProperties: { - type: "object", - properties: { - slug: { - type: "string", - }, - requireMention: { - type: "boolean", - }, - ignoreOtherMentions: { - type: "boolean", - }, - tools: { - type: "object", - properties: { - allow: { - type: "array", - items: { - type: "string", - }, - }, - alsoAllow: { - type: "array", - items: { - type: "string", - }, - }, - deny: { - type: "array", - items: { - type: "string", - }, - }, - }, - additionalProperties: false, - }, - toolsBySender: { - type: "object", - propertyNames: { - type: "string", - }, - additionalProperties: { - type: "object", - properties: { - allow: { - type: "array", - items: { - type: "string", - }, - }, - alsoAllow: { - type: "array", - items: { - type: "string", - }, - }, - deny: { - type: "array", - items: { - type: "string", - }, - }, - }, - additionalProperties: false, - }, - }, - reactionNotifications: { - type: "string", - enum: ["off", "own", "all", "allowlist"], - }, - users: { - type: "array", - items: { - type: "string", - }, - }, - roles: { - type: "array", - items: { - type: "string", - }, - }, - channels: { - type: "object", - propertyNames: { - type: "string", - }, - additionalProperties: { - type: "object", - properties: { - requireMention: { - type: "boolean", - }, - ignoreOtherMentions: { - type: "boolean", - }, - tools: { - type: "object", - properties: { - allow: { - type: "array", - items: { - type: "string", - }, - }, - alsoAllow: { - type: "array", - items: { - type: "string", - }, - }, - deny: { - type: "array", - items: { - type: "string", - }, - }, - }, - additionalProperties: false, - }, - toolsBySender: { - type: "object", - propertyNames: { - type: "string", - }, - additionalProperties: { - type: "object", - properties: { - allow: { - type: "array", - items: { - type: "string", - }, - }, - alsoAllow: { - type: "array", - items: { - type: "string", - }, - }, - deny: { - type: "array", - items: { - type: "string", - }, - }, - }, - additionalProperties: false, - }, - }, - skills: { - type: "array", - items: { - type: "string", - }, - }, - enabled: { - type: "boolean", - }, - users: { - type: "array", - items: { - type: "string", - }, - }, - roles: { - type: "array", - items: { - type: "string", - }, - }, - systemPrompt: { - type: "string", - }, - includeThreadStarter: { - type: "boolean", - }, - autoThread: { - type: "boolean", - }, - autoThreadName: { - type: "string", - enum: ["message", "generated"], - }, - autoArchiveDuration: { - anyOf: [ - { - type: "string", - enum: ["60", "1440", "4320", "10080"], - }, - { - type: "number", - const: 60, - }, - { - type: "number", - const: 1440, - }, - { - type: "number", - const: 4320, - }, - { - type: "number", - const: 10080, - }, - ], - }, - }, - additionalProperties: false, - }, - }, - }, - additionalProperties: false, - }, - }, - heartbeat: { - type: "object", - properties: { - showOk: { - type: "boolean", - }, - showAlerts: { - type: "boolean", - }, - useIndicator: { - type: "boolean", - }, - }, - additionalProperties: false, - }, - healthMonitor: { - type: "object", - properties: { - enabled: { - type: "boolean", - }, - }, - additionalProperties: false, - }, - execApprovals: { - type: "object", - properties: { - enabled: { - type: "boolean", - }, - approvers: { - type: "array", - items: { - type: "string", - }, - }, - agentFilter: { - type: "array", - items: { - type: "string", - }, - }, - sessionFilter: { - type: "array", - items: { - type: "string", - }, - }, - cleanupAfterResolve: { - type: "boolean", - }, - target: { - type: "string", - enum: ["dm", "channel", "both"], - }, - }, - additionalProperties: false, - }, - agentComponents: { - type: "object", - properties: { - enabled: { - type: "boolean", - }, - }, - additionalProperties: false, - }, - ui: { - type: "object", - properties: { - components: { - type: "object", - properties: { - accentColor: { - type: "string", - pattern: "^#?[0-9a-fA-F]{6}$", - }, - }, - additionalProperties: false, - }, - }, - additionalProperties: false, - }, - slashCommand: { - type: "object", - properties: { - ephemeral: { - type: "boolean", - }, - }, - additionalProperties: false, - }, - threadBindings: { - type: "object", - properties: { - enabled: { - type: "boolean", - }, - idleHours: { - type: "number", - minimum: 0, - }, - maxAgeHours: { - type: "number", - minimum: 0, - }, - spawnSessions: { - type: "boolean", - }, - defaultSpawnContext: { - type: "string", - enum: ["isolated", "fork"], - }, - spawnSubagentSessions: { - type: "boolean", - }, - spawnAcpSessions: { - type: "boolean", - }, - }, - additionalProperties: false, - }, - intents: { - type: "object", - properties: { - presence: { - type: "boolean", - }, - guildMembers: { - type: "boolean", - }, - voiceStates: { - type: "boolean", - }, - }, - additionalProperties: false, - }, - voice: { - type: "object", - properties: { - enabled: { - type: "boolean", - }, - model: { - type: "string", - minLength: 1, - }, - autoJoin: { - type: "array", - items: { - type: "object", - properties: { - guildId: { - type: "string", - minLength: 1, - }, - channelId: { - type: "string", - minLength: 1, - }, - }, - required: ["guildId", "channelId"], - additionalProperties: false, - }, - }, - daveEncryption: { - type: "boolean", - }, - decryptionFailureTolerance: { - type: "integer", - minimum: 0, - maximum: 9007199254740991, - }, - connectTimeoutMs: { - type: "integer", - exclusiveMinimum: 0, - maximum: 120000, - }, - reconnectGraceMs: { - type: "integer", - exclusiveMinimum: 0, - maximum: 120000, - }, - tts: { - type: "object", - properties: { - auto: { - type: "string", - enum: ["off", "always", "inbound", "tagged"], - }, - enabled: { - type: "boolean", - }, - mode: { - type: "string", - enum: ["final", "all"], - }, - provider: { - type: "string", - minLength: 1, - }, - persona: { - type: "string", - }, - personas: { - type: "object", - propertyNames: { - type: "string", - }, - additionalProperties: { - type: "object", - properties: { - label: { - type: "string", - }, - description: { - type: "string", - }, - provider: { - type: "string", - minLength: 1, - }, - fallbackPolicy: { - anyOf: [ - { - type: "string", - const: "preserve-persona", - }, - { - type: "string", - const: "provider-defaults", - }, - { - type: "string", - const: "fail", - }, - ], - }, - prompt: { - type: "object", - properties: { - profile: { - type: "string", - }, - scene: { - type: "string", - }, - sampleContext: { - type: "string", - }, - style: { - type: "string", - }, - accent: { - type: "string", - }, - pacing: { - type: "string", - }, - constraints: { - type: "array", - items: { - type: "string", - }, - }, - }, - additionalProperties: false, - }, - providers: { - type: "object", - propertyNames: { - type: "string", - }, - additionalProperties: { - type: "object", - properties: { - apiKey: { - anyOf: [ - { - type: "string", - }, - { - oneOf: [ - { - type: "object", - properties: { - source: { - type: "string", - const: "env", - }, - provider: { - type: "string", - pattern: "^[a-z][a-z0-9_-]{0,63}$", - }, - id: { - type: "string", - pattern: "^[A-Z][A-Z0-9_]{0,127}$", - }, - }, - required: ["source", "provider", "id"], - additionalProperties: false, - }, - { - type: "object", - properties: { - source: { - type: "string", - const: "file", - }, - provider: { - type: "string", - pattern: "^[a-z][a-z0-9_-]{0,63}$", - }, - id: { - type: "string", - }, - }, - required: ["source", "provider", "id"], - additionalProperties: false, - }, - { - type: "object", - properties: { - source: { - type: "string", - const: "exec", - }, - provider: { - type: "string", - pattern: "^[a-z][a-z0-9_-]{0,63}$", - }, - id: { - type: "string", - }, - }, - required: ["source", "provider", "id"], - additionalProperties: false, - }, - ], - }, - ], - }, - }, - additionalProperties: { - anyOf: [ - { - type: "string", - }, - { - type: "number", - }, - { - type: "boolean", - }, - { - type: "null", - }, - { - type: "array", - items: {}, - }, - { - type: "object", - propertyNames: { - type: "string", - }, - additionalProperties: {}, - }, - ], - }, - }, - }, - }, - additionalProperties: false, - }, - }, - summaryModel: { - type: "string", - }, - modelOverrides: { - type: "object", - properties: { - enabled: { - type: "boolean", - }, - allowText: { - type: "boolean", - }, - allowProvider: { - type: "boolean", - }, - allowVoice: { - type: "boolean", - }, - allowModelId: { - type: "boolean", - }, - allowVoiceSettings: { - type: "boolean", - }, - allowNormalization: { - type: "boolean", - }, - allowSeed: { - type: "boolean", - }, - }, - additionalProperties: false, - }, - providers: { - type: "object", - propertyNames: { - type: "string", - }, - additionalProperties: { - type: "object", - properties: { - apiKey: { - anyOf: [ - { - type: "string", - }, - { - oneOf: [ - { - type: "object", - properties: { - source: { - type: "string", - const: "env", - }, - provider: { - type: "string", - pattern: "^[a-z][a-z0-9_-]{0,63}$", - }, - id: { - type: "string", - pattern: "^[A-Z][A-Z0-9_]{0,127}$", - }, - }, - required: ["source", "provider", "id"], - additionalProperties: false, - }, - { - type: "object", - properties: { - source: { - type: "string", - const: "file", - }, - provider: { - type: "string", - pattern: "^[a-z][a-z0-9_-]{0,63}$", - }, - id: { - type: "string", - }, - }, - required: ["source", "provider", "id"], - additionalProperties: false, - }, - { - type: "object", - properties: { - source: { - type: "string", - const: "exec", - }, - provider: { - type: "string", - pattern: "^[a-z][a-z0-9_-]{0,63}$", - }, - id: { - type: "string", - }, - }, - required: ["source", "provider", "id"], - additionalProperties: false, - }, - ], - }, - ], - }, - }, - additionalProperties: { - anyOf: [ - { - type: "string", - }, - { - type: "number", - }, - { - type: "boolean", - }, - { - type: "null", - }, - { - type: "array", - items: {}, - }, - { - type: "object", - propertyNames: { - type: "string", - }, - additionalProperties: {}, - }, - ], - }, - }, - }, - prefsPath: { - type: "string", - }, - maxTextLength: { - type: "integer", - minimum: 1, - maximum: 9007199254740991, - }, - timeoutMs: { - type: "integer", - minimum: 1000, - maximum: 120000, - }, - }, - additionalProperties: false, - }, - }, - additionalProperties: false, - }, - pluralkit: { - type: "object", - properties: { - enabled: { - type: "boolean", - }, - token: { - anyOf: [ - { - type: "string", - }, - { - oneOf: [ - { - type: "object", - properties: { - source: { - type: "string", - const: "env", - }, - provider: { - type: "string", - pattern: "^[a-z][a-z0-9_-]{0,63}$", - }, - id: { - type: "string", - pattern: "^[A-Z][A-Z0-9_]{0,127}$", - }, - }, - required: ["source", "provider", "id"], - additionalProperties: false, - }, - { - type: "object", - properties: { - source: { - type: "string", - const: "file", - }, - provider: { - type: "string", - pattern: "^[a-z][a-z0-9_-]{0,63}$", - }, - id: { - type: "string", - }, - }, - required: ["source", "provider", "id"], - additionalProperties: false, - }, - { - type: "object", - properties: { - source: { - type: "string", - const: "exec", - }, - provider: { - type: "string", - pattern: "^[a-z][a-z0-9_-]{0,63}$", - }, - id: { - type: "string", - }, - }, - required: ["source", "provider", "id"], - additionalProperties: false, - }, - ], - }, - ], - }, - }, - additionalProperties: false, - }, - responsePrefix: { - type: "string", - }, - ackReaction: { - type: "string", - }, - ackReactionScope: { - type: "string", - enum: ["group-mentions", "group-all", "direct", "all", "off", "none"], - }, - activity: { - type: "string", - }, - status: { - type: "string", - enum: ["online", "dnd", "idle", "invisible"], - }, - autoPresence: { - type: "object", - properties: { - enabled: { - type: "boolean", - }, - intervalMs: { - type: "integer", - exclusiveMinimum: 0, - maximum: 9007199254740991, - }, - minUpdateIntervalMs: { - type: "integer", - exclusiveMinimum: 0, - maximum: 9007199254740991, - }, - healthyText: { - type: "string", - }, - degradedText: { - type: "string", - }, - exhaustedText: { - type: "string", - }, - }, - additionalProperties: false, - }, - activityType: { - anyOf: [ - { - type: "number", - const: 0, - }, - { - type: "number", - const: 1, - }, - { - type: "number", - const: 2, - }, - { - type: "number", - const: 3, - }, - { - type: "number", - const: 4, - }, - { - type: "number", - const: 5, - }, - ], - }, - activityUrl: { - type: "string", - format: "uri", - }, - inboundWorker: { - type: "object", - properties: { - runTimeoutMs: { - type: "integer", - minimum: 0, - maximum: 9007199254740991, - }, - }, - additionalProperties: false, - }, - eventQueue: { - type: "object", - properties: { - listenerTimeout: { - type: "integer", - exclusiveMinimum: 0, - maximum: 9007199254740991, - }, - maxQueueSize: { - type: "integer", - exclusiveMinimum: 0, - maximum: 9007199254740991, - }, - maxConcurrency: { - type: "integer", - exclusiveMinimum: 0, - maximum: 9007199254740991, - }, - }, - additionalProperties: false, - }, - accounts: { - type: "object", - propertyNames: { - type: "string", - }, - additionalProperties: { - type: "object", - properties: { - name: { - type: "string", - }, - capabilities: { - type: "array", - items: { - type: "string", - }, - }, - markdown: { - type: "object", - properties: { - tables: { - type: "string", - enum: ["off", "bullets", "code", "block"], - }, - }, - additionalProperties: false, - }, - enabled: { - type: "boolean", - }, - commands: { - type: "object", - properties: { - native: { - anyOf: [ - { - type: "boolean", - }, - { - type: "string", - const: "auto", - }, - ], - }, - nativeSkills: { - anyOf: [ - { - type: "boolean", - }, - { - type: "string", - const: "auto", - }, - ], - }, - }, - additionalProperties: false, - }, - configWrites: { - type: "boolean", - }, - token: { - anyOf: [ - { - type: "string", - }, - { - oneOf: [ - { - type: "object", - properties: { - source: { - type: "string", - const: "env", - }, - provider: { - type: "string", - pattern: "^[a-z][a-z0-9_-]{0,63}$", - }, - id: { - type: "string", - pattern: "^[A-Z][A-Z0-9_]{0,127}$", - }, - }, - required: ["source", "provider", "id"], - additionalProperties: false, - }, - { - type: "object", - properties: { - source: { - type: "string", - const: "file", - }, - provider: { - type: "string", - pattern: "^[a-z][a-z0-9_-]{0,63}$", - }, - id: { - type: "string", - }, - }, - required: ["source", "provider", "id"], - additionalProperties: false, - }, - { - type: "object", - properties: { - source: { - type: "string", - const: "exec", - }, - provider: { - type: "string", - pattern: "^[a-z][a-z0-9_-]{0,63}$", - }, - id: { - type: "string", - }, - }, - required: ["source", "provider", "id"], - additionalProperties: false, - }, - ], - }, - ], - }, - applicationId: { - type: "string", - }, - proxy: { - type: "string", - }, - gatewayInfoTimeoutMs: { - type: "integer", - exclusiveMinimum: 0, - maximum: 120000, - }, - gatewayReadyTimeoutMs: { - type: "integer", - exclusiveMinimum: 0, - maximum: 120000, - }, - gatewayRuntimeReadyTimeoutMs: { - type: "integer", - exclusiveMinimum: 0, - maximum: 120000, - }, - allowBots: { - anyOf: [ - { - type: "boolean", - }, - { - type: "string", - const: "mentions", - }, - ], - }, - dangerouslyAllowNameMatching: { - type: "boolean", - }, - mentionAliases: { - type: "object", - propertyNames: { - type: "string", - }, - additionalProperties: { - type: "string", - pattern: "^\\d+$", - }, - }, - groupPolicy: { - default: "allowlist", - type: "string", - enum: ["open", "disabled", "allowlist"], - }, - contextVisibility: { - type: "string", - enum: ["all", "allowlist", "allowlist_quote"], - }, - historyLimit: { - type: "integer", - minimum: 0, - maximum: 9007199254740991, - }, - dmHistoryLimit: { - type: "integer", - minimum: 0, - maximum: 9007199254740991, - }, - dms: { - type: "object", - propertyNames: { - type: "string", - }, - additionalProperties: { - type: "object", - properties: { - historyLimit: { - type: "integer", - minimum: 0, - maximum: 9007199254740991, - }, - }, - additionalProperties: false, - }, - }, - textChunkLimit: { - type: "integer", - exclusiveMinimum: 0, - maximum: 9007199254740991, - }, - streaming: { - type: "object", - properties: { - mode: { - type: "string", - enum: ["off", "partial", "block", "progress"], - }, - chunkMode: { - type: "string", - enum: ["length", "newline"], - }, - preview: { - type: "object", - properties: { - chunk: { - type: "object", - properties: { - minChars: { - type: "integer", - exclusiveMinimum: 0, - maximum: 9007199254740991, - }, - maxChars: { - type: "integer", - exclusiveMinimum: 0, - maximum: 9007199254740991, - }, - breakPreference: { - anyOf: [ - { - type: "string", - const: "paragraph", - }, - { - type: "string", - const: "newline", - }, - { - type: "string", - const: "sentence", - }, - ], - }, - }, - additionalProperties: false, - }, - toolProgress: { - type: "boolean", - }, - commandText: { - type: "string", - enum: ["raw", "status"], - }, - }, - additionalProperties: false, - }, - progress: { - type: "object", - properties: { - label: { - anyOf: [ - { - type: "string", - }, - { - type: "boolean", - const: false, - }, - ], - }, - labels: { - type: "array", - items: { - type: "string", - }, - }, - maxLines: { - type: "integer", - exclusiveMinimum: 0, - maximum: 9007199254740991, - }, - render: { - type: "string", - enum: ["text", "rich"], - }, - toolProgress: { - type: "boolean", - }, - commandText: { - type: "string", - enum: ["raw", "status"], - }, - }, - additionalProperties: false, - }, - block: { - type: "object", - properties: { - enabled: { - type: "boolean", - }, - coalesce: { - type: "object", - properties: { - minChars: { - type: "integer", - exclusiveMinimum: 0, - maximum: 9007199254740991, - }, - maxChars: { - type: "integer", - exclusiveMinimum: 0, - maximum: 9007199254740991, - }, - idleMs: { - type: "integer", - minimum: 0, - maximum: 9007199254740991, - }, - }, - additionalProperties: false, - }, - }, - additionalProperties: false, - }, - }, - additionalProperties: false, - }, - maxLinesPerMessage: { - type: "integer", - exclusiveMinimum: 0, - maximum: 9007199254740991, - }, - mediaMaxMb: { - type: "number", - exclusiveMinimum: 0, - }, - retry: { - type: "object", - properties: { - attempts: { - type: "integer", - minimum: 1, - maximum: 9007199254740991, - }, - minDelayMs: { - type: "integer", - minimum: 0, - maximum: 9007199254740991, - }, - maxDelayMs: { - type: "integer", - minimum: 0, - maximum: 9007199254740991, - }, - jitter: { - type: "number", - minimum: 0, - maximum: 1, - }, - }, - additionalProperties: false, - }, - actions: { - type: "object", - properties: { - reactions: { - type: "boolean", - }, - stickers: { - type: "boolean", - }, - emojiUploads: { - type: "boolean", - }, - stickerUploads: { - type: "boolean", - }, - polls: { - type: "boolean", - }, - permissions: { - type: "boolean", - }, - messages: { - type: "boolean", - }, - threads: { - type: "boolean", - }, - pins: { - type: "boolean", - }, - search: { - type: "boolean", - }, - memberInfo: { - type: "boolean", - }, - roleInfo: { - type: "boolean", - }, - roles: { - type: "boolean", - }, - channelInfo: { - type: "boolean", - }, - voiceStatus: { - type: "boolean", - }, - events: { - type: "boolean", - }, - moderation: { - type: "boolean", - }, - channels: { - type: "boolean", - }, - presence: { - type: "boolean", - }, - }, - additionalProperties: false, - }, - replyToMode: { - anyOf: [ - { - type: "string", - const: "off", - }, - { - type: "string", - const: "first", - }, - { - type: "string", - const: "all", - }, - { - type: "string", - const: "batched", - }, - ], - }, - thread: { - type: "object", - properties: { - inheritParent: { - type: "boolean", - }, - }, - additionalProperties: false, - }, - dmPolicy: { - type: "string", - enum: ["pairing", "allowlist", "open", "disabled"], - }, - allowFrom: { - type: "array", - items: { - type: "string", - }, - }, - defaultTo: { - type: "string", - }, - dm: { - type: "object", - properties: { - enabled: { - type: "boolean", - }, - policy: { - type: "string", - enum: ["pairing", "allowlist", "open", "disabled"], - }, - allowFrom: { - type: "array", - items: { - type: "string", - }, - }, - groupEnabled: { - type: "boolean", - }, - groupChannels: { - type: "array", - items: { - type: "string", - }, - }, - }, - additionalProperties: false, - }, - guilds: { - type: "object", - propertyNames: { - type: "string", - }, - additionalProperties: { - type: "object", - properties: { - slug: { - type: "string", - }, - requireMention: { - type: "boolean", - }, - ignoreOtherMentions: { - type: "boolean", - }, - tools: { - type: "object", - properties: { - allow: { - type: "array", - items: { - type: "string", - }, - }, - alsoAllow: { - type: "array", - items: { - type: "string", - }, - }, - deny: { - type: "array", - items: { - type: "string", - }, - }, - }, - additionalProperties: false, - }, - toolsBySender: { - type: "object", - propertyNames: { - type: "string", - }, - additionalProperties: { - type: "object", - properties: { - allow: { - type: "array", - items: { - type: "string", - }, - }, - alsoAllow: { - type: "array", - items: { - type: "string", - }, - }, - deny: { - type: "array", - items: { - type: "string", - }, - }, - }, - additionalProperties: false, - }, - }, - reactionNotifications: { - type: "string", - enum: ["off", "own", "all", "allowlist"], - }, - users: { - type: "array", - items: { - type: "string", - }, - }, - roles: { - type: "array", - items: { - type: "string", - }, - }, - channels: { - type: "object", - propertyNames: { - type: "string", - }, - additionalProperties: { - type: "object", - properties: { - requireMention: { - type: "boolean", - }, - ignoreOtherMentions: { - type: "boolean", - }, - tools: { - type: "object", - properties: { - allow: { - type: "array", - items: { - type: "string", - }, - }, - alsoAllow: { - type: "array", - items: { - type: "string", - }, - }, - deny: { - type: "array", - items: { - type: "string", - }, - }, - }, - additionalProperties: false, - }, - toolsBySender: { - type: "object", - propertyNames: { - type: "string", - }, - additionalProperties: { - type: "object", - properties: { - allow: { - type: "array", - items: { - type: "string", - }, - }, - alsoAllow: { - type: "array", - items: { - type: "string", - }, - }, - deny: { - type: "array", - items: { - type: "string", - }, - }, - }, - additionalProperties: false, - }, - }, - skills: { - type: "array", - items: { - type: "string", - }, - }, - enabled: { - type: "boolean", - }, - users: { - type: "array", - items: { - type: "string", - }, - }, - roles: { - type: "array", - items: { - type: "string", - }, - }, - systemPrompt: { - type: "string", - }, - includeThreadStarter: { - type: "boolean", - }, - autoThread: { - type: "boolean", - }, - autoThreadName: { - type: "string", - enum: ["message", "generated"], - }, - autoArchiveDuration: { - anyOf: [ - { - type: "string", - enum: ["60", "1440", "4320", "10080"], - }, - { - type: "number", - const: 60, - }, - { - type: "number", - const: 1440, - }, - { - type: "number", - const: 4320, - }, - { - type: "number", - const: 10080, - }, - ], - }, - }, - additionalProperties: false, - }, - }, - }, - additionalProperties: false, - }, - }, - heartbeat: { - type: "object", - properties: { - showOk: { - type: "boolean", - }, - showAlerts: { - type: "boolean", - }, - useIndicator: { - type: "boolean", - }, - }, - additionalProperties: false, - }, - healthMonitor: { - type: "object", - properties: { - enabled: { - type: "boolean", - }, - }, - additionalProperties: false, - }, - execApprovals: { - type: "object", - properties: { - enabled: { - type: "boolean", - }, - approvers: { - type: "array", - items: { - type: "string", - }, - }, - agentFilter: { - type: "array", - items: { - type: "string", - }, - }, - sessionFilter: { - type: "array", - items: { - type: "string", - }, - }, - cleanupAfterResolve: { - type: "boolean", - }, - target: { - type: "string", - enum: ["dm", "channel", "both"], - }, - }, - additionalProperties: false, - }, - agentComponents: { - type: "object", - properties: { - enabled: { - type: "boolean", - }, - }, - additionalProperties: false, - }, - ui: { - type: "object", - properties: { - components: { - type: "object", - properties: { - accentColor: { - type: "string", - pattern: "^#?[0-9a-fA-F]{6}$", - }, - }, - additionalProperties: false, - }, - }, - additionalProperties: false, - }, - slashCommand: { - type: "object", - properties: { - ephemeral: { - type: "boolean", - }, - }, - additionalProperties: false, - }, - threadBindings: { - type: "object", - properties: { - enabled: { - type: "boolean", - }, - idleHours: { - type: "number", - minimum: 0, - }, - maxAgeHours: { - type: "number", - minimum: 0, - }, - spawnSessions: { - type: "boolean", - }, - defaultSpawnContext: { - type: "string", - enum: ["isolated", "fork"], - }, - spawnSubagentSessions: { - type: "boolean", - }, - spawnAcpSessions: { - type: "boolean", - }, - }, - additionalProperties: false, - }, - intents: { - type: "object", - properties: { - presence: { - type: "boolean", - }, - guildMembers: { - type: "boolean", - }, - voiceStates: { - type: "boolean", - }, - }, - additionalProperties: false, - }, - voice: { - type: "object", - properties: { - enabled: { - type: "boolean", - }, - model: { - type: "string", - minLength: 1, - }, - autoJoin: { - type: "array", - items: { - type: "object", - properties: { - guildId: { - type: "string", - minLength: 1, - }, - channelId: { - type: "string", - minLength: 1, - }, - }, - required: ["guildId", "channelId"], - additionalProperties: false, - }, - }, - daveEncryption: { - type: "boolean", - }, - decryptionFailureTolerance: { - type: "integer", - minimum: 0, - maximum: 9007199254740991, - }, - connectTimeoutMs: { - type: "integer", - exclusiveMinimum: 0, - maximum: 120000, - }, - reconnectGraceMs: { - type: "integer", - exclusiveMinimum: 0, - maximum: 120000, - }, - tts: { - type: "object", - properties: { - auto: { - type: "string", - enum: ["off", "always", "inbound", "tagged"], - }, - enabled: { - type: "boolean", - }, - mode: { - type: "string", - enum: ["final", "all"], - }, - provider: { - type: "string", - minLength: 1, - }, - persona: { - type: "string", - }, - personas: { - type: "object", - propertyNames: { - type: "string", - }, - additionalProperties: { - type: "object", - properties: { - label: { - type: "string", - }, - description: { - type: "string", - }, - provider: { - type: "string", - minLength: 1, - }, - fallbackPolicy: { - anyOf: [ - { - type: "string", - const: "preserve-persona", - }, - { - type: "string", - const: "provider-defaults", - }, - { - type: "string", - const: "fail", - }, - ], - }, - prompt: { - type: "object", - properties: { - profile: { - type: "string", - }, - scene: { - type: "string", - }, - sampleContext: { - type: "string", - }, - style: { - type: "string", - }, - accent: { - type: "string", - }, - pacing: { - type: "string", - }, - constraints: { - type: "array", - items: { - type: "string", - }, - }, - }, - additionalProperties: false, - }, - providers: { - type: "object", - propertyNames: { - type: "string", - }, - additionalProperties: { - type: "object", - properties: { - apiKey: { - anyOf: [ - { - type: "string", - }, - { - oneOf: [ - { - type: "object", - properties: { - source: { - type: "string", - const: "env", - }, - provider: { - type: "string", - pattern: "^[a-z][a-z0-9_-]{0,63}$", - }, - id: { - type: "string", - pattern: "^[A-Z][A-Z0-9_]{0,127}$", - }, - }, - required: ["source", "provider", "id"], - additionalProperties: false, - }, - { - type: "object", - properties: { - source: { - type: "string", - const: "file", - }, - provider: { - type: "string", - pattern: "^[a-z][a-z0-9_-]{0,63}$", - }, - id: { - type: "string", - }, - }, - required: ["source", "provider", "id"], - additionalProperties: false, - }, - { - type: "object", - properties: { - source: { - type: "string", - const: "exec", - }, - provider: { - type: "string", - pattern: "^[a-z][a-z0-9_-]{0,63}$", - }, - id: { - type: "string", - }, - }, - required: ["source", "provider", "id"], - additionalProperties: false, - }, - ], - }, - ], - }, - }, - additionalProperties: { - anyOf: [ - { - type: "string", - }, - { - type: "number", - }, - { - type: "boolean", - }, - { - type: "null", - }, - { - type: "array", - items: {}, - }, - { - type: "object", - propertyNames: { - type: "string", - }, - additionalProperties: {}, - }, - ], - }, - }, - }, - }, - additionalProperties: false, - }, - }, - summaryModel: { - type: "string", - }, - modelOverrides: { - type: "object", - properties: { - enabled: { - type: "boolean", - }, - allowText: { - type: "boolean", - }, - allowProvider: { - type: "boolean", - }, - allowVoice: { - type: "boolean", - }, - allowModelId: { - type: "boolean", - }, - allowVoiceSettings: { - type: "boolean", - }, - allowNormalization: { - type: "boolean", - }, - allowSeed: { - type: "boolean", - }, - }, - additionalProperties: false, - }, - providers: { - type: "object", - propertyNames: { - type: "string", - }, - additionalProperties: { - type: "object", - properties: { - apiKey: { - anyOf: [ - { - type: "string", - }, - { - oneOf: [ - { - type: "object", - properties: { - source: { - type: "string", - const: "env", - }, - provider: { - type: "string", - pattern: "^[a-z][a-z0-9_-]{0,63}$", - }, - id: { - type: "string", - pattern: "^[A-Z][A-Z0-9_]{0,127}$", - }, - }, - required: ["source", "provider", "id"], - additionalProperties: false, - }, - { - type: "object", - properties: { - source: { - type: "string", - const: "file", - }, - provider: { - type: "string", - pattern: "^[a-z][a-z0-9_-]{0,63}$", - }, - id: { - type: "string", - }, - }, - required: ["source", "provider", "id"], - additionalProperties: false, - }, - { - type: "object", - properties: { - source: { - type: "string", - const: "exec", - }, - provider: { - type: "string", - pattern: "^[a-z][a-z0-9_-]{0,63}$", - }, - id: { - type: "string", - }, - }, - required: ["source", "provider", "id"], - additionalProperties: false, - }, - ], - }, - ], - }, - }, - additionalProperties: { - anyOf: [ - { - type: "string", - }, - { - type: "number", - }, - { - type: "boolean", - }, - { - type: "null", - }, - { - type: "array", - items: {}, - }, - { - type: "object", - propertyNames: { - type: "string", - }, - additionalProperties: {}, - }, - ], - }, - }, - }, - prefsPath: { - type: "string", - }, - maxTextLength: { - type: "integer", - minimum: 1, - maximum: 9007199254740991, - }, - timeoutMs: { - type: "integer", - minimum: 1000, - maximum: 120000, - }, - }, - additionalProperties: false, - }, - }, - additionalProperties: false, - }, - pluralkit: { - type: "object", - properties: { - enabled: { - type: "boolean", - }, - token: { - anyOf: [ - { - type: "string", - }, - { - oneOf: [ - { - type: "object", - properties: { - source: { - type: "string", - const: "env", - }, - provider: { - type: "string", - pattern: "^[a-z][a-z0-9_-]{0,63}$", - }, - id: { - type: "string", - pattern: "^[A-Z][A-Z0-9_]{0,127}$", - }, - }, - required: ["source", "provider", "id"], - additionalProperties: false, - }, - { - type: "object", - properties: { - source: { - type: "string", - const: "file", - }, - provider: { - type: "string", - pattern: "^[a-z][a-z0-9_-]{0,63}$", - }, - id: { - type: "string", - }, - }, - required: ["source", "provider", "id"], - additionalProperties: false, - }, - { - type: "object", - properties: { - source: { - type: "string", - const: "exec", - }, - provider: { - type: "string", - pattern: "^[a-z][a-z0-9_-]{0,63}$", - }, - id: { - type: "string", - }, - }, - required: ["source", "provider", "id"], - additionalProperties: false, - }, - ], - }, - ], - }, - }, - additionalProperties: false, - }, - responsePrefix: { - type: "string", - }, - ackReaction: { - type: "string", - }, - ackReactionScope: { - type: "string", - enum: ["group-mentions", "group-all", "direct", "all", "off", "none"], - }, - activity: { - type: "string", - }, - status: { - type: "string", - enum: ["online", "dnd", "idle", "invisible"], - }, - autoPresence: { - type: "object", - properties: { - enabled: { - type: "boolean", - }, - intervalMs: { - type: "integer", - exclusiveMinimum: 0, - maximum: 9007199254740991, - }, - minUpdateIntervalMs: { - type: "integer", - exclusiveMinimum: 0, - maximum: 9007199254740991, - }, - healthyText: { - type: "string", - }, - degradedText: { - type: "string", - }, - exhaustedText: { - type: "string", - }, - }, - additionalProperties: false, - }, - activityType: { - anyOf: [ - { - type: "number", - const: 0, - }, - { - type: "number", - const: 1, - }, - { - type: "number", - const: 2, - }, - { - type: "number", - const: 3, - }, - { - type: "number", - const: 4, - }, - { - type: "number", - const: 5, - }, - ], - }, - activityUrl: { - type: "string", - format: "uri", - }, - inboundWorker: { - type: "object", - properties: { - runTimeoutMs: { - type: "integer", - minimum: 0, - maximum: 9007199254740991, - }, - }, - additionalProperties: false, - }, - eventQueue: { - type: "object", - properties: { - listenerTimeout: { - type: "integer", - exclusiveMinimum: 0, - maximum: 9007199254740991, - }, - maxQueueSize: { - type: "integer", - exclusiveMinimum: 0, - maximum: 9007199254740991, - }, - maxConcurrency: { - type: "integer", - exclusiveMinimum: 0, - maximum: 9007199254740991, - }, - }, - additionalProperties: false, - }, - }, - required: ["groupPolicy"], - additionalProperties: false, - }, - }, - defaultAccount: { - type: "string", - }, - }, - required: ["groupPolicy"], - additionalProperties: false, - }, - uiHints: { - "": { - label: "Discord", - help: "Discord channel provider configuration for bot auth, retry policy, streaming, thread bindings, and optional voice capabilities. Keep privileged intents and advanced features disabled unless needed.", - }, - dmPolicy: { - label: "Discord DM Policy", - help: 'Direct message access control ("pairing" recommended). "open" requires channels.discord.allowFrom=["*"].', - }, - "dm.policy": { - label: "Discord DM Policy", - help: 'Direct message access control ("pairing" recommended). "open" requires channels.discord.allowFrom=["*"] (legacy: channels.discord.dm.allowFrom).', - }, - configWrites: { - label: "Discord Config Writes", - help: "Allow Discord to write config in response to channel events/commands (default: true).", - }, - proxy: { - label: "Discord Proxy URL", - help: "Proxy URL for Discord gateway + API requests (app-id lookup and allowlist resolution). Set per account via channels.discord.accounts..proxy.", - }, - "commands.native": { - label: "Discord Native Commands", - help: 'Override native commands for Discord (bool or "auto").', - }, - "commands.nativeSkills": { - label: "Discord Native Skill Commands", - help: 'Override native skill commands for Discord (bool or "auto").', - }, - streaming: { - label: "Discord Streaming Mode", - help: 'Unified Discord stream preview mode: "off" | "partial" | "block" | "progress". "progress" keeps a single editable progress draft until final delivery. Legacy boolean/streamMode keys are auto-mapped.', - }, - "streaming.mode": { - label: "Discord Streaming Mode", - help: 'Canonical Discord preview mode: "off" | "partial" | "block" | "progress".', - }, - "streaming.chunkMode": { - label: "Discord Chunk Mode", - help: 'Chunking mode for outbound Discord text delivery: "length" (default) or "newline".', - }, - "streaming.block.enabled": { - label: "Discord Block Streaming Enabled", - help: 'Enable chunked block-style Discord preview delivery when channels.discord.streaming.mode="block".', - }, - "streaming.block.coalesce": { - label: "Discord Block Streaming Coalesce", - help: "Merge streamed Discord block replies before final delivery.", - }, - "streaming.preview.chunk.minChars": { - label: "Discord Draft Chunk Min Chars", - help: 'Minimum chars before emitting a Discord stream preview update when channels.discord.streaming.mode="block" (default: 200).', - }, - "streaming.preview.chunk.maxChars": { - label: "Discord Draft Chunk Max Chars", - help: 'Target max size for a Discord stream preview chunk when channels.discord.streaming.mode="block" (default: 800; clamped to channels.discord.textChunkLimit).', - }, - "streaming.preview.chunk.breakPreference": { - label: "Discord Draft Chunk Break Preference", - help: "Preferred breakpoints for Discord draft chunks (paragraph | newline | sentence). Default: paragraph.", - }, - "streaming.preview.toolProgress": { - label: "Discord Draft Tool Progress", - help: "Show tool/progress activity in the live draft preview message (default: true). Set false to hide interim tool updates while the draft preview stays active.", - }, - "streaming.preview.commandText": { - label: "Discord Draft Command Text", - help: 'Command/exec detail in preview tool-progress lines: "raw" preserves released behavior; "status" shows only the tool label.', - }, - "streaming.progress.label": { - label: "Discord Progress Label", - help: 'Initial progress draft title. Use "auto" for built-in single-word labels, a custom string, or false to hide the title.', - }, - "streaming.progress.labels": { - label: "Discord Progress Label Pool", - help: 'Candidate labels for streaming.progress.label="auto". Leave unset to use OpenClaw built-in progress labels.', - }, - "streaming.progress.maxLines": { - label: "Discord Progress Max Lines", - help: "Maximum number of compact progress lines to keep below the draft label (default: 8).", - }, - "streaming.progress.toolProgress": { - label: "Discord Progress Tool Lines", - help: "Show compact tool/progress lines in progress draft mode (default: true). Set false to keep only the label until final delivery.", - }, - "streaming.progress.commandText": { - label: "Discord Progress Command Text", - help: 'Command/exec detail in progress draft lines: "raw" preserves released behavior; "status" shows only the tool label.', - }, - "retry.attempts": { - label: "Discord Retry Attempts", - help: "Max retry attempts for outbound Discord API calls (default: 3).", - }, - "retry.minDelayMs": { - label: "Discord Retry Min Delay (ms)", - help: "Minimum retry delay in ms for Discord outbound calls.", - }, - "retry.maxDelayMs": { - label: "Discord Retry Max Delay (ms)", - help: "Maximum retry delay cap in ms for Discord outbound calls.", - }, - "retry.jitter": { - label: "Discord Retry Jitter", - help: "Jitter factor (0-1) applied to Discord retry delays.", - }, - maxLinesPerMessage: { - label: "Discord Max Lines Per Message", - help: "Soft max line count per Discord message (default: 17).", - }, - "thread.inheritParent": { - label: "Discord Thread Parent Inheritance", - help: "If true, Discord thread sessions inherit the parent channel transcript (default: false).", - }, - "eventQueue.listenerTimeout": { - label: "Discord EventQueue Listener Timeout (ms)", - help: "Canonical Discord listener timeout control in ms for gateway normalization/enqueue handlers. Default is 120000 in OpenClaw; set per account via channels.discord.accounts..eventQueue.listenerTimeout.", - }, - "eventQueue.maxQueueSize": { - label: "Discord EventQueue Max Queue Size", - help: "Optional Discord EventQueue capacity override (max queued events before backpressure). Set per account via channels.discord.accounts..eventQueue.maxQueueSize.", - }, - "eventQueue.maxConcurrency": { - label: "Discord EventQueue Max Concurrency", - help: "Optional Discord EventQueue concurrency override (max concurrent handler executions). Set per account via channels.discord.accounts..eventQueue.maxConcurrency.", - }, - "threadBindings.enabled": { - label: "Discord Thread Binding Enabled", - help: "Enable Discord thread binding features (/focus, bound-thread routing/delivery, and thread-bound subagent sessions). Overrides session.threadBindings.enabled when set.", - }, - "threadBindings.idleHours": { - label: "Discord Thread Binding Idle Timeout (hours)", - help: "Inactivity window in hours for Discord thread-bound sessions (/focus and spawned thread sessions). Set 0 to disable idle auto-unfocus (default: 24). Overrides session.threadBindings.idleHours when set.", - }, - "threadBindings.maxAgeHours": { - label: "Discord Thread Binding Max Age (hours)", - help: "Optional hard max age in hours for Discord thread-bound sessions. Set 0 to disable hard cap (default: 0). Overrides session.threadBindings.maxAgeHours when set.", - }, - "threadBindings.spawnSessions": { - label: "Discord Thread-Bound Session Spawn", - help: "Allow sessions_spawn(thread=true) and ACP thread spawns to auto-create and bind Discord threads (default: true). Set false to disable for this account/channel.", - }, - "threadBindings.defaultSpawnContext": { - label: "Discord Thread Spawn Context", - help: 'Default native subagent context for thread-bound spawns. "fork" starts from the requester transcript; "isolated" starts clean. Default: "fork".', - }, - "ui.components.accentColor": { - label: "Discord Component Accent Color", - help: "Accent color for Discord component containers (hex). Set per account via channels.discord.accounts..ui.components.accentColor.", - }, - "intents.presence": { - label: "Discord Presence Intent", - help: "Enable the Guild Presences privileged intent. Must also be enabled in the Discord Developer Portal. Allows tracking user activities (e.g. Spotify). Default: false.", - }, - "intents.guildMembers": { - label: "Discord Guild Members Intent", - help: "Enable the Guild Members privileged intent. Must also be enabled in the Discord Developer Portal. Default: false.", - }, - "intents.voiceStates": { - label: "Discord Voice States Intent", - help: "Enable the Guild Voice States intent. Defaults to the effective Discord voice setting; set true only for Discord voice channel conversations.", - }, - gatewayInfoTimeoutMs: { - label: "Discord Gateway Metadata Timeout (ms)", - help: "Timeout for Discord /gateway/bot metadata lookup before falling back to the default gateway URL. Default is 30000; OPENCLAW_DISCORD_GATEWAY_INFO_TIMEOUT_MS can override when config is unset.", - }, - gatewayReadyTimeoutMs: { - label: "Discord Gateway READY Timeout (ms)", - help: "Startup wait for the Discord gateway READY event before restarting the socket. Default is 15000; OPENCLAW_DISCORD_READY_TIMEOUT_MS can override when config is unset.", - }, - gatewayRuntimeReadyTimeoutMs: { - label: "Discord Gateway Runtime READY Timeout (ms)", - help: "Runtime reconnect wait for the Discord gateway READY event before force-stopping the lifecycle. Default is 30000; OPENCLAW_DISCORD_RUNTIME_READY_TIMEOUT_MS can override when config is unset.", - }, - "voice.enabled": { - label: "Discord Voice Enabled", - help: "Enable Discord voice channel conversations. Text-only Discord configs leave voice off by default; set true to enable /vc commands and the Guild Voice States intent.", - }, - "voice.model": { - label: "Discord Voice Model", - help: "Optional LLM model override for Discord voice channel responses (for example openai/gpt-5.4-mini). Leave unset to inherit the routed agent model.", - }, - "voice.autoJoin": { - label: "Discord Voice Auto-Join", - help: "Voice channels to auto-join on startup (list of guildId/channelId entries).", - }, - "voice.daveEncryption": { - label: "Discord Voice DAVE Encryption", - help: "Toggle DAVE end-to-end encryption for Discord voice joins (default: true in @discordjs/voice; Discord may require this).", - }, - "voice.decryptionFailureTolerance": { - label: "Discord Voice Decrypt Failure Tolerance", - help: "Consecutive decrypt failures before DAVE attempts session recovery (passed to @discordjs/voice; default: 24).", - }, - "voice.connectTimeoutMs": { - label: "Discord Voice Connect Timeout (ms)", - help: "Initial @discordjs/voice Ready wait before a join is treated as failed. Default: 30000.", - }, - "voice.reconnectGraceMs": { - label: "Discord Voice Reconnect Grace (ms)", - help: "Grace period for a disconnected Discord voice session to enter Signalling or Connecting before OpenClaw destroys it. Default: 15000.", - }, - "voice.tts": { - label: "Discord Voice Text-to-Speech", - help: "Optional TTS overrides for Discord voice playback (merged with messages.tts).", - }, - "pluralkit.enabled": { - label: "Discord PluralKit Enabled", - help: "Resolve PluralKit proxied messages and treat system members as distinct senders.", - }, - "pluralkit.token": { - label: "Discord PluralKit Token", - help: "Optional PluralKit token for resolving private systems or members.", - }, - activity: { - label: "Discord Presence Activity", - help: "Discord presence activity text (defaults to custom status).", - }, - status: { - label: "Discord Presence Status", - help: "Discord presence status (online, dnd, idle, invisible).", - }, - "autoPresence.enabled": { - label: "Discord Auto Presence Enabled", - help: "Enable automatic Discord bot presence updates based on runtime/model availability signals. When enabled: healthy=>online, degraded/unknown=>idle, exhausted/unavailable=>dnd.", - }, - "autoPresence.intervalMs": { - label: "Discord Auto Presence Check Interval (ms)", - help: "How often to evaluate Discord auto-presence state in milliseconds (default: 30000).", - }, - "autoPresence.minUpdateIntervalMs": { - label: "Discord Auto Presence Min Update Interval (ms)", - help: "Minimum time between actual Discord presence update calls in milliseconds (default: 15000). Prevents status spam on noisy state changes.", - }, - "autoPresence.healthyText": { - label: "Discord Auto Presence Healthy Text", - help: "Optional custom status text while runtime is healthy (online). If omitted, falls back to static channels.discord.activity when set.", - }, - "autoPresence.degradedText": { - label: "Discord Auto Presence Degraded Text", - help: "Optional custom status text while runtime/model availability is degraded or unknown (idle).", - }, - "autoPresence.exhaustedText": { - label: "Discord Auto Presence Exhausted Text", - help: "Optional custom status text while runtime detects exhausted/unavailable model quota (dnd). Supports {reason} template placeholder.", - }, - activityType: { - label: "Discord Presence Activity Type", - help: "Discord presence activity type (0=Playing,1=Streaming,2=Listening,3=Watching,4=Custom,5=Competing).", - }, - activityUrl: { - label: "Discord Presence Activity URL", - help: "Discord presence streaming URL (required for activityType=1).", - }, - allowBots: { - label: "Discord Allow Bot Messages", - help: 'Allow bot-authored messages to trigger Discord replies (default: false). Set "mentions" to only accept bot messages that mention the bot.', - }, - mentionAliases: { - label: "Discord Mention Aliases", - help: "Map outbound @handle text to stable Discord user IDs before sending. Set per account via channels.discord.accounts..mentionAliases.", - }, - token: { - label: "Discord Bot Token", - help: "Discord bot token used for gateway and REST API authentication for this provider account. Keep this secret out of committed config and rotate immediately after any leak.", - sensitive: true, - }, - applicationId: { - label: "Discord Application ID", - help: "Optional Discord application/client ID. Set this when hosted environments cannot reach Discord's application lookup endpoint during startup.", - }, - }, - unsupportedSecretRefSurfacePatterns: [ - "channels.discord.accounts.*.threadBindings.webhookToken", - "channels.discord.threadBindings.webhookToken", - ], - }, - { - pluginId: "feishu", - channelId: "feishu", - label: "Feishu", - description: "飞书/Lark enterprise messaging with doc/wiki/drive tools.", - schema: { - $schema: "http://json-schema.org/draft-07/schema#", - type: "object", - properties: { - enabled: { - type: "boolean", - }, - defaultAccount: { - type: "string", - }, - appId: { - type: "string", - }, - appSecret: { - anyOf: [ - { - type: "string", - }, - { - oneOf: [ - { - type: "object", - properties: { - source: { - type: "string", - const: "env", - }, - provider: { - type: "string", - pattern: "^[a-z][a-z0-9_-]{0,63}$", - }, - id: { - type: "string", - pattern: "^[A-Z][A-Z0-9_]{0,127}$", - }, - }, - required: ["source", "provider", "id"], - additionalProperties: false, - }, - { - type: "object", - properties: { - source: { - type: "string", - const: "file", - }, - provider: { - type: "string", - pattern: "^[a-z][a-z0-9_-]{0,63}$", - }, - id: { - type: "string", - }, - }, - required: ["source", "provider", "id"], - additionalProperties: false, - }, - { - type: "object", - properties: { - source: { - type: "string", - const: "exec", - }, - provider: { - type: "string", - pattern: "^[a-z][a-z0-9_-]{0,63}$", - }, - id: { - type: "string", - }, - }, - required: ["source", "provider", "id"], - additionalProperties: false, - }, - ], - }, - ], - }, - encryptKey: { - anyOf: [ - { - type: "string", - }, - { - oneOf: [ - { - type: "object", - properties: { - source: { - type: "string", - const: "env", - }, - provider: { - type: "string", - pattern: "^[a-z][a-z0-9_-]{0,63}$", - }, - id: { - type: "string", - pattern: "^[A-Z][A-Z0-9_]{0,127}$", - }, - }, - required: ["source", "provider", "id"], - additionalProperties: false, - }, - { - type: "object", - properties: { - source: { - type: "string", - const: "file", - }, - provider: { - type: "string", - pattern: "^[a-z][a-z0-9_-]{0,63}$", - }, - id: { - type: "string", - }, - }, - required: ["source", "provider", "id"], - additionalProperties: false, - }, - { - type: "object", - properties: { - source: { - type: "string", - const: "exec", - }, - provider: { - type: "string", - pattern: "^[a-z][a-z0-9_-]{0,63}$", - }, - id: { - type: "string", - }, - }, - required: ["source", "provider", "id"], - additionalProperties: false, - }, - ], - }, - ], - }, - verificationToken: { - anyOf: [ - { - type: "string", - }, - { - oneOf: [ - { - type: "object", - properties: { - source: { - type: "string", - const: "env", - }, - provider: { - type: "string", - pattern: "^[a-z][a-z0-9_-]{0,63}$", - }, - id: { - type: "string", - pattern: "^[A-Z][A-Z0-9_]{0,127}$", - }, - }, - required: ["source", "provider", "id"], - additionalProperties: false, - }, - { - type: "object", - properties: { - source: { - type: "string", - const: "file", - }, - provider: { - type: "string", - pattern: "^[a-z][a-z0-9_-]{0,63}$", - }, - id: { - type: "string", - }, - }, - required: ["source", "provider", "id"], - additionalProperties: false, - }, - { - type: "object", - properties: { - source: { - type: "string", - const: "exec", - }, - provider: { - type: "string", - pattern: "^[a-z][a-z0-9_-]{0,63}$", - }, - id: { - type: "string", - }, - }, - required: ["source", "provider", "id"], - additionalProperties: false, - }, - ], - }, - ], - }, - domain: { - default: "feishu", - anyOf: [ - { - type: "string", - enum: ["feishu", "lark"], - }, - { - type: "string", - format: "uri", - pattern: "^https:\\/\\/.*", - }, - ], - }, - connectionMode: { - default: "websocket", - type: "string", - enum: ["websocket", "webhook"], - }, - webhookPath: { - default: "/feishu/events", - type: "string", - }, - webhookHost: { - type: "string", - }, - webhookPort: { - type: "integer", - exclusiveMinimum: 0, - maximum: 9007199254740991, - }, - capabilities: { - type: "array", - items: { - type: "string", - }, - }, - markdown: { - type: "object", - properties: { - mode: { - type: "string", - enum: ["native", "escape", "strip"], - }, - tableMode: { - type: "string", - enum: ["native", "ascii", "simple"], - }, - }, - additionalProperties: false, - }, - configWrites: { - type: "boolean", - }, - dmPolicy: { - default: "pairing", - type: "string", - enum: ["open", "pairing", "allowlist"], - }, - allowFrom: { - type: "array", - items: { - anyOf: [ - { - type: "string", - }, - { - type: "number", - }, - ], - }, - }, - groupPolicy: { - default: "allowlist", - anyOf: [ - { - type: "string", - enum: ["open", "allowlist", "disabled"], - }, - {}, - ], - }, - groupAllowFrom: { - type: "array", - items: { - anyOf: [ - { - type: "string", - }, - { - type: "number", - }, - ], - }, - }, - groupSenderAllowFrom: { - type: "array", - items: { - anyOf: [ - { - type: "string", - }, - { - type: "number", - }, - ], - }, - }, - requireMention: { - type: "boolean", - }, - groups: { - type: "object", - propertyNames: { - type: "string", - }, - additionalProperties: { - type: "object", - properties: { - requireMention: { - type: "boolean", - }, - tools: { - type: "object", - properties: { - allow: { - type: "array", - items: { - type: "string", - }, - }, - deny: { - type: "array", - items: { - type: "string", - }, - }, - }, - additionalProperties: false, - }, - skills: { - type: "array", - items: { - type: "string", - }, - }, - enabled: { - type: "boolean", - }, - allowFrom: { - type: "array", - items: { - anyOf: [ - { - type: "string", - }, - { - type: "number", - }, - ], - }, - }, - systemPrompt: { - type: "string", - }, - groupSessionScope: { - type: "string", - enum: ["group", "group_sender", "group_topic", "group_topic_sender"], - }, - topicSessionMode: { - type: "string", - enum: ["disabled", "enabled"], - }, - replyInThread: { - type: "string", - enum: ["disabled", "enabled"], - }, - }, - additionalProperties: false, - }, - }, - historyLimit: { - type: "integer", - minimum: 0, - maximum: 9007199254740991, - }, - dmHistoryLimit: { - type: "integer", - minimum: 0, - maximum: 9007199254740991, - }, - dms: { - type: "object", - propertyNames: { - type: "string", - }, - additionalProperties: { - type: "object", - properties: { - enabled: { - type: "boolean", - }, - systemPrompt: { - type: "string", - }, - }, - additionalProperties: false, - }, - }, - textChunkLimit: { - type: "integer", - exclusiveMinimum: 0, - maximum: 9007199254740991, - }, - chunkMode: { - type: "string", - enum: ["length", "newline"], - }, - blockStreaming: { - type: "boolean", - }, - blockStreamingCoalesce: { - type: "object", - properties: { - enabled: { - type: "boolean", - }, - minDelayMs: { - type: "integer", - exclusiveMinimum: 0, - maximum: 9007199254740991, - }, - maxDelayMs: { - type: "integer", - exclusiveMinimum: 0, - maximum: 9007199254740991, - }, - }, - additionalProperties: false, - }, - mediaMaxMb: { - type: "number", - exclusiveMinimum: 0, - }, - httpTimeoutMs: { - type: "integer", - exclusiveMinimum: 0, - maximum: 300000, - }, - heartbeat: { - type: "object", - properties: { - visibility: { - type: "string", - enum: ["visible", "hidden"], - }, - intervalMs: { - type: "integer", - exclusiveMinimum: 0, - maximum: 9007199254740991, - }, - }, - additionalProperties: false, - }, - renderMode: { - type: "string", - enum: ["auto", "raw", "card"], - }, - streaming: { - type: "boolean", - }, - tools: { - type: "object", - properties: { - doc: { - type: "boolean", - }, - chat: { - type: "boolean", - }, - wiki: { - type: "boolean", - }, - drive: { - type: "boolean", - }, - perm: { - type: "boolean", - }, - scopes: { - type: "boolean", - }, - }, - additionalProperties: false, - }, - actions: { - type: "object", - properties: { - reactions: { - type: "boolean", - }, - }, - additionalProperties: false, - }, - replyInThread: { - type: "string", - enum: ["disabled", "enabled"], - }, - reactionNotifications: { - default: "own", - type: "string", - enum: ["off", "own", "all"], - }, - typingIndicator: { - default: true, - type: "boolean", - }, - resolveSenderNames: { - default: true, - type: "boolean", - }, - tts: { - type: "object", - properties: { - auto: { - type: "string", - enum: ["off", "always", "inbound", "tagged"], - }, - enabled: { - type: "boolean", - }, - mode: { - type: "string", - enum: ["final", "all"], - }, - provider: { - type: "string", - }, - persona: { - type: "string", - }, - personas: { - type: "object", - propertyNames: { - type: "string", - }, - additionalProperties: { - type: "object", - propertyNames: { - type: "string", - }, - additionalProperties: {}, - }, - }, - summaryModel: { - type: "string", - }, - modelOverrides: { - type: "object", - propertyNames: { - type: "string", - }, - additionalProperties: {}, - }, - providers: { - type: "object", - propertyNames: { - type: "string", - }, - additionalProperties: { - type: "object", - propertyNames: { - type: "string", - }, - additionalProperties: {}, - }, - }, - prefsPath: { - type: "string", - }, - maxTextLength: { - type: "integer", - minimum: 1, - maximum: 9007199254740991, - }, - timeoutMs: { - type: "integer", - minimum: 1000, - maximum: 120000, - }, - }, - additionalProperties: false, - }, - groupSessionScope: { - type: "string", - enum: ["group", "group_sender", "group_topic", "group_topic_sender"], - }, - topicSessionMode: { - type: "string", - enum: ["disabled", "enabled"], - }, - dynamicAgentCreation: { - type: "object", - properties: { - enabled: { - type: "boolean", - }, - workspaceTemplate: { - type: "string", - }, - agentDirTemplate: { - type: "string", - }, - maxAgents: { - type: "integer", - exclusiveMinimum: 0, - maximum: 9007199254740991, - }, - }, - additionalProperties: false, - }, - accounts: { - type: "object", - propertyNames: { - type: "string", - }, - additionalProperties: { - type: "object", - properties: { - enabled: { - type: "boolean", - }, - name: { - type: "string", - }, - appId: { - type: "string", - }, - appSecret: { - anyOf: [ - { - type: "string", - }, - { - oneOf: [ - { - type: "object", - properties: { - source: { - type: "string", - const: "env", - }, - provider: { - type: "string", - pattern: "^[a-z][a-z0-9_-]{0,63}$", - }, - id: { - type: "string", - pattern: "^[A-Z][A-Z0-9_]{0,127}$", - }, - }, - required: ["source", "provider", "id"], - additionalProperties: false, - }, - { - type: "object", - properties: { - source: { - type: "string", - const: "file", - }, - provider: { - type: "string", - pattern: "^[a-z][a-z0-9_-]{0,63}$", - }, - id: { - type: "string", - }, - }, - required: ["source", "provider", "id"], - additionalProperties: false, - }, - { - type: "object", - properties: { - source: { - type: "string", - const: "exec", - }, - provider: { - type: "string", - pattern: "^[a-z][a-z0-9_-]{0,63}$", - }, - id: { - type: "string", - }, - }, - required: ["source", "provider", "id"], - additionalProperties: false, - }, - ], - }, - ], - }, - encryptKey: { - anyOf: [ - { - type: "string", - }, - { - oneOf: [ - { - type: "object", - properties: { - source: { - type: "string", - const: "env", - }, - provider: { - type: "string", - pattern: "^[a-z][a-z0-9_-]{0,63}$", - }, - id: { - type: "string", - pattern: "^[A-Z][A-Z0-9_]{0,127}$", - }, - }, - required: ["source", "provider", "id"], - additionalProperties: false, - }, - { - type: "object", - properties: { - source: { - type: "string", - const: "file", - }, - provider: { - type: "string", - pattern: "^[a-z][a-z0-9_-]{0,63}$", - }, - id: { - type: "string", - }, - }, - required: ["source", "provider", "id"], - additionalProperties: false, - }, - { - type: "object", - properties: { - source: { - type: "string", - const: "exec", - }, - provider: { - type: "string", - pattern: "^[a-z][a-z0-9_-]{0,63}$", - }, - id: { - type: "string", - }, - }, - required: ["source", "provider", "id"], - additionalProperties: false, - }, - ], - }, - ], - }, - verificationToken: { - anyOf: [ - { - type: "string", - }, - { - oneOf: [ - { - type: "object", - properties: { - source: { - type: "string", - const: "env", - }, - provider: { - type: "string", - pattern: "^[a-z][a-z0-9_-]{0,63}$", - }, - id: { - type: "string", - pattern: "^[A-Z][A-Z0-9_]{0,127}$", - }, - }, - required: ["source", "provider", "id"], - additionalProperties: false, - }, - { - type: "object", - properties: { - source: { - type: "string", - const: "file", - }, - provider: { - type: "string", - pattern: "^[a-z][a-z0-9_-]{0,63}$", - }, - id: { - type: "string", - }, - }, - required: ["source", "provider", "id"], - additionalProperties: false, - }, - { - type: "object", - properties: { - source: { - type: "string", - const: "exec", - }, - provider: { - type: "string", - pattern: "^[a-z][a-z0-9_-]{0,63}$", - }, - id: { - type: "string", - }, - }, - required: ["source", "provider", "id"], - additionalProperties: false, - }, - ], - }, - ], - }, - domain: { - anyOf: [ - { - type: "string", - enum: ["feishu", "lark"], - }, - { - type: "string", - format: "uri", - pattern: "^https:\\/\\/.*", - }, - ], - }, - connectionMode: { - type: "string", - enum: ["websocket", "webhook"], - }, - webhookPath: { - type: "string", - }, - webhookHost: { - type: "string", - }, - webhookPort: { - type: "integer", - exclusiveMinimum: 0, - maximum: 9007199254740991, - }, - capabilities: { - type: "array", - items: { - type: "string", - }, - }, - markdown: { - type: "object", - properties: { - mode: { - type: "string", - enum: ["native", "escape", "strip"], - }, - tableMode: { - type: "string", - enum: ["native", "ascii", "simple"], - }, - }, - additionalProperties: false, - }, - configWrites: { - type: "boolean", - }, - dmPolicy: { - type: "string", - enum: ["open", "pairing", "allowlist"], - }, - allowFrom: { - type: "array", - items: { - anyOf: [ - { - type: "string", - }, - { - type: "number", - }, - ], - }, - }, - groupPolicy: { - anyOf: [ - { - type: "string", - enum: ["open", "allowlist", "disabled"], - }, - {}, - ], - }, - groupAllowFrom: { - type: "array", - items: { - anyOf: [ - { - type: "string", - }, - { - type: "number", - }, - ], - }, - }, - groupSenderAllowFrom: { - type: "array", - items: { - anyOf: [ - { - type: "string", - }, - { - type: "number", - }, - ], - }, - }, - requireMention: { - type: "boolean", - }, - groups: { - type: "object", - propertyNames: { - type: "string", - }, - additionalProperties: { - type: "object", - properties: { - requireMention: { - type: "boolean", - }, - tools: { - type: "object", - properties: { - allow: { - type: "array", - items: { - type: "string", - }, - }, - deny: { - type: "array", - items: { - type: "string", - }, - }, - }, - additionalProperties: false, - }, - skills: { - type: "array", - items: { - type: "string", - }, - }, - enabled: { - type: "boolean", - }, - allowFrom: { - type: "array", - items: { - anyOf: [ - { - type: "string", - }, - { - type: "number", - }, - ], - }, - }, - systemPrompt: { - type: "string", - }, - groupSessionScope: { - type: "string", - enum: ["group", "group_sender", "group_topic", "group_topic_sender"], - }, - topicSessionMode: { - type: "string", - enum: ["disabled", "enabled"], - }, - replyInThread: { - type: "string", - enum: ["disabled", "enabled"], - }, - }, - additionalProperties: false, - }, - }, - historyLimit: { - type: "integer", - minimum: 0, - maximum: 9007199254740991, - }, - dmHistoryLimit: { - type: "integer", - minimum: 0, - maximum: 9007199254740991, - }, - dms: { - type: "object", - propertyNames: { - type: "string", - }, - additionalProperties: { - type: "object", - properties: { - enabled: { - type: "boolean", - }, - systemPrompt: { - type: "string", - }, - }, - additionalProperties: false, - }, - }, - textChunkLimit: { - type: "integer", - exclusiveMinimum: 0, - maximum: 9007199254740991, - }, - chunkMode: { - type: "string", - enum: ["length", "newline"], - }, - blockStreaming: { - type: "boolean", - }, - blockStreamingCoalesce: { - type: "object", - properties: { - enabled: { - type: "boolean", - }, - minDelayMs: { - type: "integer", - exclusiveMinimum: 0, - maximum: 9007199254740991, - }, - maxDelayMs: { - type: "integer", - exclusiveMinimum: 0, - maximum: 9007199254740991, - }, - }, - additionalProperties: false, - }, - mediaMaxMb: { - type: "number", - exclusiveMinimum: 0, - }, - httpTimeoutMs: { - type: "integer", - exclusiveMinimum: 0, - maximum: 300000, - }, - heartbeat: { - type: "object", - properties: { - visibility: { - type: "string", - enum: ["visible", "hidden"], - }, - intervalMs: { - type: "integer", - exclusiveMinimum: 0, - maximum: 9007199254740991, - }, - }, - additionalProperties: false, - }, - renderMode: { - type: "string", - enum: ["auto", "raw", "card"], - }, - streaming: { - type: "boolean", - }, - tools: { - type: "object", - properties: { - doc: { - type: "boolean", - }, - chat: { - type: "boolean", - }, - wiki: { - type: "boolean", - }, - drive: { - type: "boolean", - }, - perm: { - type: "boolean", - }, - scopes: { - type: "boolean", - }, - }, - additionalProperties: false, - }, - actions: { - type: "object", - properties: { - reactions: { - type: "boolean", - }, - }, - additionalProperties: false, - }, - replyInThread: { - type: "string", - enum: ["disabled", "enabled"], - }, - reactionNotifications: { - type: "string", - enum: ["off", "own", "all"], - }, - typingIndicator: { - type: "boolean", - }, - resolveSenderNames: { - type: "boolean", - }, - tts: { - type: "object", - properties: { - auto: { - type: "string", - enum: ["off", "always", "inbound", "tagged"], - }, - enabled: { - type: "boolean", - }, - mode: { - type: "string", - enum: ["final", "all"], - }, - provider: { - type: "string", - }, - persona: { - type: "string", - }, - personas: { - type: "object", - propertyNames: { - type: "string", - }, - additionalProperties: { - type: "object", - propertyNames: { - type: "string", - }, - additionalProperties: {}, - }, - }, - summaryModel: { - type: "string", - }, - modelOverrides: { - type: "object", - propertyNames: { - type: "string", - }, - additionalProperties: {}, - }, - providers: { - type: "object", - propertyNames: { - type: "string", - }, - additionalProperties: { - type: "object", - propertyNames: { - type: "string", - }, - additionalProperties: {}, - }, - }, - prefsPath: { - type: "string", - }, - maxTextLength: { - type: "integer", - minimum: 1, - maximum: 9007199254740991, - }, - timeoutMs: { - type: "integer", - minimum: 1000, - maximum: 120000, - }, - }, - additionalProperties: false, - }, - groupSessionScope: { - type: "string", - enum: ["group", "group_sender", "group_topic", "group_topic_sender"], - }, - topicSessionMode: { - type: "string", - enum: ["disabled", "enabled"], - }, - }, - additionalProperties: false, - }, - }, - }, - required: [ - "domain", - "connectionMode", - "webhookPath", - "dmPolicy", - "groupPolicy", - "reactionNotifications", - "typingIndicator", - "resolveSenderNames", - ], - additionalProperties: false, - }, - }, - { - pluginId: "googlechat", - channelId: "googlechat", - label: "Google Chat", - description: "Google Workspace Chat app with HTTP webhook.", - schema: { - $schema: "http://json-schema.org/draft-07/schema#", - type: "object", - properties: { - name: { - type: "string", - }, - capabilities: { - type: "array", - items: { - type: "string", - }, - }, - enabled: { - type: "boolean", - }, - configWrites: { - type: "boolean", - }, - allowBots: { - type: "boolean", - }, - dangerouslyAllowNameMatching: { - type: "boolean", - }, - requireMention: { - type: "boolean", - }, - groupPolicy: { - default: "allowlist", - type: "string", - enum: ["open", "disabled", "allowlist"], - }, - groupAllowFrom: { - type: "array", - items: { - anyOf: [ - { - type: "string", - }, - { - type: "number", - }, - ], - }, - }, - groups: { - type: "object", - propertyNames: { - type: "string", - }, - additionalProperties: { - type: "object", - properties: { - enabled: { - type: "boolean", - }, - requireMention: { - type: "boolean", - }, - users: { - type: "array", - items: { - anyOf: [ - { - type: "string", - }, - { - type: "number", - }, - ], - }, - }, - systemPrompt: { - type: "string", - }, - }, - additionalProperties: false, - }, - }, - defaultTo: { - type: "string", - }, - serviceAccount: { - anyOf: [ - { - type: "string", - }, - { - type: "object", - propertyNames: { - type: "string", - }, - additionalProperties: {}, - }, - { - oneOf: [ - { - type: "object", - properties: { - source: { - type: "string", - const: "env", - }, - provider: { - type: "string", - pattern: "^[a-z][a-z0-9_-]{0,63}$", - }, - id: { - type: "string", - pattern: "^[A-Z][A-Z0-9_]{0,127}$", - }, - }, - required: ["source", "provider", "id"], - additionalProperties: false, - }, - { - type: "object", - properties: { - source: { - type: "string", - const: "file", - }, - provider: { - type: "string", - pattern: "^[a-z][a-z0-9_-]{0,63}$", - }, - id: { - type: "string", - }, - }, - required: ["source", "provider", "id"], - additionalProperties: false, - }, - { - type: "object", - properties: { - source: { - type: "string", - const: "exec", - }, - provider: { - type: "string", - pattern: "^[a-z][a-z0-9_-]{0,63}$", - }, - id: { - type: "string", - }, - }, - required: ["source", "provider", "id"], - additionalProperties: false, - }, - ], - }, - ], - }, - serviceAccountRef: { - oneOf: [ - { - type: "object", - properties: { - source: { - type: "string", - const: "env", - }, - provider: { - type: "string", - pattern: "^[a-z][a-z0-9_-]{0,63}$", - }, - id: { - type: "string", - pattern: "^[A-Z][A-Z0-9_]{0,127}$", - }, - }, - required: ["source", "provider", "id"], - additionalProperties: false, - }, - { - type: "object", - properties: { - source: { - type: "string", - const: "file", - }, - provider: { - type: "string", - pattern: "^[a-z][a-z0-9_-]{0,63}$", - }, - id: { - type: "string", - }, - }, - required: ["source", "provider", "id"], - additionalProperties: false, - }, - { - type: "object", - properties: { - source: { - type: "string", - const: "exec", - }, - provider: { - type: "string", - pattern: "^[a-z][a-z0-9_-]{0,63}$", - }, - id: { - type: "string", - }, - }, - required: ["source", "provider", "id"], - additionalProperties: false, - }, - ], - }, - serviceAccountFile: { - type: "string", - }, - audienceType: { - type: "string", - enum: ["app-url", "project-number"], - }, - audience: { - type: "string", - }, - appPrincipal: { - type: "string", - }, - webhookPath: { - type: "string", - }, - webhookUrl: { - type: "string", - }, - botUser: { - type: "string", - }, - historyLimit: { - type: "integer", - minimum: 0, - maximum: 9007199254740991, - }, - dmHistoryLimit: { - type: "integer", - minimum: 0, - maximum: 9007199254740991, - }, - dms: { - type: "object", - propertyNames: { - type: "string", - }, - additionalProperties: { - type: "object", - properties: { - historyLimit: { - type: "integer", - minimum: 0, - maximum: 9007199254740991, - }, - }, - additionalProperties: false, - }, - }, - textChunkLimit: { - type: "integer", - exclusiveMinimum: 0, - maximum: 9007199254740991, - }, - chunkMode: { - type: "string", - enum: ["length", "newline"], - }, - blockStreaming: { - type: "boolean", - }, - blockStreamingCoalesce: { - type: "object", - properties: { - minChars: { - type: "integer", - exclusiveMinimum: 0, - maximum: 9007199254740991, - }, - maxChars: { - type: "integer", - exclusiveMinimum: 0, - maximum: 9007199254740991, - }, - idleMs: { - type: "integer", - minimum: 0, - maximum: 9007199254740991, - }, - }, - additionalProperties: false, - }, - mediaMaxMb: { - type: "number", - exclusiveMinimum: 0, - }, - replyToMode: { - anyOf: [ - { - type: "string", - const: "off", - }, - { - type: "string", - const: "first", - }, - { - type: "string", - const: "all", - }, - { - type: "string", - const: "batched", - }, - ], - }, - actions: { - type: "object", - properties: { - reactions: { - type: "boolean", - }, - }, - additionalProperties: false, - }, - dm: { - type: "object", - properties: { - enabled: { - type: "boolean", - }, - policy: { - default: "pairing", - type: "string", - enum: ["pairing", "allowlist", "open", "disabled"], - }, - allowFrom: { - type: "array", - items: { - anyOf: [ - { - type: "string", - }, - { - type: "number", - }, - ], - }, - }, - }, - required: ["policy"], - additionalProperties: false, - }, - healthMonitor: { - type: "object", - properties: { - enabled: { - type: "boolean", - }, - }, - additionalProperties: false, - }, - typingIndicator: { - type: "string", - enum: ["none", "message", "reaction"], - }, - responsePrefix: { - type: "string", - }, - accounts: { - type: "object", - propertyNames: { - type: "string", - }, - additionalProperties: { - type: "object", - properties: { - name: { - type: "string", - }, - capabilities: { - type: "array", - items: { - type: "string", - }, - }, - enabled: { - type: "boolean", - }, - configWrites: { - type: "boolean", - }, - allowBots: { - type: "boolean", - }, - dangerouslyAllowNameMatching: { - type: "boolean", - }, - requireMention: { - type: "boolean", - }, - groupPolicy: { - default: "allowlist", - type: "string", - enum: ["open", "disabled", "allowlist"], - }, - groupAllowFrom: { - type: "array", - items: { - anyOf: [ - { - type: "string", - }, - { - type: "number", - }, - ], - }, - }, - groups: { - type: "object", - propertyNames: { - type: "string", - }, - additionalProperties: { - type: "object", - properties: { - enabled: { - type: "boolean", - }, - requireMention: { - type: "boolean", - }, - users: { - type: "array", - items: { - anyOf: [ - { - type: "string", - }, - { - type: "number", - }, - ], - }, - }, - systemPrompt: { - type: "string", - }, - }, - additionalProperties: false, - }, - }, - defaultTo: { - type: "string", - }, - serviceAccount: { - anyOf: [ - { - type: "string", - }, - { - type: "object", - propertyNames: { - type: "string", - }, - additionalProperties: {}, - }, - { - oneOf: [ - { - type: "object", - properties: { - source: { - type: "string", - const: "env", - }, - provider: { - type: "string", - pattern: "^[a-z][a-z0-9_-]{0,63}$", - }, - id: { - type: "string", - pattern: "^[A-Z][A-Z0-9_]{0,127}$", - }, - }, - required: ["source", "provider", "id"], - additionalProperties: false, - }, - { - type: "object", - properties: { - source: { - type: "string", - const: "file", - }, - provider: { - type: "string", - pattern: "^[a-z][a-z0-9_-]{0,63}$", - }, - id: { - type: "string", - }, - }, - required: ["source", "provider", "id"], - additionalProperties: false, - }, - { - type: "object", - properties: { - source: { - type: "string", - const: "exec", - }, - provider: { - type: "string", - pattern: "^[a-z][a-z0-9_-]{0,63}$", - }, - id: { - type: "string", - }, - }, - required: ["source", "provider", "id"], - additionalProperties: false, - }, - ], - }, - ], - }, - serviceAccountRef: { - oneOf: [ - { - type: "object", - properties: { - source: { - type: "string", - const: "env", - }, - provider: { - type: "string", - pattern: "^[a-z][a-z0-9_-]{0,63}$", - }, - id: { - type: "string", - pattern: "^[A-Z][A-Z0-9_]{0,127}$", - }, - }, - required: ["source", "provider", "id"], - additionalProperties: false, - }, - { - type: "object", - properties: { - source: { - type: "string", - const: "file", - }, - provider: { - type: "string", - pattern: "^[a-z][a-z0-9_-]{0,63}$", - }, - id: { - type: "string", - }, - }, - required: ["source", "provider", "id"], - additionalProperties: false, - }, - { - type: "object", - properties: { - source: { - type: "string", - const: "exec", - }, - provider: { - type: "string", - pattern: "^[a-z][a-z0-9_-]{0,63}$", - }, - id: { - type: "string", - }, - }, - required: ["source", "provider", "id"], - additionalProperties: false, - }, - ], - }, - serviceAccountFile: { - type: "string", - }, - audienceType: { - type: "string", - enum: ["app-url", "project-number"], - }, - audience: { - type: "string", - }, - appPrincipal: { - type: "string", - }, - webhookPath: { - type: "string", - }, - webhookUrl: { - type: "string", - }, - botUser: { - type: "string", - }, - historyLimit: { - type: "integer", - minimum: 0, - maximum: 9007199254740991, - }, - dmHistoryLimit: { - type: "integer", - minimum: 0, - maximum: 9007199254740991, - }, - dms: { - type: "object", - propertyNames: { - type: "string", - }, - additionalProperties: { - type: "object", - properties: { - historyLimit: { - type: "integer", - minimum: 0, - maximum: 9007199254740991, - }, - }, - additionalProperties: false, - }, - }, - textChunkLimit: { - type: "integer", - exclusiveMinimum: 0, - maximum: 9007199254740991, - }, - chunkMode: { - type: "string", - enum: ["length", "newline"], - }, - blockStreaming: { - type: "boolean", - }, - blockStreamingCoalesce: { - type: "object", - properties: { - minChars: { - type: "integer", - exclusiveMinimum: 0, - maximum: 9007199254740991, - }, - maxChars: { - type: "integer", - exclusiveMinimum: 0, - maximum: 9007199254740991, - }, - idleMs: { - type: "integer", - minimum: 0, - maximum: 9007199254740991, - }, - }, - additionalProperties: false, - }, - mediaMaxMb: { - type: "number", - exclusiveMinimum: 0, - }, - replyToMode: { - anyOf: [ - { - type: "string", - const: "off", - }, - { - type: "string", - const: "first", - }, - { - type: "string", - const: "all", - }, - { - type: "string", - const: "batched", - }, - ], - }, - actions: { - type: "object", - properties: { - reactions: { - type: "boolean", - }, - }, - additionalProperties: false, - }, - dm: { - type: "object", - properties: { - enabled: { - type: "boolean", - }, - policy: { - default: "pairing", - type: "string", - enum: ["pairing", "allowlist", "open", "disabled"], - }, - allowFrom: { - type: "array", - items: { - anyOf: [ - { - type: "string", - }, - { - type: "number", - }, - ], - }, - }, - }, - required: ["policy"], - additionalProperties: false, - }, - healthMonitor: { - type: "object", - properties: { - enabled: { - type: "boolean", - }, - }, - additionalProperties: false, - }, - typingIndicator: { - type: "string", - enum: ["none", "message", "reaction"], - }, - responsePrefix: { - type: "string", - }, - }, - required: ["groupPolicy"], - additionalProperties: false, - }, - }, - defaultAccount: { - type: "string", - }, - }, - required: ["groupPolicy"], - additionalProperties: false, - }, - }, - { - pluginId: "imessage", - channelId: "imessage", - label: "iMessage", - description: "this is still a work in progress.", - schema: { - $schema: "http://json-schema.org/draft-07/schema#", - type: "object", - properties: { - name: { - type: "string", - }, - capabilities: { - type: "array", - items: { - type: "string", - }, - }, - markdown: { - type: "object", - properties: { - tables: { - type: "string", - enum: ["off", "bullets", "code", "block"], - }, - }, - additionalProperties: false, - }, - enabled: { - type: "boolean", - }, - configWrites: { - type: "boolean", - }, - cliPath: { - type: "string", - }, - dbPath: { - type: "string", - }, - remoteHost: { - type: "string", - }, - service: { - anyOf: [ - { - type: "string", - const: "imessage", - }, - { - type: "string", - const: "sms", - }, - { - type: "string", - const: "auto", - }, - ], - }, - region: { - type: "string", - }, - dmPolicy: { - default: "pairing", - type: "string", - enum: ["pairing", "allowlist", "open", "disabled"], - }, - allowFrom: { - type: "array", - items: { - anyOf: [ - { - type: "string", - }, - { - type: "number", - }, - ], - }, - }, - defaultTo: { - type: "string", - }, - groupAllowFrom: { - type: "array", - items: { - anyOf: [ - { - type: "string", - }, - { - type: "number", - }, - ], - }, - }, - groupPolicy: { - default: "allowlist", - type: "string", - enum: ["open", "disabled", "allowlist"], - }, - contextVisibility: { - type: "string", - enum: ["all", "allowlist", "allowlist_quote"], - }, - historyLimit: { - type: "integer", - minimum: 0, - maximum: 9007199254740991, - }, - dmHistoryLimit: { - type: "integer", - minimum: 0, - maximum: 9007199254740991, - }, - dms: { - type: "object", - propertyNames: { - type: "string", - }, - additionalProperties: { - type: "object", - properties: { - historyLimit: { - type: "integer", - minimum: 0, - maximum: 9007199254740991, - }, - }, - additionalProperties: false, - }, - }, - includeAttachments: { - type: "boolean", - }, - attachmentRoots: { - type: "array", - items: { - type: "string", - }, - }, - remoteAttachmentRoots: { - type: "array", - items: { - type: "string", - }, - }, - mediaMaxMb: { - type: "integer", - exclusiveMinimum: 0, - maximum: 9007199254740991, - }, - textChunkLimit: { - type: "integer", - exclusiveMinimum: 0, - maximum: 9007199254740991, - }, - chunkMode: { - type: "string", - enum: ["length", "newline"], - }, - blockStreaming: { - type: "boolean", - }, - blockStreamingCoalesce: { - type: "object", - properties: { - minChars: { - type: "integer", - exclusiveMinimum: 0, - maximum: 9007199254740991, - }, - maxChars: { - type: "integer", - exclusiveMinimum: 0, - maximum: 9007199254740991, - }, - idleMs: { - type: "integer", - minimum: 0, - maximum: 9007199254740991, - }, - }, - additionalProperties: false, - }, - groups: { - type: "object", - propertyNames: { - type: "string", - }, - additionalProperties: { - type: "object", - properties: { - requireMention: { - type: "boolean", - }, - tools: { - type: "object", - properties: { - allow: { - type: "array", - items: { - type: "string", - }, - }, - alsoAllow: { - type: "array", - items: { - type: "string", - }, - }, - deny: { - type: "array", - items: { - type: "string", - }, - }, - }, - additionalProperties: false, - }, - toolsBySender: { - type: "object", - propertyNames: { - type: "string", - }, - additionalProperties: { - type: "object", - properties: { - allow: { - type: "array", - items: { - type: "string", - }, - }, - alsoAllow: { - type: "array", - items: { - type: "string", - }, - }, - deny: { - type: "array", - items: { - type: "string", - }, - }, - }, - additionalProperties: false, - }, - }, - }, - additionalProperties: false, - }, - }, - heartbeat: { - type: "object", - properties: { - showOk: { - type: "boolean", - }, - showAlerts: { - type: "boolean", - }, - useIndicator: { - type: "boolean", - }, - }, - additionalProperties: false, - }, - healthMonitor: { - type: "object", - properties: { - enabled: { - type: "boolean", - }, - }, - additionalProperties: false, - }, - responsePrefix: { - type: "string", - }, - accounts: { - type: "object", - propertyNames: { - type: "string", - }, - additionalProperties: { - type: "object", - properties: { - name: { - type: "string", - }, - capabilities: { - type: "array", - items: { - type: "string", - }, - }, - markdown: { - type: "object", - properties: { - tables: { - type: "string", - enum: ["off", "bullets", "code", "block"], - }, - }, - additionalProperties: false, - }, - enabled: { - type: "boolean", - }, - configWrites: { - type: "boolean", - }, - cliPath: { - type: "string", - }, - dbPath: { - type: "string", - }, - remoteHost: { - type: "string", - }, - service: { - anyOf: [ - { - type: "string", - const: "imessage", - }, - { - type: "string", - const: "sms", - }, - { - type: "string", - const: "auto", - }, - ], - }, - region: { - type: "string", - }, - dmPolicy: { - default: "pairing", - type: "string", - enum: ["pairing", "allowlist", "open", "disabled"], - }, - allowFrom: { - type: "array", - items: { - anyOf: [ - { - type: "string", - }, - { - type: "number", - }, - ], - }, - }, - defaultTo: { - type: "string", - }, - groupAllowFrom: { - type: "array", - items: { - anyOf: [ - { - type: "string", - }, - { - type: "number", - }, - ], - }, - }, - groupPolicy: { - default: "allowlist", - type: "string", - enum: ["open", "disabled", "allowlist"], - }, - contextVisibility: { - type: "string", - enum: ["all", "allowlist", "allowlist_quote"], - }, - historyLimit: { - type: "integer", - minimum: 0, - maximum: 9007199254740991, - }, - dmHistoryLimit: { - type: "integer", - minimum: 0, - maximum: 9007199254740991, - }, - dms: { - type: "object", - propertyNames: { - type: "string", - }, - additionalProperties: { - type: "object", - properties: { - historyLimit: { - type: "integer", - minimum: 0, - maximum: 9007199254740991, - }, - }, - additionalProperties: false, - }, - }, - includeAttachments: { - type: "boolean", - }, - attachmentRoots: { - type: "array", - items: { - type: "string", - }, - }, - remoteAttachmentRoots: { - type: "array", - items: { - type: "string", - }, - }, - mediaMaxMb: { - type: "integer", - exclusiveMinimum: 0, - maximum: 9007199254740991, - }, - textChunkLimit: { - type: "integer", - exclusiveMinimum: 0, - maximum: 9007199254740991, - }, - chunkMode: { - type: "string", - enum: ["length", "newline"], - }, - blockStreaming: { - type: "boolean", - }, - blockStreamingCoalesce: { - type: "object", - properties: { - minChars: { - type: "integer", - exclusiveMinimum: 0, - maximum: 9007199254740991, - }, - maxChars: { - type: "integer", - exclusiveMinimum: 0, - maximum: 9007199254740991, - }, - idleMs: { - type: "integer", - minimum: 0, - maximum: 9007199254740991, - }, - }, - additionalProperties: false, - }, - groups: { - type: "object", - propertyNames: { - type: "string", - }, - additionalProperties: { - type: "object", - properties: { - requireMention: { - type: "boolean", - }, - tools: { - type: "object", - properties: { - allow: { - type: "array", - items: { - type: "string", - }, - }, - alsoAllow: { - type: "array", - items: { - type: "string", - }, - }, - deny: { - type: "array", - items: { - type: "string", - }, - }, - }, - additionalProperties: false, - }, - toolsBySender: { - type: "object", - propertyNames: { - type: "string", - }, - additionalProperties: { - type: "object", - properties: { - allow: { - type: "array", - items: { - type: "string", - }, - }, - alsoAllow: { - type: "array", - items: { - type: "string", - }, - }, - deny: { - type: "array", - items: { - type: "string", - }, - }, - }, - additionalProperties: false, - }, - }, - }, - additionalProperties: false, - }, - }, - heartbeat: { - type: "object", - properties: { - showOk: { - type: "boolean", - }, - showAlerts: { - type: "boolean", - }, - useIndicator: { - type: "boolean", - }, - }, - additionalProperties: false, - }, - healthMonitor: { - type: "object", - properties: { - enabled: { - type: "boolean", - }, - }, - additionalProperties: false, - }, - responsePrefix: { - type: "string", - }, - }, - required: ["dmPolicy", "groupPolicy"], - additionalProperties: false, - }, - }, - defaultAccount: { - type: "string", - }, - }, - required: ["dmPolicy", "groupPolicy"], - additionalProperties: false, - }, - uiHints: { - "": { - label: "iMessage", - help: "iMessage channel provider configuration for CLI integration and DM access policy handling. Use explicit CLI paths when runtime environments have non-standard binary locations.", - }, - dmPolicy: { - label: "iMessage DM Policy", - help: 'Direct message access control ("pairing" recommended). "open" requires channels.imessage.allowFrom=["*"].', - }, - configWrites: { - label: "iMessage Config Writes", - help: "Allow iMessage to write config in response to channel events/commands (default: true).", - }, - cliPath: { - label: "iMessage CLI Path", - help: "Filesystem path to the iMessage bridge CLI binary used for send/receive operations. Set explicitly when the binary is not on PATH in service runtime environments.", - }, - }, - }, - { - pluginId: "irc", - channelId: "irc", - label: "IRC", - description: "classic IRC networks with DM/channel routing and pairing controls.", - schema: { - $schema: "http://json-schema.org/draft-07/schema#", - type: "object", - properties: { - name: { - type: "string", - }, - enabled: { - type: "boolean", - }, - dangerouslyAllowNameMatching: { - type: "boolean", - }, - host: { - type: "string", - }, - port: { - type: "integer", - minimum: 1, - maximum: 65535, - }, - tls: { - type: "boolean", - }, - nick: { - type: "string", - }, - username: { - type: "string", - }, - realname: { - type: "string", - }, - password: { - type: "string", - }, - passwordFile: { - type: "string", - }, - nickserv: { - type: "object", - properties: { - enabled: { - type: "boolean", - }, - service: { - type: "string", - }, - password: { - type: "string", - }, - passwordFile: { - type: "string", - }, - register: { - type: "boolean", - }, - registerEmail: { - type: "string", - }, - }, - additionalProperties: false, - }, - dmPolicy: { - default: "pairing", - type: "string", - enum: ["pairing", "allowlist", "open", "disabled"], - }, - allowFrom: { - type: "array", - items: { - anyOf: [ - { - type: "string", - }, - { - type: "number", - }, - ], - }, - }, - groupPolicy: { - default: "allowlist", - type: "string", - enum: ["open", "disabled", "allowlist"], - }, - groupAllowFrom: { - type: "array", - items: { - anyOf: [ - { - type: "string", - }, - { - type: "number", - }, - ], - }, - }, - groups: { - type: "object", - propertyNames: { - type: "string", - }, - additionalProperties: { - type: "object", - properties: { - requireMention: { - type: "boolean", - }, - tools: { - type: "object", - properties: { - allow: { - type: "array", - items: { - type: "string", - }, - }, - alsoAllow: { - type: "array", - items: { - type: "string", - }, - }, - deny: { - type: "array", - items: { - type: "string", - }, - }, - }, - additionalProperties: false, - }, - toolsBySender: { - type: "object", - propertyNames: { - type: "string", - }, - additionalProperties: { - type: "object", - properties: { - allow: { - type: "array", - items: { - type: "string", - }, - }, - alsoAllow: { - type: "array", - items: { - type: "string", - }, - }, - deny: { - type: "array", - items: { - type: "string", - }, - }, - }, - additionalProperties: false, - }, - }, - skills: { - type: "array", - items: { - type: "string", - }, - }, - enabled: { - type: "boolean", - }, - allowFrom: { - type: "array", - items: { - anyOf: [ - { - type: "string", - }, - { - type: "number", - }, - ], - }, - }, - systemPrompt: { - type: "string", - }, - }, - additionalProperties: false, - }, - }, - channels: { - type: "array", - items: { - type: "string", - }, - }, - mentionPatterns: { - type: "array", - items: { - type: "string", - }, - }, - markdown: { - type: "object", - properties: { - tables: { - type: "string", - enum: ["off", "bullets", "code", "block"], - }, - }, - additionalProperties: false, - }, - historyLimit: { - type: "integer", - minimum: 0, - maximum: 9007199254740991, - }, - dmHistoryLimit: { - type: "integer", - minimum: 0, - maximum: 9007199254740991, - }, - contextVisibility: { - type: "string", - enum: ["all", "allowlist", "allowlist_quote"], - }, - dms: { - type: "object", - propertyNames: { - type: "string", - }, - additionalProperties: { - type: "object", - properties: { - historyLimit: { - type: "integer", - minimum: 0, - maximum: 9007199254740991, - }, - }, - additionalProperties: false, - }, - }, - textChunkLimit: { - type: "integer", - exclusiveMinimum: 0, - maximum: 9007199254740991, - }, - chunkMode: { - type: "string", - enum: ["length", "newline"], - }, - blockStreaming: { - type: "boolean", - }, - blockStreamingCoalesce: { - type: "object", - properties: { - minChars: { - type: "integer", - exclusiveMinimum: 0, - maximum: 9007199254740991, - }, - maxChars: { - type: "integer", - exclusiveMinimum: 0, - maximum: 9007199254740991, - }, - idleMs: { - type: "integer", - minimum: 0, - maximum: 9007199254740991, - }, - }, - additionalProperties: false, - }, - responsePrefix: { - type: "string", - }, - mediaMaxMb: { - type: "number", - exclusiveMinimum: 0, - }, - accounts: { - type: "object", - propertyNames: { - type: "string", - }, - additionalProperties: { - type: "object", - properties: { - name: { - type: "string", - }, - enabled: { - type: "boolean", - }, - dangerouslyAllowNameMatching: { - type: "boolean", - }, - host: { - type: "string", - }, - port: { - type: "integer", - minimum: 1, - maximum: 65535, - }, - tls: { - type: "boolean", - }, - nick: { - type: "string", - }, - username: { - type: "string", - }, - realname: { - type: "string", - }, - password: { - type: "string", - }, - passwordFile: { - type: "string", - }, - nickserv: { - type: "object", - properties: { - enabled: { - type: "boolean", - }, - service: { - type: "string", - }, - password: { - type: "string", - }, - passwordFile: { - type: "string", - }, - register: { - type: "boolean", - }, - registerEmail: { - type: "string", - }, - }, - additionalProperties: false, - }, - dmPolicy: { - default: "pairing", - type: "string", - enum: ["pairing", "allowlist", "open", "disabled"], - }, - allowFrom: { - type: "array", - items: { - anyOf: [ - { - type: "string", - }, - { - type: "number", - }, - ], - }, - }, - groupPolicy: { - default: "allowlist", - type: "string", - enum: ["open", "disabled", "allowlist"], - }, - groupAllowFrom: { - type: "array", - items: { - anyOf: [ - { - type: "string", - }, - { - type: "number", - }, - ], - }, - }, - groups: { - type: "object", - propertyNames: { - type: "string", - }, - additionalProperties: { - type: "object", - properties: { - requireMention: { - type: "boolean", - }, - tools: { - type: "object", - properties: { - allow: { - type: "array", - items: { - type: "string", - }, - }, - alsoAllow: { - type: "array", - items: { - type: "string", - }, - }, - deny: { - type: "array", - items: { - type: "string", - }, - }, - }, - additionalProperties: false, - }, - toolsBySender: { - type: "object", - propertyNames: { - type: "string", - }, - additionalProperties: { - type: "object", - properties: { - allow: { - type: "array", - items: { - type: "string", - }, - }, - alsoAllow: { - type: "array", - items: { - type: "string", - }, - }, - deny: { - type: "array", - items: { - type: "string", - }, - }, - }, - additionalProperties: false, - }, - }, - skills: { - type: "array", - items: { - type: "string", - }, - }, - enabled: { - type: "boolean", - }, - allowFrom: { - type: "array", - items: { - anyOf: [ - { - type: "string", - }, - { - type: "number", - }, - ], - }, - }, - systemPrompt: { - type: "string", - }, - }, - additionalProperties: false, - }, - }, - channels: { - type: "array", - items: { - type: "string", - }, - }, - mentionPatterns: { - type: "array", - items: { - type: "string", - }, - }, - markdown: { - type: "object", - properties: { - tables: { - type: "string", - enum: ["off", "bullets", "code", "block"], - }, - }, - additionalProperties: false, - }, - historyLimit: { - type: "integer", - minimum: 0, - maximum: 9007199254740991, - }, - dmHistoryLimit: { - type: "integer", - minimum: 0, - maximum: 9007199254740991, - }, - contextVisibility: { - type: "string", - enum: ["all", "allowlist", "allowlist_quote"], - }, - dms: { - type: "object", - propertyNames: { - type: "string", - }, - additionalProperties: { - type: "object", - properties: { - historyLimit: { - type: "integer", - minimum: 0, - maximum: 9007199254740991, - }, - }, - additionalProperties: false, - }, - }, - textChunkLimit: { - type: "integer", - exclusiveMinimum: 0, - maximum: 9007199254740991, - }, - chunkMode: { - type: "string", - enum: ["length", "newline"], - }, - blockStreaming: { - type: "boolean", - }, - blockStreamingCoalesce: { - type: "object", - properties: { - minChars: { - type: "integer", - exclusiveMinimum: 0, - maximum: 9007199254740991, - }, - maxChars: { - type: "integer", - exclusiveMinimum: 0, - maximum: 9007199254740991, - }, - idleMs: { - type: "integer", - minimum: 0, - maximum: 9007199254740991, - }, - }, - additionalProperties: false, - }, - responsePrefix: { - type: "string", - }, - mediaMaxMb: { - type: "number", - exclusiveMinimum: 0, - }, - }, - required: ["dmPolicy", "groupPolicy"], - additionalProperties: false, - }, - }, - defaultAccount: { - type: "string", - }, - }, - required: ["dmPolicy", "groupPolicy"], - additionalProperties: false, - }, - uiHints: { - "": { - label: "IRC", - help: "IRC channel provider configuration and compatibility settings for classic IRC transport workflows. Use this section when bridging legacy chat infrastructure into OpenClaw.", - }, - dmPolicy: { - label: "IRC DM Policy", - help: 'Direct message access control ("pairing" recommended). "open" requires channels.irc.allowFrom=["*"].', - }, - "nickserv.enabled": { - label: "IRC NickServ Enabled", - help: "Enable NickServ identify/register after connect (defaults to enabled when password is configured).", - }, - "nickserv.service": { - label: "IRC NickServ Service", - help: "NickServ service nick (default: NickServ).", - }, - "nickserv.password": { - label: "IRC NickServ Password", - help: "NickServ password used for IDENTIFY/REGISTER (sensitive).", - }, - "nickserv.passwordFile": { - label: "IRC NickServ Password File", - help: "Optional file path containing NickServ password.", - }, - "nickserv.register": { - label: "IRC NickServ Register", - help: "If true, send NickServ REGISTER on every connect. Use once for initial registration, then disable.", - }, - "nickserv.registerEmail": { - label: "IRC NickServ Register Email", - help: "Email used with NickServ REGISTER (required when register=true).", - }, - configWrites: { - label: "IRC Config Writes", - help: "Allow IRC to write config in response to channel events/commands (default: true).", - }, - }, - }, - { - pluginId: "line", - channelId: "line", - label: "LINE", - description: "LINE Messaging API webhook bot.", - schema: { - $schema: "http://json-schema.org/draft-07/schema#", - type: "object", - properties: { - enabled: { - type: "boolean", - }, - channelAccessToken: { - type: "string", - }, - channelSecret: { - type: "string", - }, - tokenFile: { - type: "string", - }, - secretFile: { - type: "string", - }, - name: { - type: "string", - }, - allowFrom: { - type: "array", - items: { - anyOf: [ - { - type: "string", - }, - { - type: "number", - }, - ], - }, - }, - groupAllowFrom: { - type: "array", - items: { - anyOf: [ - { - type: "string", - }, - { - type: "number", - }, - ], - }, - }, - dmPolicy: { - default: "pairing", - type: "string", - enum: ["open", "allowlist", "pairing", "disabled"], - }, - groupPolicy: { - default: "allowlist", - type: "string", - enum: ["open", "allowlist", "disabled"], - }, - responsePrefix: { - type: "string", - }, - mediaMaxMb: { - type: "number", - }, - webhookPath: { - type: "string", - }, - threadBindings: { - type: "object", - properties: { - enabled: { - type: "boolean", - }, - idleHours: { - type: "number", - }, - maxAgeHours: { - type: "number", - }, - spawnSessions: { - type: "boolean", - }, - defaultSpawnContext: { - type: "string", - enum: ["isolated", "fork"], - }, - spawnSubagentSessions: { - type: "boolean", - }, - spawnAcpSessions: { - type: "boolean", - }, - }, - additionalProperties: false, - }, - accounts: { - type: "object", - propertyNames: { - type: "string", - }, - additionalProperties: { - type: "object", - properties: { - enabled: { - type: "boolean", - }, - channelAccessToken: { - type: "string", - }, - channelSecret: { - type: "string", - }, - tokenFile: { - type: "string", - }, - secretFile: { - type: "string", - }, - name: { - type: "string", - }, - allowFrom: { - type: "array", - items: { - anyOf: [ - { - type: "string", - }, - { - type: "number", - }, - ], - }, - }, - groupAllowFrom: { - type: "array", - items: { - anyOf: [ - { - type: "string", - }, - { - type: "number", - }, - ], - }, - }, - dmPolicy: { - default: "pairing", - type: "string", - enum: ["open", "allowlist", "pairing", "disabled"], - }, - groupPolicy: { - default: "allowlist", - type: "string", - enum: ["open", "allowlist", "disabled"], - }, - responsePrefix: { - type: "string", - }, - mediaMaxMb: { - type: "number", - }, - webhookPath: { - type: "string", - }, - threadBindings: { - type: "object", - properties: { - enabled: { - type: "boolean", - }, - idleHours: { - type: "number", - }, - maxAgeHours: { - type: "number", - }, - spawnSessions: { - type: "boolean", - }, - defaultSpawnContext: { - type: "string", - enum: ["isolated", "fork"], - }, - spawnSubagentSessions: { - type: "boolean", - }, - spawnAcpSessions: { - type: "boolean", - }, - }, - additionalProperties: false, - }, - groups: { - type: "object", - propertyNames: { - type: "string", - }, - additionalProperties: { - type: "object", - properties: { - enabled: { - type: "boolean", - }, - allowFrom: { - type: "array", - items: { - anyOf: [ - { - type: "string", - }, - { - type: "number", - }, - ], - }, - }, - requireMention: { - type: "boolean", - }, - systemPrompt: { - type: "string", - }, - skills: { - type: "array", - items: { - type: "string", - }, - }, - }, - additionalProperties: false, - }, - }, - }, - required: ["dmPolicy", "groupPolicy"], - additionalProperties: false, - }, - }, - defaultAccount: { - type: "string", - }, - groups: { - type: "object", - propertyNames: { - type: "string", - }, - additionalProperties: { - type: "object", - properties: { - enabled: { - type: "boolean", - }, - allowFrom: { - type: "array", - items: { - anyOf: [ - { - type: "string", - }, - { - type: "number", - }, - ], - }, - }, - requireMention: { - type: "boolean", - }, - systemPrompt: { - type: "string", - }, - skills: { - type: "array", - items: { - type: "string", - }, - }, - }, - additionalProperties: false, - }, - }, - }, - required: ["dmPolicy", "groupPolicy"], - additionalProperties: false, - }, - }, - { - pluginId: "matrix", - channelId: "matrix", - label: "Matrix", - description: "open protocol; install the plugin to enable.", - schema: { - $schema: "http://json-schema.org/draft-07/schema#", - type: "object", - properties: { - name: { - type: "string", - }, - enabled: { - type: "boolean", - }, - defaultAccount: { - type: "string", - }, - accounts: { - type: "object", - propertyNames: { - type: "string", - }, - additionalProperties: {}, - }, - markdown: { - type: "object", - properties: { - tables: { - type: "string", - enum: ["off", "bullets", "code", "block"], - }, - }, - additionalProperties: false, - }, - homeserver: { - type: "string", - }, - network: { - type: "object", - properties: { - dangerouslyAllowPrivateNetwork: { - type: "boolean", - }, - }, - additionalProperties: false, - }, - proxy: { - type: "string", - }, - userId: { - type: "string", - }, - accessToken: { - anyOf: [ - { - type: "string", - }, - { - oneOf: [ - { - type: "object", - properties: { - source: { - type: "string", - const: "env", - }, - provider: { - type: "string", - pattern: "^[a-z][a-z0-9_-]{0,63}$", - }, - id: { - type: "string", - pattern: "^[A-Z][A-Z0-9_]{0,127}$", - }, - }, - required: ["source", "provider", "id"], - additionalProperties: false, - }, - { - type: "object", - properties: { - source: { - type: "string", - const: "file", - }, - provider: { - type: "string", - pattern: "^[a-z][a-z0-9_-]{0,63}$", - }, - id: { - type: "string", - }, - }, - required: ["source", "provider", "id"], - additionalProperties: false, - }, - { - type: "object", - properties: { - source: { - type: "string", - const: "exec", - }, - provider: { - type: "string", - pattern: "^[a-z][a-z0-9_-]{0,63}$", - }, - id: { - type: "string", - }, - }, - required: ["source", "provider", "id"], - additionalProperties: false, - }, - ], - }, - ], - }, - password: { - anyOf: [ - { - type: "string", - }, - { - oneOf: [ - { - type: "object", - properties: { - source: { - type: "string", - const: "env", - }, - provider: { - type: "string", - pattern: "^[a-z][a-z0-9_-]{0,63}$", - }, - id: { - type: "string", - pattern: "^[A-Z][A-Z0-9_]{0,127}$", - }, - }, - required: ["source", "provider", "id"], - additionalProperties: false, - }, - { - type: "object", - properties: { - source: { - type: "string", - const: "file", - }, - provider: { - type: "string", - pattern: "^[a-z][a-z0-9_-]{0,63}$", - }, - id: { - type: "string", - }, - }, - required: ["source", "provider", "id"], - additionalProperties: false, - }, - { - type: "object", - properties: { - source: { - type: "string", - const: "exec", - }, - provider: { - type: "string", - pattern: "^[a-z][a-z0-9_-]{0,63}$", - }, - id: { - type: "string", - }, - }, - required: ["source", "provider", "id"], - additionalProperties: false, - }, - ], - }, - ], - }, - deviceId: { - type: "string", - }, - deviceName: { - type: "string", - }, - avatarUrl: { - type: "string", - }, - initialSyncLimit: { - type: "number", - }, - encryption: { - type: "boolean", - }, - allowlistOnly: { - type: "boolean", - }, - allowBots: { - anyOf: [ - { - type: "boolean", - }, - { - type: "string", - const: "mentions", - }, - ], - }, - groupPolicy: { - type: "string", - enum: ["open", "disabled", "allowlist"], - }, - contextVisibility: { - type: "string", - enum: ["all", "allowlist", "allowlist_quote"], - }, - blockStreaming: { - type: "boolean", - }, - streaming: { - anyOf: [ - { - type: "string", - enum: ["partial", "quiet", "progress", "off"], - }, - { - type: "boolean", - }, - { - type: "object", - properties: { - mode: { - type: "string", - enum: ["partial", "quiet", "progress", "off"], - }, - progress: { - type: "object", - properties: { - label: { - anyOf: [ - { - type: "string", - }, - { - type: "boolean", - const: false, - }, - ], - }, - labels: { - type: "array", - items: { - type: "string", - }, - }, - maxLines: { - type: "integer", - exclusiveMinimum: 0, - maximum: 9007199254740991, - }, - toolProgress: { - type: "boolean", - }, - }, - additionalProperties: false, - }, - preview: { - type: "object", - properties: { - toolProgress: { - type: "boolean", - }, - }, - additionalProperties: false, - }, - }, - additionalProperties: false, - }, - ], - }, - replyToMode: { - type: "string", - enum: ["off", "first", "all", "batched"], - }, - threadReplies: { - type: "string", - enum: ["off", "inbound", "always"], - }, - textChunkLimit: { - type: "number", - }, - chunkMode: { - type: "string", - enum: ["length", "newline"], - }, - responsePrefix: { - type: "string", - }, - ackReaction: { - type: "string", - }, - ackReactionScope: { - type: "string", - enum: ["group-mentions", "group-all", "direct", "all", "none", "off"], - }, - reactionNotifications: { - type: "string", - enum: ["off", "own"], - }, - threadBindings: { - type: "object", - properties: { - enabled: { - type: "boolean", - }, - idleHours: { - type: "number", - minimum: 0, - }, - maxAgeHours: { - type: "number", - minimum: 0, - }, - spawnSessions: { - type: "boolean", - }, - defaultSpawnContext: { - type: "string", - enum: ["isolated", "fork"], - }, - spawnSubagentSessions: { - type: "boolean", - }, - spawnAcpSessions: { - type: "boolean", - }, - }, - additionalProperties: false, - }, - startupVerification: { - type: "string", - enum: ["off", "if-unverified"], - }, - startupVerificationCooldownHours: { - type: "number", - }, - mediaMaxMb: { - type: "number", - }, - historyLimit: { - type: "integer", - minimum: 0, - maximum: 9007199254740991, - }, - autoJoin: { - type: "string", - enum: ["always", "allowlist", "off"], - }, - autoJoinAllowlist: { - type: "array", - items: { - anyOf: [ - { - type: "string", - }, - { - type: "number", - }, - ], - }, - }, - groupAllowFrom: { - type: "array", - items: { - anyOf: [ - { - type: "string", - }, - { - type: "number", - }, - ], - }, - }, - dm: { - type: "object", - properties: { - enabled: { - type: "boolean", - }, - policy: { - type: "string", - enum: ["pairing", "allowlist", "open", "disabled"], - }, - allowFrom: { - type: "array", - items: { - anyOf: [ - { - type: "string", - }, - { - type: "number", - }, - ], - }, - }, - sessionScope: { - type: "string", - enum: ["per-user", "per-room"], - }, - threadReplies: { - type: "string", - enum: ["off", "inbound", "always"], - }, - }, - additionalProperties: false, - }, - execApprovals: { - type: "object", - properties: { - enabled: { - type: "boolean", - }, - approvers: { - type: "array", - items: { - anyOf: [ - { - type: "string", - }, - { - type: "number", - }, - ], - }, - }, - agentFilter: { - type: "array", - items: { - type: "string", - }, - }, - sessionFilter: { - type: "array", - items: { - type: "string", - }, - }, - target: { - type: "string", - enum: ["dm", "channel", "both"], - }, - }, - additionalProperties: false, - }, - groups: { - type: "object", - properties: {}, - additionalProperties: { - type: "object", - properties: { - account: { - type: "string", - }, - enabled: { - type: "boolean", - }, - requireMention: { - type: "boolean", - }, - allowBots: { - anyOf: [ - { - type: "boolean", - }, - { - type: "string", - const: "mentions", - }, - ], - }, - tools: { - type: "object", - properties: { - allow: { - type: "array", - items: { - type: "string", - }, - }, - alsoAllow: { - type: "array", - items: { - type: "string", - }, - }, - deny: { - type: "array", - items: { - type: "string", - }, - }, - }, - additionalProperties: false, - }, - autoReply: { - type: "boolean", - }, - users: { - type: "array", - items: { - anyOf: [ - { - type: "string", - }, - { - type: "number", - }, - ], - }, - }, - skills: { - type: "array", - items: { - type: "string", - }, - }, - systemPrompt: { - type: "string", - }, - }, - additionalProperties: false, - }, - }, - rooms: { - type: "object", - properties: {}, - additionalProperties: { - type: "object", - properties: { - account: { - type: "string", - }, - enabled: { - type: "boolean", - }, - requireMention: { - type: "boolean", - }, - allowBots: { - anyOf: [ - { - type: "boolean", - }, - { - type: "string", - const: "mentions", - }, - ], - }, - tools: { - type: "object", - properties: { - allow: { - type: "array", - items: { - type: "string", - }, - }, - alsoAllow: { - type: "array", - items: { - type: "string", - }, - }, - deny: { - type: "array", - items: { - type: "string", - }, - }, - }, - additionalProperties: false, - }, - autoReply: { - type: "boolean", - }, - users: { - type: "array", - items: { - anyOf: [ - { - type: "string", - }, - { - type: "number", - }, - ], - }, - }, - skills: { - type: "array", - items: { - type: "string", - }, - }, - systemPrompt: { - type: "string", - }, - }, - additionalProperties: false, - }, - }, - actions: { - type: "object", - properties: { - reactions: { - type: "boolean", - }, - messages: { - type: "boolean", - }, - pins: { - type: "boolean", - }, - profile: { - type: "boolean", - }, - memberInfo: { - type: "boolean", - }, - channelInfo: { - type: "boolean", - }, - verification: { - type: "boolean", - }, - }, - additionalProperties: false, - }, - }, - additionalProperties: false, - }, - uiHints: { - "streaming.progress.label": { - label: "Matrix Progress Label", - help: 'Initial progress draft title. Use "auto" for built-in single-word labels, a custom string, or false to hide the title.', - }, - "streaming.progress.labels": { - label: "Matrix Progress Label Pool", - help: 'Candidate labels for streaming.progress.label="auto". Leave unset to use OpenClaw built-in progress labels.', - }, - "streaming.progress.maxLines": { - label: "Matrix Progress Max Lines", - help: "Maximum number of compact progress lines to keep below the draft label (default: 8).", - }, - "streaming.progress.toolProgress": { - label: "Matrix Progress Tool Lines", - help: "Show compact tool/progress lines in progress draft mode (default: true). Set false to keep only the label until final delivery.", - }, - "streaming.progress.commandText": { - label: "Matrix Progress Command Text", - help: 'Command/exec detail in progress draft lines: "raw" preserves released behavior; "status" shows only the tool label.', - }, - }, - }, - { - pluginId: "mattermost", - channelId: "mattermost", - label: "Mattermost", - description: "self-hosted Slack-style chat; install the plugin to enable.", - schema: { - $schema: "http://json-schema.org/draft-07/schema#", - type: "object", - properties: { - name: { - type: "string", - }, - capabilities: { - type: "array", - items: { - type: "string", - }, - }, - dangerouslyAllowNameMatching: { - type: "boolean", - }, - markdown: { - type: "object", - properties: { - tables: { - type: "string", - enum: ["off", "bullets", "code", "block"], - }, - }, - additionalProperties: false, - }, - enabled: { - type: "boolean", - }, - configWrites: { - type: "boolean", - }, - botToken: { - anyOf: [ - { - type: "string", - }, - { - oneOf: [ - { - type: "object", - properties: { - source: { - type: "string", - const: "env", - }, - provider: { - type: "string", - pattern: "^[a-z][a-z0-9_-]{0,63}$", - }, - id: { - type: "string", - pattern: "^[A-Z][A-Z0-9_]{0,127}$", - }, - }, - required: ["source", "provider", "id"], - additionalProperties: false, - }, - { - type: "object", - properties: { - source: { - type: "string", - const: "file", - }, - provider: { - type: "string", - pattern: "^[a-z][a-z0-9_-]{0,63}$", - }, - id: { - type: "string", - }, - }, - required: ["source", "provider", "id"], - additionalProperties: false, - }, - { - type: "object", - properties: { - source: { - type: "string", - const: "exec", - }, - provider: { - type: "string", - pattern: "^[a-z][a-z0-9_-]{0,63}$", - }, - id: { - type: "string", - }, - }, - required: ["source", "provider", "id"], - additionalProperties: false, - }, - ], - }, - ], - }, - baseUrl: { - type: "string", - }, - chatmode: { - type: "string", - enum: ["oncall", "onmessage", "onchar"], - }, - oncharPrefixes: { - type: "array", - items: { - type: "string", - }, - }, - requireMention: { - type: "boolean", - }, - dmPolicy: { - default: "pairing", - type: "string", - enum: ["pairing", "allowlist", "open", "disabled"], - }, - allowFrom: { - type: "array", - items: { - anyOf: [ - { - type: "string", - }, - { - type: "number", - }, - ], - }, - }, - groupAllowFrom: { - type: "array", - items: { - anyOf: [ - { - type: "string", - }, - { - type: "number", - }, - ], - }, - }, - groupPolicy: { - default: "allowlist", - type: "string", - enum: ["open", "disabled", "allowlist"], - }, - textChunkLimit: { - type: "integer", - exclusiveMinimum: 0, - maximum: 9007199254740991, - }, - chunkMode: { - type: "string", - enum: ["length", "newline"], - }, - streaming: { - anyOf: [ - { - type: "string", - enum: ["off", "partial", "block", "progress"], - }, - { - type: "boolean", - }, - { - type: "object", - properties: { - mode: { - type: "string", - enum: ["off", "partial", "block", "progress"], - }, - chunkMode: { - type: "string", - enum: ["length", "newline"], - }, - preview: { - type: "object", - properties: { - toolProgress: { - type: "boolean", - }, - }, - additionalProperties: false, - }, - progress: { - type: "object", - properties: { - label: { - anyOf: [ - { - type: "string", - }, - { - type: "boolean", - const: false, - }, - ], - }, - labels: { - type: "array", - items: { - type: "string", - }, - }, - maxLines: { - type: "integer", - exclusiveMinimum: 0, - maximum: 9007199254740991, - }, - toolProgress: { - type: "boolean", - }, - }, - additionalProperties: false, - }, - block: { - type: "object", - properties: { - enabled: { - type: "boolean", - }, - coalesce: { - type: "object", - properties: { - minChars: { - type: "integer", - exclusiveMinimum: 0, - maximum: 9007199254740991, - }, - maxChars: { - type: "integer", - exclusiveMinimum: 0, - maximum: 9007199254740991, - }, - idleMs: { - type: "integer", - minimum: 0, - maximum: 9007199254740991, - }, - }, - additionalProperties: false, - }, - }, - additionalProperties: false, - }, - }, - additionalProperties: false, - }, - ], - }, - blockStreaming: { - type: "boolean", - }, - blockStreamingCoalesce: { - type: "object", - properties: { - minChars: { - type: "integer", - exclusiveMinimum: 0, - maximum: 9007199254740991, - }, - maxChars: { - type: "integer", - exclusiveMinimum: 0, - maximum: 9007199254740991, - }, - idleMs: { - type: "integer", - minimum: 0, - maximum: 9007199254740991, - }, - }, - additionalProperties: false, - }, - replyToMode: { - type: "string", - enum: ["off", "first", "all", "batched"], - }, - responsePrefix: { - type: "string", - }, - actions: { - type: "object", - properties: { - reactions: { - type: "boolean", - }, - }, - additionalProperties: false, - }, - commands: { - type: "object", - properties: { - native: { - anyOf: [ - { - type: "boolean", - }, - { - type: "string", - const: "auto", - }, - ], - }, - nativeSkills: { - anyOf: [ - { - type: "boolean", - }, - { - type: "string", - const: "auto", - }, - ], - }, - callbackPath: { - type: "string", - }, - callbackUrl: { - type: "string", - }, - }, - additionalProperties: false, - }, - interactions: { - type: "object", - properties: { - callbackBaseUrl: { - type: "string", - }, - allowedSourceIps: { - type: "array", - items: { - type: "string", - }, - }, - }, - additionalProperties: false, - }, - groups: { - type: "object", - propertyNames: { - type: "string", - }, - additionalProperties: { - type: "object", - properties: { - requireMention: { - type: "boolean", - }, - }, - additionalProperties: false, - }, - }, - network: { - type: "object", - properties: { - dangerouslyAllowPrivateNetwork: { - type: "boolean", - }, - }, - additionalProperties: false, - }, - dmChannelRetry: { - type: "object", - properties: { - maxRetries: { - type: "integer", - minimum: 0, - maximum: 10, - }, - initialDelayMs: { - type: "integer", - minimum: 100, - maximum: 60000, - }, - maxDelayMs: { - type: "integer", - minimum: 1000, - maximum: 60000, - }, - timeoutMs: { - type: "integer", - minimum: 5000, - maximum: 120000, - }, - }, - additionalProperties: false, - }, - accounts: { - type: "object", - propertyNames: { - type: "string", - }, - additionalProperties: { - type: "object", - properties: { - name: { - type: "string", - }, - capabilities: { - type: "array", - items: { - type: "string", - }, - }, - dangerouslyAllowNameMatching: { - type: "boolean", - }, - markdown: { - type: "object", - properties: { - tables: { - type: "string", - enum: ["off", "bullets", "code", "block"], - }, - }, - additionalProperties: false, - }, - enabled: { - type: "boolean", - }, - configWrites: { - type: "boolean", - }, - botToken: { - anyOf: [ - { - type: "string", - }, - { - oneOf: [ - { - type: "object", - properties: { - source: { - type: "string", - const: "env", - }, - provider: { - type: "string", - pattern: "^[a-z][a-z0-9_-]{0,63}$", - }, - id: { - type: "string", - pattern: "^[A-Z][A-Z0-9_]{0,127}$", - }, - }, - required: ["source", "provider", "id"], - additionalProperties: false, - }, - { - type: "object", - properties: { - source: { - type: "string", - const: "file", - }, - provider: { - type: "string", - pattern: "^[a-z][a-z0-9_-]{0,63}$", - }, - id: { - type: "string", - }, - }, - required: ["source", "provider", "id"], - additionalProperties: false, - }, - { - type: "object", - properties: { - source: { - type: "string", - const: "exec", - }, - provider: { - type: "string", - pattern: "^[a-z][a-z0-9_-]{0,63}$", - }, - id: { - type: "string", - }, - }, - required: ["source", "provider", "id"], - additionalProperties: false, - }, - ], - }, - ], - }, - baseUrl: { - type: "string", - }, - chatmode: { - type: "string", - enum: ["oncall", "onmessage", "onchar"], - }, - oncharPrefixes: { - type: "array", - items: { - type: "string", - }, - }, - requireMention: { - type: "boolean", - }, - dmPolicy: { - default: "pairing", - type: "string", - enum: ["pairing", "allowlist", "open", "disabled"], - }, - allowFrom: { - type: "array", - items: { - anyOf: [ - { - type: "string", - }, - { - type: "number", - }, - ], - }, - }, - groupAllowFrom: { - type: "array", - items: { - anyOf: [ - { - type: "string", - }, - { - type: "number", - }, - ], - }, - }, - groupPolicy: { - default: "allowlist", - type: "string", - enum: ["open", "disabled", "allowlist"], - }, - textChunkLimit: { - type: "integer", - exclusiveMinimum: 0, - maximum: 9007199254740991, - }, - chunkMode: { - type: "string", - enum: ["length", "newline"], - }, - streaming: { - anyOf: [ - { - type: "string", - enum: ["off", "partial", "block", "progress"], - }, - { - type: "boolean", - }, - { - type: "object", - properties: { - mode: { - type: "string", - enum: ["off", "partial", "block", "progress"], - }, - chunkMode: { - type: "string", - enum: ["length", "newline"], - }, - preview: { - type: "object", - properties: { - toolProgress: { - type: "boolean", - }, - }, - additionalProperties: false, - }, - progress: { - type: "object", - properties: { - label: { - anyOf: [ - { - type: "string", - }, - { - type: "boolean", - const: false, - }, - ], - }, - labels: { - type: "array", - items: { - type: "string", - }, - }, - maxLines: { - type: "integer", - exclusiveMinimum: 0, - maximum: 9007199254740991, - }, - toolProgress: { - type: "boolean", - }, - }, - additionalProperties: false, - }, - block: { - type: "object", - properties: { - enabled: { - type: "boolean", - }, - coalesce: { - type: "object", - properties: { - minChars: { - type: "integer", - exclusiveMinimum: 0, - maximum: 9007199254740991, - }, - maxChars: { - type: "integer", - exclusiveMinimum: 0, - maximum: 9007199254740991, - }, - idleMs: { - type: "integer", - minimum: 0, - maximum: 9007199254740991, - }, - }, - additionalProperties: false, - }, - }, - additionalProperties: false, - }, - }, - additionalProperties: false, - }, - ], - }, - blockStreaming: { - type: "boolean", - }, - blockStreamingCoalesce: { - type: "object", - properties: { - minChars: { - type: "integer", - exclusiveMinimum: 0, - maximum: 9007199254740991, - }, - maxChars: { - type: "integer", - exclusiveMinimum: 0, - maximum: 9007199254740991, - }, - idleMs: { - type: "integer", - minimum: 0, - maximum: 9007199254740991, - }, - }, - additionalProperties: false, - }, - replyToMode: { - type: "string", - enum: ["off", "first", "all", "batched"], - }, - responsePrefix: { - type: "string", - }, - actions: { - type: "object", - properties: { - reactions: { - type: "boolean", - }, - }, - additionalProperties: false, - }, - commands: { - type: "object", - properties: { - native: { - anyOf: [ - { - type: "boolean", - }, - { - type: "string", - const: "auto", - }, - ], - }, - nativeSkills: { - anyOf: [ - { - type: "boolean", - }, - { - type: "string", - const: "auto", - }, - ], - }, - callbackPath: { - type: "string", - }, - callbackUrl: { - type: "string", - }, - }, - additionalProperties: false, - }, - interactions: { - type: "object", - properties: { - callbackBaseUrl: { - type: "string", - }, - allowedSourceIps: { - type: "array", - items: { - type: "string", - }, - }, - }, - additionalProperties: false, - }, - groups: { - type: "object", - propertyNames: { - type: "string", - }, - additionalProperties: { - type: "object", - properties: { - requireMention: { - type: "boolean", - }, - }, - additionalProperties: false, - }, - }, - network: { - type: "object", - properties: { - dangerouslyAllowPrivateNetwork: { - type: "boolean", - }, - }, - additionalProperties: false, - }, - dmChannelRetry: { - type: "object", - properties: { - maxRetries: { - type: "integer", - minimum: 0, - maximum: 10, - }, - initialDelayMs: { - type: "integer", - minimum: 100, - maximum: 60000, - }, - maxDelayMs: { - type: "integer", - minimum: 1000, - maximum: 60000, - }, - timeoutMs: { - type: "integer", - minimum: 5000, - maximum: 120000, - }, - }, - additionalProperties: false, - }, - }, - required: ["dmPolicy", "groupPolicy"], - additionalProperties: false, - }, - }, - defaultAccount: { - type: "string", - }, - }, - required: ["dmPolicy", "groupPolicy"], - additionalProperties: false, - }, - uiHints: { - "": { - label: "Mattermost", - help: "Mattermost channel provider configuration for bot auth, access policy, slash commands, and preview streaming.", - }, - dmPolicy: { - label: "Mattermost DM Policy", - help: 'Direct message access control ("pairing" recommended). "open" requires channels.mattermost.allowFrom=["*"].', - }, - streaming: { - label: "Mattermost Streaming Mode", - help: 'Unified Mattermost stream preview mode: "off" | "partial" | "block" | "progress". "progress" keeps a single editable progress draft until final delivery.', - }, - "streaming.mode": { - label: "Mattermost Streaming Mode", - help: 'Canonical Mattermost preview mode: "off" | "partial" | "block" | "progress".', - }, - "streaming.progress.label": { - label: "Mattermost Progress Label", - help: 'Initial progress draft title. Use "auto" for built-in single-word labels, a custom string, or false to hide the title.', - }, - "streaming.progress.labels": { - label: "Mattermost Progress Label Pool", - help: 'Candidate labels for streaming.progress.label="auto". Leave unset to use OpenClaw built-in progress labels.', - }, - "streaming.progress.maxLines": { - label: "Mattermost Progress Max Lines", - help: "Maximum number of compact progress lines to keep below the draft label (default: 8).", - }, - "streaming.progress.toolProgress": { - label: "Mattermost Progress Tool Lines", - help: "Show compact tool/progress lines in progress draft mode (default: true). Set false to keep only the label until final delivery.", - }, - "streaming.progress.commandText": { - label: "Mattermost Progress Command Text", - help: 'Command/exec detail in progress draft lines: "raw" preserves released behavior; "status" shows only the tool label.', - }, - "streaming.preview.toolProgress": { - label: "Mattermost Draft Tool Progress", - help: "Show tool/progress activity in the live draft preview post (default: true). Set false to hide interim tool updates while the draft preview stays active.", - }, - "streaming.preview.commandText": { - label: "Mattermost Draft Command Text", - help: 'Command/exec detail in preview tool-progress lines: "raw" preserves released behavior; "status" shows only the tool label.', - }, - "streaming.block.enabled": { - label: "Mattermost Block Streaming Enabled", - help: 'Enable chunked block-style Mattermost preview delivery when channels.mattermost.streaming.mode="block".', - }, - "streaming.block.coalesce": { - label: "Mattermost Block Streaming Coalesce", - help: "Merge streamed Mattermost block replies before final delivery.", - }, - }, - }, - { - pluginId: "msteams", - channelId: "msteams", - label: "Microsoft Teams", - description: "Teams SDK; enterprise support.", - schema: { - $schema: "http://json-schema.org/draft-07/schema#", - type: "object", - properties: { - enabled: { - type: "boolean", - }, - capabilities: { - type: "array", - items: { - type: "string", - }, - }, - dangerouslyAllowNameMatching: { - type: "boolean", - }, - markdown: { - type: "object", - properties: { - tables: { - type: "string", - enum: ["off", "bullets", "code", "block"], - }, - }, - additionalProperties: false, - }, - configWrites: { - type: "boolean", - }, - appId: { - type: "string", - }, - appPassword: { - anyOf: [ - { - type: "string", - }, - { - oneOf: [ - { - type: "object", - properties: { - source: { - type: "string", - const: "env", - }, - provider: { - type: "string", - pattern: "^[a-z][a-z0-9_-]{0,63}$", - }, - id: { - type: "string", - pattern: "^[A-Z][A-Z0-9_]{0,127}$", - }, - }, - required: ["source", "provider", "id"], - additionalProperties: false, - }, - { - type: "object", - properties: { - source: { - type: "string", - const: "file", - }, - provider: { - type: "string", - pattern: "^[a-z][a-z0-9_-]{0,63}$", - }, - id: { - type: "string", - }, - }, - required: ["source", "provider", "id"], - additionalProperties: false, - }, - { - type: "object", - properties: { - source: { - type: "string", - const: "exec", - }, - provider: { - type: "string", - pattern: "^[a-z][a-z0-9_-]{0,63}$", - }, - id: { - type: "string", - }, - }, - required: ["source", "provider", "id"], - additionalProperties: false, - }, - ], - }, - ], - }, - tenantId: { - type: "string", - }, - authType: { - type: "string", - enum: ["secret", "federated"], - }, - certificatePath: { - type: "string", - }, - certificateThumbprint: { - type: "string", - }, - useManagedIdentity: { - type: "boolean", - }, - managedIdentityClientId: { - type: "string", - }, - webhook: { - type: "object", - properties: { - port: { - type: "integer", - exclusiveMinimum: 0, - maximum: 9007199254740991, - }, - path: { - type: "string", - }, - }, - additionalProperties: false, - }, - dmPolicy: { - default: "pairing", - type: "string", - enum: ["pairing", "allowlist", "open", "disabled"], - }, - allowFrom: { - type: "array", - items: { - type: "string", - }, - }, - defaultTo: { - type: "string", - }, - groupAllowFrom: { - type: "array", - items: { - type: "string", - }, - }, - groupPolicy: { - default: "allowlist", - type: "string", - enum: ["open", "disabled", "allowlist"], - }, - contextVisibility: { - type: "string", - enum: ["all", "allowlist", "allowlist_quote"], - }, - textChunkLimit: { - type: "integer", - exclusiveMinimum: 0, - maximum: 9007199254740991, - }, - chunkMode: { - type: "string", - enum: ["length", "newline"], - }, - streaming: { - type: "object", - properties: { - mode: { - type: "string", - enum: ["off", "partial", "block", "progress"], - }, - chunkMode: { - type: "string", - enum: ["length", "newline"], - }, - preview: { - type: "object", - properties: { - chunk: { - type: "object", - properties: { - minChars: { - type: "integer", - exclusiveMinimum: 0, - maximum: 9007199254740991, - }, - maxChars: { - type: "integer", - exclusiveMinimum: 0, - maximum: 9007199254740991, - }, - breakPreference: { - anyOf: [ - { - type: "string", - const: "paragraph", - }, - { - type: "string", - const: "newline", - }, - { - type: "string", - const: "sentence", - }, - ], - }, - }, - additionalProperties: false, - }, - toolProgress: { - type: "boolean", - }, - commandText: { - type: "string", - enum: ["raw", "status"], - }, - }, - additionalProperties: false, - }, - progress: { - type: "object", - properties: { - label: { - anyOf: [ - { - type: "string", - }, - { - type: "boolean", - const: false, - }, - ], - }, - labels: { - type: "array", - items: { - type: "string", - }, - }, - maxLines: { - type: "integer", - exclusiveMinimum: 0, - maximum: 9007199254740991, - }, - render: { - type: "string", - enum: ["text", "rich"], - }, - toolProgress: { - type: "boolean", - }, - commandText: { - type: "string", - enum: ["raw", "status"], - }, - }, - additionalProperties: false, - }, - block: { - type: "object", - properties: { - enabled: { - type: "boolean", - }, - coalesce: { - type: "object", - properties: { - minChars: { - type: "integer", - exclusiveMinimum: 0, - maximum: 9007199254740991, - }, - maxChars: { - type: "integer", - exclusiveMinimum: 0, - maximum: 9007199254740991, - }, - idleMs: { - type: "integer", - minimum: 0, - maximum: 9007199254740991, - }, - }, - additionalProperties: false, - }, - }, - additionalProperties: false, - }, - }, - additionalProperties: false, - }, - typingIndicator: { - type: "boolean", - }, - blockStreaming: { - type: "boolean", - }, - blockStreamingCoalesce: { - type: "object", - properties: { - minChars: { - type: "integer", - exclusiveMinimum: 0, - maximum: 9007199254740991, - }, - maxChars: { - type: "integer", - exclusiveMinimum: 0, - maximum: 9007199254740991, - }, - idleMs: { - type: "integer", - minimum: 0, - maximum: 9007199254740991, - }, - }, - additionalProperties: false, - }, - mediaAllowHosts: { - type: "array", - items: { - type: "string", - }, - }, - mediaAuthAllowHosts: { - type: "array", - items: { - type: "string", - }, - }, - requireMention: { - type: "boolean", - }, - historyLimit: { - type: "integer", - minimum: 0, - maximum: 9007199254740991, - }, - dmHistoryLimit: { - type: "integer", - minimum: 0, - maximum: 9007199254740991, - }, - dms: { - type: "object", - propertyNames: { - type: "string", - }, - additionalProperties: { - type: "object", - properties: { - historyLimit: { - type: "integer", - minimum: 0, - maximum: 9007199254740991, - }, - }, - additionalProperties: false, - }, - }, - replyStyle: { - type: "string", - enum: ["thread", "top-level"], - }, - teams: { - type: "object", - propertyNames: { - type: "string", - }, - additionalProperties: { - type: "object", - properties: { - requireMention: { - type: "boolean", - }, - tools: { - type: "object", - properties: { - allow: { - type: "array", - items: { - type: "string", - }, - }, - alsoAllow: { - type: "array", - items: { - type: "string", - }, - }, - deny: { - type: "array", - items: { - type: "string", - }, - }, - }, - additionalProperties: false, - }, - toolsBySender: { - type: "object", - propertyNames: { - type: "string", - }, - additionalProperties: { - type: "object", - properties: { - allow: { - type: "array", - items: { - type: "string", - }, - }, - alsoAllow: { - type: "array", - items: { - type: "string", - }, - }, - deny: { - type: "array", - items: { - type: "string", - }, - }, - }, - additionalProperties: false, - }, - }, - replyStyle: { - type: "string", - enum: ["thread", "top-level"], - }, - channels: { - type: "object", - propertyNames: { - type: "string", - }, - additionalProperties: { - type: "object", - properties: { - requireMention: { - type: "boolean", - }, - tools: { - type: "object", - properties: { - allow: { - type: "array", - items: { - type: "string", - }, - }, - alsoAllow: { - type: "array", - items: { - type: "string", - }, - }, - deny: { - type: "array", - items: { - type: "string", - }, - }, - }, - additionalProperties: false, - }, - toolsBySender: { - type: "object", - propertyNames: { - type: "string", - }, - additionalProperties: { - type: "object", - properties: { - allow: { - type: "array", - items: { - type: "string", - }, - }, - alsoAllow: { - type: "array", - items: { - type: "string", - }, - }, - deny: { - type: "array", - items: { - type: "string", - }, - }, - }, - additionalProperties: false, - }, - }, - replyStyle: { - type: "string", - enum: ["thread", "top-level"], - }, - }, - additionalProperties: false, - }, - }, - }, - additionalProperties: false, - }, - }, - mediaMaxMb: { - type: "number", - exclusiveMinimum: 0, - }, - sharePointSiteId: { - type: "string", - }, - heartbeat: { - type: "object", - properties: { - showOk: { - type: "boolean", - }, - showAlerts: { - type: "boolean", - }, - useIndicator: { - type: "boolean", - }, - }, - additionalProperties: false, - }, - healthMonitor: { - type: "object", - properties: { - enabled: { - type: "boolean", - }, - }, - additionalProperties: false, - }, - responsePrefix: { - type: "string", - }, - welcomeCard: { - type: "boolean", - }, - promptStarters: { - type: "array", - items: { - type: "string", - }, - }, - groupWelcomeCard: { - type: "boolean", - }, - feedbackEnabled: { - type: "boolean", - }, - feedbackReflection: { - type: "boolean", - }, - feedbackReflectionCooldownMs: { - type: "integer", - minimum: 0, - maximum: 9007199254740991, - }, - delegatedAuth: { - type: "object", - properties: { - enabled: { - type: "boolean", - }, - scopes: { - type: "array", - items: { - type: "string", - }, - }, - }, - additionalProperties: false, - }, - sso: { - type: "object", - properties: { - enabled: { - type: "boolean", - }, - connectionName: { - type: "string", - }, - }, - additionalProperties: false, - }, - }, - required: ["dmPolicy", "groupPolicy"], - additionalProperties: false, - }, - uiHints: { - "": { - label: "MS Teams", - help: "Microsoft Teams channel provider configuration and provider-specific policy toggles. Use this section to isolate Teams behavior from other enterprise chat providers.", - }, - configWrites: { - label: "MS Teams Config Writes", - help: "Allow Microsoft Teams to write config in response to channel events/commands (default: true).", - }, - streaming: { - label: "MS Teams Streaming", - help: 'Microsoft Teams preview/progress streaming mode: "off" | "partial" | "block" | "progress". Personal chats use Teams native streaminfo progress when available.', - }, - "streaming.progress.label": { - label: "MS Teams Progress Label", - help: 'Initial progress title. Use "auto" for built-in single-word labels, a custom string, or false to hide the title.', - }, - "streaming.progress.labels": { - label: "MS Teams Progress Label Pool", - help: 'Candidate labels for streaming.progress.label="auto". Leave unset to use OpenClaw built-in progress labels.', - }, - "streaming.progress.maxLines": { - label: "MS Teams Progress Max Lines", - help: "Maximum number of compact progress lines to keep below the progress title (default: 8).", - }, - "streaming.progress.toolProgress": { - label: "MS Teams Progress Tool Lines", - help: "Show compact tool/progress lines in progress mode (default: true). Set false to keep only the title until final delivery.", - }, - "streaming.progress.commandText": { - label: "MS Teams Progress Command Text", - help: 'Command/exec detail in progress lines: "raw" preserves released behavior; "status" shows only the tool label.', - }, - }, - }, - { - pluginId: "nextcloud-talk", - channelId: "nextcloud-talk", - label: "Nextcloud Talk", - description: "Self-hosted chat via Nextcloud Talk webhook bots.", - schema: { - $schema: "http://json-schema.org/draft-07/schema#", - type: "object", - properties: { - name: { - type: "string", - }, - enabled: { - type: "boolean", - }, - markdown: { - type: "object", - properties: { - tables: { - type: "string", - enum: ["off", "bullets", "code", "block"], - }, - }, - additionalProperties: false, - }, - baseUrl: { - type: "string", - }, - botSecret: { - anyOf: [ - { - type: "string", - }, - { - oneOf: [ - { - type: "object", - properties: { - source: { - type: "string", - const: "env", - }, - provider: { - type: "string", - pattern: "^[a-z][a-z0-9_-]{0,63}$", - }, - id: { - type: "string", - pattern: "^[A-Z][A-Z0-9_]{0,127}$", - }, - }, - required: ["source", "provider", "id"], - additionalProperties: false, - }, - { - type: "object", - properties: { - source: { - type: "string", - const: "file", - }, - provider: { - type: "string", - pattern: "^[a-z][a-z0-9_-]{0,63}$", - }, - id: { - type: "string", - }, - }, - required: ["source", "provider", "id"], - additionalProperties: false, - }, - { - type: "object", - properties: { - source: { - type: "string", - const: "exec", - }, - provider: { - type: "string", - pattern: "^[a-z][a-z0-9_-]{0,63}$", - }, - id: { - type: "string", - }, - }, - required: ["source", "provider", "id"], - additionalProperties: false, - }, - ], - }, - ], - }, - botSecretFile: { - type: "string", - }, - apiUser: { - type: "string", - }, - apiPassword: { - anyOf: [ - { - type: "string", - }, - { - oneOf: [ - { - type: "object", - properties: { - source: { - type: "string", - const: "env", - }, - provider: { - type: "string", - pattern: "^[a-z][a-z0-9_-]{0,63}$", - }, - id: { - type: "string", - pattern: "^[A-Z][A-Z0-9_]{0,127}$", - }, - }, - required: ["source", "provider", "id"], - additionalProperties: false, - }, - { - type: "object", - properties: { - source: { - type: "string", - const: "file", - }, - provider: { - type: "string", - pattern: "^[a-z][a-z0-9_-]{0,63}$", - }, - id: { - type: "string", - }, - }, - required: ["source", "provider", "id"], - additionalProperties: false, - }, - { - type: "object", - properties: { - source: { - type: "string", - const: "exec", - }, - provider: { - type: "string", - pattern: "^[a-z][a-z0-9_-]{0,63}$", - }, - id: { - type: "string", - }, - }, - required: ["source", "provider", "id"], - additionalProperties: false, - }, - ], - }, - ], - }, - apiPasswordFile: { - type: "string", - }, - dmPolicy: { - default: "pairing", - type: "string", - enum: ["pairing", "allowlist", "open", "disabled"], - }, - webhookPort: { - type: "integer", - exclusiveMinimum: 0, - maximum: 9007199254740991, - }, - webhookHost: { - type: "string", - }, - webhookPath: { - type: "string", - }, - webhookPublicUrl: { - type: "string", - }, - allowFrom: { - type: "array", - items: { - type: "string", - }, - }, - groupAllowFrom: { - type: "array", - items: { - type: "string", - }, - }, - groupPolicy: { - default: "allowlist", - type: "string", - enum: ["open", "disabled", "allowlist"], - }, - rooms: { - type: "object", - propertyNames: { - type: "string", - }, - additionalProperties: { - type: "object", - properties: { - requireMention: { - type: "boolean", - }, - tools: { - type: "object", - properties: { - allow: { - type: "array", - items: { - type: "string", - }, - }, - alsoAllow: { - type: "array", - items: { - type: "string", - }, - }, - deny: { - type: "array", - items: { - type: "string", - }, - }, - }, - additionalProperties: false, - }, - skills: { - type: "array", - items: { - type: "string", - }, - }, - enabled: { - type: "boolean", - }, - allowFrom: { - type: "array", - items: { - type: "string", - }, - }, - systemPrompt: { - type: "string", - }, - }, - additionalProperties: false, - }, - }, - network: { - type: "object", - properties: { - dangerouslyAllowPrivateNetwork: { - type: "boolean", - }, - }, - additionalProperties: false, - }, - historyLimit: { - type: "integer", - minimum: 0, - maximum: 9007199254740991, - }, - dmHistoryLimit: { - type: "integer", - minimum: 0, - maximum: 9007199254740991, - }, - contextVisibility: { - type: "string", - enum: ["all", "allowlist", "allowlist_quote"], - }, - dms: { - type: "object", - propertyNames: { - type: "string", - }, - additionalProperties: { - type: "object", - properties: { - historyLimit: { - type: "integer", - minimum: 0, - maximum: 9007199254740991, - }, - }, - additionalProperties: false, - }, - }, - textChunkLimit: { - type: "integer", - exclusiveMinimum: 0, - maximum: 9007199254740991, - }, - chunkMode: { - type: "string", - enum: ["length", "newline"], - }, - blockStreaming: { - type: "boolean", - }, - blockStreamingCoalesce: { - type: "object", - properties: { - minChars: { - type: "integer", - exclusiveMinimum: 0, - maximum: 9007199254740991, - }, - maxChars: { - type: "integer", - exclusiveMinimum: 0, - maximum: 9007199254740991, - }, - idleMs: { - type: "integer", - minimum: 0, - maximum: 9007199254740991, - }, - }, - additionalProperties: false, - }, - responsePrefix: { - type: "string", - }, - mediaMaxMb: { - type: "number", - exclusiveMinimum: 0, - }, - accounts: { - type: "object", - propertyNames: { - type: "string", - }, - additionalProperties: { - type: "object", - properties: { - name: { - type: "string", - }, - enabled: { - type: "boolean", - }, - markdown: { - type: "object", - properties: { - tables: { - type: "string", - enum: ["off", "bullets", "code", "block"], - }, - }, - additionalProperties: false, - }, - baseUrl: { - type: "string", - }, - botSecret: { - anyOf: [ - { - type: "string", - }, - { - oneOf: [ - { - type: "object", - properties: { - source: { - type: "string", - const: "env", - }, - provider: { - type: "string", - pattern: "^[a-z][a-z0-9_-]{0,63}$", - }, - id: { - type: "string", - pattern: "^[A-Z][A-Z0-9_]{0,127}$", - }, - }, - required: ["source", "provider", "id"], - additionalProperties: false, - }, - { - type: "object", - properties: { - source: { - type: "string", - const: "file", - }, - provider: { - type: "string", - pattern: "^[a-z][a-z0-9_-]{0,63}$", - }, - id: { - type: "string", - }, - }, - required: ["source", "provider", "id"], - additionalProperties: false, - }, - { - type: "object", - properties: { - source: { - type: "string", - const: "exec", - }, - provider: { - type: "string", - pattern: "^[a-z][a-z0-9_-]{0,63}$", - }, - id: { - type: "string", - }, - }, - required: ["source", "provider", "id"], - additionalProperties: false, - }, - ], - }, - ], - }, - botSecretFile: { - type: "string", - }, - apiUser: { - type: "string", - }, - apiPassword: { - anyOf: [ - { - type: "string", - }, - { - oneOf: [ - { - type: "object", - properties: { - source: { - type: "string", - const: "env", - }, - provider: { - type: "string", - pattern: "^[a-z][a-z0-9_-]{0,63}$", - }, - id: { - type: "string", - pattern: "^[A-Z][A-Z0-9_]{0,127}$", - }, - }, - required: ["source", "provider", "id"], - additionalProperties: false, - }, - { - type: "object", - properties: { - source: { - type: "string", - const: "file", - }, - provider: { - type: "string", - pattern: "^[a-z][a-z0-9_-]{0,63}$", - }, - id: { - type: "string", - }, - }, - required: ["source", "provider", "id"], - additionalProperties: false, - }, - { - type: "object", - properties: { - source: { - type: "string", - const: "exec", - }, - provider: { - type: "string", - pattern: "^[a-z][a-z0-9_-]{0,63}$", - }, - id: { - type: "string", - }, - }, - required: ["source", "provider", "id"], - additionalProperties: false, - }, - ], - }, - ], - }, - apiPasswordFile: { - type: "string", - }, - dmPolicy: { - default: "pairing", - type: "string", - enum: ["pairing", "allowlist", "open", "disabled"], - }, - webhookPort: { - type: "integer", - exclusiveMinimum: 0, - maximum: 9007199254740991, - }, - webhookHost: { - type: "string", - }, - webhookPath: { - type: "string", - }, - webhookPublicUrl: { - type: "string", - }, - allowFrom: { - type: "array", - items: { - type: "string", - }, - }, - groupAllowFrom: { - type: "array", - items: { - type: "string", - }, - }, - groupPolicy: { - default: "allowlist", - type: "string", - enum: ["open", "disabled", "allowlist"], - }, - rooms: { - type: "object", - propertyNames: { - type: "string", - }, - additionalProperties: { - type: "object", - properties: { - requireMention: { - type: "boolean", - }, - tools: { - type: "object", - properties: { - allow: { - type: "array", - items: { - type: "string", - }, - }, - alsoAllow: { - type: "array", - items: { - type: "string", - }, - }, - deny: { - type: "array", - items: { - type: "string", - }, - }, - }, - additionalProperties: false, - }, - skills: { - type: "array", - items: { - type: "string", - }, - }, - enabled: { - type: "boolean", - }, - allowFrom: { - type: "array", - items: { - type: "string", - }, - }, - systemPrompt: { - type: "string", - }, - }, - additionalProperties: false, - }, - }, - network: { - type: "object", - properties: { - dangerouslyAllowPrivateNetwork: { - type: "boolean", - }, - }, - additionalProperties: false, - }, - historyLimit: { - type: "integer", - minimum: 0, - maximum: 9007199254740991, - }, - dmHistoryLimit: { - type: "integer", - minimum: 0, - maximum: 9007199254740991, - }, - contextVisibility: { - type: "string", - enum: ["all", "allowlist", "allowlist_quote"], - }, - dms: { - type: "object", - propertyNames: { - type: "string", - }, - additionalProperties: { - type: "object", - properties: { - historyLimit: { - type: "integer", - minimum: 0, - maximum: 9007199254740991, - }, - }, - additionalProperties: false, - }, - }, - textChunkLimit: { - type: "integer", - exclusiveMinimum: 0, - maximum: 9007199254740991, - }, - chunkMode: { - type: "string", - enum: ["length", "newline"], - }, - blockStreaming: { - type: "boolean", - }, - blockStreamingCoalesce: { - type: "object", - properties: { - minChars: { - type: "integer", - exclusiveMinimum: 0, - maximum: 9007199254740991, - }, - maxChars: { - type: "integer", - exclusiveMinimum: 0, - maximum: 9007199254740991, - }, - idleMs: { - type: "integer", - minimum: 0, - maximum: 9007199254740991, - }, - }, - additionalProperties: false, - }, - responsePrefix: { - type: "string", - }, - mediaMaxMb: { - type: "number", - exclusiveMinimum: 0, - }, - }, - required: ["dmPolicy", "groupPolicy"], - additionalProperties: false, - }, - }, - defaultAccount: { - type: "string", - }, - }, - required: ["dmPolicy", "groupPolicy"], - additionalProperties: false, - }, - }, - { - pluginId: "nostr", - channelId: "nostr", - label: "Nostr", - description: "Decentralized protocol; encrypted DMs via NIP-04.", - schema: { - $schema: "http://json-schema.org/draft-07/schema#", - type: "object", - properties: { - name: { - type: "string", - }, - defaultAccount: { - type: "string", - }, - enabled: { - type: "boolean", - }, - markdown: { - type: "object", - properties: { - tables: { - type: "string", - enum: ["off", "bullets", "code", "block"], - }, - }, - additionalProperties: false, - }, - privateKey: { - anyOf: [ - { - type: "string", - }, - { - oneOf: [ - { - type: "object", - properties: { - source: { - type: "string", - const: "env", - }, - provider: { - type: "string", - pattern: "^[a-z][a-z0-9_-]{0,63}$", - }, - id: { - type: "string", - pattern: "^[A-Z][A-Z0-9_]{0,127}$", - }, - }, - required: ["source", "provider", "id"], - additionalProperties: false, - }, - { - type: "object", - properties: { - source: { - type: "string", - const: "file", - }, - provider: { - type: "string", - pattern: "^[a-z][a-z0-9_-]{0,63}$", - }, - id: { - type: "string", - }, - }, - required: ["source", "provider", "id"], - additionalProperties: false, - }, - { - type: "object", - properties: { - source: { - type: "string", - const: "exec", - }, - provider: { - type: "string", - pattern: "^[a-z][a-z0-9_-]{0,63}$", - }, - id: { - type: "string", - }, - }, - required: ["source", "provider", "id"], - additionalProperties: false, - }, - ], - }, - ], - }, - relays: { - type: "array", - items: { - type: "string", - }, - }, - dmPolicy: { - type: "string", - enum: ["pairing", "allowlist", "open", "disabled"], - }, - allowFrom: { - type: "array", - items: { - anyOf: [ - { - type: "string", - }, - { - type: "number", - }, - ], - }, - }, - profile: { - type: "object", - properties: { - name: { - type: "string", - maxLength: 256, - }, - displayName: { - type: "string", - maxLength: 256, - }, - about: { - type: "string", - maxLength: 2000, - }, - picture: { - type: "string", - format: "uri", - }, - banner: { - type: "string", - format: "uri", - }, - website: { - type: "string", - format: "uri", - }, - nip05: { - type: "string", - }, - lud16: { - type: "string", - }, - }, - additionalProperties: false, - }, - }, - additionalProperties: false, - }, - }, - { - pluginId: "qa-channel", - channelId: "qa-channel", - label: "QA Channel", - description: "Synthetic Slack-class transport for automated OpenClaw QA scenarios.", - schema: { - $schema: "http://json-schema.org/draft-07/schema#", - type: "object", - properties: { - name: { - type: "string", - }, - enabled: { - type: "boolean", - }, - baseUrl: { - type: "string", - format: "uri", - }, - botUserId: { - type: "string", - }, - botDisplayName: { - type: "string", - }, - pollTimeoutMs: { - type: "integer", - minimum: 100, - maximum: 30000, - }, - allowFrom: { - type: "array", - items: { - anyOf: [ - { - type: "string", - }, - { - type: "number", - }, - ], - }, - }, - groupPolicy: { - type: "string", - enum: ["open", "allowlist", "disabled"], - }, - groupAllowFrom: { - type: "array", - items: { - anyOf: [ - { - type: "string", - }, - { - type: "number", - }, - ], - }, - }, - groups: { - type: "object", - propertyNames: { - type: "string", - }, - additionalProperties: { - type: "object", - properties: { - requireMention: { - type: "boolean", - }, - tools: { - type: "object", - properties: { - allow: { - type: "array", - items: { - type: "string", - }, - }, - alsoAllow: { - type: "array", - items: { - type: "string", - }, - }, - deny: { - type: "array", - items: { - type: "string", - }, - }, - }, - additionalProperties: false, - }, - toolsBySender: { - type: "object", - propertyNames: { - type: "string", - }, - additionalProperties: { - type: "object", - properties: { - allow: { - type: "array", - items: { - type: "string", - }, - }, - alsoAllow: { - type: "array", - items: { - type: "string", - }, - }, - deny: { - type: "array", - items: { - type: "string", - }, - }, - }, - additionalProperties: false, - }, - }, - }, - additionalProperties: false, - }, - }, - defaultTo: { - type: "string", - }, - actions: { - type: "object", - properties: { - messages: { - type: "boolean", - }, - reactions: { - type: "boolean", - }, - search: { - type: "boolean", - }, - threads: { - type: "boolean", - }, - }, - additionalProperties: false, - }, - accounts: { - type: "object", - propertyNames: { - type: "string", - }, - additionalProperties: { - type: "object", - properties: { - name: { - type: "string", - }, - enabled: { - type: "boolean", - }, - baseUrl: { - type: "string", - format: "uri", - }, - botUserId: { - type: "string", - }, - botDisplayName: { - type: "string", - }, - pollTimeoutMs: { - type: "integer", - minimum: 100, - maximum: 30000, - }, - allowFrom: { - type: "array", - items: { - anyOf: [ - { - type: "string", - }, - { - type: "number", - }, - ], - }, - }, - groupPolicy: { - type: "string", - enum: ["open", "allowlist", "disabled"], - }, - groupAllowFrom: { - type: "array", - items: { - anyOf: [ - { - type: "string", - }, - { - type: "number", - }, - ], - }, - }, - groups: { - type: "object", - propertyNames: { - type: "string", - }, - additionalProperties: { - type: "object", - properties: { - requireMention: { - type: "boolean", - }, - tools: { - type: "object", - properties: { - allow: { - type: "array", - items: { - type: "string", - }, - }, - alsoAllow: { - type: "array", - items: { - type: "string", - }, - }, - deny: { - type: "array", - items: { - type: "string", - }, - }, - }, - additionalProperties: false, - }, - toolsBySender: { - type: "object", - propertyNames: { - type: "string", - }, - additionalProperties: { - type: "object", - properties: { - allow: { - type: "array", - items: { - type: "string", - }, - }, - alsoAllow: { - type: "array", - items: { - type: "string", - }, - }, - deny: { - type: "array", - items: { - type: "string", - }, - }, - }, - additionalProperties: false, - }, - }, - }, - additionalProperties: false, - }, - }, - defaultTo: { - type: "string", - }, - actions: { - type: "object", - properties: { - messages: { - type: "boolean", - }, - reactions: { - type: "boolean", - }, - search: { - type: "boolean", - }, - threads: { - type: "boolean", - }, - }, - additionalProperties: false, - }, - }, - additionalProperties: false, - }, - }, - defaultAccount: { - type: "string", - }, - }, - additionalProperties: false, - }, - }, - { - pluginId: "qqbot", - channelId: "qqbot", - label: "QQ Bot", - description: - "connect to QQ via official QQ Bot API with group chat and direct message support.", - schema: { - $schema: "http://json-schema.org/draft-07/schema#", - type: "object", - properties: { - enabled: { - type: "boolean", - }, - name: { - type: "string", - }, - appId: { - type: "string", - }, - clientSecret: { - anyOf: [ - { - type: "string", - }, - { - oneOf: [ - { - type: "object", - properties: { - source: { - type: "string", - const: "env", - }, - provider: { - type: "string", - pattern: "^[a-z][a-z0-9_-]{0,63}$", - }, - id: { - type: "string", - pattern: "^[A-Z][A-Z0-9_]{0,127}$", - }, - }, - required: ["source", "provider", "id"], - additionalProperties: false, - }, - { - type: "object", - properties: { - source: { - type: "string", - const: "file", - }, - provider: { - type: "string", - pattern: "^[a-z][a-z0-9_-]{0,63}$", - }, - id: { - type: "string", - }, - }, - required: ["source", "provider", "id"], - additionalProperties: false, - }, - { - type: "object", - properties: { - source: { - type: "string", - const: "exec", - }, - provider: { - type: "string", - pattern: "^[a-z][a-z0-9_-]{0,63}$", - }, - id: { - type: "string", - }, - }, - required: ["source", "provider", "id"], - additionalProperties: false, - }, - ], - }, - ], - }, - clientSecretFile: { - type: "string", - }, - allowFrom: { - type: "array", - items: { - anyOf: [ - { - type: "string", - }, - { - type: "number", - }, - ], - }, - }, - groupAllowFrom: { - type: "array", - items: { - anyOf: [ - { - type: "string", - }, - { - type: "number", - }, - ], - }, - }, - dmPolicy: { - type: "string", - enum: ["open", "allowlist", "disabled"], - }, - groupPolicy: { - type: "string", - enum: ["open", "allowlist", "disabled"], - }, - systemPrompt: { - type: "string", - }, - markdownSupport: { - type: "boolean", - }, - voiceDirectUploadFormats: { - type: "array", - items: { - type: "string", - }, - }, - audioFormatPolicy: { - type: "object", - properties: { - sttDirectFormats: { - type: "array", - items: { - type: "string", - }, - }, - uploadDirectFormats: { - type: "array", - items: { - type: "string", - }, - }, - transcodeEnabled: { - type: "boolean", - }, - }, - additionalProperties: false, - }, - urlDirectUpload: { - type: "boolean", - }, - upgradeUrl: { - type: "string", - }, - upgradeMode: { - type: "string", - enum: ["doc", "hot-reload"], - }, - streaming: { - anyOf: [ - { - type: "boolean", - }, - { - type: "object", - properties: { - mode: { - default: "partial", - type: "string", - enum: ["off", "partial"], - }, - c2cStreamApi: { - type: "boolean", - }, - }, - required: ["mode"], - additionalProperties: {}, - }, - ], - }, - execApprovals: { - type: "object", - properties: { - enabled: { - anyOf: [ - { - type: "boolean", - }, - { - type: "string", - const: "auto", - }, - ], - }, - approvers: { - type: "array", - items: { - type: "string", - }, - }, - agentFilter: { - type: "array", - items: { - type: "string", - }, - }, - sessionFilter: { - type: "array", - items: { - type: "string", - }, - }, - target: { - type: "string", - enum: ["dm", "channel", "both"], - }, - }, - additionalProperties: false, - }, - stt: { - type: "object", - properties: { - enabled: { - type: "boolean", - }, - provider: { - type: "string", - }, - baseUrl: { - type: "string", - }, - apiKey: { - type: "string", - }, - model: { - type: "string", - }, - }, - additionalProperties: false, - }, - accounts: { - type: "object", - properties: {}, - additionalProperties: { - type: "object", - properties: { - enabled: { - type: "boolean", - }, - name: { - type: "string", - }, - appId: { - type: "string", - }, - clientSecret: { - anyOf: [ - { - type: "string", - }, - { - oneOf: [ - { - type: "object", - properties: { - source: { - type: "string", - const: "env", - }, - provider: { - type: "string", - pattern: "^[a-z][a-z0-9_-]{0,63}$", - }, - id: { - type: "string", - pattern: "^[A-Z][A-Z0-9_]{0,127}$", - }, - }, - required: ["source", "provider", "id"], - additionalProperties: false, - }, - { - type: "object", - properties: { - source: { - type: "string", - const: "file", - }, - provider: { - type: "string", - pattern: "^[a-z][a-z0-9_-]{0,63}$", - }, - id: { - type: "string", - }, - }, - required: ["source", "provider", "id"], - additionalProperties: false, - }, - { - type: "object", - properties: { - source: { - type: "string", - const: "exec", - }, - provider: { - type: "string", - pattern: "^[a-z][a-z0-9_-]{0,63}$", - }, - id: { - type: "string", - }, - }, - required: ["source", "provider", "id"], - additionalProperties: false, - }, - ], - }, - ], - }, - clientSecretFile: { - type: "string", - }, - allowFrom: { - type: "array", - items: { - anyOf: [ - { - type: "string", - }, - { - type: "number", - }, - ], - }, - }, - groupAllowFrom: { - type: "array", - items: { - anyOf: [ - { - type: "string", - }, - { - type: "number", - }, - ], - }, - }, - dmPolicy: { - type: "string", - enum: ["open", "allowlist", "disabled"], - }, - groupPolicy: { - type: "string", - enum: ["open", "allowlist", "disabled"], - }, - systemPrompt: { - type: "string", - }, - markdownSupport: { - type: "boolean", - }, - voiceDirectUploadFormats: { - type: "array", - items: { - type: "string", - }, - }, - audioFormatPolicy: { - type: "object", - properties: { - sttDirectFormats: { - type: "array", - items: { - type: "string", - }, - }, - uploadDirectFormats: { - type: "array", - items: { - type: "string", - }, - }, - transcodeEnabled: { - type: "boolean", - }, - }, - additionalProperties: false, - }, - urlDirectUpload: { - type: "boolean", - }, - upgradeUrl: { - type: "string", - }, - upgradeMode: { - type: "string", - enum: ["doc", "hot-reload"], - }, - streaming: { - anyOf: [ - { - type: "boolean", - }, - { - type: "object", - properties: { - mode: { - default: "partial", - type: "string", - enum: ["off", "partial"], - }, - c2cStreamApi: { - type: "boolean", - }, - }, - required: ["mode"], - additionalProperties: {}, - }, - ], - }, - execApprovals: { - type: "object", - properties: { - enabled: { - anyOf: [ - { - type: "boolean", - }, - { - type: "string", - const: "auto", - }, - ], - }, - approvers: { - type: "array", - items: { - type: "string", - }, - }, - agentFilter: { - type: "array", - items: { - type: "string", - }, - }, - sessionFilter: { - type: "array", - items: { - type: "string", - }, - }, - target: { - type: "string", - enum: ["dm", "channel", "both"], - }, - }, - additionalProperties: false, - }, - }, - additionalProperties: {}, - }, - }, - defaultAccount: { - type: "string", - }, - }, - additionalProperties: {}, - }, - }, - { - pluginId: "signal", - channelId: "signal", - label: "Signal", - description: 'signal-cli linked device; more setup (David Reagans: "Hop on Discord.").', - schema: { - $schema: "http://json-schema.org/draft-07/schema#", - type: "object", - properties: { - name: { - type: "string", - }, - capabilities: { - type: "array", - items: { - type: "string", - }, - }, - markdown: { - type: "object", - properties: { - tables: { - type: "string", - enum: ["off", "bullets", "code", "block"], - }, - }, - additionalProperties: false, - }, - enabled: { - type: "boolean", - }, - configWrites: { - type: "boolean", - }, - account: { - type: "string", - }, - accountUuid: { - type: "string", - }, - httpUrl: { - type: "string", - }, - httpHost: { - type: "string", - }, - httpPort: { - type: "integer", - exclusiveMinimum: 0, - maximum: 9007199254740991, - }, - cliPath: { - type: "string", - }, - autoStart: { - type: "boolean", - }, - startupTimeoutMs: { - type: "integer", - minimum: 1000, - maximum: 120000, - }, - receiveMode: { - anyOf: [ - { - type: "string", - const: "on-start", - }, - { - type: "string", - const: "manual", - }, - ], - }, - ignoreAttachments: { - type: "boolean", - }, - ignoreStories: { - type: "boolean", - }, - sendReadReceipts: { - type: "boolean", - }, - dmPolicy: { - default: "pairing", - type: "string", - enum: ["pairing", "allowlist", "open", "disabled"], - }, - allowFrom: { - type: "array", - items: { - anyOf: [ - { - type: "string", - }, - { - type: "number", - }, - ], - }, - }, - defaultTo: { - type: "string", - }, - groupAllowFrom: { - type: "array", - items: { - anyOf: [ - { - type: "string", - }, - { - type: "number", - }, - ], - }, - }, - groupPolicy: { - default: "allowlist", - type: "string", - enum: ["open", "disabled", "allowlist"], - }, - contextVisibility: { - type: "string", - enum: ["all", "allowlist", "allowlist_quote"], - }, - groups: { - type: "object", - propertyNames: { - type: "string", - }, - additionalProperties: { - type: "object", - properties: { - requireMention: { - type: "boolean", - }, - ingest: { - type: "boolean", - }, - tools: { - type: "object", - properties: { - allow: { - type: "array", - items: { - type: "string", - }, - }, - alsoAllow: { - type: "array", - items: { - type: "string", - }, - }, - deny: { - type: "array", - items: { - type: "string", - }, - }, - }, - additionalProperties: false, - }, - toolsBySender: { - type: "object", - propertyNames: { - type: "string", - }, - additionalProperties: { - type: "object", - properties: { - allow: { - type: "array", - items: { - type: "string", - }, - }, - alsoAllow: { - type: "array", - items: { - type: "string", - }, - }, - deny: { - type: "array", - items: { - type: "string", - }, - }, - }, - additionalProperties: false, - }, - }, - }, - additionalProperties: false, - }, - }, - historyLimit: { - type: "integer", - minimum: 0, - maximum: 9007199254740991, - }, - dmHistoryLimit: { - type: "integer", - minimum: 0, - maximum: 9007199254740991, - }, - dms: { - type: "object", - propertyNames: { - type: "string", - }, - additionalProperties: { - type: "object", - properties: { - historyLimit: { - type: "integer", - minimum: 0, - maximum: 9007199254740991, - }, - }, - additionalProperties: false, - }, - }, - textChunkLimit: { - type: "integer", - exclusiveMinimum: 0, - maximum: 9007199254740991, - }, - chunkMode: { - type: "string", - enum: ["length", "newline"], - }, - blockStreaming: { - type: "boolean", - }, - blockStreamingCoalesce: { - type: "object", - properties: { - minChars: { - type: "integer", - exclusiveMinimum: 0, - maximum: 9007199254740991, - }, - maxChars: { - type: "integer", - exclusiveMinimum: 0, - maximum: 9007199254740991, - }, - idleMs: { - type: "integer", - minimum: 0, - maximum: 9007199254740991, - }, - }, - additionalProperties: false, - }, - mediaMaxMb: { - type: "integer", - exclusiveMinimum: 0, - maximum: 9007199254740991, - }, - reactionNotifications: { - type: "string", - enum: ["off", "own", "all", "allowlist"], - }, - reactionAllowlist: { - type: "array", - items: { - anyOf: [ - { - type: "string", - }, - { - type: "number", - }, - ], - }, - }, - actions: { - type: "object", - properties: { - reactions: { - type: "boolean", - }, - }, - additionalProperties: false, - }, - reactionLevel: { - type: "string", - enum: ["off", "ack", "minimal", "extensive"], - }, - heartbeat: { - type: "object", - properties: { - showOk: { - type: "boolean", - }, - showAlerts: { - type: "boolean", - }, - useIndicator: { - type: "boolean", - }, - }, - additionalProperties: false, - }, - healthMonitor: { - type: "object", - properties: { - enabled: { - type: "boolean", - }, - }, - additionalProperties: false, - }, - responsePrefix: { - type: "string", - }, - accounts: { - type: "object", - propertyNames: { - type: "string", - }, - additionalProperties: { - type: "object", - properties: { - name: { - type: "string", - }, - capabilities: { - type: "array", - items: { - type: "string", - }, - }, - markdown: { - type: "object", - properties: { - tables: { - type: "string", - enum: ["off", "bullets", "code", "block"], - }, - }, - additionalProperties: false, - }, - enabled: { - type: "boolean", - }, - configWrites: { - type: "boolean", - }, - account: { - type: "string", - }, - accountUuid: { - type: "string", - }, - httpUrl: { - type: "string", - }, - httpHost: { - type: "string", - }, - httpPort: { - type: "integer", - exclusiveMinimum: 0, - maximum: 9007199254740991, - }, - cliPath: { - type: "string", - }, - autoStart: { - type: "boolean", - }, - startupTimeoutMs: { - type: "integer", - minimum: 1000, - maximum: 120000, - }, - receiveMode: { - anyOf: [ - { - type: "string", - const: "on-start", - }, - { - type: "string", - const: "manual", - }, - ], - }, - ignoreAttachments: { - type: "boolean", - }, - ignoreStories: { - type: "boolean", - }, - sendReadReceipts: { - type: "boolean", - }, - dmPolicy: { - default: "pairing", - type: "string", - enum: ["pairing", "allowlist", "open", "disabled"], - }, - allowFrom: { - type: "array", - items: { - anyOf: [ - { - type: "string", - }, - { - type: "number", - }, - ], - }, - }, - defaultTo: { - type: "string", - }, - groupAllowFrom: { - type: "array", - items: { - anyOf: [ - { - type: "string", - }, - { - type: "number", - }, - ], - }, - }, - groupPolicy: { - default: "allowlist", - type: "string", - enum: ["open", "disabled", "allowlist"], - }, - contextVisibility: { - type: "string", - enum: ["all", "allowlist", "allowlist_quote"], - }, - groups: { - type: "object", - propertyNames: { - type: "string", - }, - additionalProperties: { - type: "object", - properties: { - requireMention: { - type: "boolean", - }, - ingest: { - type: "boolean", - }, - tools: { - type: "object", - properties: { - allow: { - type: "array", - items: { - type: "string", - }, - }, - alsoAllow: { - type: "array", - items: { - type: "string", - }, - }, - deny: { - type: "array", - items: { - type: "string", - }, - }, - }, - additionalProperties: false, - }, - toolsBySender: { - type: "object", - propertyNames: { - type: "string", - }, - additionalProperties: { - type: "object", - properties: { - allow: { - type: "array", - items: { - type: "string", - }, - }, - alsoAllow: { - type: "array", - items: { - type: "string", - }, - }, - deny: { - type: "array", - items: { - type: "string", - }, - }, - }, - additionalProperties: false, - }, - }, - }, - additionalProperties: false, - }, - }, - historyLimit: { - type: "integer", - minimum: 0, - maximum: 9007199254740991, - }, - dmHistoryLimit: { - type: "integer", - minimum: 0, - maximum: 9007199254740991, - }, - dms: { - type: "object", - propertyNames: { - type: "string", - }, - additionalProperties: { - type: "object", - properties: { - historyLimit: { - type: "integer", - minimum: 0, - maximum: 9007199254740991, - }, - }, - additionalProperties: false, - }, - }, - textChunkLimit: { - type: "integer", - exclusiveMinimum: 0, - maximum: 9007199254740991, - }, - chunkMode: { - type: "string", - enum: ["length", "newline"], - }, - blockStreaming: { - type: "boolean", - }, - blockStreamingCoalesce: { - type: "object", - properties: { - minChars: { - type: "integer", - exclusiveMinimum: 0, - maximum: 9007199254740991, - }, - maxChars: { - type: "integer", - exclusiveMinimum: 0, - maximum: 9007199254740991, - }, - idleMs: { - type: "integer", - minimum: 0, - maximum: 9007199254740991, - }, - }, - additionalProperties: false, - }, - mediaMaxMb: { - type: "integer", - exclusiveMinimum: 0, - maximum: 9007199254740991, - }, - reactionNotifications: { - type: "string", - enum: ["off", "own", "all", "allowlist"], - }, - reactionAllowlist: { - type: "array", - items: { - anyOf: [ - { - type: "string", - }, - { - type: "number", - }, - ], - }, - }, - actions: { - type: "object", - properties: { - reactions: { - type: "boolean", - }, - }, - additionalProperties: false, - }, - reactionLevel: { - type: "string", - enum: ["off", "ack", "minimal", "extensive"], - }, - heartbeat: { - type: "object", - properties: { - showOk: { - type: "boolean", - }, - showAlerts: { - type: "boolean", - }, - useIndicator: { - type: "boolean", - }, - }, - additionalProperties: false, - }, - healthMonitor: { - type: "object", - properties: { - enabled: { - type: "boolean", - }, - }, - additionalProperties: false, - }, - responsePrefix: { - type: "string", - }, - }, - required: ["dmPolicy", "groupPolicy"], - additionalProperties: false, - }, - }, - defaultAccount: { - type: "string", - }, - }, - required: ["dmPolicy", "groupPolicy"], - additionalProperties: false, - }, - uiHints: { - "": { - label: "Signal", - help: "Signal channel provider configuration including account identity and DM policy behavior. Keep account mapping explicit so routing remains stable across multi-device setups.", - }, - dmPolicy: { - label: "Signal DM Policy", - help: 'Direct message access control ("pairing" recommended). "open" requires channels.signal.allowFrom=["*"].', - }, - configWrites: { - label: "Signal Config Writes", - help: "Allow Signal to write config in response to channel events/commands (default: true).", - }, - account: { - label: "Signal Account", - help: "Signal account identifier (phone/number handle) used to bind this channel config to a specific Signal identity. Keep this aligned with your linked device/session state.", - }, - }, - }, - { - pluginId: "slack", - channelId: "slack", - label: "Slack", - description: "supported (Socket Mode).", - schema: { - $schema: "http://json-schema.org/draft-07/schema#", - type: "object", - properties: { - name: { - type: "string", - }, - mode: { - default: "socket", - type: "string", - enum: ["socket", "http"], - }, - socketMode: { - type: "object", - properties: { - clientPingTimeout: { - type: "integer", - exclusiveMinimum: 0, - maximum: 9007199254740991, - }, - serverPingTimeout: { - type: "integer", - exclusiveMinimum: 0, - maximum: 9007199254740991, - }, - pingPongLoggingEnabled: { - type: "boolean", - }, - }, - additionalProperties: false, - }, - signingSecret: { - anyOf: [ - { - type: "string", - }, - { - oneOf: [ - { - type: "object", - properties: { - source: { - type: "string", - const: "env", - }, - provider: { - type: "string", - pattern: "^[a-z][a-z0-9_-]{0,63}$", - }, - id: { - type: "string", - pattern: "^[A-Z][A-Z0-9_]{0,127}$", - }, - }, - required: ["source", "provider", "id"], - additionalProperties: false, - }, - { - type: "object", - properties: { - source: { - type: "string", - const: "file", - }, - provider: { - type: "string", - pattern: "^[a-z][a-z0-9_-]{0,63}$", - }, - id: { - type: "string", - }, - }, - required: ["source", "provider", "id"], - additionalProperties: false, - }, - { - type: "object", - properties: { - source: { - type: "string", - const: "exec", - }, - provider: { - type: "string", - pattern: "^[a-z][a-z0-9_-]{0,63}$", - }, - id: { - type: "string", - }, - }, - required: ["source", "provider", "id"], - additionalProperties: false, - }, - ], - }, - ], - }, - webhookPath: { - default: "/slack/events", - type: "string", - }, - capabilities: { - anyOf: [ - { - type: "array", - items: { - type: "string", - }, - }, - { - type: "object", - properties: { - interactiveReplies: { - type: "boolean", - }, - }, - additionalProperties: false, - }, - ], - }, - execApprovals: { - type: "object", - properties: { - enabled: { - type: "boolean", - }, - approvers: { - type: "array", - items: { - anyOf: [ - { - type: "string", - }, - { - type: "number", - }, - ], - }, - }, - agentFilter: { - type: "array", - items: { - type: "string", - }, - }, - sessionFilter: { - type: "array", - items: { - type: "string", - }, - }, - target: { - type: "string", - enum: ["dm", "channel", "both"], - }, - }, - additionalProperties: false, - }, - markdown: { - type: "object", - properties: { - tables: { - type: "string", - enum: ["off", "bullets", "code", "block"], - }, - }, - additionalProperties: false, - }, - enabled: { - type: "boolean", - }, - commands: { - type: "object", - properties: { - native: { - anyOf: [ - { - type: "boolean", - }, - { - type: "string", - const: "auto", - }, - ], - }, - nativeSkills: { - anyOf: [ - { - type: "boolean", - }, - { - type: "string", - const: "auto", - }, - ], - }, - }, - additionalProperties: false, - }, - configWrites: { - type: "boolean", - }, - botToken: { - anyOf: [ - { - type: "string", - }, - { - oneOf: [ - { - type: "object", - properties: { - source: { - type: "string", - const: "env", - }, - provider: { - type: "string", - pattern: "^[a-z][a-z0-9_-]{0,63}$", - }, - id: { - type: "string", - pattern: "^[A-Z][A-Z0-9_]{0,127}$", - }, - }, - required: ["source", "provider", "id"], - additionalProperties: false, - }, - { - type: "object", - properties: { - source: { - type: "string", - const: "file", - }, - provider: { - type: "string", - pattern: "^[a-z][a-z0-9_-]{0,63}$", - }, - id: { - type: "string", - }, - }, - required: ["source", "provider", "id"], - additionalProperties: false, - }, - { - type: "object", - properties: { - source: { - type: "string", - const: "exec", - }, - provider: { - type: "string", - pattern: "^[a-z][a-z0-9_-]{0,63}$", - }, - id: { - type: "string", - }, - }, - required: ["source", "provider", "id"], - additionalProperties: false, - }, - ], - }, - ], - }, - appToken: { - anyOf: [ - { - type: "string", - }, - { - oneOf: [ - { - type: "object", - properties: { - source: { - type: "string", - const: "env", - }, - provider: { - type: "string", - pattern: "^[a-z][a-z0-9_-]{0,63}$", - }, - id: { - type: "string", - pattern: "^[A-Z][A-Z0-9_]{0,127}$", - }, - }, - required: ["source", "provider", "id"], - additionalProperties: false, - }, - { - type: "object", - properties: { - source: { - type: "string", - const: "file", - }, - provider: { - type: "string", - pattern: "^[a-z][a-z0-9_-]{0,63}$", - }, - id: { - type: "string", - }, - }, - required: ["source", "provider", "id"], - additionalProperties: false, - }, - { - type: "object", - properties: { - source: { - type: "string", - const: "exec", - }, - provider: { - type: "string", - pattern: "^[a-z][a-z0-9_-]{0,63}$", - }, - id: { - type: "string", - }, - }, - required: ["source", "provider", "id"], - additionalProperties: false, - }, - ], - }, - ], - }, - userToken: { - anyOf: [ - { - type: "string", - }, - { - oneOf: [ - { - type: "object", - properties: { - source: { - type: "string", - const: "env", - }, - provider: { - type: "string", - pattern: "^[a-z][a-z0-9_-]{0,63}$", - }, - id: { - type: "string", - pattern: "^[A-Z][A-Z0-9_]{0,127}$", - }, - }, - required: ["source", "provider", "id"], - additionalProperties: false, - }, - { - type: "object", - properties: { - source: { - type: "string", - const: "file", - }, - provider: { - type: "string", - pattern: "^[a-z][a-z0-9_-]{0,63}$", - }, - id: { - type: "string", - }, - }, - required: ["source", "provider", "id"], - additionalProperties: false, - }, - { - type: "object", - properties: { - source: { - type: "string", - const: "exec", - }, - provider: { - type: "string", - pattern: "^[a-z][a-z0-9_-]{0,63}$", - }, - id: { - type: "string", - }, - }, - required: ["source", "provider", "id"], - additionalProperties: false, - }, - ], - }, - ], - }, - userTokenReadOnly: { - default: true, - type: "boolean", - }, - allowBots: { - type: "boolean", - }, - dangerouslyAllowNameMatching: { - type: "boolean", - }, - requireMention: { - type: "boolean", - }, - groupPolicy: { - default: "allowlist", - type: "string", - enum: ["open", "disabled", "allowlist"], - }, - contextVisibility: { - type: "string", - enum: ["all", "allowlist", "allowlist_quote"], - }, - historyLimit: { - type: "integer", - minimum: 0, - maximum: 9007199254740991, - }, - dmHistoryLimit: { - type: "integer", - minimum: 0, - maximum: 9007199254740991, - }, - dms: { - type: "object", - propertyNames: { - type: "string", - }, - additionalProperties: { - type: "object", - properties: { - historyLimit: { - type: "integer", - minimum: 0, - maximum: 9007199254740991, - }, - }, - additionalProperties: false, - }, - }, - textChunkLimit: { - type: "integer", - exclusiveMinimum: 0, - maximum: 9007199254740991, - }, - streaming: { - type: "object", - properties: { - mode: { - type: "string", - enum: ["off", "partial", "block", "progress"], - }, - chunkMode: { - type: "string", - enum: ["length", "newline"], - }, - preview: { - type: "object", - properties: { - chunk: { - type: "object", - properties: { - minChars: { - type: "integer", - exclusiveMinimum: 0, - maximum: 9007199254740991, - }, - maxChars: { - type: "integer", - exclusiveMinimum: 0, - maximum: 9007199254740991, - }, - breakPreference: { - anyOf: [ - { - type: "string", - const: "paragraph", - }, - { - type: "string", - const: "newline", - }, - { - type: "string", - const: "sentence", - }, - ], - }, - }, - additionalProperties: false, - }, - toolProgress: { - type: "boolean", - }, - commandText: { - type: "string", - enum: ["raw", "status"], - }, - }, - additionalProperties: false, - }, - progress: { - type: "object", - properties: { - label: { - anyOf: [ - { - type: "string", - }, - { - type: "boolean", - const: false, - }, - ], - }, - labels: { - type: "array", - items: { - type: "string", - }, - }, - maxLines: { - type: "integer", - exclusiveMinimum: 0, - maximum: 9007199254740991, - }, - render: { - type: "string", - enum: ["text", "rich"], - }, - toolProgress: { - type: "boolean", - }, - commandText: { - type: "string", - enum: ["raw", "status"], - }, - }, - additionalProperties: false, - }, - block: { - type: "object", - properties: { - enabled: { - type: "boolean", - }, - coalesce: { - type: "object", - properties: { - minChars: { - type: "integer", - exclusiveMinimum: 0, - maximum: 9007199254740991, - }, - maxChars: { - type: "integer", - exclusiveMinimum: 0, - maximum: 9007199254740991, - }, - idleMs: { - type: "integer", - minimum: 0, - maximum: 9007199254740991, - }, - }, - additionalProperties: false, - }, - }, - additionalProperties: false, - }, - nativeTransport: { - type: "boolean", - }, - }, - additionalProperties: false, - }, - mediaMaxMb: { - type: "number", - exclusiveMinimum: 0, - }, - reactionNotifications: { - type: "string", - enum: ["off", "own", "all", "allowlist"], - }, - reactionAllowlist: { - type: "array", - items: { - anyOf: [ - { - type: "string", - }, - { - type: "number", - }, - ], - }, - }, - replyToMode: { - anyOf: [ - { - type: "string", - const: "off", - }, - { - type: "string", - const: "first", - }, - { - type: "string", - const: "all", - }, - { - type: "string", - const: "batched", - }, - ], - }, - replyToModeByChatType: { - type: "object", - properties: { - direct: { - anyOf: [ - { - type: "string", - const: "off", - }, - { - type: "string", - const: "first", - }, - { - type: "string", - const: "all", - }, - { - type: "string", - const: "batched", - }, - ], - }, - group: { - anyOf: [ - { - type: "string", - const: "off", - }, - { - type: "string", - const: "first", - }, - { - type: "string", - const: "all", - }, - { - type: "string", - const: "batched", - }, - ], - }, - channel: { - anyOf: [ - { - type: "string", - const: "off", - }, - { - type: "string", - const: "first", - }, - { - type: "string", - const: "all", - }, - { - type: "string", - const: "batched", - }, - ], - }, - }, - additionalProperties: false, - }, - thread: { - type: "object", - properties: { - historyScope: { - type: "string", - enum: ["thread", "channel"], - }, - inheritParent: { - type: "boolean", - }, - initialHistoryLimit: { - type: "integer", - minimum: 0, - maximum: 9007199254740991, - }, - requireExplicitMention: { - type: "boolean", - }, - }, - additionalProperties: false, - }, - actions: { - type: "object", - properties: { - reactions: { - type: "boolean", - }, - messages: { - type: "boolean", - }, - pins: { - type: "boolean", - }, - search: { - type: "boolean", - }, - permissions: { - type: "boolean", - }, - memberInfo: { - type: "boolean", - }, - channelInfo: { - type: "boolean", - }, - emojiList: { - type: "boolean", - }, - }, - additionalProperties: false, - }, - slashCommand: { - type: "object", - properties: { - enabled: { - type: "boolean", - }, - name: { - type: "string", - }, - sessionPrefix: { - type: "string", - }, - ephemeral: { - type: "boolean", - }, - }, - additionalProperties: false, - }, - dmPolicy: { - type: "string", - enum: ["pairing", "allowlist", "open", "disabled"], - }, - allowFrom: { - type: "array", - items: { - anyOf: [ - { - type: "string", - }, - { - type: "number", - }, - ], - }, - }, - defaultTo: { - type: "string", - }, - dm: { - type: "object", - properties: { - enabled: { - type: "boolean", - }, - policy: { - type: "string", - enum: ["pairing", "allowlist", "open", "disabled"], - }, - allowFrom: { - type: "array", - items: { - anyOf: [ - { - type: "string", - }, - { - type: "number", - }, - ], - }, - }, - groupEnabled: { - type: "boolean", - }, - groupChannels: { - type: "array", - items: { - anyOf: [ - { - type: "string", - }, - { - type: "number", - }, - ], - }, - }, - replyToMode: { - anyOf: [ - { - type: "string", - const: "off", - }, - { - type: "string", - const: "first", - }, - { - type: "string", - const: "all", - }, - { - type: "string", - const: "batched", - }, - ], - }, - }, - additionalProperties: false, - }, - channels: { - type: "object", - propertyNames: { - type: "string", - }, - additionalProperties: { - type: "object", - properties: { - enabled: { - type: "boolean", - }, - requireMention: { - type: "boolean", - }, - tools: { - type: "object", - properties: { - allow: { - type: "array", - items: { - type: "string", - }, - }, - alsoAllow: { - type: "array", - items: { - type: "string", - }, - }, - deny: { - type: "array", - items: { - type: "string", - }, - }, - }, - additionalProperties: false, - }, - toolsBySender: { - type: "object", - propertyNames: { - type: "string", - }, - additionalProperties: { - type: "object", - properties: { - allow: { - type: "array", - items: { - type: "string", - }, - }, - alsoAllow: { - type: "array", - items: { - type: "string", - }, - }, - deny: { - type: "array", - items: { - type: "string", - }, - }, - }, - additionalProperties: false, - }, - }, - allowBots: { - type: "boolean", - }, - users: { - type: "array", - items: { - anyOf: [ - { - type: "string", - }, - { - type: "number", - }, - ], - }, - }, - skills: { - type: "array", - items: { - type: "string", - }, - }, - systemPrompt: { - type: "string", - }, - }, - additionalProperties: false, - }, - }, - heartbeat: { - type: "object", - properties: { - showOk: { - type: "boolean", - }, - showAlerts: { - type: "boolean", - }, - useIndicator: { - type: "boolean", - }, - }, - additionalProperties: false, - }, - healthMonitor: { - type: "object", - properties: { - enabled: { - type: "boolean", - }, - }, - additionalProperties: false, - }, - responsePrefix: { - type: "string", - }, - ackReaction: { - type: "string", - }, - typingReaction: { - type: "string", - }, - accounts: { - type: "object", - propertyNames: { - type: "string", - }, - additionalProperties: { - type: "object", - properties: { - name: { - type: "string", - }, - mode: { - type: "string", - enum: ["socket", "http"], - }, - socketMode: { - type: "object", - properties: { - clientPingTimeout: { - type: "integer", - exclusiveMinimum: 0, - maximum: 9007199254740991, - }, - serverPingTimeout: { - type: "integer", - exclusiveMinimum: 0, - maximum: 9007199254740991, - }, - pingPongLoggingEnabled: { - type: "boolean", - }, - }, - additionalProperties: false, - }, - signingSecret: { - anyOf: [ - { - type: "string", - }, - { - oneOf: [ - { - type: "object", - properties: { - source: { - type: "string", - const: "env", - }, - provider: { - type: "string", - pattern: "^[a-z][a-z0-9_-]{0,63}$", - }, - id: { - type: "string", - pattern: "^[A-Z][A-Z0-9_]{0,127}$", - }, - }, - required: ["source", "provider", "id"], - additionalProperties: false, - }, - { - type: "object", - properties: { - source: { - type: "string", - const: "file", - }, - provider: { - type: "string", - pattern: "^[a-z][a-z0-9_-]{0,63}$", - }, - id: { - type: "string", - }, - }, - required: ["source", "provider", "id"], - additionalProperties: false, - }, - { - type: "object", - properties: { - source: { - type: "string", - const: "exec", - }, - provider: { - type: "string", - pattern: "^[a-z][a-z0-9_-]{0,63}$", - }, - id: { - type: "string", - }, - }, - required: ["source", "provider", "id"], - additionalProperties: false, - }, - ], - }, - ], - }, - webhookPath: { - type: "string", - }, - capabilities: { - anyOf: [ - { - type: "array", - items: { - type: "string", - }, - }, - { - type: "object", - properties: { - interactiveReplies: { - type: "boolean", - }, - }, - additionalProperties: false, - }, - ], - }, - execApprovals: { - type: "object", - properties: { - enabled: { - type: "boolean", - }, - approvers: { - type: "array", - items: { - anyOf: [ - { - type: "string", - }, - { - type: "number", - }, - ], - }, - }, - agentFilter: { - type: "array", - items: { - type: "string", - }, - }, - sessionFilter: { - type: "array", - items: { - type: "string", - }, - }, - target: { - type: "string", - enum: ["dm", "channel", "both"], - }, - }, - additionalProperties: false, - }, - markdown: { - type: "object", - properties: { - tables: { - type: "string", - enum: ["off", "bullets", "code", "block"], - }, - }, - additionalProperties: false, - }, - enabled: { - type: "boolean", - }, - commands: { - type: "object", - properties: { - native: { - anyOf: [ - { - type: "boolean", - }, - { - type: "string", - const: "auto", - }, - ], - }, - nativeSkills: { - anyOf: [ - { - type: "boolean", - }, - { - type: "string", - const: "auto", - }, - ], - }, - }, - additionalProperties: false, - }, - configWrites: { - type: "boolean", - }, - botToken: { - anyOf: [ - { - type: "string", - }, - { - oneOf: [ - { - type: "object", - properties: { - source: { - type: "string", - const: "env", - }, - provider: { - type: "string", - pattern: "^[a-z][a-z0-9_-]{0,63}$", - }, - id: { - type: "string", - pattern: "^[A-Z][A-Z0-9_]{0,127}$", - }, - }, - required: ["source", "provider", "id"], - additionalProperties: false, - }, - { - type: "object", - properties: { - source: { - type: "string", - const: "file", - }, - provider: { - type: "string", - pattern: "^[a-z][a-z0-9_-]{0,63}$", - }, - id: { - type: "string", - }, - }, - required: ["source", "provider", "id"], - additionalProperties: false, - }, - { - type: "object", - properties: { - source: { - type: "string", - const: "exec", - }, - provider: { - type: "string", - pattern: "^[a-z][a-z0-9_-]{0,63}$", - }, - id: { - type: "string", - }, - }, - required: ["source", "provider", "id"], - additionalProperties: false, - }, - ], - }, - ], - }, - appToken: { - anyOf: [ - { - type: "string", - }, - { - oneOf: [ - { - type: "object", - properties: { - source: { - type: "string", - const: "env", - }, - provider: { - type: "string", - pattern: "^[a-z][a-z0-9_-]{0,63}$", - }, - id: { - type: "string", - pattern: "^[A-Z][A-Z0-9_]{0,127}$", - }, - }, - required: ["source", "provider", "id"], - additionalProperties: false, - }, - { - type: "object", - properties: { - source: { - type: "string", - const: "file", - }, - provider: { - type: "string", - pattern: "^[a-z][a-z0-9_-]{0,63}$", - }, - id: { - type: "string", - }, - }, - required: ["source", "provider", "id"], - additionalProperties: false, - }, - { - type: "object", - properties: { - source: { - type: "string", - const: "exec", - }, - provider: { - type: "string", - pattern: "^[a-z][a-z0-9_-]{0,63}$", - }, - id: { - type: "string", - }, - }, - required: ["source", "provider", "id"], - additionalProperties: false, - }, - ], - }, - ], - }, - userToken: { - anyOf: [ - { - type: "string", - }, - { - oneOf: [ - { - type: "object", - properties: { - source: { - type: "string", - const: "env", - }, - provider: { - type: "string", - pattern: "^[a-z][a-z0-9_-]{0,63}$", - }, - id: { - type: "string", - pattern: "^[A-Z][A-Z0-9_]{0,127}$", - }, - }, - required: ["source", "provider", "id"], - additionalProperties: false, - }, - { - type: "object", - properties: { - source: { - type: "string", - const: "file", - }, - provider: { - type: "string", - pattern: "^[a-z][a-z0-9_-]{0,63}$", - }, - id: { - type: "string", - }, - }, - required: ["source", "provider", "id"], - additionalProperties: false, - }, - { - type: "object", - properties: { - source: { - type: "string", - const: "exec", - }, - provider: { - type: "string", - pattern: "^[a-z][a-z0-9_-]{0,63}$", - }, - id: { - type: "string", - }, - }, - required: ["source", "provider", "id"], - additionalProperties: false, - }, - ], - }, - ], - }, - userTokenReadOnly: { - default: true, - type: "boolean", - }, - allowBots: { - type: "boolean", - }, - dangerouslyAllowNameMatching: { - type: "boolean", - }, - requireMention: { - type: "boolean", - }, - groupPolicy: { - type: "string", - enum: ["open", "disabled", "allowlist"], - }, - contextVisibility: { - type: "string", - enum: ["all", "allowlist", "allowlist_quote"], - }, - historyLimit: { - type: "integer", - minimum: 0, - maximum: 9007199254740991, - }, - dmHistoryLimit: { - type: "integer", - minimum: 0, - maximum: 9007199254740991, - }, - dms: { - type: "object", - propertyNames: { - type: "string", - }, - additionalProperties: { - type: "object", - properties: { - historyLimit: { - type: "integer", - minimum: 0, - maximum: 9007199254740991, - }, - }, - additionalProperties: false, - }, - }, - textChunkLimit: { - type: "integer", - exclusiveMinimum: 0, - maximum: 9007199254740991, - }, - streaming: { - type: "object", - properties: { - mode: { - type: "string", - enum: ["off", "partial", "block", "progress"], - }, - chunkMode: { - type: "string", - enum: ["length", "newline"], - }, - preview: { - type: "object", - properties: { - chunk: { - type: "object", - properties: { - minChars: { - type: "integer", - exclusiveMinimum: 0, - maximum: 9007199254740991, - }, - maxChars: { - type: "integer", - exclusiveMinimum: 0, - maximum: 9007199254740991, - }, - breakPreference: { - anyOf: [ - { - type: "string", - const: "paragraph", - }, - { - type: "string", - const: "newline", - }, - { - type: "string", - const: "sentence", - }, - ], - }, - }, - additionalProperties: false, - }, - toolProgress: { - type: "boolean", - }, - commandText: { - type: "string", - enum: ["raw", "status"], - }, - }, - additionalProperties: false, - }, - progress: { - type: "object", - properties: { - label: { - anyOf: [ - { - type: "string", - }, - { - type: "boolean", - const: false, - }, - ], - }, - labels: { - type: "array", - items: { - type: "string", - }, - }, - maxLines: { - type: "integer", - exclusiveMinimum: 0, - maximum: 9007199254740991, - }, - render: { - type: "string", - enum: ["text", "rich"], - }, - toolProgress: { - type: "boolean", - }, - commandText: { - type: "string", - enum: ["raw", "status"], - }, - }, - additionalProperties: false, - }, - block: { - type: "object", - properties: { - enabled: { - type: "boolean", - }, - coalesce: { - type: "object", - properties: { - minChars: { - type: "integer", - exclusiveMinimum: 0, - maximum: 9007199254740991, - }, - maxChars: { - type: "integer", - exclusiveMinimum: 0, - maximum: 9007199254740991, - }, - idleMs: { - type: "integer", - minimum: 0, - maximum: 9007199254740991, - }, - }, - additionalProperties: false, - }, - }, - additionalProperties: false, - }, - nativeTransport: { - type: "boolean", - }, - }, - additionalProperties: false, - }, - mediaMaxMb: { - type: "number", - exclusiveMinimum: 0, - }, - reactionNotifications: { - type: "string", - enum: ["off", "own", "all", "allowlist"], - }, - reactionAllowlist: { - type: "array", - items: { - anyOf: [ - { - type: "string", - }, - { - type: "number", - }, - ], - }, - }, - replyToMode: { - anyOf: [ - { - type: "string", - const: "off", - }, - { - type: "string", - const: "first", - }, - { - type: "string", - const: "all", - }, - { - type: "string", - const: "batched", - }, - ], - }, - replyToModeByChatType: { - type: "object", - properties: { - direct: { - anyOf: [ - { - type: "string", - const: "off", - }, - { - type: "string", - const: "first", - }, - { - type: "string", - const: "all", - }, - { - type: "string", - const: "batched", - }, - ], - }, - group: { - anyOf: [ - { - type: "string", - const: "off", - }, - { - type: "string", - const: "first", - }, - { - type: "string", - const: "all", - }, - { - type: "string", - const: "batched", - }, - ], - }, - channel: { - anyOf: [ - { - type: "string", - const: "off", - }, - { - type: "string", - const: "first", - }, - { - type: "string", - const: "all", - }, - { - type: "string", - const: "batched", - }, - ], - }, - }, - additionalProperties: false, - }, - thread: { - type: "object", - properties: { - historyScope: { - type: "string", - enum: ["thread", "channel"], - }, - inheritParent: { - type: "boolean", - }, - initialHistoryLimit: { - type: "integer", - minimum: 0, - maximum: 9007199254740991, - }, - requireExplicitMention: { - type: "boolean", - }, - }, - additionalProperties: false, - }, - actions: { - type: "object", - properties: { - reactions: { - type: "boolean", - }, - messages: { - type: "boolean", - }, - pins: { - type: "boolean", - }, - search: { - type: "boolean", - }, - permissions: { - type: "boolean", - }, - memberInfo: { - type: "boolean", - }, - channelInfo: { - type: "boolean", - }, - emojiList: { - type: "boolean", - }, - }, - additionalProperties: false, - }, - slashCommand: { - type: "object", - properties: { - enabled: { - type: "boolean", - }, - name: { - type: "string", - }, - sessionPrefix: { - type: "string", - }, - ephemeral: { - type: "boolean", - }, - }, - additionalProperties: false, - }, - dmPolicy: { - type: "string", - enum: ["pairing", "allowlist", "open", "disabled"], - }, - allowFrom: { - type: "array", - items: { - anyOf: [ - { - type: "string", - }, - { - type: "number", - }, - ], - }, - }, - defaultTo: { - type: "string", - }, - dm: { - type: "object", - properties: { - enabled: { - type: "boolean", - }, - policy: { - type: "string", - enum: ["pairing", "allowlist", "open", "disabled"], - }, - allowFrom: { - type: "array", - items: { - anyOf: [ - { - type: "string", - }, - { - type: "number", - }, - ], - }, - }, - groupEnabled: { - type: "boolean", - }, - groupChannels: { - type: "array", - items: { - anyOf: [ - { - type: "string", - }, - { - type: "number", - }, - ], - }, - }, - replyToMode: { - anyOf: [ - { - type: "string", - const: "off", - }, - { - type: "string", - const: "first", - }, - { - type: "string", - const: "all", - }, - { - type: "string", - const: "batched", - }, - ], - }, - }, - additionalProperties: false, - }, - channels: { - type: "object", - propertyNames: { - type: "string", - }, - additionalProperties: { - type: "object", - properties: { - enabled: { - type: "boolean", - }, - requireMention: { - type: "boolean", - }, - tools: { - type: "object", - properties: { - allow: { - type: "array", - items: { - type: "string", - }, - }, - alsoAllow: { - type: "array", - items: { - type: "string", - }, - }, - deny: { - type: "array", - items: { - type: "string", - }, - }, - }, - additionalProperties: false, - }, - toolsBySender: { - type: "object", - propertyNames: { - type: "string", - }, - additionalProperties: { - type: "object", - properties: { - allow: { - type: "array", - items: { - type: "string", - }, - }, - alsoAllow: { - type: "array", - items: { - type: "string", - }, - }, - deny: { - type: "array", - items: { - type: "string", - }, - }, - }, - additionalProperties: false, - }, - }, - allowBots: { - type: "boolean", - }, - users: { - type: "array", - items: { - anyOf: [ - { - type: "string", - }, - { - type: "number", - }, - ], - }, - }, - skills: { - type: "array", - items: { - type: "string", - }, - }, - systemPrompt: { - type: "string", - }, - }, - additionalProperties: false, - }, - }, - heartbeat: { - type: "object", - properties: { - showOk: { - type: "boolean", - }, - showAlerts: { - type: "boolean", - }, - useIndicator: { - type: "boolean", - }, - }, - additionalProperties: false, - }, - healthMonitor: { - type: "object", - properties: { - enabled: { - type: "boolean", - }, - }, - additionalProperties: false, - }, - responsePrefix: { - type: "string", - }, - ackReaction: { - type: "string", - }, - typingReaction: { - type: "string", - }, - }, - required: ["userTokenReadOnly"], - additionalProperties: false, - }, - }, - defaultAccount: { - type: "string", - }, - }, - required: ["mode", "webhookPath", "userTokenReadOnly", "groupPolicy"], - additionalProperties: false, - }, - uiHints: { - "": { - label: "Slack", - help: "Slack channel provider configuration for bot/app tokens, streaming behavior, and DM policy controls. Keep token handling and thread behavior explicit to avoid noisy workspace interactions.", - }, - "dm.policy": { - label: "Slack DM Policy", - help: 'Direct message access control ("pairing" recommended). "open" requires channels.slack.allowFrom=["*"] (legacy: channels.slack.dm.allowFrom).', - }, - dmPolicy: { - label: "Slack DM Policy", - help: 'Direct message access control ("pairing" recommended). "open" requires channels.slack.allowFrom=["*"].', - }, - configWrites: { - label: "Slack Config Writes", - help: "Allow Slack to write config in response to channel events/commands (default: true).", - }, - "commands.native": { - label: "Slack Native Commands", - help: 'Override native commands for Slack (bool or "auto").', - }, - "commands.nativeSkills": { - label: "Slack Native Skill Commands", - help: 'Override native skill commands for Slack (bool or "auto").', - }, - allowBots: { - label: "Slack Allow Bot Messages", - help: "Allow bot-authored messages to trigger Slack replies (default: false).", - }, - socketMode: { - label: "Slack Socket Mode Transport", - help: "Slack Socket Mode transport tuning passed to the Slack SDK. Use only when investigating ping/pong timeout or stale websocket behavior.", - }, - "socketMode.clientPingTimeout": { - label: "Slack Socket Mode Pong Timeout", - help: "Milliseconds the Slack SDK waits for a pong after its client ping before treating the websocket as stale (OpenClaw default: 15000). Increase on hosts with event-loop starvation or slow network scheduling.", - }, - "socketMode.serverPingTimeout": { - label: "Slack Socket Mode Server Ping Timeout", - help: "Milliseconds the Slack SDK waits for Slack server pings before treating the websocket as stale.", - }, - "socketMode.pingPongLoggingEnabled": { - label: "Slack Socket Mode Ping/Pong Logging", - help: "Enable Slack SDK ping/pong transport logs while debugging Socket Mode websocket health.", - }, - botToken: { - label: "Slack Bot Token", - help: "Slack bot token used for standard chat actions in the configured workspace. Keep this credential scoped and rotate if workspace app permissions change.", - }, - appToken: { - label: "Slack App Token", - help: "Slack app-level token used for Socket Mode connections and event transport when enabled. Use least-privilege app scopes and store this token as a secret.", - }, - userToken: { - label: "Slack User Token", - help: "Optional Slack user token for workflows requiring user-context API access beyond bot permissions. Use sparingly and audit scopes because this token can carry broader authority.", - }, - userTokenReadOnly: { - label: "Slack User Token Read Only", - help: "When true, treat configured Slack user token usage as read-only helper behavior where possible. Keep enabled if you only need supplemental reads without user-context writes.", - }, - "capabilities.interactiveReplies": { - label: "Slack Interactive Replies", - help: "Enable agent-authored Slack interactive reply directives (`[[slack_buttons: ...]]`, `[[slack_select: ...]]`). Default: false.", - }, - execApprovals: { - label: "Slack Exec Approvals", - help: "Slack-native exec approval routing and approver authorization. When unset, OpenClaw auto-enables DM-first native approvals if approvers can be resolved for this workspace account.", - }, - "execApprovals.enabled": { - label: "Slack Exec Approvals Enabled", - help: 'Controls Slack native exec approvals for this account: unset or "auto" enables DM-first native approvals when approvers can be resolved, true forces native approvals on, and false disables them.', - }, - "execApprovals.approvers": { - label: "Slack Exec Approval Approvers", - help: "Slack user IDs allowed to approve exec requests for this workspace account. Use Slack user IDs or user targets such as `U123`, `user:U123`, or `<@U123>`. If you leave this unset, OpenClaw falls back to commands.ownerAllowFrom when possible.", - }, - "execApprovals.agentFilter": { - label: "Slack Exec Approval Agent Filter", - help: 'Optional allowlist of agent IDs eligible for Slack exec approvals, for example `["main", "ops-agent"]`. Use this to keep approval prompts scoped to the agents you actually operate from Slack.', - }, - "execApprovals.sessionFilter": { - label: "Slack Exec Approval Session Filter", - help: "Optional session-key filters matched as substring or regex-style patterns before Slack approval routing is used. Use narrow patterns so Slack approvals only appear for intended sessions.", - }, - "execApprovals.target": { - label: "Slack Exec Approval Target", - help: 'Controls where Slack approval prompts are sent: "dm" sends to approver DMs (default), "channel" sends to the originating Slack chat/thread, and "both" sends to both. Channel delivery exposes the command text to the chat, so only use it in trusted channels.', - }, - streaming: { - label: "Slack Streaming Mode", - help: 'Unified Slack stream preview mode: "off" | "partial" | "block" | "progress". Legacy boolean/streamMode keys are auto-mapped.', - }, - "streaming.mode": { - label: "Slack Streaming Mode", - help: 'Canonical Slack preview mode: "off" | "partial" | "block" | "progress".', - }, - "streaming.chunkMode": { - label: "Slack Chunk Mode", - help: 'Chunking mode for outbound Slack text delivery: "length" (default) or "newline".', - }, - "streaming.block.enabled": { - label: "Slack Block Streaming Enabled", - help: 'Enable chunked block-style Slack preview delivery when channels.slack.streaming.mode="block".', - }, - "streaming.block.coalesce": { - label: "Slack Block Streaming Coalesce", - help: "Merge streamed Slack block replies before final delivery.", - }, - "streaming.nativeTransport": { - label: "Slack Native Streaming", - help: "Enable native Slack text streaming (chat.startStream/chat.appendStream/chat.stopStream) when channels.slack.streaming.mode is partial (default: true). Native streaming and Slack assistant thread status require a reply thread target; top-level DMs can still use draft post-and-edit preview streaming.", - }, - "streaming.preview.toolProgress": { - label: "Slack Draft Tool Progress", - help: "Show tool/progress activity in the live draft preview message (default: true). Set false to hide interim tool updates while the draft preview stays active.", - }, - "streaming.preview.commandText": { - label: "Slack Draft Command Text", - help: 'Command/exec detail in preview tool-progress lines: "raw" preserves released behavior; "status" shows only the tool label.', - }, - "streaming.progress.label": { - label: "Slack Progress Label", - help: 'Initial progress draft title. Use "auto" for built-in single-word labels, a custom string, or false to hide the title.', - }, - "streaming.progress.labels": { - label: "Slack Progress Label Pool", - help: 'Candidate labels for streaming.progress.label="auto". Leave unset to use OpenClaw built-in progress labels.', - }, - "streaming.progress.maxLines": { - label: "Slack Progress Max Lines", - help: "Maximum number of compact progress lines to keep below the draft label (default: 8).", - }, - "streaming.progress.render": { - label: "Slack Progress Renderer", - help: 'Progress draft renderer: "text" uses one portable text body; "rich" renders structured Slack Block Kit fields with the same text fallback.', - }, - "streaming.progress.toolProgress": { - label: "Slack Progress Tool Lines", - help: "Show compact tool/progress lines in progress draft mode (default: true). Set false to keep only the label until final delivery.", - }, - "streaming.progress.commandText": { - label: "Slack Progress Command Text", - help: 'Command/exec detail in progress draft lines: "raw" preserves released behavior; "status" shows only the tool label.', - }, - "thread.historyScope": { - label: "Slack Thread History Scope", - help: 'Scope for Slack thread history context ("thread" isolates per thread; "channel" reuses channel history).', - }, - "thread.inheritParent": { - label: "Slack Thread Parent Inheritance", - help: "If true, Slack thread sessions inherit the parent channel transcript (default: false).", - }, - "thread.initialHistoryLimit": { - label: "Slack Thread Initial History Limit", - help: "Maximum number of existing Slack thread messages to fetch when starting a new thread session (default: 20, set to 0 to disable).", - }, - "thread.requireExplicitMention": { - label: "Slack Thread Require Explicit Mention", - help: "If true, require an explicit @mention even inside threads where the bot has participated. Suppresses implicit thread mention behavior so the bot only responds to explicit @bot mentions in threads (default: false).", - }, - }, - }, - { - pluginId: "synology-chat", - channelId: "synology-chat", - label: "Synology Chat", - description: "Connect your Synology NAS Chat to OpenClaw with full agent capabilities.", - schema: { - $schema: "http://json-schema.org/draft-07/schema#", - type: "object", - properties: { - dangerouslyAllowNameMatching: { - type: "boolean", - }, - dangerouslyAllowInheritedWebhookPath: { - type: "boolean", - }, - }, - additionalProperties: {}, - }, - }, - { - pluginId: "telegram", - channelId: "telegram", - label: "Telegram", - description: "simplest way to get started — register a bot with @BotFather and get going.", - schema: { - $schema: "http://json-schema.org/draft-07/schema#", - type: "object", - properties: { - name: { - type: "string", - }, - capabilities: { - anyOf: [ - { - type: "array", - items: { - type: "string", - }, - }, - { - type: "object", - properties: { - inlineButtons: { - type: "string", - enum: ["off", "dm", "group", "all", "allowlist"], - }, - }, - additionalProperties: false, - }, - ], - }, - execApprovals: { - type: "object", - properties: { - enabled: { - type: "boolean", - }, - approvers: { - type: "array", - items: { - anyOf: [ - { - type: "string", - }, - { - type: "number", - }, - ], - }, - }, - agentFilter: { - type: "array", - items: { - type: "string", - }, - }, - sessionFilter: { - type: "array", - items: { - type: "string", - }, - }, - target: { - type: "string", - enum: ["dm", "channel", "both"], - }, - }, - additionalProperties: false, - }, - markdown: { - type: "object", - properties: { - tables: { - type: "string", - enum: ["off", "bullets", "code", "block"], - }, - }, - additionalProperties: false, - }, - enabled: { - type: "boolean", - }, - commands: { - type: "object", - properties: { - native: { - anyOf: [ - { - type: "boolean", - }, - { - type: "string", - const: "auto", - }, - ], - }, - nativeSkills: { - anyOf: [ - { - type: "boolean", - }, - { - type: "string", - const: "auto", - }, - ], - }, - }, - additionalProperties: false, - }, - customCommands: { - type: "array", - items: { - type: "object", - properties: { - command: { - type: "string", - }, - description: { - type: "string", - }, - }, - required: ["command", "description"], - additionalProperties: false, - }, - }, - configWrites: { - type: "boolean", - }, - dmPolicy: { - default: "pairing", - type: "string", - enum: ["pairing", "allowlist", "open", "disabled"], - }, - botToken: { - anyOf: [ - { - type: "string", - }, - { - oneOf: [ - { - type: "object", - properties: { - source: { - type: "string", - const: "env", - }, - provider: { - type: "string", - pattern: "^[a-z][a-z0-9_-]{0,63}$", - }, - id: { - type: "string", - pattern: "^[A-Z][A-Z0-9_]{0,127}$", - }, - }, - required: ["source", "provider", "id"], - additionalProperties: false, - }, - { - type: "object", - properties: { - source: { - type: "string", - const: "file", - }, - provider: { - type: "string", - pattern: "^[a-z][a-z0-9_-]{0,63}$", - }, - id: { - type: "string", - }, - }, - required: ["source", "provider", "id"], - additionalProperties: false, - }, - { - type: "object", - properties: { - source: { - type: "string", - const: "exec", - }, - provider: { - type: "string", - pattern: "^[a-z][a-z0-9_-]{0,63}$", - }, - id: { - type: "string", - }, - }, - required: ["source", "provider", "id"], - additionalProperties: false, - }, - ], - }, - ], - }, - tokenFile: { - type: "string", - }, - replyToMode: { - anyOf: [ - { - type: "string", - const: "off", - }, - { - type: "string", - const: "first", - }, - { - type: "string", - const: "all", - }, - { - type: "string", - const: "batched", - }, - ], - }, - dm: { - type: "object", - properties: { - threadReplies: { - type: "string", - enum: ["off", "inbound", "always"], - }, - }, - additionalProperties: false, - }, - groups: { - type: "object", - propertyNames: { - type: "string", - }, - additionalProperties: { - type: "object", - properties: { - requireMention: { - type: "boolean", - }, - ingest: { - type: "boolean", - }, - disableAudioPreflight: { - type: "boolean", - }, - groupPolicy: { - type: "string", - enum: ["open", "disabled", "allowlist"], - }, - tools: { - type: "object", - properties: { - allow: { - type: "array", - items: { - type: "string", - }, - }, - alsoAllow: { - type: "array", - items: { - type: "string", - }, - }, - deny: { - type: "array", - items: { - type: "string", - }, - }, - }, - additionalProperties: false, - }, - toolsBySender: { - type: "object", - propertyNames: { - type: "string", - }, - additionalProperties: { - type: "object", - properties: { - allow: { - type: "array", - items: { - type: "string", - }, - }, - alsoAllow: { - type: "array", - items: { - type: "string", - }, - }, - deny: { - type: "array", - items: { - type: "string", - }, - }, - }, - additionalProperties: false, - }, - }, - skills: { - type: "array", - items: { - type: "string", - }, - }, - enabled: { - type: "boolean", - }, - allowFrom: { - type: "array", - items: { - anyOf: [ - { - type: "string", - }, - { - type: "number", - }, - ], - }, - }, - systemPrompt: { - type: "string", - }, - topics: { - type: "object", - propertyNames: { - type: "string", - }, - additionalProperties: { - type: "object", - properties: { - requireMention: { - type: "boolean", - }, - ingest: { - type: "boolean", - }, - disableAudioPreflight: { - type: "boolean", - }, - groupPolicy: { - type: "string", - enum: ["open", "disabled", "allowlist"], - }, - skills: { - type: "array", - items: { - type: "string", - }, - }, - enabled: { - type: "boolean", - }, - allowFrom: { - type: "array", - items: { - anyOf: [ - { - type: "string", - }, - { - type: "number", - }, - ], - }, - }, - systemPrompt: { - type: "string", - }, - agentId: { - type: "string", - }, - errorPolicy: { - type: "string", - enum: ["always", "once", "silent"], - }, - errorCooldownMs: { - type: "integer", - minimum: 0, - maximum: 9007199254740991, - }, - }, - additionalProperties: false, - }, - }, - errorPolicy: { - type: "string", - enum: ["always", "once", "silent"], - }, - errorCooldownMs: { - type: "integer", - minimum: 0, - maximum: 9007199254740991, - }, - }, - additionalProperties: false, - }, - }, - allowFrom: { - type: "array", - items: { - anyOf: [ - { - type: "string", - }, - { - type: "number", - }, - ], - }, - }, - defaultTo: { - anyOf: [ - { - type: "string", - }, - { - type: "number", - }, - ], - }, - groupAllowFrom: { - type: "array", - items: { - anyOf: [ - { - type: "string", - }, - { - type: "number", - }, - ], - }, - }, - groupPolicy: { - default: "allowlist", - type: "string", - enum: ["open", "disabled", "allowlist"], - }, - contextVisibility: { - type: "string", - enum: ["all", "allowlist", "allowlist_quote"], - }, - historyLimit: { - type: "integer", - minimum: 0, - maximum: 9007199254740991, - }, - dmHistoryLimit: { - type: "integer", - minimum: 0, - maximum: 9007199254740991, - }, - dms: { - type: "object", - propertyNames: { - type: "string", - }, - additionalProperties: { - type: "object", - properties: { - historyLimit: { - type: "integer", - minimum: 0, - maximum: 9007199254740991, - }, - }, - additionalProperties: false, - }, - }, - direct: { - type: "object", - propertyNames: { - type: "string", - }, - additionalProperties: { - type: "object", - properties: { - dmPolicy: { - type: "string", - enum: ["pairing", "allowlist", "open", "disabled"], - }, - threadReplies: { - type: "string", - enum: ["off", "inbound", "always"], - }, - tools: { - type: "object", - properties: { - allow: { - type: "array", - items: { - type: "string", - }, - }, - alsoAllow: { - type: "array", - items: { - type: "string", - }, - }, - deny: { - type: "array", - items: { - type: "string", - }, - }, - }, - additionalProperties: false, - }, - toolsBySender: { - type: "object", - propertyNames: { - type: "string", - }, - additionalProperties: { - type: "object", - properties: { - allow: { - type: "array", - items: { - type: "string", - }, - }, - alsoAllow: { - type: "array", - items: { - type: "string", - }, - }, - deny: { - type: "array", - items: { - type: "string", - }, - }, - }, - additionalProperties: false, - }, - }, - skills: { - type: "array", - items: { - type: "string", - }, - }, - enabled: { - type: "boolean", - }, - allowFrom: { - type: "array", - items: { - anyOf: [ - { - type: "string", - }, - { - type: "number", - }, - ], - }, - }, - systemPrompt: { - type: "string", - }, - topics: { - type: "object", - propertyNames: { - type: "string", - }, - additionalProperties: { - type: "object", - properties: { - requireMention: { - type: "boolean", - }, - ingest: { - type: "boolean", - }, - disableAudioPreflight: { - type: "boolean", - }, - groupPolicy: { - type: "string", - enum: ["open", "disabled", "allowlist"], - }, - skills: { - type: "array", - items: { - type: "string", - }, - }, - enabled: { - type: "boolean", - }, - allowFrom: { - type: "array", - items: { - anyOf: [ - { - type: "string", - }, - { - type: "number", - }, - ], - }, - }, - systemPrompt: { - type: "string", - }, - agentId: { - type: "string", - }, - errorPolicy: { - type: "string", - enum: ["always", "once", "silent"], - }, - errorCooldownMs: { - type: "integer", - minimum: 0, - maximum: 9007199254740991, - }, - }, - additionalProperties: false, - }, - }, - errorPolicy: { - type: "string", - enum: ["always", "once", "silent"], - }, - errorCooldownMs: { - type: "integer", - minimum: 0, - maximum: 9007199254740991, - }, - requireTopic: { - type: "boolean", - }, - autoTopicLabel: { - anyOf: [ - { - type: "boolean", - }, - { - type: "object", - properties: { - enabled: { - type: "boolean", - }, - prompt: { - type: "string", - }, - }, - additionalProperties: false, - }, - ], - }, - }, - additionalProperties: false, - }, - }, - textChunkLimit: { - type: "integer", - exclusiveMinimum: 0, - maximum: 9007199254740991, - }, - streaming: { - type: "object", - properties: { - mode: { - type: "string", - enum: ["off", "partial", "block", "progress"], - }, - chunkMode: { - type: "string", - enum: ["length", "newline"], - }, - preview: { - type: "object", - properties: { - chunk: { - type: "object", - properties: { - minChars: { - type: "integer", - exclusiveMinimum: 0, - maximum: 9007199254740991, - }, - maxChars: { - type: "integer", - exclusiveMinimum: 0, - maximum: 9007199254740991, - }, - breakPreference: { - anyOf: [ - { - type: "string", - const: "paragraph", - }, - { - type: "string", - const: "newline", - }, - { - type: "string", - const: "sentence", - }, - ], - }, - }, - additionalProperties: false, - }, - toolProgress: { - type: "boolean", - }, - commandText: { - type: "string", - enum: ["raw", "status"], - }, - }, - additionalProperties: false, - }, - progress: { - type: "object", - properties: { - label: { - anyOf: [ - { - type: "string", - }, - { - type: "boolean", - const: false, - }, - ], - }, - labels: { - type: "array", - items: { - type: "string", - }, - }, - maxLines: { - type: "integer", - exclusiveMinimum: 0, - maximum: 9007199254740991, - }, - render: { - type: "string", - enum: ["text", "rich"], - }, - toolProgress: { - type: "boolean", - }, - commandText: { - type: "string", - enum: ["raw", "status"], - }, - }, - additionalProperties: false, - }, - block: { - type: "object", - properties: { - enabled: { - type: "boolean", - }, - coalesce: { - type: "object", - properties: { - minChars: { - type: "integer", - exclusiveMinimum: 0, - maximum: 9007199254740991, - }, - maxChars: { - type: "integer", - exclusiveMinimum: 0, - maximum: 9007199254740991, - }, - idleMs: { - type: "integer", - minimum: 0, - maximum: 9007199254740991, - }, - }, - additionalProperties: false, - }, - }, - additionalProperties: false, - }, - }, - additionalProperties: false, - }, - mediaMaxMb: { - type: "number", - exclusiveMinimum: 0, - }, - timeoutSeconds: { - type: "integer", - exclusiveMinimum: 0, - maximum: 9007199254740991, - }, - mediaGroupFlushMs: { - description: - "Buffer window in milliseconds for Telegram media groups/albums before dispatching them as one inbound message. Default: 500.", - type: "integer", - minimum: 10, - maximum: 60000, - }, - pollingStallThresholdMs: { - type: "integer", - minimum: 30000, - maximum: 600000, - }, - retry: { - type: "object", - properties: { - attempts: { - type: "integer", - minimum: 1, - maximum: 9007199254740991, - }, - minDelayMs: { - type: "integer", - minimum: 0, - maximum: 9007199254740991, - }, - maxDelayMs: { - type: "integer", - minimum: 0, - maximum: 9007199254740991, - }, - jitter: { - type: "number", - minimum: 0, - maximum: 1, - }, - }, - additionalProperties: false, - }, - network: { - type: "object", - properties: { - autoSelectFamily: { - type: "boolean", - }, - dnsResultOrder: { - type: "string", - enum: ["ipv4first", "verbatim"], - }, - dangerouslyAllowPrivateNetwork: { - description: - "Dangerous opt-in for trusted Telegram fake-IP or transparent-proxy environments where api.telegram.org resolves to private/internal/special-use addresses during media downloads.", - type: "boolean", - }, - }, - additionalProperties: false, - }, - proxy: { - type: "string", - }, - webhookUrl: { - description: - "Public HTTPS webhook URL registered with Telegram for inbound updates. This must be internet-reachable and requires channels.telegram.webhookSecret.", - type: "string", - }, - webhookSecret: { - description: - "Secret token sent to Telegram during webhook registration and verified on inbound webhook requests. Telegram returns this value for verification; this is not the gateway auth token and not the bot token.", - anyOf: [ - { - type: "string", - }, - { - oneOf: [ - { - type: "object", - properties: { - source: { - type: "string", - const: "env", - }, - provider: { - type: "string", - pattern: "^[a-z][a-z0-9_-]{0,63}$", - }, - id: { - type: "string", - pattern: "^[A-Z][A-Z0-9_]{0,127}$", - }, - }, - required: ["source", "provider", "id"], - additionalProperties: false, - }, - { - type: "object", - properties: { - source: { - type: "string", - const: "file", - }, - provider: { - type: "string", - pattern: "^[a-z][a-z0-9_-]{0,63}$", - }, - id: { - type: "string", - }, - }, - required: ["source", "provider", "id"], - additionalProperties: false, - }, - { - type: "object", - properties: { - source: { - type: "string", - const: "exec", - }, - provider: { - type: "string", - pattern: "^[a-z][a-z0-9_-]{0,63}$", - }, - id: { - type: "string", - }, - }, - required: ["source", "provider", "id"], - additionalProperties: false, - }, - ], - }, - ], - }, - webhookPath: { - description: - "Local webhook route path served by the gateway listener. Defaults to /telegram-webhook.", - type: "string", - }, - webhookHost: { - description: - "Local bind host for the webhook listener. Defaults to 127.0.0.1; keep loopback unless you intentionally expose direct ingress.", - type: "string", - }, - webhookPort: { - description: - "Local bind port for the webhook listener. Defaults to 8787; set to 0 to let the OS assign an ephemeral port.", - type: "integer", - minimum: 0, - maximum: 9007199254740991, - }, - webhookCertPath: { - description: - "Path to the self-signed certificate (PEM) to upload to Telegram during webhook registration. Required for self-signed certs (direct IP or no domain).", - type: "string", - }, - actions: { - type: "object", - properties: { - reactions: { - type: "boolean", - }, - sendMessage: { - type: "boolean", - }, - poll: { - type: "boolean", - }, - deleteMessage: { - type: "boolean", - }, - editMessage: { - type: "boolean", - }, - sticker: { - type: "boolean", - }, - createForumTopic: { - type: "boolean", - }, - editForumTopic: { - type: "boolean", - }, - }, - additionalProperties: false, - }, - threadBindings: { - type: "object", - properties: { - enabled: { - type: "boolean", - }, - idleHours: { - type: "number", - minimum: 0, - }, - maxAgeHours: { - type: "number", - minimum: 0, - }, - spawnSessions: { - type: "boolean", - }, - defaultSpawnContext: { - type: "string", - enum: ["isolated", "fork"], - }, - spawnSubagentSessions: { - type: "boolean", - }, - spawnAcpSessions: { - type: "boolean", - }, - }, - additionalProperties: false, - }, - reactionNotifications: { - type: "string", - enum: ["off", "own", "all"], - }, - reactionLevel: { - type: "string", - enum: ["off", "ack", "minimal", "extensive"], - }, - heartbeat: { - type: "object", - properties: { - showOk: { - type: "boolean", - }, - showAlerts: { - type: "boolean", - }, - useIndicator: { - type: "boolean", - }, - }, - additionalProperties: false, - }, - healthMonitor: { - type: "object", - properties: { - enabled: { - type: "boolean", - }, - }, - additionalProperties: false, - }, - linkPreview: { - type: "boolean", - }, - silentErrorReplies: { - type: "boolean", - }, - responsePrefix: { - type: "string", - }, - ackReaction: { - type: "string", - }, - errorPolicy: { - type: "string", - enum: ["always", "once", "silent"], - }, - errorCooldownMs: { - type: "integer", - minimum: 0, - maximum: 9007199254740991, - }, - apiRoot: { - type: "string", - format: "uri", - }, - trustedLocalFileRoots: { - description: - "Trusted local filesystem roots for self-hosted Telegram Bot API absolute file_path values. Only absolute paths under these roots are read directly; all other absolute paths are rejected.", - type: "array", - items: { - type: "string", - }, - }, - autoTopicLabel: { - anyOf: [ - { - type: "boolean", - }, - { - type: "object", - properties: { - enabled: { - type: "boolean", - }, - prompt: { - type: "string", - }, - }, - additionalProperties: false, - }, - ], - }, - accounts: { - type: "object", - propertyNames: { - type: "string", - }, - additionalProperties: { - type: "object", - properties: { - name: { - type: "string", - }, - capabilities: { - anyOf: [ - { - type: "array", - items: { - type: "string", - }, - }, - { - type: "object", - properties: { - inlineButtons: { - type: "string", - enum: ["off", "dm", "group", "all", "allowlist"], - }, - }, - additionalProperties: false, - }, - ], - }, - execApprovals: { - type: "object", - properties: { - enabled: { - type: "boolean", - }, - approvers: { - type: "array", - items: { - anyOf: [ - { - type: "string", - }, - { - type: "number", - }, - ], - }, - }, - agentFilter: { - type: "array", - items: { - type: "string", - }, - }, - sessionFilter: { - type: "array", - items: { - type: "string", - }, - }, - target: { - type: "string", - enum: ["dm", "channel", "both"], - }, - }, - additionalProperties: false, - }, - markdown: { - type: "object", - properties: { - tables: { - type: "string", - enum: ["off", "bullets", "code", "block"], - }, - }, - additionalProperties: false, - }, - enabled: { - type: "boolean", - }, - commands: { - type: "object", - properties: { - native: { - anyOf: [ - { - type: "boolean", - }, - { - type: "string", - const: "auto", - }, - ], - }, - nativeSkills: { - anyOf: [ - { - type: "boolean", - }, - { - type: "string", - const: "auto", - }, - ], - }, - }, - additionalProperties: false, - }, - customCommands: { - type: "array", - items: { - type: "object", - properties: { - command: { - type: "string", - }, - description: { - type: "string", - }, - }, - required: ["command", "description"], - additionalProperties: false, - }, - }, - configWrites: { - type: "boolean", - }, - dmPolicy: { - default: "pairing", - type: "string", - enum: ["pairing", "allowlist", "open", "disabled"], - }, - botToken: { - anyOf: [ - { - type: "string", - }, - { - oneOf: [ - { - type: "object", - properties: { - source: { - type: "string", - const: "env", - }, - provider: { - type: "string", - pattern: "^[a-z][a-z0-9_-]{0,63}$", - }, - id: { - type: "string", - pattern: "^[A-Z][A-Z0-9_]{0,127}$", - }, - }, - required: ["source", "provider", "id"], - additionalProperties: false, - }, - { - type: "object", - properties: { - source: { - type: "string", - const: "file", - }, - provider: { - type: "string", - pattern: "^[a-z][a-z0-9_-]{0,63}$", - }, - id: { - type: "string", - }, - }, - required: ["source", "provider", "id"], - additionalProperties: false, - }, - { - type: "object", - properties: { - source: { - type: "string", - const: "exec", - }, - provider: { - type: "string", - pattern: "^[a-z][a-z0-9_-]{0,63}$", - }, - id: { - type: "string", - }, - }, - required: ["source", "provider", "id"], - additionalProperties: false, - }, - ], - }, - ], - }, - tokenFile: { - type: "string", - }, - replyToMode: { - anyOf: [ - { - type: "string", - const: "off", - }, - { - type: "string", - const: "first", - }, - { - type: "string", - const: "all", - }, - { - type: "string", - const: "batched", - }, - ], - }, - dm: { - type: "object", - properties: { - threadReplies: { - type: "string", - enum: ["off", "inbound", "always"], - }, - }, - additionalProperties: false, - }, - groups: { - type: "object", - propertyNames: { - type: "string", - }, - additionalProperties: { - type: "object", - properties: { - requireMention: { - type: "boolean", - }, - ingest: { - type: "boolean", - }, - disableAudioPreflight: { - type: "boolean", - }, - groupPolicy: { - type: "string", - enum: ["open", "disabled", "allowlist"], - }, - tools: { - type: "object", - properties: { - allow: { - type: "array", - items: { - type: "string", - }, - }, - alsoAllow: { - type: "array", - items: { - type: "string", - }, - }, - deny: { - type: "array", - items: { - type: "string", - }, - }, - }, - additionalProperties: false, - }, - toolsBySender: { - type: "object", - propertyNames: { - type: "string", - }, - additionalProperties: { - type: "object", - properties: { - allow: { - type: "array", - items: { - type: "string", - }, - }, - alsoAllow: { - type: "array", - items: { - type: "string", - }, - }, - deny: { - type: "array", - items: { - type: "string", - }, - }, - }, - additionalProperties: false, - }, - }, - skills: { - type: "array", - items: { - type: "string", - }, - }, - enabled: { - type: "boolean", - }, - allowFrom: { - type: "array", - items: { - anyOf: [ - { - type: "string", - }, - { - type: "number", - }, - ], - }, - }, - systemPrompt: { - type: "string", - }, - topics: { - type: "object", - propertyNames: { - type: "string", - }, - additionalProperties: { - type: "object", - properties: { - requireMention: { - type: "boolean", - }, - ingest: { - type: "boolean", - }, - disableAudioPreflight: { - type: "boolean", - }, - groupPolicy: { - type: "string", - enum: ["open", "disabled", "allowlist"], - }, - skills: { - type: "array", - items: { - type: "string", - }, - }, - enabled: { - type: "boolean", - }, - allowFrom: { - type: "array", - items: { - anyOf: [ - { - type: "string", - }, - { - type: "number", - }, - ], - }, - }, - systemPrompt: { - type: "string", - }, - agentId: { - type: "string", - }, - errorPolicy: { - type: "string", - enum: ["always", "once", "silent"], - }, - errorCooldownMs: { - type: "integer", - minimum: 0, - maximum: 9007199254740991, - }, - }, - additionalProperties: false, - }, - }, - errorPolicy: { - type: "string", - enum: ["always", "once", "silent"], - }, - errorCooldownMs: { - type: "integer", - minimum: 0, - maximum: 9007199254740991, - }, - }, - additionalProperties: false, - }, - }, - allowFrom: { - type: "array", - items: { - anyOf: [ - { - type: "string", - }, - { - type: "number", - }, - ], - }, - }, - defaultTo: { - anyOf: [ - { - type: "string", - }, - { - type: "number", - }, - ], - }, - groupAllowFrom: { - type: "array", - items: { - anyOf: [ - { - type: "string", - }, - { - type: "number", - }, - ], - }, - }, - groupPolicy: { - default: "allowlist", - type: "string", - enum: ["open", "disabled", "allowlist"], - }, - contextVisibility: { - type: "string", - enum: ["all", "allowlist", "allowlist_quote"], - }, - historyLimit: { - type: "integer", - minimum: 0, - maximum: 9007199254740991, - }, - dmHistoryLimit: { - type: "integer", - minimum: 0, - maximum: 9007199254740991, - }, - dms: { - type: "object", - propertyNames: { - type: "string", - }, - additionalProperties: { - type: "object", - properties: { - historyLimit: { - type: "integer", - minimum: 0, - maximum: 9007199254740991, - }, - }, - additionalProperties: false, - }, - }, - direct: { - type: "object", - propertyNames: { - type: "string", - }, - additionalProperties: { - type: "object", - properties: { - dmPolicy: { - type: "string", - enum: ["pairing", "allowlist", "open", "disabled"], - }, - threadReplies: { - type: "string", - enum: ["off", "inbound", "always"], - }, - tools: { - type: "object", - properties: { - allow: { - type: "array", - items: { - type: "string", - }, - }, - alsoAllow: { - type: "array", - items: { - type: "string", - }, - }, - deny: { - type: "array", - items: { - type: "string", - }, - }, - }, - additionalProperties: false, - }, - toolsBySender: { - type: "object", - propertyNames: { - type: "string", - }, - additionalProperties: { - type: "object", - properties: { - allow: { - type: "array", - items: { - type: "string", - }, - }, - alsoAllow: { - type: "array", - items: { - type: "string", - }, - }, - deny: { - type: "array", - items: { - type: "string", - }, - }, - }, - additionalProperties: false, - }, - }, - skills: { - type: "array", - items: { - type: "string", - }, - }, - enabled: { - type: "boolean", - }, - allowFrom: { - type: "array", - items: { - anyOf: [ - { - type: "string", - }, - { - type: "number", - }, - ], - }, - }, - systemPrompt: { - type: "string", - }, - topics: { - type: "object", - propertyNames: { - type: "string", - }, - additionalProperties: { - type: "object", - properties: { - requireMention: { - type: "boolean", - }, - ingest: { - type: "boolean", - }, - disableAudioPreflight: { - type: "boolean", - }, - groupPolicy: { - type: "string", - enum: ["open", "disabled", "allowlist"], - }, - skills: { - type: "array", - items: { - type: "string", - }, - }, - enabled: { - type: "boolean", - }, - allowFrom: { - type: "array", - items: { - anyOf: [ - { - type: "string", - }, - { - type: "number", - }, - ], - }, - }, - systemPrompt: { - type: "string", - }, - agentId: { - type: "string", - }, - errorPolicy: { - type: "string", - enum: ["always", "once", "silent"], - }, - errorCooldownMs: { - type: "integer", - minimum: 0, - maximum: 9007199254740991, - }, - }, - additionalProperties: false, - }, - }, - errorPolicy: { - type: "string", - enum: ["always", "once", "silent"], - }, - errorCooldownMs: { - type: "integer", - minimum: 0, - maximum: 9007199254740991, - }, - requireTopic: { - type: "boolean", - }, - autoTopicLabel: { - anyOf: [ - { - type: "boolean", - }, - { - type: "object", - properties: { - enabled: { - type: "boolean", - }, - prompt: { - type: "string", - }, - }, - additionalProperties: false, - }, - ], - }, - }, - additionalProperties: false, - }, - }, - textChunkLimit: { - type: "integer", - exclusiveMinimum: 0, - maximum: 9007199254740991, - }, - streaming: { - type: "object", - properties: { - mode: { - type: "string", - enum: ["off", "partial", "block", "progress"], - }, - chunkMode: { - type: "string", - enum: ["length", "newline"], - }, - preview: { - type: "object", - properties: { - chunk: { - type: "object", - properties: { - minChars: { - type: "integer", - exclusiveMinimum: 0, - maximum: 9007199254740991, - }, - maxChars: { - type: "integer", - exclusiveMinimum: 0, - maximum: 9007199254740991, - }, - breakPreference: { - anyOf: [ - { - type: "string", - const: "paragraph", - }, - { - type: "string", - const: "newline", - }, - { - type: "string", - const: "sentence", - }, - ], - }, - }, - additionalProperties: false, - }, - toolProgress: { - type: "boolean", - }, - commandText: { - type: "string", - enum: ["raw", "status"], - }, - }, - additionalProperties: false, - }, - progress: { - type: "object", - properties: { - label: { - anyOf: [ - { - type: "string", - }, - { - type: "boolean", - const: false, - }, - ], - }, - labels: { - type: "array", - items: { - type: "string", - }, - }, - maxLines: { - type: "integer", - exclusiveMinimum: 0, - maximum: 9007199254740991, - }, - render: { - type: "string", - enum: ["text", "rich"], - }, - toolProgress: { - type: "boolean", - }, - commandText: { - type: "string", - enum: ["raw", "status"], - }, - }, - additionalProperties: false, - }, - block: { - type: "object", - properties: { - enabled: { - type: "boolean", - }, - coalesce: { - type: "object", - properties: { - minChars: { - type: "integer", - exclusiveMinimum: 0, - maximum: 9007199254740991, - }, - maxChars: { - type: "integer", - exclusiveMinimum: 0, - maximum: 9007199254740991, - }, - idleMs: { - type: "integer", - minimum: 0, - maximum: 9007199254740991, - }, - }, - additionalProperties: false, - }, - }, - additionalProperties: false, - }, - }, - additionalProperties: false, - }, - mediaMaxMb: { - type: "number", - exclusiveMinimum: 0, - }, - timeoutSeconds: { - type: "integer", - exclusiveMinimum: 0, - maximum: 9007199254740991, - }, - mediaGroupFlushMs: { - description: - "Buffer window in milliseconds for Telegram media groups/albums before dispatching them as one inbound message. Default: 500.", - type: "integer", - minimum: 10, - maximum: 60000, - }, - pollingStallThresholdMs: { - type: "integer", - minimum: 30000, - maximum: 600000, - }, - retry: { - type: "object", - properties: { - attempts: { - type: "integer", - minimum: 1, - maximum: 9007199254740991, - }, - minDelayMs: { - type: "integer", - minimum: 0, - maximum: 9007199254740991, - }, - maxDelayMs: { - type: "integer", - minimum: 0, - maximum: 9007199254740991, - }, - jitter: { - type: "number", - minimum: 0, - maximum: 1, - }, - }, - additionalProperties: false, - }, - network: { - type: "object", - properties: { - autoSelectFamily: { - type: "boolean", - }, - dnsResultOrder: { - type: "string", - enum: ["ipv4first", "verbatim"], - }, - dangerouslyAllowPrivateNetwork: { - description: - "Dangerous opt-in for trusted Telegram fake-IP or transparent-proxy environments where api.telegram.org resolves to private/internal/special-use addresses during media downloads.", - type: "boolean", - }, - }, - additionalProperties: false, - }, - proxy: { - type: "string", - }, - webhookUrl: { - description: - "Public HTTPS webhook URL registered with Telegram for inbound updates. This must be internet-reachable and requires channels.telegram.webhookSecret.", - type: "string", - }, - webhookSecret: { - description: - "Secret token sent to Telegram during webhook registration and verified on inbound webhook requests. Telegram returns this value for verification; this is not the gateway auth token and not the bot token.", - anyOf: [ - { - type: "string", - }, - { - oneOf: [ - { - type: "object", - properties: { - source: { - type: "string", - const: "env", - }, - provider: { - type: "string", - pattern: "^[a-z][a-z0-9_-]{0,63}$", - }, - id: { - type: "string", - pattern: "^[A-Z][A-Z0-9_]{0,127}$", - }, - }, - required: ["source", "provider", "id"], - additionalProperties: false, - }, - { - type: "object", - properties: { - source: { - type: "string", - const: "file", - }, - provider: { - type: "string", - pattern: "^[a-z][a-z0-9_-]{0,63}$", - }, - id: { - type: "string", - }, - }, - required: ["source", "provider", "id"], - additionalProperties: false, - }, - { - type: "object", - properties: { - source: { - type: "string", - const: "exec", - }, - provider: { - type: "string", - pattern: "^[a-z][a-z0-9_-]{0,63}$", - }, - id: { - type: "string", - }, - }, - required: ["source", "provider", "id"], - additionalProperties: false, - }, - ], - }, - ], - }, - webhookPath: { - description: - "Local webhook route path served by the gateway listener. Defaults to /telegram-webhook.", - type: "string", - }, - webhookHost: { - description: - "Local bind host for the webhook listener. Defaults to 127.0.0.1; keep loopback unless you intentionally expose direct ingress.", - type: "string", - }, - webhookPort: { - description: - "Local bind port for the webhook listener. Defaults to 8787; set to 0 to let the OS assign an ephemeral port.", - type: "integer", - minimum: 0, - maximum: 9007199254740991, - }, - webhookCertPath: { - description: - "Path to the self-signed certificate (PEM) to upload to Telegram during webhook registration. Required for self-signed certs (direct IP or no domain).", - type: "string", - }, - actions: { - type: "object", - properties: { - reactions: { - type: "boolean", - }, - sendMessage: { - type: "boolean", - }, - poll: { - type: "boolean", - }, - deleteMessage: { - type: "boolean", - }, - editMessage: { - type: "boolean", - }, - sticker: { - type: "boolean", - }, - createForumTopic: { - type: "boolean", - }, - editForumTopic: { - type: "boolean", - }, - }, - additionalProperties: false, - }, - threadBindings: { - type: "object", - properties: { - enabled: { - type: "boolean", - }, - idleHours: { - type: "number", - minimum: 0, - }, - maxAgeHours: { - type: "number", - minimum: 0, - }, - spawnSessions: { - type: "boolean", - }, - defaultSpawnContext: { - type: "string", - enum: ["isolated", "fork"], - }, - spawnSubagentSessions: { - type: "boolean", - }, - spawnAcpSessions: { - type: "boolean", - }, - }, - additionalProperties: false, - }, - reactionNotifications: { - type: "string", - enum: ["off", "own", "all"], - }, - reactionLevel: { - type: "string", - enum: ["off", "ack", "minimal", "extensive"], - }, - heartbeat: { - type: "object", - properties: { - showOk: { - type: "boolean", - }, - showAlerts: { - type: "boolean", - }, - useIndicator: { - type: "boolean", - }, - }, - additionalProperties: false, - }, - healthMonitor: { - type: "object", - properties: { - enabled: { - type: "boolean", - }, - }, - additionalProperties: false, - }, - linkPreview: { - type: "boolean", - }, - silentErrorReplies: { - type: "boolean", - }, - responsePrefix: { - type: "string", - }, - ackReaction: { - type: "string", - }, - errorPolicy: { - type: "string", - enum: ["always", "once", "silent"], - }, - errorCooldownMs: { - type: "integer", - minimum: 0, - maximum: 9007199254740991, - }, - apiRoot: { - type: "string", - format: "uri", - }, - trustedLocalFileRoots: { - description: - "Trusted local filesystem roots for self-hosted Telegram Bot API absolute file_path values. Only absolute paths under these roots are read directly; all other absolute paths are rejected.", - type: "array", - items: { - type: "string", - }, - }, - autoTopicLabel: { - anyOf: [ - { - type: "boolean", - }, - { - type: "object", - properties: { - enabled: { - type: "boolean", - }, - prompt: { - type: "string", - }, - }, - additionalProperties: false, - }, - ], - }, - }, - required: ["dmPolicy", "groupPolicy"], - additionalProperties: false, - }, - }, - defaultAccount: { - type: "string", - }, - }, - required: ["dmPolicy", "groupPolicy"], - additionalProperties: false, - }, - uiHints: { - "": { - label: "Telegram", - help: "Telegram channel provider configuration including auth tokens, retry behavior, and message rendering controls. Use this section to tune bot behavior for Telegram-specific API semantics.", - }, - customCommands: { - label: "Telegram Custom Commands", - help: "Additional Telegram bot menu commands (merged with native; conflicts ignored).", - }, - botToken: { - label: "Telegram Bot Token", - help: "Telegram bot token used to authenticate Bot API requests for this account/provider config. Use secret/env substitution and rotate tokens if exposure is suspected.", - }, - dmPolicy: { - label: "Telegram DM Policy", - help: 'Direct message access control ("pairing" recommended). "open" requires channels.telegram.allowFrom=["*"].', - }, - "dm.threadReplies": { - label: "Telegram DM Thread Replies", - help: 'Controls whether Telegram DMs with message_thread_id use flat sessions ("off", default) or thread-scoped sessions ("inbound" or "always"). Thread IDs are still preserved for replies when sessions stay flat.', - }, - "direct.*.threadReplies": { - label: "Telegram Per-DM Thread Replies", - help: 'Per-DM override for message_thread_id session threading. Use "inbound" only when a specific direct chat intentionally uses Telegram DM topics as separate sessions.', - }, - configWrites: { - label: "Telegram Config Writes", - help: "Allow Telegram to write config in response to channel events/commands (default: true).", - }, - "commands.native": { - label: "Telegram Native Commands", - help: 'Override native commands for Telegram (bool or "auto").', - }, - "commands.nativeSkills": { - label: "Telegram Native Skill Commands", - help: 'Override native skill commands for Telegram (bool or "auto").', - }, - streaming: { - label: "Telegram Streaming Mode", - help: 'Unified Telegram stream preview mode: "off" | "partial" | "block" | "progress" (default: "partial"). "progress" keeps a single editable progress draft until final delivery. Legacy boolean/streamMode keys are detected; run doctor --fix to migrate.', - }, - "streaming.mode": { - label: "Telegram Streaming Mode", - help: 'Canonical Telegram preview mode: "off" | "partial" | "block" | "progress" (default: "partial").', - }, - "streaming.chunkMode": { - label: "Telegram Chunk Mode", - help: 'Chunking mode for outbound Telegram text delivery: "length" (default) or "newline".', - }, - "streaming.block.enabled": { - label: "Telegram Block Streaming Enabled", - help: 'Enable chunked block-style Telegram preview delivery when channels.telegram.streaming.mode="block".', - }, - "streaming.block.coalesce": { - label: "Telegram Block Streaming Coalesce", - help: "Merge streamed Telegram block replies before sending final delivery.", - }, - "streaming.preview.chunk.minChars": { - label: "Telegram Draft Chunk Min Chars", - help: 'Minimum chars before emitting a Telegram block preview chunk when channels.telegram.streaming.mode="block".', - }, - "streaming.preview.chunk.maxChars": { - label: "Telegram Draft Chunk Max Chars", - help: 'Target max size for a Telegram block preview chunk when channels.telegram.streaming.mode="block".', - }, - "streaming.preview.chunk.breakPreference": { - label: "Telegram Draft Chunk Break Preference", - help: "Preferred breakpoints for Telegram draft chunks (paragraph | newline | sentence).", - }, - "streaming.preview.toolProgress": { - label: "Telegram Draft Tool Progress", - help: "Show tool/progress activity in the live draft preview message (default: true when preview streaming is active). Set false to keep tool updates out of the edited Telegram preview.", - }, - "streaming.preview.commandText": { - label: "Telegram Draft Command Text", - help: 'Command/exec detail in preview tool-progress lines: "raw" preserves released behavior; "status" shows only the tool label.', - }, - "streaming.progress.label": { - label: "Telegram Progress Label", - help: 'Initial progress draft title. Use "auto" for built-in single-word labels, a custom string, or false to hide the title.', - }, - "streaming.progress.labels": { - label: "Telegram Progress Label Pool", - help: 'Candidate labels for streaming.progress.label="auto". Leave unset to use OpenClaw built-in progress labels.', - }, - "streaming.progress.maxLines": { - label: "Telegram Progress Max Lines", - help: "Maximum number of compact progress lines to keep below the draft label (default: 8).", - }, - "streaming.progress.toolProgress": { - label: "Telegram Progress Tool Lines", - help: "Show compact tool/progress lines in progress draft mode (default: true). Set false to keep only the label until final delivery.", - }, - "streaming.progress.commandText": { - label: "Telegram Progress Command Text", - help: 'Command/exec detail in progress draft lines: "raw" preserves released behavior; "status" shows only the tool label.', - }, - "retry.attempts": { - label: "Telegram Retry Attempts", - help: "Max retry attempts for outbound Telegram API calls (default: 3).", - }, - "retry.minDelayMs": { - label: "Telegram Retry Min Delay (ms)", - help: "Minimum retry delay in ms for Telegram outbound calls.", - }, - "retry.maxDelayMs": { - label: "Telegram Retry Max Delay (ms)", - help: "Maximum retry delay cap in ms for Telegram outbound calls.", - }, - "retry.jitter": { - label: "Telegram Retry Jitter", - help: "Jitter factor (0-1) applied to Telegram retry delays.", - }, - "network.autoSelectFamily": { - label: "Telegram autoSelectFamily", - help: "Override Node autoSelectFamily for Telegram (true=enable, false=disable).", - }, - "network.dangerouslyAllowPrivateNetwork": { - label: "Telegram Dangerously Allow Private Network", - help: "Dangerous opt-in for trusted fake-IP or transparent-proxy environments where Telegram media downloads resolve api.telegram.org to private/internal/special-use addresses.", - }, - timeoutSeconds: { - label: "Telegram API Timeout (seconds)", - help: "Max seconds before Telegram API requests are aborted (default: 500 per grammY).", - }, - mediaGroupFlushMs: { - label: "Telegram Media Group Flush (ms)", - help: "Milliseconds to buffer Telegram albums/media groups before dispatching them as one inbound message. Default: 500.", - }, - pollingStallThresholdMs: { - label: "Telegram Polling Stall Threshold (ms)", - help: "Milliseconds without completed Telegram getUpdates liveness before the polling watchdog restarts the polling runner. Default: 120000.", - }, - silentErrorReplies: { - label: "Telegram Silent Error Replies", - help: "When true, Telegram bot replies marked as errors are sent silently (no notification sound). Default: false.", - }, - apiRoot: { - label: "Telegram API Root URL", - help: "Custom Telegram Bot API root URL. Use the API root only (for example https://api.telegram.org), not a full /bot endpoint. Use for self-hosted Bot API servers (https://github.com/tdlib/telegram-bot-api) or reverse proxies in regions where api.telegram.org is blocked.", - }, - trustedLocalFileRoots: { - label: "Telegram Trusted Local File Roots", - help: "Trusted local filesystem roots for self-hosted Telegram Bot API absolute file_path values. Only absolute paths inside these roots are read directly; all other absolute paths are rejected.", - }, - autoTopicLabel: { - label: "Telegram Auto Topic Label", - help: "Auto-rename DM forum topics on first message using LLM. Default: true. Set to false to disable, or use object form { enabled: true, prompt: '...' } for custom prompt.", - }, - "autoTopicLabel.enabled": { - label: "Telegram Auto Topic Label Enabled", - help: "Whether auto topic labeling is enabled. Default: true.", - }, - "autoTopicLabel.prompt": { - label: "Telegram Auto Topic Label Prompt", - help: "Custom prompt for LLM-based topic naming. The user message is appended after the prompt.", - }, - "capabilities.inlineButtons": { - label: "Telegram Inline Buttons", - help: "Enable Telegram inline button components for supported command and interaction surfaces. Disable if your deployment needs plain-text-only compatibility behavior.", - }, - execApprovals: { - label: "Telegram Exec Approvals", - help: "Telegram-native exec approval routing and approver authorization. When unset, OpenClaw auto-enables DM-first native approvals if approvers can be resolved for the selected bot account.", - }, - "execApprovals.enabled": { - label: "Telegram Exec Approvals Enabled", - help: 'Controls Telegram native exec approvals for this account: unset or "auto" enables DM-first native approvals when approvers can be resolved, true forces native approvals on, and false disables them.', - }, - "execApprovals.approvers": { - label: "Telegram Exec Approval Approvers", - help: "Telegram user IDs allowed to approve exec requests for this bot account. Use numeric Telegram user IDs. If you leave this unset, OpenClaw falls back to numeric owner IDs inferred from commands.ownerAllowFrom when possible.", - }, - "execApprovals.agentFilter": { - label: "Telegram Exec Approval Agent Filter", - help: 'Optional allowlist of agent IDs eligible for Telegram exec approvals, for example `["main", "ops-agent"]`. Use this to keep approval prompts scoped to the agents you actually operate from Telegram.', - }, - "execApprovals.sessionFilter": { - label: "Telegram Exec Approval Session Filter", - help: "Optional session-key filters matched as substring or regex-style patterns before Telegram approval routing is used. Use narrow patterns so Telegram approvals only appear for intended sessions.", - }, - "execApprovals.target": { - label: "Telegram Exec Approval Target", - help: 'Controls where Telegram approval prompts are sent: "dm" sends to approver DMs (default), "channel" sends to the originating Telegram chat/topic, and "both" sends to both. Channel delivery exposes the command text to the chat, so only use it in trusted groups/topics.', - }, - "threadBindings.enabled": { - label: "Telegram Thread Binding Enabled", - help: "Enable Telegram conversation binding features (/focus, /unfocus, /agents, and /session idle|max-age). Overrides session.threadBindings.enabled when set.", - }, - "threadBindings.idleHours": { - label: "Telegram Thread Binding Idle Timeout (hours)", - help: "Inactivity window in hours for Telegram bound sessions. Set 0 to disable idle auto-unfocus (default: 24). Overrides session.threadBindings.idleHours when set.", - }, - "threadBindings.maxAgeHours": { - label: "Telegram Thread Binding Max Age (hours)", - help: "Optional hard max age in hours for Telegram bound sessions. Set 0 to disable hard cap (default: 0). Overrides session.threadBindings.maxAgeHours when set.", - }, - "threadBindings.spawnSessions": { - label: "Telegram Thread-Bound Session Spawn", - help: "Allow sessions_spawn(thread=true) and ACP thread spawns to auto-bind Telegram current conversations when supported.", - }, - "threadBindings.defaultSpawnContext": { - label: "Telegram Thread Spawn Context", - help: 'Default native subagent context for thread-bound spawns. "fork" starts from the requester transcript; "isolated" starts clean. Default: "fork".', - }, - }, - }, - { - pluginId: "tlon", - channelId: "tlon", - label: "Tlon", - description: "decentralized messaging on Urbit; install the plugin to enable.", - schema: { - $schema: "http://json-schema.org/draft-07/schema#", - type: "object", - properties: { - name: { - type: "string", - }, - enabled: { - type: "boolean", - }, - ship: { - type: "string", - minLength: 1, - }, - url: { - type: "string", - }, - code: { - type: "string", - }, - network: { - type: "object", - properties: { - dangerouslyAllowPrivateNetwork: { - type: "boolean", - }, - }, - additionalProperties: false, - }, - groupChannels: { - type: "array", - items: { - type: "string", - minLength: 1, - }, - }, - dmAllowlist: { - type: "array", - items: { - type: "string", - minLength: 1, - }, - }, - groupInviteAllowlist: { - type: "array", - items: { - type: "string", - minLength: 1, - }, - }, - autoDiscoverChannels: { - type: "boolean", - }, - showModelSignature: { - type: "boolean", - }, - responsePrefix: { - type: "string", - }, - autoAcceptDmInvites: { - type: "boolean", - }, - autoAcceptGroupInvites: { - type: "boolean", - }, - ownerShip: { - type: "string", - minLength: 1, - }, - authorization: { - type: "object", - properties: { - channelRules: { - type: "object", - propertyNames: { - type: "string", - }, - additionalProperties: { - type: "object", - properties: { - mode: { - type: "string", - enum: ["restricted", "open"], - }, - allowedShips: { - type: "array", - items: { - type: "string", - minLength: 1, - }, - }, - }, - additionalProperties: false, - }, - }, - }, - additionalProperties: false, - }, - defaultAuthorizedShips: { - type: "array", - items: { - type: "string", - minLength: 1, - }, - }, - accounts: { - type: "object", - propertyNames: { - type: "string", - }, - additionalProperties: { - type: "object", - properties: { - name: { - type: "string", - }, - enabled: { - type: "boolean", - }, - ship: { - type: "string", - minLength: 1, - }, - url: { - type: "string", - }, - code: { - type: "string", - }, - network: { - type: "object", - properties: { - dangerouslyAllowPrivateNetwork: { - type: "boolean", - }, - }, - additionalProperties: false, - }, - groupChannels: { - type: "array", - items: { - type: "string", - minLength: 1, - }, - }, - dmAllowlist: { - type: "array", - items: { - type: "string", - minLength: 1, - }, - }, - groupInviteAllowlist: { - type: "array", - items: { - type: "string", - minLength: 1, - }, - }, - autoDiscoverChannels: { - type: "boolean", - }, - showModelSignature: { - type: "boolean", - }, - responsePrefix: { - type: "string", - }, - autoAcceptDmInvites: { - type: "boolean", - }, - autoAcceptGroupInvites: { - type: "boolean", - }, - ownerShip: { - type: "string", - minLength: 1, - }, - }, - additionalProperties: false, - }, - }, - }, - additionalProperties: false, - }, - }, - { - pluginId: "twitch", - channelId: "twitch", - label: "Twitch", - description: "Twitch chat integration", - schema: { - $schema: "http://json-schema.org/draft-07/schema#", - anyOf: [ - { - type: "object", - properties: { - name: { - type: "string", - }, - enabled: { - type: "boolean", - }, - markdown: { - type: "object", - properties: { - tables: { - type: "string", - enum: ["off", "bullets", "code", "block"], - }, - }, - additionalProperties: false, - }, - defaultAccount: { - type: "string", - }, - username: { - type: "string", - }, - accessToken: { - type: "string", - }, - clientId: { - type: "string", - }, - channel: { - type: "string", - minLength: 1, - }, - allowFrom: { - type: "array", - items: { - type: "string", - }, - }, - allowedRoles: { - type: "array", - items: { - type: "string", - enum: ["moderator", "owner", "vip", "subscriber", "all"], - }, - }, - requireMention: { - type: "boolean", - }, - responsePrefix: { - type: "string", - }, - clientSecret: { - type: "string", - }, - refreshToken: { - type: "string", - }, - expiresIn: { - anyOf: [ - { - type: "number", - }, - { - type: "null", - }, - ], - }, - obtainmentTimestamp: { - type: "number", - }, - }, - required: ["username", "accessToken", "channel"], - additionalProperties: false, - }, - { - type: "object", - properties: { - name: { - type: "string", - }, - enabled: { - type: "boolean", - }, - markdown: { - type: "object", - properties: { - tables: { - type: "string", - enum: ["off", "bullets", "code", "block"], - }, - }, - additionalProperties: false, - }, - defaultAccount: { - type: "string", - }, - accounts: { - type: "object", - propertyNames: { - type: "string", - }, - additionalProperties: { - type: "object", - properties: { - username: { - type: "string", - }, - accessToken: { - type: "string", - }, - clientId: { - type: "string", - }, - channel: { - type: "string", - minLength: 1, - }, - enabled: { - type: "boolean", - }, - allowFrom: { - type: "array", - items: { - type: "string", - }, - }, - allowedRoles: { - type: "array", - items: { - type: "string", - enum: ["moderator", "owner", "vip", "subscriber", "all"], - }, - }, - requireMention: { - type: "boolean", - }, - responsePrefix: { - type: "string", - }, - clientSecret: { - type: "string", - }, - refreshToken: { - type: "string", - }, - expiresIn: { - anyOf: [ - { - type: "number", - }, - { - type: "null", - }, - ], - }, - obtainmentTimestamp: { - type: "number", - }, - }, - required: ["username", "accessToken", "channel"], - additionalProperties: false, - }, - }, - }, - required: ["accounts"], - additionalProperties: false, - }, - ], - }, - }, - { - pluginId: "whatsapp", - channelId: "whatsapp", - label: "WhatsApp", - description: "works with your own number; recommend a separate phone + eSIM.", - schema: { - $schema: "http://json-schema.org/draft-07/schema#", - type: "object", - properties: { - enabled: { - type: "boolean", - }, - capabilities: { - type: "array", - items: { - type: "string", - }, - }, - markdown: { - type: "object", - properties: { - tables: { - type: "string", - enum: ["off", "bullets", "code", "block"], - }, - }, - additionalProperties: false, - }, - configWrites: { - type: "boolean", - }, - sendReadReceipts: { - type: "boolean", - }, - messagePrefix: { - type: "string", - }, - responsePrefix: { - type: "string", - }, - dmPolicy: { - default: "pairing", - type: "string", - enum: ["pairing", "allowlist", "open", "disabled"], - }, - selfChatMode: { - type: "boolean", - }, - allowFrom: { - type: "array", - items: { - type: "string", - }, - }, - defaultTo: { - type: "string", - }, - groupAllowFrom: { - type: "array", - items: { - type: "string", - }, - }, - groupPolicy: { - default: "allowlist", - type: "string", - enum: ["open", "disabled", "allowlist"], - }, - contextVisibility: { - type: "string", - enum: ["all", "allowlist", "allowlist_quote"], - }, - historyLimit: { - type: "integer", - minimum: 0, - maximum: 9007199254740991, - }, - dmHistoryLimit: { - type: "integer", - minimum: 0, - maximum: 9007199254740991, - }, - dms: { - type: "object", - propertyNames: { - type: "string", - }, - additionalProperties: { - type: "object", - properties: { - historyLimit: { - type: "integer", - minimum: 0, - maximum: 9007199254740991, - }, - }, - additionalProperties: false, - }, - }, - textChunkLimit: { - type: "integer", - exclusiveMinimum: 0, - maximum: 9007199254740991, - }, - chunkMode: { - type: "string", - enum: ["length", "newline"], - }, - blockStreaming: { - type: "boolean", - }, - blockStreamingCoalesce: { - type: "object", - properties: { - minChars: { - type: "integer", - exclusiveMinimum: 0, - maximum: 9007199254740991, - }, - maxChars: { - type: "integer", - exclusiveMinimum: 0, - maximum: 9007199254740991, - }, - idleMs: { - type: "integer", - minimum: 0, - maximum: 9007199254740991, - }, - }, - additionalProperties: false, - }, - groups: { - type: "object", - propertyNames: { - type: "string", - }, - additionalProperties: { - type: "object", - properties: { - requireMention: { - type: "boolean", - }, - tools: { - type: "object", - properties: { - allow: { - type: "array", - items: { - type: "string", - }, - }, - alsoAllow: { - type: "array", - items: { - type: "string", - }, - }, - deny: { - type: "array", - items: { - type: "string", - }, - }, - }, - additionalProperties: false, - }, - toolsBySender: { - type: "object", - propertyNames: { - type: "string", - }, - additionalProperties: { - type: "object", - properties: { - allow: { - type: "array", - items: { - type: "string", - }, - }, - alsoAllow: { - type: "array", - items: { - type: "string", - }, - }, - deny: { - type: "array", - items: { - type: "string", - }, - }, - }, - additionalProperties: false, - }, - }, - systemPrompt: { - type: "string", - }, - }, - additionalProperties: false, - }, - }, - direct: { - type: "object", - propertyNames: { - type: "string", - }, - additionalProperties: { - type: "object", - properties: { - systemPrompt: { - type: "string", - }, - }, - additionalProperties: false, - }, - }, - ackReaction: { - type: "object", - properties: { - emoji: { - type: "string", - }, - direct: { - default: true, - type: "boolean", - }, - group: { - default: "mentions", - type: "string", - enum: ["always", "mentions", "never"], - }, - }, - required: ["direct", "group"], - additionalProperties: false, - }, - reactionLevel: { - type: "string", - enum: ["off", "ack", "minimal", "extensive"], - }, - debounceMs: { - default: 0, - type: "integer", - minimum: 0, - maximum: 9007199254740991, - }, - replyToMode: { - anyOf: [ - { - type: "string", - const: "off", - }, - { - type: "string", - const: "first", - }, - { - type: "string", - const: "all", - }, - { - type: "string", - const: "batched", - }, - ], - }, - heartbeat: { - type: "object", - properties: { - showOk: { - type: "boolean", - }, - showAlerts: { - type: "boolean", - }, - useIndicator: { - type: "boolean", - }, - }, - additionalProperties: false, - }, - healthMonitor: { - type: "object", - properties: { - enabled: { - type: "boolean", - }, - }, - additionalProperties: false, - }, - accounts: { - type: "object", - propertyNames: { - type: "string", - }, - additionalProperties: { - type: "object", - properties: { - enabled: { - type: "boolean", - }, - capabilities: { - type: "array", - items: { - type: "string", - }, - }, - markdown: { - type: "object", - properties: { - tables: { - type: "string", - enum: ["off", "bullets", "code", "block"], - }, - }, - additionalProperties: false, - }, - configWrites: { - type: "boolean", - }, - sendReadReceipts: { - type: "boolean", - }, - messagePrefix: { - type: "string", - }, - responsePrefix: { - type: "string", - }, - dmPolicy: { - type: "string", - enum: ["pairing", "allowlist", "open", "disabled"], - }, - selfChatMode: { - type: "boolean", - }, - allowFrom: { - type: "array", - items: { - type: "string", - }, - }, - defaultTo: { - type: "string", - }, - groupAllowFrom: { - type: "array", - items: { - type: "string", - }, - }, - groupPolicy: { - type: "string", - enum: ["open", "disabled", "allowlist"], - }, - contextVisibility: { - type: "string", - enum: ["all", "allowlist", "allowlist_quote"], - }, - historyLimit: { - type: "integer", - minimum: 0, - maximum: 9007199254740991, - }, - dmHistoryLimit: { - type: "integer", - minimum: 0, - maximum: 9007199254740991, - }, - dms: { - type: "object", - propertyNames: { - type: "string", - }, - additionalProperties: { - type: "object", - properties: { - historyLimit: { - type: "integer", - minimum: 0, - maximum: 9007199254740991, - }, - }, - additionalProperties: false, - }, - }, - textChunkLimit: { - type: "integer", - exclusiveMinimum: 0, - maximum: 9007199254740991, - }, - chunkMode: { - type: "string", - enum: ["length", "newline"], - }, - blockStreaming: { - type: "boolean", - }, - blockStreamingCoalesce: { - type: "object", - properties: { - minChars: { - type: "integer", - exclusiveMinimum: 0, - maximum: 9007199254740991, - }, - maxChars: { - type: "integer", - exclusiveMinimum: 0, - maximum: 9007199254740991, - }, - idleMs: { - type: "integer", - minimum: 0, - maximum: 9007199254740991, - }, - }, - additionalProperties: false, - }, - groups: { - type: "object", - propertyNames: { - type: "string", - }, - additionalProperties: { - type: "object", - properties: { - requireMention: { - type: "boolean", - }, - tools: { - type: "object", - properties: { - allow: { - type: "array", - items: { - type: "string", - }, - }, - alsoAllow: { - type: "array", - items: { - type: "string", - }, - }, - deny: { - type: "array", - items: { - type: "string", - }, - }, - }, - additionalProperties: false, - }, - toolsBySender: { - type: "object", - propertyNames: { - type: "string", - }, - additionalProperties: { - type: "object", - properties: { - allow: { - type: "array", - items: { - type: "string", - }, - }, - alsoAllow: { - type: "array", - items: { - type: "string", - }, - }, - deny: { - type: "array", - items: { - type: "string", - }, - }, - }, - additionalProperties: false, - }, - }, - systemPrompt: { - type: "string", - }, - }, - additionalProperties: false, - }, - }, - direct: { - type: "object", - propertyNames: { - type: "string", - }, - additionalProperties: { - type: "object", - properties: { - systemPrompt: { - type: "string", - }, - }, - additionalProperties: false, - }, - }, - ackReaction: { - type: "object", - properties: { - emoji: { - type: "string", - }, - direct: { - default: true, - type: "boolean", - }, - group: { - default: "mentions", - type: "string", - enum: ["always", "mentions", "never"], - }, - }, - required: ["direct", "group"], - additionalProperties: false, - }, - reactionLevel: { - type: "string", - enum: ["off", "ack", "minimal", "extensive"], - }, - debounceMs: { - type: "integer", - minimum: 0, - maximum: 9007199254740991, - }, - replyToMode: { - anyOf: [ - { - type: "string", - const: "off", - }, - { - type: "string", - const: "first", - }, - { - type: "string", - const: "all", - }, - { - type: "string", - const: "batched", - }, - ], - }, - heartbeat: { - type: "object", - properties: { - showOk: { - type: "boolean", - }, - showAlerts: { - type: "boolean", - }, - useIndicator: { - type: "boolean", - }, - }, - additionalProperties: false, - }, - healthMonitor: { - type: "object", - properties: { - enabled: { - type: "boolean", - }, - }, - additionalProperties: false, - }, - name: { - type: "string", - }, - authDir: { - type: "string", - }, - mediaMaxMb: { - type: "integer", - exclusiveMinimum: 0, - maximum: 9007199254740991, - }, - }, - additionalProperties: false, - }, - }, - defaultAccount: { - type: "string", - }, - mediaMaxMb: { - default: 50, - type: "integer", - exclusiveMinimum: 0, - maximum: 9007199254740991, - }, - actions: { - type: "object", - properties: { - reactions: { - type: "boolean", - }, - sendMessage: { - type: "boolean", - }, - polls: { - type: "boolean", - }, - }, - additionalProperties: false, - }, - }, - required: ["dmPolicy", "groupPolicy", "debounceMs", "mediaMaxMb"], - additionalProperties: false, - }, - uiHints: { - "": { - label: "WhatsApp", - help: "WhatsApp channel provider configuration for access policy and message batching behavior. Use this section to tune responsiveness and direct-message routing safety for WhatsApp chats.", - }, - dmPolicy: { - label: "WhatsApp DM Policy", - help: 'Direct message access control ("pairing" recommended). "open" requires channels.whatsapp.allowFrom=["*"].', - }, - selfChatMode: { - label: "WhatsApp Self-Phone Mode", - help: "Same-phone setup (bot uses your personal WhatsApp number).", - }, - debounceMs: { - label: "WhatsApp Message Debounce (ms)", - help: "Debounce window (ms) for batching rapid consecutive messages from the same sender (0 to disable).", - }, - configWrites: { - label: "WhatsApp Config Writes", - help: "Allow WhatsApp to write config in response to channel events/commands (default: true).", - }, - }, - unsupportedSecretRefSurfacePatterns: [ - "channels.whatsapp.accounts.*.creds.json", - "channels.whatsapp.creds.json", - ], - }, - { - pluginId: "zalo", - channelId: "zalo", - label: "Zalo", - description: "Vietnam-focused messaging platform with Bot API.", - schema: { - $schema: "http://json-schema.org/draft-07/schema#", - type: "object", - properties: { - name: { - type: "string", - }, - enabled: { - type: "boolean", - }, - markdown: { - type: "object", - properties: { - tables: { - type: "string", - enum: ["off", "bullets", "code", "block"], - }, - }, - additionalProperties: false, - }, - botToken: { - anyOf: [ - { - type: "string", - }, - { - oneOf: [ - { - type: "object", - properties: { - source: { - type: "string", - const: "env", - }, - provider: { - type: "string", - pattern: "^[a-z][a-z0-9_-]{0,63}$", - }, - id: { - type: "string", - pattern: "^[A-Z][A-Z0-9_]{0,127}$", - }, - }, - required: ["source", "provider", "id"], - additionalProperties: false, - }, - { - type: "object", - properties: { - source: { - type: "string", - const: "file", - }, - provider: { - type: "string", - pattern: "^[a-z][a-z0-9_-]{0,63}$", - }, - id: { - type: "string", - }, - }, - required: ["source", "provider", "id"], - additionalProperties: false, - }, - { - type: "object", - properties: { - source: { - type: "string", - const: "exec", - }, - provider: { - type: "string", - pattern: "^[a-z][a-z0-9_-]{0,63}$", - }, - id: { - type: "string", - }, - }, - required: ["source", "provider", "id"], - additionalProperties: false, - }, - ], - }, - ], - }, - tokenFile: { - type: "string", - }, - webhookUrl: { - type: "string", - }, - webhookSecret: { - anyOf: [ - { - type: "string", - }, - { - oneOf: [ - { - type: "object", - properties: { - source: { - type: "string", - const: "env", - }, - provider: { - type: "string", - pattern: "^[a-z][a-z0-9_-]{0,63}$", - }, - id: { - type: "string", - pattern: "^[A-Z][A-Z0-9_]{0,127}$", - }, - }, - required: ["source", "provider", "id"], - additionalProperties: false, - }, - { - type: "object", - properties: { - source: { - type: "string", - const: "file", - }, - provider: { - type: "string", - pattern: "^[a-z][a-z0-9_-]{0,63}$", - }, - id: { - type: "string", - }, - }, - required: ["source", "provider", "id"], - additionalProperties: false, - }, - { - type: "object", - properties: { - source: { - type: "string", - const: "exec", - }, - provider: { - type: "string", - pattern: "^[a-z][a-z0-9_-]{0,63}$", - }, - id: { - type: "string", - }, - }, - required: ["source", "provider", "id"], - additionalProperties: false, - }, - ], - }, - ], - }, - webhookPath: { - type: "string", - }, - dmPolicy: { - type: "string", - enum: ["pairing", "allowlist", "open", "disabled"], - }, - allowFrom: { - type: "array", - items: { - anyOf: [ - { - type: "string", - }, - { - type: "number", - }, - ], - }, - }, - groupPolicy: { - type: "string", - enum: ["open", "disabled", "allowlist"], - }, - groupAllowFrom: { - type: "array", - items: { - anyOf: [ - { - type: "string", - }, - { - type: "number", - }, - ], - }, - }, - mediaMaxMb: { - type: "number", - }, - proxy: { - type: "string", - }, - responsePrefix: { - type: "string", - }, - accounts: { - type: "object", - properties: {}, - additionalProperties: { - type: "object", - properties: { - name: { - type: "string", - }, - enabled: { - type: "boolean", - }, - markdown: { - type: "object", - properties: { - tables: { - type: "string", - enum: ["off", "bullets", "code", "block"], - }, - }, - additionalProperties: false, - }, - botToken: { - anyOf: [ - { - type: "string", - }, - { - oneOf: [ - { - type: "object", - properties: { - source: { - type: "string", - const: "env", - }, - provider: { - type: "string", - pattern: "^[a-z][a-z0-9_-]{0,63}$", - }, - id: { - type: "string", - pattern: "^[A-Z][A-Z0-9_]{0,127}$", - }, - }, - required: ["source", "provider", "id"], - additionalProperties: false, - }, - { - type: "object", - properties: { - source: { - type: "string", - const: "file", - }, - provider: { - type: "string", - pattern: "^[a-z][a-z0-9_-]{0,63}$", - }, - id: { - type: "string", - }, - }, - required: ["source", "provider", "id"], - additionalProperties: false, - }, - { - type: "object", - properties: { - source: { - type: "string", - const: "exec", - }, - provider: { - type: "string", - pattern: "^[a-z][a-z0-9_-]{0,63}$", - }, - id: { - type: "string", - }, - }, - required: ["source", "provider", "id"], - additionalProperties: false, - }, - ], - }, - ], - }, - tokenFile: { - type: "string", - }, - webhookUrl: { - type: "string", - }, - webhookSecret: { - anyOf: [ - { - type: "string", - }, - { - oneOf: [ - { - type: "object", - properties: { - source: { - type: "string", - const: "env", - }, - provider: { - type: "string", - pattern: "^[a-z][a-z0-9_-]{0,63}$", - }, - id: { - type: "string", - pattern: "^[A-Z][A-Z0-9_]{0,127}$", - }, - }, - required: ["source", "provider", "id"], - additionalProperties: false, - }, - { - type: "object", - properties: { - source: { - type: "string", - const: "file", - }, - provider: { - type: "string", - pattern: "^[a-z][a-z0-9_-]{0,63}$", - }, - id: { - type: "string", - }, - }, - required: ["source", "provider", "id"], - additionalProperties: false, - }, - { - type: "object", - properties: { - source: { - type: "string", - const: "exec", - }, - provider: { - type: "string", - pattern: "^[a-z][a-z0-9_-]{0,63}$", - }, - id: { - type: "string", - }, - }, - required: ["source", "provider", "id"], - additionalProperties: false, - }, - ], - }, - ], - }, - webhookPath: { - type: "string", - }, - dmPolicy: { - type: "string", - enum: ["pairing", "allowlist", "open", "disabled"], - }, - allowFrom: { - type: "array", - items: { - anyOf: [ - { - type: "string", - }, - { - type: "number", - }, - ], - }, - }, - groupPolicy: { - type: "string", - enum: ["open", "disabled", "allowlist"], - }, - groupAllowFrom: { - type: "array", - items: { - anyOf: [ - { - type: "string", - }, - { - type: "number", - }, - ], - }, - }, - mediaMaxMb: { - type: "number", - }, - proxy: { - type: "string", - }, - responsePrefix: { - type: "string", - }, - }, - additionalProperties: false, - }, - }, - defaultAccount: { - type: "string", - }, - }, - additionalProperties: false, - }, - }, - { - pluginId: "zalouser", - channelId: "zalouser", - label: "Zalo Personal", - description: "Zalo personal account via QR code login.", - schema: { - $schema: "http://json-schema.org/draft-07/schema#", - type: "object", - properties: { - name: { - type: "string", - }, - enabled: { - type: "boolean", - }, - markdown: { - type: "object", - properties: { - tables: { - type: "string", - enum: ["off", "bullets", "code", "block"], - }, - }, - additionalProperties: false, - }, - profile: { - type: "string", - }, - dangerouslyAllowNameMatching: { - type: "boolean", - }, - dmPolicy: { - type: "string", - enum: ["pairing", "allowlist", "open", "disabled"], - }, - allowFrom: { - type: "array", - items: { - anyOf: [ - { - type: "string", - }, - { - type: "number", - }, - ], - }, - }, - historyLimit: { - type: "integer", - minimum: 0, - maximum: 9007199254740991, - }, - groupAllowFrom: { - type: "array", - items: { - anyOf: [ - { - type: "string", - }, - { - type: "number", - }, - ], - }, - }, - groupPolicy: { - default: "allowlist", - type: "string", - enum: ["open", "disabled", "allowlist"], - }, - groups: { - type: "object", - properties: {}, - additionalProperties: { - type: "object", - properties: { - enabled: { - type: "boolean", - }, - requireMention: { - type: "boolean", - }, - tools: { - type: "object", - properties: { - allow: { - type: "array", - items: { - type: "string", - }, - }, - alsoAllow: { - type: "array", - items: { - type: "string", - }, - }, - deny: { - type: "array", - items: { - type: "string", - }, - }, - }, - additionalProperties: false, - }, - }, - additionalProperties: false, - }, - }, - messagePrefix: { - type: "string", - }, - responsePrefix: { - type: "string", - }, - accounts: { - type: "object", - properties: {}, - additionalProperties: { - type: "object", - properties: { - name: { - type: "string", - }, - enabled: { - type: "boolean", - }, - markdown: { - type: "object", - properties: { - tables: { - type: "string", - enum: ["off", "bullets", "code", "block"], - }, - }, - additionalProperties: false, - }, - profile: { - type: "string", - }, - dangerouslyAllowNameMatching: { - type: "boolean", - }, - dmPolicy: { - type: "string", - enum: ["pairing", "allowlist", "open", "disabled"], - }, - allowFrom: { - type: "array", - items: { - anyOf: [ - { - type: "string", - }, - { - type: "number", - }, - ], - }, - }, - historyLimit: { - type: "integer", - minimum: 0, - maximum: 9007199254740991, - }, - groupAllowFrom: { - type: "array", - items: { - anyOf: [ - { - type: "string", - }, - { - type: "number", - }, - ], - }, - }, - groupPolicy: { - default: "allowlist", - type: "string", - enum: ["open", "disabled", "allowlist"], - }, - groups: { - type: "object", - properties: {}, - additionalProperties: { - type: "object", - properties: { - enabled: { - type: "boolean", - }, - requireMention: { - type: "boolean", - }, - tools: { - type: "object", - properties: { - allow: { - type: "array", - items: { - type: "string", - }, - }, - alsoAllow: { - type: "array", - items: { - type: "string", - }, - }, - deny: { - type: "array", - items: { - type: "string", - }, - }, - }, - additionalProperties: false, - }, - }, - additionalProperties: false, - }, - }, - messagePrefix: { - type: "string", - }, - responsePrefix: { - type: "string", - }, - }, - required: ["groupPolicy"], - additionalProperties: false, - }, - }, - defaultAccount: { - type: "string", - }, - }, - required: ["groupPolicy"], - additionalProperties: false, - }, - }, -] as const; +type BundledChannelConfigMetadata = { + pluginId: string; + channelId: string; + label?: string; + description?: string; + schema: Record; + uiHints?: Record; + unsupportedSecretRefSurfacePatterns?: readonly string[]; +}; + +const RAW_BUNDLED_CHANNEL_CONFIG_METADATA = [ + '[{"pluginId":"bluebubbles","channelId":"bluebubbles","label":"BlueBubbles","description":"iMessage via the BlueBubbles mac app + REST API.","schema":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"name":{"type":"string"},"enabled":{"type":"boolean"},"markdown":{"type":"object","properties":{"tables":{"type":"string","enum":["off","bullets","code","block"]}},"additionalProperties":false},"actions":{"type":"object","properties":{"reactions":{"default":true,"type":"boolean"},"edit":{"default":true,"type":"boolean"},"unsend":{"default":true,"type":"boolean"},"reply":{"default":true,"type":"boolean"},"sendWithEffect":{"default":true,"type":"boolean"},"renameGroup":{"default":true,"type":"boolean"},"setGroupIcon":{"default":true,"type":"boolean"},"addParticipant":{"default":true,"type":"boolean"},"removeParticipant":{"default":true,"type":"boolean"},"leaveGroup":{"default":true,"type":"boolean"},"sendAttachment":{"default":true,"type":"boolean"}},"required":["reactions","edit","unsend","reply","sendWithEffect","renameGroup","setGroupIcon","addParticipant","removeParticipant","leaveGroup","sendAttachment"],"additionalProperties":false},"serverUrl":{"type":"string"},"password":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false}]}]},"webhookPath":{"type":"string"},"dmPolicy":{"type":"string","enum":["pairing","allowlist","open","disabled"]},"allowFrom":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"groupAllowFrom":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"groupPolicy":{"type":"string","enum":["open","disabled","allowlist"]},"enrichGroupParticipantsFromContacts":{"default":true,"type":"boolean"},"historyLimit":{"type":"integer","minimum":0,"maximum":9007199254740991},"dmHistoryLimit":{"type":"integer","minimum":0,"maximum":9007199254740991},"textChunkLimit":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"sendTimeoutMs":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"chunkMode":{"type":"string","enum":["length","newline"]},"mediaMaxMb":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"mediaLocalRoots":{"type":"array","items":{"type":"string"}},"sendReadReceipts":{"type":"boolean"},"network":{"type":"object","properties":{"dangerouslyAllowPrivateNetwork":{"type":"boolean"}},"additionalProperties":false},"catchup":{"type":"object","properties":{"enabled":{"type":"boolean"},"maxAgeMinutes":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"perRunLimit":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"firstRunLookbackMinutes":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"maxFailureRetries":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"additionalProperties":false},"blockStreaming":{"type":"boolean"},"replyContextApiFallback":{"type":"boolean"},"groups":{"type":"object","properties":{},"additionalProperties":{"type":"object","properties":{"requireMention":{"type":"boolean"},"tools":{"type":"object","properties":{"allow":{"type":"array","items":{"type":"string"}},"alsoAllow":{"type":"array","items":{"type":"string"}},"deny":{"type":"array","items":{"type":"string"}}},"additionalProperties":false},"systemPrompt":{"type":"string"}},"additionalProperties":false}},"coalesceSameSenderDms":{"type":"boolean"},"accounts":{"type":"object","properties":{},"additionalProperties":{"type":"object","properties":{"name":{"type":"string"},"enabled":{"type":"boolean"},"markdown":{"type":"object","properties":{"tables":{"type":"string","enum":["off","bullets","code","block"]}},"additionalProperties":false},"actions":{"type":"object","properties":{"reactions":{"default":true,"type":"boolean"},"edit":{"default":true,"type":"boolean"},"unsend":{"default":true,"type":"boolean"},"reply":{"default":true,"type":"boolean"},"sendWithEffect":{"default":true,"type":"boolean"},"renameGroup":{"default":true,"type":"boolean"},"setGroupIcon":{"default":true,"type":"boolean"},"addParticipant":{"default":true,"type":"boolean"},"removeParticipant":{"default":true,"type":"boolean"},"leaveGroup":{"default":true,"type":"boolean"},"sendAttachment":{"default":true,"type":"boolean"}},"required":["reactions","edit","unsend","reply","sendWithEffect","renameGroup","setGroupIcon","addParticipant","removeParticipant","leaveGroup","sendAttachment"],"additionalProperties":false},"serverUrl":{"type":"string"},"password":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false}]}]},"webhookPath":{"type":"string"},"dmPolicy":{"type":"string","enum":["pairing","allowlist","open","disabled"]},"allowFrom":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"groupAllowFrom":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"groupPolicy":{"type":"string","enum":["open","disabled","allowlist"]},"enrichGroupParticipantsFromContacts":{"default":true,"type":"boolean"},"historyLimit":{"type":"integer","minimum":0,"maximum":9007199254740991},"dmHistoryLimit":{"type":"integer","minimum":0,"maximum":9007199254740991},"textChunkLimit":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"sendTimeoutMs":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"chunkMode":{"type":"string","enum":["length","newline"]},"mediaMaxMb":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"mediaLocalRoots":{"type":"array","items":{"type":"string"}},"sendReadReceipts":{"type":"boolean"},"network":{"type":"object","properties":{"dangerouslyAllowPrivateNetwork":{"type":"boolean"}},"additionalProperties":false},"catchup":{"type":"object","properties":{"enabled":{"type":"boolean"},"maxAgeMinutes":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"perRunLimit":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"firstRunLookbackMinutes":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"maxFailureRetries":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"additionalProperties":false},"blockStreaming":{"type":"boolean"},"replyContextApiFallback":{"type":"boolean"},"groups":{"type":"object","properties":{},"additionalProperties":{"type":"object","properties":{"requireMention":{"type":"boolean"},"tools":{"type":"object","properties":{"allow":{"type":"array","items":{"type":"string"}},"alsoAllow":{"type":"array","items":{"type":"string"}},"deny":{"type":"array","items":{"type":"string"}}},"additionalProperties":false},"systemPrompt":{"type":"string"}},"additionalProperties":false}},"coalesceSameSenderDms":{"type":"boolean"}},"required":["enrichGroupParticipantsFromContacts"],"additionalProperties":false}},"defaultAccount":{"type":"string"}},"required":["enrichGroupParticipantsFromContacts"],"additionalProperties":false},"uiHints":{"":{"label":"BlueBubbles","help":"BlueBubbles channel provider configuration used for Apple messaging bridge integrations. Keep DM policy aligned with your trusted sender model in shared deployments."},"dmPolicy":{"label":"BlueBubbles DM Policy","help":"Direct message access control (\\"pairing\\" recommended). \\"open\\" requires channels.bluebubbles.allowFrom=[\\"*\\"]."}}},{"pluginId":"discord","channelId":"discord","label":"Discord","description":"very well supported right now.","schema":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"name":{"type":"string"},"capabilities":{"type":"array","items":{"type":"string"}},"markdown":{"type":"object","properties":{"tables":{"type":"string","enum":["off","bullets","code","block"]}},"additionalProperties":false},"enabled":{"type":"boolean"},"commands":{"type":"object","properties":{"native":{"anyOf":[{"type":"boolean"},{"type":"string","const":"auto"}]},"nativeSkills":{"anyOf":[{"type":"boolean"},{"type":"string","const":"auto"}]}},"additionalProperties":false},"configWrites":{"type":"boolean"},"token":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false}]}]},"applicationId":{"type":"string"},"proxy":{"type":"string"},"gatewayInfoTimeoutMs":{"type":"integer","exclusiveMinimum":0,"maximum":120000},"gatewayReadyTimeoutMs":{"type":"integer","exclusiveMinimum":0,"maximum":120000},"gatewayRuntimeReadyTimeoutMs":{"type":"integer","exclusiveMinimum":0,"maximum":120000},"allowBots":{"anyOf":[{"type":"boolean"},{"type":"string","const":"mentions"}]},"dangerouslyAllowNameMatching":{"type":"boolean"},"mentionAliases":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string","pattern":"^\\\\d+$"}},"groupPolicy":{"default":"allowlist","type":"string","enum":["open","disabled","allowlist"]},"contextVisibility":{"type":"string","enum":["all","allowlist","allowlist_quote"]},"historyLimit":{"type":"integer","minimum":0,"maximum":9007199254740991},"dmHistoryLimit":{"type":"integer","minimum":0,"maximum":9007199254740991},"dms":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"historyLimit":{"type":"integer","minimum":0,"maximum":9007199254740991}},"additionalProperties":false}},"textChunkLimit":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"streaming":{"type":"object","properties":{"mode":{"type":"string","enum":["off","partial","block","progress"]},"chunkMode":{"type":"string","enum":["length","newline"]},"preview":{"type":"object","properties":{"chunk":{"type":"object","properties":{"minChars":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"maxChars":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"breakPreference":{"anyOf":[{"type":"string","const":"paragraph"},{"type":"string","const":"newline"},{"type":"string","const":"sentence"}]}},"additionalProperties":false},"toolProgress":{"type":"boolean"},"commandText":{"type":"string","enum":["raw","status"]}},"additionalProperties":false},"progress":{"type":"object","properties":{"label":{"anyOf":[{"type":"string"},{"type":"boolean","const":false}]},"labels":{"type":"array","items":{"type":"string"}},"maxLines":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"render":{"type":"string","enum":["text","rich"]},"toolProgress":{"type":"boolean"},"commandText":{"type":"string","enum":["raw","status"]}},"additionalProperties":false},"block":{"type":"object","properties":{"enabled":{"type":"boolean"},"coalesce":{"type":"object","properties":{"minChars":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"maxChars":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"idleMs":{"type":"integer","minimum":0,"maximum":9007199254740991}},"additionalProperties":false}},"additionalProperties":false}},"additionalProperties":false},"maxLinesPerMessage":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"mediaMaxMb":{"type":"number","exclusiveMinimum":0},"retry":{"type":"object","properties":{"attempts":{"type":"integer","minimum":1,"maximum":9007199254740991},"minDelayMs":{"type":"integer","minimum":0,"maximum":9007199254740991},"maxDelayMs":{"type":"integer","minimum":0,"maximum":9007199254740991},"jitter":{"type":"number","minimum":0,"maximum":1}},"additionalProperties":false},"actions":{"type":"object","properties":{"reactions":{"type":"boolean"},"stickers":{"type":"boolean"},"emojiUploads":{"type":"boolean"},"stickerUploads":{"type":"boolean"},"polls":{"type":"boolean"},"permissions":{"type":"boolean"},"messages":{"type":"boolean"},"threads":{"type":"boolean"},"pins":{"type":"boolean"},"search":{"type":"boolean"},"memberInfo":{"type":"boolean"},"roleInfo":{"type":"boolean"},"roles":{"type":"boolean"},"channelInfo":{"type":"boolean"},"voiceStatus":{"type":"boolean"},"events":{"type":"boolean"},"moderation":{"type":"boolean"},"channels":{"type":"boolean"},"presence":{"type":"boolean"}},"additionalProperties":false},"replyToMode":{"anyOf":[{"type":"string","const":"off"},{"type":"string","const":"first"},{"type":"string","const":"all"},{"type":"string","const":"batched"}]},"thread":{"type":"object","properties":{"inheritParent":{"type":"boolean"}},"additionalProperties":false},"dmPolicy":{"type":"string","enum":["pairing","allowlist","open","disabled"]},"allowFrom":{"type":"array","items":{"type":"string"}},"defaultTo":{"type":"string"},"dm":{"type":"object","properties":{"enabled":{"type":"boolean"},"policy":{"type":"string","enum":["pairing","allowlist","open","disabled"]},"allowFrom":{"type":"array","items":{"type":"string"}},"groupEnabled":{"type":"boolean"},"groupChannels":{"type":"array","items":{"type":"string"}}},"additionalProperties":false},"guilds":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"slug":{"type":"string"},"requireMention":{"type":"boolean"},"ignoreOtherMentions":{"type":"boolean"},"tools":{"type":"object","properties":{"allow":{"type":"array","items":{"type":"string"}},"alsoAllow":{"type":"array","items":{"type":"string"}},"deny":{"type":"array","items":{"type":"string"}}},"additionalProperties":false},"toolsBySender":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"allow":{"type":"array","items":{"type":"string"}},"alsoAllow":{"type":"array","items":{"type":"string"}},"deny":{"type":"array","items":{"type":"string"}}},"additionalProperties":false}},"reactionNotifications":{"type":"string","enum":["off","own","all","allowlist"]},"users":{"type":"array","items":{"type":"string"}},"roles":{"type":"array","items":{"type":"string"}},"channels":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"requireMention":{"type":"boolean"},"ignoreOtherMentions":{"type":"boolean"},"tools":{"type":"object","properties":{"allow":{"type":"array","items":{"type":"string"}},"alsoAllow":{"type":"array","items":{"type":"string"}},"deny":{"type":"array","items":{"type":"string"}}},"additionalProperties":false},"toolsBySender":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"allow":{"type":"array","items":{"type":"string"}},"alsoAllow":{"type":"array","items":{"type":"string"}},"deny":{"type":"array","items":{"type":"string"}}},"additionalProperties":false}},"skills"', + ':{"type":"array","items":{"type":"string"}},"enabled":{"type":"boolean"},"users":{"type":"array","items":{"type":"string"}},"roles":{"type":"array","items":{"type":"string"}},"systemPrompt":{"type":"string"},"includeThreadStarter":{"type":"boolean"},"autoThread":{"type":"boolean"},"autoThreadName":{"type":"string","enum":["message","generated"]},"autoArchiveDuration":{"anyOf":[{"type":"string","enum":["60","1440","4320","10080"]},{"type":"number","const":60},{"type":"number","const":1440},{"type":"number","const":4320},{"type":"number","const":10080}]}},"additionalProperties":false}}},"additionalProperties":false}},"heartbeat":{"type":"object","properties":{"showOk":{"type":"boolean"},"showAlerts":{"type":"boolean"},"useIndicator":{"type":"boolean"}},"additionalProperties":false},"healthMonitor":{"type":"object","properties":{"enabled":{"type":"boolean"}},"additionalProperties":false},"execApprovals":{"type":"object","properties":{"enabled":{"type":"boolean"},"approvers":{"type":"array","items":{"type":"string"}},"agentFilter":{"type":"array","items":{"type":"string"}},"sessionFilter":{"type":"array","items":{"type":"string"}},"cleanupAfterResolve":{"type":"boolean"},"target":{"type":"string","enum":["dm","channel","both"]}},"additionalProperties":false},"agentComponents":{"type":"object","properties":{"enabled":{"type":"boolean"}},"additionalProperties":false},"ui":{"type":"object","properties":{"components":{"type":"object","properties":{"accentColor":{"type":"string","pattern":"^#?[0-9a-fA-F]{6}$"}},"additionalProperties":false}},"additionalProperties":false},"slashCommand":{"type":"object","properties":{"ephemeral":{"type":"boolean"}},"additionalProperties":false},"threadBindings":{"type":"object","properties":{"enabled":{"type":"boolean"},"idleHours":{"type":"number","minimum":0},"maxAgeHours":{"type":"number","minimum":0},"spawnSessions":{"type":"boolean"},"defaultSpawnContext":{"type":"string","enum":["isolated","fork"]},"spawnSubagentSessions":{"type":"boolean"},"spawnAcpSessions":{"type":"boolean"}},"additionalProperties":false},"intents":{"type":"object","properties":{"presence":{"type":"boolean"},"guildMembers":{"type":"boolean"},"voiceStates":{"type":"boolean"}},"additionalProperties":false},"voice":{"type":"object","properties":{"enabled":{"type":"boolean"},"model":{"type":"string","minLength":1},"autoJoin":{"type":"array","items":{"type":"object","properties":{"guildId":{"type":"string","minLength":1},"channelId":{"type":"string","minLength":1}},"required":["guildId","channelId"],"additionalProperties":false}},"daveEncryption":{"type":"boolean"},"decryptionFailureTolerance":{"type":"integer","minimum":0,"maximum":9007199254740991},"connectTimeoutMs":{"type":"integer","exclusiveMinimum":0,"maximum":120000},"reconnectGraceMs":{"type":"integer","exclusiveMinimum":0,"maximum":120000},"tts":{"type":"object","properties":{"auto":{"type":"string","enum":["off","always","inbound","tagged"]},"enabled":{"type":"boolean"},"mode":{"type":"string","enum":["final","all"]},"provider":{"type":"string","minLength":1},"persona":{"type":"string"},"personas":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"label":{"type":"string"},"description":{"type":"string"},"provider":{"type":"string","minLength":1},"fallbackPolicy":{"anyOf":[{"type":"string","const":"preserve-persona"},{"type":"string","const":"provider-defaults"},{"type":"string","const":"fail"}]},"prompt":{"type":"object","properties":{"profile":{"type":"string"},"scene":{"type":"string"},"sampleContext":{"type":"string"},"style":{"type":"string"},"accent":{"type":"string"},"pacing":{"type":"string"},"constraints":{"type":"array","items":{"type":"string"}}},"additionalProperties":false},"providers":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"apiKey":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false}]}]}},"additionalProperties":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"},{"type":"array","items":{}},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}]}}}},"additionalProperties":false}},"summaryModel":{"type":"string"},"modelOverrides":{"type":"object","properties":{"enabled":{"type":"boolean"},"allowText":{"type":"boolean"},"allowProvider":{"type":"boolean"},"allowVoice":{"type":"boolean"},"allowModelId":{"type":"boolean"},"allowVoiceSettings":{"type":"boolean"},"allowNormalization":{"type":"boolean"},"allowSeed":{"type":"boolean"}},"additionalProperties":false},"providers":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"apiKey":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false}]}]}},"additionalProperties":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"},{"type":"array","items":{}},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}]}}},"prefsPath":{"type":"string"},"maxTextLength":{"type":"integer","minimum":1,"maximum":9007199254740991},"timeoutMs":{"type":"integer","minimum":1000,"maximum":120000}},"additionalProperties":false}},"additionalProperties":false},"pluralkit":{"type":"object","properties":{"enabled":{"type":"boolean"},"token":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false}]}]}},"additionalProperties":false},"responsePrefix":{"type":"string"},"ackReaction":{"type":"string"},"ackReactionScope":{"type":"string","enum":["group-mentions","group-all","direct","all","off","none"]},"activity":{"type":"string"},"status":{"type":"string","enum":["online","dnd","idle","invisible"]},"autoPresence":{"type":"object","properties":{"enabled":{"type":"boolean"},"intervalMs":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"minUpdateIntervalMs":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"healthyText":{"type":"string"},"degradedText":{"type":"string"},"exhaustedText":{"type":"string"}},"additionalProperties":false},"activityType":{"anyOf":[{"type":"number","const":0},{"type":"number","const":1},{"type":"number","const":2},{"type":"number","const":3},{"type":"number","const":4},{"type":"number","const":5}]},"activityUrl":{"type":"string","format":"uri"},"inboundWorker":{"type":"object","properties":{"runTimeoutMs":{"type":"integer","minimum":0,"maximum":9007199254740991}},"additionalProperties":false},"eventQueue":{"type":"object","properties":{"listenerTimeout":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"maxQueueSize":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"maxConcurrency":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"additionalProperties":false},"accounts":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"name":{"type":"string"},"capabilities":{"type":"array","items":{"type":"string"}},"markdown":{"type":"object","properties":{"tables":{"type":"string","enum":["off","bullets","code","block"]}},"additionalProperties":false},"enabled":{"type":"boolean"},"commands":{"type":"object","properties":{"native":{"anyOf":[{"type":"boolean"},{"type":"string","const":"auto"}]},"nativeSkills":{"anyOf":[{"type":"boolean"},{"type":"string","const":"auto"}]}},"additionalProperties":false},"configWrites":{"type":"boolean"},"token":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false}]}]},"applicationId":{"type":"string"},"proxy":{"type":"string"},"gatewayInfoTimeoutMs":{"type":"integer","exclusiveMinimum":0,"maximum":120000},"gatewayReadyTimeoutMs":{"type":"integer","exclusiveMinimum":0,"maximum":120000},"gatewayRuntimeReadyTimeoutMs":{"type":"integer","exclusiveMinimum":0,"maximum":120000},"allowBots":{"anyOf":[{"type":"boolean"},{"type":"string","const":"mentions"}]},"dangerouslyAllowNameMatching":{"type":"boolean"},"mentionAliases":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string","pattern":"^\\\\d+$"}},"groupPolicy":{"default":"allowlist","type":"string","enum":["open","disabled","allowlist"]},"contextVisibility":{"type":"string","enum":["all","allowlist","allowlist_quote"]},"historyLimit":{"type":"integer","minimum":0,"maximum":9007199254740991},"dmHistoryLimit":{"type":"integer","minimum":0,"maximum":9007199254740991},"dms":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"historyLimit":{"type":"integer","minimum":0,"maximum":9007199254740991}},"additionalProperties":false}},"textChunkLimit":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"streaming":{"type":"object","properties":{"mode":{"type":"string","enum":["off","partial","block","progress"]},"chunkMode":{"type":"string","enum":["length","newline"]},"preview":{"type":"object","properties":{"chunk":{"type":"object","properties":{"minChars":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"maxChars":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"breakPreference":{"anyOf":[{"type":"string","const":"paragraph"},{"type":"string","const":"newline"},{"type":"string","const":"sentence"}]}},"additionalProperties":false},"toolProgress":{"type":"boolean"},"commandText":{"type":"string","enum":["raw","status"]}},"additionalProperties":false},"progress":{"type":"object","properties":{"label":{"anyOf":[{"type":"string"},{"type":"boolean","const":false}]},"labels":{"type":"array","items":{"type":"string"}},"maxLines":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"render":{"type":"string","enum":["text","rich"]},"toolProgress":{"type":"boolean"},"commandText":{"type":"string","enum":["raw","status"]}},"additionalProperties":false},"block":{"type":"object","properties":{"enabled":{"type":"boolean"},"coalesce":{"type":"object","properties":{"minChars":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"maxChars":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"idleMs":{"type":"integer","minimum":0,"maximum":9007199254740991}},"additionalProperties":false}},"additionalProperties":false}},"additionalProperties":false},"maxLinesPerMessage":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"mediaMaxMb":{"type":"number","exclusiveMinimum":0},"retry":{"type":"object","properties":{"attempts":{"type":"integer","minimum":1,"maximum":9007199254740991},"minDelayMs":{"type":"integer","minimum":0,"maximum":9007199254740991},"maxDelayMs":{"type":"integer","minimum":0,"maximum":9007199254740991},"jitter":{"type":"number","minimum":0,"maximum":1}},"additionalProperties":false},"actions":{"type":"object","properties":{"reactions":{"type":"boolean"},"stickers":{"type":"boolean"},"emojiUploads":{"type":"boolean"},"stickerUploads":{"type":"boolean"},"polls":{"type":"boolean"},"permissions":{"type":"boolean"},"messages":{"type":"boolean"},"threads":{"type":"boolean"},"pins":{"type":"boolean"},"search":{"type":"boolean"},"memberInfo":{"type":"boolean"},"roleInfo":{"type":"boolean"},"roles":{"type":"boolean"},"channelInfo":{"type":"boolean"},"voiceStatus":{"type":"boolean"},"events":{"type":"boolean"},"moderation":{"type":"boolean"},"channels":{"type":"boolean"},"presence":{"type":"boolean"}},"additionalProperties":false},"replyToMode":{"anyOf":[{"type":"string","const":"off"},{"type":"string","const":"first"},{"type":"string","const":"all"},{"type":"string","const":"batched"}]},"thread":{"type":"object","properties":{"inheritParent":{"type":"boolean"}},"additionalProperties":false},"dmPolicy":{"type":"string","enum":["pairing","allowlist","open","disabled"]},"allowFrom":{"type":"array","items":{"type":"string"}},"defaultTo":{"type":"string"},"dm":{"type":"object","properties":{"enabled":{"type":"boolean"},"policy":{"type":"string","enum":["pairing","allowlist","open","disabled"]},"allowFrom":{"type":"array","items":{"type":"string"}},"groupEnabled":{"type":"boolean"},"groupChannels":{"type":"array","items":{"type":"string"}}},"additionalProperties":false},"guilds":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"slug":{"type":"string"},"requireMention":{"type":"boolean"},"ignoreOtherMentions":{"type":"boolean"},"tools":{"type":"object","properties":{"allow":{"type":"array","items":{"type":"string"}},"alsoAllow":{"type":"array","items":{"type":"string"}},"deny":{"type":"array","items":{"type":"string"}}},"additionalProperties":false},"toolsBySender":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"allow":{"type":"array","items":{"type":"string"}},"alsoAllow":{"type":"array","items":{"type":"string"}},"deny":{"type":"array","items":{"type":"string"}}},"additionalProperties":false}},"reactionNotifications":{"type":"string","enum":["off","own","all","allowlist"]},"users":{"type":"array","items":{"type":"string"}},"roles":{"type":"array","items":{"type":"string"}},"channels":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"requireMention":{"type":"boolean"},"ignoreOtherMentions":{"type":"boolean"},"tools":{"type":"object","properties":{"allow":{"type":"array","items":{"type":"string"}},"alsoAllow":{"type":"array","items":{"type":"string"}},"deny":{"type":"array","items":{"type":"string"}}},"additionalProperties":false},"toolsBySender":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"allow":{"type":"array","items":{"type":', + '"string"}},"alsoAllow":{"type":"array","items":{"type":"string"}},"deny":{"type":"array","items":{"type":"string"}}},"additionalProperties":false}},"skills":{"type":"array","items":{"type":"string"}},"enabled":{"type":"boolean"},"users":{"type":"array","items":{"type":"string"}},"roles":{"type":"array","items":{"type":"string"}},"systemPrompt":{"type":"string"},"includeThreadStarter":{"type":"boolean"},"autoThread":{"type":"boolean"},"autoThreadName":{"type":"string","enum":["message","generated"]},"autoArchiveDuration":{"anyOf":[{"type":"string","enum":["60","1440","4320","10080"]},{"type":"number","const":60},{"type":"number","const":1440},{"type":"number","const":4320},{"type":"number","const":10080}]}},"additionalProperties":false}}},"additionalProperties":false}},"heartbeat":{"type":"object","properties":{"showOk":{"type":"boolean"},"showAlerts":{"type":"boolean"},"useIndicator":{"type":"boolean"}},"additionalProperties":false},"healthMonitor":{"type":"object","properties":{"enabled":{"type":"boolean"}},"additionalProperties":false},"execApprovals":{"type":"object","properties":{"enabled":{"type":"boolean"},"approvers":{"type":"array","items":{"type":"string"}},"agentFilter":{"type":"array","items":{"type":"string"}},"sessionFilter":{"type":"array","items":{"type":"string"}},"cleanupAfterResolve":{"type":"boolean"},"target":{"type":"string","enum":["dm","channel","both"]}},"additionalProperties":false},"agentComponents":{"type":"object","properties":{"enabled":{"type":"boolean"}},"additionalProperties":false},"ui":{"type":"object","properties":{"components":{"type":"object","properties":{"accentColor":{"type":"string","pattern":"^#?[0-9a-fA-F]{6}$"}},"additionalProperties":false}},"additionalProperties":false},"slashCommand":{"type":"object","properties":{"ephemeral":{"type":"boolean"}},"additionalProperties":false},"threadBindings":{"type":"object","properties":{"enabled":{"type":"boolean"},"idleHours":{"type":"number","minimum":0},"maxAgeHours":{"type":"number","minimum":0},"spawnSessions":{"type":"boolean"},"defaultSpawnContext":{"type":"string","enum":["isolated","fork"]},"spawnSubagentSessions":{"type":"boolean"},"spawnAcpSessions":{"type":"boolean"}},"additionalProperties":false},"intents":{"type":"object","properties":{"presence":{"type":"boolean"},"guildMembers":{"type":"boolean"},"voiceStates":{"type":"boolean"}},"additionalProperties":false},"voice":{"type":"object","properties":{"enabled":{"type":"boolean"},"model":{"type":"string","minLength":1},"autoJoin":{"type":"array","items":{"type":"object","properties":{"guildId":{"type":"string","minLength":1},"channelId":{"type":"string","minLength":1}},"required":["guildId","channelId"],"additionalProperties":false}},"daveEncryption":{"type":"boolean"},"decryptionFailureTolerance":{"type":"integer","minimum":0,"maximum":9007199254740991},"connectTimeoutMs":{"type":"integer","exclusiveMinimum":0,"maximum":120000},"reconnectGraceMs":{"type":"integer","exclusiveMinimum":0,"maximum":120000},"tts":{"type":"object","properties":{"auto":{"type":"string","enum":["off","always","inbound","tagged"]},"enabled":{"type":"boolean"},"mode":{"type":"string","enum":["final","all"]},"provider":{"type":"string","minLength":1},"persona":{"type":"string"},"personas":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"label":{"type":"string"},"description":{"type":"string"},"provider":{"type":"string","minLength":1},"fallbackPolicy":{"anyOf":[{"type":"string","const":"preserve-persona"},{"type":"string","const":"provider-defaults"},{"type":"string","const":"fail"}]},"prompt":{"type":"object","properties":{"profile":{"type":"string"},"scene":{"type":"string"},"sampleContext":{"type":"string"},"style":{"type":"string"},"accent":{"type":"string"},"pacing":{"type":"string"},"constraints":{"type":"array","items":{"type":"string"}}},"additionalProperties":false},"providers":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"apiKey":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false}]}]}},"additionalProperties":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"},{"type":"array","items":{}},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}]}}}},"additionalProperties":false}},"summaryModel":{"type":"string"},"modelOverrides":{"type":"object","properties":{"enabled":{"type":"boolean"},"allowText":{"type":"boolean"},"allowProvider":{"type":"boolean"},"allowVoice":{"type":"boolean"},"allowModelId":{"type":"boolean"},"allowVoiceSettings":{"type":"boolean"},"allowNormalization":{"type":"boolean"},"allowSeed":{"type":"boolean"}},"additionalProperties":false},"providers":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"apiKey":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false}]}]}},"additionalProperties":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"},{"type":"array","items":{}},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}]}}},"prefsPath":{"type":"string"},"maxTextLength":{"type":"integer","minimum":1,"maximum":9007199254740991},"timeoutMs":{"type":"integer","minimum":1000,"maximum":120000}},"additionalProperties":false}},"additionalProperties":false},"pluralkit":{"type":"object","properties":{"enabled":{"type":"boolean"},"token":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false}]}]}},"additionalProperties":false},"responsePrefix":{"type":"string"},"ackReaction":{"type":"string"},"ackReactionScope":{"type":"string","enum":["group-mentions","group-all","direct","all","off","none"]},"activity":{"type":"string"},"status":{"type":"string","enum":["online","dnd","idle","invisible"]},"autoPresence":{"type":"object","properties":{"enabled":{"type":"boolean"},"intervalMs":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"minUpdateIntervalMs":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"healthyText":{"type":"string"},"degradedText":{"type":"string"},"exhaustedText":{"type":"string"}},"additionalProperties":false},"activityType":{"anyOf":[{"type":"number","const":0},{"type":"number","const":1},{"type":"number","const":2},{"type":"number","const":3},{"type":"number","const":4},{"type":"number","const":5}]},"activityUrl":{"type":"string","format":"uri"},"inboundWorker":{"type":"object","properties":{"runTimeoutMs":{"type":"integer","minimum":0,"maximum":9007199254740991}},"additionalProperties":false},"eventQueue":{"type":"object","properties":{"listenerTimeout":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"maxQueueSize":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"maxConcurrency":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"additionalProperties":false}},"required":["groupPolicy"],"additionalProperties":false}},"defaultAccount":{"type":"string"}},"required":["groupPolicy"],"additionalProperties":false},"uiHints":{"":{"label":"Discord","help":"Discord channel provider configuration for bot auth, retry policy, streaming, thread bindings, and optional voice capabilities. Keep privileged intents and advanced features disabled unless needed."},"dmPolicy":{"label":"Discord DM Policy","help":"Direct message access control (\\"pairing\\" recommended). \\"open\\" requires channels.discord.allowFrom=[\\"*\\"]."},"dm.policy":{"label":"Discord DM Policy","help":"Direct message access control (\\"pairing\\" recommended). \\"open\\" requires channels.discord.allowFrom=[\\"*\\"] (legacy: channels.discord.dm.allowFrom)."},"configWrites":{"label":"Discord Config Writes","help":"Allow Discord to write config in response to channel events/commands (default: true)."},"proxy":{"label":"Discord Proxy URL","help":"Proxy URL for Discord gateway + API requests (app-id lookup and allowlist resolution). Set per account via channels.discord.accounts..proxy."},"commands.native":{"label":"Discord Native Commands","help":"Override native commands for Discord (bool or \\"auto\\")."},"commands.nativeSkills":{"label":"Discord Native Skill Commands","help":"Override native skill commands for Discord (bool or \\"auto\\")."},"streaming":{"label":"Discord Streaming Mode","help":"Unified Discord stream preview mode: \\"off\\" | \\"partial\\" | \\"block\\" | \\"progress\\". \\"progress\\" keeps a single editable progress draft until final delivery. Legacy boolean/streamMode keys are auto-mapped."},"streaming.mode":{"label":"Discord Streaming Mode","help":"Canonical Discord preview mode: \\"off\\" | \\"partial\\" | \\"block\\" | \\"progress\\"."},"streaming.chunkMode":{"label":"Discord Chunk Mode","help":"Chunking mode for outbound Discord text delivery: \\"length\\" (default) or \\"newline\\"."},"streaming.block.enabled":{"label":"Discord Block Streaming Enabled","help":"Enable chunked block-style Discord preview delivery when channels.discord.streaming.mode=\\"block\\"."},"streaming.block.coalesce":{"label":"Discord Block Streaming Coalesce","help":"Merge streamed Discord block replies before final delivery."},"streaming.preview.chunk.minChars":{"label":"Discord Draft Chunk Min Chars","help":"Minimum chars before emitting a Discord stream preview update when channels.discord.streaming.mode=\\"block\\" (default: 200)."},"streaming.preview.chunk.maxChars":{"label":"Discord Draft Chunk Max Chars","help":"Target max size for a Discord stream preview chunk when channels.discord.streaming.mode=\\"block\\" (default: 800; clamped to channels.discord.textChunkLimit)."},"streaming.preview.chunk.breakPreference":{"label":"Discord Draft Chunk Break Preference","help":"Preferred breakpoints for Discord draft chunks (paragraph | newline | sentence). Default: paragraph."},"streaming.preview.toolProgress":{"label":"Discord Draft Tool Progress","help":"Show tool/progress activity in the live draft preview message (default: true). Set false to hide interim tool updates while the draft preview stays active."},"streaming.preview.commandText":{"label":"Discord Draft Command Text","help":"Command/exec detail in preview tool-progress lines: \\"raw\\" preserves released behavior; \\"status\\" shows only the tool label."},"streaming.progress.label":{"label":"Discord Progress Label","help":"Initial progress draft title. Use \\"auto\\" for built-in single-word labels, a custom string, or false to hide the title."},"streaming.progress.labels":{"label":"Discord Progress Label Pool","help":"Candidate labels for streaming.progress.label=\\"auto\\". Leave unset to use OpenClaw built-in progress labels."},"streaming.progress.maxLines":{"label":"Discord Progress Max Lines","help":"Maximum number of compact progress lines to keep below the draft label (default: 8)."},"streaming.progress.toolProgress":{"label":"Discord Progress Tool Lines","help":"Show compact tool/progress lines in progress draft mode (default: true). Set false to keep only the label until final delivery."},"streaming.progress.commandText":{"label":"Discord Progress Command Text","help":"Command/exec detail in progress draft lines: \\"raw\\" preserves released behavior; \\"status\\" shows only the tool label."},"retry.attempts":{"label":"Discord Retry Attempts","help":"Max retry attempts for outbound Discord API calls (default: 3)."},"retry.minDelayMs":{"label":"Discord Retry Min Delay (ms)","help":"Minimum retry delay in ms for Discord outbound calls."},"retry.maxDelayMs":{"label":"Discord Retry Max Delay (ms)","help":"Maximum retry delay cap in ms for Discord outbound calls."},"retry.jitter":{"label":"Discord Retry Jitter","help":"Jitter factor (0-1) applied to Discord retry delays."},"maxLinesPerMessage":{"label":"Discord Max Lines Per Message","help":"Soft max line count per Discord message (default: 17)."},"thread.inheritParent":{"label":"Discord Thread Parent Inheritance","help":"If true, Discord thread sessions inherit the parent channel transcript (default: false)."},"eventQueue.listenerTimeout":{"label":"Discord EventQueue Listener Timeout (ms)","help":"Canonical Discord listener timeout control in ms for gateway normalization/enqueue handlers. Default is 120000 in OpenClaw; set per account via channels.discord.accounts..eventQueue.listenerTimeout."},"eventQueue.maxQueueSize":{"label":"Discord EventQueue Max Queue Size","help":"Optional Discord EventQueue capacity override (max queued events before backpressure). Set per account via channels.discord.accounts..eventQueue.maxQueueSize."},"eventQueue.maxConcurrency":{"label":"Discord EventQueue Max Concurrency","help":"Optional Discord EventQueue concurrency override (max concurrent handler executions). Set per account via channels.discord.accounts..eventQueue.maxConcurrency."},"threadBindings.enabled":{"label":"Discord Thread Binding Enabled","help":"Enable Discord thread binding features (/focus, bound-thread routing/delivery, and thread-bound subagent sessions). Overrides session.threadBindings.enabled when set."},"threadBindings.idleHours":{"label":"Discord Thread Binding Idle Timeout (hours)","help":"Inactivity window in hours for Discord thread-bound sessions (/focus and spawned thread sessions). Set 0 to disable idle auto-unfocus (default: 24). Overrides session.threadBindings.idleHours when set."},"threadBindings.maxAgeHours":{"label":"Discord Thread Binding Max Age (hours)","help":"Optional hard max age in hours for Discord thread-bound sessions. Set 0 to disable hard cap (default: 0). Overrides session.threadBindings.maxAgeHours when set."},"threadBindings.spawnSessions":{"label":"Discord Thread-Bound Session Spawn","help":"Allow sessions_spawn(thread=true) and ACP thread spawns to auto-create and bind Discord threads (default: true). Set false to disable for this account/channel."},"threadBindings.defaultSpawnContext":{"label":"Discord Thread Spawn Context","help":"Default native subagent context for thread-bound spawns. \\"fork\\" starts from the requester transcript; \\"isolated\\" starts clean. Default: \\"fork\\"."},"ui.components.accentColor":{"label":"Discord Component Accent Color","help":"Accent color for Discord component containers (hex). Set per account via channels.discord.accounts..ui.components.accentColor."},"intents.presence":{"label":"D', + 'iscord Presence Intent","help":"Enable the Guild Presences privileged intent. Must also be enabled in the Discord Developer Portal. Allows tracking user activities (e.g. Spotify). Default: false."},"intents.guildMembers":{"label":"Discord Guild Members Intent","help":"Enable the Guild Members privileged intent. Must also be enabled in the Discord Developer Portal. Default: false."},"intents.voiceStates":{"label":"Discord Voice States Intent","help":"Enable the Guild Voice States intent. Defaults to the effective Discord voice setting; set true only for Discord voice channel conversations."},"gatewayInfoTimeoutMs":{"label":"Discord Gateway Metadata Timeout (ms)","help":"Timeout for Discord /gateway/bot metadata lookup before falling back to the default gateway URL. Default is 30000; OPENCLAW_DISCORD_GATEWAY_INFO_TIMEOUT_MS can override when config is unset."},"gatewayReadyTimeoutMs":{"label":"Discord Gateway READY Timeout (ms)","help":"Startup wait for the Discord gateway READY event before restarting the socket. Default is 15000; OPENCLAW_DISCORD_READY_TIMEOUT_MS can override when config is unset."},"gatewayRuntimeReadyTimeoutMs":{"label":"Discord Gateway Runtime READY Timeout (ms)","help":"Runtime reconnect wait for the Discord gateway READY event before force-stopping the lifecycle. Default is 30000; OPENCLAW_DISCORD_RUNTIME_READY_TIMEOUT_MS can override when config is unset."},"voice.enabled":{"label":"Discord Voice Enabled","help":"Enable Discord voice channel conversations. Text-only Discord configs leave voice off by default; set true to enable /vc commands and the Guild Voice States intent."},"voice.model":{"label":"Discord Voice Model","help":"Optional LLM model override for Discord voice channel responses (for example openai/gpt-5.4-mini). Leave unset to inherit the routed agent model."},"voice.autoJoin":{"label":"Discord Voice Auto-Join","help":"Voice channels to auto-join on startup (list of guildId/channelId entries)."},"voice.daveEncryption":{"label":"Discord Voice DAVE Encryption","help":"Toggle DAVE end-to-end encryption for Discord voice joins (default: true in @discordjs/voice; Discord may require this)."},"voice.decryptionFailureTolerance":{"label":"Discord Voice Decrypt Failure Tolerance","help":"Consecutive decrypt failures before DAVE attempts session recovery (passed to @discordjs/voice; default: 24)."},"voice.connectTimeoutMs":{"label":"Discord Voice Connect Timeout (ms)","help":"Initial @discordjs/voice Ready wait before a join is treated as failed. Default: 30000."},"voice.reconnectGraceMs":{"label":"Discord Voice Reconnect Grace (ms)","help":"Grace period for a disconnected Discord voice session to enter Signalling or Connecting before OpenClaw destroys it. Default: 15000."},"voice.tts":{"label":"Discord Voice Text-to-Speech","help":"Optional TTS overrides for Discord voice playback (merged with messages.tts)."},"pluralkit.enabled":{"label":"Discord PluralKit Enabled","help":"Resolve PluralKit proxied messages and treat system members as distinct senders."},"pluralkit.token":{"label":"Discord PluralKit Token","help":"Optional PluralKit token for resolving private systems or members."},"activity":{"label":"Discord Presence Activity","help":"Discord presence activity text (defaults to custom status)."},"status":{"label":"Discord Presence Status","help":"Discord presence status (online, dnd, idle, invisible)."},"autoPresence.enabled":{"label":"Discord Auto Presence Enabled","help":"Enable automatic Discord bot presence updates based on runtime/model availability signals. When enabled: healthy=>online, degraded/unknown=>idle, exhausted/unavailable=>dnd."},"autoPresence.intervalMs":{"label":"Discord Auto Presence Check Interval (ms)","help":"How often to evaluate Discord auto-presence state in milliseconds (default: 30000)."},"autoPresence.minUpdateIntervalMs":{"label":"Discord Auto Presence Min Update Interval (ms)","help":"Minimum time between actual Discord presence update calls in milliseconds (default: 15000). Prevents status spam on noisy state changes."},"autoPresence.healthyText":{"label":"Discord Auto Presence Healthy Text","help":"Optional custom status text while runtime is healthy (online). If omitted, falls back to static channels.discord.activity when set."},"autoPresence.degradedText":{"label":"Discord Auto Presence Degraded Text","help":"Optional custom status text while runtime/model availability is degraded or unknown (idle)."},"autoPresence.exhaustedText":{"label":"Discord Auto Presence Exhausted Text","help":"Optional custom status text while runtime detects exhausted/unavailable model quota (dnd). Supports {reason} template placeholder."},"activityType":{"label":"Discord Presence Activity Type","help":"Discord presence activity type (0=Playing,1=Streaming,2=Listening,3=Watching,4=Custom,5=Competing)."},"activityUrl":{"label":"Discord Presence Activity URL","help":"Discord presence streaming URL (required for activityType=1)."},"allowBots":{"label":"Discord Allow Bot Messages","help":"Allow bot-authored messages to trigger Discord replies (default: false). Set \\"mentions\\" to only accept bot messages that mention the bot."},"mentionAliases":{"label":"Discord Mention Aliases","help":"Map outbound @handle text to stable Discord user IDs before sending. Set per account via channels.discord.accounts..mentionAliases."},"token":{"label":"Discord Bot Token","help":"Discord bot token used for gateway and REST API authentication for this provider account. Keep this secret out of committed config and rotate immediately after any leak.","sensitive":true},"applicationId":{"label":"Discord Application ID","help":"Optional Discord application/client ID. Set this when hosted environments cannot reach Discord\'s application lookup endpoint during startup."}},"unsupportedSecretRefSurfacePatterns":["channels.discord.accounts.*.threadBindings.webhookToken","channels.discord.threadBindings.webhookToken"]},{"pluginId":"feishu","channelId":"feishu","label":"Feishu","description":"飞书/Lark enterprise messaging with doc/wiki/drive tools.","schema":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"enabled":{"type":"boolean"},"defaultAccount":{"type":"string"},"appId":{"type":"string"},"appSecret":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false}]}]},"encryptKey":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false}]}]},"verificationToken":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false}]}]},"domain":{"default":"feishu","anyOf":[{"type":"string","enum":["feishu","lark"]},{"type":"string","format":"uri","pattern":"^https:\\\\/\\\\/.*"}]},"connectionMode":{"default":"websocket","type":"string","enum":["websocket","webhook"]},"webhookPath":{"default":"/feishu/events","type":"string"},"webhookHost":{"type":"string"},"webhookPort":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"capabilities":{"type":"array","items":{"type":"string"}},"markdown":{"type":"object","properties":{"mode":{"type":"string","enum":["native","escape","strip"]},"tableMode":{"type":"string","enum":["native","ascii","simple"]}},"additionalProperties":false},"configWrites":{"type":"boolean"},"dmPolicy":{"default":"pairing","type":"string","enum":["open","pairing","allowlist"]},"allowFrom":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"groupPolicy":{"default":"allowlist","anyOf":[{"type":"string","enum":["open","allowlist","disabled"]},{}]},"groupAllowFrom":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"groupSenderAllowFrom":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"requireMention":{"type":"boolean"},"groups":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"requireMention":{"type":"boolean"},"tools":{"type":"object","properties":{"allow":{"type":"array","items":{"type":"string"}},"deny":{"type":"array","items":{"type":"string"}}},"additionalProperties":false},"skills":{"type":"array","items":{"type":"string"}},"enabled":{"type":"boolean"},"allowFrom":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"systemPrompt":{"type":"string"},"groupSessionScope":{"type":"string","enum":["group","group_sender","group_topic","group_topic_sender"]},"topicSessionMode":{"type":"string","enum":["disabled","enabled"]},"replyInThread":{"type":"string","enum":["disabled","enabled"]}},"additionalProperties":false}},"historyLimit":{"type":"integer","minimum":0,"maximum":9007199254740991},"dmHistoryLimit":{"type":"integer","minimum":0,"maximum":9007199254740991},"dms":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"enabled":{"type":"boolean"},"systemPrompt":{"type":"string"}},"additionalProperties":false}},"textChunkLimit":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"chunkMode":{"type":"string","enum":["length","newline"]},"blockStreaming":{"type":"boolean"},"blockStreamingCoalesce":{"type":"object","properties":{"enabled":{"type":"boolean"},"minDelayMs":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"maxDelayMs":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"additionalProperties":false},"mediaMaxMb":{"type":"number","exclusiveMinimum":0},"httpTimeoutMs":{"type":"integer","exclusiveMinimum":0,"maximum":300000},"heartbeat":{"type":"object","properties":{"visibility":{"type":"string","enum":["visible","hidden"]},"intervalMs":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"additionalProperties":false},"renderMode":{"type":"string","enum":["auto","raw","card"]},"streaming":{"type":"boolean"},"tools":{"type":"object","properties":{"doc":{"type":"boolean"},"chat":{"type":"boolean"},"wiki":{"type":"boolean"},"drive":{"type":"boolean"},"perm":{"type":"boolean"},"scopes":{"type":"boolean"}},"additionalProperties":false},"actions":{"type":"object","properties":{"reactions":{"type":"boolean"}},"additionalProperties":false},"replyInThread":{"type":"string","enum":["disabled","enabled"]},"reactionNotifications":{"default":"own","type":"string","enum":["off","own","all"]},"typingIndicator":{"default":true,"type":"boolean"},"resolveSenderNames":{"default":true,"type":"boolean"},"tts":{"type":"object","properties":{"auto":{"type":"string","enum":["off","always","inbound","tagged"]},"enabled":{"type":"boolean"},"mode":{"type":"string","enum":["final","all"]},"provider":{"type":"string"},"persona":{"type":"string"},"personas":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}},"summaryModel":{"type":"string"},"modelOverrides":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},"providers":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}},"prefsPath":{"type":"string"},"maxTextLength":{"type":"integer","minimum":1,"maximum":9007199254740991},"timeoutMs":{"type":"integer","minimum":1000,"maximum":120000}},"additionalProperties":false},"groupSessionScope":{"type":"string","enum":["group","group_sender","group_topic","group_topic_sender"]},"topicSessionMode":{"type":"string","enum":["disabled","enabled"]},"dynamicAgentCreation":{"type":"object","properties":{"enabled":{"type":"boolean"},"workspaceTemplate":{"type":"string"},"agentDirTemplate":{"type":"string"},"maxAgents":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"additionalProperties":false},"accounts":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"enabled":{"type":"boolean"},"name":{"type":"string"},"appId":{"type":"string"},"appSecret":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false}]}]},"encryptKey":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false}]}]},"verificationToken":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false}]}]},"domain":{"anyOf":[{"type":"string","enum":["feishu","lark"]},{"type":"string","format":"uri","patter', + 'n":"^https:\\\\/\\\\/.*"}]},"connectionMode":{"type":"string","enum":["websocket","webhook"]},"webhookPath":{"type":"string"},"webhookHost":{"type":"string"},"webhookPort":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"capabilities":{"type":"array","items":{"type":"string"}},"markdown":{"type":"object","properties":{"mode":{"type":"string","enum":["native","escape","strip"]},"tableMode":{"type":"string","enum":["native","ascii","simple"]}},"additionalProperties":false},"configWrites":{"type":"boolean"},"dmPolicy":{"type":"string","enum":["open","pairing","allowlist"]},"allowFrom":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"groupPolicy":{"anyOf":[{"type":"string","enum":["open","allowlist","disabled"]},{}]},"groupAllowFrom":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"groupSenderAllowFrom":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"requireMention":{"type":"boolean"},"groups":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"requireMention":{"type":"boolean"},"tools":{"type":"object","properties":{"allow":{"type":"array","items":{"type":"string"}},"deny":{"type":"array","items":{"type":"string"}}},"additionalProperties":false},"skills":{"type":"array","items":{"type":"string"}},"enabled":{"type":"boolean"},"allowFrom":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"systemPrompt":{"type":"string"},"groupSessionScope":{"type":"string","enum":["group","group_sender","group_topic","group_topic_sender"]},"topicSessionMode":{"type":"string","enum":["disabled","enabled"]},"replyInThread":{"type":"string","enum":["disabled","enabled"]}},"additionalProperties":false}},"historyLimit":{"type":"integer","minimum":0,"maximum":9007199254740991},"dmHistoryLimit":{"type":"integer","minimum":0,"maximum":9007199254740991},"dms":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"enabled":{"type":"boolean"},"systemPrompt":{"type":"string"}},"additionalProperties":false}},"textChunkLimit":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"chunkMode":{"type":"string","enum":["length","newline"]},"blockStreaming":{"type":"boolean"},"blockStreamingCoalesce":{"type":"object","properties":{"enabled":{"type":"boolean"},"minDelayMs":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"maxDelayMs":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"additionalProperties":false},"mediaMaxMb":{"type":"number","exclusiveMinimum":0},"httpTimeoutMs":{"type":"integer","exclusiveMinimum":0,"maximum":300000},"heartbeat":{"type":"object","properties":{"visibility":{"type":"string","enum":["visible","hidden"]},"intervalMs":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"additionalProperties":false},"renderMode":{"type":"string","enum":["auto","raw","card"]},"streaming":{"type":"boolean"},"tools":{"type":"object","properties":{"doc":{"type":"boolean"},"chat":{"type":"boolean"},"wiki":{"type":"boolean"},"drive":{"type":"boolean"},"perm":{"type":"boolean"},"scopes":{"type":"boolean"}},"additionalProperties":false},"actions":{"type":"object","properties":{"reactions":{"type":"boolean"}},"additionalProperties":false},"replyInThread":{"type":"string","enum":["disabled","enabled"]},"reactionNotifications":{"type":"string","enum":["off","own","all"]},"typingIndicator":{"type":"boolean"},"resolveSenderNames":{"type":"boolean"},"tts":{"type":"object","properties":{"auto":{"type":"string","enum":["off","always","inbound","tagged"]},"enabled":{"type":"boolean"},"mode":{"type":"string","enum":["final","all"]},"provider":{"type":"string"},"persona":{"type":"string"},"personas":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}},"summaryModel":{"type":"string"},"modelOverrides":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},"providers":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}},"prefsPath":{"type":"string"},"maxTextLength":{"type":"integer","minimum":1,"maximum":9007199254740991},"timeoutMs":{"type":"integer","minimum":1000,"maximum":120000}},"additionalProperties":false},"groupSessionScope":{"type":"string","enum":["group","group_sender","group_topic","group_topic_sender"]},"topicSessionMode":{"type":"string","enum":["disabled","enabled"]}},"additionalProperties":false}}},"required":["domain","connectionMode","webhookPath","dmPolicy","groupPolicy","reactionNotifications","typingIndicator","resolveSenderNames"],"additionalProperties":false}},{"pluginId":"googlechat","channelId":"googlechat","label":"Google Chat","description":"Google Workspace Chat app with HTTP webhook.","schema":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"name":{"type":"string"},"capabilities":{"type":"array","items":{"type":"string"}},"enabled":{"type":"boolean"},"configWrites":{"type":"boolean"},"allowBots":{"type":"boolean"},"dangerouslyAllowNameMatching":{"type":"boolean"},"requireMention":{"type":"boolean"},"groupPolicy":{"default":"allowlist","type":"string","enum":["open","disabled","allowlist"]},"groupAllowFrom":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"groups":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"enabled":{"type":"boolean"},"requireMention":{"type":"boolean"},"users":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"systemPrompt":{"type":"string"}},"additionalProperties":false}},"defaultTo":{"type":"string"},"serviceAccount":{"anyOf":[{"type":"string"},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false}]}]},"serviceAccountRef":{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false}]},"serviceAccountFile":{"type":"string"},"audienceType":{"type":"string","enum":["app-url","project-number"]},"audience":{"type":"string"},"appPrincipal":{"type":"string"},"webhookPath":{"type":"string"},"webhookUrl":{"type":"string"},"botUser":{"type":"string"},"historyLimit":{"type":"integer","minimum":0,"maximum":9007199254740991},"dmHistoryLimit":{"type":"integer","minimum":0,"maximum":9007199254740991},"dms":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"historyLimit":{"type":"integer","minimum":0,"maximum":9007199254740991}},"additionalProperties":false}},"textChunkLimit":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"chunkMode":{"type":"string","enum":["length","newline"]},"blockStreaming":{"type":"boolean"},"blockStreamingCoalesce":{"type":"object","properties":{"minChars":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"maxChars":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"idleMs":{"type":"integer","minimum":0,"maximum":9007199254740991}},"additionalProperties":false},"mediaMaxMb":{"type":"number","exclusiveMinimum":0},"replyToMode":{"anyOf":[{"type":"string","const":"off"},{"type":"string","const":"first"},{"type":"string","const":"all"},{"type":"string","const":"batched"}]},"actions":{"type":"object","properties":{"reactions":{"type":"boolean"}},"additionalProperties":false},"dm":{"type":"object","properties":{"enabled":{"type":"boolean"},"policy":{"default":"pairing","type":"string","enum":["pairing","allowlist","open","disabled"]},"allowFrom":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}}},"required":["policy"],"additionalProperties":false},"healthMonitor":{"type":"object","properties":{"enabled":{"type":"boolean"}},"additionalProperties":false},"typingIndicator":{"type":"string","enum":["none","message","reaction"]},"responsePrefix":{"type":"string"},"accounts":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"name":{"type":"string"},"capabilities":{"type":"array","items":{"type":"string"}},"enabled":{"type":"boolean"},"configWrites":{"type":"boolean"},"allowBots":{"type":"boolean"},"dangerouslyAllowNameMatching":{"type":"boolean"},"requireMention":{"type":"boolean"},"groupPolicy":{"default":"allowlist","type":"string","enum":["open","disabled","allowlist"]},"groupAllowFrom":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"groups":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"enabled":{"type":"boolean"},"requireMention":{"type":"boolean"},"users":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"systemPrompt":{"type":"string"}},"additionalProperties":false}},"defaultTo":{"type":"string"},"serviceAccount":{"anyOf":[{"type":"string"},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false}]}]},"serviceAccountRef":{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false}]},"serviceAccountFile":{"type":"string"},"audienceType":{"type":"string","enum":["app-url","project-number"]},"audience":{"type":"string"},"appPrincipal":{"type":"string"},"webhookPath":{"type":"string"},"webhookUrl":{"type":"string"},"botUser":{"type":"string"},"historyLimit":{"type":"integer","minimum":0,"maximum":9007199254740991},"dmHistoryLimit":{"type":"integer","minimum":0,"maximum":9007199254740991},"dms":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"historyLimit":{"type":"integer","minimum":0,"maximum":9007199254740991}},"additionalProperties":false}},"textChunkLimit":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"chunkMode":{"type":"string","enum":["length","newline"]},"blockStreaming":{"type":"boolean"},"blockStreamingCoalesce":{"type":"object","properties":{"minChars":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"maxChars":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"idleMs":{"type":"integer","minimum":0,"maximum":9007199254740991}},"additionalProperties":false},"mediaMaxMb":{"type":"number","exclusiveMinimum":0},"replyToMode":{"anyOf":[{"type":"string","const":"off"},{"type":"string","const":"first"},{"type":"string","const":"all"},{"type":"string","const":"batched"}]},"actions":{"type":"object","properties":{"reactions":{"type":"boolean"}},"additionalProperties":false},"dm":{"type":"object","properties":{"enabled":{"type":"boolean"},"policy":{"default":"pairing","type":"string","enum":["pairing","allowlist","open","disabled"]},"allowFrom":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}}},"required":["policy"],"additionalProperties":false},"healthMonitor":{"type":"object","properties":{"enabled":{"type":"boolean"}},"additionalProperties":false},"typingIndicator":{"type":"string","enum":["none","message","reaction"]},"responsePrefix":{"type":"string"}},"required":["groupPolicy"],"additionalProperties":false}},"defaultAccount":{"type":"string"}},"required":["groupPolicy"],"additionalProperties":false}},{"pluginId":"imessage","channelId":"imessage","label":"iMessage","description":"this is still a work in progress.","schema":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"name":{"type":"string"},"capabilities":{"type":"array","items":{"type":"string"}},"markdown":{"type":"object","properties":{"tables":{"type":"string","enum":["off","bullets","code","block"]}},"additionalProperties":false},"enabled":{"type":"boolean"},"configWrites":{"type":"boolean"},"cliPath":{"type":"string"},"dbPath":{"type":"string"},"remoteHost":{"type":"string"},"service":{"anyOf":[{"type":"string","const":"imessage"},{"type":"string","const":"sms"},{"type":"string","const":"auto"}]},"region":{"type":"string"},"dmPolicy":{"default":"pairing","type":"string","enum":["pairing","allowlist","open","disabled"]},"allowFrom":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"defaultTo":{"type":"string"},"groupAllowFrom":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"groupPolicy":{"default":"allowlist","type":"string","enum":["open","disabled","allowlist"]},"contextVisibility":{"type":"string","enum":["all","allowlist","allowlist_quote"]},"historyLimit":{"type":"integer","minimum":0,"maximum":9007199254740991},"dmHistoryLimit":{"type":"integer","minimum":0,"maximum":9007199254740991},"dms":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"historyLimit":{"type":"integer","minimum":0,"maximum":9007199254740991}},"additionalProperties":false}},"includeAttachments":{"type":"boolean"},"attachmentRoots":{"type":"array","items":{"type":"string"}},"remoteAttachmentRoots":{"type":"array","items":{"type":"string"}},"mediaMaxMb":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"textChunkLimit":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"chunkMode":{"type":"string","enum":["length","newline"]},"blockStreaming":{"type":"boolean"},"blockStreamingCoalesce":{"type":"object","properties":{"minChars":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"maxChars":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"idleMs":{"type":"integer","minimum":0,"maximum":9007199254740991}},"additionalProperties":false},"groups":{"type":"object","propertyN', + 'ames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"requireMention":{"type":"boolean"},"tools":{"type":"object","properties":{"allow":{"type":"array","items":{"type":"string"}},"alsoAllow":{"type":"array","items":{"type":"string"}},"deny":{"type":"array","items":{"type":"string"}}},"additionalProperties":false},"toolsBySender":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"allow":{"type":"array","items":{"type":"string"}},"alsoAllow":{"type":"array","items":{"type":"string"}},"deny":{"type":"array","items":{"type":"string"}}},"additionalProperties":false}}},"additionalProperties":false}},"heartbeat":{"type":"object","properties":{"showOk":{"type":"boolean"},"showAlerts":{"type":"boolean"},"useIndicator":{"type":"boolean"}},"additionalProperties":false},"healthMonitor":{"type":"object","properties":{"enabled":{"type":"boolean"}},"additionalProperties":false},"responsePrefix":{"type":"string"},"accounts":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"name":{"type":"string"},"capabilities":{"type":"array","items":{"type":"string"}},"markdown":{"type":"object","properties":{"tables":{"type":"string","enum":["off","bullets","code","block"]}},"additionalProperties":false},"enabled":{"type":"boolean"},"configWrites":{"type":"boolean"},"cliPath":{"type":"string"},"dbPath":{"type":"string"},"remoteHost":{"type":"string"},"service":{"anyOf":[{"type":"string","const":"imessage"},{"type":"string","const":"sms"},{"type":"string","const":"auto"}]},"region":{"type":"string"},"dmPolicy":{"default":"pairing","type":"string","enum":["pairing","allowlist","open","disabled"]},"allowFrom":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"defaultTo":{"type":"string"},"groupAllowFrom":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"groupPolicy":{"default":"allowlist","type":"string","enum":["open","disabled","allowlist"]},"contextVisibility":{"type":"string","enum":["all","allowlist","allowlist_quote"]},"historyLimit":{"type":"integer","minimum":0,"maximum":9007199254740991},"dmHistoryLimit":{"type":"integer","minimum":0,"maximum":9007199254740991},"dms":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"historyLimit":{"type":"integer","minimum":0,"maximum":9007199254740991}},"additionalProperties":false}},"includeAttachments":{"type":"boolean"},"attachmentRoots":{"type":"array","items":{"type":"string"}},"remoteAttachmentRoots":{"type":"array","items":{"type":"string"}},"mediaMaxMb":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"textChunkLimit":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"chunkMode":{"type":"string","enum":["length","newline"]},"blockStreaming":{"type":"boolean"},"blockStreamingCoalesce":{"type":"object","properties":{"minChars":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"maxChars":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"idleMs":{"type":"integer","minimum":0,"maximum":9007199254740991}},"additionalProperties":false},"groups":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"requireMention":{"type":"boolean"},"tools":{"type":"object","properties":{"allow":{"type":"array","items":{"type":"string"}},"alsoAllow":{"type":"array","items":{"type":"string"}},"deny":{"type":"array","items":{"type":"string"}}},"additionalProperties":false},"toolsBySender":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"allow":{"type":"array","items":{"type":"string"}},"alsoAllow":{"type":"array","items":{"type":"string"}},"deny":{"type":"array","items":{"type":"string"}}},"additionalProperties":false}}},"additionalProperties":false}},"heartbeat":{"type":"object","properties":{"showOk":{"type":"boolean"},"showAlerts":{"type":"boolean"},"useIndicator":{"type":"boolean"}},"additionalProperties":false},"healthMonitor":{"type":"object","properties":{"enabled":{"type":"boolean"}},"additionalProperties":false},"responsePrefix":{"type":"string"}},"required":["dmPolicy","groupPolicy"],"additionalProperties":false}},"defaultAccount":{"type":"string"}},"required":["dmPolicy","groupPolicy"],"additionalProperties":false},"uiHints":{"":{"label":"iMessage","help":"iMessage channel provider configuration for CLI integration and DM access policy handling. Use explicit CLI paths when runtime environments have non-standard binary locations."},"dmPolicy":{"label":"iMessage DM Policy","help":"Direct message access control (\\"pairing\\" recommended). \\"open\\" requires channels.imessage.allowFrom=[\\"*\\"]."},"configWrites":{"label":"iMessage Config Writes","help":"Allow iMessage to write config in response to channel events/commands (default: true)."},"cliPath":{"label":"iMessage CLI Path","help":"Filesystem path to the iMessage bridge CLI binary used for send/receive operations. Set explicitly when the binary is not on PATH in service runtime environments."}}},{"pluginId":"irc","channelId":"irc","label":"IRC","description":"classic IRC networks with DM/channel routing and pairing controls.","schema":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"name":{"type":"string"},"enabled":{"type":"boolean"},"dangerouslyAllowNameMatching":{"type":"boolean"},"host":{"type":"string"},"port":{"type":"integer","minimum":1,"maximum":65535},"tls":{"type":"boolean"},"nick":{"type":"string"},"username":{"type":"string"},"realname":{"type":"string"},"password":{"type":"string"},"passwordFile":{"type":"string"},"nickserv":{"type":"object","properties":{"enabled":{"type":"boolean"},"service":{"type":"string"},"password":{"type":"string"},"passwordFile":{"type":"string"},"register":{"type":"boolean"},"registerEmail":{"type":"string"}},"additionalProperties":false},"dmPolicy":{"default":"pairing","type":"string","enum":["pairing","allowlist","open","disabled"]},"allowFrom":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"groupPolicy":{"default":"allowlist","type":"string","enum":["open","disabled","allowlist"]},"groupAllowFrom":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"groups":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"requireMention":{"type":"boolean"},"tools":{"type":"object","properties":{"allow":{"type":"array","items":{"type":"string"}},"alsoAllow":{"type":"array","items":{"type":"string"}},"deny":{"type":"array","items":{"type":"string"}}},"additionalProperties":false},"toolsBySender":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"allow":{"type":"array","items":{"type":"string"}},"alsoAllow":{"type":"array","items":{"type":"string"}},"deny":{"type":"array","items":{"type":"string"}}},"additionalProperties":false}},"skills":{"type":"array","items":{"type":"string"}},"enabled":{"type":"boolean"},"allowFrom":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"systemPrompt":{"type":"string"}},"additionalProperties":false}},"channels":{"type":"array","items":{"type":"string"}},"mentionPatterns":{"type":"array","items":{"type":"string"}},"markdown":{"type":"object","properties":{"tables":{"type":"string","enum":["off","bullets","code","block"]}},"additionalProperties":false},"historyLimit":{"type":"integer","minimum":0,"maximum":9007199254740991},"dmHistoryLimit":{"type":"integer","minimum":0,"maximum":9007199254740991},"contextVisibility":{"type":"string","enum":["all","allowlist","allowlist_quote"]},"dms":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"historyLimit":{"type":"integer","minimum":0,"maximum":9007199254740991}},"additionalProperties":false}},"textChunkLimit":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"chunkMode":{"type":"string","enum":["length","newline"]},"blockStreaming":{"type":"boolean"},"blockStreamingCoalesce":{"type":"object","properties":{"minChars":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"maxChars":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"idleMs":{"type":"integer","minimum":0,"maximum":9007199254740991}},"additionalProperties":false},"responsePrefix":{"type":"string"},"mediaMaxMb":{"type":"number","exclusiveMinimum":0},"accounts":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"name":{"type":"string"},"enabled":{"type":"boolean"},"dangerouslyAllowNameMatching":{"type":"boolean"},"host":{"type":"string"},"port":{"type":"integer","minimum":1,"maximum":65535},"tls":{"type":"boolean"},"nick":{"type":"string"},"username":{"type":"string"},"realname":{"type":"string"},"password":{"type":"string"},"passwordFile":{"type":"string"},"nickserv":{"type":"object","properties":{"enabled":{"type":"boolean"},"service":{"type":"string"},"password":{"type":"string"},"passwordFile":{"type":"string"},"register":{"type":"boolean"},"registerEmail":{"type":"string"}},"additionalProperties":false},"dmPolicy":{"default":"pairing","type":"string","enum":["pairing","allowlist","open","disabled"]},"allowFrom":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"groupPolicy":{"default":"allowlist","type":"string","enum":["open","disabled","allowlist"]},"groupAllowFrom":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"groups":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"requireMention":{"type":"boolean"},"tools":{"type":"object","properties":{"allow":{"type":"array","items":{"type":"string"}},"alsoAllow":{"type":"array","items":{"type":"string"}},"deny":{"type":"array","items":{"type":"string"}}},"additionalProperties":false},"toolsBySender":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"allow":{"type":"array","items":{"type":"string"}},"alsoAllow":{"type":"array","items":{"type":"string"}},"deny":{"type":"array","items":{"type":"string"}}},"additionalProperties":false}},"skills":{"type":"array","items":{"type":"string"}},"enabled":{"type":"boolean"},"allowFrom":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"systemPrompt":{"type":"string"}},"additionalProperties":false}},"channels":{"type":"array","items":{"type":"string"}},"mentionPatterns":{"type":"array","items":{"type":"string"}},"markdown":{"type":"object","properties":{"tables":{"type":"string","enum":["off","bullets","code","block"]}},"additionalProperties":false},"historyLimit":{"type":"integer","minimum":0,"maximum":9007199254740991},"dmHistoryLimit":{"type":"integer","minimum":0,"maximum":9007199254740991},"contextVisibility":{"type":"string","enum":["all","allowlist","allowlist_quote"]},"dms":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"historyLimit":{"type":"integer","minimum":0,"maximum":9007199254740991}},"additionalProperties":false}},"textChunkLimit":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"chunkMode":{"type":"string","enum":["length","newline"]},"blockStreaming":{"type":"boolean"},"blockStreamingCoalesce":{"type":"object","properties":{"minChars":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"maxChars":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"idleMs":{"type":"integer","minimum":0,"maximum":9007199254740991}},"additionalProperties":false},"responsePrefix":{"type":"string"},"mediaMaxMb":{"type":"number","exclusiveMinimum":0}},"required":["dmPolicy","groupPolicy"],"additionalProperties":false}},"defaultAccount":{"type":"string"}},"required":["dmPolicy","groupPolicy"],"additionalProperties":false},"uiHints":{"":{"label":"IRC","help":"IRC channel provider configuration and compatibility settings for classic IRC transport workflows. Use this section when bridging legacy chat infrastructure into OpenClaw."},"dmPolicy":{"label":"IRC DM Policy","help":"Direct message access control (\\"pairing\\" recommended). \\"open\\" requires channels.irc.allowFrom=[\\"*\\"]."},"nickserv.enabled":{"label":"IRC NickServ Enabled","help":"Enable NickServ identify/register after connect (defaults to enabled when password is configured)."},"nickserv.service":{"label":"IRC NickServ Service","help":"NickServ service nick (default: NickServ)."},"nickserv.password":{"label":"IRC NickServ Password","help":"NickServ password used for IDENTIFY/REGISTER (sensitive)."},"nickserv.passwordFile":{"label":"IRC NickServ Password File","help":"Optional file path containing NickServ password."},"nickserv.register":{"label":"IRC NickServ Register","help":"If true, send NickServ REGISTER on every connect. Use once for initial registration, then disable."},"nickserv.registerEmail":{"label":"IRC NickServ Register Email","help":"Email used with NickServ REGISTER (required when register=true)."},"configWrites":{"label":"IRC Config Writes","help":"Allow IRC to write config in response to channel events/commands (default: true)."}}},{"pluginId":"line","channelId":"line","label":"LINE","description":"LINE Messaging API webhook bot.","schema":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"enabled":{"type":"boolean"},"channelAccessToken":{"type":"string"},"channelSecret":{"type":"string"},"tokenFile":{"type":"string"},"secretFile":{"type":"string"},"name":{"type":"string"},"allowFrom":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"groupAllowFrom":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"dmPolicy":{"default":"pairing","type":"string","enum":["open","allowlist","pairing","disabled"]},"groupPolicy":{"default":"allowlist","type":"string","enum":["open","allowlist","disabled"]},"responsePrefix":{"type":"string"},"mediaMaxMb":{"type":"number"},"webhookPath":{"type":"string"},"threadBindings":{"type":"object","properties":{"enabled":{"type":"boolean"},"idleHours":{"type":"number"},"maxAgeHours":{"type":"number"},"spawnSessions":{"type":"boolean"},"defaultSpawnContext":{"type":"string","enum":["isolated","fork"]},"spawnSubagentSessions":{"type":"boolean"},"spawnAcpSessions":{"type":"boolean"}},"additionalProperties":false},"accounts":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"enabled":{"type":"boolean"},"channelAccessToken":{"type":"string"},"channelSecret":{"type":"string"},"tokenFile":{"type":"string"},"secretFile":{"type":"string"},"name":{"type":"string"},"allowFrom":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"groupAllowFrom":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"dmPolicy":{"default":"pairing","type":"string","enum":["open","allowlist","pairing","disabled"]},"groupPolicy":{"default":"allowlist","type":"string","enum":["open","allowlist","disabled"]},"responsePrefix":{"type":"string"},"mediaMaxMb":{"type":"number"},"webhookPath":{"type":"string"},"threadBindings":{"type":"object","properties":{"enabled":{"type":"boolean"},"idleHours":{"type":"number"},"maxAgeHours":{"type":"number"},"spawnSessions":{"type":"boolean"},"defaultSpawnContext":{"type":"string","enum":["isolated","fork"]},"spawnSubagentSessions":{"type":"boolean"},"spawnAcpSessions":{"type":"boolean"}},"additionalProperties":false},"groups":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"enabled":{"type":"boolean"},"allowFrom":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"requireMention":{"type":"boolean"},"systemPrompt":{"type":"string"},"skills":{"type":"array","items":{"type":"string"}}},"additionalProperties":false}}},"required":["dmPolicy","groupPolicy"],"additionalProperties":false}},"defaultAccount":{"type":"string"},"groups":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"enabled":{"type":"boolean"},"allowFrom":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"requireMention":{"type":"boolean"},"s', + 'ystemPrompt":{"type":"string"},"skills":{"type":"array","items":{"type":"string"}}},"additionalProperties":false}}},"required":["dmPolicy","groupPolicy"],"additionalProperties":false}},{"pluginId":"matrix","channelId":"matrix","label":"Matrix","description":"open protocol; install the plugin to enable.","schema":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"name":{"type":"string"},"enabled":{"type":"boolean"},"defaultAccount":{"type":"string"},"accounts":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},"markdown":{"type":"object","properties":{"tables":{"type":"string","enum":["off","bullets","code","block"]}},"additionalProperties":false},"homeserver":{"type":"string"},"network":{"type":"object","properties":{"dangerouslyAllowPrivateNetwork":{"type":"boolean"}},"additionalProperties":false},"proxy":{"type":"string"},"userId":{"type":"string"},"accessToken":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false}]}]},"password":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false}]}]},"deviceId":{"type":"string"},"deviceName":{"type":"string"},"avatarUrl":{"type":"string"},"initialSyncLimit":{"type":"number"},"encryption":{"type":"boolean"},"allowlistOnly":{"type":"boolean"},"allowBots":{"anyOf":[{"type":"boolean"},{"type":"string","const":"mentions"}]},"groupPolicy":{"type":"string","enum":["open","disabled","allowlist"]},"contextVisibility":{"type":"string","enum":["all","allowlist","allowlist_quote"]},"blockStreaming":{"type":"boolean"},"streaming":{"anyOf":[{"type":"string","enum":["partial","quiet","progress","off"]},{"type":"boolean"},{"type":"object","properties":{"mode":{"type":"string","enum":["partial","quiet","progress","off"]},"progress":{"type":"object","properties":{"label":{"anyOf":[{"type":"string"},{"type":"boolean","const":false}]},"labels":{"type":"array","items":{"type":"string"}},"maxLines":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"toolProgress":{"type":"boolean"}},"additionalProperties":false},"preview":{"type":"object","properties":{"toolProgress":{"type":"boolean"}},"additionalProperties":false}},"additionalProperties":false}]},"replyToMode":{"type":"string","enum":["off","first","all","batched"]},"threadReplies":{"type":"string","enum":["off","inbound","always"]},"textChunkLimit":{"type":"number"},"chunkMode":{"type":"string","enum":["length","newline"]},"responsePrefix":{"type":"string"},"ackReaction":{"type":"string"},"ackReactionScope":{"type":"string","enum":["group-mentions","group-all","direct","all","none","off"]},"reactionNotifications":{"type":"string","enum":["off","own"]},"threadBindings":{"type":"object","properties":{"enabled":{"type":"boolean"},"idleHours":{"type":"number","minimum":0},"maxAgeHours":{"type":"number","minimum":0},"spawnSessions":{"type":"boolean"},"defaultSpawnContext":{"type":"string","enum":["isolated","fork"]},"spawnSubagentSessions":{"type":"boolean"},"spawnAcpSessions":{"type":"boolean"}},"additionalProperties":false},"startupVerification":{"type":"string","enum":["off","if-unverified"]},"startupVerificationCooldownHours":{"type":"number"},"mediaMaxMb":{"type":"number"},"historyLimit":{"type":"integer","minimum":0,"maximum":9007199254740991},"autoJoin":{"type":"string","enum":["always","allowlist","off"]},"autoJoinAllowlist":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"groupAllowFrom":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"dm":{"type":"object","properties":{"enabled":{"type":"boolean"},"policy":{"type":"string","enum":["pairing","allowlist","open","disabled"]},"allowFrom":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"sessionScope":{"type":"string","enum":["per-user","per-room"]},"threadReplies":{"type":"string","enum":["off","inbound","always"]}},"additionalProperties":false},"execApprovals":{"type":"object","properties":{"enabled":{"type":"boolean"},"approvers":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"agentFilter":{"type":"array","items":{"type":"string"}},"sessionFilter":{"type":"array","items":{"type":"string"}},"target":{"type":"string","enum":["dm","channel","both"]}},"additionalProperties":false},"groups":{"type":"object","properties":{},"additionalProperties":{"type":"object","properties":{"account":{"type":"string"},"enabled":{"type":"boolean"},"requireMention":{"type":"boolean"},"allowBots":{"anyOf":[{"type":"boolean"},{"type":"string","const":"mentions"}]},"tools":{"type":"object","properties":{"allow":{"type":"array","items":{"type":"string"}},"alsoAllow":{"type":"array","items":{"type":"string"}},"deny":{"type":"array","items":{"type":"string"}}},"additionalProperties":false},"autoReply":{"type":"boolean"},"users":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"skills":{"type":"array","items":{"type":"string"}},"systemPrompt":{"type":"string"}},"additionalProperties":false}},"rooms":{"type":"object","properties":{},"additionalProperties":{"type":"object","properties":{"account":{"type":"string"},"enabled":{"type":"boolean"},"requireMention":{"type":"boolean"},"allowBots":{"anyOf":[{"type":"boolean"},{"type":"string","const":"mentions"}]},"tools":{"type":"object","properties":{"allow":{"type":"array","items":{"type":"string"}},"alsoAllow":{"type":"array","items":{"type":"string"}},"deny":{"type":"array","items":{"type":"string"}}},"additionalProperties":false},"autoReply":{"type":"boolean"},"users":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"skills":{"type":"array","items":{"type":"string"}},"systemPrompt":{"type":"string"}},"additionalProperties":false}},"actions":{"type":"object","properties":{"reactions":{"type":"boolean"},"messages":{"type":"boolean"},"pins":{"type":"boolean"},"profile":{"type":"boolean"},"memberInfo":{"type":"boolean"},"channelInfo":{"type":"boolean"},"verification":{"type":"boolean"}},"additionalProperties":false}},"additionalProperties":false},"uiHints":{"streaming.progress.label":{"label":"Matrix Progress Label","help":"Initial progress draft title. Use \\"auto\\" for built-in single-word labels, a custom string, or false to hide the title."},"streaming.progress.labels":{"label":"Matrix Progress Label Pool","help":"Candidate labels for streaming.progress.label=\\"auto\\". Leave unset to use OpenClaw built-in progress labels."},"streaming.progress.maxLines":{"label":"Matrix Progress Max Lines","help":"Maximum number of compact progress lines to keep below the draft label (default: 8)."},"streaming.progress.toolProgress":{"label":"Matrix Progress Tool Lines","help":"Show compact tool/progress lines in progress draft mode (default: true). Set false to keep only the label until final delivery."},"streaming.progress.commandText":{"label":"Matrix Progress Command Text","help":"Command/exec detail in progress draft lines: \\"raw\\" preserves released behavior; \\"status\\" shows only the tool label."}}},{"pluginId":"mattermost","channelId":"mattermost","label":"Mattermost","description":"self-hosted Slack-style chat; install the plugin to enable.","schema":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"name":{"type":"string"},"capabilities":{"type":"array","items":{"type":"string"}},"dangerouslyAllowNameMatching":{"type":"boolean"},"markdown":{"type":"object","properties":{"tables":{"type":"string","enum":["off","bullets","code","block"]}},"additionalProperties":false},"enabled":{"type":"boolean"},"configWrites":{"type":"boolean"},"botToken":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false}]}]},"baseUrl":{"type":"string"},"chatmode":{"type":"string","enum":["oncall","onmessage","onchar"]},"oncharPrefixes":{"type":"array","items":{"type":"string"}},"requireMention":{"type":"boolean"},"dmPolicy":{"default":"pairing","type":"string","enum":["pairing","allowlist","open","disabled"]},"allowFrom":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"groupAllowFrom":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"groupPolicy":{"default":"allowlist","type":"string","enum":["open","disabled","allowlist"]},"textChunkLimit":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"chunkMode":{"type":"string","enum":["length","newline"]},"streaming":{"anyOf":[{"type":"string","enum":["off","partial","block","progress"]},{"type":"boolean"},{"type":"object","properties":{"mode":{"type":"string","enum":["off","partial","block","progress"]},"chunkMode":{"type":"string","enum":["length","newline"]},"preview":{"type":"object","properties":{"toolProgress":{"type":"boolean"}},"additionalProperties":false},"progress":{"type":"object","properties":{"label":{"anyOf":[{"type":"string"},{"type":"boolean","const":false}]},"labels":{"type":"array","items":{"type":"string"}},"maxLines":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"toolProgress":{"type":"boolean"}},"additionalProperties":false},"block":{"type":"object","properties":{"enabled":{"type":"boolean"},"coalesce":{"type":"object","properties":{"minChars":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"maxChars":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"idleMs":{"type":"integer","minimum":0,"maximum":9007199254740991}},"additionalProperties":false}},"additionalProperties":false}},"additionalProperties":false}]},"blockStreaming":{"type":"boolean"},"blockStreamingCoalesce":{"type":"object","properties":{"minChars":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"maxChars":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"idleMs":{"type":"integer","minimum":0,"maximum":9007199254740991}},"additionalProperties":false},"replyToMode":{"type":"string","enum":["off","first","all","batched"]},"responsePrefix":{"type":"string"},"actions":{"type":"object","properties":{"reactions":{"type":"boolean"}},"additionalProperties":false},"commands":{"type":"object","properties":{"native":{"anyOf":[{"type":"boolean"},{"type":"string","const":"auto"}]},"nativeSkills":{"anyOf":[{"type":"boolean"},{"type":"string","const":"auto"}]},"callbackPath":{"type":"string"},"callbackUrl":{"type":"string"}},"additionalProperties":false},"interactions":{"type":"object","properties":{"callbackBaseUrl":{"type":"string"},"allowedSourceIps":{"type":"array","items":{"type":"string"}}},"additionalProperties":false},"groups":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"requireMention":{"type":"boolean"}},"additionalProperties":false}},"network":{"type":"object","properties":{"dangerouslyAllowPrivateNetwork":{"type":"boolean"}},"additionalProperties":false},"dmChannelRetry":{"type":"object","properties":{"maxRetries":{"type":"integer","minimum":0,"maximum":10},"initialDelayMs":{"type":"integer","minimum":100,"maximum":60000},"maxDelayMs":{"type":"integer","minimum":1000,"maximum":60000},"timeoutMs":{"type":"integer","minimum":5000,"maximum":120000}},"additionalProperties":false},"accounts":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"name":{"type":"string"},"capabilities":{"type":"array","items":{"type":"string"}},"dangerouslyAllowNameMatching":{"type":"boolean"},"markdown":{"type":"object","properties":{"tables":{"type":"string","enum":["off","bullets","code","block"]}},"additionalProperties":false},"enabled":{"type":"boolean"},"configWrites":{"type":"boolean"},"botToken":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false}]}]},"baseUrl":{"type":"string"},"chatmode":{"type":"string","enum":["oncall","onmessage","onchar"]},"oncharPrefixes":{"type":"array","items":{"type":"string"}},"requireMention":{"type":"boolean"},"dmPolicy":{"default":"pairing","type":"string","enum":["pairing","allowlist","open","disabled"]},"allowFrom":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"groupAllowFrom":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"groupPolicy":{"default":"allowlist","type":"string","enum":["open","disabled","allowlist"]},"textChunkLimit":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"chunkMode":{"type":"string","enum":["length","newline"]},"streaming":{"anyOf":[{"type":"string","enum":["off","partial","block","progress"]},{"type":"boolean"},{"type":"object","properties":{"mode":{"type":"string","enum":["off","partial","block","progress"]},"chunkMode":{"type":"string","enum":["length","newline"]},"preview":{"type":"object","properties":{"toolProgress":{"type":"boolean"}},"additionalProperties":false},"progress":{"type":"object","properties":{"label":{"anyOf":[{"type":"string"},{"type":"boolean","const":false}]},"labels":{"type":"array","items":{"type":"string"}},"maxLines":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"toolProgress":{"type":"boolean"}},"additionalProperties":false},"block":{"type":"object","properties":{"enabled":{"type":"boolean"},"coalesce":{"type":"object","properties":{"minChars":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"maxChars":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"idleMs":{"type":"integer","minimum":0,"maximum":9007199254740991}},"additionalProperties":false}},"additionalProperties":false}},"additionalProperties":false}]},"blockStreaming":{"type":"boolean"},"blockStreamingCoalesce":{"type":"object","properties":{"minChars":{"type":"integer","exclusiveMinimum":0,', + '"maximum":9007199254740991},"maxChars":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"idleMs":{"type":"integer","minimum":0,"maximum":9007199254740991}},"additionalProperties":false},"replyToMode":{"type":"string","enum":["off","first","all","batched"]},"responsePrefix":{"type":"string"},"actions":{"type":"object","properties":{"reactions":{"type":"boolean"}},"additionalProperties":false},"commands":{"type":"object","properties":{"native":{"anyOf":[{"type":"boolean"},{"type":"string","const":"auto"}]},"nativeSkills":{"anyOf":[{"type":"boolean"},{"type":"string","const":"auto"}]},"callbackPath":{"type":"string"},"callbackUrl":{"type":"string"}},"additionalProperties":false},"interactions":{"type":"object","properties":{"callbackBaseUrl":{"type":"string"},"allowedSourceIps":{"type":"array","items":{"type":"string"}}},"additionalProperties":false},"groups":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"requireMention":{"type":"boolean"}},"additionalProperties":false}},"network":{"type":"object","properties":{"dangerouslyAllowPrivateNetwork":{"type":"boolean"}},"additionalProperties":false},"dmChannelRetry":{"type":"object","properties":{"maxRetries":{"type":"integer","minimum":0,"maximum":10},"initialDelayMs":{"type":"integer","minimum":100,"maximum":60000},"maxDelayMs":{"type":"integer","minimum":1000,"maximum":60000},"timeoutMs":{"type":"integer","minimum":5000,"maximum":120000}},"additionalProperties":false}},"required":["dmPolicy","groupPolicy"],"additionalProperties":false}},"defaultAccount":{"type":"string"}},"required":["dmPolicy","groupPolicy"],"additionalProperties":false},"uiHints":{"":{"label":"Mattermost","help":"Mattermost channel provider configuration for bot auth, access policy, slash commands, and preview streaming."},"dmPolicy":{"label":"Mattermost DM Policy","help":"Direct message access control (\\"pairing\\" recommended). \\"open\\" requires channels.mattermost.allowFrom=[\\"*\\"]."},"streaming":{"label":"Mattermost Streaming Mode","help":"Unified Mattermost stream preview mode: \\"off\\" | \\"partial\\" | \\"block\\" | \\"progress\\". \\"progress\\" keeps a single editable progress draft until final delivery."},"streaming.mode":{"label":"Mattermost Streaming Mode","help":"Canonical Mattermost preview mode: \\"off\\" | \\"partial\\" | \\"block\\" | \\"progress\\"."},"streaming.progress.label":{"label":"Mattermost Progress Label","help":"Initial progress draft title. Use \\"auto\\" for built-in single-word labels, a custom string, or false to hide the title."},"streaming.progress.labels":{"label":"Mattermost Progress Label Pool","help":"Candidate labels for streaming.progress.label=\\"auto\\". Leave unset to use OpenClaw built-in progress labels."},"streaming.progress.maxLines":{"label":"Mattermost Progress Max Lines","help":"Maximum number of compact progress lines to keep below the draft label (default: 8)."},"streaming.progress.toolProgress":{"label":"Mattermost Progress Tool Lines","help":"Show compact tool/progress lines in progress draft mode (default: true). Set false to keep only the label until final delivery."},"streaming.progress.commandText":{"label":"Mattermost Progress Command Text","help":"Command/exec detail in progress draft lines: \\"raw\\" preserves released behavior; \\"status\\" shows only the tool label."},"streaming.preview.toolProgress":{"label":"Mattermost Draft Tool Progress","help":"Show tool/progress activity in the live draft preview post (default: true). Set false to hide interim tool updates while the draft preview stays active."},"streaming.preview.commandText":{"label":"Mattermost Draft Command Text","help":"Command/exec detail in preview tool-progress lines: \\"raw\\" preserves released behavior; \\"status\\" shows only the tool label."},"streaming.block.enabled":{"label":"Mattermost Block Streaming Enabled","help":"Enable chunked block-style Mattermost preview delivery when channels.mattermost.streaming.mode=\\"block\\"."},"streaming.block.coalesce":{"label":"Mattermost Block Streaming Coalesce","help":"Merge streamed Mattermost block replies before final delivery."}}},{"pluginId":"msteams","channelId":"msteams","label":"Microsoft Teams","description":"Teams SDK; enterprise support.","schema":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"enabled":{"type":"boolean"},"capabilities":{"type":"array","items":{"type":"string"}},"dangerouslyAllowNameMatching":{"type":"boolean"},"markdown":{"type":"object","properties":{"tables":{"type":"string","enum":["off","bullets","code","block"]}},"additionalProperties":false},"configWrites":{"type":"boolean"},"appId":{"type":"string"},"appPassword":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false}]}]},"tenantId":{"type":"string"},"authType":{"type":"string","enum":["secret","federated"]},"certificatePath":{"type":"string"},"certificateThumbprint":{"type":"string"},"useManagedIdentity":{"type":"boolean"},"managedIdentityClientId":{"type":"string"},"webhook":{"type":"object","properties":{"port":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"path":{"type":"string"}},"additionalProperties":false},"dmPolicy":{"default":"pairing","type":"string","enum":["pairing","allowlist","open","disabled"]},"allowFrom":{"type":"array","items":{"type":"string"}},"defaultTo":{"type":"string"},"groupAllowFrom":{"type":"array","items":{"type":"string"}},"groupPolicy":{"default":"allowlist","type":"string","enum":["open","disabled","allowlist"]},"contextVisibility":{"type":"string","enum":["all","allowlist","allowlist_quote"]},"textChunkLimit":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"chunkMode":{"type":"string","enum":["length","newline"]},"streaming":{"type":"object","properties":{"mode":{"type":"string","enum":["off","partial","block","progress"]},"chunkMode":{"type":"string","enum":["length","newline"]},"preview":{"type":"object","properties":{"chunk":{"type":"object","properties":{"minChars":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"maxChars":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"breakPreference":{"anyOf":[{"type":"string","const":"paragraph"},{"type":"string","const":"newline"},{"type":"string","const":"sentence"}]}},"additionalProperties":false},"toolProgress":{"type":"boolean"},"commandText":{"type":"string","enum":["raw","status"]}},"additionalProperties":false},"progress":{"type":"object","properties":{"label":{"anyOf":[{"type":"string"},{"type":"boolean","const":false}]},"labels":{"type":"array","items":{"type":"string"}},"maxLines":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"render":{"type":"string","enum":["text","rich"]},"toolProgress":{"type":"boolean"},"commandText":{"type":"string","enum":["raw","status"]}},"additionalProperties":false},"block":{"type":"object","properties":{"enabled":{"type":"boolean"},"coalesce":{"type":"object","properties":{"minChars":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"maxChars":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"idleMs":{"type":"integer","minimum":0,"maximum":9007199254740991}},"additionalProperties":false}},"additionalProperties":false}},"additionalProperties":false},"typingIndicator":{"type":"boolean"},"blockStreaming":{"type":"boolean"},"blockStreamingCoalesce":{"type":"object","properties":{"minChars":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"maxChars":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"idleMs":{"type":"integer","minimum":0,"maximum":9007199254740991}},"additionalProperties":false},"mediaAllowHosts":{"type":"array","items":{"type":"string"}},"mediaAuthAllowHosts":{"type":"array","items":{"type":"string"}},"requireMention":{"type":"boolean"},"historyLimit":{"type":"integer","minimum":0,"maximum":9007199254740991},"dmHistoryLimit":{"type":"integer","minimum":0,"maximum":9007199254740991},"dms":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"historyLimit":{"type":"integer","minimum":0,"maximum":9007199254740991}},"additionalProperties":false}},"replyStyle":{"type":"string","enum":["thread","top-level"]},"teams":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"requireMention":{"type":"boolean"},"tools":{"type":"object","properties":{"allow":{"type":"array","items":{"type":"string"}},"alsoAllow":{"type":"array","items":{"type":"string"}},"deny":{"type":"array","items":{"type":"string"}}},"additionalProperties":false},"toolsBySender":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"allow":{"type":"array","items":{"type":"string"}},"alsoAllow":{"type":"array","items":{"type":"string"}},"deny":{"type":"array","items":{"type":"string"}}},"additionalProperties":false}},"replyStyle":{"type":"string","enum":["thread","top-level"]},"channels":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"requireMention":{"type":"boolean"},"tools":{"type":"object","properties":{"allow":{"type":"array","items":{"type":"string"}},"alsoAllow":{"type":"array","items":{"type":"string"}},"deny":{"type":"array","items":{"type":"string"}}},"additionalProperties":false},"toolsBySender":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"allow":{"type":"array","items":{"type":"string"}},"alsoAllow":{"type":"array","items":{"type":"string"}},"deny":{"type":"array","items":{"type":"string"}}},"additionalProperties":false}},"replyStyle":{"type":"string","enum":["thread","top-level"]}},"additionalProperties":false}}},"additionalProperties":false}},"mediaMaxMb":{"type":"number","exclusiveMinimum":0},"sharePointSiteId":{"type":"string"},"heartbeat":{"type":"object","properties":{"showOk":{"type":"boolean"},"showAlerts":{"type":"boolean"},"useIndicator":{"type":"boolean"}},"additionalProperties":false},"healthMonitor":{"type":"object","properties":{"enabled":{"type":"boolean"}},"additionalProperties":false},"responsePrefix":{"type":"string"},"welcomeCard":{"type":"boolean"},"promptStarters":{"type":"array","items":{"type":"string"}},"groupWelcomeCard":{"type":"boolean"},"feedbackEnabled":{"type":"boolean"},"feedbackReflection":{"type":"boolean"},"feedbackReflectionCooldownMs":{"type":"integer","minimum":0,"maximum":9007199254740991},"delegatedAuth":{"type":"object","properties":{"enabled":{"type":"boolean"},"scopes":{"type":"array","items":{"type":"string"}}},"additionalProperties":false},"sso":{"type":"object","properties":{"enabled":{"type":"boolean"},"connectionName":{"type":"string"}},"additionalProperties":false}},"required":["dmPolicy","groupPolicy"],"additionalProperties":false},"uiHints":{"":{"label":"MS Teams","help":"Microsoft Teams channel provider configuration and provider-specific policy toggles. Use this section to isolate Teams behavior from other enterprise chat providers."},"configWrites":{"label":"MS Teams Config Writes","help":"Allow Microsoft Teams to write config in response to channel events/commands (default: true)."},"streaming":{"label":"MS Teams Streaming","help":"Microsoft Teams preview/progress streaming mode: \\"off\\" | \\"partial\\" | \\"block\\" | \\"progress\\". Personal chats use Teams native streaminfo progress when available."},"streaming.progress.label":{"label":"MS Teams Progress Label","help":"Initial progress title. Use \\"auto\\" for built-in single-word labels, a custom string, or false to hide the title."},"streaming.progress.labels":{"label":"MS Teams Progress Label Pool","help":"Candidate labels for streaming.progress.label=\\"auto\\". Leave unset to use OpenClaw built-in progress labels."},"streaming.progress.maxLines":{"label":"MS Teams Progress Max Lines","help":"Maximum number of compact progress lines to keep below the progress title (default: 8)."},"streaming.progress.toolProgress":{"label":"MS Teams Progress Tool Lines","help":"Show compact tool/progress lines in progress mode (default: true). Set false to keep only the title until final delivery."},"streaming.progress.commandText":{"label":"MS Teams Progress Command Text","help":"Command/exec detail in progress lines: \\"raw\\" preserves released behavior; \\"status\\" shows only the tool label."}}},{"pluginId":"nextcloud-talk","channelId":"nextcloud-talk","label":"Nextcloud Talk","description":"Self-hosted chat via Nextcloud Talk webhook bots.","schema":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"name":{"type":"string"},"enabled":{"type":"boolean"},"markdown":{"type":"object","properties":{"tables":{"type":"string","enum":["off","bullets","code","block"]}},"additionalProperties":false},"baseUrl":{"type":"string"},"botSecret":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false}]}]},"botSecretFile":{"type":"string"},"apiUser":{"type":"string"},"apiPassword":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false}]}]},"apiPasswordFile":{"type":"string"},"dmPolicy":{"default":"pairing","type":"string","enum":["pairing","allowlist","open","disabled"]},"webhookPort":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"webhookHost":{"type":"string"},"webhookPath":{"type":"string"},"webhookPublicUrl":{"type":"string"},"allowFrom":{"type":"array","items":{"type":"string"}},"groupAllowFrom":{"type":"array","items":{"type":"string"}},"groupPolicy":{"default":"allowlist","type":"string","enum":["open","disabled","allowlist"]},"rooms":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"requireMention":{"type":"boolean"},"tools":{"type":"object","properties":{"allow":{"type":"array","items":{"type":"string"}},"alsoAllow":{"type":"array","items":{"type":"string"}},"deny":{"type":"array","items":{"type":"string"}}},"additionalProperties":false},"skills":{"type":"array","items":{"type":"string"}},"enabled":{"type":"boolean"},"allowFrom":{"type":"array","items":{"type":"string"}},"systemPrompt":{"type":"string"}},"additionalProperties":false}},"network":{"type":"object","properties":{"dangerouslyAllowPrivateNetwork":{"type":"boolean"}},"addi', + 'tionalProperties":false},"historyLimit":{"type":"integer","minimum":0,"maximum":9007199254740991},"dmHistoryLimit":{"type":"integer","minimum":0,"maximum":9007199254740991},"contextVisibility":{"type":"string","enum":["all","allowlist","allowlist_quote"]},"dms":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"historyLimit":{"type":"integer","minimum":0,"maximum":9007199254740991}},"additionalProperties":false}},"textChunkLimit":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"chunkMode":{"type":"string","enum":["length","newline"]},"blockStreaming":{"type":"boolean"},"blockStreamingCoalesce":{"type":"object","properties":{"minChars":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"maxChars":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"idleMs":{"type":"integer","minimum":0,"maximum":9007199254740991}},"additionalProperties":false},"responsePrefix":{"type":"string"},"mediaMaxMb":{"type":"number","exclusiveMinimum":0},"accounts":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"name":{"type":"string"},"enabled":{"type":"boolean"},"markdown":{"type":"object","properties":{"tables":{"type":"string","enum":["off","bullets","code","block"]}},"additionalProperties":false},"baseUrl":{"type":"string"},"botSecret":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false}]}]},"botSecretFile":{"type":"string"},"apiUser":{"type":"string"},"apiPassword":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false}]}]},"apiPasswordFile":{"type":"string"},"dmPolicy":{"default":"pairing","type":"string","enum":["pairing","allowlist","open","disabled"]},"webhookPort":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"webhookHost":{"type":"string"},"webhookPath":{"type":"string"},"webhookPublicUrl":{"type":"string"},"allowFrom":{"type":"array","items":{"type":"string"}},"groupAllowFrom":{"type":"array","items":{"type":"string"}},"groupPolicy":{"default":"allowlist","type":"string","enum":["open","disabled","allowlist"]},"rooms":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"requireMention":{"type":"boolean"},"tools":{"type":"object","properties":{"allow":{"type":"array","items":{"type":"string"}},"alsoAllow":{"type":"array","items":{"type":"string"}},"deny":{"type":"array","items":{"type":"string"}}},"additionalProperties":false},"skills":{"type":"array","items":{"type":"string"}},"enabled":{"type":"boolean"},"allowFrom":{"type":"array","items":{"type":"string"}},"systemPrompt":{"type":"string"}},"additionalProperties":false}},"network":{"type":"object","properties":{"dangerouslyAllowPrivateNetwork":{"type":"boolean"}},"additionalProperties":false},"historyLimit":{"type":"integer","minimum":0,"maximum":9007199254740991},"dmHistoryLimit":{"type":"integer","minimum":0,"maximum":9007199254740991},"contextVisibility":{"type":"string","enum":["all","allowlist","allowlist_quote"]},"dms":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"historyLimit":{"type":"integer","minimum":0,"maximum":9007199254740991}},"additionalProperties":false}},"textChunkLimit":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"chunkMode":{"type":"string","enum":["length","newline"]},"blockStreaming":{"type":"boolean"},"blockStreamingCoalesce":{"type":"object","properties":{"minChars":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"maxChars":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"idleMs":{"type":"integer","minimum":0,"maximum":9007199254740991}},"additionalProperties":false},"responsePrefix":{"type":"string"},"mediaMaxMb":{"type":"number","exclusiveMinimum":0}},"required":["dmPolicy","groupPolicy"],"additionalProperties":false}},"defaultAccount":{"type":"string"}},"required":["dmPolicy","groupPolicy"],"additionalProperties":false}},{"pluginId":"nostr","channelId":"nostr","label":"Nostr","description":"Decentralized protocol; encrypted DMs via NIP-04.","schema":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"name":{"type":"string"},"defaultAccount":{"type":"string"},"enabled":{"type":"boolean"},"markdown":{"type":"object","properties":{"tables":{"type":"string","enum":["off","bullets","code","block"]}},"additionalProperties":false},"privateKey":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false}]}]},"relays":{"type":"array","items":{"type":"string"}},"dmPolicy":{"type":"string","enum":["pairing","allowlist","open","disabled"]},"allowFrom":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"profile":{"type":"object","properties":{"name":{"type":"string","maxLength":256},"displayName":{"type":"string","maxLength":256},"about":{"type":"string","maxLength":2000},"picture":{"type":"string","format":"uri"},"banner":{"type":"string","format":"uri"},"website":{"type":"string","format":"uri"},"nip05":{"type":"string"},"lud16":{"type":"string"}},"additionalProperties":false}},"additionalProperties":false}},{"pluginId":"qa-channel","channelId":"qa-channel","label":"QA Channel","description":"Synthetic Slack-class transport for automated OpenClaw QA scenarios.","schema":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"name":{"type":"string"},"enabled":{"type":"boolean"},"baseUrl":{"type":"string","format":"uri"},"botUserId":{"type":"string"},"botDisplayName":{"type":"string"},"pollTimeoutMs":{"type":"integer","minimum":100,"maximum":30000},"allowFrom":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"groupPolicy":{"type":"string","enum":["open","allowlist","disabled"]},"groupAllowFrom":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"groups":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"requireMention":{"type":"boolean"},"tools":{"type":"object","properties":{"allow":{"type":"array","items":{"type":"string"}},"alsoAllow":{"type":"array","items":{"type":"string"}},"deny":{"type":"array","items":{"type":"string"}}},"additionalProperties":false},"toolsBySender":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"allow":{"type":"array","items":{"type":"string"}},"alsoAllow":{"type":"array","items":{"type":"string"}},"deny":{"type":"array","items":{"type":"string"}}},"additionalProperties":false}}},"additionalProperties":false}},"defaultTo":{"type":"string"},"actions":{"type":"object","properties":{"messages":{"type":"boolean"},"reactions":{"type":"boolean"},"search":{"type":"boolean"},"threads":{"type":"boolean"}},"additionalProperties":false},"accounts":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"name":{"type":"string"},"enabled":{"type":"boolean"},"baseUrl":{"type":"string","format":"uri"},"botUserId":{"type":"string"},"botDisplayName":{"type":"string"},"pollTimeoutMs":{"type":"integer","minimum":100,"maximum":30000},"allowFrom":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"groupPolicy":{"type":"string","enum":["open","allowlist","disabled"]},"groupAllowFrom":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"groups":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"requireMention":{"type":"boolean"},"tools":{"type":"object","properties":{"allow":{"type":"array","items":{"type":"string"}},"alsoAllow":{"type":"array","items":{"type":"string"}},"deny":{"type":"array","items":{"type":"string"}}},"additionalProperties":false},"toolsBySender":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"allow":{"type":"array","items":{"type":"string"}},"alsoAllow":{"type":"array","items":{"type":"string"}},"deny":{"type":"array","items":{"type":"string"}}},"additionalProperties":false}}},"additionalProperties":false}},"defaultTo":{"type":"string"},"actions":{"type":"object","properties":{"messages":{"type":"boolean"},"reactions":{"type":"boolean"},"search":{"type":"boolean"},"threads":{"type":"boolean"}},"additionalProperties":false}},"additionalProperties":false}},"defaultAccount":{"type":"string"}},"additionalProperties":false}},{"pluginId":"qqbot","channelId":"qqbot","label":"QQ Bot","description":"connect to QQ via official QQ Bot API with group chat and direct message support.","schema":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"enabled":{"type":"boolean"},"name":{"type":"string"},"appId":{"type":"string"},"clientSecret":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false}]}]},"clientSecretFile":{"type":"string"},"allowFrom":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"groupAllowFrom":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"dmPolicy":{"type":"string","enum":["open","allowlist","disabled"]},"groupPolicy":{"type":"string","enum":["open","allowlist","disabled"]},"systemPrompt":{"type":"string"},"markdownSupport":{"type":"boolean"},"voiceDirectUploadFormats":{"type":"array","items":{"type":"string"}},"audioFormatPolicy":{"type":"object","properties":{"sttDirectFormats":{"type":"array","items":{"type":"string"}},"uploadDirectFormats":{"type":"array","items":{"type":"string"}},"transcodeEnabled":{"type":"boolean"}},"additionalProperties":false},"urlDirectUpload":{"type":"boolean"},"upgradeUrl":{"type":"string"},"upgradeMode":{"type":"string","enum":["doc","hot-reload"]},"streaming":{"anyOf":[{"type":"boolean"},{"type":"object","properties":{"mode":{"default":"partial","type":"string","enum":["off","partial"]},"c2cStreamApi":{"type":"boolean"}},"required":["mode"],"additionalProperties":{}}]},"execApprovals":{"type":"object","properties":{"enabled":{"anyOf":[{"type":"boolean"},{"type":"string","const":"auto"}]},"approvers":{"type":"array","items":{"type":"string"}},"agentFilter":{"type":"array","items":{"type":"string"}},"sessionFilter":{"type":"array","items":{"type":"string"}},"target":{"type":"string","enum":["dm","channel","both"]}},"additionalProperties":false},"stt":{"type":"object","properties":{"enabled":{"type":"boolean"},"provider":{"type":"string"},"baseUrl":{"type":"string"},"apiKey":{"type":"string"},"model":{"type":"string"}},"additionalProperties":false},"accounts":{"type":"object","properties":{},"additionalProperties":{"type":"object","properties":{"enabled":{"type":"boolean"},"name":{"type":"string"},"appId":{"type":"string"},"clientSecret":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false}]}]},"clientSecretFile":{"type":"string"},"allowFrom":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"groupAllowFrom":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"dmPolicy":{"type":"string","enum":["open","allowlist","disabled"]},"groupPolicy":{"type":"string","enum":["open","allowlist","disabled"]},"systemPrompt":{"type":"string"},"markdownSupport":{"type":"boolean"},"voiceDirectUploadFormats":{"type":"array","items":{"type":"string"}},"audioFormatPolicy":{"type":"object","properties":{"sttDirectFormats":{"type":"array","items":{"type":"string"}},"uploadDirectFormats":{"type":"array","items":{"type":"string"}},"transcodeEnabled":{"type":"boolean"}},"additionalProperties":false},"urlDirectUpload":{"type":"boolean"},"upgradeUrl":{"type":"string"},"upgradeMode":{"type":"string","enum":["doc","hot-reload"]},"streaming":{"anyOf":[{"type":"boolean"},{"type":"object","properties":{"mode":{"default":"partial","type":"string","enum":["off","partial"]},"c2cStreamApi":{"type":"boolean"}},"required":["mode"],"additionalProperties":{}}]},"execApprovals":{"type":"object","properties":{"enabled":{"anyOf":[{"type":"boolean"},{"type":"string","const":"auto"}]},"approvers":{"type":"array","items":{"type":"string"}},"agentFilter":{"type":"array","items":{"type":"string"}},"sessionFilter":{"type":"array","items":{"type":"string"}},"target":{"type":"string","enum":["dm","channel","both"]}},"additionalProperties":false}},"additionalProperties":{}}},"defaultAccount":{"type":"string"}},"additionalProperties":{}}},{"pluginId":"signal","channelId":"signal","label":"Signal","description":"signal-cli linked device; more setup (David Reagans: \\"Hop on Discord.\\").","schema":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"name":{"type":"string"},"capabilities":{"type":"array","items":{"type":"string"}},"markdown":{"type":"object","properties":{"tables":{"type":"string","enum":["off","bullets","code","block"]}},"additionalProperties":false},"enabled":{"type":"boolean"},"configWri', + 'tes":{"type":"boolean"},"account":{"type":"string"},"accountUuid":{"type":"string"},"httpUrl":{"type":"string"},"httpHost":{"type":"string"},"httpPort":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"cliPath":{"type":"string"},"autoStart":{"type":"boolean"},"startupTimeoutMs":{"type":"integer","minimum":1000,"maximum":120000},"receiveMode":{"anyOf":[{"type":"string","const":"on-start"},{"type":"string","const":"manual"}]},"ignoreAttachments":{"type":"boolean"},"ignoreStories":{"type":"boolean"},"sendReadReceipts":{"type":"boolean"},"dmPolicy":{"default":"pairing","type":"string","enum":["pairing","allowlist","open","disabled"]},"allowFrom":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"defaultTo":{"type":"string"},"groupAllowFrom":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"groupPolicy":{"default":"allowlist","type":"string","enum":["open","disabled","allowlist"]},"contextVisibility":{"type":"string","enum":["all","allowlist","allowlist_quote"]},"groups":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"requireMention":{"type":"boolean"},"ingest":{"type":"boolean"},"tools":{"type":"object","properties":{"allow":{"type":"array","items":{"type":"string"}},"alsoAllow":{"type":"array","items":{"type":"string"}},"deny":{"type":"array","items":{"type":"string"}}},"additionalProperties":false},"toolsBySender":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"allow":{"type":"array","items":{"type":"string"}},"alsoAllow":{"type":"array","items":{"type":"string"}},"deny":{"type":"array","items":{"type":"string"}}},"additionalProperties":false}}},"additionalProperties":false}},"historyLimit":{"type":"integer","minimum":0,"maximum":9007199254740991},"dmHistoryLimit":{"type":"integer","minimum":0,"maximum":9007199254740991},"dms":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"historyLimit":{"type":"integer","minimum":0,"maximum":9007199254740991}},"additionalProperties":false}},"textChunkLimit":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"chunkMode":{"type":"string","enum":["length","newline"]},"blockStreaming":{"type":"boolean"},"blockStreamingCoalesce":{"type":"object","properties":{"minChars":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"maxChars":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"idleMs":{"type":"integer","minimum":0,"maximum":9007199254740991}},"additionalProperties":false},"mediaMaxMb":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"reactionNotifications":{"type":"string","enum":["off","own","all","allowlist"]},"reactionAllowlist":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"actions":{"type":"object","properties":{"reactions":{"type":"boolean"}},"additionalProperties":false},"reactionLevel":{"type":"string","enum":["off","ack","minimal","extensive"]},"heartbeat":{"type":"object","properties":{"showOk":{"type":"boolean"},"showAlerts":{"type":"boolean"},"useIndicator":{"type":"boolean"}},"additionalProperties":false},"healthMonitor":{"type":"object","properties":{"enabled":{"type":"boolean"}},"additionalProperties":false},"responsePrefix":{"type":"string"},"accounts":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"name":{"type":"string"},"capabilities":{"type":"array","items":{"type":"string"}},"markdown":{"type":"object","properties":{"tables":{"type":"string","enum":["off","bullets","code","block"]}},"additionalProperties":false},"enabled":{"type":"boolean"},"configWrites":{"type":"boolean"},"account":{"type":"string"},"accountUuid":{"type":"string"},"httpUrl":{"type":"string"},"httpHost":{"type":"string"},"httpPort":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"cliPath":{"type":"string"},"autoStart":{"type":"boolean"},"startupTimeoutMs":{"type":"integer","minimum":1000,"maximum":120000},"receiveMode":{"anyOf":[{"type":"string","const":"on-start"},{"type":"string","const":"manual"}]},"ignoreAttachments":{"type":"boolean"},"ignoreStories":{"type":"boolean"},"sendReadReceipts":{"type":"boolean"},"dmPolicy":{"default":"pairing","type":"string","enum":["pairing","allowlist","open","disabled"]},"allowFrom":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"defaultTo":{"type":"string"},"groupAllowFrom":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"groupPolicy":{"default":"allowlist","type":"string","enum":["open","disabled","allowlist"]},"contextVisibility":{"type":"string","enum":["all","allowlist","allowlist_quote"]},"groups":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"requireMention":{"type":"boolean"},"ingest":{"type":"boolean"},"tools":{"type":"object","properties":{"allow":{"type":"array","items":{"type":"string"}},"alsoAllow":{"type":"array","items":{"type":"string"}},"deny":{"type":"array","items":{"type":"string"}}},"additionalProperties":false},"toolsBySender":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"allow":{"type":"array","items":{"type":"string"}},"alsoAllow":{"type":"array","items":{"type":"string"}},"deny":{"type":"array","items":{"type":"string"}}},"additionalProperties":false}}},"additionalProperties":false}},"historyLimit":{"type":"integer","minimum":0,"maximum":9007199254740991},"dmHistoryLimit":{"type":"integer","minimum":0,"maximum":9007199254740991},"dms":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"historyLimit":{"type":"integer","minimum":0,"maximum":9007199254740991}},"additionalProperties":false}},"textChunkLimit":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"chunkMode":{"type":"string","enum":["length","newline"]},"blockStreaming":{"type":"boolean"},"blockStreamingCoalesce":{"type":"object","properties":{"minChars":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"maxChars":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"idleMs":{"type":"integer","minimum":0,"maximum":9007199254740991}},"additionalProperties":false},"mediaMaxMb":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"reactionNotifications":{"type":"string","enum":["off","own","all","allowlist"]},"reactionAllowlist":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"actions":{"type":"object","properties":{"reactions":{"type":"boolean"}},"additionalProperties":false},"reactionLevel":{"type":"string","enum":["off","ack","minimal","extensive"]},"heartbeat":{"type":"object","properties":{"showOk":{"type":"boolean"},"showAlerts":{"type":"boolean"},"useIndicator":{"type":"boolean"}},"additionalProperties":false},"healthMonitor":{"type":"object","properties":{"enabled":{"type":"boolean"}},"additionalProperties":false},"responsePrefix":{"type":"string"}},"required":["dmPolicy","groupPolicy"],"additionalProperties":false}},"defaultAccount":{"type":"string"}},"required":["dmPolicy","groupPolicy"],"additionalProperties":false},"uiHints":{"":{"label":"Signal","help":"Signal channel provider configuration including account identity and DM policy behavior. Keep account mapping explicit so routing remains stable across multi-device setups."},"dmPolicy":{"label":"Signal DM Policy","help":"Direct message access control (\\"pairing\\" recommended). \\"open\\" requires channels.signal.allowFrom=[\\"*\\"]."},"configWrites":{"label":"Signal Config Writes","help":"Allow Signal to write config in response to channel events/commands (default: true)."},"account":{"label":"Signal Account","help":"Signal account identifier (phone/number handle) used to bind this channel config to a specific Signal identity. Keep this aligned with your linked device/session state."}}},{"pluginId":"slack","channelId":"slack","label":"Slack","description":"supported (Socket Mode).","schema":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"name":{"type":"string"},"mode":{"default":"socket","type":"string","enum":["socket","http"]},"socketMode":{"type":"object","properties":{"clientPingTimeout":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"serverPingTimeout":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"pingPongLoggingEnabled":{"type":"boolean"}},"additionalProperties":false},"signingSecret":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false}]}]},"webhookPath":{"default":"/slack/events","type":"string"},"capabilities":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"object","properties":{"interactiveReplies":{"type":"boolean"}},"additionalProperties":false}]},"execApprovals":{"type":"object","properties":{"enabled":{"type":"boolean"},"approvers":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"agentFilter":{"type":"array","items":{"type":"string"}},"sessionFilter":{"type":"array","items":{"type":"string"}},"target":{"type":"string","enum":["dm","channel","both"]}},"additionalProperties":false},"markdown":{"type":"object","properties":{"tables":{"type":"string","enum":["off","bullets","code","block"]}},"additionalProperties":false},"enabled":{"type":"boolean"},"commands":{"type":"object","properties":{"native":{"anyOf":[{"type":"boolean"},{"type":"string","const":"auto"}]},"nativeSkills":{"anyOf":[{"type":"boolean"},{"type":"string","const":"auto"}]}},"additionalProperties":false},"configWrites":{"type":"boolean"},"botToken":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false}]}]},"appToken":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false}]}]},"userToken":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false}]}]},"userTokenReadOnly":{"default":true,"type":"boolean"},"allowBots":{"type":"boolean"},"dangerouslyAllowNameMatching":{"type":"boolean"},"requireMention":{"type":"boolean"},"groupPolicy":{"default":"allowlist","type":"string","enum":["open","disabled","allowlist"]},"contextVisibility":{"type":"string","enum":["all","allowlist","allowlist_quote"]},"historyLimit":{"type":"integer","minimum":0,"maximum":9007199254740991},"dmHistoryLimit":{"type":"integer","minimum":0,"maximum":9007199254740991},"dms":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"historyLimit":{"type":"integer","minimum":0,"maximum":9007199254740991}},"additionalProperties":false}},"textChunkLimit":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"streaming":{"type":"object","properties":{"mode":{"type":"string","enum":["off","partial","block","progress"]},"chunkMode":{"type":"string","enum":["length","newline"]},"preview":{"type":"object","properties":{"chunk":{"type":"object","properties":{"minChars":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"maxChars":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"breakPreference":{"anyOf":[{"type":"string","const":"paragraph"},{"type":"string","const":"newline"},{"type":"string","const":"sentence"}]}},"additionalProperties":false},"toolProgress":{"type":"boolean"},"commandText":{"type":"string","enum":["raw","status"]}},"additionalProperties":false},"progress":{"type":"object","properties":{"label":{"anyOf":[{"type":"string"},{"type":"boolean","const":false}]},"labels":{"type":"array","items":{"type":"string"}},"maxLines":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"render":{"type":"string","enum":["text","rich"]},"toolProgress":{"type":"boolean"},"commandText":{"type":"string","enum":["raw","status"]}},"additionalProperties":false},"block":{"type":"object","properties":{"enabled":{"type":"boolean"},"coalesce":{"type":"object","properties":{"minChars":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"maxChars":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"idleMs":{"type":"integer","minimum":0,"maximum":9007199254740991}},"additionalProperties":false}},"additionalProperties":false},"nativeTransport":{"type":"boolean"}},"additionalProperties":false},"mediaMaxMb":{"type":"number","exclusiveMinimum":0},"reactionNotifications":{"type":"string","enum":["off","own","all","allowlist"]},"reactionAllowlist":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"replyToMode":{"anyOf":[{"type":"string","const":"off"},{"type":"string","const":"first"},{"type":"string","const":"all"},{"type":"string","const":"batched"}]},"replyToModeByChatType":{"type":"object","properties":{"direct":{"anyOf":[{"type":"string","const":"off"},{"type":"string","const":"first"},{"type":"string","const":"all"},{"type":"string","const":"batched"}]},"group":{"anyOf":[{"type":"string","const":"off"},{"type":"string","const":"first"},{"type":"string","const":"all"},{"type":"string","const":"batched"}]},"channel":{"anyOf":[{"type":"string","const":"off"},{"type":"string","const":"first"},{"type":"string","const":"all"},{"type":"string","const":"batched"}]}},"additionalProperties":false},"thread":{"type":"object","properties":{"historyScope":{"type":"string","enum":["thread","channel"]},"inheritParent":{"type":"boolean"},"initialHistoryLimit":{"type":"integer","minimum":0,"maximum":9007199254740991},"requireExplicitMention":{"type":"boolean"}},"additionalProperties":false},"actions":{"type":"object"', + ',"properties":{"reactions":{"type":"boolean"},"messages":{"type":"boolean"},"pins":{"type":"boolean"},"search":{"type":"boolean"},"permissions":{"type":"boolean"},"memberInfo":{"type":"boolean"},"channelInfo":{"type":"boolean"},"emojiList":{"type":"boolean"}},"additionalProperties":false},"slashCommand":{"type":"object","properties":{"enabled":{"type":"boolean"},"name":{"type":"string"},"sessionPrefix":{"type":"string"},"ephemeral":{"type":"boolean"}},"additionalProperties":false},"dmPolicy":{"type":"string","enum":["pairing","allowlist","open","disabled"]},"allowFrom":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"defaultTo":{"type":"string"},"dm":{"type":"object","properties":{"enabled":{"type":"boolean"},"policy":{"type":"string","enum":["pairing","allowlist","open","disabled"]},"allowFrom":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"groupEnabled":{"type":"boolean"},"groupChannels":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"replyToMode":{"anyOf":[{"type":"string","const":"off"},{"type":"string","const":"first"},{"type":"string","const":"all"},{"type":"string","const":"batched"}]}},"additionalProperties":false},"channels":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"enabled":{"type":"boolean"},"requireMention":{"type":"boolean"},"tools":{"type":"object","properties":{"allow":{"type":"array","items":{"type":"string"}},"alsoAllow":{"type":"array","items":{"type":"string"}},"deny":{"type":"array","items":{"type":"string"}}},"additionalProperties":false},"toolsBySender":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"allow":{"type":"array","items":{"type":"string"}},"alsoAllow":{"type":"array","items":{"type":"string"}},"deny":{"type":"array","items":{"type":"string"}}},"additionalProperties":false}},"allowBots":{"type":"boolean"},"users":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"skills":{"type":"array","items":{"type":"string"}},"systemPrompt":{"type":"string"}},"additionalProperties":false}},"heartbeat":{"type":"object","properties":{"showOk":{"type":"boolean"},"showAlerts":{"type":"boolean"},"useIndicator":{"type":"boolean"}},"additionalProperties":false},"healthMonitor":{"type":"object","properties":{"enabled":{"type":"boolean"}},"additionalProperties":false},"responsePrefix":{"type":"string"},"ackReaction":{"type":"string"},"typingReaction":{"type":"string"},"accounts":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"name":{"type":"string"},"mode":{"type":"string","enum":["socket","http"]},"socketMode":{"type":"object","properties":{"clientPingTimeout":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"serverPingTimeout":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"pingPongLoggingEnabled":{"type":"boolean"}},"additionalProperties":false},"signingSecret":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false}]}]},"webhookPath":{"type":"string"},"capabilities":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"object","properties":{"interactiveReplies":{"type":"boolean"}},"additionalProperties":false}]},"execApprovals":{"type":"object","properties":{"enabled":{"type":"boolean"},"approvers":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"agentFilter":{"type":"array","items":{"type":"string"}},"sessionFilter":{"type":"array","items":{"type":"string"}},"target":{"type":"string","enum":["dm","channel","both"]}},"additionalProperties":false},"markdown":{"type":"object","properties":{"tables":{"type":"string","enum":["off","bullets","code","block"]}},"additionalProperties":false},"enabled":{"type":"boolean"},"commands":{"type":"object","properties":{"native":{"anyOf":[{"type":"boolean"},{"type":"string","const":"auto"}]},"nativeSkills":{"anyOf":[{"type":"boolean"},{"type":"string","const":"auto"}]}},"additionalProperties":false},"configWrites":{"type":"boolean"},"botToken":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false}]}]},"appToken":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false}]}]},"userToken":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false}]}]},"userTokenReadOnly":{"default":true,"type":"boolean"},"allowBots":{"type":"boolean"},"dangerouslyAllowNameMatching":{"type":"boolean"},"requireMention":{"type":"boolean"},"groupPolicy":{"type":"string","enum":["open","disabled","allowlist"]},"contextVisibility":{"type":"string","enum":["all","allowlist","allowlist_quote"]},"historyLimit":{"type":"integer","minimum":0,"maximum":9007199254740991},"dmHistoryLimit":{"type":"integer","minimum":0,"maximum":9007199254740991},"dms":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"historyLimit":{"type":"integer","minimum":0,"maximum":9007199254740991}},"additionalProperties":false}},"textChunkLimit":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"streaming":{"type":"object","properties":{"mode":{"type":"string","enum":["off","partial","block","progress"]},"chunkMode":{"type":"string","enum":["length","newline"]},"preview":{"type":"object","properties":{"chunk":{"type":"object","properties":{"minChars":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"maxChars":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"breakPreference":{"anyOf":[{"type":"string","const":"paragraph"},{"type":"string","const":"newline"},{"type":"string","const":"sentence"}]}},"additionalProperties":false},"toolProgress":{"type":"boolean"},"commandText":{"type":"string","enum":["raw","status"]}},"additionalProperties":false},"progress":{"type":"object","properties":{"label":{"anyOf":[{"type":"string"},{"type":"boolean","const":false}]},"labels":{"type":"array","items":{"type":"string"}},"maxLines":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"render":{"type":"string","enum":["text","rich"]},"toolProgress":{"type":"boolean"},"commandText":{"type":"string","enum":["raw","status"]}},"additionalProperties":false},"block":{"type":"object","properties":{"enabled":{"type":"boolean"},"coalesce":{"type":"object","properties":{"minChars":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"maxChars":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"idleMs":{"type":"integer","minimum":0,"maximum":9007199254740991}},"additionalProperties":false}},"additionalProperties":false},"nativeTransport":{"type":"boolean"}},"additionalProperties":false},"mediaMaxMb":{"type":"number","exclusiveMinimum":0},"reactionNotifications":{"type":"string","enum":["off","own","all","allowlist"]},"reactionAllowlist":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"replyToMode":{"anyOf":[{"type":"string","const":"off"},{"type":"string","const":"first"},{"type":"string","const":"all"},{"type":"string","const":"batched"}]},"replyToModeByChatType":{"type":"object","properties":{"direct":{"anyOf":[{"type":"string","const":"off"},{"type":"string","const":"first"},{"type":"string","const":"all"},{"type":"string","const":"batched"}]},"group":{"anyOf":[{"type":"string","const":"off"},{"type":"string","const":"first"},{"type":"string","const":"all"},{"type":"string","const":"batched"}]},"channel":{"anyOf":[{"type":"string","const":"off"},{"type":"string","const":"first"},{"type":"string","const":"all"},{"type":"string","const":"batched"}]}},"additionalProperties":false},"thread":{"type":"object","properties":{"historyScope":{"type":"string","enum":["thread","channel"]},"inheritParent":{"type":"boolean"},"initialHistoryLimit":{"type":"integer","minimum":0,"maximum":9007199254740991},"requireExplicitMention":{"type":"boolean"}},"additionalProperties":false},"actions":{"type":"object","properties":{"reactions":{"type":"boolean"},"messages":{"type":"boolean"},"pins":{"type":"boolean"},"search":{"type":"boolean"},"permissions":{"type":"boolean"},"memberInfo":{"type":"boolean"},"channelInfo":{"type":"boolean"},"emojiList":{"type":"boolean"}},"additionalProperties":false},"slashCommand":{"type":"object","properties":{"enabled":{"type":"boolean"},"name":{"type":"string"},"sessionPrefix":{"type":"string"},"ephemeral":{"type":"boolean"}},"additionalProperties":false},"dmPolicy":{"type":"string","enum":["pairing","allowlist","open","disabled"]},"allowFrom":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"defaultTo":{"type":"string"},"dm":{"type":"object","properties":{"enabled":{"type":"boolean"},"policy":{"type":"string","enum":["pairing","allowlist","open","disabled"]},"allowFrom":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"groupEnabled":{"type":"boolean"},"groupChannels":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"replyToMode":{"anyOf":[{"type":"string","const":"off"},{"type":"string","const":"first"},{"type":"string","const":"all"},{"type":"string","const":"batched"}]}},"additionalProperties":false},"channels":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"enabled":{"type":"boolean"},"requireMention":{"type":"boolean"},"tools":{"type":"object","properties":{"allow":{"type":"array","items":{"type":"string"}},"alsoAllow":{"type":"array","items":{"type":"string"}},"deny":{"type":"array","items":{"type":"string"}}},"additionalProperties":false},"toolsBySender":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"allow":{"type":"array","items":{"type":"string"}},"alsoAllow":{"type":"array","items":{"type":"string"}},"deny":{"type":"array","items":{"type":"string"}}},"additionalProperties":false}},"allowBots":{"type":"boolean"},"users":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"skills":{"type":"array","items":{"type":"string"}},"systemPrompt":{"type":"string"}},"additionalProperties":false}},"heartbeat":{"type":"object","properties":{"showOk":{"type":"boolean"},"showAlerts":{"type":"boolean"},"useIndicator":{"type":"boolean"}},"additionalProperties":false},"healthMonitor":{"type":"object","properties":{"enabled":{"type":"boolean"}},"additionalProperties":false},"responsePrefix":{"type":"string"},"ackReaction":{"type":"string"},"typingReaction":{"type":"string"}},"required":["userTokenReadOnly"],"additionalProperties":false}},"defaultAccount":{"type":"string"}},"required":["mode","webhookPath","userTokenReadOnly","groupPolicy"],"additionalProperties":false},"uiHints":{"":{"label":"Slack","help":"Slack channel provider configuration for bot/app tokens, streaming behavior, and DM policy controls. Keep token handling and thread behavior explicit to avoid noisy workspace interactions."},"dm.policy":{"label":"Slack DM Policy","help":"Direct message access control (\\"pairing\\" recommended). \\"open\\" requires channels.slack.allowFrom=[\\"*\\"] (legacy: channels.slack.dm.allowFrom)."},"dmPolicy":{"label":"Slack DM Policy","help":"Direct message access control (\\"pairing\\" recommended). \\"open\\" requires channels.slack.allowFrom=[\\"*\\"]."},"configWrites":{"label":"Slack Config Writes","help":"Allow Slack to write config in response to channel events/commands (default: true)."},"commands.native":{"label":"Slack Native Commands","help":"Override native commands for Slack (bool or \\"auto\\")."},"commands.nativeSkills":{"label":"Slack Native Skill Commands","help":"Override native skill commands for Slack (bool or \\"auto\\")."},"allowBots":{"label":"Slack Allow Bot Messages","help":"Allow bot-authored messages to trigger Slack replies (default: false)."},"socketMode":{"label":"Slack Socket Mode Transport","help":"Slack Socket Mode transport tuning passed to the Slack SDK. Use only when investigating ping/pong timeout or stale websocket behavior."},"socketMode.clientPingTimeout":{"label":"Slack Socket Mode Pong Timeout","help":"Milliseconds the Slack SDK waits for a pong after its client ping before treating the websocket as stale (OpenClaw default: 15000). Increase on hosts with event-loop starvation or slow network scheduling."},"socketMode.serverPingTimeout":{"label":"Slack Socket Mode Server Ping Timeout","help":"Milliseconds the Slack SDK waits for Slack server pings before treating the websocket as stale."},"socketMode.pingPongLoggingEnabled":{"label":"Slack Socket Mode Ping/Pong Logging","help":"Enable Slack SDK ping/pong transport logs while debugging Socket Mode websocket health."},"botToken":{"label":"Slack Bot Token","help":"Slack bot token used for standard chat actions in the configured workspace. Keep this credential scoped and rotate if workspace app permissions change."},"appToken":{"label":"Slack App Token","help":"Slack app-level token used for Socket Mode connections and event transport when enabled. Use least-privilege app scopes and store this token as a secret."},"userToken":{"label":"Slack User Token","help":"Optional Slack user token for workflows requiring user-context API access beyond bot permissions. Use sparingly and audit scopes because this token can carry broader authority."},"userTokenReadOnly":{"label":"Slack User Token Read Only","help":"When true, treat configured Slack user token usage as read-only helper behavior where possible. Keep enabled if you only need supplemental reads without user-context writes."},"capabilities.interactiveReplies":{"label":"Slack Interactive Replies","hel', + 'p":"Enable agent-authored Slack interactive reply directives (`[[slack_buttons: ...]]`, `[[slack_select: ...]]`). Default: false."},"execApprovals":{"label":"Slack Exec Approvals","help":"Slack-native exec approval routing and approver authorization. When unset, OpenClaw auto-enables DM-first native approvals if approvers can be resolved for this workspace account."},"execApprovals.enabled":{"label":"Slack Exec Approvals Enabled","help":"Controls Slack native exec approvals for this account: unset or \\"auto\\" enables DM-first native approvals when approvers can be resolved, true forces native approvals on, and false disables them."},"execApprovals.approvers":{"label":"Slack Exec Approval Approvers","help":"Slack user IDs allowed to approve exec requests for this workspace account. Use Slack user IDs or user targets such as `U123`, `user:U123`, or `<@U123>`. If you leave this unset, OpenClaw falls back to commands.ownerAllowFrom when possible."},"execApprovals.agentFilter":{"label":"Slack Exec Approval Agent Filter","help":"Optional allowlist of agent IDs eligible for Slack exec approvals, for example `[\\"main\\", \\"ops-agent\\"]`. Use this to keep approval prompts scoped to the agents you actually operate from Slack."},"execApprovals.sessionFilter":{"label":"Slack Exec Approval Session Filter","help":"Optional session-key filters matched as substring or regex-style patterns before Slack approval routing is used. Use narrow patterns so Slack approvals only appear for intended sessions."},"execApprovals.target":{"label":"Slack Exec Approval Target","help":"Controls where Slack approval prompts are sent: \\"dm\\" sends to approver DMs (default), \\"channel\\" sends to the originating Slack chat/thread, and \\"both\\" sends to both. Channel delivery exposes the command text to the chat, so only use it in trusted channels."},"streaming":{"label":"Slack Streaming Mode","help":"Unified Slack stream preview mode: \\"off\\" | \\"partial\\" | \\"block\\" | \\"progress\\". Legacy boolean/streamMode keys are auto-mapped."},"streaming.mode":{"label":"Slack Streaming Mode","help":"Canonical Slack preview mode: \\"off\\" | \\"partial\\" | \\"block\\" | \\"progress\\"."},"streaming.chunkMode":{"label":"Slack Chunk Mode","help":"Chunking mode for outbound Slack text delivery: \\"length\\" (default) or \\"newline\\"."},"streaming.block.enabled":{"label":"Slack Block Streaming Enabled","help":"Enable chunked block-style Slack preview delivery when channels.slack.streaming.mode=\\"block\\"."},"streaming.block.coalesce":{"label":"Slack Block Streaming Coalesce","help":"Merge streamed Slack block replies before final delivery."},"streaming.nativeTransport":{"label":"Slack Native Streaming","help":"Enable native Slack text streaming (chat.startStream/chat.appendStream/chat.stopStream) when channels.slack.streaming.mode is partial (default: true). Native streaming and Slack assistant thread status require a reply thread target; top-level DMs can still use draft post-and-edit preview streaming."},"streaming.preview.toolProgress":{"label":"Slack Draft Tool Progress","help":"Show tool/progress activity in the live draft preview message (default: true). Set false to hide interim tool updates while the draft preview stays active."},"streaming.preview.commandText":{"label":"Slack Draft Command Text","help":"Command/exec detail in preview tool-progress lines: \\"raw\\" preserves released behavior; \\"status\\" shows only the tool label."},"streaming.progress.label":{"label":"Slack Progress Label","help":"Initial progress draft title. Use \\"auto\\" for built-in single-word labels, a custom string, or false to hide the title."},"streaming.progress.labels":{"label":"Slack Progress Label Pool","help":"Candidate labels for streaming.progress.label=\\"auto\\". Leave unset to use OpenClaw built-in progress labels."},"streaming.progress.maxLines":{"label":"Slack Progress Max Lines","help":"Maximum number of compact progress lines to keep below the draft label (default: 8)."},"streaming.progress.render":{"label":"Slack Progress Renderer","help":"Progress draft renderer: \\"text\\" uses one portable text body; \\"rich\\" renders structured Slack Block Kit fields with the same text fallback."},"streaming.progress.toolProgress":{"label":"Slack Progress Tool Lines","help":"Show compact tool/progress lines in progress draft mode (default: true). Set false to keep only the label until final delivery."},"streaming.progress.commandText":{"label":"Slack Progress Command Text","help":"Command/exec detail in progress draft lines: \\"raw\\" preserves released behavior; \\"status\\" shows only the tool label."},"thread.historyScope":{"label":"Slack Thread History Scope","help":"Scope for Slack thread history context (\\"thread\\" isolates per thread; \\"channel\\" reuses channel history)."},"thread.inheritParent":{"label":"Slack Thread Parent Inheritance","help":"If true, Slack thread sessions inherit the parent channel transcript (default: false)."},"thread.initialHistoryLimit":{"label":"Slack Thread Initial History Limit","help":"Maximum number of existing Slack thread messages to fetch when starting a new thread session (default: 20, set to 0 to disable)."},"thread.requireExplicitMention":{"label":"Slack Thread Require Explicit Mention","help":"If true, require an explicit @mention even inside threads where the bot has participated. Suppresses implicit thread mention behavior so the bot only responds to explicit @bot mentions in threads (default: false)."}}},{"pluginId":"synology-chat","channelId":"synology-chat","label":"Synology Chat","description":"Connect your Synology NAS Chat to OpenClaw with full agent capabilities.","schema":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"dangerouslyAllowNameMatching":{"type":"boolean"},"dangerouslyAllowInheritedWebhookPath":{"type":"boolean"}},"additionalProperties":{}}},{"pluginId":"telegram","channelId":"telegram","label":"Telegram","description":"simplest way to get started — register a bot with @BotFather and get going.","schema":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"name":{"type":"string"},"capabilities":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"object","properties":{"inlineButtons":{"type":"string","enum":["off","dm","group","all","allowlist"]}},"additionalProperties":false}]},"execApprovals":{"type":"object","properties":{"enabled":{"type":"boolean"},"approvers":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"agentFilter":{"type":"array","items":{"type":"string"}},"sessionFilter":{"type":"array","items":{"type":"string"}},"target":{"type":"string","enum":["dm","channel","both"]}},"additionalProperties":false},"markdown":{"type":"object","properties":{"tables":{"type":"string","enum":["off","bullets","code","block"]}},"additionalProperties":false},"enabled":{"type":"boolean"},"commands":{"type":"object","properties":{"native":{"anyOf":[{"type":"boolean"},{"type":"string","const":"auto"}]},"nativeSkills":{"anyOf":[{"type":"boolean"},{"type":"string","const":"auto"}]}},"additionalProperties":false},"customCommands":{"type":"array","items":{"type":"object","properties":{"command":{"type":"string"},"description":{"type":"string"}},"required":["command","description"],"additionalProperties":false}},"configWrites":{"type":"boolean"},"dmPolicy":{"default":"pairing","type":"string","enum":["pairing","allowlist","open","disabled"]},"botToken":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false}]}]},"tokenFile":{"type":"string"},"replyToMode":{"anyOf":[{"type":"string","const":"off"},{"type":"string","const":"first"},{"type":"string","const":"all"},{"type":"string","const":"batched"}]},"dm":{"type":"object","properties":{"threadReplies":{"type":"string","enum":["off","inbound","always"]}},"additionalProperties":false},"groups":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"requireMention":{"type":"boolean"},"ingest":{"type":"boolean"},"disableAudioPreflight":{"type":"boolean"},"groupPolicy":{"type":"string","enum":["open","disabled","allowlist"]},"tools":{"type":"object","properties":{"allow":{"type":"array","items":{"type":"string"}},"alsoAllow":{"type":"array","items":{"type":"string"}},"deny":{"type":"array","items":{"type":"string"}}},"additionalProperties":false},"toolsBySender":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"allow":{"type":"array","items":{"type":"string"}},"alsoAllow":{"type":"array","items":{"type":"string"}},"deny":{"type":"array","items":{"type":"string"}}},"additionalProperties":false}},"skills":{"type":"array","items":{"type":"string"}},"enabled":{"type":"boolean"},"allowFrom":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"systemPrompt":{"type":"string"},"topics":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"requireMention":{"type":"boolean"},"ingest":{"type":"boolean"},"disableAudioPreflight":{"type":"boolean"},"groupPolicy":{"type":"string","enum":["open","disabled","allowlist"]},"skills":{"type":"array","items":{"type":"string"}},"enabled":{"type":"boolean"},"allowFrom":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"systemPrompt":{"type":"string"},"agentId":{"type":"string"},"errorPolicy":{"type":"string","enum":["always","once","silent"]},"errorCooldownMs":{"type":"integer","minimum":0,"maximum":9007199254740991}},"additionalProperties":false}},"errorPolicy":{"type":"string","enum":["always","once","silent"]},"errorCooldownMs":{"type":"integer","minimum":0,"maximum":9007199254740991}},"additionalProperties":false}},"allowFrom":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"defaultTo":{"anyOf":[{"type":"string"},{"type":"number"}]},"groupAllowFrom":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"groupPolicy":{"default":"allowlist","type":"string","enum":["open","disabled","allowlist"]},"contextVisibility":{"type":"string","enum":["all","allowlist","allowlist_quote"]},"historyLimit":{"type":"integer","minimum":0,"maximum":9007199254740991},"dmHistoryLimit":{"type":"integer","minimum":0,"maximum":9007199254740991},"dms":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"historyLimit":{"type":"integer","minimum":0,"maximum":9007199254740991}},"additionalProperties":false}},"direct":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"dmPolicy":{"type":"string","enum":["pairing","allowlist","open","disabled"]},"threadReplies":{"type":"string","enum":["off","inbound","always"]},"tools":{"type":"object","properties":{"allow":{"type":"array","items":{"type":"string"}},"alsoAllow":{"type":"array","items":{"type":"string"}},"deny":{"type":"array","items":{"type":"string"}}},"additionalProperties":false},"toolsBySender":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"allow":{"type":"array","items":{"type":"string"}},"alsoAllow":{"type":"array","items":{"type":"string"}},"deny":{"type":"array","items":{"type":"string"}}},"additionalProperties":false}},"skills":{"type":"array","items":{"type":"string"}},"enabled":{"type":"boolean"},"allowFrom":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"systemPrompt":{"type":"string"},"topics":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"requireMention":{"type":"boolean"},"ingest":{"type":"boolean"},"disableAudioPreflight":{"type":"boolean"},"groupPolicy":{"type":"string","enum":["open","disabled","allowlist"]},"skills":{"type":"array","items":{"type":"string"}},"enabled":{"type":"boolean"},"allowFrom":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"systemPrompt":{"type":"string"},"agentId":{"type":"string"},"errorPolicy":{"type":"string","enum":["always","once","silent"]},"errorCooldownMs":{"type":"integer","minimum":0,"maximum":9007199254740991}},"additionalProperties":false}},"errorPolicy":{"type":"string","enum":["always","once","silent"]},"errorCooldownMs":{"type":"integer","minimum":0,"maximum":9007199254740991},"requireTopic":{"type":"boolean"},"autoTopicLabel":{"anyOf":[{"type":"boolean"},{"type":"object","properties":{"enabled":{"type":"boolean"},"prompt":{"type":"string"}},"additionalProperties":false}]}},"additionalProperties":false}},"textChunkLimit":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"streaming":{"type":"object","properties":{"mode":{"type":"string","enum":["off","partial","block","progress"]},"chunkMode":{"type":"string","enum":["length","newline"]},"preview":{"type":"object","properties":{"chunk":{"type":"object","properties":{"minChars":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"maxChars":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"breakPreference":{"anyOf":[{"type":"string","const":"paragraph"},{"type":"string","const":"newline"},{"type":"string","const":"sentence"}]}},"additionalProperties":false},"toolProgress":{"type":"boolean"},"commandText":{"type":"string","enum":["raw","status"]}},"additionalProperties":false},"progress":{"type":"object","properties":{"label":{"anyOf":[{"type":"string"},{"type":"boolean","const":false}]},"labels":{"type":"array","items":{"type":"string"}},"maxLines":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"render":{"type":"string","enum":["text","rich"]},"toolProgress":{"type":"boolean"},"commandText":{"type":"string","enum":["raw","status"]}},"additionalProperties":false},"block":{"type":"object","properties":{"enabled":{"type":"boolean"},"coalesce":{"type":"object","properties":{"minChars":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"maxChars":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"idleMs":{"type":"integer","minimum":0,"maximum":9007199254740991}},"additionalProperties":false}},"additionalProperties":false}},"additionalProperties":false},"mediaMaxMb":{"type":"number","exclusiveMinimum":0},"timeoutSeconds":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"mediaGroupFlushMs":{"description":"Buffer window in milliseconds for Telegram media groups/albums before dispatching them as one inbound message. Default: 500.","type":"integer","minimum":10,"maximum":60000},"pollingStallThresholdMs":{"type":"integer","minimum":30000,"maximum":600000},"retry":{"type":"object","properties":{"attempts":{"type":"integer","minimum":1,"maximum":9007199254740991},"minDelayMs":{"type":"integer","minimum":0,"maximum":9007199254740991},"maxDelayMs":{"type":"integer","minimum":0,"maximum":9007199254740991},"jitter":{"type":"number","minimum":0,"maximum":1}},"additionalProperties":false},"network":{"type":"object","properties":{"autoSelectFamily":{"type":"boolean"},"dnsResultOrder":{"type":"string","enum":["ipv4first","verbatim"]},"dangerouslyAllowPrivateNetwork":{"description":"Dangerous opt-in for trusted Telegram fake-IP or transparent-proxy environments where api.telegram.org resolves to private/internal/special-use addresses during media downloads.","type":"boolean"}},"additionalProperties":false},"proxy":{"type":"string"},"webhookUrl":{"description":"Public HTTPS webhook URL registered with Telegram for inbound updates. This must be internet-reachable and requires channels.telegram.webhookSecret.","type":"string"},"webhookSecret":{"description":"Secret token sent to Telegram during webhook registratio', + 'n and verified on inbound webhook requests. Telegram returns this value for verification; this is not the gateway auth token and not the bot token.","anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false}]}]},"webhookPath":{"description":"Local webhook route path served by the gateway listener. Defaults to /telegram-webhook.","type":"string"},"webhookHost":{"description":"Local bind host for the webhook listener. Defaults to 127.0.0.1; keep loopback unless you intentionally expose direct ingress.","type":"string"},"webhookPort":{"description":"Local bind port for the webhook listener. Defaults to 8787; set to 0 to let the OS assign an ephemeral port.","type":"integer","minimum":0,"maximum":9007199254740991},"webhookCertPath":{"description":"Path to the self-signed certificate (PEM) to upload to Telegram during webhook registration. Required for self-signed certs (direct IP or no domain).","type":"string"},"actions":{"type":"object","properties":{"reactions":{"type":"boolean"},"sendMessage":{"type":"boolean"},"poll":{"type":"boolean"},"deleteMessage":{"type":"boolean"},"editMessage":{"type":"boolean"},"sticker":{"type":"boolean"},"createForumTopic":{"type":"boolean"},"editForumTopic":{"type":"boolean"}},"additionalProperties":false},"threadBindings":{"type":"object","properties":{"enabled":{"type":"boolean"},"idleHours":{"type":"number","minimum":0},"maxAgeHours":{"type":"number","minimum":0},"spawnSessions":{"type":"boolean"},"defaultSpawnContext":{"type":"string","enum":["isolated","fork"]},"spawnSubagentSessions":{"type":"boolean"},"spawnAcpSessions":{"type":"boolean"}},"additionalProperties":false},"reactionNotifications":{"type":"string","enum":["off","own","all"]},"reactionLevel":{"type":"string","enum":["off","ack","minimal","extensive"]},"heartbeat":{"type":"object","properties":{"showOk":{"type":"boolean"},"showAlerts":{"type":"boolean"},"useIndicator":{"type":"boolean"}},"additionalProperties":false},"healthMonitor":{"type":"object","properties":{"enabled":{"type":"boolean"}},"additionalProperties":false},"linkPreview":{"type":"boolean"},"silentErrorReplies":{"type":"boolean"},"responsePrefix":{"type":"string"},"ackReaction":{"type":"string"},"errorPolicy":{"type":"string","enum":["always","once","silent"]},"errorCooldownMs":{"type":"integer","minimum":0,"maximum":9007199254740991},"apiRoot":{"type":"string","format":"uri"},"trustedLocalFileRoots":{"description":"Trusted local filesystem roots for self-hosted Telegram Bot API absolute file_path values. Only absolute paths under these roots are read directly; all other absolute paths are rejected.","type":"array","items":{"type":"string"}},"autoTopicLabel":{"anyOf":[{"type":"boolean"},{"type":"object","properties":{"enabled":{"type":"boolean"},"prompt":{"type":"string"}},"additionalProperties":false}]},"accounts":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"name":{"type":"string"},"capabilities":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"object","properties":{"inlineButtons":{"type":"string","enum":["off","dm","group","all","allowlist"]}},"additionalProperties":false}]},"execApprovals":{"type":"object","properties":{"enabled":{"type":"boolean"},"approvers":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"agentFilter":{"type":"array","items":{"type":"string"}},"sessionFilter":{"type":"array","items":{"type":"string"}},"target":{"type":"string","enum":["dm","channel","both"]}},"additionalProperties":false},"markdown":{"type":"object","properties":{"tables":{"type":"string","enum":["off","bullets","code","block"]}},"additionalProperties":false},"enabled":{"type":"boolean"},"commands":{"type":"object","properties":{"native":{"anyOf":[{"type":"boolean"},{"type":"string","const":"auto"}]},"nativeSkills":{"anyOf":[{"type":"boolean"},{"type":"string","const":"auto"}]}},"additionalProperties":false},"customCommands":{"type":"array","items":{"type":"object","properties":{"command":{"type":"string"},"description":{"type":"string"}},"required":["command","description"],"additionalProperties":false}},"configWrites":{"type":"boolean"},"dmPolicy":{"default":"pairing","type":"string","enum":["pairing","allowlist","open","disabled"]},"botToken":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false}]}]},"tokenFile":{"type":"string"},"replyToMode":{"anyOf":[{"type":"string","const":"off"},{"type":"string","const":"first"},{"type":"string","const":"all"},{"type":"string","const":"batched"}]},"dm":{"type":"object","properties":{"threadReplies":{"type":"string","enum":["off","inbound","always"]}},"additionalProperties":false},"groups":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"requireMention":{"type":"boolean"},"ingest":{"type":"boolean"},"disableAudioPreflight":{"type":"boolean"},"groupPolicy":{"type":"string","enum":["open","disabled","allowlist"]},"tools":{"type":"object","properties":{"allow":{"type":"array","items":{"type":"string"}},"alsoAllow":{"type":"array","items":{"type":"string"}},"deny":{"type":"array","items":{"type":"string"}}},"additionalProperties":false},"toolsBySender":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"allow":{"type":"array","items":{"type":"string"}},"alsoAllow":{"type":"array","items":{"type":"string"}},"deny":{"type":"array","items":{"type":"string"}}},"additionalProperties":false}},"skills":{"type":"array","items":{"type":"string"}},"enabled":{"type":"boolean"},"allowFrom":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"systemPrompt":{"type":"string"},"topics":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"requireMention":{"type":"boolean"},"ingest":{"type":"boolean"},"disableAudioPreflight":{"type":"boolean"},"groupPolicy":{"type":"string","enum":["open","disabled","allowlist"]},"skills":{"type":"array","items":{"type":"string"}},"enabled":{"type":"boolean"},"allowFrom":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"systemPrompt":{"type":"string"},"agentId":{"type":"string"},"errorPolicy":{"type":"string","enum":["always","once","silent"]},"errorCooldownMs":{"type":"integer","minimum":0,"maximum":9007199254740991}},"additionalProperties":false}},"errorPolicy":{"type":"string","enum":["always","once","silent"]},"errorCooldownMs":{"type":"integer","minimum":0,"maximum":9007199254740991}},"additionalProperties":false}},"allowFrom":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"defaultTo":{"anyOf":[{"type":"string"},{"type":"number"}]},"groupAllowFrom":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"groupPolicy":{"default":"allowlist","type":"string","enum":["open","disabled","allowlist"]},"contextVisibility":{"type":"string","enum":["all","allowlist","allowlist_quote"]},"historyLimit":{"type":"integer","minimum":0,"maximum":9007199254740991},"dmHistoryLimit":{"type":"integer","minimum":0,"maximum":9007199254740991},"dms":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"historyLimit":{"type":"integer","minimum":0,"maximum":9007199254740991}},"additionalProperties":false}},"direct":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"dmPolicy":{"type":"string","enum":["pairing","allowlist","open","disabled"]},"threadReplies":{"type":"string","enum":["off","inbound","always"]},"tools":{"type":"object","properties":{"allow":{"type":"array","items":{"type":"string"}},"alsoAllow":{"type":"array","items":{"type":"string"}},"deny":{"type":"array","items":{"type":"string"}}},"additionalProperties":false},"toolsBySender":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"allow":{"type":"array","items":{"type":"string"}},"alsoAllow":{"type":"array","items":{"type":"string"}},"deny":{"type":"array","items":{"type":"string"}}},"additionalProperties":false}},"skills":{"type":"array","items":{"type":"string"}},"enabled":{"type":"boolean"},"allowFrom":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"systemPrompt":{"type":"string"},"topics":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"requireMention":{"type":"boolean"},"ingest":{"type":"boolean"},"disableAudioPreflight":{"type":"boolean"},"groupPolicy":{"type":"string","enum":["open","disabled","allowlist"]},"skills":{"type":"array","items":{"type":"string"}},"enabled":{"type":"boolean"},"allowFrom":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"systemPrompt":{"type":"string"},"agentId":{"type":"string"},"errorPolicy":{"type":"string","enum":["always","once","silent"]},"errorCooldownMs":{"type":"integer","minimum":0,"maximum":9007199254740991}},"additionalProperties":false}},"errorPolicy":{"type":"string","enum":["always","once","silent"]},"errorCooldownMs":{"type":"integer","minimum":0,"maximum":9007199254740991},"requireTopic":{"type":"boolean"},"autoTopicLabel":{"anyOf":[{"type":"boolean"},{"type":"object","properties":{"enabled":{"type":"boolean"},"prompt":{"type":"string"}},"additionalProperties":false}]}},"additionalProperties":false}},"textChunkLimit":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"streaming":{"type":"object","properties":{"mode":{"type":"string","enum":["off","partial","block","progress"]},"chunkMode":{"type":"string","enum":["length","newline"]},"preview":{"type":"object","properties":{"chunk":{"type":"object","properties":{"minChars":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"maxChars":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"breakPreference":{"anyOf":[{"type":"string","const":"paragraph"},{"type":"string","const":"newline"},{"type":"string","const":"sentence"}]}},"additionalProperties":false},"toolProgress":{"type":"boolean"},"commandText":{"type":"string","enum":["raw","status"]}},"additionalProperties":false},"progress":{"type":"object","properties":{"label":{"anyOf":[{"type":"string"},{"type":"boolean","const":false}]},"labels":{"type":"array","items":{"type":"string"}},"maxLines":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"render":{"type":"string","enum":["text","rich"]},"toolProgress":{"type":"boolean"},"commandText":{"type":"string","enum":["raw","status"]}},"additionalProperties":false},"block":{"type":"object","properties":{"enabled":{"type":"boolean"},"coalesce":{"type":"object","properties":{"minChars":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"maxChars":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"idleMs":{"type":"integer","minimum":0,"maximum":9007199254740991}},"additionalProperties":false}},"additionalProperties":false}},"additionalProperties":false},"mediaMaxMb":{"type":"number","exclusiveMinimum":0},"timeoutSeconds":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"mediaGroupFlushMs":{"description":"Buffer window in milliseconds for Telegram media groups/albums before dispatching them as one inbound message. Default: 500.","type":"integer","minimum":10,"maximum":60000},"pollingStallThresholdMs":{"type":"integer","minimum":30000,"maximum":600000},"retry":{"type":"object","properties":{"attempts":{"type":"integer","minimum":1,"maximum":9007199254740991},"minDelayMs":{"type":"integer","minimum":0,"maximum":9007199254740991},"maxDelayMs":{"type":"integer","minimum":0,"maximum":9007199254740991},"jitter":{"type":"number","minimum":0,"maximum":1}},"additionalProperties":false},"network":{"type":"object","properties":{"autoSelectFamily":{"type":"boolean"},"dnsResultOrder":{"type":"string","enum":["ipv4first","verbatim"]},"dangerouslyAllowPrivateNetwork":{"description":"Dangerous opt-in for trusted Telegram fake-IP or transparent-proxy environments where api.telegram.org resolves to private/internal/special-use addresses during media downloads.","type":"boolean"}},"additionalProperties":false},"proxy":{"type":"string"},"webhookUrl":{"description":"Public HTTPS webhook URL registered with Telegram for inbound updates. This must be internet-reachable and requires channels.telegram.webhookSecret.","type":"string"},"webhookSecret":{"description":"Secret token sent to Telegram during webhook registration and verified on inbound webhook requests. Telegram returns this value for verification; this is not the gateway auth token and not the bot token.","anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false}]}]},"webhookPath":{"description":"Local webhook route path served by the gateway listener. Defaults to /telegram-webhook.","type":"string"},"webhookHost":{"description":"Local bind host for the webhook listener. Defaults to 127.0.0.1; keep loopback unless you intentionally expose direct ingress.","type":"string"},"webhookPort":{"description":"Local bind port for the webhook listener. Defaults to 8787; set to 0 to let the OS assign an ephemeral port.","type":"integer","minimum":0,"maximum":9007199254740991},"webhookCertPath":{"description":"Path to the self-signed certificate (PEM) to upload to Telegram during webhook registration. Required for self-signed certs (direct IP or no domain).","type":"string"},"actions":{"type":"object","properties":{"reactions":{"type":"boolean"},"sendMessage":{"type":"boolean"},"poll":{"type":"boolean"},"deleteMessage":{"type":"boolean"},"editMessage":{"type":"boolean"},"sticker":{"type":"boolean"},"createForumTopic":{"type":"boolean"},"editForumTopic":{"type":"boolean"}},"additionalProperties":false},"threadBindings":{"type":"object","properties":{"enabled":{"type":"boolean"},"idleHours":{"type":"number","minimum":0},"maxAgeHours":{"type":"number","minimum":0},"spawnSessions":{"type":"boolean"},"defaultSpawnContext":{"type":"string","enum":["isolated","fork"]},"spawnSubagentSessions":{"type":"boolean"},"spawnAcpSessions":{"type":"boolean"}},"additionalProperties":false},"reactionNotifications":{"type":"string","enum":["off","own","all"]},"reactionLevel":{"type":"string","enum":["off","ack","minimal","extensive"', + ']},"heartbeat":{"type":"object","properties":{"showOk":{"type":"boolean"},"showAlerts":{"type":"boolean"},"useIndicator":{"type":"boolean"}},"additionalProperties":false},"healthMonitor":{"type":"object","properties":{"enabled":{"type":"boolean"}},"additionalProperties":false},"linkPreview":{"type":"boolean"},"silentErrorReplies":{"type":"boolean"},"responsePrefix":{"type":"string"},"ackReaction":{"type":"string"},"errorPolicy":{"type":"string","enum":["always","once","silent"]},"errorCooldownMs":{"type":"integer","minimum":0,"maximum":9007199254740991},"apiRoot":{"type":"string","format":"uri"},"trustedLocalFileRoots":{"description":"Trusted local filesystem roots for self-hosted Telegram Bot API absolute file_path values. Only absolute paths under these roots are read directly; all other absolute paths are rejected.","type":"array","items":{"type":"string"}},"autoTopicLabel":{"anyOf":[{"type":"boolean"},{"type":"object","properties":{"enabled":{"type":"boolean"},"prompt":{"type":"string"}},"additionalProperties":false}]}},"required":["dmPolicy","groupPolicy"],"additionalProperties":false}},"defaultAccount":{"type":"string"}},"required":["dmPolicy","groupPolicy"],"additionalProperties":false},"uiHints":{"":{"label":"Telegram","help":"Telegram channel provider configuration including auth tokens, retry behavior, and message rendering controls. Use this section to tune bot behavior for Telegram-specific API semantics."},"customCommands":{"label":"Telegram Custom Commands","help":"Additional Telegram bot menu commands (merged with native; conflicts ignored)."},"botToken":{"label":"Telegram Bot Token","help":"Telegram bot token used to authenticate Bot API requests for this account/provider config. Use secret/env substitution and rotate tokens if exposure is suspected."},"dmPolicy":{"label":"Telegram DM Policy","help":"Direct message access control (\\"pairing\\" recommended). \\"open\\" requires channels.telegram.allowFrom=[\\"*\\"]."},"dm.threadReplies":{"label":"Telegram DM Thread Replies","help":"Controls whether Telegram DMs with message_thread_id use flat sessions (\\"off\\", default) or thread-scoped sessions (\\"inbound\\" or \\"always\\"). Thread IDs are still preserved for replies when sessions stay flat."},"direct.*.threadReplies":{"label":"Telegram Per-DM Thread Replies","help":"Per-DM override for message_thread_id session threading. Use \\"inbound\\" only when a specific direct chat intentionally uses Telegram DM topics as separate sessions."},"configWrites":{"label":"Telegram Config Writes","help":"Allow Telegram to write config in response to channel events/commands (default: true)."},"commands.native":{"label":"Telegram Native Commands","help":"Override native commands for Telegram (bool or \\"auto\\")."},"commands.nativeSkills":{"label":"Telegram Native Skill Commands","help":"Override native skill commands for Telegram (bool or \\"auto\\")."},"streaming":{"label":"Telegram Streaming Mode","help":"Unified Telegram stream preview mode: \\"off\\" | \\"partial\\" | \\"block\\" | \\"progress\\" (default: \\"partial\\"). \\"progress\\" keeps a single editable progress draft until final delivery. Legacy boolean/streamMode keys are detected; run doctor --fix to migrate."},"streaming.mode":{"label":"Telegram Streaming Mode","help":"Canonical Telegram preview mode: \\"off\\" | \\"partial\\" | \\"block\\" | \\"progress\\" (default: \\"partial\\")."},"streaming.chunkMode":{"label":"Telegram Chunk Mode","help":"Chunking mode for outbound Telegram text delivery: \\"length\\" (default) or \\"newline\\"."},"streaming.block.enabled":{"label":"Telegram Block Streaming Enabled","help":"Enable chunked block-style Telegram preview delivery when channels.telegram.streaming.mode=\\"block\\"."},"streaming.block.coalesce":{"label":"Telegram Block Streaming Coalesce","help":"Merge streamed Telegram block replies before sending final delivery."},"streaming.preview.chunk.minChars":{"label":"Telegram Draft Chunk Min Chars","help":"Minimum chars before emitting a Telegram block preview chunk when channels.telegram.streaming.mode=\\"block\\"."},"streaming.preview.chunk.maxChars":{"label":"Telegram Draft Chunk Max Chars","help":"Target max size for a Telegram block preview chunk when channels.telegram.streaming.mode=\\"block\\"."},"streaming.preview.chunk.breakPreference":{"label":"Telegram Draft Chunk Break Preference","help":"Preferred breakpoints for Telegram draft chunks (paragraph | newline | sentence)."},"streaming.preview.toolProgress":{"label":"Telegram Draft Tool Progress","help":"Show tool/progress activity in the live draft preview message (default: true when preview streaming is active). Set false to keep tool updates out of the edited Telegram preview."},"streaming.preview.commandText":{"label":"Telegram Draft Command Text","help":"Command/exec detail in preview tool-progress lines: \\"raw\\" preserves released behavior; \\"status\\" shows only the tool label."},"streaming.progress.label":{"label":"Telegram Progress Label","help":"Initial progress draft title. Use \\"auto\\" for built-in single-word labels, a custom string, or false to hide the title."},"streaming.progress.labels":{"label":"Telegram Progress Label Pool","help":"Candidate labels for streaming.progress.label=\\"auto\\". Leave unset to use OpenClaw built-in progress labels."},"streaming.progress.maxLines":{"label":"Telegram Progress Max Lines","help":"Maximum number of compact progress lines to keep below the draft label (default: 8)."},"streaming.progress.toolProgress":{"label":"Telegram Progress Tool Lines","help":"Show compact tool/progress lines in progress draft mode (default: true). Set false to keep only the label until final delivery."},"streaming.progress.commandText":{"label":"Telegram Progress Command Text","help":"Command/exec detail in progress draft lines: \\"raw\\" preserves released behavior; \\"status\\" shows only the tool label."},"retry.attempts":{"label":"Telegram Retry Attempts","help":"Max retry attempts for outbound Telegram API calls (default: 3)."},"retry.minDelayMs":{"label":"Telegram Retry Min Delay (ms)","help":"Minimum retry delay in ms for Telegram outbound calls."},"retry.maxDelayMs":{"label":"Telegram Retry Max Delay (ms)","help":"Maximum retry delay cap in ms for Telegram outbound calls."},"retry.jitter":{"label":"Telegram Retry Jitter","help":"Jitter factor (0-1) applied to Telegram retry delays."},"network.autoSelectFamily":{"label":"Telegram autoSelectFamily","help":"Override Node autoSelectFamily for Telegram (true=enable, false=disable)."},"network.dangerouslyAllowPrivateNetwork":{"label":"Telegram Dangerously Allow Private Network","help":"Dangerous opt-in for trusted fake-IP or transparent-proxy environments where Telegram media downloads resolve api.telegram.org to private/internal/special-use addresses."},"timeoutSeconds":{"label":"Telegram API Timeout (seconds)","help":"Max seconds before Telegram API requests are aborted (default: 500 per grammY)."},"mediaGroupFlushMs":{"label":"Telegram Media Group Flush (ms)","help":"Milliseconds to buffer Telegram albums/media groups before dispatching them as one inbound message. Default: 500."},"pollingStallThresholdMs":{"label":"Telegram Polling Stall Threshold (ms)","help":"Milliseconds without completed Telegram getUpdates liveness before the polling watchdog restarts the polling runner. Default: 120000."},"silentErrorReplies":{"label":"Telegram Silent Error Replies","help":"When true, Telegram bot replies marked as errors are sent silently (no notification sound). Default: false."},"apiRoot":{"label":"Telegram API Root URL","help":"Custom Telegram Bot API root URL. Use the API root only (for example https://api.telegram.org), not a full /bot endpoint. Use for self-hosted Bot API servers (https://github.com/tdlib/telegram-bot-api) or reverse proxies in regions where api.telegram.org is blocked."},"trustedLocalFileRoots":{"label":"Telegram Trusted Local File Roots","help":"Trusted local filesystem roots for self-hosted Telegram Bot API absolute file_path values. Only absolute paths inside these roots are read directly; all other absolute paths are rejected."},"autoTopicLabel":{"label":"Telegram Auto Topic Label","help":"Auto-rename DM forum topics on first message using LLM. Default: true. Set to false to disable, or use object form { enabled: true, prompt: \'...\' } for custom prompt."},"autoTopicLabel.enabled":{"label":"Telegram Auto Topic Label Enabled","help":"Whether auto topic labeling is enabled. Default: true."},"autoTopicLabel.prompt":{"label":"Telegram Auto Topic Label Prompt","help":"Custom prompt for LLM-based topic naming. The user message is appended after the prompt."},"capabilities.inlineButtons":{"label":"Telegram Inline Buttons","help":"Enable Telegram inline button components for supported command and interaction surfaces. Disable if your deployment needs plain-text-only compatibility behavior."},"execApprovals":{"label":"Telegram Exec Approvals","help":"Telegram-native exec approval routing and approver authorization. When unset, OpenClaw auto-enables DM-first native approvals if approvers can be resolved for the selected bot account."},"execApprovals.enabled":{"label":"Telegram Exec Approvals Enabled","help":"Controls Telegram native exec approvals for this account: unset or \\"auto\\" enables DM-first native approvals when approvers can be resolved, true forces native approvals on, and false disables them."},"execApprovals.approvers":{"label":"Telegram Exec Approval Approvers","help":"Telegram user IDs allowed to approve exec requests for this bot account. Use numeric Telegram user IDs. If you leave this unset, OpenClaw falls back to numeric owner IDs inferred from commands.ownerAllowFrom when possible."},"execApprovals.agentFilter":{"label":"Telegram Exec Approval Agent Filter","help":"Optional allowlist of agent IDs eligible for Telegram exec approvals, for example `[\\"main\\", \\"ops-agent\\"]`. Use this to keep approval prompts scoped to the agents you actually operate from Telegram."},"execApprovals.sessionFilter":{"label":"Telegram Exec Approval Session Filter","help":"Optional session-key filters matched as substring or regex-style patterns before Telegram approval routing is used. Use narrow patterns so Telegram approvals only appear for intended sessions."},"execApprovals.target":{"label":"Telegram Exec Approval Target","help":"Controls where Telegram approval prompts are sent: \\"dm\\" sends to approver DMs (default), \\"channel\\" sends to the originating Telegram chat/topic, and \\"both\\" sends to both. Channel delivery exposes the command text to the chat, so only use it in trusted groups/topics."},"threadBindings.enabled":{"label":"Telegram Thread Binding Enabled","help":"Enable Telegram conversation binding features (/focus, /unfocus, /agents, and /session idle|max-age). Overrides session.threadBindings.enabled when set."},"threadBindings.idleHours":{"label":"Telegram Thread Binding Idle Timeout (hours)","help":"Inactivity window in hours for Telegram bound sessions. Set 0 to disable idle auto-unfocus (default: 24). Overrides session.threadBindings.idleHours when set."},"threadBindings.maxAgeHours":{"label":"Telegram Thread Binding Max Age (hours)","help":"Optional hard max age in hours for Telegram bound sessions. Set 0 to disable hard cap (default: 0). Overrides session.threadBindings.maxAgeHours when set."},"threadBindings.spawnSessions":{"label":"Telegram Thread-Bound Session Spawn","help":"Allow sessions_spawn(thread=true) and ACP thread spawns to auto-bind Telegram current conversations when supported."},"threadBindings.defaultSpawnContext":{"label":"Telegram Thread Spawn Context","help":"Default native subagent context for thread-bound spawns. \\"fork\\" starts from the requester transcript; \\"isolated\\" starts clean. Default: \\"fork\\"."}}},{"pluginId":"tlon","channelId":"tlon","label":"Tlon","description":"decentralized messaging on Urbit; install the plugin to enable.","schema":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"name":{"type":"string"},"enabled":{"type":"boolean"},"ship":{"type":"string","minLength":1},"url":{"type":"string"},"code":{"type":"string"},"network":{"type":"object","properties":{"dangerouslyAllowPrivateNetwork":{"type":"boolean"}},"additionalProperties":false},"groupChannels":{"type":"array","items":{"type":"string","minLength":1}},"dmAllowlist":{"type":"array","items":{"type":"string","minLength":1}},"groupInviteAllowlist":{"type":"array","items":{"type":"string","minLength":1}},"autoDiscoverChannels":{"type":"boolean"},"showModelSignature":{"type":"boolean"},"responsePrefix":{"type":"string"},"autoAcceptDmInvites":{"type":"boolean"},"autoAcceptGroupInvites":{"type":"boolean"},"ownerShip":{"type":"string","minLength":1},"authorization":{"type":"object","properties":{"channelRules":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"mode":{"type":"string","enum":["restricted","open"]},"allowedShips":{"type":"array","items":{"type":"string","minLength":1}}},"additionalProperties":false}}},"additionalProperties":false},"defaultAuthorizedShips":{"type":"array","items":{"type":"string","minLength":1}},"accounts":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"name":{"type":"string"},"enabled":{"type":"boolean"},"ship":{"type":"string","minLength":1},"url":{"type":"string"},"code":{"type":"string"},"network":{"type":"object","properties":{"dangerouslyAllowPrivateNetwork":{"type":"boolean"}},"additionalProperties":false},"groupChannels":{"type":"array","items":{"type":"string","minLength":1}},"dmAllowlist":{"type":"array","items":{"type":"string","minLength":1}},"groupInviteAllowlist":{"type":"array","items":{"type":"string","minLength":1}},"autoDiscoverChannels":{"type":"boolean"},"showModelSignature":{"type":"boolean"},"responsePrefix":{"type":"string"},"autoAcceptDmInvites":{"type":"boolean"},"autoAcceptGroupInvites":{"type":"boolean"},"ownerShip":{"type":"string","minLength":1}},"additionalProperties":false}}},"additionalProperties":false}},{"pluginId":"twitch","channelId":"twitch","label":"Twitch","description":"Twitch chat integration","schema":{"$schema":"http://json-schema.org/draft-07/schema#","anyOf":[{"type":"object","properties":{"name":{"type":"string"},"enabled":{"type":"boolean"},"markdown":{"type":"object","properties":{"tables":{"type":"string","enum":["off","bullets","code","block"]}},"additionalProperties":false},"defaultAccount":{"type":"string"},"username":{"type":"string"},"accessToken":{"type":"string"},"clientId":{"type":"string"},"channel":{"type":"string","minLength":1},"allowFrom":{"type":"array","items":{"type":"string"}},"allowedRoles":{"type":"array","items":{"type":"string","enum":["moderator","owner","vip","subscriber","all"]}},"requireMention":{"type":"boolean"},"responsePrefix":{"type":"string"},"clientSecret":{"type":"string"},"refreshToken":{"type":"string"},"expiresIn":{"anyOf":[{"type":"number"},{"type":"null"}]},"obtainmentTimestamp":{"type":"number"}},"required":["username","accessToken","channel"],"additionalProperties":false},{"type":"object","properties":{"name":{"type":"string"},"enabled":{"type":"boolean"},"markdown":{"type":"object","properties":{"tables":{"type":"string","enum":["off","bullets","code","block"]}},"additionalProperties":false},"defaultAccount":{"type":"string"},"accounts":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"username":{"type":"string"},"accessToken":{"type":"string"},"clientId":{"type":"string"},"channel":{"type":"string","minLength":1},"enabled":{"type":"boolean"},"allowFrom":{"type":"array","items":{"type":"string"}},"allowedRoles":{"type":"array","items":{"type":"string","enum":["moderator","owner","vip","subscriber","all"]}},"requireMention":{"type":"boolean"},"responsePrefix":{"type":"string"},"clientSecret":{"type":"string"},"refreshToken":{"type":"string"},"expiresIn":{"anyOf":[{"type":"number"},{"type":"null"}]},"obtainmentTimestamp":{"type":"number"}},"required":["username","accessToken","channel"],"additionalProperties":false}}},"required":["accounts"],"additionalProperties":false}]}},{"pluginId":"whatsapp","channelId":"whatsapp","label":"WhatsApp","description":"works with your own number; recommend a separate phone + eSIM.","schema":{"$schem', + 'a":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"enabled":{"type":"boolean"},"capabilities":{"type":"array","items":{"type":"string"}},"markdown":{"type":"object","properties":{"tables":{"type":"string","enum":["off","bullets","code","block"]}},"additionalProperties":false},"configWrites":{"type":"boolean"},"sendReadReceipts":{"type":"boolean"},"messagePrefix":{"type":"string"},"responsePrefix":{"type":"string"},"dmPolicy":{"default":"pairing","type":"string","enum":["pairing","allowlist","open","disabled"]},"selfChatMode":{"type":"boolean"},"allowFrom":{"type":"array","items":{"type":"string"}},"defaultTo":{"type":"string"},"groupAllowFrom":{"type":"array","items":{"type":"string"}},"groupPolicy":{"default":"allowlist","type":"string","enum":["open","disabled","allowlist"]},"contextVisibility":{"type":"string","enum":["all","allowlist","allowlist_quote"]},"historyLimit":{"type":"integer","minimum":0,"maximum":9007199254740991},"dmHistoryLimit":{"type":"integer","minimum":0,"maximum":9007199254740991},"dms":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"historyLimit":{"type":"integer","minimum":0,"maximum":9007199254740991}},"additionalProperties":false}},"textChunkLimit":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"chunkMode":{"type":"string","enum":["length","newline"]},"blockStreaming":{"type":"boolean"},"blockStreamingCoalesce":{"type":"object","properties":{"minChars":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"maxChars":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"idleMs":{"type":"integer","minimum":0,"maximum":9007199254740991}},"additionalProperties":false},"groups":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"requireMention":{"type":"boolean"},"tools":{"type":"object","properties":{"allow":{"type":"array","items":{"type":"string"}},"alsoAllow":{"type":"array","items":{"type":"string"}},"deny":{"type":"array","items":{"type":"string"}}},"additionalProperties":false},"toolsBySender":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"allow":{"type":"array","items":{"type":"string"}},"alsoAllow":{"type":"array","items":{"type":"string"}},"deny":{"type":"array","items":{"type":"string"}}},"additionalProperties":false}},"systemPrompt":{"type":"string"}},"additionalProperties":false}},"direct":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"systemPrompt":{"type":"string"}},"additionalProperties":false}},"ackReaction":{"type":"object","properties":{"emoji":{"type":"string"},"direct":{"default":true,"type":"boolean"},"group":{"default":"mentions","type":"string","enum":["always","mentions","never"]}},"required":["direct","group"],"additionalProperties":false},"reactionLevel":{"type":"string","enum":["off","ack","minimal","extensive"]},"debounceMs":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"replyToMode":{"anyOf":[{"type":"string","const":"off"},{"type":"string","const":"first"},{"type":"string","const":"all"},{"type":"string","const":"batched"}]},"heartbeat":{"type":"object","properties":{"showOk":{"type":"boolean"},"showAlerts":{"type":"boolean"},"useIndicator":{"type":"boolean"}},"additionalProperties":false},"healthMonitor":{"type":"object","properties":{"enabled":{"type":"boolean"}},"additionalProperties":false},"accounts":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"enabled":{"type":"boolean"},"capabilities":{"type":"array","items":{"type":"string"}},"markdown":{"type":"object","properties":{"tables":{"type":"string","enum":["off","bullets","code","block"]}},"additionalProperties":false},"configWrites":{"type":"boolean"},"sendReadReceipts":{"type":"boolean"},"messagePrefix":{"type":"string"},"responsePrefix":{"type":"string"},"dmPolicy":{"type":"string","enum":["pairing","allowlist","open","disabled"]},"selfChatMode":{"type":"boolean"},"allowFrom":{"type":"array","items":{"type":"string"}},"defaultTo":{"type":"string"},"groupAllowFrom":{"type":"array","items":{"type":"string"}},"groupPolicy":{"type":"string","enum":["open","disabled","allowlist"]},"contextVisibility":{"type":"string","enum":["all","allowlist","allowlist_quote"]},"historyLimit":{"type":"integer","minimum":0,"maximum":9007199254740991},"dmHistoryLimit":{"type":"integer","minimum":0,"maximum":9007199254740991},"dms":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"historyLimit":{"type":"integer","minimum":0,"maximum":9007199254740991}},"additionalProperties":false}},"textChunkLimit":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"chunkMode":{"type":"string","enum":["length","newline"]},"blockStreaming":{"type":"boolean"},"blockStreamingCoalesce":{"type":"object","properties":{"minChars":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"maxChars":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"idleMs":{"type":"integer","minimum":0,"maximum":9007199254740991}},"additionalProperties":false},"groups":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"requireMention":{"type":"boolean"},"tools":{"type":"object","properties":{"allow":{"type":"array","items":{"type":"string"}},"alsoAllow":{"type":"array","items":{"type":"string"}},"deny":{"type":"array","items":{"type":"string"}}},"additionalProperties":false},"toolsBySender":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"allow":{"type":"array","items":{"type":"string"}},"alsoAllow":{"type":"array","items":{"type":"string"}},"deny":{"type":"array","items":{"type":"string"}}},"additionalProperties":false}},"systemPrompt":{"type":"string"}},"additionalProperties":false}},"direct":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"systemPrompt":{"type":"string"}},"additionalProperties":false}},"ackReaction":{"type":"object","properties":{"emoji":{"type":"string"},"direct":{"default":true,"type":"boolean"},"group":{"default":"mentions","type":"string","enum":["always","mentions","never"]}},"required":["direct","group"],"additionalProperties":false},"reactionLevel":{"type":"string","enum":["off","ack","minimal","extensive"]},"debounceMs":{"type":"integer","minimum":0,"maximum":9007199254740991},"replyToMode":{"anyOf":[{"type":"string","const":"off"},{"type":"string","const":"first"},{"type":"string","const":"all"},{"type":"string","const":"batched"}]},"heartbeat":{"type":"object","properties":{"showOk":{"type":"boolean"},"showAlerts":{"type":"boolean"},"useIndicator":{"type":"boolean"}},"additionalProperties":false},"healthMonitor":{"type":"object","properties":{"enabled":{"type":"boolean"}},"additionalProperties":false},"name":{"type":"string"},"authDir":{"type":"string"},"mediaMaxMb":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"additionalProperties":false}},"defaultAccount":{"type":"string"},"mediaMaxMb":{"default":50,"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"actions":{"type":"object","properties":{"reactions":{"type":"boolean"},"sendMessage":{"type":"boolean"},"polls":{"type":"boolean"}},"additionalProperties":false}},"required":["dmPolicy","groupPolicy","debounceMs","mediaMaxMb"],"additionalProperties":false},"uiHints":{"":{"label":"WhatsApp","help":"WhatsApp channel provider configuration for access policy and message batching behavior. Use this section to tune responsiveness and direct-message routing safety for WhatsApp chats."},"dmPolicy":{"label":"WhatsApp DM Policy","help":"Direct message access control (\\"pairing\\" recommended). \\"open\\" requires channels.whatsapp.allowFrom=[\\"*\\"]."},"selfChatMode":{"label":"WhatsApp Self-Phone Mode","help":"Same-phone setup (bot uses your personal WhatsApp number)."},"debounceMs":{"label":"WhatsApp Message Debounce (ms)","help":"Debounce window (ms) for batching rapid consecutive messages from the same sender (0 to disable)."},"configWrites":{"label":"WhatsApp Config Writes","help":"Allow WhatsApp to write config in response to channel events/commands (default: true)."}},"unsupportedSecretRefSurfacePatterns":["channels.whatsapp.accounts.*.creds.json","channels.whatsapp.creds.json"]},{"pluginId":"zalo","channelId":"zalo","label":"Zalo","description":"Vietnam-focused messaging platform with Bot API.","schema":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"name":{"type":"string"},"enabled":{"type":"boolean"},"markdown":{"type":"object","properties":{"tables":{"type":"string","enum":["off","bullets","code","block"]}},"additionalProperties":false},"botToken":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false}]}]},"tokenFile":{"type":"string"},"webhookUrl":{"type":"string"},"webhookSecret":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false}]}]},"webhookPath":{"type":"string"},"dmPolicy":{"type":"string","enum":["pairing","allowlist","open","disabled"]},"allowFrom":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"groupPolicy":{"type":"string","enum":["open","disabled","allowlist"]},"groupAllowFrom":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"mediaMaxMb":{"type":"number"},"proxy":{"type":"string"},"responsePrefix":{"type":"string"},"accounts":{"type":"object","properties":{},"additionalProperties":{"type":"object","properties":{"name":{"type":"string"},"enabled":{"type":"boolean"},"markdown":{"type":"object","properties":{"tables":{"type":"string","enum":["off","bullets","code","block"]}},"additionalProperties":false},"botToken":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false}]}]},"tokenFile":{"type":"string"},"webhookUrl":{"type":"string"},"webhookSecret":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false}]}]},"webhookPath":{"type":"string"},"dmPolicy":{"type":"string","enum":["pairing","allowlist","open","disabled"]},"allowFrom":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"groupPolicy":{"type":"string","enum":["open","disabled","allowlist"]},"groupAllowFrom":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"mediaMaxMb":{"type":"number"},"proxy":{"type":"string"},"responsePrefix":{"type":"string"}},"additionalProperties":false}},"defaultAccount":{"type":"string"}},"additionalProperties":false}},{"pluginId":"zalouser","channelId":"zalouser","label":"Zalo Personal","description":"Zalo personal account via QR code login.","schema":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"name":{"type":"string"},"enabled":{"type":"boolean"},"markdown":{"type":"object","properties":{"tables":{"type":"string","enum":["off","bullets","code","block"]}},"additionalProperties":false},"profile":{"type":"string"},"dangerouslyAllowNameMatching":{"type":"boolean"},"dmPolicy":{"type":"string","enum":["pairing","allowlist","open","disabled"]},"allowFrom":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"historyLimit":{"type":"integer","minimum":0,"maximum":9007199254740991},"groupAllowFrom":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"groupPolicy":{"default":"allowlist","type":"string","enum":["open","disabled","allowlist"]},"groups":{"type":"object","properties":{},"additionalProperties":{"type":"object","properties":{"enabled":{"type":"boolean"},"requireMention":{"type":"boolean"},"tools":{"type":"object","properties":{"allow":{"type":"array","items":{"type":"string"}},"alsoAllow":{"type":"array","items":{"type":"string"}},"deny":{"type":"array","items":{"type":"string"}}},"additionalProperties":false}},"additionalProperties":false}},"messagePrefix":{"type":"string"},"responsePrefix":{"type":"string"},"accounts":{"type":"object","properties":{},"additionalProperties":{"type":"object","properties":{"name":{"type":"string"},"enabled":{"type":"boolean"},"markdown":{"type":"object","properties":{"tables":{"type":"string","enum":["off","bullets","code","block"]}},"additionalProperties":false},"profile":{"type":"string"},"dangerouslyAllowNameMatching":{"type":"boolean"},"dmPolicy":{"type":"string","enum":["pairing","allowlist","open","disabled"]},"allowFrom":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"historyLimit":{"type":"integer","minimum":0,"maximum":9007199254740991},"groupAllowFrom":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"groupPolicy":{"default":"allowlist","type":"string","enum":["open","disabled","allowlist"]},"groups":{"type":"object","properties":{},"additionalProperties":{"type":"object","properties":{"enabled":{"type":"boolean"},"requireMention":{"type":"boolean"},"tools":{"type":"object","properties":{"allow":{"type":"array","items":{"type":"string"}},"alsoAllow":{"type":"array","items":{"type":"string"}},"deny":{"type":"array","items":{"type":"string"}}},"additionalProperties":false}},"additionalProperties":false}},"messagePrefix":{"type":"string"},"responsePrefix":{"type":"string"}},"required":["groupPolicy"],"additionalProperties":false}},"defaultAccount":{"type":"string"}},"required":["groupPolicy"],"additionalProperties":false}}]', +].join(""); + +export const GENERATED_BUNDLED_CHANNEL_CONFIG_METADATA = JSON.parse( + RAW_BUNDLED_CHANNEL_CONFIG_METADATA, +) as readonly BundledChannelConfigMetadata[]; diff --git a/src/plugin-sdk/agent-harness-runtime.ts b/src/plugin-sdk/agent-harness-runtime.ts index 16698cffabd..13d9a7defaa 100644 --- a/src/plugin-sdk/agent-harness-runtime.ts +++ b/src/plugin-sdk/agent-harness-runtime.ts @@ -87,7 +87,7 @@ export { } from "../agents/pi-embedded-subscribe.tools.js"; export { normalizeUsage } from "../agents/usage.js"; export { resolveOpenClawAgentDir } from "./agent-dir-compat.js"; -export { resolveSessionAgentIds } from "../agents/agent-scope.js"; +export { resolveAgentDir, resolveSessionAgentIds } from "../agents/agent-scope.js"; export { resolveModelAuthMode } from "../agents/model-auth.js"; export { supportsModelTools } from "../agents/model-tool-support.js"; export { resolveAttemptSpawnWorkspaceDir } from "../agents/pi-embedded-runner/run/attempt.thread-helpers.js";