diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 8cc86bd63..75c1a3f2a 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -83,6 +83,9 @@ jobs: - runtime: node task: protocol command: pnpm protocol:check + - runtime: node + task: schema + command: pnpm schema:check - runtime: node task: format command: pnpm format @@ -207,6 +210,9 @@ jobs: - runtime: node task: protocol command: pnpm protocol:check + - runtime: node + task: schema + command: pnpm schema:check steps: - name: Checkout uses: actions/checkout@v4 diff --git a/package.json b/package.json index 1a6d65178..6fcdb2c09 100644 --- a/package.json +++ b/package.json @@ -139,6 +139,8 @@ "protocol:gen": "node --import tsx scripts/protocol-gen.ts", "protocol:gen:swift": "node --import tsx scripts/protocol-gen-swift.ts", "protocol:check": "pnpm protocol:gen && pnpm protocol:gen:swift && git diff --exit-code -- dist/protocol.schema.json apps/macos/Sources/ClawdbotProtocol/GatewayModels.swift", + "schema:gen": "node --import tsx scripts/gen-config-schema.ts", + "schema:check": "pnpm schema:gen && git diff --exit-code -- schemas/", "canvas:a2ui:bundle": "bash scripts/bundle-a2ui.sh", "check:loc": "node --import tsx scripts/check-ts-max-loc.ts --max 500" }, @@ -223,6 +225,7 @@ "@typescript/native-preview": "7.0.0-dev.20260124.1", "@vitest/coverage-v8": "^4.0.18", "docx-preview": "^0.3.7", + "json-schema-to-typescript": "^15.0.4", "lit": "^3.3.2", "lucide": "^0.563.0", "ollama": "^0.6.3", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d1c55dd8d..7d146db84 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -215,6 +215,9 @@ importers: docx-preview: specifier: ^0.3.7 version: 0.3.7 + json-schema-to-typescript: + specifier: ^15.0.4 + version: 15.0.4 lit: specifier: ^3.3.2 version: 3.3.2 @@ -522,6 +525,10 @@ packages: zod: optional: true + '@apidevtools/json-schema-ref-parser@11.9.3': + resolution: {integrity: sha512-60vepv88RwcJtSHrD6MjIL6Ta3SOYbgfnkHb+ppAVK+o9mXprRtulx7VlRl3lN3bbvysAfCS7WMVfhUYemB0IQ==} + engines: {node: '>= 16'} + '@aws-crypto/crc32@5.2.0': resolution: {integrity: sha512-nLbCWqQNgUiwwtFsen1AdzAtvuLRsQS8rYgMuxCrdKf9kOssamGLuPwyTY9wyYblNr9+1XM8v6zoDTPPSIeANg==} engines: {node: '>=16.0.0'} @@ -1256,6 +1263,9 @@ packages: '@js-sdsl/ordered-map@4.4.2': resolution: {integrity: sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==} + '@jsdevtools/ono@7.1.3': + resolution: {integrity: sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==} + '@keyv/bigmap@1.3.1': resolution: {integrity: sha512-WbzE9sdmQtKy8vrNPa9BRnwZh5UF4s1KTmSK0KUVLo3eff5BlQNNWDnFOouNpKfPKDnms9xynJjsMYjMaT/aFQ==} engines: {node: '>= 18'} @@ -2704,12 +2714,18 @@ packages: '@types/http-errors@2.0.5': resolution: {integrity: sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==} + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + '@types/jsonwebtoken@9.0.10': resolution: {integrity: sha512-asx5hIG9Qmf/1oStypjanR7iKTv0gXQ1Ov/jfrX6kS/EO0OFni8orbmGCn0672NHR3kXHwpAwR+B368ZGN/2rA==} '@types/linkify-it@5.0.0': resolution: {integrity: sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==} + '@types/lodash@4.17.23': + resolution: {integrity: sha512-RDvF6wTulMPjrNdCoYRC8gNR880JNGT8uB+REUpC2Ns4pRqQJhGz90wh7rgdXDPpCczF3VGktDuFGVnz8zP7HA==} + '@types/long@4.0.2': resolution: {integrity: sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==} @@ -3975,6 +3991,10 @@ packages: js-tokens@9.0.1: resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==} + js-yaml@4.1.1: + resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} + hasBin: true + jsbn@0.1.1: resolution: {integrity: sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==} @@ -3989,6 +4009,11 @@ packages: resolution: {integrity: sha512-+DWg8jCJG2TEnpy7kOm/7/AxaYoaRbjVB4LFZLySZlWn8exGs3A4OLJR966cVvU26N7X9TWxl+Jsw7dzAqKT6g==} engines: {node: '>=16'} + json-schema-to-typescript@15.0.4: + resolution: {integrity: sha512-Su9oK8DR4xCmDsLlyvadkXzX6+GGXJpbhwoLtOGArAG61dvbW4YQmSEno2y66ahpIdmLMg6YUf/QHLgiwvkrHQ==} + engines: {node: '>=16.0.0'} + hasBin: true + json-schema-traverse@0.4.1: resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} @@ -4716,6 +4741,11 @@ packages: resolution: {integrity: sha512-d+JFcLM17njZaOLkv6SCev7uoLaBtfK86vMUXhW1Z4glPWh4jozno9APvW/XKFJ3CCxVoC7OL38BqRydtu5nGg==} engines: {node: '>=12'} + prettier@3.8.1: + resolution: {integrity: sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==} + engines: {node: '>=14'} + hasBin: true + pretty-bytes@6.1.1: resolution: {integrity: sha512-mQUvGU6aUFQ+rNvTIAcZuWGRT9a6f6Yrg9bHs4ImKF+HZCEK+plBvnAZYSIQztknZF2qnzNtr6F8s0+IuptdlQ==} engines: {node: ^14.13.1 || >=16.0.0} @@ -5582,6 +5612,12 @@ snapshots: optionalDependencies: zod: 4.3.6 + '@apidevtools/json-schema-ref-parser@11.9.3': + dependencies: + '@jsdevtools/ono': 7.1.3 + '@types/json-schema': 7.0.15 + js-yaml: 4.1.1 + '@aws-crypto/crc32@5.2.0': dependencies: '@aws-crypto/util': 5.2.0 @@ -6824,6 +6860,8 @@ snapshots: '@js-sdsl/ordered-map@4.4.2': {} + '@jsdevtools/ono@7.1.3': {} + '@keyv/bigmap@1.3.1(keyv@5.6.0)': dependencies: hashery: 1.4.0 @@ -8486,6 +8524,8 @@ snapshots: '@types/http-errors@2.0.5': {} + '@types/json-schema@7.0.15': {} + '@types/jsonwebtoken@9.0.10': dependencies: '@types/ms': 2.1.0 @@ -8493,6 +8533,8 @@ snapshots: '@types/linkify-it@5.0.0': {} + '@types/lodash@4.17.23': {} + '@types/long@4.0.2': {} '@types/markdown-it@14.1.2': @@ -10056,6 +10098,10 @@ snapshots: js-tokens@9.0.1: {} + js-yaml@4.1.1: + dependencies: + argparse: 2.0.1 + jsbn@0.1.1: {} json-bigint@1.0.0: @@ -10069,6 +10115,18 @@ snapshots: '@babel/runtime': 7.28.6 ts-algebra: 2.0.0 + json-schema-to-typescript@15.0.4: + dependencies: + '@apidevtools/json-schema-ref-parser': 11.9.3 + '@types/json-schema': 7.0.15 + '@types/lodash': 4.17.23 + is-glob: 4.0.3 + js-yaml: 4.1.1 + lodash: 4.17.23 + minimist: 1.2.8 + prettier: 3.8.1 + tinyglobby: 0.2.15 + json-schema-traverse@0.4.1: {} json-schema-traverse@1.0.0: {} @@ -10389,8 +10447,7 @@ snapshots: dependencies: brace-expansion: 2.0.2 - minimist@1.2.8: - optional: true + minimist@1.2.8: {} minipass@7.1.2: {} @@ -10820,6 +10877,8 @@ snapshots: postgres@3.4.8: {} + prettier@3.8.1: {} + pretty-bytes@6.1.1: optional: true diff --git a/schemas/clawdbot.d.ts b/schemas/clawdbot.d.ts new file mode 100644 index 000000000..e44f03a13 --- /dev/null +++ b/schemas/clawdbot.d.ts @@ -0,0 +1,2820 @@ +/* eslint-disable */ +/** + * This file was automatically generated by json-schema-to-typescript. + * DO NOT MODIFY IT BY HAND. Instead, modify the source JSONSchema file, + * and run json-schema-to-typescript to regenerate this file. + */ + +export interface ClawdbotConfig { + meta?: { + lastTouchedVersion?: string; + lastTouchedAt?: string; + }; + env?: { + shellEnv?: { + enabled?: boolean; + timeoutMs?: number; + }; + vars?: { + [k: string]: string; + }; + [k: string]: string; + }; + wizard?: { + lastRunAt?: string; + lastRunVersion?: string; + lastRunCommit?: string; + lastRunCommand?: string; + lastRunMode?: "local" | "remote"; + }; + diagnostics?: { + enabled?: boolean; + flags?: string[]; + otel?: { + enabled?: boolean; + endpoint?: string; + protocol?: "http/protobuf" | "grpc"; + headers?: { + [k: string]: string; + }; + serviceName?: string; + traces?: boolean; + metrics?: boolean; + logs?: boolean; + sampleRate?: number; + flushIntervalMs?: number; + }; + cacheTrace?: { + enabled?: boolean; + filePath?: string; + includeMessages?: boolean; + includePrompt?: boolean; + includeSystem?: boolean; + }; + }; + logging?: { + level?: "silent" | "fatal" | "error" | "warn" | "info" | "debug" | "trace"; + file?: string; + consoleLevel?: "silent" | "fatal" | "error" | "warn" | "info" | "debug" | "trace"; + consoleStyle?: "pretty" | "compact" | "json"; + redactSensitive?: "off" | "tools"; + redactPatterns?: string[]; + }; + update?: { + channel?: "stable" | "beta" | "dev"; + checkOnStart?: boolean; + }; + browser?: { + enabled?: boolean; + evaluateEnabled?: boolean; + cdpUrl?: string; + remoteCdpTimeoutMs?: number; + remoteCdpHandshakeTimeoutMs?: number; + color?: string; + executablePath?: string; + headless?: boolean; + noSandbox?: boolean; + attachOnly?: boolean; + defaultProfile?: string; + snapshotDefaults?: { + mode?: "efficient"; + }; + profiles?: { + [k: string]: { + cdpPort?: number; + cdpUrl?: string; + driver?: "clawd" | "extension"; + color: string; + }; + }; + }; + ui?: { + seamColor?: string; + assistant?: { + name?: string; + avatar?: string; + }; + }; + auth?: { + profiles?: { + [k: string]: { + provider: string; + mode: "api_key" | "oauth" | "token"; + email?: string; + }; + }; + order?: { + [k: string]: string[]; + }; + cooldowns?: { + billingBackoffHours?: number; + billingBackoffHoursByProvider?: { + [k: string]: number; + }; + billingMaxHours?: number; + failureWindowHours?: number; + }; + }; + models?: { + mode?: "merge" | "replace"; + providers?: { + [k: string]: { + baseUrl: string; + apiKey?: string; + auth?: "api-key" | "aws-sdk" | "oauth" | "token"; + api?: + | "openai-completions" + | "openai-responses" + | "anthropic-messages" + | "google-generative-ai" + | "github-copilot" + | "bedrock-converse-stream"; + headers?: { + [k: string]: string; + }; + authHeader?: boolean; + models: { + id: string; + name: string; + api?: + | "openai-completions" + | "openai-responses" + | "anthropic-messages" + | "google-generative-ai" + | "github-copilot" + | "bedrock-converse-stream"; + reasoning?: boolean; + input?: ("text" | "image")[]; + cost?: { + input?: number; + output?: number; + cacheRead?: number; + cacheWrite?: number; + }; + contextWindow?: number; + maxTokens?: number; + headers?: { + [k: string]: string; + }; + compat?: { + supportsStore?: boolean; + supportsDeveloperRole?: boolean; + supportsReasoningEffort?: boolean; + maxTokensField?: "max_completion_tokens" | "max_tokens"; + }; + }[]; + }; + }; + bedrockDiscovery?: { + enabled?: boolean; + region?: string; + providerFilter?: string[]; + refreshInterval?: number; + defaultContextWindow?: number; + defaultMaxTokens?: number; + }; + }; + nodeHost?: { + browserProxy?: { + enabled?: boolean; + allowProfiles?: string[]; + }; + }; + agents?: { + defaults?: { + model?: { + primary?: string; + fallbacks?: string[]; + }; + imageModel?: { + primary?: string; + fallbacks?: string[]; + }; + models?: { + [k: string]: { + alias?: string; + params?: { + [k: string]: unknown; + }; + }; + }; + workspace?: string; + repoRoot?: string; + skipBootstrap?: boolean; + bootstrapMaxChars?: number; + userTimezone?: string; + timeFormat?: "auto" | "12" | "24"; + envelopeTimezone?: string; + envelopeTimestamp?: "on" | "off"; + envelopeElapsed?: "on" | "off"; + contextTokens?: number; + cliBackends?: { + [k: string]: { + command: string; + args?: string[]; + output?: "json" | "text" | "jsonl"; + resumeOutput?: "json" | "text" | "jsonl"; + input?: "arg" | "stdin"; + maxPromptArgChars?: number; + env?: { + [k: string]: string; + }; + clearEnv?: string[]; + modelArg?: string; + modelAliases?: { + [k: string]: string; + }; + sessionArg?: string; + sessionArgs?: string[]; + resumeArgs?: string[]; + sessionMode?: "always" | "existing" | "none"; + sessionIdFields?: string[]; + systemPromptArg?: string; + systemPromptMode?: "append" | "replace"; + systemPromptWhen?: "first" | "always" | "never"; + imageArg?: string; + imageMode?: "repeat" | "list"; + serialize?: boolean; + }; + }; + memorySearch?: { + enabled?: boolean; + sources?: ("memory" | "sessions")[]; + experimental?: { + sessionMemory?: boolean; + }; + provider?: "openai" | "local" | "gemini"; + remote?: { + baseUrl?: string; + apiKey?: string; + headers?: { + [k: string]: string; + }; + batch?: { + enabled?: boolean; + wait?: boolean; + concurrency?: number; + pollIntervalMs?: number; + timeoutMinutes?: number; + }; + }; + fallback?: "openai" | "gemini" | "local" | "none"; + model?: string; + local?: { + modelPath?: string; + modelCacheDir?: string; + }; + store?: { + driver?: "sqlite"; + path?: string; + vector?: { + enabled?: boolean; + extensionPath?: string; + }; + }; + chunking?: { + tokens?: number; + overlap?: number; + }; + sync?: { + onSessionStart?: boolean; + onSearch?: boolean; + watch?: boolean; + watchDebounceMs?: number; + intervalMinutes?: number; + sessions?: { + deltaBytes?: number; + deltaMessages?: number; + }; + }; + query?: { + maxResults?: number; + minScore?: number; + hybrid?: { + enabled?: boolean; + vectorWeight?: number; + textWeight?: number; + candidateMultiplier?: number; + }; + }; + cache?: { + enabled?: boolean; + maxEntries?: number; + }; + }; + contextPruning?: { + mode?: "off" | "cache-ttl"; + ttl?: string; + keepLastAssistants?: number; + softTrimRatio?: number; + hardClearRatio?: number; + minPrunableToolChars?: number; + tools?: { + allow?: string[]; + deny?: string[]; + }; + softTrim?: { + maxChars?: number; + headChars?: number; + tailChars?: number; + }; + hardClear?: { + enabled?: boolean; + placeholder?: string; + }; + }; + compaction?: { + mode?: "default" | "safeguard"; + reserveTokensFloor?: number; + maxHistoryShare?: number; + memoryFlush?: { + enabled?: boolean; + softThresholdTokens?: number; + prompt?: string; + systemPrompt?: string; + }; + }; + thinkingDefault?: "off" | "minimal" | "low" | "medium" | "high" | "xhigh"; + verboseDefault?: "off" | "on" | "full"; + elevatedDefault?: "off" | "on" | "ask" | "full"; + blockStreamingDefault?: "off" | "on"; + blockStreamingBreak?: "text_end" | "message_end"; + blockStreamingChunk?: { + minChars?: number; + maxChars?: number; + breakPreference?: "paragraph" | "newline" | "sentence"; + }; + blockStreamingCoalesce?: { + minChars?: number; + maxChars?: number; + idleMs?: number; + }; + humanDelay?: { + mode?: "off" | "natural" | "custom"; + minMs?: number; + maxMs?: number; + }; + timeoutSeconds?: number; + mediaMaxMb?: number; + typingIntervalSeconds?: number; + typingMode?: "never" | "instant" | "thinking" | "message"; + heartbeat?: { + every?: string; + activeHours?: { + start?: string; + end?: string; + timezone?: string; + }; + model?: string; + session?: string; + includeReasoning?: boolean; + target?: string; + to?: string; + prompt?: string; + ackMaxChars?: number; + }; + maxConcurrent?: number; + subagents?: { + maxConcurrent?: number; + archiveAfterMinutes?: number; + model?: + | string + | { + primary?: string; + fallbacks?: string[]; + }; + }; + sandbox?: { + mode?: "off" | "non-main" | "all"; + workspaceAccess?: "none" | "ro" | "rw"; + sessionToolsVisibility?: "spawned" | "all"; + scope?: "session" | "agent" | "shared"; + perSession?: boolean; + workspaceRoot?: string; + docker?: { + image?: string; + containerPrefix?: string; + workdir?: string; + readOnlyRoot?: boolean; + tmpfs?: string[]; + network?: string; + user?: string; + capDrop?: string[]; + env?: { + [k: string]: string; + }; + setupCommand?: string; + pidsLimit?: number; + memory?: string | number; + memorySwap?: string | number; + cpus?: number; + ulimits?: { + [k: string]: + | string + | number + | { + soft?: number; + hard?: number; + }; + }; + seccompProfile?: string; + apparmorProfile?: string; + dns?: string[]; + extraHosts?: string[]; + binds?: string[]; + }; + browser?: { + enabled?: boolean; + image?: string; + containerPrefix?: string; + cdpPort?: number; + vncPort?: number; + noVncPort?: number; + headless?: boolean; + enableNoVnc?: boolean; + allowHostControl?: boolean; + autoStart?: boolean; + autoStartTimeoutMs?: number; + }; + prune?: { + idleHours?: number; + maxAgeDays?: number; + }; + }; + }; + list?: { + id: string; + default?: boolean; + name?: string; + workspace?: string; + agentDir?: string; + model?: + | string + | { + primary?: string; + fallbacks?: string[]; + }; + memorySearch?: { + enabled?: boolean; + sources?: ("memory" | "sessions")[]; + experimental?: { + sessionMemory?: boolean; + }; + provider?: "openai" | "local" | "gemini"; + remote?: { + baseUrl?: string; + apiKey?: string; + headers?: { + [k: string]: string; + }; + batch?: { + enabled?: boolean; + wait?: boolean; + concurrency?: number; + pollIntervalMs?: number; + timeoutMinutes?: number; + }; + }; + fallback?: "openai" | "gemini" | "local" | "none"; + model?: string; + local?: { + modelPath?: string; + modelCacheDir?: string; + }; + store?: { + driver?: "sqlite"; + path?: string; + vector?: { + enabled?: boolean; + extensionPath?: string; + }; + }; + chunking?: { + tokens?: number; + overlap?: number; + }; + sync?: { + onSessionStart?: boolean; + onSearch?: boolean; + watch?: boolean; + watchDebounceMs?: number; + intervalMinutes?: number; + sessions?: { + deltaBytes?: number; + deltaMessages?: number; + }; + }; + query?: { + maxResults?: number; + minScore?: number; + hybrid?: { + enabled?: boolean; + vectorWeight?: number; + textWeight?: number; + candidateMultiplier?: number; + }; + }; + cache?: { + enabled?: boolean; + maxEntries?: number; + }; + }; + humanDelay?: { + mode?: "off" | "natural" | "custom"; + minMs?: number; + maxMs?: number; + }; + heartbeat?: { + every?: string; + activeHours?: { + start?: string; + end?: string; + timezone?: string; + }; + model?: string; + session?: string; + includeReasoning?: boolean; + target?: string; + to?: string; + prompt?: string; + ackMaxChars?: number; + }; + identity?: { + name?: string; + theme?: string; + emoji?: string; + avatar?: string; + }; + groupChat?: { + mentionPatterns?: string[]; + historyLimit?: number; + }; + subagents?: { + allowAgents?: string[]; + model?: + | string + | { + primary?: string; + fallbacks?: string[]; + }; + }; + sandbox?: { + mode?: "off" | "non-main" | "all"; + workspaceAccess?: "none" | "ro" | "rw"; + sessionToolsVisibility?: "spawned" | "all"; + scope?: "session" | "agent" | "shared"; + perSession?: boolean; + workspaceRoot?: string; + docker?: { + image?: string; + containerPrefix?: string; + workdir?: string; + readOnlyRoot?: boolean; + tmpfs?: string[]; + network?: string; + user?: string; + capDrop?: string[]; + env?: { + [k: string]: string; + }; + setupCommand?: string; + pidsLimit?: number; + memory?: string | number; + memorySwap?: string | number; + cpus?: number; + ulimits?: { + [k: string]: + | string + | number + | { + soft?: number; + hard?: number; + }; + }; + seccompProfile?: string; + apparmorProfile?: string; + dns?: string[]; + extraHosts?: string[]; + binds?: string[]; + }; + browser?: { + enabled?: boolean; + image?: string; + containerPrefix?: string; + cdpPort?: number; + vncPort?: number; + noVncPort?: number; + headless?: boolean; + enableNoVnc?: boolean; + allowHostControl?: boolean; + autoStart?: boolean; + autoStartTimeoutMs?: number; + }; + prune?: { + idleHours?: number; + maxAgeDays?: number; + }; + }; + tools?: { + profile?: "minimal" | "coding" | "messaging" | "full"; + allow?: string[]; + alsoAllow?: string[]; + deny?: string[]; + byProvider?: { + [k: string]: { + allow?: string[]; + alsoAllow?: string[]; + deny?: string[]; + profile?: "minimal" | "coding" | "messaging" | "full"; + }; + }; + elevated?: { + enabled?: boolean; + allowFrom?: { + [k: string]: (string | number)[]; + }; + }; + exec?: { + host?: "sandbox" | "gateway" | "node"; + security?: "deny" | "allowlist" | "full"; + ask?: "off" | "on-miss" | "always"; + node?: string; + pathPrepend?: string[]; + safeBins?: string[]; + backgroundMs?: number; + timeoutSec?: number; + approvalRunningNoticeMs?: number; + cleanupMs?: number; + notifyOnExit?: boolean; + applyPatch?: { + enabled?: boolean; + allowModels?: string[]; + }; + }; + sandbox?: { + tools?: { + allow?: string[]; + alsoAllow?: string[]; + deny?: string[]; + }; + }; + }; + }[]; + }; + tools?: { + profile?: "minimal" | "coding" | "messaging" | "full"; + allow?: string[]; + alsoAllow?: string[]; + deny?: string[]; + byProvider?: { + [k: string]: { + allow?: string[]; + alsoAllow?: string[]; + deny?: string[]; + profile?: "minimal" | "coding" | "messaging" | "full"; + }; + }; + web?: { + search?: { + enabled?: boolean; + provider?: "brave" | "perplexity"; + apiKey?: string; + maxResults?: number; + timeoutSeconds?: number; + cacheTtlMinutes?: number; + perplexity?: { + apiKey?: string; + baseUrl?: string; + model?: string; + }; + }; + fetch?: { + enabled?: boolean; + maxChars?: number; + timeoutSeconds?: number; + cacheTtlMinutes?: number; + maxRedirects?: number; + userAgent?: string; + }; + }; + media?: { + models?: { + provider?: string; + model?: string; + capabilities?: ("image" | "audio" | "video")[]; + type?: "provider" | "cli"; + command?: string; + args?: string[]; + prompt?: string; + maxChars?: number; + maxBytes?: number; + timeoutSeconds?: number; + language?: string; + providerOptions?: { + [k: string]: { + [k: string]: string | number | boolean; + }; + }; + deepgram?: { + detectLanguage?: boolean; + punctuate?: boolean; + smartFormat?: boolean; + }; + baseUrl?: string; + headers?: { + [k: string]: string; + }; + profile?: string; + preferredProfile?: string; + }[]; + concurrency?: number; + image?: { + enabled?: boolean; + scope?: { + default?: "allow" | "deny"; + rules?: { + action: "allow" | "deny"; + match?: { + channel?: string; + chatType?: "direct" | "group" | "channel"; + keyPrefix?: string; + }; + }[]; + }; + maxBytes?: number; + maxChars?: number; + prompt?: string; + timeoutSeconds?: number; + language?: string; + providerOptions?: { + [k: string]: { + [k: string]: string | number | boolean; + }; + }; + deepgram?: { + detectLanguage?: boolean; + punctuate?: boolean; + smartFormat?: boolean; + }; + baseUrl?: string; + headers?: { + [k: string]: string; + }; + attachments?: { + mode?: "first" | "all"; + maxAttachments?: number; + prefer?: "first" | "last" | "path" | "url"; + }; + models?: { + provider?: string; + model?: string; + capabilities?: ("image" | "audio" | "video")[]; + type?: "provider" | "cli"; + command?: string; + args?: string[]; + prompt?: string; + maxChars?: number; + maxBytes?: number; + timeoutSeconds?: number; + language?: string; + providerOptions?: { + [k: string]: { + [k: string]: string | number | boolean; + }; + }; + deepgram?: { + detectLanguage?: boolean; + punctuate?: boolean; + smartFormat?: boolean; + }; + baseUrl?: string; + headers?: { + [k: string]: string; + }; + profile?: string; + preferredProfile?: string; + }[]; + }; + audio?: { + enabled?: boolean; + scope?: { + default?: "allow" | "deny"; + rules?: { + action: "allow" | "deny"; + match?: { + channel?: string; + chatType?: "direct" | "group" | "channel"; + keyPrefix?: string; + }; + }[]; + }; + maxBytes?: number; + maxChars?: number; + prompt?: string; + timeoutSeconds?: number; + language?: string; + providerOptions?: { + [k: string]: { + [k: string]: string | number | boolean; + }; + }; + deepgram?: { + detectLanguage?: boolean; + punctuate?: boolean; + smartFormat?: boolean; + }; + baseUrl?: string; + headers?: { + [k: string]: string; + }; + attachments?: { + mode?: "first" | "all"; + maxAttachments?: number; + prefer?: "first" | "last" | "path" | "url"; + }; + models?: { + provider?: string; + model?: string; + capabilities?: ("image" | "audio" | "video")[]; + type?: "provider" | "cli"; + command?: string; + args?: string[]; + prompt?: string; + maxChars?: number; + maxBytes?: number; + timeoutSeconds?: number; + language?: string; + providerOptions?: { + [k: string]: { + [k: string]: string | number | boolean; + }; + }; + deepgram?: { + detectLanguage?: boolean; + punctuate?: boolean; + smartFormat?: boolean; + }; + baseUrl?: string; + headers?: { + [k: string]: string; + }; + profile?: string; + preferredProfile?: string; + }[]; + }; + video?: { + enabled?: boolean; + scope?: { + default?: "allow" | "deny"; + rules?: { + action: "allow" | "deny"; + match?: { + channel?: string; + chatType?: "direct" | "group" | "channel"; + keyPrefix?: string; + }; + }[]; + }; + maxBytes?: number; + maxChars?: number; + prompt?: string; + timeoutSeconds?: number; + language?: string; + providerOptions?: { + [k: string]: { + [k: string]: string | number | boolean; + }; + }; + deepgram?: { + detectLanguage?: boolean; + punctuate?: boolean; + smartFormat?: boolean; + }; + baseUrl?: string; + headers?: { + [k: string]: string; + }; + attachments?: { + mode?: "first" | "all"; + maxAttachments?: number; + prefer?: "first" | "last" | "path" | "url"; + }; + models?: { + provider?: string; + model?: string; + capabilities?: ("image" | "audio" | "video")[]; + type?: "provider" | "cli"; + command?: string; + args?: string[]; + prompt?: string; + maxChars?: number; + maxBytes?: number; + timeoutSeconds?: number; + language?: string; + providerOptions?: { + [k: string]: { + [k: string]: string | number | boolean; + }; + }; + deepgram?: { + detectLanguage?: boolean; + punctuate?: boolean; + smartFormat?: boolean; + }; + baseUrl?: string; + headers?: { + [k: string]: string; + }; + profile?: string; + preferredProfile?: string; + }[]; + }; + }; + links?: { + enabled?: boolean; + scope?: { + default?: "allow" | "deny"; + rules?: { + action: "allow" | "deny"; + match?: { + channel?: string; + chatType?: "direct" | "group" | "channel"; + keyPrefix?: string; + }; + }[]; + }; + maxLinks?: number; + timeoutSeconds?: number; + models?: { + type?: "cli"; + command: string; + args?: string[]; + timeoutSeconds?: number; + }[]; + }; + message?: { + allowCrossContextSend?: boolean; + crossContext?: { + allowWithinProvider?: boolean; + allowAcrossProviders?: boolean; + marker?: { + enabled?: boolean; + prefix?: string; + suffix?: string; + }; + }; + broadcast?: { + enabled?: boolean; + }; + }; + agentToAgent?: { + enabled?: boolean; + allow?: string[]; + }; + elevated?: { + enabled?: boolean; + allowFrom?: { + [k: string]: (string | number)[]; + }; + }; + exec?: { + host?: "sandbox" | "gateway" | "node"; + security?: "deny" | "allowlist" | "full"; + ask?: "off" | "on-miss" | "always"; + node?: string; + pathPrepend?: string[]; + safeBins?: string[]; + backgroundMs?: number; + timeoutSec?: number; + cleanupMs?: number; + notifyOnExit?: boolean; + applyPatch?: { + enabled?: boolean; + allowModels?: string[]; + }; + }; + subagents?: { + tools?: { + allow?: string[]; + alsoAllow?: string[]; + deny?: string[]; + }; + }; + sandbox?: { + tools?: { + allow?: string[]; + alsoAllow?: string[]; + deny?: string[]; + }; + }; + }; + bindings?: { + agentId: string; + match: { + channel: string; + accountId?: string; + peer?: { + kind: "dm" | "group" | "channel"; + id: string; + }; + guildId?: string; + teamId?: string; + }; + }[]; + broadcast?: { + strategy?: "parallel" | "sequential"; + [k: string]: string[]; + }; + audio?: { + transcription?: { + command: string[]; + timeoutSeconds?: number; + }; + }; + media?: { + preserveFilenames?: boolean; + }; + messages?: { + messagePrefix?: string; + responsePrefix?: string; + groupChat?: { + mentionPatterns?: string[]; + historyLimit?: number; + }; + queue?: { + mode?: "steer" | "followup" | "collect" | "steer-backlog" | "steer+backlog" | "queue" | "interrupt"; + byChannel?: { + whatsapp?: "steer" | "followup" | "collect" | "steer-backlog" | "steer+backlog" | "queue" | "interrupt"; + telegram?: "steer" | "followup" | "collect" | "steer-backlog" | "steer+backlog" | "queue" | "interrupt"; + discord?: "steer" | "followup" | "collect" | "steer-backlog" | "steer+backlog" | "queue" | "interrupt"; + slack?: "steer" | "followup" | "collect" | "steer-backlog" | "steer+backlog" | "queue" | "interrupt"; + mattermost?: "steer" | "followup" | "collect" | "steer-backlog" | "steer+backlog" | "queue" | "interrupt"; + signal?: "steer" | "followup" | "collect" | "steer-backlog" | "steer+backlog" | "queue" | "interrupt"; + imessage?: "steer" | "followup" | "collect" | "steer-backlog" | "steer+backlog" | "queue" | "interrupt"; + msteams?: "steer" | "followup" | "collect" | "steer-backlog" | "steer+backlog" | "queue" | "interrupt"; + webchat?: "steer" | "followup" | "collect" | "steer-backlog" | "steer+backlog" | "queue" | "interrupt"; + }; + debounceMs?: number; + debounceMsByChannel?: { + [k: string]: number; + }; + cap?: number; + drop?: "old" | "new" | "summarize"; + }; + inbound?: { + debounceMs?: number; + byChannel?: { + [k: string]: number; + }; + }; + ackReaction?: string; + ackReactionScope?: "group-mentions" | "group-all" | "direct" | "all"; + removeAckAfterReply?: boolean; + tts?: { + auto?: "off" | "always" | "inbound" | "tagged"; + enabled?: boolean; + mode?: "final" | "all"; + provider?: "elevenlabs" | "openai" | "edge"; + summaryModel?: string; + modelOverrides?: { + enabled?: boolean; + allowText?: boolean; + allowProvider?: boolean; + allowVoice?: boolean; + allowModelId?: boolean; + allowVoiceSettings?: boolean; + allowNormalization?: boolean; + allowSeed?: boolean; + }; + elevenlabs?: { + apiKey?: string; + baseUrl?: string; + voiceId?: string; + modelId?: string; + seed?: number; + applyTextNormalization?: "auto" | "on" | "off"; + languageCode?: string; + voiceSettings?: { + stability?: number; + similarityBoost?: number; + style?: number; + useSpeakerBoost?: boolean; + speed?: number; + }; + }; + openai?: { + apiKey?: string; + model?: string; + voice?: string; + }; + edge?: { + enabled?: boolean; + voice?: string; + lang?: string; + outputFormat?: string; + pitch?: string; + rate?: string; + volume?: string; + saveSubtitles?: boolean; + proxy?: string; + timeoutMs?: number; + }; + prefsPath?: string; + maxTextLength?: number; + timeoutMs?: number; + }; + }; + commands: { + native: boolean | "auto"; + nativeSkills: boolean | "auto"; + text?: boolean; + bash?: boolean; + bashForegroundMs?: number; + config?: boolean; + debug?: boolean; + restart?: boolean; + useAccessGroups?: boolean; + }; + approvals?: { + exec?: { + enabled?: boolean; + mode?: "session" | "targets" | "both"; + agentFilter?: string[]; + sessionFilter?: string[]; + targets?: { + channel: string; + to: string; + accountId?: string; + threadId?: string | number; + }[]; + }; + }; + session?: { + scope?: "per-sender" | "global"; + dmScope?: "main" | "per-peer" | "per-channel-peer"; + identityLinks?: { + [k: string]: string[]; + }; + resetTriggers?: string[]; + idleMinutes?: number; + reset?: { + mode?: "daily" | "idle"; + atHour?: number; + idleMinutes?: number; + }; + resetByType?: { + dm?: { + mode?: "daily" | "idle"; + atHour?: number; + idleMinutes?: number; + }; + group?: { + mode?: "daily" | "idle"; + atHour?: number; + idleMinutes?: number; + }; + thread?: { + mode?: "daily" | "idle"; + atHour?: number; + idleMinutes?: number; + }; + }; + resetByChannel?: { + [k: string]: { + mode?: "daily" | "idle"; + atHour?: number; + idleMinutes?: number; + }; + }; + store?: string; + typingIntervalSeconds?: number; + typingMode?: "never" | "instant" | "thinking" | "message"; + mainKey?: string; + sendPolicy?: { + default?: "allow" | "deny"; + rules?: { + action: "allow" | "deny"; + match?: { + channel?: string; + chatType?: "direct" | "group" | "channel"; + keyPrefix?: string; + }; + }[]; + }; + agentToAgent?: { + maxPingPongTurns?: number; + }; + }; + cron?: { + enabled?: boolean; + store?: string; + maxConcurrentRuns?: number; + }; + hooks?: { + enabled?: boolean; + path?: string; + token?: string; + maxBodyBytes?: number; + presets?: string[]; + transformsDir?: string; + mappings?: { + id?: string; + match?: { + path?: string; + source?: string; + }; + action?: "wake" | "agent"; + wakeMode?: "now" | "next-heartbeat"; + name?: string; + sessionKey?: string; + messageTemplate?: string; + textTemplate?: string; + deliver?: boolean; + allowUnsafeExternalContent?: boolean; + channel?: "last" | "whatsapp" | "telegram" | "discord" | "slack" | "signal" | "imessage" | "msteams"; + to?: string; + model?: string; + thinking?: string; + timeoutSeconds?: number; + transform?: { + module: string; + export?: string; + }; + }[]; + gmail?: { + account?: string; + label?: string; + topic?: string; + subscription?: string; + pushToken?: string; + hookUrl?: string; + includeBody?: boolean; + maxBytes?: number; + renewEveryMinutes?: number; + allowUnsafeExternalContent?: boolean; + serve?: { + bind?: string; + port?: number; + path?: string; + }; + tailscale?: { + mode?: "off" | "serve" | "funnel"; + path?: string; + target?: string; + }; + model?: string; + thinking?: "off" | "minimal" | "low" | "medium" | "high"; + }; + internal?: { + enabled?: boolean; + handlers?: { + event: string; + module: string; + export?: string; + }[]; + entries?: { + [k: string]: { + enabled?: boolean; + env?: { + [k: string]: string; + }; + }; + }; + load?: { + extraDirs?: string[]; + }; + installs?: { + [k: string]: { + source: "npm" | "archive" | "path"; + spec?: string; + sourcePath?: string; + installPath?: string; + version?: string; + installedAt?: string; + hooks?: string[]; + }; + }; + }; + }; + web?: { + enabled?: boolean; + heartbeatSeconds?: number; + reconnect?: { + initialMs?: number; + maxMs?: number; + factor?: number; + jitter?: number; + maxAttempts?: number; + }; + }; + channels?: { + defaults?: { + groupPolicy?: "open" | "disabled" | "allowlist"; + heartbeat?: { + showOk?: boolean; + showAlerts?: boolean; + useIndicator?: boolean; + }; + }; + whatsapp?: { + accounts?: { + [k: string]: { + name?: string; + capabilities?: string[]; + markdown?: { + tables?: "off" | "bullets" | "code"; + }; + configWrites?: boolean; + enabled?: boolean; + sendReadReceipts?: boolean; + messagePrefix?: string; + authDir?: string; + dmPolicy: "pairing" | "allowlist" | "open" | "disabled"; + selfChatMode?: boolean; + allowFrom?: string[]; + groupAllowFrom?: string[]; + groupPolicy: "open" | "disabled" | "allowlist"; + historyLimit?: number; + dmHistoryLimit?: number; + dms?: { + [k: string]: { + historyLimit?: number; + }; + }; + textChunkLimit?: number; + chunkMode?: "length" | "newline"; + mediaMaxMb?: number; + blockStreaming?: boolean; + blockStreamingCoalesce?: { + minChars?: number; + maxChars?: number; + idleMs?: number; + }; + groups?: { + [k: string]: { + requireMention?: boolean; + tools?: { + allow?: string[]; + alsoAllow?: string[]; + deny?: string[]; + }; + toolsBySender?: { + [k: string]: { + allow?: string[]; + alsoAllow?: string[]; + deny?: string[]; + }; + }; + }; + }; + ackReaction?: { + emoji?: string; + direct: boolean; + group: "always" | "mentions" | "never"; + }; + debounceMs: number; + heartbeat?: { + showOk?: boolean; + showAlerts?: boolean; + useIndicator?: boolean; + }; + }; + }; + capabilities?: string[]; + markdown?: { + tables?: "off" | "bullets" | "code"; + }; + configWrites?: boolean; + sendReadReceipts?: boolean; + dmPolicy: "pairing" | "allowlist" | "open" | "disabled"; + messagePrefix?: string; + selfChatMode?: boolean; + allowFrom?: string[]; + groupAllowFrom?: string[]; + groupPolicy: "open" | "disabled" | "allowlist"; + historyLimit?: number; + dmHistoryLimit?: number; + dms?: { + [k: string]: { + historyLimit?: number; + }; + }; + textChunkLimit?: number; + chunkMode?: "length" | "newline"; + mediaMaxMb: number; + blockStreaming?: boolean; + blockStreamingCoalesce?: { + minChars?: number; + maxChars?: number; + idleMs?: number; + }; + actions?: { + reactions?: boolean; + sendMessage?: boolean; + polls?: boolean; + }; + groups?: { + [k: string]: { + requireMention?: boolean; + tools?: { + allow?: string[]; + alsoAllow?: string[]; + deny?: string[]; + }; + toolsBySender?: { + [k: string]: { + allow?: string[]; + alsoAllow?: string[]; + deny?: string[]; + }; + }; + }; + }; + ackReaction?: { + emoji?: string; + direct: boolean; + group: "always" | "mentions" | "never"; + }; + debounceMs: number; + heartbeat?: { + showOk?: boolean; + showAlerts?: boolean; + useIndicator?: boolean; + }; + }; + telegram?: { + name?: string; + capabilities?: + | string[] + | { + inlineButtons?: "off" | "dm" | "group" | "all" | "allowlist"; + }; + markdown?: { + tables?: "off" | "bullets" | "code"; + }; + enabled?: boolean; + commands?: { + native?: boolean | "auto"; + nativeSkills?: boolean | "auto"; + }; + customCommands?: { + command: unknown; + description: unknown; + }[]; + configWrites?: boolean; + dmPolicy: "pairing" | "allowlist" | "open" | "disabled"; + botToken?: string; + tokenFile?: string; + replyToMode?: "off" | "first" | "all"; + groups?: { + [k: string]: { + requireMention?: boolean; + tools?: { + allow?: string[]; + alsoAllow?: string[]; + deny?: string[]; + }; + toolsBySender?: { + [k: string]: { + allow?: string[]; + alsoAllow?: string[]; + deny?: string[]; + }; + }; + skills?: string[]; + enabled?: boolean; + allowFrom?: (string | number)[]; + systemPrompt?: string; + topics?: { + [k: string]: { + requireMention?: boolean; + skills?: string[]; + enabled?: boolean; + allowFrom?: (string | number)[]; + systemPrompt?: string; + }; + }; + }; + }; + allowFrom?: (string | number)[]; + groupAllowFrom?: (string | number)[]; + groupPolicy: "open" | "disabled" | "allowlist"; + historyLimit?: number; + dmHistoryLimit?: number; + dms?: { + [k: string]: { + historyLimit?: number; + }; + }; + textChunkLimit?: number; + chunkMode?: "length" | "newline"; + blockStreaming?: boolean; + draftChunk?: { + minChars?: number; + maxChars?: number; + breakPreference?: "paragraph" | "newline" | "sentence"; + }; + blockStreamingCoalesce?: { + minChars?: number; + maxChars?: number; + idleMs?: number; + }; + streamMode: "off" | "partial" | "block"; + mediaMaxMb?: number; + timeoutSeconds?: number; + retry?: { + attempts?: number; + minDelayMs?: number; + maxDelayMs?: number; + jitter?: number; + }; + network?: { + autoSelectFamily?: boolean; + }; + proxy?: string; + webhookUrl?: string; + webhookSecret?: string; + webhookPath?: string; + actions?: { + reactions?: boolean; + sendMessage?: boolean; + deleteMessage?: boolean; + }; + reactionNotifications?: "off" | "own" | "all"; + reactionLevel?: "off" | "ack" | "minimal" | "extensive"; + heartbeat?: { + showOk?: boolean; + showAlerts?: boolean; + useIndicator?: boolean; + }; + linkPreview?: boolean; + accounts?: { + [k: string]: { + name?: string; + capabilities?: + | string[] + | { + inlineButtons?: "off" | "dm" | "group" | "all" | "allowlist"; + }; + markdown?: { + tables?: "off" | "bullets" | "code"; + }; + enabled?: boolean; + commands?: { + native?: boolean | "auto"; + nativeSkills?: boolean | "auto"; + }; + customCommands?: { + command: unknown; + description: unknown; + }[]; + configWrites?: boolean; + dmPolicy: "pairing" | "allowlist" | "open" | "disabled"; + botToken?: string; + tokenFile?: string; + replyToMode?: "off" | "first" | "all"; + groups?: { + [k: string]: { + requireMention?: boolean; + tools?: { + allow?: string[]; + alsoAllow?: string[]; + deny?: string[]; + }; + toolsBySender?: { + [k: string]: { + allow?: string[]; + alsoAllow?: string[]; + deny?: string[]; + }; + }; + skills?: string[]; + enabled?: boolean; + allowFrom?: (string | number)[]; + systemPrompt?: string; + topics?: { + [k: string]: { + requireMention?: boolean; + skills?: string[]; + enabled?: boolean; + allowFrom?: (string | number)[]; + systemPrompt?: string; + }; + }; + }; + }; + allowFrom?: (string | number)[]; + groupAllowFrom?: (string | number)[]; + groupPolicy: "open" | "disabled" | "allowlist"; + historyLimit?: number; + dmHistoryLimit?: number; + dms?: { + [k: string]: { + historyLimit?: number; + }; + }; + textChunkLimit?: number; + chunkMode?: "length" | "newline"; + blockStreaming?: boolean; + draftChunk?: { + minChars?: number; + maxChars?: number; + breakPreference?: "paragraph" | "newline" | "sentence"; + }; + blockStreamingCoalesce?: { + minChars?: number; + maxChars?: number; + idleMs?: number; + }; + streamMode: "off" | "partial" | "block"; + mediaMaxMb?: number; + timeoutSeconds?: number; + retry?: { + attempts?: number; + minDelayMs?: number; + maxDelayMs?: number; + jitter?: number; + }; + network?: { + autoSelectFamily?: boolean; + }; + proxy?: string; + webhookUrl?: string; + webhookSecret?: string; + webhookPath?: string; + actions?: { + reactions?: boolean; + sendMessage?: boolean; + deleteMessage?: boolean; + }; + reactionNotifications?: "off" | "own" | "all"; + reactionLevel?: "off" | "ack" | "minimal" | "extensive"; + heartbeat?: { + showOk?: boolean; + showAlerts?: boolean; + useIndicator?: boolean; + }; + linkPreview?: boolean; + }; + }; + }; + discord?: { + name?: string; + capabilities?: string[]; + markdown?: { + tables?: "off" | "bullets" | "code"; + }; + enabled?: boolean; + commands?: { + native?: boolean | "auto"; + nativeSkills?: boolean | "auto"; + }; + configWrites?: boolean; + token?: string; + allowBots?: boolean; + groupPolicy: "open" | "disabled" | "allowlist"; + historyLimit?: number; + dmHistoryLimit?: number; + dms?: { + [k: string]: { + historyLimit?: number; + }; + }; + textChunkLimit?: number; + chunkMode?: "length" | "newline"; + blockStreaming?: boolean; + blockStreamingCoalesce?: { + minChars?: number; + maxChars?: number; + idleMs?: number; + }; + maxLinesPerMessage?: number; + mediaMaxMb?: number; + retry?: { + attempts?: number; + minDelayMs?: number; + maxDelayMs?: number; + jitter?: number; + }; + actions?: { + reactions?: boolean; + stickers?: boolean; + emojiUploads?: boolean; + stickerUploads?: boolean; + polls?: boolean; + permissions?: boolean; + messages?: boolean; + threads?: boolean; + pins?: boolean; + search?: boolean; + memberInfo?: boolean; + roleInfo?: boolean; + roles?: boolean; + channelInfo?: boolean; + voiceStatus?: boolean; + events?: boolean; + moderation?: boolean; + channels?: boolean; + }; + replyToMode?: "off" | "first" | "all"; + dm?: { + enabled?: boolean; + policy: "pairing" | "allowlist" | "open" | "disabled"; + allowFrom?: (string | number)[]; + groupEnabled?: boolean; + groupChannels?: (string | number)[]; + }; + guilds?: { + [k: string]: { + slug?: string; + requireMention?: boolean; + tools?: { + allow?: string[]; + alsoAllow?: string[]; + deny?: string[]; + }; + toolsBySender?: { + [k: string]: { + allow?: string[]; + alsoAllow?: string[]; + deny?: string[]; + }; + }; + reactionNotifications?: "off" | "own" | "all" | "allowlist"; + users?: (string | number)[]; + channels?: { + [k: string]: { + allow?: boolean; + requireMention?: boolean; + tools?: { + allow?: string[]; + alsoAllow?: string[]; + deny?: string[]; + }; + toolsBySender?: { + [k: string]: { + allow?: string[]; + alsoAllow?: string[]; + deny?: string[]; + }; + }; + skills?: string[]; + enabled?: boolean; + users?: (string | number)[]; + systemPrompt?: string; + autoThread?: boolean; + }; + }; + }; + }; + heartbeat?: { + showOk?: boolean; + showAlerts?: boolean; + useIndicator?: boolean; + }; + execApprovals?: { + enabled?: boolean; + approvers?: (string | number)[]; + agentFilter?: string[]; + sessionFilter?: string[]; + }; + intents?: { + presence?: boolean; + guildMembers?: boolean; + }; + accounts?: { + [k: string]: { + name?: string; + capabilities?: string[]; + markdown?: { + tables?: "off" | "bullets" | "code"; + }; + enabled?: boolean; + commands?: { + native?: boolean | "auto"; + nativeSkills?: boolean | "auto"; + }; + configWrites?: boolean; + token?: string; + allowBots?: boolean; + groupPolicy: "open" | "disabled" | "allowlist"; + historyLimit?: number; + dmHistoryLimit?: number; + dms?: { + [k: string]: { + historyLimit?: number; + }; + }; + textChunkLimit?: number; + chunkMode?: "length" | "newline"; + blockStreaming?: boolean; + blockStreamingCoalesce?: { + minChars?: number; + maxChars?: number; + idleMs?: number; + }; + maxLinesPerMessage?: number; + mediaMaxMb?: number; + retry?: { + attempts?: number; + minDelayMs?: number; + maxDelayMs?: number; + jitter?: number; + }; + actions?: { + reactions?: boolean; + stickers?: boolean; + emojiUploads?: boolean; + stickerUploads?: boolean; + polls?: boolean; + permissions?: boolean; + messages?: boolean; + threads?: boolean; + pins?: boolean; + search?: boolean; + memberInfo?: boolean; + roleInfo?: boolean; + roles?: boolean; + channelInfo?: boolean; + voiceStatus?: boolean; + events?: boolean; + moderation?: boolean; + channels?: boolean; + }; + replyToMode?: "off" | "first" | "all"; + dm?: { + enabled?: boolean; + policy: "pairing" | "allowlist" | "open" | "disabled"; + allowFrom?: (string | number)[]; + groupEnabled?: boolean; + groupChannels?: (string | number)[]; + }; + guilds?: { + [k: string]: { + slug?: string; + requireMention?: boolean; + tools?: { + allow?: string[]; + alsoAllow?: string[]; + deny?: string[]; + }; + toolsBySender?: { + [k: string]: { + allow?: string[]; + alsoAllow?: string[]; + deny?: string[]; + }; + }; + reactionNotifications?: "off" | "own" | "all" | "allowlist"; + users?: (string | number)[]; + channels?: { + [k: string]: { + allow?: boolean; + requireMention?: boolean; + tools?: { + allow?: string[]; + alsoAllow?: string[]; + deny?: string[]; + }; + toolsBySender?: { + [k: string]: { + allow?: string[]; + alsoAllow?: string[]; + deny?: string[]; + }; + }; + skills?: string[]; + enabled?: boolean; + users?: (string | number)[]; + systemPrompt?: string; + autoThread?: boolean; + }; + }; + }; + }; + heartbeat?: { + showOk?: boolean; + showAlerts?: boolean; + useIndicator?: boolean; + }; + execApprovals?: { + enabled?: boolean; + approvers?: (string | number)[]; + agentFilter?: string[]; + sessionFilter?: string[]; + }; + intents?: { + presence?: boolean; + guildMembers?: boolean; + }; + }; + }; + }; + googlechat?: { + name?: string; + capabilities?: string[]; + enabled?: boolean; + configWrites?: boolean; + allowBots?: boolean; + requireMention?: boolean; + groupPolicy: "open" | "disabled" | "allowlist"; + groupAllowFrom?: (string | number)[]; + groups?: { + [k: string]: { + enabled?: boolean; + allow?: boolean; + requireMention?: boolean; + users?: (string | number)[]; + systemPrompt?: string; + }; + }; + serviceAccount?: + | string + | { + [k: string]: unknown; + }; + serviceAccountFile?: string; + audienceType?: "app-url" | "project-number"; + audience?: string; + webhookPath?: string; + webhookUrl?: string; + botUser?: string; + historyLimit?: number; + dmHistoryLimit?: number; + dms?: { + [k: string]: { + historyLimit?: number; + }; + }; + textChunkLimit?: number; + chunkMode?: "length" | "newline"; + blockStreaming?: boolean; + blockStreamingCoalesce?: { + minChars?: number; + maxChars?: number; + idleMs?: number; + }; + mediaMaxMb?: number; + replyToMode?: "off" | "first" | "all"; + actions?: { + reactions?: boolean; + }; + dm?: { + enabled?: boolean; + policy: "pairing" | "allowlist" | "open" | "disabled"; + allowFrom?: (string | number)[]; + }; + typingIndicator?: "none" | "message" | "reaction"; + accounts?: { + [k: string]: { + name?: string; + capabilities?: string[]; + enabled?: boolean; + configWrites?: boolean; + allowBots?: boolean; + requireMention?: boolean; + groupPolicy: "open" | "disabled" | "allowlist"; + groupAllowFrom?: (string | number)[]; + groups?: { + [k: string]: { + enabled?: boolean; + allow?: boolean; + requireMention?: boolean; + users?: (string | number)[]; + systemPrompt?: string; + }; + }; + serviceAccount?: + | string + | { + [k: string]: unknown; + }; + serviceAccountFile?: string; + audienceType?: "app-url" | "project-number"; + audience?: string; + webhookPath?: string; + webhookUrl?: string; + botUser?: string; + historyLimit?: number; + dmHistoryLimit?: number; + dms?: { + [k: string]: { + historyLimit?: number; + }; + }; + textChunkLimit?: number; + chunkMode?: "length" | "newline"; + blockStreaming?: boolean; + blockStreamingCoalesce?: { + minChars?: number; + maxChars?: number; + idleMs?: number; + }; + mediaMaxMb?: number; + replyToMode?: "off" | "first" | "all"; + actions?: { + reactions?: boolean; + }; + dm?: { + enabled?: boolean; + policy: "pairing" | "allowlist" | "open" | "disabled"; + allowFrom?: (string | number)[]; + }; + typingIndicator?: "none" | "message" | "reaction"; + }; + }; + defaultAccount?: string; + }; + slack?: { + name?: string; + mode: "socket" | "http"; + signingSecret?: string; + webhookPath: string; + capabilities?: string[]; + markdown?: { + tables?: "off" | "bullets" | "code"; + }; + enabled?: boolean; + commands?: { + native?: boolean | "auto"; + nativeSkills?: boolean | "auto"; + }; + configWrites?: boolean; + botToken?: string; + appToken?: string; + userToken?: string; + userTokenReadOnly: boolean; + allowBots?: boolean; + requireMention?: boolean; + groupPolicy: "open" | "disabled" | "allowlist"; + historyLimit?: number; + dmHistoryLimit?: number; + dms?: { + [k: string]: { + historyLimit?: number; + }; + }; + textChunkLimit?: number; + chunkMode?: "length" | "newline"; + blockStreaming?: boolean; + blockStreamingCoalesce?: { + minChars?: number; + maxChars?: number; + idleMs?: number; + }; + mediaMaxMb?: number; + reactionNotifications?: "off" | "own" | "all" | "allowlist"; + reactionAllowlist?: (string | number)[]; + replyToMode?: "off" | "first" | "all"; + replyToModeByChatType?: { + direct?: "off" | "first" | "all"; + group?: "off" | "first" | "all"; + channel?: "off" | "first" | "all"; + }; + thread?: { + historyScope?: "thread" | "channel"; + inheritParent?: boolean; + }; + actions?: { + reactions?: boolean; + messages?: boolean; + pins?: boolean; + search?: boolean; + permissions?: boolean; + memberInfo?: boolean; + channelInfo?: boolean; + emojiList?: boolean; + }; + slashCommand?: { + enabled?: boolean; + name?: string; + sessionPrefix?: string; + ephemeral?: boolean; + }; + dm?: { + enabled?: boolean; + policy: "pairing" | "allowlist" | "open" | "disabled"; + allowFrom?: (string | number)[]; + groupEnabled?: boolean; + groupChannels?: (string | number)[]; + replyToMode?: "off" | "first" | "all"; + }; + channels?: { + [k: string]: { + enabled?: boolean; + allow?: boolean; + requireMention?: boolean; + tools?: { + allow?: string[]; + alsoAllow?: string[]; + deny?: string[]; + }; + toolsBySender?: { + [k: string]: { + allow?: string[]; + alsoAllow?: string[]; + deny?: string[]; + }; + }; + allowBots?: boolean; + users?: (string | number)[]; + skills?: string[]; + systemPrompt?: string; + }; + }; + heartbeat?: { + showOk?: boolean; + showAlerts?: boolean; + useIndicator?: boolean; + }; + accounts?: { + [k: string]: { + name?: string; + mode?: "socket" | "http"; + signingSecret?: string; + webhookPath?: string; + capabilities?: string[]; + markdown?: { + tables?: "off" | "bullets" | "code"; + }; + enabled?: boolean; + commands?: { + native?: boolean | "auto"; + nativeSkills?: boolean | "auto"; + }; + configWrites?: boolean; + botToken?: string; + appToken?: string; + userToken?: string; + userTokenReadOnly: boolean; + allowBots?: boolean; + requireMention?: boolean; + groupPolicy: "open" | "disabled" | "allowlist"; + historyLimit?: number; + dmHistoryLimit?: number; + dms?: { + [k: string]: { + historyLimit?: number; + }; + }; + textChunkLimit?: number; + chunkMode?: "length" | "newline"; + blockStreaming?: boolean; + blockStreamingCoalesce?: { + minChars?: number; + maxChars?: number; + idleMs?: number; + }; + mediaMaxMb?: number; + reactionNotifications?: "off" | "own" | "all" | "allowlist"; + reactionAllowlist?: (string | number)[]; + replyToMode?: "off" | "first" | "all"; + replyToModeByChatType?: { + direct?: "off" | "first" | "all"; + group?: "off" | "first" | "all"; + channel?: "off" | "first" | "all"; + }; + thread?: { + historyScope?: "thread" | "channel"; + inheritParent?: boolean; + }; + actions?: { + reactions?: boolean; + messages?: boolean; + pins?: boolean; + search?: boolean; + permissions?: boolean; + memberInfo?: boolean; + channelInfo?: boolean; + emojiList?: boolean; + }; + slashCommand?: { + enabled?: boolean; + name?: string; + sessionPrefix?: string; + ephemeral?: boolean; + }; + dm?: { + enabled?: boolean; + policy: "pairing" | "allowlist" | "open" | "disabled"; + allowFrom?: (string | number)[]; + groupEnabled?: boolean; + groupChannels?: (string | number)[]; + replyToMode?: "off" | "first" | "all"; + }; + channels?: { + [k: string]: { + enabled?: boolean; + allow?: boolean; + requireMention?: boolean; + tools?: { + allow?: string[]; + alsoAllow?: string[]; + deny?: string[]; + }; + toolsBySender?: { + [k: string]: { + allow?: string[]; + alsoAllow?: string[]; + deny?: string[]; + }; + }; + allowBots?: boolean; + users?: (string | number)[]; + skills?: string[]; + systemPrompt?: string; + }; + }; + heartbeat?: { + showOk?: boolean; + showAlerts?: boolean; + useIndicator?: boolean; + }; + }; + }; + }; + signal?: { + name?: string; + capabilities?: string[]; + markdown?: { + tables?: "off" | "bullets" | "code"; + }; + enabled?: boolean; + configWrites?: boolean; + account?: string; + httpUrl?: string; + httpHost?: string; + httpPort?: number; + cliPath?: string; + autoStart?: boolean; + startupTimeoutMs?: number; + receiveMode?: "on-start" | "manual"; + ignoreAttachments?: boolean; + ignoreStories?: boolean; + sendReadReceipts?: boolean; + dmPolicy: "pairing" | "allowlist" | "open" | "disabled"; + allowFrom?: (string | number)[]; + groupAllowFrom?: (string | number)[]; + groupPolicy: "open" | "disabled" | "allowlist"; + historyLimit?: number; + dmHistoryLimit?: number; + dms?: { + [k: string]: { + historyLimit?: number; + }; + }; + textChunkLimit?: number; + chunkMode?: "length" | "newline"; + blockStreaming?: boolean; + blockStreamingCoalesce?: { + minChars?: number; + maxChars?: number; + idleMs?: number; + }; + mediaMaxMb?: number; + reactionNotifications?: "off" | "own" | "all" | "allowlist"; + reactionAllowlist?: (string | number)[]; + actions?: { + reactions?: boolean; + }; + reactionLevel?: "off" | "ack" | "minimal" | "extensive"; + heartbeat?: { + showOk?: boolean; + showAlerts?: boolean; + useIndicator?: boolean; + }; + accounts?: { + [k: string]: { + name?: string; + capabilities?: string[]; + markdown?: { + tables?: "off" | "bullets" | "code"; + }; + enabled?: boolean; + configWrites?: boolean; + account?: string; + httpUrl?: string; + httpHost?: string; + httpPort?: number; + cliPath?: string; + autoStart?: boolean; + startupTimeoutMs?: number; + receiveMode?: "on-start" | "manual"; + ignoreAttachments?: boolean; + ignoreStories?: boolean; + sendReadReceipts?: boolean; + dmPolicy: "pairing" | "allowlist" | "open" | "disabled"; + allowFrom?: (string | number)[]; + groupAllowFrom?: (string | number)[]; + groupPolicy: "open" | "disabled" | "allowlist"; + historyLimit?: number; + dmHistoryLimit?: number; + dms?: { + [k: string]: { + historyLimit?: number; + }; + }; + textChunkLimit?: number; + chunkMode?: "length" | "newline"; + blockStreaming?: boolean; + blockStreamingCoalesce?: { + minChars?: number; + maxChars?: number; + idleMs?: number; + }; + mediaMaxMb?: number; + reactionNotifications?: "off" | "own" | "all" | "allowlist"; + reactionAllowlist?: (string | number)[]; + actions?: { + reactions?: boolean; + }; + reactionLevel?: "off" | "ack" | "minimal" | "extensive"; + heartbeat?: { + showOk?: boolean; + showAlerts?: boolean; + useIndicator?: boolean; + }; + }; + }; + }; + imessage?: { + name?: string; + capabilities?: string[]; + markdown?: { + tables?: "off" | "bullets" | "code"; + }; + enabled?: boolean; + configWrites?: boolean; + cliPath?: string; + dbPath?: string; + remoteHost?: string; + service?: "imessage" | "sms" | "auto"; + region?: string; + dmPolicy: "pairing" | "allowlist" | "open" | "disabled"; + allowFrom?: (string | number)[]; + groupAllowFrom?: (string | number)[]; + groupPolicy: "open" | "disabled" | "allowlist"; + historyLimit?: number; + dmHistoryLimit?: number; + dms?: { + [k: string]: { + historyLimit?: number; + }; + }; + includeAttachments?: boolean; + mediaMaxMb?: number; + textChunkLimit?: number; + chunkMode?: "length" | "newline"; + blockStreaming?: boolean; + blockStreamingCoalesce?: { + minChars?: number; + maxChars?: number; + idleMs?: number; + }; + groups?: { + [k: string]: { + requireMention?: boolean; + tools?: { + allow?: string[]; + alsoAllow?: string[]; + deny?: string[]; + }; + toolsBySender?: { + [k: string]: { + allow?: string[]; + alsoAllow?: string[]; + deny?: string[]; + }; + }; + }; + }; + heartbeat?: { + showOk?: boolean; + showAlerts?: boolean; + useIndicator?: boolean; + }; + accounts?: { + [k: string]: { + name?: string; + capabilities?: string[]; + markdown?: { + tables?: "off" | "bullets" | "code"; + }; + enabled?: boolean; + configWrites?: boolean; + cliPath?: string; + dbPath?: string; + remoteHost?: string; + service?: "imessage" | "sms" | "auto"; + region?: string; + dmPolicy: "pairing" | "allowlist" | "open" | "disabled"; + allowFrom?: (string | number)[]; + groupAllowFrom?: (string | number)[]; + groupPolicy: "open" | "disabled" | "allowlist"; + historyLimit?: number; + dmHistoryLimit?: number; + dms?: { + [k: string]: { + historyLimit?: number; + }; + }; + includeAttachments?: boolean; + mediaMaxMb?: number; + textChunkLimit?: number; + chunkMode?: "length" | "newline"; + blockStreaming?: boolean; + blockStreamingCoalesce?: { + minChars?: number; + maxChars?: number; + idleMs?: number; + }; + groups?: { + [k: string]: { + requireMention?: boolean; + tools?: { + allow?: string[]; + alsoAllow?: string[]; + deny?: string[]; + }; + toolsBySender?: { + [k: string]: { + allow?: string[]; + alsoAllow?: string[]; + deny?: string[]; + }; + }; + }; + }; + heartbeat?: { + showOk?: boolean; + showAlerts?: boolean; + useIndicator?: boolean; + }; + }; + }; + }; + bluebubbles?: { + name?: string; + capabilities?: string[]; + markdown?: { + tables?: "off" | "bullets" | "code"; + }; + configWrites?: boolean; + enabled?: boolean; + serverUrl?: string; + password?: string; + webhookPath?: string; + dmPolicy: "pairing" | "allowlist" | "open" | "disabled"; + allowFrom?: (string | number)[]; + groupAllowFrom?: (string | number)[]; + groupPolicy: "open" | "disabled" | "allowlist"; + historyLimit?: number; + dmHistoryLimit?: number; + dms?: { + [k: string]: { + historyLimit?: number; + }; + }; + textChunkLimit?: number; + chunkMode?: "length" | "newline"; + mediaMaxMb?: number; + sendReadReceipts?: boolean; + blockStreaming?: boolean; + blockStreamingCoalesce?: { + minChars?: number; + maxChars?: number; + idleMs?: number; + }; + groups?: { + [k: string]: { + requireMention?: boolean; + tools?: { + allow?: string[]; + alsoAllow?: string[]; + deny?: string[]; + }; + toolsBySender?: { + [k: string]: { + allow?: string[]; + alsoAllow?: string[]; + deny?: string[]; + }; + }; + }; + }; + heartbeat?: { + showOk?: boolean; + showAlerts?: boolean; + useIndicator?: boolean; + }; + accounts?: { + [k: string]: { + name?: string; + capabilities?: string[]; + markdown?: { + tables?: "off" | "bullets" | "code"; + }; + configWrites?: boolean; + enabled?: boolean; + serverUrl?: string; + password?: string; + webhookPath?: string; + dmPolicy: "pairing" | "allowlist" | "open" | "disabled"; + allowFrom?: (string | number)[]; + groupAllowFrom?: (string | number)[]; + groupPolicy: "open" | "disabled" | "allowlist"; + historyLimit?: number; + dmHistoryLimit?: number; + dms?: { + [k: string]: { + historyLimit?: number; + }; + }; + textChunkLimit?: number; + chunkMode?: "length" | "newline"; + mediaMaxMb?: number; + sendReadReceipts?: boolean; + blockStreaming?: boolean; + blockStreamingCoalesce?: { + minChars?: number; + maxChars?: number; + idleMs?: number; + }; + groups?: { + [k: string]: { + requireMention?: boolean; + tools?: { + allow?: string[]; + alsoAllow?: string[]; + deny?: string[]; + }; + toolsBySender?: { + [k: string]: { + allow?: string[]; + alsoAllow?: string[]; + deny?: string[]; + }; + }; + }; + }; + heartbeat?: { + showOk?: boolean; + showAlerts?: boolean; + useIndicator?: boolean; + }; + }; + }; + actions?: { + reactions?: boolean; + edit?: boolean; + unsend?: boolean; + reply?: boolean; + sendWithEffect?: boolean; + renameGroup?: boolean; + setGroupIcon?: boolean; + addParticipant?: boolean; + removeParticipant?: boolean; + leaveGroup?: boolean; + sendAttachment?: boolean; + }; + }; + msteams?: { + enabled?: boolean; + capabilities?: string[]; + markdown?: { + tables?: "off" | "bullets" | "code"; + }; + configWrites?: boolean; + appId?: string; + appPassword?: string; + tenantId?: string; + webhook?: { + port?: number; + path?: string; + }; + dmPolicy: "pairing" | "allowlist" | "open" | "disabled"; + allowFrom?: string[]; + groupAllowFrom?: string[]; + groupPolicy: "open" | "disabled" | "allowlist"; + textChunkLimit?: number; + chunkMode?: "length" | "newline"; + blockStreamingCoalesce?: { + minChars?: number; + maxChars?: number; + idleMs?: number; + }; + mediaAllowHosts?: string[]; + requireMention?: boolean; + historyLimit?: number; + dmHistoryLimit?: number; + dms?: { + [k: string]: { + historyLimit?: number; + }; + }; + replyStyle?: "thread" | "top-level"; + teams?: { + [k: string]: { + requireMention?: boolean; + tools?: { + allow?: string[]; + alsoAllow?: string[]; + deny?: string[]; + }; + toolsBySender?: { + [k: string]: { + allow?: string[]; + alsoAllow?: string[]; + deny?: string[]; + }; + }; + replyStyle?: "thread" | "top-level"; + channels?: { + [k: string]: { + requireMention?: boolean; + tools?: { + allow?: string[]; + alsoAllow?: string[]; + deny?: string[]; + }; + toolsBySender?: { + [k: string]: { + allow?: string[]; + alsoAllow?: string[]; + deny?: string[]; + }; + }; + replyStyle?: "thread" | "top-level"; + }; + }; + }; + }; + mediaMaxMb?: number; + sharePointSiteId?: string; + heartbeat?: { + showOk?: boolean; + showAlerts?: boolean; + useIndicator?: boolean; + }; + }; + [k: string]: unknown; + }; + discovery?: { + wideArea?: { + enabled?: boolean; + }; + mdns?: { + mode?: "off" | "minimal" | "full"; + }; + }; + canvasHost?: { + enabled?: boolean; + root?: string; + port?: number; + liveReload?: boolean; + }; + talk?: { + voiceId?: string; + voiceAliases?: { + [k: string]: string; + }; + modelId?: string; + outputFormat?: string; + apiKey?: string; + interruptOnSpeech?: boolean; + }; + gateway?: { + port?: number; + mode?: "local" | "remote"; + bind?: "auto" | "lan" | "loopback" | "custom" | "tailnet"; + controlUi?: { + enabled?: boolean; + basePath?: string; + allowInsecureAuth?: boolean; + dangerouslyDisableDeviceAuth?: boolean; + }; + auth?: { + mode?: "token" | "password"; + token?: string; + password?: string; + allowTailscale?: boolean; + }; + trustedProxies?: string[]; + tailscale?: { + mode?: "off" | "serve" | "funnel"; + resetOnExit?: boolean; + }; + remote?: { + url?: string; + transport?: "ssh" | "direct"; + token?: string; + password?: string; + tlsFingerprint?: string; + sshTarget?: string; + sshIdentity?: string; + }; + reload?: { + mode?: "off" | "restart" | "hot" | "hybrid"; + debounceMs?: number; + }; + tls?: { + enabled?: boolean; + autoGenerate?: boolean; + certPath?: string; + keyPath?: string; + caPath?: string; + }; + http?: { + endpoints?: { + chatCompletions?: { + enabled?: boolean; + }; + responses?: { + enabled?: boolean; + maxBodyBytes?: number; + files?: { + allowUrl?: boolean; + allowedMimes?: string[]; + maxBytes?: number; + maxChars?: number; + maxRedirects?: number; + timeoutMs?: number; + pdf?: { + maxPages?: number; + maxPixels?: number; + minTextChars?: number; + }; + }; + images?: { + allowUrl?: boolean; + allowedMimes?: string[]; + maxBytes?: number; + maxRedirects?: number; + timeoutMs?: number; + }; + }; + }; + }; + nodes?: { + browser?: { + mode?: "auto" | "manual" | "off"; + node?: string; + }; + allowCommands?: string[]; + denyCommands?: string[]; + }; + }; + skills?: { + allowBundled?: string[]; + load?: { + extraDirs?: string[]; + watch?: boolean; + watchDebounceMs?: number; + }; + install?: { + preferBrew?: boolean; + nodeManager?: "npm" | "pnpm" | "yarn" | "bun"; + }; + entries?: { + [k: string]: { + enabled?: boolean; + apiKey?: string; + env?: { + [k: string]: string; + }; + config?: { + [k: string]: unknown; + }; + }; + }; + }; + plugins?: { + enabled?: boolean; + allow?: string[]; + deny?: string[]; + load?: { + paths?: string[]; + }; + slots?: { + memory?: string; + }; + entries?: { + [k: string]: { + enabled?: boolean; + config?: { + [k: string]: unknown; + }; + }; + }; + installs?: { + [k: string]: { + source: "npm" | "archive" | "path"; + spec?: string; + sourcePath?: string; + installPath?: string; + version?: string; + installedAt?: string; + }; + }; + }; +} diff --git a/schemas/clawdbot.schema.json b/schemas/clawdbot.schema.json new file mode 100644 index 000000000..b3fa36884 --- /dev/null +++ b/schemas/clawdbot.schema.json @@ -0,0 +1,13269 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "type": "object", + "properties": { + "meta": { + "type": "object", + "properties": { + "lastTouchedVersion": { + "type": "string" + }, + "lastTouchedAt": { + "type": "string" + } + }, + "additionalProperties": false + }, + "env": { + "type": "object", + "properties": { + "shellEnv": { + "type": "object", + "properties": { + "enabled": { + "type": "boolean" + }, + "timeoutMs": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + } + }, + "additionalProperties": false + }, + "vars": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "string" + } + } + }, + "additionalProperties": { + "type": "string" + } + }, + "wizard": { + "type": "object", + "properties": { + "lastRunAt": { + "type": "string" + }, + "lastRunVersion": { + "type": "string" + }, + "lastRunCommit": { + "type": "string" + }, + "lastRunCommand": { + "type": "string" + }, + "lastRunMode": { + "anyOf": [ + { + "type": "string", + "const": "local" + }, + { + "type": "string", + "const": "remote" + } + ] + } + }, + "additionalProperties": false + }, + "diagnostics": { + "type": "object", + "properties": { + "enabled": { + "type": "boolean" + }, + "flags": { + "type": "array", + "items": { + "type": "string" + } + }, + "otel": { + "type": "object", + "properties": { + "enabled": { + "type": "boolean" + }, + "endpoint": { + "type": "string" + }, + "protocol": { + "anyOf": [ + { + "type": "string", + "const": "http/protobuf" + }, + { + "type": "string", + "const": "grpc" + } + ] + }, + "headers": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "string" + } + }, + "serviceName": { + "type": "string" + }, + "traces": { + "type": "boolean" + }, + "metrics": { + "type": "boolean" + }, + "logs": { + "type": "boolean" + }, + "sampleRate": { + "type": "number", + "minimum": 0, + "maximum": 1 + }, + "flushIntervalMs": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + } + }, + "additionalProperties": false + }, + "cacheTrace": { + "type": "object", + "properties": { + "enabled": { + "type": "boolean" + }, + "filePath": { + "type": "string" + }, + "includeMessages": { + "type": "boolean" + }, + "includePrompt": { + "type": "boolean" + }, + "includeSystem": { + "type": "boolean" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + "logging": { + "type": "object", + "properties": { + "level": { + "anyOf": [ + { + "type": "string", + "const": "silent" + }, + { + "type": "string", + "const": "fatal" + }, + { + "type": "string", + "const": "error" + }, + { + "type": "string", + "const": "warn" + }, + { + "type": "string", + "const": "info" + }, + { + "type": "string", + "const": "debug" + }, + { + "type": "string", + "const": "trace" + } + ] + }, + "file": { + "type": "string" + }, + "consoleLevel": { + "anyOf": [ + { + "type": "string", + "const": "silent" + }, + { + "type": "string", + "const": "fatal" + }, + { + "type": "string", + "const": "error" + }, + { + "type": "string", + "const": "warn" + }, + { + "type": "string", + "const": "info" + }, + { + "type": "string", + "const": "debug" + }, + { + "type": "string", + "const": "trace" + } + ] + }, + "consoleStyle": { + "anyOf": [ + { + "type": "string", + "const": "pretty" + }, + { + "type": "string", + "const": "compact" + }, + { + "type": "string", + "const": "json" + } + ] + }, + "redactSensitive": { + "anyOf": [ + { + "type": "string", + "const": "off" + }, + { + "type": "string", + "const": "tools" + } + ] + }, + "redactPatterns": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "additionalProperties": false + }, + "update": { + "type": "object", + "properties": { + "channel": { + "anyOf": [ + { + "type": "string", + "const": "stable" + }, + { + "type": "string", + "const": "beta" + }, + { + "type": "string", + "const": "dev" + } + ] + }, + "checkOnStart": { + "type": "boolean" + } + }, + "additionalProperties": false + }, + "browser": { + "type": "object", + "properties": { + "enabled": { + "type": "boolean" + }, + "evaluateEnabled": { + "type": "boolean" + }, + "cdpUrl": { + "type": "string" + }, + "remoteCdpTimeoutMs": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + }, + "remoteCdpHandshakeTimeoutMs": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + }, + "color": { + "type": "string" + }, + "executablePath": { + "type": "string" + }, + "headless": { + "type": "boolean" + }, + "noSandbox": { + "type": "boolean" + }, + "attachOnly": { + "type": "boolean" + }, + "defaultProfile": { + "type": "string" + }, + "snapshotDefaults": { + "type": "object", + "properties": { + "mode": { + "type": "string", + "const": "efficient" + } + }, + "additionalProperties": false + }, + "profiles": { + "type": "object", + "propertyNames": { + "type": "string", + "pattern": "^[a-z0-9-]+$" + }, + "additionalProperties": { + "type": "object", + "properties": { + "cdpPort": { + "type": "integer", + "minimum": 1, + "maximum": 65535 + }, + "cdpUrl": { + "type": "string" + }, + "driver": { + "anyOf": [ + { + "type": "string", + "const": "clawd" + }, + { + "type": "string", + "const": "extension" + } + ] + }, + "color": { + "type": "string", + "pattern": "^#?[0-9a-fA-F]{6}$" + } + }, + "required": [ + "color" + ], + "additionalProperties": false + } + } + }, + "additionalProperties": false + }, + "ui": { + "type": "object", + "properties": { + "seamColor": { + "type": "string", + "pattern": "^#?[0-9a-fA-F]{6}$" + }, + "assistant": { + "type": "object", + "properties": { + "name": { + "type": "string", + "maxLength": 50 + }, + "avatar": { + "type": "string", + "maxLength": 200 + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + "auth": { + "type": "object", + "properties": { + "profiles": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "provider": { + "type": "string" + }, + "mode": { + "anyOf": [ + { + "type": "string", + "const": "api_key" + }, + { + "type": "string", + "const": "oauth" + }, + { + "type": "string", + "const": "token" + } + ] + }, + "email": { + "type": "string" + } + }, + "required": [ + "provider", + "mode" + ], + "additionalProperties": false + } + }, + "order": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "cooldowns": { + "type": "object", + "properties": { + "billingBackoffHours": { + "type": "number", + "exclusiveMinimum": 0 + }, + "billingBackoffHoursByProvider": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "number", + "exclusiveMinimum": 0 + } + }, + "billingMaxHours": { + "type": "number", + "exclusiveMinimum": 0 + }, + "failureWindowHours": { + "type": "number", + "exclusiveMinimum": 0 + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + "models": { + "type": "object", + "properties": { + "mode": { + "anyOf": [ + { + "type": "string", + "const": "merge" + }, + { + "type": "string", + "const": "replace" + } + ] + }, + "providers": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "baseUrl": { + "type": "string", + "minLength": 1 + }, + "apiKey": { + "type": "string" + }, + "auth": { + "anyOf": [ + { + "type": "string", + "const": "api-key" + }, + { + "type": "string", + "const": "aws-sdk" + }, + { + "type": "string", + "const": "oauth" + }, + { + "type": "string", + "const": "token" + } + ] + }, + "api": { + "anyOf": [ + { + "type": "string", + "const": "openai-completions" + }, + { + "type": "string", + "const": "openai-responses" + }, + { + "type": "string", + "const": "anthropic-messages" + }, + { + "type": "string", + "const": "google-generative-ai" + }, + { + "type": "string", + "const": "github-copilot" + }, + { + "type": "string", + "const": "bedrock-converse-stream" + } + ] + }, + "headers": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "string" + } + }, + "authHeader": { + "type": "boolean" + }, + "models": { + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { + "type": "string", + "minLength": 1 + }, + "name": { + "type": "string", + "minLength": 1 + }, + "api": { + "anyOf": [ + { + "type": "string", + "const": "openai-completions" + }, + { + "type": "string", + "const": "openai-responses" + }, + { + "type": "string", + "const": "anthropic-messages" + }, + { + "type": "string", + "const": "google-generative-ai" + }, + { + "type": "string", + "const": "github-copilot" + }, + { + "type": "string", + "const": "bedrock-converse-stream" + } + ] + }, + "reasoning": { + "type": "boolean" + }, + "input": { + "type": "array", + "items": { + "anyOf": [ + { + "type": "string", + "const": "text" + }, + { + "type": "string", + "const": "image" + } + ] + } + }, + "cost": { + "type": "object", + "properties": { + "input": { + "type": "number" + }, + "output": { + "type": "number" + }, + "cacheRead": { + "type": "number" + }, + "cacheWrite": { + "type": "number" + } + }, + "additionalProperties": false + }, + "contextWindow": { + "type": "number", + "exclusiveMinimum": 0 + }, + "maxTokens": { + "type": "number", + "exclusiveMinimum": 0 + }, + "headers": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "string" + } + }, + "compat": { + "type": "object", + "properties": { + "supportsStore": { + "type": "boolean" + }, + "supportsDeveloperRole": { + "type": "boolean" + }, + "supportsReasoningEffort": { + "type": "boolean" + }, + "maxTokensField": { + "anyOf": [ + { + "type": "string", + "const": "max_completion_tokens" + }, + { + "type": "string", + "const": "max_tokens" + } + ] + } + }, + "additionalProperties": false + } + }, + "required": [ + "id", + "name" + ], + "additionalProperties": false + } + } + }, + "required": [ + "baseUrl", + "models" + ], + "additionalProperties": false + } + }, + "bedrockDiscovery": { + "type": "object", + "properties": { + "enabled": { + "type": "boolean" + }, + "region": { + "type": "string" + }, + "providerFilter": { + "type": "array", + "items": { + "type": "string" + } + }, + "refreshInterval": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + }, + "defaultContextWindow": { + "type": "integer", + "exclusiveMinimum": 0, + "maximum": 9007199254740991 + }, + "defaultMaxTokens": { + "type": "integer", + "exclusiveMinimum": 0, + "maximum": 9007199254740991 + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + "nodeHost": { + "type": "object", + "properties": { + "browserProxy": { + "type": "object", + "properties": { + "enabled": { + "type": "boolean" + }, + "allowProfiles": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + "agents": { + "type": "object", + "properties": { + "defaults": { + "type": "object", + "properties": { + "model": { + "type": "object", + "properties": { + "primary": { + "type": "string" + }, + "fallbacks": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "additionalProperties": false + }, + "imageModel": { + "type": "object", + "properties": { + "primary": { + "type": "string" + }, + "fallbacks": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "additionalProperties": false + }, + "models": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "alias": { + "type": "string" + }, + "params": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "additionalProperties": false + } + }, + "workspace": { + "type": "string" + }, + "repoRoot": { + "type": "string" + }, + "skipBootstrap": { + "type": "boolean" + }, + "bootstrapMaxChars": { + "type": "integer", + "exclusiveMinimum": 0, + "maximum": 9007199254740991 + }, + "userTimezone": { + "type": "string" + }, + "timeFormat": { + "anyOf": [ + { + "type": "string", + "const": "auto" + }, + { + "type": "string", + "const": "12" + }, + { + "type": "string", + "const": "24" + } + ] + }, + "envelopeTimezone": { + "type": "string" + }, + "envelopeTimestamp": { + "anyOf": [ + { + "type": "string", + "const": "on" + }, + { + "type": "string", + "const": "off" + } + ] + }, + "envelopeElapsed": { + "anyOf": [ + { + "type": "string", + "const": "on" + }, + { + "type": "string", + "const": "off" + } + ] + }, + "contextTokens": { + "type": "integer", + "exclusiveMinimum": 0, + "maximum": 9007199254740991 + }, + "cliBackends": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "command": { + "type": "string" + }, + "args": { + "type": "array", + "items": { + "type": "string" + } + }, + "output": { + "anyOf": [ + { + "type": "string", + "const": "json" + }, + { + "type": "string", + "const": "text" + }, + { + "type": "string", + "const": "jsonl" + } + ] + }, + "resumeOutput": { + "anyOf": [ + { + "type": "string", + "const": "json" + }, + { + "type": "string", + "const": "text" + }, + { + "type": "string", + "const": "jsonl" + } + ] + }, + "input": { + "anyOf": [ + { + "type": "string", + "const": "arg" + }, + { + "type": "string", + "const": "stdin" + } + ] + }, + "maxPromptArgChars": { + "type": "integer", + "exclusiveMinimum": 0, + "maximum": 9007199254740991 + }, + "env": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "string" + } + }, + "clearEnv": { + "type": "array", + "items": { + "type": "string" + } + }, + "modelArg": { + "type": "string" + }, + "modelAliases": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "string" + } + }, + "sessionArg": { + "type": "string" + }, + "sessionArgs": { + "type": "array", + "items": { + "type": "string" + } + }, + "resumeArgs": { + "type": "array", + "items": { + "type": "string" + } + }, + "sessionMode": { + "anyOf": [ + { + "type": "string", + "const": "always" + }, + { + "type": "string", + "const": "existing" + }, + { + "type": "string", + "const": "none" + } + ] + }, + "sessionIdFields": { + "type": "array", + "items": { + "type": "string" + } + }, + "systemPromptArg": { + "type": "string" + }, + "systemPromptMode": { + "anyOf": [ + { + "type": "string", + "const": "append" + }, + { + "type": "string", + "const": "replace" + } + ] + }, + "systemPromptWhen": { + "anyOf": [ + { + "type": "string", + "const": "first" + }, + { + "type": "string", + "const": "always" + }, + { + "type": "string", + "const": "never" + } + ] + }, + "imageArg": { + "type": "string" + }, + "imageMode": { + "anyOf": [ + { + "type": "string", + "const": "repeat" + }, + { + "type": "string", + "const": "list" + } + ] + }, + "serialize": { + "type": "boolean" + } + }, + "required": [ + "command" + ], + "additionalProperties": false + } + }, + "memorySearch": { + "type": "object", + "properties": { + "enabled": { + "type": "boolean" + }, + "sources": { + "type": "array", + "items": { + "anyOf": [ + { + "type": "string", + "const": "memory" + }, + { + "type": "string", + "const": "sessions" + } + ] + } + }, + "experimental": { + "type": "object", + "properties": { + "sessionMemory": { + "type": "boolean" + } + }, + "additionalProperties": false + }, + "provider": { + "anyOf": [ + { + "type": "string", + "const": "openai" + }, + { + "type": "string", + "const": "local" + }, + { + "type": "string", + "const": "gemini" + } + ] + }, + "remote": { + "type": "object", + "properties": { + "baseUrl": { + "type": "string" + }, + "apiKey": { + "type": "string" + }, + "headers": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "string" + } + }, + "batch": { + "type": "object", + "properties": { + "enabled": { + "type": "boolean" + }, + "wait": { + "type": "boolean" + }, + "concurrency": { + "type": "integer", + "exclusiveMinimum": 0, + "maximum": 9007199254740991 + }, + "pollIntervalMs": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + }, + "timeoutMinutes": { + "type": "integer", + "exclusiveMinimum": 0, + "maximum": 9007199254740991 + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + "fallback": { + "anyOf": [ + { + "type": "string", + "const": "openai" + }, + { + "type": "string", + "const": "gemini" + }, + { + "type": "string", + "const": "local" + }, + { + "type": "string", + "const": "none" + } + ] + }, + "model": { + "type": "string" + }, + "local": { + "type": "object", + "properties": { + "modelPath": { + "type": "string" + }, + "modelCacheDir": { + "type": "string" + } + }, + "additionalProperties": false + }, + "store": { + "type": "object", + "properties": { + "driver": { + "type": "string", + "const": "sqlite" + }, + "path": { + "type": "string" + }, + "vector": { + "type": "object", + "properties": { + "enabled": { + "type": "boolean" + }, + "extensionPath": { + "type": "string" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + "chunking": { + "type": "object", + "properties": { + "tokens": { + "type": "integer", + "exclusiveMinimum": 0, + "maximum": 9007199254740991 + }, + "overlap": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + } + }, + "additionalProperties": false + }, + "sync": { + "type": "object", + "properties": { + "onSessionStart": { + "type": "boolean" + }, + "onSearch": { + "type": "boolean" + }, + "watch": { + "type": "boolean" + }, + "watchDebounceMs": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + }, + "intervalMinutes": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + }, + "sessions": { + "type": "object", + "properties": { + "deltaBytes": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + }, + "deltaMessages": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + "query": { + "type": "object", + "properties": { + "maxResults": { + "type": "integer", + "exclusiveMinimum": 0, + "maximum": 9007199254740991 + }, + "minScore": { + "type": "number", + "minimum": 0, + "maximum": 1 + }, + "hybrid": { + "type": "object", + "properties": { + "enabled": { + "type": "boolean" + }, + "vectorWeight": { + "type": "number", + "minimum": 0, + "maximum": 1 + }, + "textWeight": { + "type": "number", + "minimum": 0, + "maximum": 1 + }, + "candidateMultiplier": { + "type": "integer", + "exclusiveMinimum": 0, + "maximum": 9007199254740991 + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + "cache": { + "type": "object", + "properties": { + "enabled": { + "type": "boolean" + }, + "maxEntries": { + "type": "integer", + "exclusiveMinimum": 0, + "maximum": 9007199254740991 + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + "contextPruning": { + "type": "object", + "properties": { + "mode": { + "anyOf": [ + { + "type": "string", + "const": "off" + }, + { + "type": "string", + "const": "cache-ttl" + } + ] + }, + "ttl": { + "type": "string" + }, + "keepLastAssistants": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + }, + "softTrimRatio": { + "type": "number", + "minimum": 0, + "maximum": 1 + }, + "hardClearRatio": { + "type": "number", + "minimum": 0, + "maximum": 1 + }, + "minPrunableToolChars": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + }, + "tools": { + "type": "object", + "properties": { + "allow": { + "type": "array", + "items": { + "type": "string" + } + }, + "deny": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "additionalProperties": false + }, + "softTrim": { + "type": "object", + "properties": { + "maxChars": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + }, + "headChars": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + }, + "tailChars": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + } + }, + "additionalProperties": false + }, + "hardClear": { + "type": "object", + "properties": { + "enabled": { + "type": "boolean" + }, + "placeholder": { + "type": "string" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + "compaction": { + "type": "object", + "properties": { + "mode": { + "anyOf": [ + { + "type": "string", + "const": "default" + }, + { + "type": "string", + "const": "safeguard" + } + ] + }, + "reserveTokensFloor": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + }, + "maxHistoryShare": { + "type": "number", + "minimum": 0.1, + "maximum": 0.9 + }, + "memoryFlush": { + "type": "object", + "properties": { + "enabled": { + "type": "boolean" + }, + "softThresholdTokens": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + }, + "prompt": { + "type": "string" + }, + "systemPrompt": { + "type": "string" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + "thinkingDefault": { + "anyOf": [ + { + "type": "string", + "const": "off" + }, + { + "type": "string", + "const": "minimal" + }, + { + "type": "string", + "const": "low" + }, + { + "type": "string", + "const": "medium" + }, + { + "type": "string", + "const": "high" + }, + { + "type": "string", + "const": "xhigh" + } + ] + }, + "verboseDefault": { + "anyOf": [ + { + "type": "string", + "const": "off" + }, + { + "type": "string", + "const": "on" + }, + { + "type": "string", + "const": "full" + } + ] + }, + "elevatedDefault": { + "anyOf": [ + { + "type": "string", + "const": "off" + }, + { + "type": "string", + "const": "on" + }, + { + "type": "string", + "const": "ask" + }, + { + "type": "string", + "const": "full" + } + ] + }, + "blockStreamingDefault": { + "anyOf": [ + { + "type": "string", + "const": "off" + }, + { + "type": "string", + "const": "on" + } + ] + }, + "blockStreamingBreak": { + "anyOf": [ + { + "type": "string", + "const": "text_end" + }, + { + "type": "string", + "const": "message_end" + } + ] + }, + "blockStreamingChunk": { + "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 + }, + "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 + }, + "humanDelay": { + "type": "object", + "properties": { + "mode": { + "anyOf": [ + { + "type": "string", + "const": "off" + }, + { + "type": "string", + "const": "natural" + }, + { + "type": "string", + "const": "custom" + } + ] + }, + "minMs": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + }, + "maxMs": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + } + }, + "additionalProperties": false + }, + "timeoutSeconds": { + "type": "integer", + "exclusiveMinimum": 0, + "maximum": 9007199254740991 + }, + "mediaMaxMb": { + "type": "number", + "exclusiveMinimum": 0 + }, + "typingIntervalSeconds": { + "type": "integer", + "exclusiveMinimum": 0, + "maximum": 9007199254740991 + }, + "typingMode": { + "anyOf": [ + { + "type": "string", + "const": "never" + }, + { + "type": "string", + "const": "instant" + }, + { + "type": "string", + "const": "thinking" + }, + { + "type": "string", + "const": "message" + } + ] + }, + "heartbeat": { + "type": "object", + "properties": { + "every": { + "type": "string" + }, + "activeHours": { + "type": "object", + "properties": { + "start": { + "type": "string" + }, + "end": { + "type": "string" + }, + "timezone": { + "type": "string" + } + }, + "additionalProperties": false + }, + "model": { + "type": "string" + }, + "session": { + "type": "string" + }, + "includeReasoning": { + "type": "boolean" + }, + "target": { + "type": "string" + }, + "to": { + "type": "string" + }, + "prompt": { + "type": "string" + }, + "ackMaxChars": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + } + }, + "additionalProperties": false + }, + "maxConcurrent": { + "type": "integer", + "exclusiveMinimum": 0, + "maximum": 9007199254740991 + }, + "subagents": { + "type": "object", + "properties": { + "maxConcurrent": { + "type": "integer", + "exclusiveMinimum": 0, + "maximum": 9007199254740991 + }, + "archiveAfterMinutes": { + "type": "integer", + "exclusiveMinimum": 0, + "maximum": 9007199254740991 + }, + "model": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "object", + "properties": { + "primary": { + "type": "string" + }, + "fallbacks": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "additionalProperties": false + } + ] + } + }, + "additionalProperties": false + }, + "sandbox": { + "type": "object", + "properties": { + "mode": { + "anyOf": [ + { + "type": "string", + "const": "off" + }, + { + "type": "string", + "const": "non-main" + }, + { + "type": "string", + "const": "all" + } + ] + }, + "workspaceAccess": { + "anyOf": [ + { + "type": "string", + "const": "none" + }, + { + "type": "string", + "const": "ro" + }, + { + "type": "string", + "const": "rw" + } + ] + }, + "sessionToolsVisibility": { + "anyOf": [ + { + "type": "string", + "const": "spawned" + }, + { + "type": "string", + "const": "all" + } + ] + }, + "scope": { + "anyOf": [ + { + "type": "string", + "const": "session" + }, + { + "type": "string", + "const": "agent" + }, + { + "type": "string", + "const": "shared" + } + ] + }, + "perSession": { + "type": "boolean" + }, + "workspaceRoot": { + "type": "string" + }, + "docker": { + "type": "object", + "properties": { + "image": { + "type": "string" + }, + "containerPrefix": { + "type": "string" + }, + "workdir": { + "type": "string" + }, + "readOnlyRoot": { + "type": "boolean" + }, + "tmpfs": { + "type": "array", + "items": { + "type": "string" + } + }, + "network": { + "type": "string" + }, + "user": { + "type": "string" + }, + "capDrop": { + "type": "array", + "items": { + "type": "string" + } + }, + "env": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "string" + } + }, + "setupCommand": { + "type": "string" + }, + "pidsLimit": { + "type": "integer", + "exclusiveMinimum": 0, + "maximum": 9007199254740991 + }, + "memory": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + "memorySwap": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + "cpus": { + "type": "number", + "exclusiveMinimum": 0 + }, + "ulimits": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "object", + "properties": { + "soft": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + }, + "hard": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + } + }, + "additionalProperties": false + } + ] + } + }, + "seccompProfile": { + "type": "string" + }, + "apparmorProfile": { + "type": "string" + }, + "dns": { + "type": "array", + "items": { + "type": "string" + } + }, + "extraHosts": { + "type": "array", + "items": { + "type": "string" + } + }, + "binds": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "additionalProperties": false + }, + "browser": { + "type": "object", + "properties": { + "enabled": { + "type": "boolean" + }, + "image": { + "type": "string" + }, + "containerPrefix": { + "type": "string" + }, + "cdpPort": { + "type": "integer", + "exclusiveMinimum": 0, + "maximum": 9007199254740991 + }, + "vncPort": { + "type": "integer", + "exclusiveMinimum": 0, + "maximum": 9007199254740991 + }, + "noVncPort": { + "type": "integer", + "exclusiveMinimum": 0, + "maximum": 9007199254740991 + }, + "headless": { + "type": "boolean" + }, + "enableNoVnc": { + "type": "boolean" + }, + "allowHostControl": { + "type": "boolean" + }, + "autoStart": { + "type": "boolean" + }, + "autoStartTimeoutMs": { + "type": "integer", + "exclusiveMinimum": 0, + "maximum": 9007199254740991 + } + }, + "additionalProperties": false + }, + "prune": { + "type": "object", + "properties": { + "idleHours": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + }, + "maxAgeDays": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + "list": { + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "default": { + "type": "boolean" + }, + "name": { + "type": "string" + }, + "workspace": { + "type": "string" + }, + "agentDir": { + "type": "string" + }, + "model": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "object", + "properties": { + "primary": { + "type": "string" + }, + "fallbacks": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "additionalProperties": false + } + ] + }, + "memorySearch": { + "type": "object", + "properties": { + "enabled": { + "type": "boolean" + }, + "sources": { + "type": "array", + "items": { + "anyOf": [ + { + "type": "string", + "const": "memory" + }, + { + "type": "string", + "const": "sessions" + } + ] + } + }, + "experimental": { + "type": "object", + "properties": { + "sessionMemory": { + "type": "boolean" + } + }, + "additionalProperties": false + }, + "provider": { + "anyOf": [ + { + "type": "string", + "const": "openai" + }, + { + "type": "string", + "const": "local" + }, + { + "type": "string", + "const": "gemini" + } + ] + }, + "remote": { + "type": "object", + "properties": { + "baseUrl": { + "type": "string" + }, + "apiKey": { + "type": "string" + }, + "headers": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "string" + } + }, + "batch": { + "type": "object", + "properties": { + "enabled": { + "type": "boolean" + }, + "wait": { + "type": "boolean" + }, + "concurrency": { + "type": "integer", + "exclusiveMinimum": 0, + "maximum": 9007199254740991 + }, + "pollIntervalMs": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + }, + "timeoutMinutes": { + "type": "integer", + "exclusiveMinimum": 0, + "maximum": 9007199254740991 + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + "fallback": { + "anyOf": [ + { + "type": "string", + "const": "openai" + }, + { + "type": "string", + "const": "gemini" + }, + { + "type": "string", + "const": "local" + }, + { + "type": "string", + "const": "none" + } + ] + }, + "model": { + "type": "string" + }, + "local": { + "type": "object", + "properties": { + "modelPath": { + "type": "string" + }, + "modelCacheDir": { + "type": "string" + } + }, + "additionalProperties": false + }, + "store": { + "type": "object", + "properties": { + "driver": { + "type": "string", + "const": "sqlite" + }, + "path": { + "type": "string" + }, + "vector": { + "type": "object", + "properties": { + "enabled": { + "type": "boolean" + }, + "extensionPath": { + "type": "string" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + "chunking": { + "type": "object", + "properties": { + "tokens": { + "type": "integer", + "exclusiveMinimum": 0, + "maximum": 9007199254740991 + }, + "overlap": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + } + }, + "additionalProperties": false + }, + "sync": { + "type": "object", + "properties": { + "onSessionStart": { + "type": "boolean" + }, + "onSearch": { + "type": "boolean" + }, + "watch": { + "type": "boolean" + }, + "watchDebounceMs": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + }, + "intervalMinutes": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + }, + "sessions": { + "type": "object", + "properties": { + "deltaBytes": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + }, + "deltaMessages": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + "query": { + "type": "object", + "properties": { + "maxResults": { + "type": "integer", + "exclusiveMinimum": 0, + "maximum": 9007199254740991 + }, + "minScore": { + "type": "number", + "minimum": 0, + "maximum": 1 + }, + "hybrid": { + "type": "object", + "properties": { + "enabled": { + "type": "boolean" + }, + "vectorWeight": { + "type": "number", + "minimum": 0, + "maximum": 1 + }, + "textWeight": { + "type": "number", + "minimum": 0, + "maximum": 1 + }, + "candidateMultiplier": { + "type": "integer", + "exclusiveMinimum": 0, + "maximum": 9007199254740991 + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + "cache": { + "type": "object", + "properties": { + "enabled": { + "type": "boolean" + }, + "maxEntries": { + "type": "integer", + "exclusiveMinimum": 0, + "maximum": 9007199254740991 + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + "humanDelay": { + "type": "object", + "properties": { + "mode": { + "anyOf": [ + { + "type": "string", + "const": "off" + }, + { + "type": "string", + "const": "natural" + }, + { + "type": "string", + "const": "custom" + } + ] + }, + "minMs": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + }, + "maxMs": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + } + }, + "additionalProperties": false + }, + "heartbeat": { + "type": "object", + "properties": { + "every": { + "type": "string" + }, + "activeHours": { + "type": "object", + "properties": { + "start": { + "type": "string" + }, + "end": { + "type": "string" + }, + "timezone": { + "type": "string" + } + }, + "additionalProperties": false + }, + "model": { + "type": "string" + }, + "session": { + "type": "string" + }, + "includeReasoning": { + "type": "boolean" + }, + "target": { + "type": "string" + }, + "to": { + "type": "string" + }, + "prompt": { + "type": "string" + }, + "ackMaxChars": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + } + }, + "additionalProperties": false + }, + "identity": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "theme": { + "type": "string" + }, + "emoji": { + "type": "string" + }, + "avatar": { + "type": "string" + } + }, + "additionalProperties": false + }, + "groupChat": { + "type": "object", + "properties": { + "mentionPatterns": { + "type": "array", + "items": { + "type": "string" + } + }, + "historyLimit": { + "type": "integer", + "exclusiveMinimum": 0, + "maximum": 9007199254740991 + } + }, + "additionalProperties": false + }, + "subagents": { + "type": "object", + "properties": { + "allowAgents": { + "type": "array", + "items": { + "type": "string" + } + }, + "model": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "object", + "properties": { + "primary": { + "type": "string" + }, + "fallbacks": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "additionalProperties": false + } + ] + } + }, + "additionalProperties": false + }, + "sandbox": { + "type": "object", + "properties": { + "mode": { + "anyOf": [ + { + "type": "string", + "const": "off" + }, + { + "type": "string", + "const": "non-main" + }, + { + "type": "string", + "const": "all" + } + ] + }, + "workspaceAccess": { + "anyOf": [ + { + "type": "string", + "const": "none" + }, + { + "type": "string", + "const": "ro" + }, + { + "type": "string", + "const": "rw" + } + ] + }, + "sessionToolsVisibility": { + "anyOf": [ + { + "type": "string", + "const": "spawned" + }, + { + "type": "string", + "const": "all" + } + ] + }, + "scope": { + "anyOf": [ + { + "type": "string", + "const": "session" + }, + { + "type": "string", + "const": "agent" + }, + { + "type": "string", + "const": "shared" + } + ] + }, + "perSession": { + "type": "boolean" + }, + "workspaceRoot": { + "type": "string" + }, + "docker": { + "type": "object", + "properties": { + "image": { + "type": "string" + }, + "containerPrefix": { + "type": "string" + }, + "workdir": { + "type": "string" + }, + "readOnlyRoot": { + "type": "boolean" + }, + "tmpfs": { + "type": "array", + "items": { + "type": "string" + } + }, + "network": { + "type": "string" + }, + "user": { + "type": "string" + }, + "capDrop": { + "type": "array", + "items": { + "type": "string" + } + }, + "env": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "string" + } + }, + "setupCommand": { + "type": "string" + }, + "pidsLimit": { + "type": "integer", + "exclusiveMinimum": 0, + "maximum": 9007199254740991 + }, + "memory": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + "memorySwap": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + "cpus": { + "type": "number", + "exclusiveMinimum": 0 + }, + "ulimits": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "object", + "properties": { + "soft": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + }, + "hard": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + } + }, + "additionalProperties": false + } + ] + } + }, + "seccompProfile": { + "type": "string" + }, + "apparmorProfile": { + "type": "string" + }, + "dns": { + "type": "array", + "items": { + "type": "string" + } + }, + "extraHosts": { + "type": "array", + "items": { + "type": "string" + } + }, + "binds": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "additionalProperties": false + }, + "browser": { + "type": "object", + "properties": { + "enabled": { + "type": "boolean" + }, + "image": { + "type": "string" + }, + "containerPrefix": { + "type": "string" + }, + "cdpPort": { + "type": "integer", + "exclusiveMinimum": 0, + "maximum": 9007199254740991 + }, + "vncPort": { + "type": "integer", + "exclusiveMinimum": 0, + "maximum": 9007199254740991 + }, + "noVncPort": { + "type": "integer", + "exclusiveMinimum": 0, + "maximum": 9007199254740991 + }, + "headless": { + "type": "boolean" + }, + "enableNoVnc": { + "type": "boolean" + }, + "allowHostControl": { + "type": "boolean" + }, + "autoStart": { + "type": "boolean" + }, + "autoStartTimeoutMs": { + "type": "integer", + "exclusiveMinimum": 0, + "maximum": 9007199254740991 + } + }, + "additionalProperties": false + }, + "prune": { + "type": "object", + "properties": { + "idleHours": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + }, + "maxAgeDays": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + "tools": { + "type": "object", + "properties": { + "profile": { + "anyOf": [ + { + "type": "string", + "const": "minimal" + }, + { + "type": "string", + "const": "coding" + }, + { + "type": "string", + "const": "messaging" + }, + { + "type": "string", + "const": "full" + } + ] + }, + "allow": { + "type": "array", + "items": { + "type": "string" + } + }, + "alsoAllow": { + "type": "array", + "items": { + "type": "string" + } + }, + "deny": { + "type": "array", + "items": { + "type": "string" + } + }, + "byProvider": { + "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" + } + }, + "profile": { + "anyOf": [ + { + "type": "string", + "const": "minimal" + }, + { + "type": "string", + "const": "coding" + }, + { + "type": "string", + "const": "messaging" + }, + { + "type": "string", + "const": "full" + } + ] + } + }, + "additionalProperties": false + } + }, + "elevated": { + "type": "object", + "properties": { + "enabled": { + "type": "boolean" + }, + "allowFrom": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "array", + "items": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + } + } + } + }, + "additionalProperties": false + }, + "exec": { + "type": "object", + "properties": { + "host": { + "type": "string", + "enum": [ + "sandbox", + "gateway", + "node" + ] + }, + "security": { + "type": "string", + "enum": [ + "deny", + "allowlist", + "full" + ] + }, + "ask": { + "type": "string", + "enum": [ + "off", + "on-miss", + "always" + ] + }, + "node": { + "type": "string" + }, + "pathPrepend": { + "type": "array", + "items": { + "type": "string" + } + }, + "safeBins": { + "type": "array", + "items": { + "type": "string" + } + }, + "backgroundMs": { + "type": "integer", + "exclusiveMinimum": 0, + "maximum": 9007199254740991 + }, + "timeoutSec": { + "type": "integer", + "exclusiveMinimum": 0, + "maximum": 9007199254740991 + }, + "approvalRunningNoticeMs": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + }, + "cleanupMs": { + "type": "integer", + "exclusiveMinimum": 0, + "maximum": 9007199254740991 + }, + "notifyOnExit": { + "type": "boolean" + }, + "applyPatch": { + "type": "object", + "properties": { + "enabled": { + "type": "boolean" + }, + "allowModels": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + "sandbox": { + "type": "object", + "properties": { + "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 + } + }, + "additionalProperties": false + } + }, + "required": [ + "id" + ], + "additionalProperties": false + } + } + }, + "additionalProperties": false + }, + "tools": { + "type": "object", + "properties": { + "profile": { + "anyOf": [ + { + "type": "string", + "const": "minimal" + }, + { + "type": "string", + "const": "coding" + }, + { + "type": "string", + "const": "messaging" + }, + { + "type": "string", + "const": "full" + } + ] + }, + "allow": { + "type": "array", + "items": { + "type": "string" + } + }, + "alsoAllow": { + "type": "array", + "items": { + "type": "string" + } + }, + "deny": { + "type": "array", + "items": { + "type": "string" + } + }, + "byProvider": { + "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" + } + }, + "profile": { + "anyOf": [ + { + "type": "string", + "const": "minimal" + }, + { + "type": "string", + "const": "coding" + }, + { + "type": "string", + "const": "messaging" + }, + { + "type": "string", + "const": "full" + } + ] + } + }, + "additionalProperties": false + } + }, + "web": { + "type": "object", + "properties": { + "search": { + "type": "object", + "properties": { + "enabled": { + "type": "boolean" + }, + "provider": { + "anyOf": [ + { + "type": "string", + "const": "brave" + }, + { + "type": "string", + "const": "perplexity" + } + ] + }, + "apiKey": { + "type": "string" + }, + "maxResults": { + "type": "integer", + "exclusiveMinimum": 0, + "maximum": 9007199254740991 + }, + "timeoutSeconds": { + "type": "integer", + "exclusiveMinimum": 0, + "maximum": 9007199254740991 + }, + "cacheTtlMinutes": { + "type": "number", + "minimum": 0 + }, + "perplexity": { + "type": "object", + "properties": { + "apiKey": { + "type": "string" + }, + "baseUrl": { + "type": "string" + }, + "model": { + "type": "string" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + "fetch": { + "type": "object", + "properties": { + "enabled": { + "type": "boolean" + }, + "maxChars": { + "type": "integer", + "exclusiveMinimum": 0, + "maximum": 9007199254740991 + }, + "timeoutSeconds": { + "type": "integer", + "exclusiveMinimum": 0, + "maximum": 9007199254740991 + }, + "cacheTtlMinutes": { + "type": "number", + "minimum": 0 + }, + "maxRedirects": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + }, + "userAgent": { + "type": "string" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + "media": { + "type": "object", + "properties": { + "models": { + "type": "array", + "items": { + "type": "object", + "properties": { + "provider": { + "type": "string" + }, + "model": { + "type": "string" + }, + "capabilities": { + "type": "array", + "items": { + "anyOf": [ + { + "type": "string", + "const": "image" + }, + { + "type": "string", + "const": "audio" + }, + { + "type": "string", + "const": "video" + } + ] + } + }, + "type": { + "anyOf": [ + { + "type": "string", + "const": "provider" + }, + { + "type": "string", + "const": "cli" + } + ] + }, + "command": { + "type": "string" + }, + "args": { + "type": "array", + "items": { + "type": "string" + } + }, + "prompt": { + "type": "string" + }, + "maxChars": { + "type": "integer", + "exclusiveMinimum": 0, + "maximum": 9007199254740991 + }, + "maxBytes": { + "type": "integer", + "exclusiveMinimum": 0, + "maximum": 9007199254740991 + }, + "timeoutSeconds": { + "type": "integer", + "exclusiveMinimum": 0, + "maximum": 9007199254740991 + }, + "language": { + "type": "string" + }, + "providerOptions": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + } + ] + } + } + }, + "deepgram": { + "type": "object", + "properties": { + "detectLanguage": { + "type": "boolean" + }, + "punctuate": { + "type": "boolean" + }, + "smartFormat": { + "type": "boolean" + } + }, + "additionalProperties": false + }, + "baseUrl": { + "type": "string" + }, + "headers": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "string" + } + }, + "profile": { + "type": "string" + }, + "preferredProfile": { + "type": "string" + } + }, + "additionalProperties": false + } + }, + "concurrency": { + "type": "integer", + "exclusiveMinimum": 0, + "maximum": 9007199254740991 + }, + "image": { + "type": "object", + "properties": { + "enabled": { + "type": "boolean" + }, + "scope": { + "type": "object", + "properties": { + "default": { + "anyOf": [ + { + "type": "string", + "const": "allow" + }, + { + "type": "string", + "const": "deny" + } + ] + }, + "rules": { + "type": "array", + "items": { + "type": "object", + "properties": { + "action": { + "anyOf": [ + { + "type": "string", + "const": "allow" + }, + { + "type": "string", + "const": "deny" + } + ] + }, + "match": { + "type": "object", + "properties": { + "channel": { + "type": "string" + }, + "chatType": { + "anyOf": [ + { + "type": "string", + "const": "direct" + }, + { + "type": "string", + "const": "group" + }, + { + "type": "string", + "const": "channel" + } + ] + }, + "keyPrefix": { + "type": "string" + } + }, + "additionalProperties": false + } + }, + "required": [ + "action" + ], + "additionalProperties": false + } + } + }, + "additionalProperties": false + }, + "maxBytes": { + "type": "integer", + "exclusiveMinimum": 0, + "maximum": 9007199254740991 + }, + "maxChars": { + "type": "integer", + "exclusiveMinimum": 0, + "maximum": 9007199254740991 + }, + "prompt": { + "type": "string" + }, + "timeoutSeconds": { + "type": "integer", + "exclusiveMinimum": 0, + "maximum": 9007199254740991 + }, + "language": { + "type": "string" + }, + "providerOptions": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + } + ] + } + } + }, + "deepgram": { + "type": "object", + "properties": { + "detectLanguage": { + "type": "boolean" + }, + "punctuate": { + "type": "boolean" + }, + "smartFormat": { + "type": "boolean" + } + }, + "additionalProperties": false + }, + "baseUrl": { + "type": "string" + }, + "headers": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "string" + } + }, + "attachments": { + "type": "object", + "properties": { + "mode": { + "anyOf": [ + { + "type": "string", + "const": "first" + }, + { + "type": "string", + "const": "all" + } + ] + }, + "maxAttachments": { + "type": "integer", + "exclusiveMinimum": 0, + "maximum": 9007199254740991 + }, + "prefer": { + "anyOf": [ + { + "type": "string", + "const": "first" + }, + { + "type": "string", + "const": "last" + }, + { + "type": "string", + "const": "path" + }, + { + "type": "string", + "const": "url" + } + ] + } + }, + "additionalProperties": false + }, + "models": { + "type": "array", + "items": { + "type": "object", + "properties": { + "provider": { + "type": "string" + }, + "model": { + "type": "string" + }, + "capabilities": { + "type": "array", + "items": { + "anyOf": [ + { + "type": "string", + "const": "image" + }, + { + "type": "string", + "const": "audio" + }, + { + "type": "string", + "const": "video" + } + ] + } + }, + "type": { + "anyOf": [ + { + "type": "string", + "const": "provider" + }, + { + "type": "string", + "const": "cli" + } + ] + }, + "command": { + "type": "string" + }, + "args": { + "type": "array", + "items": { + "type": "string" + } + }, + "prompt": { + "type": "string" + }, + "maxChars": { + "type": "integer", + "exclusiveMinimum": 0, + "maximum": 9007199254740991 + }, + "maxBytes": { + "type": "integer", + "exclusiveMinimum": 0, + "maximum": 9007199254740991 + }, + "timeoutSeconds": { + "type": "integer", + "exclusiveMinimum": 0, + "maximum": 9007199254740991 + }, + "language": { + "type": "string" + }, + "providerOptions": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + } + ] + } + } + }, + "deepgram": { + "type": "object", + "properties": { + "detectLanguage": { + "type": "boolean" + }, + "punctuate": { + "type": "boolean" + }, + "smartFormat": { + "type": "boolean" + } + }, + "additionalProperties": false + }, + "baseUrl": { + "type": "string" + }, + "headers": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "string" + } + }, + "profile": { + "type": "string" + }, + "preferredProfile": { + "type": "string" + } + }, + "additionalProperties": false + } + } + }, + "additionalProperties": false + }, + "audio": { + "type": "object", + "properties": { + "enabled": { + "type": "boolean" + }, + "scope": { + "type": "object", + "properties": { + "default": { + "anyOf": [ + { + "type": "string", + "const": "allow" + }, + { + "type": "string", + "const": "deny" + } + ] + }, + "rules": { + "type": "array", + "items": { + "type": "object", + "properties": { + "action": { + "anyOf": [ + { + "type": "string", + "const": "allow" + }, + { + "type": "string", + "const": "deny" + } + ] + }, + "match": { + "type": "object", + "properties": { + "channel": { + "type": "string" + }, + "chatType": { + "anyOf": [ + { + "type": "string", + "const": "direct" + }, + { + "type": "string", + "const": "group" + }, + { + "type": "string", + "const": "channel" + } + ] + }, + "keyPrefix": { + "type": "string" + } + }, + "additionalProperties": false + } + }, + "required": [ + "action" + ], + "additionalProperties": false + } + } + }, + "additionalProperties": false + }, + "maxBytes": { + "type": "integer", + "exclusiveMinimum": 0, + "maximum": 9007199254740991 + }, + "maxChars": { + "type": "integer", + "exclusiveMinimum": 0, + "maximum": 9007199254740991 + }, + "prompt": { + "type": "string" + }, + "timeoutSeconds": { + "type": "integer", + "exclusiveMinimum": 0, + "maximum": 9007199254740991 + }, + "language": { + "type": "string" + }, + "providerOptions": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + } + ] + } + } + }, + "deepgram": { + "type": "object", + "properties": { + "detectLanguage": { + "type": "boolean" + }, + "punctuate": { + "type": "boolean" + }, + "smartFormat": { + "type": "boolean" + } + }, + "additionalProperties": false + }, + "baseUrl": { + "type": "string" + }, + "headers": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "string" + } + }, + "attachments": { + "type": "object", + "properties": { + "mode": { + "anyOf": [ + { + "type": "string", + "const": "first" + }, + { + "type": "string", + "const": "all" + } + ] + }, + "maxAttachments": { + "type": "integer", + "exclusiveMinimum": 0, + "maximum": 9007199254740991 + }, + "prefer": { + "anyOf": [ + { + "type": "string", + "const": "first" + }, + { + "type": "string", + "const": "last" + }, + { + "type": "string", + "const": "path" + }, + { + "type": "string", + "const": "url" + } + ] + } + }, + "additionalProperties": false + }, + "models": { + "type": "array", + "items": { + "type": "object", + "properties": { + "provider": { + "type": "string" + }, + "model": { + "type": "string" + }, + "capabilities": { + "type": "array", + "items": { + "anyOf": [ + { + "type": "string", + "const": "image" + }, + { + "type": "string", + "const": "audio" + }, + { + "type": "string", + "const": "video" + } + ] + } + }, + "type": { + "anyOf": [ + { + "type": "string", + "const": "provider" + }, + { + "type": "string", + "const": "cli" + } + ] + }, + "command": { + "type": "string" + }, + "args": { + "type": "array", + "items": { + "type": "string" + } + }, + "prompt": { + "type": "string" + }, + "maxChars": { + "type": "integer", + "exclusiveMinimum": 0, + "maximum": 9007199254740991 + }, + "maxBytes": { + "type": "integer", + "exclusiveMinimum": 0, + "maximum": 9007199254740991 + }, + "timeoutSeconds": { + "type": "integer", + "exclusiveMinimum": 0, + "maximum": 9007199254740991 + }, + "language": { + "type": "string" + }, + "providerOptions": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + } + ] + } + } + }, + "deepgram": { + "type": "object", + "properties": { + "detectLanguage": { + "type": "boolean" + }, + "punctuate": { + "type": "boolean" + }, + "smartFormat": { + "type": "boolean" + } + }, + "additionalProperties": false + }, + "baseUrl": { + "type": "string" + }, + "headers": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "string" + } + }, + "profile": { + "type": "string" + }, + "preferredProfile": { + "type": "string" + } + }, + "additionalProperties": false + } + } + }, + "additionalProperties": false + }, + "video": { + "type": "object", + "properties": { + "enabled": { + "type": "boolean" + }, + "scope": { + "type": "object", + "properties": { + "default": { + "anyOf": [ + { + "type": "string", + "const": "allow" + }, + { + "type": "string", + "const": "deny" + } + ] + }, + "rules": { + "type": "array", + "items": { + "type": "object", + "properties": { + "action": { + "anyOf": [ + { + "type": "string", + "const": "allow" + }, + { + "type": "string", + "const": "deny" + } + ] + }, + "match": { + "type": "object", + "properties": { + "channel": { + "type": "string" + }, + "chatType": { + "anyOf": [ + { + "type": "string", + "const": "direct" + }, + { + "type": "string", + "const": "group" + }, + { + "type": "string", + "const": "channel" + } + ] + }, + "keyPrefix": { + "type": "string" + } + }, + "additionalProperties": false + } + }, + "required": [ + "action" + ], + "additionalProperties": false + } + } + }, + "additionalProperties": false + }, + "maxBytes": { + "type": "integer", + "exclusiveMinimum": 0, + "maximum": 9007199254740991 + }, + "maxChars": { + "type": "integer", + "exclusiveMinimum": 0, + "maximum": 9007199254740991 + }, + "prompt": { + "type": "string" + }, + "timeoutSeconds": { + "type": "integer", + "exclusiveMinimum": 0, + "maximum": 9007199254740991 + }, + "language": { + "type": "string" + }, + "providerOptions": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + } + ] + } + } + }, + "deepgram": { + "type": "object", + "properties": { + "detectLanguage": { + "type": "boolean" + }, + "punctuate": { + "type": "boolean" + }, + "smartFormat": { + "type": "boolean" + } + }, + "additionalProperties": false + }, + "baseUrl": { + "type": "string" + }, + "headers": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "string" + } + }, + "attachments": { + "type": "object", + "properties": { + "mode": { + "anyOf": [ + { + "type": "string", + "const": "first" + }, + { + "type": "string", + "const": "all" + } + ] + }, + "maxAttachments": { + "type": "integer", + "exclusiveMinimum": 0, + "maximum": 9007199254740991 + }, + "prefer": { + "anyOf": [ + { + "type": "string", + "const": "first" + }, + { + "type": "string", + "const": "last" + }, + { + "type": "string", + "const": "path" + }, + { + "type": "string", + "const": "url" + } + ] + } + }, + "additionalProperties": false + }, + "models": { + "type": "array", + "items": { + "type": "object", + "properties": { + "provider": { + "type": "string" + }, + "model": { + "type": "string" + }, + "capabilities": { + "type": "array", + "items": { + "anyOf": [ + { + "type": "string", + "const": "image" + }, + { + "type": "string", + "const": "audio" + }, + { + "type": "string", + "const": "video" + } + ] + } + }, + "type": { + "anyOf": [ + { + "type": "string", + "const": "provider" + }, + { + "type": "string", + "const": "cli" + } + ] + }, + "command": { + "type": "string" + }, + "args": { + "type": "array", + "items": { + "type": "string" + } + }, + "prompt": { + "type": "string" + }, + "maxChars": { + "type": "integer", + "exclusiveMinimum": 0, + "maximum": 9007199254740991 + }, + "maxBytes": { + "type": "integer", + "exclusiveMinimum": 0, + "maximum": 9007199254740991 + }, + "timeoutSeconds": { + "type": "integer", + "exclusiveMinimum": 0, + "maximum": 9007199254740991 + }, + "language": { + "type": "string" + }, + "providerOptions": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + } + ] + } + } + }, + "deepgram": { + "type": "object", + "properties": { + "detectLanguage": { + "type": "boolean" + }, + "punctuate": { + "type": "boolean" + }, + "smartFormat": { + "type": "boolean" + } + }, + "additionalProperties": false + }, + "baseUrl": { + "type": "string" + }, + "headers": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "string" + } + }, + "profile": { + "type": "string" + }, + "preferredProfile": { + "type": "string" + } + }, + "additionalProperties": false + } + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + "links": { + "type": "object", + "properties": { + "enabled": { + "type": "boolean" + }, + "scope": { + "type": "object", + "properties": { + "default": { + "anyOf": [ + { + "type": "string", + "const": "allow" + }, + { + "type": "string", + "const": "deny" + } + ] + }, + "rules": { + "type": "array", + "items": { + "type": "object", + "properties": { + "action": { + "anyOf": [ + { + "type": "string", + "const": "allow" + }, + { + "type": "string", + "const": "deny" + } + ] + }, + "match": { + "type": "object", + "properties": { + "channel": { + "type": "string" + }, + "chatType": { + "anyOf": [ + { + "type": "string", + "const": "direct" + }, + { + "type": "string", + "const": "group" + }, + { + "type": "string", + "const": "channel" + } + ] + }, + "keyPrefix": { + "type": "string" + } + }, + "additionalProperties": false + } + }, + "required": [ + "action" + ], + "additionalProperties": false + } + } + }, + "additionalProperties": false + }, + "maxLinks": { + "type": "integer", + "exclusiveMinimum": 0, + "maximum": 9007199254740991 + }, + "timeoutSeconds": { + "type": "integer", + "exclusiveMinimum": 0, + "maximum": 9007199254740991 + }, + "models": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type": { + "type": "string", + "const": "cli" + }, + "command": { + "type": "string", + "minLength": 1 + }, + "args": { + "type": "array", + "items": { + "type": "string" + } + }, + "timeoutSeconds": { + "type": "integer", + "exclusiveMinimum": 0, + "maximum": 9007199254740991 + } + }, + "required": [ + "command" + ], + "additionalProperties": false + } + } + }, + "additionalProperties": false + }, + "message": { + "type": "object", + "properties": { + "allowCrossContextSend": { + "type": "boolean" + }, + "crossContext": { + "type": "object", + "properties": { + "allowWithinProvider": { + "type": "boolean" + }, + "allowAcrossProviders": { + "type": "boolean" + }, + "marker": { + "type": "object", + "properties": { + "enabled": { + "type": "boolean" + }, + "prefix": { + "type": "string" + }, + "suffix": { + "type": "string" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + "broadcast": { + "type": "object", + "properties": { + "enabled": { + "type": "boolean" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + "agentToAgent": { + "type": "object", + "properties": { + "enabled": { + "type": "boolean" + }, + "allow": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "additionalProperties": false + }, + "elevated": { + "type": "object", + "properties": { + "enabled": { + "type": "boolean" + }, + "allowFrom": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "array", + "items": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + } + } + } + }, + "additionalProperties": false + }, + "exec": { + "type": "object", + "properties": { + "host": { + "type": "string", + "enum": [ + "sandbox", + "gateway", + "node" + ] + }, + "security": { + "type": "string", + "enum": [ + "deny", + "allowlist", + "full" + ] + }, + "ask": { + "type": "string", + "enum": [ + "off", + "on-miss", + "always" + ] + }, + "node": { + "type": "string" + }, + "pathPrepend": { + "type": "array", + "items": { + "type": "string" + } + }, + "safeBins": { + "type": "array", + "items": { + "type": "string" + } + }, + "backgroundMs": { + "type": "integer", + "exclusiveMinimum": 0, + "maximum": 9007199254740991 + }, + "timeoutSec": { + "type": "integer", + "exclusiveMinimum": 0, + "maximum": 9007199254740991 + }, + "cleanupMs": { + "type": "integer", + "exclusiveMinimum": 0, + "maximum": 9007199254740991 + }, + "notifyOnExit": { + "type": "boolean" + }, + "applyPatch": { + "type": "object", + "properties": { + "enabled": { + "type": "boolean" + }, + "allowModels": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + "subagents": { + "type": "object", + "properties": { + "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 + }, + "sandbox": { + "type": "object", + "properties": { + "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 + } + }, + "additionalProperties": false + }, + "bindings": { + "type": "array", + "items": { + "type": "object", + "properties": { + "agentId": { + "type": "string" + }, + "match": { + "type": "object", + "properties": { + "channel": { + "type": "string" + }, + "accountId": { + "type": "string" + }, + "peer": { + "type": "object", + "properties": { + "kind": { + "anyOf": [ + { + "type": "string", + "const": "dm" + }, + { + "type": "string", + "const": "group" + }, + { + "type": "string", + "const": "channel" + } + ] + }, + "id": { + "type": "string" + } + }, + "required": [ + "kind", + "id" + ], + "additionalProperties": false + }, + "guildId": { + "type": "string" + }, + "teamId": { + "type": "string" + } + }, + "required": [ + "channel" + ], + "additionalProperties": false + } + }, + "required": [ + "agentId", + "match" + ], + "additionalProperties": false + } + }, + "broadcast": { + "type": "object", + "properties": { + "strategy": { + "type": "string", + "enum": [ + "parallel", + "sequential" + ] + } + }, + "additionalProperties": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "audio": { + "type": "object", + "properties": { + "transcription": { + "type": "object", + "properties": { + "command": { + "type": "array", + "items": { + "type": "string" + } + }, + "timeoutSeconds": { + "type": "integer", + "exclusiveMinimum": 0, + "maximum": 9007199254740991 + } + }, + "required": [ + "command" + ], + "additionalProperties": false + } + }, + "additionalProperties": false + }, + "media": { + "type": "object", + "properties": { + "preserveFilenames": { + "type": "boolean" + } + }, + "additionalProperties": false + }, + "messages": { + "type": "object", + "properties": { + "messagePrefix": { + "type": "string" + }, + "responsePrefix": { + "type": "string" + }, + "groupChat": { + "type": "object", + "properties": { + "mentionPatterns": { + "type": "array", + "items": { + "type": "string" + } + }, + "historyLimit": { + "type": "integer", + "exclusiveMinimum": 0, + "maximum": 9007199254740991 + } + }, + "additionalProperties": false + }, + "queue": { + "type": "object", + "properties": { + "mode": { + "anyOf": [ + { + "type": "string", + "const": "steer" + }, + { + "type": "string", + "const": "followup" + }, + { + "type": "string", + "const": "collect" + }, + { + "type": "string", + "const": "steer-backlog" + }, + { + "type": "string", + "const": "steer+backlog" + }, + { + "type": "string", + "const": "queue" + }, + { + "type": "string", + "const": "interrupt" + } + ] + }, + "byChannel": { + "type": "object", + "properties": { + "whatsapp": { + "anyOf": [ + { + "type": "string", + "const": "steer" + }, + { + "type": "string", + "const": "followup" + }, + { + "type": "string", + "const": "collect" + }, + { + "type": "string", + "const": "steer-backlog" + }, + { + "type": "string", + "const": "steer+backlog" + }, + { + "type": "string", + "const": "queue" + }, + { + "type": "string", + "const": "interrupt" + } + ] + }, + "telegram": { + "anyOf": [ + { + "type": "string", + "const": "steer" + }, + { + "type": "string", + "const": "followup" + }, + { + "type": "string", + "const": "collect" + }, + { + "type": "string", + "const": "steer-backlog" + }, + { + "type": "string", + "const": "steer+backlog" + }, + { + "type": "string", + "const": "queue" + }, + { + "type": "string", + "const": "interrupt" + } + ] + }, + "discord": { + "anyOf": [ + { + "type": "string", + "const": "steer" + }, + { + "type": "string", + "const": "followup" + }, + { + "type": "string", + "const": "collect" + }, + { + "type": "string", + "const": "steer-backlog" + }, + { + "type": "string", + "const": "steer+backlog" + }, + { + "type": "string", + "const": "queue" + }, + { + "type": "string", + "const": "interrupt" + } + ] + }, + "slack": { + "anyOf": [ + { + "type": "string", + "const": "steer" + }, + { + "type": "string", + "const": "followup" + }, + { + "type": "string", + "const": "collect" + }, + { + "type": "string", + "const": "steer-backlog" + }, + { + "type": "string", + "const": "steer+backlog" + }, + { + "type": "string", + "const": "queue" + }, + { + "type": "string", + "const": "interrupt" + } + ] + }, + "mattermost": { + "anyOf": [ + { + "type": "string", + "const": "steer" + }, + { + "type": "string", + "const": "followup" + }, + { + "type": "string", + "const": "collect" + }, + { + "type": "string", + "const": "steer-backlog" + }, + { + "type": "string", + "const": "steer+backlog" + }, + { + "type": "string", + "const": "queue" + }, + { + "type": "string", + "const": "interrupt" + } + ] + }, + "signal": { + "anyOf": [ + { + "type": "string", + "const": "steer" + }, + { + "type": "string", + "const": "followup" + }, + { + "type": "string", + "const": "collect" + }, + { + "type": "string", + "const": "steer-backlog" + }, + { + "type": "string", + "const": "steer+backlog" + }, + { + "type": "string", + "const": "queue" + }, + { + "type": "string", + "const": "interrupt" + } + ] + }, + "imessage": { + "anyOf": [ + { + "type": "string", + "const": "steer" + }, + { + "type": "string", + "const": "followup" + }, + { + "type": "string", + "const": "collect" + }, + { + "type": "string", + "const": "steer-backlog" + }, + { + "type": "string", + "const": "steer+backlog" + }, + { + "type": "string", + "const": "queue" + }, + { + "type": "string", + "const": "interrupt" + } + ] + }, + "msteams": { + "anyOf": [ + { + "type": "string", + "const": "steer" + }, + { + "type": "string", + "const": "followup" + }, + { + "type": "string", + "const": "collect" + }, + { + "type": "string", + "const": "steer-backlog" + }, + { + "type": "string", + "const": "steer+backlog" + }, + { + "type": "string", + "const": "queue" + }, + { + "type": "string", + "const": "interrupt" + } + ] + }, + "webchat": { + "anyOf": [ + { + "type": "string", + "const": "steer" + }, + { + "type": "string", + "const": "followup" + }, + { + "type": "string", + "const": "collect" + }, + { + "type": "string", + "const": "steer-backlog" + }, + { + "type": "string", + "const": "steer+backlog" + }, + { + "type": "string", + "const": "queue" + }, + { + "type": "string", + "const": "interrupt" + } + ] + } + }, + "additionalProperties": false + }, + "debounceMs": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + }, + "debounceMsByChannel": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + } + }, + "cap": { + "type": "integer", + "exclusiveMinimum": 0, + "maximum": 9007199254740991 + }, + "drop": { + "anyOf": [ + { + "type": "string", + "const": "old" + }, + { + "type": "string", + "const": "new" + }, + { + "type": "string", + "const": "summarize" + } + ] + } + }, + "additionalProperties": false + }, + "inbound": { + "type": "object", + "properties": { + "debounceMs": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + }, + "byChannel": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + } + } + }, + "additionalProperties": false + }, + "ackReaction": { + "type": "string" + }, + "ackReactionScope": { + "type": "string", + "enum": [ + "group-mentions", + "group-all", + "direct", + "all" + ] + }, + "removeAckAfterReply": { + "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", + "enum": [ + "elevenlabs", + "openai", + "edge" + ] + }, + "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 + }, + "elevenlabs": { + "type": "object", + "properties": { + "apiKey": { + "type": "string" + }, + "baseUrl": { + "type": "string" + }, + "voiceId": { + "type": "string" + }, + "modelId": { + "type": "string" + }, + "seed": { + "type": "integer", + "minimum": 0, + "maximum": 4294967295 + }, + "applyTextNormalization": { + "type": "string", + "enum": [ + "auto", + "on", + "off" + ] + }, + "languageCode": { + "type": "string" + }, + "voiceSettings": { + "type": "object", + "properties": { + "stability": { + "type": "number", + "minimum": 0, + "maximum": 1 + }, + "similarityBoost": { + "type": "number", + "minimum": 0, + "maximum": 1 + }, + "style": { + "type": "number", + "minimum": 0, + "maximum": 1 + }, + "useSpeakerBoost": { + "type": "boolean" + }, + "speed": { + "type": "number", + "minimum": 0.5, + "maximum": 2 + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + "openai": { + "type": "object", + "properties": { + "apiKey": { + "type": "string" + }, + "model": { + "type": "string" + }, + "voice": { + "type": "string" + } + }, + "additionalProperties": false + }, + "edge": { + "type": "object", + "properties": { + "enabled": { + "type": "boolean" + }, + "voice": { + "type": "string" + }, + "lang": { + "type": "string" + }, + "outputFormat": { + "type": "string" + }, + "pitch": { + "type": "string" + }, + "rate": { + "type": "string" + }, + "volume": { + "type": "string" + }, + "saveSubtitles": { + "type": "boolean" + }, + "proxy": { + "type": "string" + }, + "timeoutMs": { + "type": "integer", + "minimum": 1000, + "maximum": 120000 + } + }, + "additionalProperties": false + }, + "prefsPath": { + "type": "string" + }, + "maxTextLength": { + "type": "integer", + "minimum": 1, + "maximum": 9007199254740991 + }, + "timeoutMs": { + "type": "integer", + "minimum": 1000, + "maximum": 120000 + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + "commands": { + "default": { + "native": "auto", + "nativeSkills": "auto" + }, + "type": "object", + "properties": { + "native": { + "default": "auto", + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "const": "auto" + } + ] + }, + "nativeSkills": { + "default": "auto", + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "const": "auto" + } + ] + }, + "text": { + "type": "boolean" + }, + "bash": { + "type": "boolean" + }, + "bashForegroundMs": { + "type": "integer", + "minimum": 0, + "maximum": 30000 + }, + "config": { + "type": "boolean" + }, + "debug": { + "type": "boolean" + }, + "restart": { + "type": "boolean" + }, + "useAccessGroups": { + "type": "boolean" + } + }, + "required": [ + "native", + "nativeSkills" + ], + "additionalProperties": false + }, + "approvals": { + "type": "object", + "properties": { + "exec": { + "type": "object", + "properties": { + "enabled": { + "type": "boolean" + }, + "mode": { + "anyOf": [ + { + "type": "string", + "const": "session" + }, + { + "type": "string", + "const": "targets" + }, + { + "type": "string", + "const": "both" + } + ] + }, + "agentFilter": { + "type": "array", + "items": { + "type": "string" + } + }, + "sessionFilter": { + "type": "array", + "items": { + "type": "string" + } + }, + "targets": { + "type": "array", + "items": { + "type": "object", + "properties": { + "channel": { + "type": "string", + "minLength": 1 + }, + "to": { + "type": "string", + "minLength": 1 + }, + "accountId": { + "type": "string" + }, + "threadId": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + } + }, + "required": [ + "channel", + "to" + ], + "additionalProperties": false + } + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + "session": { + "type": "object", + "properties": { + "scope": { + "anyOf": [ + { + "type": "string", + "const": "per-sender" + }, + { + "type": "string", + "const": "global" + } + ] + }, + "dmScope": { + "anyOf": [ + { + "type": "string", + "const": "main" + }, + { + "type": "string", + "const": "per-peer" + }, + { + "type": "string", + "const": "per-channel-peer" + } + ] + }, + "identityLinks": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "resetTriggers": { + "type": "array", + "items": { + "type": "string" + } + }, + "idleMinutes": { + "type": "integer", + "exclusiveMinimum": 0, + "maximum": 9007199254740991 + }, + "reset": { + "type": "object", + "properties": { + "mode": { + "anyOf": [ + { + "type": "string", + "const": "daily" + }, + { + "type": "string", + "const": "idle" + } + ] + }, + "atHour": { + "type": "integer", + "minimum": 0, + "maximum": 23 + }, + "idleMinutes": { + "type": "integer", + "exclusiveMinimum": 0, + "maximum": 9007199254740991 + } + }, + "additionalProperties": false + }, + "resetByType": { + "type": "object", + "properties": { + "dm": { + "type": "object", + "properties": { + "mode": { + "anyOf": [ + { + "type": "string", + "const": "daily" + }, + { + "type": "string", + "const": "idle" + } + ] + }, + "atHour": { + "type": "integer", + "minimum": 0, + "maximum": 23 + }, + "idleMinutes": { + "type": "integer", + "exclusiveMinimum": 0, + "maximum": 9007199254740991 + } + }, + "additionalProperties": false + }, + "group": { + "type": "object", + "properties": { + "mode": { + "anyOf": [ + { + "type": "string", + "const": "daily" + }, + { + "type": "string", + "const": "idle" + } + ] + }, + "atHour": { + "type": "integer", + "minimum": 0, + "maximum": 23 + }, + "idleMinutes": { + "type": "integer", + "exclusiveMinimum": 0, + "maximum": 9007199254740991 + } + }, + "additionalProperties": false + }, + "thread": { + "type": "object", + "properties": { + "mode": { + "anyOf": [ + { + "type": "string", + "const": "daily" + }, + { + "type": "string", + "const": "idle" + } + ] + }, + "atHour": { + "type": "integer", + "minimum": 0, + "maximum": 23 + }, + "idleMinutes": { + "type": "integer", + "exclusiveMinimum": 0, + "maximum": 9007199254740991 + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + "resetByChannel": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "mode": { + "anyOf": [ + { + "type": "string", + "const": "daily" + }, + { + "type": "string", + "const": "idle" + } + ] + }, + "atHour": { + "type": "integer", + "minimum": 0, + "maximum": 23 + }, + "idleMinutes": { + "type": "integer", + "exclusiveMinimum": 0, + "maximum": 9007199254740991 + } + }, + "additionalProperties": false + } + }, + "store": { + "type": "string" + }, + "typingIntervalSeconds": { + "type": "integer", + "exclusiveMinimum": 0, + "maximum": 9007199254740991 + }, + "typingMode": { + "anyOf": [ + { + "type": "string", + "const": "never" + }, + { + "type": "string", + "const": "instant" + }, + { + "type": "string", + "const": "thinking" + }, + { + "type": "string", + "const": "message" + } + ] + }, + "mainKey": { + "type": "string" + }, + "sendPolicy": { + "type": "object", + "properties": { + "default": { + "anyOf": [ + { + "type": "string", + "const": "allow" + }, + { + "type": "string", + "const": "deny" + } + ] + }, + "rules": { + "type": "array", + "items": { + "type": "object", + "properties": { + "action": { + "anyOf": [ + { + "type": "string", + "const": "allow" + }, + { + "type": "string", + "const": "deny" + } + ] + }, + "match": { + "type": "object", + "properties": { + "channel": { + "type": "string" + }, + "chatType": { + "anyOf": [ + { + "type": "string", + "const": "direct" + }, + { + "type": "string", + "const": "group" + }, + { + "type": "string", + "const": "channel" + } + ] + }, + "keyPrefix": { + "type": "string" + } + }, + "additionalProperties": false + } + }, + "required": [ + "action" + ], + "additionalProperties": false + } + } + }, + "additionalProperties": false + }, + "agentToAgent": { + "type": "object", + "properties": { + "maxPingPongTurns": { + "type": "integer", + "minimum": 0, + "maximum": 5 + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + "cron": { + "type": "object", + "properties": { + "enabled": { + "type": "boolean" + }, + "store": { + "type": "string" + }, + "maxConcurrentRuns": { + "type": "integer", + "exclusiveMinimum": 0, + "maximum": 9007199254740991 + } + }, + "additionalProperties": false + }, + "hooks": { + "type": "object", + "properties": { + "enabled": { + "type": "boolean" + }, + "path": { + "type": "string" + }, + "token": { + "type": "string" + }, + "maxBodyBytes": { + "type": "integer", + "exclusiveMinimum": 0, + "maximum": 9007199254740991 + }, + "presets": { + "type": "array", + "items": { + "type": "string" + } + }, + "transformsDir": { + "type": "string" + }, + "mappings": { + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "match": { + "type": "object", + "properties": { + "path": { + "type": "string" + }, + "source": { + "type": "string" + } + }, + "additionalProperties": false + }, + "action": { + "anyOf": [ + { + "type": "string", + "const": "wake" + }, + { + "type": "string", + "const": "agent" + } + ] + }, + "wakeMode": { + "anyOf": [ + { + "type": "string", + "const": "now" + }, + { + "type": "string", + "const": "next-heartbeat" + } + ] + }, + "name": { + "type": "string" + }, + "sessionKey": { + "type": "string" + }, + "messageTemplate": { + "type": "string" + }, + "textTemplate": { + "type": "string" + }, + "deliver": { + "type": "boolean" + }, + "allowUnsafeExternalContent": { + "type": "boolean" + }, + "channel": { + "anyOf": [ + { + "type": "string", + "const": "last" + }, + { + "type": "string", + "const": "whatsapp" + }, + { + "type": "string", + "const": "telegram" + }, + { + "type": "string", + "const": "discord" + }, + { + "type": "string", + "const": "slack" + }, + { + "type": "string", + "const": "signal" + }, + { + "type": "string", + "const": "imessage" + }, + { + "type": "string", + "const": "msteams" + } + ] + }, + "to": { + "type": "string" + }, + "model": { + "type": "string" + }, + "thinking": { + "type": "string" + }, + "timeoutSeconds": { + "type": "integer", + "exclusiveMinimum": 0, + "maximum": 9007199254740991 + }, + "transform": { + "type": "object", + "properties": { + "module": { + "type": "string" + }, + "export": { + "type": "string" + } + }, + "required": [ + "module" + ], + "additionalProperties": false + } + }, + "additionalProperties": false + } + }, + "gmail": { + "type": "object", + "properties": { + "account": { + "type": "string" + }, + "label": { + "type": "string" + }, + "topic": { + "type": "string" + }, + "subscription": { + "type": "string" + }, + "pushToken": { + "type": "string" + }, + "hookUrl": { + "type": "string" + }, + "includeBody": { + "type": "boolean" + }, + "maxBytes": { + "type": "integer", + "exclusiveMinimum": 0, + "maximum": 9007199254740991 + }, + "renewEveryMinutes": { + "type": "integer", + "exclusiveMinimum": 0, + "maximum": 9007199254740991 + }, + "allowUnsafeExternalContent": { + "type": "boolean" + }, + "serve": { + "type": "object", + "properties": { + "bind": { + "type": "string" + }, + "port": { + "type": "integer", + "exclusiveMinimum": 0, + "maximum": 9007199254740991 + }, + "path": { + "type": "string" + } + }, + "additionalProperties": false + }, + "tailscale": { + "type": "object", + "properties": { + "mode": { + "anyOf": [ + { + "type": "string", + "const": "off" + }, + { + "type": "string", + "const": "serve" + }, + { + "type": "string", + "const": "funnel" + } + ] + }, + "path": { + "type": "string" + }, + "target": { + "type": "string" + } + }, + "additionalProperties": false + }, + "model": { + "type": "string" + }, + "thinking": { + "anyOf": [ + { + "type": "string", + "const": "off" + }, + { + "type": "string", + "const": "minimal" + }, + { + "type": "string", + "const": "low" + }, + { + "type": "string", + "const": "medium" + }, + { + "type": "string", + "const": "high" + } + ] + } + }, + "additionalProperties": false + }, + "internal": { + "type": "object", + "properties": { + "enabled": { + "type": "boolean" + }, + "handlers": { + "type": "array", + "items": { + "type": "object", + "properties": { + "event": { + "type": "string" + }, + "module": { + "type": "string" + }, + "export": { + "type": "string" + } + }, + "required": [ + "event", + "module" + ], + "additionalProperties": false + } + }, + "entries": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "enabled": { + "type": "boolean" + }, + "env": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "string" + } + } + }, + "additionalProperties": false + } + }, + "load": { + "type": "object", + "properties": { + "extraDirs": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "additionalProperties": false + }, + "installs": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "source": { + "anyOf": [ + { + "type": "string", + "const": "npm" + }, + { + "type": "string", + "const": "archive" + }, + { + "type": "string", + "const": "path" + } + ] + }, + "spec": { + "type": "string" + }, + "sourcePath": { + "type": "string" + }, + "installPath": { + "type": "string" + }, + "version": { + "type": "string" + }, + "installedAt": { + "type": "string" + }, + "hooks": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "required": [ + "source" + ], + "additionalProperties": false + } + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + "web": { + "type": "object", + "properties": { + "enabled": { + "type": "boolean" + }, + "heartbeatSeconds": { + "type": "integer", + "exclusiveMinimum": 0, + "maximum": 9007199254740991 + }, + "reconnect": { + "type": "object", + "properties": { + "initialMs": { + "type": "number", + "exclusiveMinimum": 0 + }, + "maxMs": { + "type": "number", + "exclusiveMinimum": 0 + }, + "factor": { + "type": "number", + "exclusiveMinimum": 0 + }, + "jitter": { + "type": "number", + "minimum": 0, + "maximum": 1 + }, + "maxAttempts": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + "channels": { + "type": "object", + "properties": { + "defaults": { + "type": "object", + "properties": { + "groupPolicy": { + "type": "string", + "enum": [ + "open", + "disabled", + "allowlist" + ] + }, + "heartbeat": { + "type": "object", + "properties": { + "showOk": { + "type": "boolean" + }, + "showAlerts": { + "type": "boolean" + }, + "useIndicator": { + "type": "boolean" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + "whatsapp": { + "type": "object", + "properties": { + "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" + ] + } + }, + "additionalProperties": false + }, + "configWrites": { + "type": "boolean" + }, + "enabled": { + "type": "boolean" + }, + "sendReadReceipts": { + "type": "boolean" + }, + "messagePrefix": { + "type": "string" + }, + "authDir": { + "type": "string" + }, + "dmPolicy": { + "default": "pairing", + "type": "string", + "enum": [ + "pairing", + "allowlist", + "open", + "disabled" + ] + }, + "selfChatMode": { + "type": "boolean" + }, + "allowFrom": { + "type": "array", + "items": { + "type": "string" + } + }, + "groupAllowFrom": { + "type": "array", + "items": { + "type": "string" + } + }, + "groupPolicy": { + "default": "allowlist", + "type": "string", + "enum": [ + "open", + "disabled", + "allowlist" + ] + }, + "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" + ] + }, + "mediaMaxMb": { + "type": "integer", + "exclusiveMinimum": 0, + "maximum": 9007199254740991 + }, + "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 + } + }, + "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 + }, + "debounceMs": { + "default": 0, + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + }, + "heartbeat": { + "type": "object", + "properties": { + "showOk": { + "type": "boolean" + }, + "showAlerts": { + "type": "boolean" + }, + "useIndicator": { + "type": "boolean" + } + }, + "additionalProperties": false + } + }, + "required": [ + "dmPolicy", + "groupPolicy", + "debounceMs" + ], + "additionalProperties": false + } + }, + "capabilities": { + "type": "array", + "items": { + "type": "string" + } + }, + "markdown": { + "type": "object", + "properties": { + "tables": { + "type": "string", + "enum": [ + "off", + "bullets", + "code" + ] + } + }, + "additionalProperties": false + }, + "configWrites": { + "type": "boolean" + }, + "sendReadReceipts": { + "type": "boolean" + }, + "dmPolicy": { + "default": "pairing", + "type": "string", + "enum": [ + "pairing", + "allowlist", + "open", + "disabled" + ] + }, + "messagePrefix": { + "type": "string" + }, + "selfChatMode": { + "type": "boolean" + }, + "allowFrom": { + "type": "array", + "items": { + "type": "string" + } + }, + "groupAllowFrom": { + "type": "array", + "items": { + "type": "string" + } + }, + "groupPolicy": { + "default": "allowlist", + "type": "string", + "enum": [ + "open", + "disabled", + "allowlist" + ] + }, + "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" + ] + }, + "mediaMaxMb": { + "default": 50, + "type": "integer", + "exclusiveMinimum": 0, + "maximum": 9007199254740991 + }, + "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 + }, + "actions": { + "type": "object", + "properties": { + "reactions": { + "type": "boolean" + }, + "sendMessage": { + "type": "boolean" + }, + "polls": { + "type": "boolean" + } + }, + "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 + } + }, + "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 + }, + "debounceMs": { + "default": 0, + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + }, + "heartbeat": { + "type": "object", + "properties": { + "showOk": { + "type": "boolean" + }, + "showAlerts": { + "type": "boolean" + }, + "useIndicator": { + "type": "boolean" + } + }, + "additionalProperties": false + } + }, + "required": [ + "dmPolicy", + "groupPolicy", + "mediaMaxMb", + "debounceMs" + ], + "additionalProperties": false + }, + "telegram": { + "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 + } + ] + }, + "markdown": { + "type": "object", + "properties": { + "tables": { + "type": "string", + "enum": [ + "off", + "bullets", + "code" + ] + } + }, + "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": {}, + "description": {} + }, + "required": [ + "command", + "description" + ], + "additionalProperties": false + } + }, + "configWrites": { + "type": "boolean" + }, + "dmPolicy": { + "default": "pairing", + "type": "string", + "enum": [ + "pairing", + "allowlist", + "open", + "disabled" + ] + }, + "botToken": { + "type": "string" + }, + "tokenFile": { + "type": "string" + }, + "replyToMode": { + "anyOf": [ + { + "type": "string", + "const": "off" + }, + { + "type": "string", + "const": "first" + }, + { + "type": "string", + "const": "all" + } + ] + }, + "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" + }, + "topics": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "requireMention": { + "type": "boolean" + }, + "skills": { + "type": "array", + "items": { + "type": "string" + } + }, + "enabled": { + "type": "boolean" + }, + "allowFrom": { + "type": "array", + "items": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + } + }, + "systemPrompt": { + "type": "string" + } + }, + "additionalProperties": false + } + } + }, + "additionalProperties": false + } + }, + "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" + ] + }, + "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" + }, + "draftChunk": { + "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 + }, + "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 + }, + "streamMode": { + "default": "partial", + "type": "string", + "enum": [ + "off", + "partial", + "block" + ] + }, + "mediaMaxMb": { + "type": "number", + "exclusiveMinimum": 0 + }, + "timeoutSeconds": { + "type": "integer", + "exclusiveMinimum": 0, + "maximum": 9007199254740991 + }, + "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" + } + }, + "additionalProperties": false + }, + "proxy": { + "type": "string" + }, + "webhookUrl": { + "type": "string" + }, + "webhookSecret": { + "type": "string" + }, + "webhookPath": { + "type": "string" + }, + "actions": { + "type": "object", + "properties": { + "reactions": { + "type": "boolean" + }, + "sendMessage": { + "type": "boolean" + }, + "deleteMessage": { + "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 + }, + "linkPreview": { + "type": "boolean" + }, + "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 + } + ] + }, + "markdown": { + "type": "object", + "properties": { + "tables": { + "type": "string", + "enum": [ + "off", + "bullets", + "code" + ] + } + }, + "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": {}, + "description": {} + }, + "required": [ + "command", + "description" + ], + "additionalProperties": false + } + }, + "configWrites": { + "type": "boolean" + }, + "dmPolicy": { + "default": "pairing", + "type": "string", + "enum": [ + "pairing", + "allowlist", + "open", + "disabled" + ] + }, + "botToken": { + "type": "string" + }, + "tokenFile": { + "type": "string" + }, + "replyToMode": { + "anyOf": [ + { + "type": "string", + "const": "off" + }, + { + "type": "string", + "const": "first" + }, + { + "type": "string", + "const": "all" + } + ] + }, + "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" + }, + "topics": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "requireMention": { + "type": "boolean" + }, + "skills": { + "type": "array", + "items": { + "type": "string" + } + }, + "enabled": { + "type": "boolean" + }, + "allowFrom": { + "type": "array", + "items": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + } + }, + "systemPrompt": { + "type": "string" + } + }, + "additionalProperties": false + } + } + }, + "additionalProperties": false + } + }, + "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" + ] + }, + "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" + }, + "draftChunk": { + "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 + }, + "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 + }, + "streamMode": { + "default": "partial", + "type": "string", + "enum": [ + "off", + "partial", + "block" + ] + }, + "mediaMaxMb": { + "type": "number", + "exclusiveMinimum": 0 + }, + "timeoutSeconds": { + "type": "integer", + "exclusiveMinimum": 0, + "maximum": 9007199254740991 + }, + "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" + } + }, + "additionalProperties": false + }, + "proxy": { + "type": "string" + }, + "webhookUrl": { + "type": "string" + }, + "webhookSecret": { + "type": "string" + }, + "webhookPath": { + "type": "string" + }, + "actions": { + "type": "object", + "properties": { + "reactions": { + "type": "boolean" + }, + "sendMessage": { + "type": "boolean" + }, + "deleteMessage": { + "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 + }, + "linkPreview": { + "type": "boolean" + } + }, + "required": [ + "dmPolicy", + "groupPolicy", + "streamMode" + ], + "additionalProperties": false + } + } + }, + "required": [ + "dmPolicy", + "groupPolicy", + "streamMode" + ], + "additionalProperties": false + }, + "discord": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "capabilities": { + "type": "array", + "items": { + "type": "string" + } + }, + "markdown": { + "type": "object", + "properties": { + "tables": { + "type": "string", + "enum": [ + "off", + "bullets", + "code" + ] + } + }, + "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": { + "type": "string" + }, + "allowBots": { + "type": "boolean" + }, + "groupPolicy": { + "default": "allowlist", + "type": "string", + "enum": [ + "open", + "disabled", + "allowlist" + ] + }, + "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 + }, + "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" + } + }, + "additionalProperties": false + }, + "replyToMode": { + "anyOf": [ + { + "type": "string", + "const": "off" + }, + { + "type": "string", + "const": "first" + }, + { + "type": "string", + "const": "all" + } + ] + }, + "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" + } + ] + } + }, + "groupEnabled": { + "type": "boolean" + }, + "groupChannels": { + "type": "array", + "items": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + } + } + }, + "required": [ + "policy" + ], + "additionalProperties": false + }, + "guilds": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "slug": { + "type": "string" + }, + "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 + } + }, + "reactionNotifications": { + "type": "string", + "enum": [ + "off", + "own", + "all", + "allowlist" + ] + }, + "users": { + "type": "array", + "items": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + } + }, + "channels": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "allow": { + "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 + } + }, + "skills": { + "type": "array", + "items": { + "type": "string" + } + }, + "enabled": { + "type": "boolean" + }, + "users": { + "type": "array", + "items": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + } + }, + "systemPrompt": { + "type": "string" + }, + "autoThread": { + "type": "boolean" + } + }, + "additionalProperties": false + } + } + }, + "additionalProperties": false + } + }, + "heartbeat": { + "type": "object", + "properties": { + "showOk": { + "type": "boolean" + }, + "showAlerts": { + "type": "boolean" + }, + "useIndicator": { + "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" + } + } + }, + "additionalProperties": false + }, + "intents": { + "type": "object", + "properties": { + "presence": { + "type": "boolean" + }, + "guildMembers": { + "type": "boolean" + } + }, + "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" + ] + } + }, + "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": { + "type": "string" + }, + "allowBots": { + "type": "boolean" + }, + "groupPolicy": { + "default": "allowlist", + "type": "string", + "enum": [ + "open", + "disabled", + "allowlist" + ] + }, + "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 + }, + "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" + } + }, + "additionalProperties": false + }, + "replyToMode": { + "anyOf": [ + { + "type": "string", + "const": "off" + }, + { + "type": "string", + "const": "first" + }, + { + "type": "string", + "const": "all" + } + ] + }, + "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" + } + ] + } + }, + "groupEnabled": { + "type": "boolean" + }, + "groupChannels": { + "type": "array", + "items": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + } + } + }, + "required": [ + "policy" + ], + "additionalProperties": false + }, + "guilds": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "slug": { + "type": "string" + }, + "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 + } + }, + "reactionNotifications": { + "type": "string", + "enum": [ + "off", + "own", + "all", + "allowlist" + ] + }, + "users": { + "type": "array", + "items": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + } + }, + "channels": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "allow": { + "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 + } + }, + "skills": { + "type": "array", + "items": { + "type": "string" + } + }, + "enabled": { + "type": "boolean" + }, + "users": { + "type": "array", + "items": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + } + }, + "systemPrompt": { + "type": "string" + }, + "autoThread": { + "type": "boolean" + } + }, + "additionalProperties": false + } + } + }, + "additionalProperties": false + } + }, + "heartbeat": { + "type": "object", + "properties": { + "showOk": { + "type": "boolean" + }, + "showAlerts": { + "type": "boolean" + }, + "useIndicator": { + "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" + } + } + }, + "additionalProperties": false + }, + "intents": { + "type": "object", + "properties": { + "presence": { + "type": "boolean" + }, + "guildMembers": { + "type": "boolean" + } + }, + "additionalProperties": false + } + }, + "required": [ + "groupPolicy" + ], + "additionalProperties": false + } + } + }, + "required": [ + "groupPolicy" + ], + "additionalProperties": false + }, + "googlechat": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "capabilities": { + "type": "array", + "items": { + "type": "string" + } + }, + "enabled": { + "type": "boolean" + }, + "configWrites": { + "type": "boolean" + }, + "allowBots": { + "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" + }, + "allow": { + "type": "boolean" + }, + "requireMention": { + "type": "boolean" + }, + "users": { + "type": "array", + "items": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + } + }, + "systemPrompt": { + "type": "string" + } + }, + "additionalProperties": false + } + }, + "serviceAccount": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + ] + }, + "serviceAccountFile": { + "type": "string" + }, + "audienceType": { + "type": "string", + "enum": [ + "app-url", + "project-number" + ] + }, + "audience": { + "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" + } + ] + }, + "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 + }, + "typingIndicator": { + "type": "string", + "enum": [ + "none", + "message", + "reaction" + ] + }, + "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" + }, + "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" + }, + "allow": { + "type": "boolean" + }, + "requireMention": { + "type": "boolean" + }, + "users": { + "type": "array", + "items": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + } + }, + "systemPrompt": { + "type": "string" + } + }, + "additionalProperties": false + } + }, + "serviceAccount": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + ] + }, + "serviceAccountFile": { + "type": "string" + }, + "audienceType": { + "type": "string", + "enum": [ + "app-url", + "project-number" + ] + }, + "audience": { + "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" + } + ] + }, + "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 + }, + "typingIndicator": { + "type": "string", + "enum": [ + "none", + "message", + "reaction" + ] + } + }, + "required": [ + "groupPolicy" + ], + "additionalProperties": false + } + }, + "defaultAccount": { + "type": "string" + } + }, + "required": [ + "groupPolicy" + ], + "additionalProperties": false + }, + "slack": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "mode": { + "default": "socket", + "type": "string", + "enum": [ + "socket", + "http" + ] + }, + "signingSecret": { + "type": "string" + }, + "webhookPath": { + "default": "/slack/events", + "type": "string" + }, + "capabilities": { + "type": "array", + "items": { + "type": "string" + } + }, + "markdown": { + "type": "object", + "properties": { + "tables": { + "type": "string", + "enum": [ + "off", + "bullets", + "code" + ] + } + }, + "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": { + "type": "string" + }, + "appToken": { + "type": "string" + }, + "userToken": { + "type": "string" + }, + "userTokenReadOnly": { + "default": true, + "type": "boolean" + }, + "allowBots": { + "type": "boolean" + }, + "requireMention": { + "type": "boolean" + }, + "groupPolicy": { + "default": "allowlist", + "type": "string", + "enum": [ + "open", + "disabled", + "allowlist" + ] + }, + "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 + }, + "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" + } + ] + }, + "replyToModeByChatType": { + "type": "object", + "properties": { + "direct": { + "anyOf": [ + { + "type": "string", + "const": "off" + }, + { + "type": "string", + "const": "first" + }, + { + "type": "string", + "const": "all" + } + ] + }, + "group": { + "anyOf": [ + { + "type": "string", + "const": "off" + }, + { + "type": "string", + "const": "first" + }, + { + "type": "string", + "const": "all" + } + ] + }, + "channel": { + "anyOf": [ + { + "type": "string", + "const": "off" + }, + { + "type": "string", + "const": "first" + }, + { + "type": "string", + "const": "all" + } + ] + } + }, + "additionalProperties": false + }, + "thread": { + "type": "object", + "properties": { + "historyScope": { + "type": "string", + "enum": [ + "thread", + "channel" + ] + }, + "inheritParent": { + "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 + }, + "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" + } + ] + } + }, + "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" + } + ] + } + }, + "required": [ + "policy" + ], + "additionalProperties": false + }, + "channels": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "enabled": { + "type": "boolean" + }, + "allow": { + "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 + }, + "accounts": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "mode": { + "type": "string", + "enum": [ + "socket", + "http" + ] + }, + "signingSecret": { + "type": "string" + }, + "webhookPath": { + "type": "string" + }, + "capabilities": { + "type": "array", + "items": { + "type": "string" + } + }, + "markdown": { + "type": "object", + "properties": { + "tables": { + "type": "string", + "enum": [ + "off", + "bullets", + "code" + ] + } + }, + "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": { + "type": "string" + }, + "appToken": { + "type": "string" + }, + "userToken": { + "type": "string" + }, + "userTokenReadOnly": { + "default": true, + "type": "boolean" + }, + "allowBots": { + "type": "boolean" + }, + "requireMention": { + "type": "boolean" + }, + "groupPolicy": { + "default": "allowlist", + "type": "string", + "enum": [ + "open", + "disabled", + "allowlist" + ] + }, + "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 + }, + "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" + } + ] + }, + "replyToModeByChatType": { + "type": "object", + "properties": { + "direct": { + "anyOf": [ + { + "type": "string", + "const": "off" + }, + { + "type": "string", + "const": "first" + }, + { + "type": "string", + "const": "all" + } + ] + }, + "group": { + "anyOf": [ + { + "type": "string", + "const": "off" + }, + { + "type": "string", + "const": "first" + }, + { + "type": "string", + "const": "all" + } + ] + }, + "channel": { + "anyOf": [ + { + "type": "string", + "const": "off" + }, + { + "type": "string", + "const": "first" + }, + { + "type": "string", + "const": "all" + } + ] + } + }, + "additionalProperties": false + }, + "thread": { + "type": "object", + "properties": { + "historyScope": { + "type": "string", + "enum": [ + "thread", + "channel" + ] + }, + "inheritParent": { + "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 + }, + "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" + } + ] + } + }, + "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" + } + ] + } + }, + "required": [ + "policy" + ], + "additionalProperties": false + }, + "channels": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "enabled": { + "type": "boolean" + }, + "allow": { + "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 + } + }, + "required": [ + "userTokenReadOnly", + "groupPolicy" + ], + "additionalProperties": false + } + } + }, + "required": [ + "mode", + "webhookPath", + "userTokenReadOnly", + "groupPolicy" + ], + "additionalProperties": false + }, + "signal": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "capabilities": { + "type": "array", + "items": { + "type": "string" + } + }, + "markdown": { + "type": "object", + "properties": { + "tables": { + "type": "string", + "enum": [ + "off", + "bullets", + "code" + ] + } + }, + "additionalProperties": false + }, + "enabled": { + "type": "boolean" + }, + "configWrites": { + "type": "boolean" + }, + "account": { + "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" + } + ] + } + }, + "groupAllowFrom": { + "type": "array", + "items": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + } + }, + "groupPolicy": { + "default": "allowlist", + "type": "string", + "enum": [ + "open", + "disabled", + "allowlist" + ] + }, + "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 + }, + "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" + ] + } + }, + "additionalProperties": false + }, + "enabled": { + "type": "boolean" + }, + "configWrites": { + "type": "boolean" + }, + "account": { + "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" + } + ] + } + }, + "groupAllowFrom": { + "type": "array", + "items": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + } + }, + "groupPolicy": { + "default": "allowlist", + "type": "string", + "enum": [ + "open", + "disabled", + "allowlist" + ] + }, + "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 + } + }, + "required": [ + "dmPolicy", + "groupPolicy" + ], + "additionalProperties": false + } + } + }, + "required": [ + "dmPolicy", + "groupPolicy" + ], + "additionalProperties": false + }, + "imessage": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "capabilities": { + "type": "array", + "items": { + "type": "string" + } + }, + "markdown": { + "type": "object", + "properties": { + "tables": { + "type": "string", + "enum": [ + "off", + "bullets", + "code" + ] + } + }, + "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" + } + ] + } + }, + "groupAllowFrom": { + "type": "array", + "items": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + } + }, + "groupPolicy": { + "default": "allowlist", + "type": "string", + "enum": [ + "open", + "disabled", + "allowlist" + ] + }, + "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" + }, + "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 + }, + "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" + ] + } + }, + "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" + } + ] + } + }, + "groupAllowFrom": { + "type": "array", + "items": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + } + }, + "groupPolicy": { + "default": "allowlist", + "type": "string", + "enum": [ + "open", + "disabled", + "allowlist" + ] + }, + "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" + }, + "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 + } + }, + "required": [ + "dmPolicy", + "groupPolicy" + ], + "additionalProperties": false + } + } + }, + "required": [ + "dmPolicy", + "groupPolicy" + ], + "additionalProperties": false + }, + "bluebubbles": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "capabilities": { + "type": "array", + "items": { + "type": "string" + } + }, + "markdown": { + "type": "object", + "properties": { + "tables": { + "type": "string", + "enum": [ + "off", + "bullets", + "code" + ] + } + }, + "additionalProperties": false + }, + "configWrites": { + "type": "boolean" + }, + "enabled": { + "type": "boolean" + }, + "serverUrl": { + "type": "string" + }, + "password": { + "type": "string" + }, + "webhookPath": { + "type": "string" + }, + "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" + ] + }, + "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" + ] + }, + "mediaMaxMb": { + "type": "integer", + "exclusiveMinimum": 0, + "maximum": 9007199254740991 + }, + "sendReadReceipts": { + "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 + }, + "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 + }, + "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" + ] + } + }, + "additionalProperties": false + }, + "configWrites": { + "type": "boolean" + }, + "enabled": { + "type": "boolean" + }, + "serverUrl": { + "type": "string" + }, + "password": { + "type": "string" + }, + "webhookPath": { + "type": "string" + }, + "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" + ] + }, + "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" + ] + }, + "mediaMaxMb": { + "type": "integer", + "exclusiveMinimum": 0, + "maximum": 9007199254740991 + }, + "sendReadReceipts": { + "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 + }, + "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 + } + }, + "required": [ + "dmPolicy", + "groupPolicy" + ], + "additionalProperties": false + } + }, + "actions": { + "type": "object", + "properties": { + "reactions": { + "type": "boolean" + }, + "edit": { + "type": "boolean" + }, + "unsend": { + "type": "boolean" + }, + "reply": { + "type": "boolean" + }, + "sendWithEffect": { + "type": "boolean" + }, + "renameGroup": { + "type": "boolean" + }, + "setGroupIcon": { + "type": "boolean" + }, + "addParticipant": { + "type": "boolean" + }, + "removeParticipant": { + "type": "boolean" + }, + "leaveGroup": { + "type": "boolean" + }, + "sendAttachment": { + "type": "boolean" + } + }, + "additionalProperties": false + } + }, + "required": [ + "dmPolicy", + "groupPolicy" + ], + "additionalProperties": false + }, + "msteams": { + "type": "object", + "properties": { + "enabled": { + "type": "boolean" + }, + "capabilities": { + "type": "array", + "items": { + "type": "string" + } + }, + "markdown": { + "type": "object", + "properties": { + "tables": { + "type": "string", + "enum": [ + "off", + "bullets", + "code" + ] + } + }, + "additionalProperties": false + }, + "configWrites": { + "type": "boolean" + }, + "appId": { + "type": "string" + }, + "appPassword": { + "type": "string" + }, + "tenantId": { + "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" + } + }, + "groupAllowFrom": { + "type": "array", + "items": { + "type": "string" + } + }, + "groupPolicy": { + "default": "allowlist", + "type": "string", + "enum": [ + "open", + "disabled", + "allowlist" + ] + }, + "textChunkLimit": { + "type": "integer", + "exclusiveMinimum": 0, + "maximum": 9007199254740991 + }, + "chunkMode": { + "type": "string", + "enum": [ + "length", + "newline" + ] + }, + "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" + } + }, + "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 + } + }, + "required": [ + "dmPolicy", + "groupPolicy" + ], + "additionalProperties": false + } + }, + "additionalProperties": {} + }, + "discovery": { + "type": "object", + "properties": { + "wideArea": { + "type": "object", + "properties": { + "enabled": { + "type": "boolean" + } + }, + "additionalProperties": false + }, + "mdns": { + "type": "object", + "properties": { + "mode": { + "type": "string", + "enum": [ + "off", + "minimal", + "full" + ] + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + "canvasHost": { + "type": "object", + "properties": { + "enabled": { + "type": "boolean" + }, + "root": { + "type": "string" + }, + "port": { + "type": "integer", + "exclusiveMinimum": 0, + "maximum": 9007199254740991 + }, + "liveReload": { + "type": "boolean" + } + }, + "additionalProperties": false + }, + "talk": { + "type": "object", + "properties": { + "voiceId": { + "type": "string" + }, + "voiceAliases": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "string" + } + }, + "modelId": { + "type": "string" + }, + "outputFormat": { + "type": "string" + }, + "apiKey": { + "type": "string" + }, + "interruptOnSpeech": { + "type": "boolean" + } + }, + "additionalProperties": false + }, + "gateway": { + "type": "object", + "properties": { + "port": { + "type": "integer", + "exclusiveMinimum": 0, + "maximum": 9007199254740991 + }, + "mode": { + "anyOf": [ + { + "type": "string", + "const": "local" + }, + { + "type": "string", + "const": "remote" + } + ] + }, + "bind": { + "anyOf": [ + { + "type": "string", + "const": "auto" + }, + { + "type": "string", + "const": "lan" + }, + { + "type": "string", + "const": "loopback" + }, + { + "type": "string", + "const": "custom" + }, + { + "type": "string", + "const": "tailnet" + } + ] + }, + "controlUi": { + "type": "object", + "properties": { + "enabled": { + "type": "boolean" + }, + "basePath": { + "type": "string" + }, + "allowInsecureAuth": { + "type": "boolean" + }, + "dangerouslyDisableDeviceAuth": { + "type": "boolean" + } + }, + "additionalProperties": false + }, + "auth": { + "type": "object", + "properties": { + "mode": { + "anyOf": [ + { + "type": "string", + "const": "token" + }, + { + "type": "string", + "const": "password" + } + ] + }, + "token": { + "type": "string" + }, + "password": { + "type": "string" + }, + "allowTailscale": { + "type": "boolean" + } + }, + "additionalProperties": false + }, + "trustedProxies": { + "type": "array", + "items": { + "type": "string" + } + }, + "tailscale": { + "type": "object", + "properties": { + "mode": { + "anyOf": [ + { + "type": "string", + "const": "off" + }, + { + "type": "string", + "const": "serve" + }, + { + "type": "string", + "const": "funnel" + } + ] + }, + "resetOnExit": { + "type": "boolean" + } + }, + "additionalProperties": false + }, + "remote": { + "type": "object", + "properties": { + "url": { + "type": "string" + }, + "transport": { + "anyOf": [ + { + "type": "string", + "const": "ssh" + }, + { + "type": "string", + "const": "direct" + } + ] + }, + "token": { + "type": "string" + }, + "password": { + "type": "string" + }, + "tlsFingerprint": { + "type": "string" + }, + "sshTarget": { + "type": "string" + }, + "sshIdentity": { + "type": "string" + } + }, + "additionalProperties": false + }, + "reload": { + "type": "object", + "properties": { + "mode": { + "anyOf": [ + { + "type": "string", + "const": "off" + }, + { + "type": "string", + "const": "restart" + }, + { + "type": "string", + "const": "hot" + }, + { + "type": "string", + "const": "hybrid" + } + ] + }, + "debounceMs": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + } + }, + "additionalProperties": false + }, + "tls": { + "type": "object", + "properties": { + "enabled": { + "type": "boolean" + }, + "autoGenerate": { + "type": "boolean" + }, + "certPath": { + "type": "string" + }, + "keyPath": { + "type": "string" + }, + "caPath": { + "type": "string" + } + }, + "additionalProperties": false + }, + "http": { + "type": "object", + "properties": { + "endpoints": { + "type": "object", + "properties": { + "chatCompletions": { + "type": "object", + "properties": { + "enabled": { + "type": "boolean" + } + }, + "additionalProperties": false + }, + "responses": { + "type": "object", + "properties": { + "enabled": { + "type": "boolean" + }, + "maxBodyBytes": { + "type": "integer", + "exclusiveMinimum": 0, + "maximum": 9007199254740991 + }, + "files": { + "type": "object", + "properties": { + "allowUrl": { + "type": "boolean" + }, + "allowedMimes": { + "type": "array", + "items": { + "type": "string" + } + }, + "maxBytes": { + "type": "integer", + "exclusiveMinimum": 0, + "maximum": 9007199254740991 + }, + "maxChars": { + "type": "integer", + "exclusiveMinimum": 0, + "maximum": 9007199254740991 + }, + "maxRedirects": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + }, + "timeoutMs": { + "type": "integer", + "exclusiveMinimum": 0, + "maximum": 9007199254740991 + }, + "pdf": { + "type": "object", + "properties": { + "maxPages": { + "type": "integer", + "exclusiveMinimum": 0, + "maximum": 9007199254740991 + }, + "maxPixels": { + "type": "integer", + "exclusiveMinimum": 0, + "maximum": 9007199254740991 + }, + "minTextChars": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + "images": { + "type": "object", + "properties": { + "allowUrl": { + "type": "boolean" + }, + "allowedMimes": { + "type": "array", + "items": { + "type": "string" + } + }, + "maxBytes": { + "type": "integer", + "exclusiveMinimum": 0, + "maximum": 9007199254740991 + }, + "maxRedirects": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + }, + "timeoutMs": { + "type": "integer", + "exclusiveMinimum": 0, + "maximum": 9007199254740991 + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + "nodes": { + "type": "object", + "properties": { + "browser": { + "type": "object", + "properties": { + "mode": { + "anyOf": [ + { + "type": "string", + "const": "auto" + }, + { + "type": "string", + "const": "manual" + }, + { + "type": "string", + "const": "off" + } + ] + }, + "node": { + "type": "string" + } + }, + "additionalProperties": false + }, + "allowCommands": { + "type": "array", + "items": { + "type": "string" + } + }, + "denyCommands": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + "skills": { + "type": "object", + "properties": { + "allowBundled": { + "type": "array", + "items": { + "type": "string" + } + }, + "load": { + "type": "object", + "properties": { + "extraDirs": { + "type": "array", + "items": { + "type": "string" + } + }, + "watch": { + "type": "boolean" + }, + "watchDebounceMs": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + } + }, + "additionalProperties": false + }, + "install": { + "type": "object", + "properties": { + "preferBrew": { + "type": "boolean" + }, + "nodeManager": { + "anyOf": [ + { + "type": "string", + "const": "npm" + }, + { + "type": "string", + "const": "pnpm" + }, + { + "type": "string", + "const": "yarn" + }, + { + "type": "string", + "const": "bun" + } + ] + } + }, + "additionalProperties": false + }, + "entries": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "enabled": { + "type": "boolean" + }, + "apiKey": { + "type": "string" + }, + "env": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "string" + } + }, + "config": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "additionalProperties": false + } + } + }, + "additionalProperties": false + }, + "plugins": { + "type": "object", + "properties": { + "enabled": { + "type": "boolean" + }, + "allow": { + "type": "array", + "items": { + "type": "string" + } + }, + "deny": { + "type": "array", + "items": { + "type": "string" + } + }, + "load": { + "type": "object", + "properties": { + "paths": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "additionalProperties": false + }, + "slots": { + "type": "object", + "properties": { + "memory": { + "type": "string" + } + }, + "additionalProperties": false + }, + "entries": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "enabled": { + "type": "boolean" + }, + "config": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {} + } + }, + "additionalProperties": false + } + }, + "installs": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "type": "object", + "properties": { + "source": { + "anyOf": [ + { + "type": "string", + "const": "npm" + }, + { + "type": "string", + "const": "archive" + }, + { + "type": "string", + "const": "path" + } + ] + }, + "spec": { + "type": "string" + }, + "sourcePath": { + "type": "string" + }, + "installPath": { + "type": "string" + }, + "version": { + "type": "string" + }, + "installedAt": { + "type": "string" + } + }, + "required": [ + "source" + ], + "additionalProperties": false + } + } + }, + "additionalProperties": false + } + }, + "required": [ + "commands" + ], + "additionalProperties": false +} \ No newline at end of file diff --git a/scripts/gen-config-schema.ts b/scripts/gen-config-schema.ts new file mode 100644 index 000000000..9c37e443a --- /dev/null +++ b/scripts/gen-config-schema.ts @@ -0,0 +1,50 @@ +#!/usr/bin/env bun +/** + * Generates schemas/clawdbot.schema.json and schemas/clawdbot.d.ts + * from the zod schema source. + * + * Usage: bun scripts/gen-config-schema.ts + */ +import { writeFile, mkdir } from "node:fs/promises"; +import { dirname, join } from "node:path"; +import { fileURLToPath } from "node:url"; +import { compile } from "json-schema-to-typescript"; +import { ClawdbotSchema } from "../src/config/zod-schema.js"; + +const __dirname = dirname(fileURLToPath(import.meta.url)); +const rootDir = join(__dirname, ".."); +const schemasDir = join(rootDir, "schemas"); + +async function main() { + await mkdir(schemasDir, { recursive: true }); + + // Generate JSON schema from zod + const jsonSchema = ClawdbotSchema.toJSONSchema({ + target: "draft-07", + unrepresentable: "any", + }); + + const schemaPath = join(schemasDir, "clawdbot.schema.json"); + await writeFile(schemaPath, JSON.stringify(jsonSchema, null, 2)); + console.log(`Wrote ${schemaPath}`); + + // Generate TypeScript types from JSON schema + const dts = await compile(jsonSchema as Record, "ClawdbotConfig", { + bannerComment: `/* eslint-disable */ +/** + * This file was automatically generated by json-schema-to-typescript. + * DO NOT MODIFY IT BY HAND. Instead, modify the source JSONSchema file, + * and run json-schema-to-typescript to regenerate this file. + */`, + additionalProperties: false, + }); + + const dtsPath = join(schemasDir, "clawdbot.d.ts"); + await writeFile(dtsPath, dts); + console.log(`Wrote ${dtsPath}`); +} + +main().catch((err) => { + console.error(err); + process.exit(1); +});