@clawops/cli 1.7.9 → 2.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (98) hide show
  1. package/README.md +504 -76
  2. package/dist/apply-KYFPWI5U.js +27 -0
  3. package/dist/automation-RMAIBNVC.js +44 -0
  4. package/dist/bedrock-XVASJX2K.js +61 -0
  5. package/dist/{bootstrap-HL4DNUNG.js → bootstrap-HNGKY6WW.js} +31 -19
  6. package/dist/bootstrap.sh.tmpl +51 -31
  7. package/dist/channels-KBUR42IU.js +53 -0
  8. package/dist/chunk-2I7KCMXZ.js +142 -0
  9. package/dist/{chunk-DQDAWNGB.js → chunk-2Z7J3ERQ.js} +1 -1
  10. package/dist/chunk-3OLUJPCB.js +36 -0
  11. package/dist/chunk-5XT5IAJK.js +69 -0
  12. package/dist/chunk-AEEMRFZV.js +24 -0
  13. package/dist/chunk-BSLIYB5Q.js +106 -0
  14. package/dist/{chunk-3XK66DKK.js → chunk-E4NJSJ54.js} +57 -93
  15. package/dist/chunk-FEK7VJAY.js +16 -0
  16. package/dist/{chunk-UKTP332Z.js → chunk-GAZPPSKU.js} +6 -7
  17. package/dist/chunk-GIEVAGEK.js +126 -0
  18. package/dist/chunk-HSPHXG6W.js +67 -0
  19. package/dist/chunk-IVWP4QUJ.js +901 -0
  20. package/dist/{chunk-PVUVI35Y.js → chunk-JW5A7E3X.js} +5 -1
  21. package/dist/{chunk-GZN7PKP4.js → chunk-KC3GC3PE.js} +328 -121
  22. package/dist/chunk-LBE6COC4.js +244 -0
  23. package/dist/chunk-LEVIW2PV.js +890 -0
  24. package/dist/chunk-LT4XMO5D.js +50 -0
  25. package/dist/chunk-MC5ATCXS.js +108 -0
  26. package/dist/chunk-N4WZLWJ4.js +16 -0
  27. package/dist/chunk-NUDIHZEH.js +55 -0
  28. package/dist/chunk-NUL5F6YV.js +56 -0
  29. package/dist/chunk-RHOWYIWT.js +52 -0
  30. package/dist/chunk-STLRHLLV.js +193 -0
  31. package/dist/chunk-V25QRZRB.js +45 -0
  32. package/dist/chunk-VOEJYRIK.js +33 -0
  33. package/dist/{providers-2OABPW2E.js → chunk-VUFMZEIM.js} +3 -2
  34. package/dist/chunk-W3OLNNJW.js +51 -0
  35. package/dist/cli-WLD3EBEM.js +11 -0
  36. package/dist/cli-auth-GD5SK7JU.js +13 -0
  37. package/dist/cli.js +1296 -695
  38. package/dist/config-validate-K2N6XLDX.js +76 -0
  39. package/dist/context-7EVC6W45.js +20 -0
  40. package/dist/docker-3PDO4TS7.js +12 -0
  41. package/dist/{firewall-XQGO7HWK.js → firewall-5VKZ4WBH.js} +32 -1
  42. package/dist/generate-I6YQ5V2T.js +29 -0
  43. package/dist/{harden-URPXLSVF.js → harden-72JMRT4E.js} +51 -11
  44. package/dist/health-5CCOXYGG.js +11 -0
  45. package/dist/index.d.ts +56 -0
  46. package/dist/known-hosts-file-I3Q3NBYQ.js +22 -0
  47. package/dist/logs-5A7YYA53.js +15 -0
  48. package/dist/{mcp-wire-7E5JQY47.js → mcp-wire-3SWBM7D6.js} +32 -16
  49. package/dist/models-AGTQWYDL.js +32 -0
  50. package/dist/network-args-PYJRJBYO.js +64 -0
  51. package/dist/{package-5AR4ZPK4.js → package-5BCMEBTE.js} +11 -4
  52. package/dist/passphrase-MJBE45N7.js +15 -0
  53. package/dist/plugins-DTST3OER.js +49 -0
  54. package/dist/{pool-QGFQRMGU.js → pool-PIIKJ4L2.js} +3 -2
  55. package/dist/preflight-EF52S3WW.js +162 -0
  56. package/dist/preflight-MWWM5JT3.js +181 -0
  57. package/dist/preflight-TFD4N5ZU.js +141 -0
  58. package/dist/privileged-JFA6LLTV.js +17 -0
  59. package/dist/providers-FW6H6OPF.js +11 -0
  60. package/dist/ready-KDNRBNSU.js +95 -0
  61. package/dist/{remote-config-QDLN4UMG.js → remote-config-3HZLUWEA.js} +4 -3
  62. package/dist/runtime-X3KW5TCP.js +44 -0
  63. package/dist/server-GBA7BJGK.js +46 -0
  64. package/dist/spec-path-KQOOIQCA.js +9 -0
  65. package/dist/ssh-VAI5DU5M.js +11 -0
  66. package/dist/ssh-key-DUO6OKOI.js +7 -0
  67. package/dist/stack-config-R4SPSUQZ.js +12 -0
  68. package/dist/upgrade-ULD4KFYC.js +88 -0
  69. package/dist/validate-YVI3BJ55.js +14 -0
  70. package/dist/{version-guard-VUCNZXQS.js → version-guard-XVYW5WFJ.js} +2 -2
  71. package/dist/{versions-2UVAT6PQ.js → versions-W5LRQCAJ.js} +2 -2
  72. package/dist/wait-WO72TRRQ.js +79 -0
  73. package/package.json +11 -4
  74. package/spec/deploy-plan.schema.json +114 -25
  75. package/spec/integrations.yaml +135 -28
  76. package/spec/mcp-tools.yaml +89 -37
  77. package/spec/models.yaml +23 -3
  78. package/spec/openclaw-2.0.config.schema.json +1 -0
  79. package/spec/openclaw-versions.yaml +116 -27
  80. package/spec/providers.schema.json +163 -28
  81. package/dist/apply-F3KY2HTB.js +0 -17
  82. package/dist/automation-RULUSJBW.js +0 -30
  83. package/dist/aws-L4RR2LSE.js +0 -254
  84. package/dist/azure-7OXQENQL.js +0 -262
  85. package/dist/chunk-35WVQY3X.js +0 -122
  86. package/dist/chunk-6X45DDGH.js +0 -42
  87. package/dist/chunk-A4QR4TXW.js +0 -120
  88. package/dist/chunk-C5X375RO.js +0 -85
  89. package/dist/chunk-FNS56UQY.js +0 -741
  90. package/dist/chunk-P5LKWRPL.js +0 -114
  91. package/dist/chunk-SEZMVVAS.js +0 -156
  92. package/dist/context-5LCUG2QR.js +0 -10
  93. package/dist/gcp-UG6AWPIZ.js +0 -193
  94. package/dist/generate-OAGYT3VH.js +0 -15
  95. package/dist/local-DXBEVZ5C.js +0 -47
  96. package/dist/server-FIZCOLHL.js +0 -32
  97. package/dist/ssh-CNJNLM3E.js +0 -8
  98. package/dist/validate-CFQ4FH2T.js +0 -10
@@ -0,0 +1 @@
1
+ {"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"$schema":{"type":"string"},"meta":{"type":"object","properties":{"lastTouchedVersion":{"type":"string","title":"Config Last Touched Version","description":"OpenClaw version that most recently wrote this config."},"migrations":{"type":"object","properties":{"modelPolicyAllowlist":{"type":"boolean","const":true,"title":"Model Policy Allowlist Migration","description":"Records that legacy model-map restrictions were preserved or evaluated."}},"additionalProperties":false,"title":"Config Migration Markers","description":"Bounded compatibility markers for completed config migrations."}},"additionalProperties":false,"title":"Compatibility Metadata","description":"Backward-readable compatibility metadata retained so older binaries can refuse unsafe config downgrades."},"env":{"type":"object","properties":{"shellEnv":{"type":"object","properties":{"enabled":{"type":"boolean","title":"Shell Environment Import Enabled","description":"Enables loading environment variables from the user shell profile during startup initialization. Keep enabled for developer machines, or disable in locked-down service environments with explicit env management."},"timeoutMs":{"type":"integer","minimum":0,"maximum":9007199254740991,"title":"Shell Environment Import Timeout (ms)","description":"Maximum time in milliseconds allowed for shell environment resolution before fallback behavior applies. Use tighter timeouts for faster startup, or increase when shell initialization is heavy."}},"additionalProperties":false,"title":"Shell Environment Import","description":"Shell environment import controls for loading variables from your login shell during startup. Keep this enabled when you depend on profile-defined secrets or PATH customizations."},"vars":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"},"title":"Environment Variable Overrides","description":"Explicit key/value environment variable overrides merged into runtime process environment for OpenClaw. Use this for deterministic env configuration instead of relying only on shell profile side effects."}},"additionalProperties":false,"title":"Environment","description":"Environment import and override settings used to supply runtime variables to the gateway process. Use this section to control shell-env loading and explicit variable injection behavior."},"wizard":{"type":"object","properties":{"accessMode":{"anyOf":[{"type":"string","const":"full"},{"type":"string","const":"guarded"}],"title":"Setup Discovery Access","description":"Discovery consent for guided setup: \"full\" scans silently while \"guarded\" asks before inspecting local applications."},"appRecommendations":{"type":"boolean","title":"Setup App Recommendations","description":"Controls whether guided setup may use installed-application labels to recommend relevant plugins and skills."},"lastRunAt":{"type":"string","title":"Wizard Last Run Timestamp","description":"Timestamp of the last successfully committed wizard run."},"lastRunVersion":{"type":"string","title":"Wizard Last Run Version","description":"OpenClaw version used by the last wizard run."},"lastRunCommit":{"type":"string","title":"Wizard Last Run Commit","description":"Source commit used by the last development wizard run."},"lastRunCommand":{"type":"string","title":"Wizard Last Run Command","description":"Command that invoked the last wizard run."},"lastRunMode":{"anyOf":[{"type":"string","const":"local"},{"type":"string","const":"remote"}],"title":"Wizard Last Run Mode","description":"Whether the last wizard run targeted \"local\" or \"remote\" setup."},"localModelLeanAutoModel":{"type":"string","title":"Wizard Auto-Set Lean Model","description":"Model reference whose lean-mode setting remains owned by onboarding."},"securityAcknowledgedAt":{"type":"string","title":"Wizard Security Acknowledgement Timestamp","description":"Timestamp of the setup security acknowledgement, committed with the target config."}},"additionalProperties":false,"title":"Setup Preferences","description":"User-owned setup preferences. Machine-owned wizard history and acknowledgement state live in the shared state database."},"diagnostics":{"type":"object","properties":{"enabled":{"type":"boolean","title":"Diagnostics Enabled","description":"Master toggle for diagnostics instrumentation output in logs and telemetry wiring paths. Defaults to enabled; set false only in tightly constrained environments."},"flags":{"type":"array","items":{"type":"string"},"title":"Diagnostics Flags","description":"Enable targeted diagnostics logs by flag (e.g. [\"telegram.http\"]). Supports wildcards like \"telegram.*\" or \"*\"."},"otel":{"type":"object","properties":{"enabled":{"type":"boolean","title":"OpenTelemetry Enabled","description":"Enables OpenTelemetry export pipeline for traces, metrics, and logs based on configured endpoint/protocol settings. Keep disabled unless your collector endpoint and auth are fully configured."},"endpoint":{"type":"string","title":"OpenTelemetry Endpoint","description":"Collector endpoint URL used for OpenTelemetry export transport, including scheme and port. Use a reachable, trusted collector endpoint and monitor ingestion errors after rollout."},"tracesEndpoint":{"type":"string","title":"OpenTelemetry Traces Endpoint","description":"Signal-specific OTLP/HTTP trace endpoint. When set, this overrides diagnostics.otel.endpoint and OTEL_EXPORTER_OTLP_ENDPOINT for trace export only."},"metricsEndpoint":{"type":"string","title":"OpenTelemetry Metrics Endpoint","description":"Signal-specific OTLP/HTTP metrics endpoint. When set, this overrides diagnostics.otel.endpoint and OTEL_EXPORTER_OTLP_ENDPOINT for metrics export only."},"logsEndpoint":{"type":"string","title":"OpenTelemetry Logs Endpoint","description":"Signal-specific OTLP/HTTP logs endpoint. When set, this overrides diagnostics.otel.endpoint and OTEL_EXPORTER_OTLP_ENDPOINT for log export only."},"protocol":{"type":"string","const":"http/protobuf","title":"OpenTelemetry Protocol","description":"OTel transport protocol for telemetry export. Only \"http/protobuf\" is accepted; run \"openclaw doctor --fix\" to repair a persisted legacy \"grpc\" value or get source-specific manual-edit guidance."},"headers":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"},"title":"OpenTelemetry Headers","description":"Additional HTTP request headers sent with OpenTelemetry export requests, often used for tenant auth or routing. Keep secrets in env-backed values and avoid unnecessary header sprawl."},"serviceName":{"type":"string","title":"OpenTelemetry Service Name","description":"Service name reported in telemetry resource attributes to identify this gateway instance in observability backends. Use stable names so dashboards and alerts remain consistent over deployments."},"metricNamePrefix":{"type":"string","maxLength":128,"pattern":"^(?:[A-Za-z][A-Za-z0-9_./-]*)?$","title":"OpenTelemetry Metric Name Prefix","description":"Replaces the default \"openclaw.\" prefix on OpenClaw-owned metric names. Use an empty string to remove the prefix, or up to 128 ASCII letters, digits, underscores, dots, hyphens, and slashes starting with a letter. Include any separator you need, for example \"acme.\"; standard gen_ai.* metric names are unchanged. Changing this value requires updating dashboards and alerts that query the old names."},"traces":{"type":"boolean","title":"OpenTelemetry Traces Enabled","description":"Enable trace signal export to the configured OpenTelemetry collector endpoint. Keep enabled when latency/debug tracing is needed, and disable if you only want metrics/logs."},"metrics":{"type":"boolean","title":"OpenTelemetry Metrics Enabled","description":"Enable metrics signal export to the configured OpenTelemetry collector endpoint. Keep enabled for runtime health dashboards, and disable only if metric volume must be minimized."},"logs":{"type":"boolean","title":"OpenTelemetry Logs Enabled","description":"Enable log signal export through OpenTelemetry in addition to local logging sinks. Use this when centralized log correlation is required across services and agents."},"logsExporter":{"anyOf":[{"type":"string","const":"otlp"},{"type":"string","const":"stdout"},{"type":"string","const":"both"}],"title":"OpenTelemetry Logs Exporter","description":"Log export sink for diagnostics.otel.logs. Use \"otlp\" for the configured OTLP logs endpoint, \"stdout\" for one JSON record per stdout line in container log pipelines, and \"both\" when both sinks are required."},"sampleRate":{"type":"number","minimum":0,"maximum":1,"title":"OpenTelemetry Trace Sample Rate","description":"Trace sampling rate (0-1) controlling how much trace traffic is exported to observability backends. Lower rates reduce overhead/cost, while higher rates improve debugging fidelity."},"flushIntervalMs":{"type":"integer","minimum":0,"maximum":9007199254740991,"title":"OpenTelemetry Flush Interval (ms)","description":"Interval in milliseconds for periodic telemetry flush from buffers to the collector. Increase to reduce export chatter, or lower for faster visibility during active incident response."},"captureContent":{"type":"boolean","title":"OpenTelemetry Content Capture","description":"Opt-in OTEL span content capture. Defaults to off; true captures non-system message and tool content."}},"additionalProperties":false,"title":"OpenTelemetry","description":"OpenTelemetry export settings for traces, metrics, and logs emitted by gateway components. Use this when integrating with centralized observability backends and distributed tracing pipelines."},"cacheTrace":{"type":"object","properties":{"enabled":{"type":"boolean","title":"Cache Trace Enabled","description":"Log cache trace snapshots for embedded agent runs (default: false)."}},"additionalProperties":false,"title":"Cache Trace","description":"Cache-trace logging settings for observing cache decisions and payload context in embedded runs. Enable this temporarily for debugging and disable afterward to reduce sensitive log footprint."}},"additionalProperties":false,"title":"Diagnostics","description":"Diagnostics controls for targeted tracing, telemetry export, and cache inspection during debugging. Keep baseline diagnostics minimal in production and enable deeper signals only when investigating issues."},"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"}],"title":"Log Level","description":"Primary log level threshold for runtime logger output: \"silent\", \"fatal\", \"error\", \"warn\", \"info\", \"debug\", or \"trace\". Keep \"info\" or \"warn\" for production, and use debug/trace only during investigation."},"file":{"type":"string","title":"Log File Path","description":"Optional file path for persisted log output in addition to or instead of console logging. Use a managed writable path and align retention/rotation with your operational policy."},"maxFileBytes":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"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"}],"title":"Console Log Level","description":"Console-specific log threshold: \"silent\", \"fatal\", \"error\", \"warn\", \"info\", \"debug\", or \"trace\" for terminal output control. Use this to keep local console quieter while retaining richer file logging if needed."},"consoleStyle":{"anyOf":[{"type":"string","const":"pretty"},{"type":"string","const":"json"}],"title":"Console Log Style","description":"Console output format style: \"pretty\" or \"json\". Use json for machine parsing pipelines and pretty for human-first terminal workflows."},"redactPatterns":{"type":"array","items":{"type":"string"},"title":"Custom Redaction Patterns","description":"Additional custom redact regex patterns applied to log output, persisted transcript text, and safety-boundary UI/tool/diagnostic payloads before emission. Use this to mask org-specific tokens and identifiers not covered by built-in redaction rules."},"audit":{"type":"object","properties":{"enabled":{"type":"boolean","title":"Audit Ledger Enabled","description":"Records new run, tool, and enabled message audit events. Default: true. Disabling event inserts does not immediately delete existing records; retained rows remain queryable until they expire."},"executionIdentity":{"type":"boolean","title":"Execution Identity Audit","description":"Retains bounded execution-identity attribution for exact-run inspection. Default: false. Requires logging.audit.enabled; restart the Gateway after changing it."},"messages":{"anyOf":[{"type":"string","const":"off"},{"type":"string","const":"direct"},{"type":"string","const":"all"}],"title":"Message Audit Scope","description":"Controls content-free message lifecycle records: \"off\" (default), \"direct\" for known direct conversations only, or \"all\" for direct, group, channel, and unknown conversation kinds. Both logging.audit.enabled and logging.audit.messages are startup-scoped; restart the Gateway after changing either setting."}},"additionalProperties":false,"title":"Audit Ledger","description":"Bounded metadata-only audit history for operator review. Run and tool records are enabled by default; message lifecycle metadata is a separate privacy-sensitive opt-in. The background writer is best-effort rather than a lossless compliance archive."}},"additionalProperties":false,"title":"Logging","description":"Logging behavior controls for severity, output destinations, formatting, and sensitive-data redaction. Keep levels and redaction strict enough for production while preserving useful diagnostics."},"update":{"type":"object","properties":{"channel":{"anyOf":[{"type":"string","const":"stable"},{"type":"string","const":"extended-stable"},{"type":"string","const":"beta"},{"type":"string","const":"dev"}],"title":"Update Channel","description":"Update channel for git + npm installs (\"stable\", \"extended-stable\", \"beta\", or \"dev\"). Extended-stable is package-only: installation is foreground-only, with optional read-only startup hints."},"checkOnStart":{"type":"boolean","title":"Update Check on Start","description":"Checks the OpenClaw update endpoint when the gateway starts, including read-only extended-stable hints (default: true). Set false to disable update checks and anonymous update pings."},"auto":{"type":"object","properties":{"enabled":{"type":"boolean","title":"Auto Update Enabled","description":"Enable background auto-update for stable and beta package installs; extended-stable never auto-applies (default: false)."}},"additionalProperties":false}},"additionalProperties":false,"title":"Updates","description":"Update-channel and startup-check behavior for keeping OpenClaw runtime versions current. Use conservative channels in production and more experimental channels only in controlled environments."},"telemetry":{"type":"object","properties":{"enabled":{"type":"boolean","title":"Anonymous Feature Statistics","description":"Shares enabled channel and provider names, plugin count, and recent session count with the daily update check. Disabled by default and always disabled when DO_NOT_TRACK=1."},"consentedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$","title":"Feature Statistics Consent Timestamp","description":"ISO timestamp recording when the operator accepted or declined anonymous feature statistics. Prevents the setup wizard from asking again."}},"additionalProperties":false,"title":"Telemetry","description":"Explicit consent for anonymous feature statistics attached to the daily update check. Feature statistics are disabled by default and never include messages, credentials, or identifiers."},"browser":{"type":"object","properties":{"enabled":{"type":"boolean","title":"Browser Enabled","description":"Enables browser capability wiring in the gateway so browser tools and CDP-driven workflows can run. Disable when browser automation is not needed to reduce surface area and startup work."},"allowSystemProfileImport":{"type":"boolean","title":"Allow System Profile Import","description":"Allows macOS hosts to import cookies from a local Chrome-family system profile into a managed OpenClaw browser profile. Disable this to prevent browser profile cookie import and its macOS Keychain consent prompt."},"evaluateEnabled":{"type":"boolean","title":"Browser Evaluate Enabled","description":"Enables browser-side evaluate helpers for runtime script evaluation capabilities where supported. Keep disabled unless your workflows require evaluate semantics beyond snapshots/navigation."},"cdpUrl":{"type":"string","title":"Browser CDP URL","description":"CDP/DevTools endpoint URL used to attach to an externally managed browser instance. Use this for centralized browser hosts, tunnels, or existing-session attachment, and keep URL access restricted to trusted network paths."},"executablePath":{"type":"string","title":"Browser Executable Path","description":"Explicit browser executable path when auto-discovery is insufficient for your host environment. Use an absolute stable path, or a path starting with ~ for your OS home directory, so launch behavior stays deterministic across restarts."},"headless":{"type":"boolean","title":"Browser Headless Mode","description":"Forces browser launch in headless mode when the local launcher starts browser instances. Keep headless enabled for server environments and disable only when visible UI debugging is required."},"noSandbox":{"type":"boolean","title":"Browser No-Sandbox Mode","description":"Disables Chromium sandbox isolation flags for environments where sandboxing fails at runtime. Keep this off whenever possible because process isolation protections are reduced."},"attachOnly":{"type":"boolean","title":"Browser Attach-only Mode","description":"Restricts browser mode to attach-only behavior without starting local browser processes. Use this when all browser sessions are externally managed by a remote CDP provider."},"defaultProfile":{"type":"string","title":"Browser Default Profile","description":"Default browser profile name selected when callers do not explicitly choose a profile. Use a stable low-privilege profile as the default to reduce accidental cross-context state use."},"snapshotDefaults":{"type":"object","properties":{"mode":{"type":"string","const":"efficient","title":"Browser Snapshot Mode","description":"Default snapshot extraction mode controlling how page content is transformed for agent consumption. Choose the mode that balances readability, fidelity, and token footprint for your workflows."}},"additionalProperties":false,"title":"Browser Snapshot Defaults","description":"Default snapshot capture configuration used when callers do not provide explicit snapshot options. Tune this for consistent capture behavior across channels and automation paths."},"ssrfPolicy":{"type":"object","properties":{"dangerouslyAllowPrivateNetwork":{"type":"boolean","title":"Browser Dangerously Allow Private Network","description":"Allows access to private-network address ranges from browser tooling. Default is disabled when unset; enable only for explicitly trusted private-network destinations."},"allowRfc2544BenchmarkRange":{"type":"boolean","title":"Browser Allow RFC 2544 Benchmark Range","description":"Allow RFC 2544 benchmark-range IPs (198.18.0.0/15) for trusted fake-IP proxy environments."},"allowIpv6UniqueLocalRange":{"type":"boolean","title":"Browser Allow IPv6 Unique Local Range","description":"Allow IPv6 Unique Local Addresses (fc00::/7) for trusted fake-IP proxy environments."},"allowedHostnames":{"type":"array","items":{"type":"string"},"title":"Browser Allowed Hostnames","description":"Exact hostnames or IP literals allowed by browser SSRF policy checks. Keep the list minimal."},"blockedHostnames":{"type":"array","items":{"type":"string"},"title":"Browser Blocked Hostnames","description":"Hostname patterns denied before DNS and allow rules, even with private-network access enabled. Supports exact hosts and \"*.example.com\" for subdomains only; add \"example.com\" separately to block the apex. Empty or unset adds no denials."}},"additionalProperties":false,"title":"Browser SSRF Policy","description":"Server-side request forgery guardrail settings for browser/network fetch paths that could reach internal hosts. Keep restrictive defaults in production and open only explicitly approved targets."},"profiles":{"type":"object","propertyNames":{"type":"string","pattern":"^[a-z0-9-]+$"},"additionalProperties":{"type":"object","properties":{"cdpPort":{"type":"integer","minimum":1,"maximum":65535,"title":"Browser Profile CDP Port","description":"Per-profile local CDP port used when connecting to browser instances by port instead of URL. Use unique ports per profile to avoid connection collisions."},"cdpUrl":{"type":"string","title":"Browser Profile CDP URL","description":"Per-profile CDP/DevTools endpoint URL used for explicit browser routing by profile name. Use this for remote CDP hosts, tunnels, or existing-session profiles that should attach through a running Chrome DevTools endpoint."},"userDataDir":{"type":"string","title":"Browser Profile User Data Dir","description":"Per-profile Chromium user data directory for existing-session attachment through Chrome DevTools MCP. Use this for Brave, Edge, Chromium, or non-default Chrome profiles when the built-in auto-connect path would pick the wrong browser data directory on the selected host or browser node. Paths starting with ~ expand to the OS home directory."},"mcpCommand":{"type":"string","title":"Browser Profile Chrome MCP Command","description":"Per-profile Chrome DevTools MCP command for existing-session attachment. Defaults to npx."},"mcpArgs":{"type":"array","items":{"type":"string"},"title":"Browser Profile Chrome MCP Args","description":"Extra per-profile Chrome DevTools MCP arguments for existing-session attachment, such as --no-usage-statistics. Endpoint arguments here override the built-in auto-connect or browser URL selection."},"driver":{"anyOf":[{"type":"string","const":"openclaw"},{"type":"string","const":"clawd"},{"type":"string","const":"existing-session"},{"type":"string","const":"extension"}],"title":"Browser Profile Driver","description":"Per-profile browser driver mode. Use \"openclaw\" (or legacy \"clawd\") for CDP-based profiles, \"existing-session\" for Chrome DevTools MCP attachment, or \"extension\" for the authenticated Chrome extension relay."},"headless":{"type":"boolean","title":"Browser Profile Headless Mode","description":"Per-profile headless override for locally launched browser instances. Use this when one profile should stay headless without forcing browser.headless for every other profile."},"executablePath":{"type":"string","title":"Browser Profile Executable Path","description":"Per-profile browser executable path for locally launched managed browser profiles. Overrides browser.executablePath and accepts paths starting with ~ for the OS home directory."},"attachOnly":{"type":"boolean","title":"Browser Profile Attach-only Mode","description":"Per-profile attach-only override that skips local browser launch and only attaches to an existing CDP endpoint. Useful when one profile is externally managed but others are locally launched."}},"additionalProperties":false},"title":"Browser Profiles","description":"Named browser profile connection map used for explicit routing to CDP ports or URLs with optional metadata. Keep profile names consistent and avoid overlapping endpoint definitions."},"extraArgs":{"type":"array","items":{"type":"string"}},"tabCleanup":{"type":"object","properties":{"enabled":{"type":"boolean","title":"Browser Tab Cleanup Enabled","description":"Enables cleanup of idle tracked browser tabs for primary-agent sessions. Disable only when external tooling owns tab lifecycle completely."}},"additionalProperties":false,"title":"Browser Tab Cleanup","description":"Best-effort cleanup policy for browser tabs opened by primary-agent sessions. Keep enabled to avoid stale sandbox or managed-browser tabs accumulating across long-lived gateways."},"extensionRelay":{"type":"object","properties":{"allowLegacyAuth":{"type":"boolean","title":"Allow Legacy Browser Relay Auth","description":"Temporarily accepts legacy Bearer, Basic, and token-subprotocol relay authentication. Default: true for one migration window. Set false after every extension and external CDP client uses Browser Relay Authentication v2."}},"additionalProperties":false,"title":"Browser Extension Relay","description":"Chrome extension relay authentication compatibility settings. Keep the legacy window only while older paired extensions or external CDP clients still need it."}},"additionalProperties":false,"title":"Browser","description":"Browser runtime controls for local or remote CDP attachment, profile routing, and screenshot/snapshot behavior. Keep defaults unless your automation workflow requires custom browser transport settings."},"ui":{"type":"object","properties":{"seamColor":{"type":"string","pattern":"^#?[0-9a-fA-F]{6}$","title":"Accent Color","description":"Primary accent color used by UI surfaces for emphasis, badges, and visual identity cues. Use high-contrast values that remain readable across light/dark themes."},"prefs":{"type":"object","properties":{"theme":{"anyOf":[{"type":"string","const":"claw"},{"type":"string","const":"knot"},{"type":"string","const":"dash"},{"type":"string","const":"absolutely"},{"type":"string","const":"tide"},{"type":"string","const":"beacon"},{"type":"string","const":"phosphor"},{"type":"string","const":"crt"},{"type":"string","const":"manuscript"},{"type":"string","const":"rose"},{"type":"string","const":"miami"},{"type":"string","const":"custom"}]},"themeMode":{"anyOf":[{"type":"string","const":"light"},{"type":"string","const":"dark"},{"type":"string","const":"system"}]},"accent":{"type":"string","allOf":[{"type":"string","pattern":"^#?[0-9a-fA-F]{6}$"},{"type":"string","pattern":"^#.*"}],"title":"User Accent Color","description":"User-selected Control UI accent color in #RRGGBB format. Overrides ui.seamColor; clear it to restore the configured seam color or theme default."},"locale":{"type":"string","maxLength":20},"chatShowThinking":{"type":"boolean"},"chatShowToolCalls":{"type":"boolean"},"chatPersistCommentary":{"type":"boolean"},"chatSendShortcut":{"anyOf":[{"type":"string","const":"enter"},{"type":"string","const":"modifier-enter"}]},"chatFollowUpMode":{"anyOf":[{"type":"string","const":"steer"},{"type":"string","const":"queue"}]},"sidebarEntries":{"type":"array","items":{"type":"string"}}},"additionalProperties":false}},"additionalProperties":false,"title":"UI","description":"UI presentation settings for accenting and operator display preferences. Use this for readability customization without changing runtime behavior."},"secrets":{"type":"object","properties":{"egressProxy":{"type":"object","properties":{"enabled":{"type":"boolean","title":"Secret Egress Proxy Enabled","description":"Enables secret egress substitution for Gateway-hosted agent subprocesses. Default: false."},"allowedHosts":{"maxItems":256,"type":"array","items":{"type":"string","minLength":1},"title":"Secret Egress Proxy Allowed Hosts","description":"Opt-in traffic allowlist for requests and CONNECT tunnels. When present, destinations must appear in this list, a per-secret host binding, or bypassHosts. An empty list permits only bound or bypassed hosts. Restart the Gateway after changing it."},"bypassHosts":{"maxItems":256,"type":"array","items":{"type":"string","minLength":1},"title":"Secret Egress Proxy Bypass Hosts","description":"Exact hostnames that use authenticated blind CONNECT tunnels for certificate-pinned clients. Sentinels remain ciphertext and will fail vendor authentication instead of exposing plaintext."}},"additionalProperties":false,"title":"Secret Egress Proxy","description":"Gateway-owned loopback proxy that replaces shared-store secret sentinels only at outbound request time. Restart the Gateway after changing this startup-scoped section."},"providers":{"type":"object","properties":{},"additionalProperties":{"anyOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"allowlist":{"maxItems":256,"type":"array","items":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}}},"required":["source"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"path":{"type":"string","minLength":1},"mode":{"anyOf":[{"type":"string","const":"singleValue"},{"type":"string","const":"json"}]},"timeoutMs":{"type":"integer","exclusiveMinimum":0,"maximum":120000},"maxBytes":{"type":"integer","exclusiveMinimum":0,"maximum":20971520}},"required":["source","path"],"additionalProperties":false},{"anyOf":[{"type":"object","properties":{"source":{"type":"string","const":"exec"},"command":{"type":"string","minLength":1},"args":{"maxItems":128,"type":"array","items":{"type":"string","maxLength":1024}},"timeoutMs":{"type":"integer","exclusiveMinimum":0,"maximum":120000},"noOutputTimeoutMs":{"type":"integer","exclusiveMinimum":0,"maximum":120000},"maxOutputBytes":{"type":"integer","exclusiveMinimum":0,"maximum":20971520},"jsonOnly":{"type":"boolean"},"env":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"}},"passEnv":{"maxItems":128,"type":"array","items":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"trustedDirs":{"maxItems":64,"type":"array","items":{"type":"string","minLength":1}}},"required":["source","command"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"pluginIntegration":{"type":"object","properties":{"pluginId":{"type":"string","minLength":1,"maxLength":128},"integrationId":{"type":"string","minLength":1,"maxLength":128}},"required":["pluginId","integrationId"],"additionalProperties":false}},"required":["source","pluginIntegration"],"additionalProperties":false}]},{"type":"object","properties":{"source":{"type":"string","const":"store"}},"required":["source"],"additionalProperties":false}]}},"defaults":{"type":"object","properties":{"env":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"file":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"exec":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"store":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"}},"additionalProperties":false}},"additionalProperties":false,"title":"Secrets","description":"Secret reference providers, shared-store behavior, and optional subprocess egress protection."},"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":"aws-sdk"},{"type":"string","const":"oauth"},{"type":"string","const":"token"}]},"email":{"type":"string"},"displayName":{"type":"string"}},"required":["provider","mode"],"additionalProperties":false},"title":"Auth Profiles","description":"Named auth profiles (provider + mode + optional email)."},"order":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"array","items":{"type":"string"}},"title":"Auth Profile Order","description":"Ordered auth profile IDs per provider (used for automatic failover)."}},"additionalProperties":false,"title":"Auth","description":"Authentication profile root used for multi-profile provider credentials and cooldown-based failover ordering. Keep profiles minimal and explicit so automatic failover behavior stays auditable."},"accessGroups":{"type":"object","propertyNames":{"type":"string","minLength":1},"additionalProperties":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","const":"discord.channelAudience"},"guildId":{"type":"string","minLength":1},"channelId":{"type":"string","minLength":1},"membership":{"type":"string","const":"canViewChannel"}},"required":["type","guildId","channelId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","const":"message.senders"},"members":{"type":"object","propertyNames":{"type":"string","minLength":1},"additionalProperties":{"type":"array","items":{"type":"string","minLength":1}}}},"required":["type","members"],"additionalProperties":false}]}},"acp":{"type":"object","properties":{"enabled":{"type":"boolean","title":"ACP Enabled","description":"Global ACP feature gate. Keep disabled unless ACP runtime + policy are configured."},"dispatch":{"type":"object","properties":{"enabled":{"type":"boolean","title":"ACP Dispatch Enabled","description":"Independent dispatch gate for ACP session turns (default: true). Set false to keep ACP commands available while blocking ACP turn execution."}},"additionalProperties":false},"backend":{"type":"string","title":"ACP Backend","description":"Default ACP runtime backend id (for example: acpx). Must match a registered ACP runtime plugin backend."},"fallbacks":{"type":"array","items":{"type":"string"},"title":"ACP Fallback Backends","description":"Ordered list of fallback ACP backend ids tried when the primary backend fails with UNAVAILABLE (for example: rate-limit / quota exhausted). Each entry must match a registered ACP runtime plugin backend."},"defaultAgent":{"type":"string","title":"ACP Default Agent","description":"Fallback ACP target agent id used when ACP spawns do not specify an explicit target."},"allowedAgents":{"type":"array","items":{"type":"string"},"title":"ACP Allowed Agents","description":"Allowlist of ACP target agent ids permitted for ACP runtime sessions. Empty means no additional allowlist restriction."},"stream":{"type":"object","properties":{"repeatSuppression":{"type":"boolean","title":"ACP Stream Repeat Suppression","description":"When true (default), suppress repeated ACP status/tool projection lines in a turn while keeping raw ACP events unchanged."},"deliveryMode":{"anyOf":[{"type":"string","const":"live"},{"type":"string","const":"final_only"}],"title":"ACP Stream Delivery Mode","description":"ACP delivery style: live streams projected output incrementally, final_only buffers all projected ACP output until terminal turn events."},"tagVisibility":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"boolean"},"title":"ACP Stream Tag Visibility","description":"Per-sessionUpdate visibility overrides for ACP projection (for example usage_update, available_commands_update)."}},"additionalProperties":false,"title":"ACP Stream","description":"ACP streaming projection controls for chunk sizing, metadata visibility, and deduped delivery behavior."},"runtime":{"type":"object","properties":{"installCommand":{"type":"string","title":"ACP Runtime Install Command","description":"Optional operator install/setup command shown by `/acp install` and `/acp doctor` when ACP backend wiring is missing."}},"additionalProperties":false}},"additionalProperties":false,"title":"ACP","description":"ACP runtime controls for enabling dispatch, selecting backends, constraining allowed agent targets, and selecting streamed turn projection behavior."},"models":{"type":"object","properties":{"mode":{"anyOf":[{"type":"string","const":"merge"},{"type":"string","const":"replace"}],"title":"Model Catalog Mode","description":"Controls provider catalog behavior: \"merge\" keeps built-ins and overlays your custom providers, while \"replace\" uses only your configured providers. In \"merge\", matching provider IDs preserve non-empty agent models.json baseUrl values, while apiKey values are preserved only when the provider is not SecretRef-managed in current config/auth-profile context; SecretRef-managed providers refresh apiKey from current source markers, and matching model contextWindow/maxTokens use the higher value between explicit and implicit entries."},"providers":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"baseUrl":{"type":"string","title":"Model Provider Base URL","description":"Base URL for the provider endpoint used to serve model requests for that provider entry. Use HTTPS endpoints and keep URLs environment-specific through config templating where needed."},"apiKey":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"store"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false}]}],"title":"Model Provider API Key","description":"Provider credential used for API-key based authentication when the provider requires direct key auth. Use secret/env substitution and avoid storing real keys in committed config files."},"auth":{"anyOf":[{"type":"string","const":"api-key"},{"type":"string","const":"aws-sdk"},{"type":"string","const":"oauth"},{"type":"string","const":"token"}],"title":"Model Provider Auth Mode","description":"Selects provider auth style: \"api-key\" for API key auth, \"token\" for bearer token auth, \"oauth\" for OAuth credentials, and \"aws-sdk\" for AWS credential resolution. Match this to your provider requirements."},"api":{"type":"string","enum":["openai-completions","openai-responses","openai-chatgpt-responses","anthropic-messages","google-generative-ai","google-vertex","github-copilot","bedrock-converse-stream","ollama","azure-openai-responses"],"title":"Model Provider API Adapter","description":"Provider API adapter selection controlling request/response compatibility handling for model calls. Use the adapter that matches your upstream provider protocol to avoid feature mismatch."},"maxTokens":{"type":"number","exclusiveMinimum":0,"title":"Model Provider Max Tokens","description":"Default maximum output token budget applied to models under this provider when a model entry does not set maxTokens."},"timeoutSeconds":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"title":"Model Provider Request Timeout","description":"Optional per-provider model request timeout in seconds. Provider-level request settings affect explicit provider-owned model rows; they do not create implicit models. For custom providers, set it alongside the provider baseUrl and models. Applies to provider HTTP fetches, including connect, headers, body, and total request abort handling, and also raises the LLM idle/stream watchdog ceiling for this provider above the implicit ~120s default. Use this for slow local or self-hosted model servers, or for cloud providers that buffer reasoning tokens silently on the wire (Gemini preview, large-tool-payload Claude/Opus), instead of changing global agent timeouts."},"region":{"type":"string","minLength":1,"title":"Model Provider Region","description":"Optional provider deployment/API region interpreted by providers that expose regional endpoints. Use provider docs for supported values; baseUrl overrides usually take precedence when both are set."},"injectNumCtxForOpenAICompat":{"type":"boolean","title":"Model Provider Inject num_ctx (OpenAI Compat)","description":"Controls whether OpenClaw injects `options.num_ctx` for Ollama providers configured with the OpenAI-compatible adapter (`openai-completions`). Default is true. Set false only if your proxy/upstream rejects unknown `options` payload fields."},"params":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{},"title":"Model Provider Runtime Parameters","description":"Provider-specific runtime parameters interpreted by provider plugins. Keep keys documented by the provider, and prefer explicit provider docs over ad hoc shared assumptions."},"agentRuntime":{"type":"object","properties":{"id":{"type":"string","title":"Model Provider Runtime ID","description":"Provider agent runtime id: \"openclaw\", \"auto\", a registered plugin harness id such as \"codex\", or a supported CLI backend alias such as \"claude-cli\". OpenAI on the official endpoint defaults to the Codex harness when omitted."}},"additionalProperties":false,"title":"Model Provider Runtime","description":"Optional low-level agent runtime policy for this provider. Use provider/model runtime policy instead of agent-wide runtime pins; omitted/default lets OpenClaw choose the runtime for the selected provider."},"localService":{"type":"object","properties":{"command":{"type":"string","minLength":1,"title":"Model Provider Local Service Command","description":"Absolute executable path for the local model server process. Keep this path explicit so provider startup is deterministic and does not depend on shell PATH lookup."},"args":{"type":"array","items":{"type":"string"},"title":"Model Provider Local Service Arguments","description":"Argument list passed to the local model server command without shell expansion."},"cwd":{"type":"string","minLength":1,"title":"Model Provider Local Service Working Directory","description":"Working directory for the local model server process."},"env":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"},"title":"Model Provider Local Service Environment","description":"Additional environment variables for the local model server process. Values that look secret are redacted from config snapshots."},"healthUrl":{"type":"string","minLength":1,"title":"Model Provider Local Service Health URL","description":"Readiness URL probed before model requests. If omitted, OpenClaw uses the provider baseUrl with /models appended."},"readyTimeoutMs":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"title":"Model Provider Local Service Ready Timeout","description":"Maximum milliseconds to wait for the local model server readiness probe after starting the process."},"idleStopMs":{"type":"integer","minimum":0,"maximum":9007199254740991,"title":"Model Provider Local Service Idle Stop","description":"Milliseconds to keep an OpenClaw-started local model server alive after the last request finishes. Set 0 to keep it alive until OpenClaw exits."}},"required":["command"],"additionalProperties":false,"title":"Model Provider Local Service","description":"Optional on-demand local model server process for this provider. OpenClaw probes healthUrl, starts the command when needed, waits for readiness, and then sends the model request."},"headers":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"store"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false}]}]},"title":"Model Provider Headers","description":"Static HTTP headers merged into provider requests for tenant routing, proxy auth, or custom gateway requirements. Use this sparingly and keep sensitive header values in secrets."},"authHeader":{"type":"boolean","title":"Model Provider Authorization Header","description":"When true, credentials are sent via the HTTP Authorization header even if alternate auth is possible. Use this only when your provider or proxy explicitly requires Authorization forwarding."},"request":{"type":"object","properties":{"headers":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"store"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false}]}]},"title":"Model Provider Request Headers","description":"Extra headers merged into provider requests after default attribution and auth resolution."},"auth":{"anyOf":[{"type":"object","properties":{"mode":{"type":"string","const":"provider-default","title":"Model Provider Request Auth Mode","description":"Auth override mode: \"provider-default\", \"authorization-bearer\", or \"header\"."}},"required":["mode"],"additionalProperties":false},{"type":"object","properties":{"mode":{"type":"string","const":"authorization-bearer","title":"Model Provider Request Auth Mode","description":"Auth override mode: \"provider-default\", \"authorization-bearer\", or \"header\"."},"token":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"store"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false}]}],"title":"Model Provider Request Bearer Token","description":"Bearer token used when auth mode is authorization-bearer."}},"required":["mode","token"],"additionalProperties":false},{"type":"object","properties":{"mode":{"type":"string","const":"header","title":"Model Provider Request Auth Mode","description":"Auth override mode: \"provider-default\", \"authorization-bearer\", or \"header\"."},"headerName":{"type":"string","minLength":1,"title":"Model Provider Request Auth Header Name","description":"Custom auth header name used when auth mode is header."},"value":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"store"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false}]}],"title":"Model Provider Request Auth Header Value","description":"Custom auth header value used when auth mode is header."},"prefix":{"type":"string","title":"Model Provider Request Auth Header Prefix","description":"Optional prefix prepended to request.auth.value when auth mode is header."}},"required":["mode","headerName","value"],"additionalProperties":false}],"title":"Model Provider Request Auth Override","description":"Override provider request authentication behavior for this provider."},"proxy":{"anyOf":[{"type":"object","properties":{"mode":{"type":"string","const":"env-proxy","title":"Model Provider Request Proxy Mode","description":"Proxy override mode for model-provider requests: \"env-proxy\" or \"explicit-proxy\"."},"tls":{"type":"object","properties":{"ca":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"store"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false}]}],"title":"Model Provider Request Proxy TLS CA","description":"Custom CA bundle used to verify the proxy TLS certificate chain."},"cert":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"store"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false}]}],"title":"Model Provider Request Proxy TLS Cert","description":"Client TLS certificate presented to the proxy when mutual TLS is required."},"key":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"store"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false}]}],"title":"Model Provider Request Proxy TLS Key","description":"Private key paired with request.proxy.tls.cert for proxy mutual TLS."},"passphrase":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"store"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false}]}],"title":"Model Provider Request Proxy TLS Passphrase","description":"Optional passphrase used to decrypt request.proxy.tls.key."},"serverName":{"type":"string","title":"Model Provider Request Proxy TLS Server Name","description":"Optional SNI/server-name override used when establishing TLS to the proxy."},"insecureSkipVerify":{"type":"boolean","title":"Model Provider Request Proxy TLS Skip Verify","description":"Skips proxy TLS certificate verification. Use only for controlled development environments."}},"additionalProperties":false,"title":"Model Provider Request Proxy TLS","description":"Optional TLS settings used when connecting to the configured proxy."}},"required":["mode"],"additionalProperties":false},{"type":"object","properties":{"mode":{"type":"string","const":"explicit-proxy","title":"Model Provider Request Proxy Mode","description":"Proxy override mode for model-provider requests: \"env-proxy\" or \"explicit-proxy\"."},"url":{"type":"string","minLength":1,"title":"Model Provider Request Proxy URL","description":"Explicit proxy URL used when request.proxy.mode is explicit-proxy. Credentials embedded in the URL are treated as sensitive and redacted from snapshots."},"tls":{"type":"object","properties":{"ca":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"store"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false}]}],"title":"Model Provider Request Proxy TLS CA","description":"Custom CA bundle used to verify the proxy TLS certificate chain."},"cert":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"store"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false}]}],"title":"Model Provider Request Proxy TLS Cert","description":"Client TLS certificate presented to the proxy when mutual TLS is required."},"key":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"store"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false}]}],"title":"Model Provider Request Proxy TLS Key","description":"Private key paired with request.proxy.tls.cert for proxy mutual TLS."},"passphrase":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"store"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false}]}],"title":"Model Provider Request Proxy TLS Passphrase","description":"Optional passphrase used to decrypt request.proxy.tls.key."},"serverName":{"type":"string","title":"Model Provider Request Proxy TLS Server Name","description":"Optional SNI/server-name override used when establishing TLS to the proxy."},"insecureSkipVerify":{"type":"boolean","title":"Model Provider Request Proxy TLS Skip Verify","description":"Skips proxy TLS certificate verification. Use only for controlled development environments."}},"additionalProperties":false,"title":"Model Provider Request Proxy TLS","description":"Optional TLS settings used when connecting to the configured proxy."}},"required":["mode","url"],"additionalProperties":false}],"title":"Model Provider Request Proxy","description":"Optional proxy override for model-provider requests. Use \"env-proxy\" to honor environment proxy settings or \"explicit-proxy\" to route through a specific proxy URL."},"tls":{"type":"object","properties":{"ca":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"store"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false}]}],"title":"Model Provider Request TLS CA","description":"Custom CA bundle used to verify the upstream TLS certificate chain."},"cert":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"store"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false}]}],"title":"Model Provider Request TLS Cert","description":"Client TLS certificate presented to the upstream endpoint when mutual TLS is required."},"key":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"store"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false}]}],"title":"Model Provider Request TLS Key","description":"Private key paired with request.tls.cert for upstream mutual TLS."},"passphrase":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"store"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false}]}],"title":"Model Provider Request TLS Passphrase","description":"Optional passphrase used to decrypt request.tls.key."},"serverName":{"type":"string","title":"Model Provider Request TLS Server Name","description":"Optional SNI/server-name override used when establishing upstream TLS."},"insecureSkipVerify":{"type":"boolean","title":"Model Provider Request TLS Skip Verify","description":"Skips upstream TLS certificate verification. Use only for controlled development environments."}},"additionalProperties":false,"title":"Model Provider Request TLS","description":"Optional TLS settings used when connecting directly to the upstream model endpoint."},"allowPrivateNetwork":{"type":"boolean","title":"Model Provider Request Allow Private Network","description":"When true, allow model-provider HTTP requests to private, CGNAT, or similar ranges through the provider HTTP fetch guard (fetchWithSsrFGuard). Custom/local provider base URLs already trust the exact configured origin, except metadata, link-local, and local-use NAT64 (64:ff9b:1::/48) origins; set this to false to opt out of that trust. OpenAI Responses WebSocket reuses request for headers/TLS but does not use that fetch SSRF path. Use true only for operator-controlled self-hosted endpoints that must reach private origins outside the configured baseUrl origin."}},"additionalProperties":false,"title":"Model Provider Request Overrides","description":"Optional request overrides for model-provider requests, including extra headers, auth overrides, proxy routing, TLS client settings, and optional allowPrivateNetwork for trusted self-hosted endpoints. Use these only when your upstream or enterprise network path requires transport customization."},"models":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","minLength":1},"name":{"type":"string","minLength":1},"api":{"type":"string","enum":["openai-completions","openai-responses","openai-chatgpt-responses","anthropic-messages","google-generative-ai","google-vertex","github-copilot","bedrock-converse-stream","ollama","azure-openai-responses"]},"baseUrl":{"type":"string","minLength":1},"reasoning":{"type":"boolean"},"input":{"type":"array","items":{"anyOf":[{"type":"string","const":"text"},{"type":"string","const":"image"},{"type":"string","const":"video"},{"type":"string","const":"audio"}]}},"cost":{"type":"object","properties":{"input":{"type":"number"},"output":{"type":"number"},"cacheRead":{"type":"number"},"cacheWrite":{"type":"number"},"tieredPricing":{"type":"array","items":{"type":"object","properties":{"input":{"type":"number"},"output":{"type":"number"},"cacheRead":{"type":"number"},"cacheWrite":{"type":"number"},"range":{"anyOf":[{"type":"array","items":[{"type":"number"},{"type":"number"}]},{"type":"array","items":[{"type":"number"}]}]}},"required":["input","output","cacheRead","cacheWrite","range"],"additionalProperties":false}}},"additionalProperties":false},"contextWindow":{"type":"number","exclusiveMinimum":0},"contextTokens":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"maxTokens":{"type":"number","exclusiveMinimum":0},"thinkingLevelMap":{"type":"object","properties":{"off":{"anyOf":[{"type":"string"},{"type":"null"}]},"minimal":{"anyOf":[{"type":"string"},{"type":"null"}]},"low":{"anyOf":[{"type":"string"},{"type":"null"}]},"medium":{"anyOf":[{"type":"string"},{"type":"null"}]},"high":{"anyOf":[{"type":"string"},{"type":"null"}]},"xhigh":{"anyOf":[{"type":"string"},{"type":"null"}]},"max":{"anyOf":[{"type":"string"},{"type":"null"}]}},"additionalProperties":false},"params":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},"agentRuntime":{"type":"object","properties":{"id":{"type":"string","title":"Model Runtime ID","description":"Model agent runtime id: \"openclaw\", \"auto\", a registered plugin harness id such as \"codex\", or a supported CLI backend alias such as \"claude-cli\"."}},"additionalProperties":false,"title":"Model Runtime","description":"Optional low-level agent runtime policy for this specific model. Model runtime policy overrides the provider runtime policy."},"headers":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"}},"compat":{"type":"object","properties":{"supportsStore":{"type":"boolean"},"supportsPromptCacheKey":{"type":"boolean"},"supportsDeveloperRole":{"type":"boolean"},"supportsReasoningEffort":{"type":"boolean"},"supportsTemperature":{"type":"boolean"},"supportsInstructions":{"type":"boolean"},"supportsUsageInStreaming":{"type":"boolean"},"supportsTools":{"type":"boolean"},"codeMode":{"type":"string","enum":["preferred","capable"]},"supportsStrictMode":{"type":"boolean"},"supportsJsonSchemaResponseFormat":{"type":"boolean"},"requiresStringContent":{"type":"boolean"},"strictMessageKeys":{"type":"boolean"},"visibleReasoningDetailTypes":{"type":"array","items":{"type":"string","minLength":1}},"supportedReasoningEfforts":{"type":"array","items":{"type":"string","minLength":1}},"reasoningEffortMap":{"type":"object","propertyNames":{"type":"string","minLength":1},"additionalProperties":{"type":"string","minLength":1}},"maxTokensField":{"anyOf":[{"type":"string","const":"max_completion_tokens"},{"type":"string","const":"max_tokens"}]},"thinkingFormat":{"type":"string","enum":["openai","openrouter","deepseek","together","qwen","qwen-chat-template","zai"]},"requiresToolResultName":{"type":"boolean"},"requiresAssistantAfterToolResult":{"type":"boolean"},"requiresThinkingAsText":{"type":"boolean"},"requiresReasoningContentOnAssistantMessages":{"type":"boolean"},"toolSchemaProfile":{"type":"string"},"unsupportedToolSchemaKeywords":{"type":"array","items":{"type":"string","minLength":1}},"toolCallArgumentsEncoding":{"type":"string"},"requiresOpenAiAnthropicToolPayload":{"type":"boolean"},"openRouterRouting":{"type":"object","properties":{"allow_fallbacks":{"type":"boolean"},"require_parameters":{"type":"boolean"},"data_collection":{"type":"string","enum":["deny","allow"]},"zdr":{"type":"boolean"},"enforce_distillable_text":{"type":"boolean"},"order":{"type":"array","items":{"type":"string"}},"only":{"type":"array","items":{"type":"string"}},"ignore":{"type":"array","items":{"type":"string"}},"quantizations":{"type":"array","items":{"type":"string"}},"sort":{"anyOf":[{"type":"string"},{"type":"object","properties":{"by":{"type":"string"},"partition":{"anyOf":[{"type":"string"},{"type":"null"}]}},"additionalProperties":false}]},"max_price":{"type":"object","properties":{"prompt":{"anyOf":[{"type":"number"},{"type":"string"}]},"completion":{"anyOf":[{"type":"number"},{"type":"string"}]},"image":{"anyOf":[{"type":"number"},{"type":"string"}]},"audio":{"anyOf":[{"type":"number"},{"type":"string"}]},"request":{"anyOf":[{"type":"number"},{"type":"string"}]}},"additionalProperties":false},"preferred_min_throughput":{"anyOf":[{"type":"number"},{"type":"object","properties":{"p50":{"type":"number"},"p75":{"type":"number"},"p90":{"type":"number"},"p99":{"type":"number"}},"additionalProperties":false}]},"preferred_max_latency":{"anyOf":[{"type":"number"},{"type":"object","properties":{"p50":{"type":"number"},"p75":{"type":"number"},"p90":{"type":"number"},"p99":{"type":"number"}},"additionalProperties":false}]}},"additionalProperties":false},"vercelGatewayRouting":{"type":"object","properties":{"only":{"type":"array","items":{"type":"string"}},"order":{"type":"array","items":{"type":"string"}}},"additionalProperties":false},"zaiToolStream":{"type":"boolean"},"cacheControlFormat":{"type":"string","const":"anthropic"},"sendSessionAffinityHeaders":{"type":"boolean"},"sendSessionIdHeader":{"type":"boolean"},"supportsEagerToolInputStreaming":{"type":"boolean"},"supportsLongCacheRetention":{"type":"boolean"}},"additionalProperties":false},"mediaInput":{"type":"object","properties":{"image":{"type":"object","properties":{"maxBytes":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"title":"Model Image Max Bytes","description":"Maximum encoded image payload size accepted by the provider for this model."},"maxPixels":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"title":"Model Image Max Pixels","description":"Maximum image pixel count accepted by the provider for this model."},"maxSidePx":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"title":"Model Image Max Side","description":"Maximum image width or height accepted by the provider for this model."},"preferredSidePx":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"title":"Model Image Preferred Side","description":"Preferred image resize side for balanced compression. Leave unset to use OpenClaw's conservative default."},"tokenMode":{"anyOf":[{"type":"string","const":"tile"},{"type":"string","const":"detail"},{"type":"string","const":"provider"}],"title":"Model Image Token Mode","description":"Provider image token accounting style: \"tile\", \"detail\", or \"provider\"."}},"additionalProperties":false,"title":"Model Image Input","description":"Optional image input limits for this model, such as maximum side length, maximum pixels, and preferred compression side."}},"additionalProperties":false,"title":"Model Media Input","description":"Optional model media capability metadata used by tools to choose conservative image compression defaults."},"metadataSource":{"type":"string","const":"models-add"}},"required":["id","name"],"additionalProperties":false},"title":"Model Provider Model List","description":"Declared model list for a provider including identifiers, metadata, provider-specific params, and optional compatibility/cost hints. Keep IDs exact to provider catalog values so selection and fallback resolve correctly."}},"additionalProperties":false},"title":"Model Providers","description":"Provider map keyed by provider ID containing connection/auth settings and concrete model definitions. Built-in providers may be tuned with provider-level overlays; custom providers must include baseUrl and models. Use stable provider keys so references from agents and tooling remain portable across environments."},"catalogRefresh":{"type":"object","properties":{"enabled":{"type":"boolean","title":"Model Catalog Refresh Enabled","description":"Fetch hosted model catalog updates in the background (default: true). Set to false to disable all remote model catalog traffic."},"url":{"type":"string","title":"Model Catalog Refresh URL","description":"Override the hosted model catalog URL for a self-hosted HTTPS mirror (localhost HTTP is allowed for testing). Changes apply after a Gateway restart."}},"additionalProperties":false,"title":"Model Catalog Refresh","description":"Controls background updates to the bundled model catalog. Remote rows can update model metadata but cannot change provider endpoints or headers."}},"additionalProperties":false,"title":"Models","description":"Model catalog root for provider definitions, merge/replace behavior, and optional Bedrock discovery integration. Keep provider definitions explicit and validated before relying on production failover paths."},"nodeHost":{"type":"object","properties":{"agentRuns":{"type":"object","properties":{"claude":{"type":"object","properties":{"enabled":{"type":"boolean","title":"Node Claude Agent Runs Enabled","description":"Advertise paired-node Claude session continuation when the local claude binary is available (default: false). Runs still require node exec approval."}},"additionalProperties":false,"title":"Node Claude Agent Runs","description":"Controls whether this headless node host may advertise Claude CLI agent turns to the gateway."}},"additionalProperties":false,"title":"Node Agent Runs","description":"Opt in to approval-gated native agent turns on this headless node host. Disabled by default."},"workerRuns":{"type":"object","properties":{"enabled":{"type":"boolean","title":"Node Worker Runs Enabled","description":"Allow this paired node to host sessions from exact bundles installed by its Gateway (default: false)."},"capacity":{"type":"integer","minimum":1,"maximum":1024,"title":"Node Worker Run Capacity","description":"Maximum concurrent worker sessions hosted by this node (default: the number of available CPU cores). Must be an integer from 1 through 1024."},"isolation":{"type":"string","enum":["none","container"],"title":"Node Worker Run Isolation","description":"Select the worker-session process boundary: \"none\" runs directly on the node host (default); \"container\" requires a working Docker-compatible engine and never falls back to host execution."},"containerImage":{"type":"string","minLength":1,"title":"Node Worker Run Container Image","description":"Optional Node 22+ image for container-isolated workers (default: \"node:22-slim\"). Use a digest-pinned, private-registry, or preloaded image when needed; missing images are pulled on first use."}},"additionalProperties":false,"title":"Node Worker Runs","description":"Opt in to full OpenClaw worker session hosting from Gateway-managed bundles. Disabled by default."},"browserProxy":{"type":"object","properties":{"enabled":{"type":"boolean","title":"Node Browser Proxy Enabled","description":"Expose the local browser control server through node proxy routing so remote clients can use this host's browser capabilities. Keep disabled unless remote automation explicitly depends on it."},"allowProfiles":{"type":"array","items":{"type":"string"},"title":"Node Browser Proxy Allowed Profiles","description":"Optional allowlist of browser profile names exposed through node proxy routing. Leave empty to preserve the default full profile surface, including profile create/delete routes. When set, OpenClaw enforces least-privilege profile access and blocks persistent profile create/delete through the proxy."}},"additionalProperties":false,"title":"Node Browser Proxy","description":"Groups browser-proxy settings for exposing local browser control through node routing. Enable only when remote node workflows need your local browser profiles."},"mcp":{"type":"object","properties":{"servers":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"enabled":{"type":"boolean"},"command":{"type":"string"},"args":{"type":"array","items":{"type":"string"}},"env":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]}},"cwd":{"type":"string"},"url":{"type":"string","format":"uri"},"transport":{"anyOf":[{"type":"string","const":"stdio"},{"type":"string","const":"sse"},{"type":"string","const":"streamable-http"}]},"headers":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]}},"connectionTimeoutMs":{"type":"number","exclusiveMinimum":0},"requestTimeoutMs":{"type":"number","exclusiveMinimum":0},"supportsParallelToolCalls":{"type":"boolean"},"auth":{"type":"string","const":"oauth"},"oauth":{"type":"object","properties":{"identity":{"type":"string","enum":["shared","per-requester"]},"authProfileId":{"type":"string","minLength":1},"scope":{"type":"string","minLength":1},"redirectUrl":{"type":"string","format":"uri"},"clientMetadataUrl":{"type":"string","format":"uri"}},"additionalProperties":false},"sslVerify":{"type":"boolean"},"clientCert":{"type":"string"},"clientKey":{"type":"string"},"toolFilter":{"type":"object","properties":{"include":{"minItems":1,"type":"array","items":{"type":"string","minLength":1}},"exclude":{"minItems":1,"type":"array","items":{"type":"string","minLength":1}}},"additionalProperties":false},"codex":{"type":"object","properties":{"agents":{"minItems":1,"type":"array","items":{"type":"string","pattern":"^[a-z0-9][a-z0-9_-]{0,63}$"}},"defaultToolsApprovalMode":{"type":"string","enum":["auto","prompt","approve"]}},"additionalProperties":false}},"additionalProperties":{}},"title":"Node Host MCP Servers","description":"Named MCP server definitions local to this node. Uses the same server shape as mcp.servers; OAuth servers are not supported by the node host."}},"additionalProperties":false,"title":"Node Host MCP","description":"Use MCP servers started by the headless node host and published to its paired gateway as agent tools. Restart the node host after changing this section."},"skills":{"type":"object","properties":{"enabled":{"type":"boolean","title":"Node Host Skills Enabled","description":"Scan and publish node-hosted skills after connecting (default: true). Set false to disable node skill publication."}},"additionalProperties":false,"title":"Node Host Skills","description":"Use this section to publish skills installed in ~/.openclaw/skills from the headless node host. Restart the node host after changing skill files."}},"additionalProperties":false,"title":"Node Host","description":"Node host controls for features exposed from this gateway node to other nodes or clients. Keep defaults unless you intentionally proxy local capabilities across your node network."},"agents":{"type":"object","properties":{"ownership":{"type":"string","const":"explicit","title":"Agent Ownership Generation","description":"Durable multi-agent ownership generation marker. \"explicit\" means ambient channels, heartbeat, system-agent consults, Talk, cron, and bare CLI operations must resolve a surface-specific owner or fail closed. OpenClaw stamps this automatically when creating or migrating a fleet; omit it for a sole agent."},"defaults":{"type":"object","properties":{"params":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},"model":{"anyOf":[{"type":"string"},{"type":"object","properties":{"primary":{"type":"string","title":"Primary Model","description":"Primary model (provider/model)."},"fallbacks":{"type":"array","items":{"type":"string"},"title":"Model Fallbacks","description":"Ordered fallback models (provider/model). Used when the primary model fails."}},"additionalProperties":false}]},"modelSelectionScope":{"type":"string","enum":["session","agent","global"],"title":"Model Selection Scope","description":"Optional scope for chat commands and Gateway session model updates without an explicit scope: \"session\" changes only the current session, \"agent\" also updates that agent's primary, and \"global\" also updates the shared agents.defaults.model fallback. Omit to preserve existing behavior. Explicit scope flags take precedence; configured-default writes still require owner/admin authority. Telegram callback pickers and the embedded local TUI stay session-only."},"utilityModel":{"type":"string","title":"Utility Model","description":"Optional lower-cost model (provider/model or alias) for short internal tasks such as generated titles and progress narration. Unset derives the primary provider's declared small model when available (otherwise the primary model); set to an empty string to disable utility routing."},"imageModel":{"anyOf":[{"type":"string"},{"type":"object","properties":{"primary":{"type":"string","title":"Image Model","description":"Optional image model (provider/model) used when the primary model lacks image input."},"fallbacks":{"type":"array","items":{"type":"string"},"title":"Image Model Fallbacks","description":"Ordered fallback image models (provider/model)."},"timeoutMs":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"additionalProperties":false}]},"mediaModels":{"type":"object","properties":{"image":{"anyOf":[{"type":"string"},{"type":"object","properties":{"primary":{"type":"string","title":"Image Generation Model","description":"Optional image-generation model (provider/model) used by the shared image generation capability."},"fallbacks":{"type":"array","items":{"type":"string"},"title":"Image Generation Model Fallbacks","description":"Ordered fallback image-generation models (provider/model)."},"timeoutMs":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"title":"Image Generation Timeout (ms)","description":"Default provider request timeout in milliseconds for image_generate calls. Per-call timeoutMs overrides this."}},"additionalProperties":false}]},"video":{"anyOf":[{"type":"string"},{"type":"object","properties":{"primary":{"type":"string","title":"Video Generation Model","description":"Optional video-generation model (provider/model) used by the shared video generation capability."},"fallbacks":{"type":"array","items":{"type":"string"},"title":"Video Generation Model Fallbacks","description":"Ordered fallback video-generation models (provider/model)."},"timeoutMs":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"title":"Video Generation Timeout (ms)","description":"Default provider request timeout in milliseconds for video_generate calls. Per-call timeoutMs overrides this, and this value overrides provider-authored defaults."}},"additionalProperties":false}]},"music":{"anyOf":[{"type":"string"},{"type":"object","properties":{"primary":{"type":"string","title":"Music Generation Model","description":"Optional music-generation model (provider/model) used by the shared music generation capability."},"fallbacks":{"type":"array","items":{"type":"string"},"title":"Music Generation Model Fallbacks","description":"Ordered fallback music-generation models (provider/model)."},"timeoutMs":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"additionalProperties":false}]}},"additionalProperties":false},"voiceModel":{"anyOf":[{"type":"string"},{"type":"object","properties":{"primary":{"type":"string","title":"Voice Model","description":"Optional voice model (provider/model) used by speech, transcription, and realtime voice capabilities."},"fallbacks":{"type":"array","items":{"type":"string"},"title":"Voice Model Fallbacks","description":"Ordered fallback voice models (provider/model)."},"timeoutMs":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"title":"Voice Timeout (ms)","description":"Default provider request timeout in milliseconds for voice model operations when the caller supports timeouts."}},"additionalProperties":false}]},"pdfModel":{"anyOf":[{"type":"string"},{"type":"object","properties":{"primary":{"type":"string","title":"PDF Model","description":"Optional PDF model (provider/model) for the PDF analysis tool. Defaults to imageModel, then session model."},"fallbacks":{"type":"array","items":{"type":"string"},"title":"PDF Model Fallbacks","description":"Ordered fallback PDF models (provider/model)."},"timeoutMs":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"additionalProperties":false}]},"pdfMaxMb":{"type":"number","exclusiveMinimum":0,"title":"PDF Max Size (MB)","description":"Maximum PDF file size in megabytes for the PDF tool (default: 10)."},"pdfMaxPages":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"title":"PDF Max Pages","description":"Maximum number of PDF pages to process for the PDF tool (default: 20)."},"models":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"alias":{"type":"string"},"params":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},"agentRuntime":{"type":"object","properties":{"id":{"type":"string","title":"Default Agent Model Runtime ID","description":"Default-agent model runtime id: \"openclaw\", \"auto\", a registered plugin harness id such as \"codex\", or a supported CLI backend alias such as \"claude-cli\"."}},"additionalProperties":false,"title":"Default Agent Model Runtime","description":"Optional per-model runtime policy for the default agent. Use this for model-specific runtime exceptions instead of setting a whole-agent runtime."},"codeMode":{"type":"boolean","title":"Code Mode","description":"OpenClaw Code Mode for this exact provider/model: On forces it on, Off disables it, and Default inherits tools.codeMode.enabled. Agent-specific activation settings take precedence. This does not change the selected runtime or Codex native Code Mode."},"streaming":{"type":"boolean"}},"additionalProperties":false},"title":"Models","description":"Configured model catalog and per-model settings. Entries provide aliases, params, runtime metadata, and Code Mode overrides; they do not restrict model overrides."},"modelPolicy":{"type":"object","properties":{"allow":{"type":"array","items":{"type":"string"},"title":"Allowed Models","description":"Allowed model override refs. Accepts aliases, full \"provider/model\" refs, and provider wildcards such as \"openai/*\". Empty permits any model."}},"additionalProperties":false,"title":"Model Policy","description":"Explicit policy for model overrides. Omit it or leave allow empty to permit any model."},"workspace":{"type":"string","title":"Workspace","description":"Default agent workspace for bootstrap and memory files. Also used as the working directory when agents.defaults.cwd is unset. Set this explicitly when running from wrappers so path resolution stays deterministic."},"cwd":{"type":"string","title":"Working Directory","description":"Working directory for agent reply runs, separate from workspace bootstrap and memory files. Agent-specific cwd and session-spawned cwd take precedence. Supports ~ and relative paths; a distinct cwd requires an unsandboxed run."},"skills":{"type":"array","items":{"type":"string"},"title":"Skills","description":"Optional default skill allowlist inherited by agents that omit agents.entries.*.skills. Omit for unrestricted skills, set [] to give inheriting agents no skills, and remember explicit agents.entries.*.skills replaces this default instead of merging with it."},"silentReply":{"type":"object","properties":{"group":{"anyOf":[{"type":"string","const":"allow"},{"type":"string","const":"disallow"}]},"internal":{"anyOf":[{"type":"string","const":"allow"},{"type":"string","const":"disallow"}]}},"additionalProperties":false},"repoRoot":{"type":"string","title":"Repo Root","description":"Optional repository root shown in the system prompt runtime line (overrides auto-detect)."},"skipBootstrap":{"type":"boolean"},"skipOptionalBootstrapFiles":{"type":"array","items":{"type":"string","enum":["SOUL.md","USER.md","HEARTBEAT.md","IDENTITY.md"]},"title":"Skipped Optional Bootstrap Files","description":"Optional bootstrap files that should not be created in agent workspaces. Valid values: SOUL.md, USER.md, IDENTITY.md (HEARTBEAT.md is accepted but a no-op)."},"contextInjection":{"anyOf":[{"type":"string","const":"always"},{"type":"string","const":"continuation-skip"},{"type":"string","const":"never"}],"title":"Context Injection","description":"Controls when workspace bootstrap files are injected into the system prompt: \"always\" (default) or \"continuation-skip\" for safe continuation turns after a completed assistant response."},"bootstrapMaxChars":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"title":"Bootstrap Max Chars","description":"Max characters of each workspace bootstrap file injected into the system prompt before truncation (default: 20000)."},"bootstrapTotalMaxChars":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"title":"Bootstrap Total Max Chars","description":"Max total characters across all injected workspace bootstrap files (default: 60000)."},"experimental":{"type":"object","properties":{"localModelLean":{"type":"boolean","title":"Enable Lean Local Model Mode (Experimental)","description":"Experimental local-model prompt trim. When enabled, OpenClaw drops heavyweight default tools like browser, cron, and message for weaker or smaller local-model backends."}},"additionalProperties":false,"title":"Experimental Agent Flags","description":"Experimental agent-default flags. Keep these off unless you are intentionally testing a preview surface."},"userTimezone":{"type":"string"},"startupContext":{"type":"object","properties":{"enabled":{"type":"boolean","title":"Enable Startup Context","description":"Enable the startup-context prelude for bare session resets (default: true). Disable this to fall back to prompt-only behavior with no runtime-loaded daily memory."},"applyOn":{"type":"array","items":{"anyOf":[{"type":"string","const":"new"},{"type":"string","const":"reset"}]},"title":"Startup Context Apply On","description":"Chooses which bare reset commands get startup context: include \"new\", \"reset\", or both (default: [\"new\",\"reset\"])."},"dailyMemoryDays":{"type":"integer","minimum":1,"maximum":14,"title":"Startup Context Daily Memory Days","description":"Number of dated memory files to load counting backward from today in the configured user timezone (default: 2 for today + yesterday)."},"maxFileBytes":{"type":"integer","minimum":1,"maximum":65536,"title":"Startup Context Max File Bytes","description":"Maximum bytes allowed per daily memory file when building startup context (default: 16384). Files over this boundary-safe read limit are skipped."},"maxFileChars":{"type":"integer","minimum":1,"maximum":10000,"title":"Startup Context Max File Chars","description":"Maximum characters retained from each loaded daily memory file in the startup prelude (default: 1200)."},"maxTotalChars":{"type":"integer","minimum":1,"maximum":50000,"title":"Startup Context Max Total Chars","description":"Maximum total characters retained across all loaded daily memory files in the startup prelude (default: 2800). Additional files are truncated from the prelude once this cap is reached."}},"additionalProperties":false,"title":"Startup Context","description":"Runtime-owned first-turn prelude for bare \"/new\" and \"/reset\". Use this to control whether recent daily memory files are preloaded into the first prompt instead of asking the model to decide what to read."},"contextLimits":{"type":"object","properties":{"memoryGetMaxChars":{"type":"integer","minimum":1,"maximum":250000,"title":"Default memory_get Max Chars","description":"Default max characters returned by memory_get before truncation metadata and continuation notice are added. Increase to approximate older larger excerpts, but keep it bounded."},"postCompactionMaxChars":{"type":"integer","minimum":1,"maximum":50000,"title":"Default Post-compaction Max Chars","description":"Default max characters retained from AGENTS.md during post-compaction context refresh injection. Lower this to make compaction recovery cheaper, or raise it for agents that depend on longer startup guidance."}},"additionalProperties":false,"title":"Default Context Limits","description":"Focused per-agent-context budget defaults for selected high-volume excerpts and injected prompt blocks. Use this to tune bounded read/injection sizes without reopening any unbounded call paths."},"contextPruning":{"type":"object","properties":{"mode":{"anyOf":[{"type":"string","const":"off"},{"type":"string","const":"cache-ttl"}]},"ttl":{"type":"string"},"tools":{"type":"object","properties":{"allow":{"type":"array","items":{"type":"string"}},"deny":{"type":"array","items":{"type":"string"}}},"additionalProperties":false},"hardClear":{"type":"object","properties":{"enabled":{"type":"boolean"},"placeholder":{"type":"string"}},"additionalProperties":false}},"additionalProperties":false},"compaction":{"type":"object","properties":{"enabled":{"type":"boolean","title":"Embedded Auto-Compaction","description":"Enable embedded proactive auto-compaction (default: true). Set false to stop threshold-driven embedded compaction while preserving OpenClaw overflow recovery, preflight compaction, and manual /compact."},"mode":{"anyOf":[{"type":"string","const":"default"},{"type":"string","const":"safeguard"}],"title":"Compaction Mode","description":"Compaction strategy mode: \"safeguard\" (the effective default when unset) applies guardrails to preserve recent context, while \"default\" uses baseline summarization without them. Set \"default\" only if safeguard summarization causes problems for your provider."},"provider":{"type":"string","title":"Compaction Provider","description":"Id of a registered compaction provider plugin used for summarization. When set and the provider is registered, its summarize() method is called instead of the built-in summarizeInStages pipeline. Falls back to built-in on provider failure. Leave unset to use the default built-in summarization."},"thinkingLevel":{"anyOf":[{"type":"string","enum":["off","minimal","low","medium","high","xhigh","adaptive","max","ultra"]},{"type":"string","const":"inherit"}],"title":"Compaction Thinking Level","description":"Thinking level used only for embedded OpenClaw compaction summaries: \"off\", \"minimal\", \"low\", \"medium\", \"high\", \"xhigh\", \"adaptive\", \"max\", \"ultra\", or \"inherit\". The default is \"low\"; set \"inherit\" to reuse the session level. The selected level is clamped to the actual compaction model/runtime. Native Codex app-server compaction ignores this setting because its compact request has no per-operation thinking override, and OpenClaw logs a warning."},"keepRecentTokens":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"title":"Compaction Keep Recent Tokens","description":"Minimum token budget preserved from the most recent conversation window during compaction. Use higher values to protect immediate context continuity and lower values to keep more long-tail history."},"identifierPolicy":{"anyOf":[{"type":"string","const":"strict"},{"type":"string","const":"off"}],"title":"Compaction Identifier Policy","description":"Identifier-preservation policy for compaction summaries: \"strict\" prepends built-in opaque-identifier retention guidance (default), while \"off\" disables this prefix."},"recentTurnsPreserve":{"type":"integer","minimum":0,"maximum":12,"title":"Compaction Preserve Recent Turns","description":"Number of most recent user/assistant turns kept verbatim outside safeguard summarization (default: 3). Raise this to preserve exact recent dialogue context, or lower it to maximize compaction savings."},"qualityGuard":{"type":"object","properties":{"enabled":{"type":"boolean","title":"Compaction Quality Guard Enabled","description":"Enables summary quality audits and regeneration retries for safeguard compaction. Default: true in safeguard mode."},"maxRetries":{"type":"integer","minimum":0,"maximum":9007199254740991,"title":"Compaction Quality Guard Max Retries","description":"Maximum number of regeneration retries after a failed safeguard summary quality audit. Use small values to bound extra latency and token cost."}},"additionalProperties":false,"title":"Compaction Quality Guard","description":"Quality-audit retry settings for safeguard compaction summaries. Safeguard mode enables this by default; set enabled: false to skip summary audits and regeneration."},"midTurnPrecheck":{"type":"object","properties":{"enabled":{"type":"boolean","title":"Compaction Mid-turn Precheck Enabled","description":"Enable structured mid-turn context pressure checks for embedded OpenClaw tool loops. Default: false. Keep disabled unless long tool-heavy sessions hit context overflow before normal turn-end compaction can run."}},"additionalProperties":false,"title":"Compaction Mid-turn Precheck","description":"Optional embedded OpenClaw tool-loop precheck that detects context pressure after a tool result is appended and before the next model call. When enabled, OpenClaw reuses existing precheck recovery to truncate tool results or compact before retrying."},"postIndexSync":{"type":"string","enum":["off","async","await"],"title":"Compaction Post-Index Sync","description":"Controls post-compaction session memory reindex mode: \"off\", \"async\", or \"await\" (default: \"async\"). Use \"await\" for strongest freshness, \"async\" for lower compaction latency, and \"off\" only when session-memory sync is handled elsewhere."},"postCompactionSections":{"type":"array","items":{"type":"string"},"title":"Post-Compaction Context Sections","description":"Opt-in AGENTS.md H2/H3 section names re-injected after compaction. Leave unset or set [] to disable reinjection. Explicitly set [\"Session Startup\", \"Red Lines\"] to enable the legacy default pair."},"model":{"type":"string","title":"Compaction Model Override","description":"Optional provider/model or configured bare alias used only for compaction summarization. Bare aliases resolve before dispatch; a configured literal model ID wins if it collides with an alias. Leave unset to keep using the primary agent model."},"timeoutSeconds":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"title":"Compaction Timeout (Seconds)","description":"Safety window in seconds for each built-in compaction model request (default: 180). Multi-stage compaction refreshes the window as each serial request starts, so the complete compaction can take longer; plugin-owned compaction receives one window for the complete operation."},"memoryFlush":{"type":"object","properties":{"enabled":{"type":"boolean","title":"Compaction Memory Flush Enabled","description":"Enables pre-compaction memory flush before the runtime performs stronger history reduction near token limits. Keep enabled unless you intentionally disable memory side effects in constrained environments."},"model":{"type":"string","title":"Compaction Memory Flush Model Override","description":"Optional provider/model override used only for pre-compaction memory flush turns. Set this to a local model such as ollama/qwen3:8b when durable memory extraction should avoid the active session's paid model. The override is exact and does not inherit the active model fallback chain."},"softThresholdTokens":{"type":"integer","minimum":0,"maximum":9007199254740991,"title":"Compaction Memory Flush Soft Threshold","description":"Threshold distance to compaction (in tokens) that triggers pre-compaction memory flush execution. Use earlier thresholds for safer persistence, or tighter thresholds for lower flush frequency."},"forceFlushTranscriptBytes":{"anyOf":[{"type":"integer","minimum":0,"maximum":9007199254740991},{"type":"string"}],"title":"Compaction Memory Flush Transcript Size Threshold","description":"Forces pre-compaction memory flush when the model-visible transcript window reaches this threshold (bytes or strings like \"2mb\"). After compaction, this includes the retained tail and subsequent turns rather than discarded history. Use this to prevent long-session hangs even when token counters are stale; set to 0 to disable."}},"additionalProperties":false,"title":"Compaction Memory Flush","description":"Pre-compaction memory flush settings that run an agentic memory write before heavy compaction. Keep enabled for long sessions so salient context is persisted before aggressive trimming."},"maxActiveTranscriptBytes":{"anyOf":[{"type":"integer","minimum":0,"maximum":9007199254740991},{"type":"string"}],"title":"Compaction Active Transcript Size Threshold","description":"Byte threshold that triggers normal preflight local compaction when the transcript window the model sees (since the latest compaction or reset) reaches this size (bytes or strings like \"20mb\"). Set to 0 or leave unset to disable. Also caps Codex app-server native rollout transcripts; oversized native threads restart fresh."},"notifyUser":{"type":"boolean","title":"Compaction Notify User","description":"When enabled, sends brief context-maintenance notices to the user: when compaction starts and completes (for example, '🧹 Compacting context...' and '🧹 Compaction complete'), and when a pre-compaction memory flush is exhausted so the reply continues in a degraded state (for example, '⚠️ Memory maintenance temporarily failed; continuing your reply.'). Disabled by default to keep context maintenance silent and non-intrusive."}},"additionalProperties":false,"title":"Compaction","description":"Compaction behavior for when context nears token limits, including strategy and pre-compaction memory flush behavior. Use this when long-running sessions need stable continuity under tight context windows."},"embeddedAgent":{"type":"object","properties":{"projectSettingsPolicy":{"anyOf":[{"type":"string","const":"trusted"},{"type":"string","const":"sanitize"},{"type":"string","const":"ignore"}],"title":"Embedded OpenClaw Project Settings Policy","description":"How embedded OpenClaw handles workspace-local `.openclaw/settings.json`: \"sanitize\" (default) strips shellPath/shellCommandPrefix, \"ignore\" disables project settings entirely, and \"trusted\" applies project settings as-is."},"executionContract":{"anyOf":[{"type":"string","const":"default"},{"type":"string","const":"strict-agentic"}],"title":"Embedded OpenClaw Execution Contract","description":"Embedded OpenClaw execution contract: \"default\" keeps the standard runner behavior, while \"strict-agentic\" enables structured plan tracking and non-visible turn recovery for supported OpenAI/OpenAI Codex GPT-5-family runs."}},"additionalProperties":false,"title":"Embedded OpenClaw","description":"Embedded OpenClaw runner hardening controls for how workspace-local agent settings are trusted and applied in OpenClaw sessions."},"thinkingDefault":{"type":"string","enum":["off","minimal","low","medium","high","xhigh","adaptive","max","ultra"]},"fastModeDefault":{"anyOf":[{"type":"boolean"},{"type":"string","const":"auto"}],"title":"Default Agent Fast Mode","description":"Default fast-mode policy for the agent loop (\"auto\", true, or false). Individual agent entries override it."},"verboseDefault":{"anyOf":[{"type":"string","const":"off"},{"type":"string","const":"on"},{"type":"string","const":"full"}]},"toolProgressDetail":{"anyOf":[{"type":"string","const":"explain"},{"type":"string","const":"raw"}]},"reasoningDefault":{"anyOf":[{"type":"string","const":"off"},{"type":"string","const":"on"},{"type":"string","const":"stream"}]},"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"}],"title":"Human Delay Mode","description":"Delay style for block replies (\"off\", \"natural\", \"custom\")."},"minMs":{"type":"integer","minimum":0,"maximum":9007199254740991,"title":"Human Delay Min (ms)","description":"Minimum delay in ms for custom humanDelay (default: 800)."},"maxMs":{"type":"integer","minimum":0,"maximum":9007199254740991,"title":"Human Delay Max (ms)","description":"Maximum delay in ms for custom humanDelay (default: 2500)."}},"additionalProperties":false},"timeoutSeconds":{"type":"integer","minimum":0,"maximum":9007199254740991},"mediaMaxMb":{"type":"number","exclusiveMinimum":0},"imageMaxDimensionPx":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"title":"Image Max Dimension (px)","description":"Max image side length in pixels when sanitizing transcript/tool-result image payloads (default: 1200)."},"imageQuality":{"type":"string","enum":["auto","efficient","balanced","high"],"title":"Image Quality","description":"Image-tool media compression preference: \"auto\" adapts to provider/model limits and image count, \"efficient\" saves tokens and bytes, \"balanced\" keeps the current middle ground, and \"high\" preserves more detail for screenshots and document images."},"typingIntervalSeconds":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"title":"Typing Interval (Seconds)","description":"Controls typing-indicator keepalive cadence in seconds for every agent. Increase it to reduce update frequency across all typing-capable channels."},"typingMode":{"anyOf":[{"type":"string","const":"never"},{"type":"string","const":"instant"},{"type":"string","const":"thinking"},{"type":"string","const":"message"}],"title":"Typing Mode","description":"Controls when typing starts for agents: \"never\", \"instant\", \"thinking\", or \"message\". Per-agent typingMode overrides this default."},"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"},"target":{"type":"string"},"directPolicy":{"anyOf":[{"type":"string","const":"allow"},{"type":"string","const":"block"}],"title":"Heartbeat Direct Policy","description":"Controls whether heartbeat delivery may target direct/DM chats: \"allow\" (default) permits DM delivery and \"block\" suppresses direct-target sends."},"to":{"type":"string"},"accountId":{"type":"string"},"prompt":{"type":"string"},"timeoutSeconds":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"title":"Heartbeat Timeout (Seconds)","description":"Maximum time in seconds allowed for a heartbeat agent turn before it is aborted. Leave unset to use agents.defaults.timeoutSeconds when set, otherwise the heartbeat cadence capped at 600 seconds."},"lightContext":{"type":"boolean"},"isolatedSession":{"type":"boolean"},"agentId":{"type":"string","minLength":1,"title":"Heartbeat Agent","description":"Agent that owns ambient heartbeat runs when no per-agent heartbeat configuration exists. Leave unset to preserve configured-default routing."}},"additionalProperties":false},"systemAgent":{"type":"object","properties":{"agentId":{"type":"string","minLength":1,"title":"System Agent Owner","description":"Agent whose model and credentials own ambient system-agent and Custodian consults. Also used when models.list, models.authStatus, skills.status, doctor.memory.status, or an infer CLI command that resolves agent-owned model or auth state omits agentId or --agent; explicit request agentId always wins."}},"additionalProperties":false,"title":"System Agent Target","description":"Target settings for ambient OpenClaw system-agent and Custodian inference plus selected unscoped operator reads."},"authInheritance":{"type":"object","properties":{"agentId":{"type":"string","minLength":1,"title":"Auth Inheritance Owner","description":"Agent whose legacy credential store remains the inheritance source after default-marker retirement. Written automatically during upgrade when the former owner was not main."}},"additionalProperties":false,"title":"Auth Inheritance Target","description":"Upgrade compatibility owner for the inherited credential store until credentials are relocated per agent."},"sessionStore":{"type":"object","properties":{"agentId":{"type":"string","minLength":1,"title":"Legacy Session Store Owner","description":"Agent that owns retired main-agent rows or unscoped rows in a fixed legacy session store after default-marker retirement. Written automatically during upgrade when the former owner was not main or the sole agent."}},"additionalProperties":false,"title":"Legacy Session Store Target","description":"Upgrade compatibility owner for retired main-agent rows and fixed legacy session stores."},"maxConcurrent":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"subagents":{"type":"object","properties":{"delegationMode":{"type":"string","enum":["suggest","prefer"],"title":"Sub-agent Delegation Mode","description":"Prompt-only sub-agent delegation strength. Defaults to \"prefer\" in each agent's main session and \"suggest\" elsewhere; \"prefer\" strongly instructs the agent to delegate non-trivial work via sessions_spawn."},"allowAgents":{"type":"array","items":{"type":"string"}},"maxConcurrent":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"maxSpawnDepth":{"description":"Maximum nesting depth for sub-agent spawning. 1 = no nesting (default), 2 = sub-agents can spawn sub-sub-agents.","type":"integer","minimum":1,"maximum":5},"maxChildrenPerAgent":{"description":"Maximum number of active children a single agent session can spawn (default: 5).","type":"integer","minimum":1,"maximum":20},"archiveAfterMinutes":{"type":"integer","minimum":0,"maximum":9007199254740991},"model":{"anyOf":[{"type":"string"},{"type":"object","properties":{"primary":{"type":"string"},"fallbacks":{"type":"array","items":{"type":"string"}}},"additionalProperties":false}]},"thinking":{"type":"string"},"runTimeoutSeconds":{"type":"integer","minimum":0,"maximum":9007199254740991},"announceTimeoutMs":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"requireAgentId":{"type":"boolean"}},"additionalProperties":false},"sandbox":{"type":"object","properties":{"mode":{"anyOf":[{"type":"string","const":"off"},{"type":"string","const":"non-main"},{"type":"string","const":"all"}]},"backend":{"type":"string","minLength":1},"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"}]},"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":{"anyOf":[{"type":"string"},{"type":"array","items":{"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},"gpus":{"type":"string","minLength":1,"title":"Sandbox Docker GPUs","description":"Optional Docker GPU passthrough value passed to --gpus, for example \"all\" or \"device=GPU-uuid\". Requires a compatible host runtime such as NVIDIA Container Toolkit."},"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"}},"dangerouslyAllowReservedContainerTargets":{"type":"boolean"},"dangerouslyAllowExternalBindSources":{"type":"boolean"},"dangerouslyAllowContainerNamespaceJoin":{"type":"boolean","title":"Sandbox Docker Allow Container Namespace Join","description":"DANGEROUS break-glass override that allows sandbox Docker network mode container:<id>. This joins another container namespace and weakens sandbox isolation."}},"additionalProperties":false},"ssh":{"type":"object","properties":{"target":{"type":"string","minLength":1},"command":{"type":"string","minLength":1},"workspaceRoot":{"type":"string","minLength":1},"strictHostKeyChecking":{"type":"boolean"},"updateHostKeys":{"type":"boolean"},"identityFile":{"type":"string","minLength":1},"certificateFile":{"type":"string","minLength":1},"knownHostsFile":{"type":"string","minLength":1},"identityData":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"store"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false}]}]},"certificateData":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"store"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false}]}]},"knownHostsData":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"store"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false}]}]}},"additionalProperties":false},"browser":{"type":"object","properties":{"enabled":{"type":"boolean"},"image":{"type":"string"},"containerPrefix":{"type":"string"},"network":{"type":"string","title":"Sandbox Browser Network","description":"Docker network for sandbox browser containers (default: openclaw-sandbox-browser). Use the dedicated default or a custom bridge network; \"none\" is unsupported because browser control requires published CDP ports."},"cdpPort":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"cdpSourceRange":{"type":"string","title":"Sandbox Browser CDP Source Port Range","description":"Optional CIDR allowlist for container-edge CDP ingress (for example 172.21.0.1/32)."},"vncPort":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"noVncPort":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"headless":{"type":"boolean"},"noVncEnabled":{"type":"boolean"},"allowHostControl":{"type":"boolean"},"autoStart":{"type":"boolean"},"autoStartTimeoutMs":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"binds":{"type":"array","items":{"type":"string"}}},"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,"title":"Agent Defaults","description":"Shared default settings inherited by agents unless overridden per entry in agents.entries. Use defaults to enforce consistent baseline behavior and reduce duplicated per-agent configuration."},"entries":{"type":"object","propertyNames":{"type":"string","pattern":"^[a-z0-9_][a-z0-9_-]{0,63}$"},"additionalProperties":{"type":"object","properties":{"name":{"type":"string"},"description":{"type":"string"},"workspace":{"type":"string"},"cwd":{"type":"string","title":"Agent Working Directory","description":"Working directory for this agent's reply runs. Overrides agents.defaults.cwd but not session-spawned cwd; bootstrap and memory files stay in workspace. Supports ~ and relative paths; a distinct cwd requires an unsandboxed run."},"agentDir":{"type":"string"},"model":{"anyOf":[{"type":"string"},{"type":"object","properties":{"primary":{"type":"string"},"fallbacks":{"type":"array","items":{"type":"string"}}},"additionalProperties":false}]},"utilityModel":{"type":"string","title":"Agent Utility Model","description":"Optional per-agent utility model override for short internal tasks. Overrides agents.defaults.utilityModel."},"models":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"alias":{"type":"string"},"params":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},"agentRuntime":{"type":"object","properties":{"id":{"type":"string","title":"Agent Model Runtime ID","description":"Per-agent model runtime id: \"openclaw\", \"auto\", a registered plugin harness id such as \"codex\", or a supported CLI backend alias such as \"claude-cli\"."}},"additionalProperties":false,"title":"Agent Model Runtime","description":"Optional per-model runtime policy for this agent. Use this for agent-specific model exceptions instead of setting a whole-agent runtime."},"codeMode":{"type":"boolean","title":"Code Mode","description":"OpenClaw Code Mode for this agent and exact provider/model: On forces it on, Off disables it, and Default inherits the agent activation setting, then the shared model override, then tools.codeMode.enabled. This does not change the selected runtime or Codex native Code Mode."},"streaming":{"type":"boolean"}},"additionalProperties":false},"title":"Agent Model Overrides","description":"Per-agent model catalog overrides keyed by full provider/model IDs."},"modelPolicy":{"type":"object","properties":{"allow":{"type":"array","items":{"type":"string"},"title":"Allowed Agent Models","description":"Allowed model override refs for this agent. Accepts aliases, full \"provider/model\" refs, and trailing prefix wildcards such as \"provider/*\" or \"provider/namespace/*\"; empty permits any model."}},"additionalProperties":false,"title":"Agent Model Policy","description":"Per-agent model override policy. An explicit allow list replaces the default policy for this agent."},"thinkingDefault":{"type":"string","enum":["off","minimal","low","medium","high","xhigh","adaptive","max","ultra"],"title":"Agent Thinking Default","description":"Optional per-agent default thinking level. Overrides agents.defaults.thinkingDefault for this agent when no per-message or session override is set."},"verboseDefault":{"type":"string","enum":["off","on","full"]},"toolProgressDetail":{"type":"string","enum":["explain","raw"]},"reasoningDefault":{"type":"string","enum":["on","off","stream"],"title":"Agent Reasoning Default","description":"Optional per-agent default reasoning visibility (on|off|stream). Applies when no per-message or session reasoning override is set."},"fastModeDefault":{"anyOf":[{"type":"boolean"},{"type":"string","const":"auto"}],"title":"Agent Fast Mode Default","description":"Optional per-agent default for fast mode (\"auto\", true, or false). Applies when no per-message or session fast-mode override is set."},"contextInjection":{"anyOf":[{"type":"string","const":"always"},{"type":"string","const":"continuation-skip"},{"type":"string","const":"never"}],"title":"Agent Context Injection","description":"Per-agent override for when workspace bootstrap files are injected into this agent's system prompt. Omit to inherit agents.defaults.contextInjection."},"bootstrapMaxChars":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"title":"Agent Bootstrap Max Chars","description":"Per-agent override for max characters of each workspace bootstrap file injected into this agent's system prompt. Omit to inherit agents.defaults.bootstrapMaxChars."},"bootstrapTotalMaxChars":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"title":"Agent Bootstrap Total Max Chars","description":"Per-agent override for max total characters across all workspace bootstrap files injected into this agent's system prompt. Omit to inherit agents.defaults.bootstrapTotalMaxChars."},"experimental":{"type":"object","properties":{"localModelLean":{"type":"boolean","title":"Agent Lean Local Model Mode","description":"Per-agent override for lean local-model mode. Enable it for one smaller local-model agent without trimming tools from every agent."}},"additionalProperties":false,"title":"Agent Experimental Flags","description":"Per-agent experimental flags. Omitted fields inherit agents.defaults.experimental."},"skills":{"type":"array","items":{"type":"string"},"title":"Agent Skill Filter","description":"Optional allowlist of skills for this agent. If omitted, the agent inherits agents.defaults.skills when set; otherwise skills stay unrestricted. Set [] for no skills. An explicit list fully replaces inherited defaults instead of merging with them."},"memory":{"type":"object","properties":{"search":{"type":"object","properties":{"enabled":{"type":"boolean"},"rememberAcrossConversations":{"type":"boolean"},"sources":{"type":"array","items":{"anyOf":[{"type":"string","const":"memory"},{"type":"string","const":"sessions"}]}},"extraPaths":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"object","properties":{"path":{"type":"string"},"pattern":{"type":"string"}},"required":["path"],"additionalProperties":false}]}},"multimodal":{"type":"object","properties":{"enabled":{"type":"boolean"},"modalities":{"type":"array","items":{"anyOf":[{"type":"string","const":"image"},{"type":"string","const":"audio"},{"type":"string","const":"all"}]}},"maxFileBytes":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"additionalProperties":false},"experimental":{"type":"object","properties":{"sessionMemory":{"type":"boolean"}},"additionalProperties":false},"provider":{"type":"string"},"remote":{"type":"object","properties":{"baseUrl":{"type":"string"},"apiKey":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"store"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false}]}]},"headers":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"}},"batch":{"type":"object","properties":{"enabled":{"type":"boolean"}},"additionalProperties":false}},"additionalProperties":false},"fallback":{"type":"string"},"model":{"type":"string"},"inputType":{"type":"string","minLength":1},"queryInputType":{"type":"string","minLength":1},"documentInputType":{"type":"string","minLength":1},"outputDimensionality":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"local":{"type":"object","properties":{"modelPath":{"type":"string"}},"additionalProperties":false},"store":{"type":"object","properties":{"fts":{"type":"object","properties":{"tokenizer":{"anyOf":[{"type":"string","const":"unicode61"},{"type":"string","const":"trigram"}]}},"additionalProperties":false},"vector":{"type":"object","properties":{"enabled":{"type":"boolean"},"extensionPath":{"type":"string"}},"additionalProperties":false}},"additionalProperties":false},"query":{"type":"object","properties":{"maxResults":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"minScore":{"type":"number","minimum":0,"maximum":1}},"additionalProperties":false},"cache":{"type":"object","properties":{"enabled":{"type":"boolean"}},"additionalProperties":false}},"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},"typingMode":{"anyOf":[{"type":"string","const":"never"},{"type":"string","const":"instant"},{"type":"string","const":"thinking"},{"type":"string","const":"message"}],"title":"Agent Typing Mode","description":"Overrides the default typing start policy for one agent without changing other agents."},"tts":{"type":"object","properties":{"auto":{"type":"string","enum":["off","always","inbound","tagged"]},"enabled":{"type":"boolean"},"mode":{"type":"string","enum":["final","all"]},"provider":{"type":"string","minLength":1},"persona":{"type":"string"},"personas":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"label":{"type":"string"},"description":{"type":"string"},"provider":{"type":"string","minLength":1},"fallbackPolicy":{"anyOf":[{"type":"string","const":"preserve-persona"},{"type":"string","const":"provider-defaults"},{"type":"string","const":"fail"}]},"providers":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"apiKey":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"store"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false}]}]}},"additionalProperties":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"},{"type":"array","items":{}},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}]}}}},"additionalProperties":false}},"summaryModel":{"type":"string"},"modelOverrides":{"type":"object","properties":{"enabled":{"type":"boolean"},"allowText":{"type":"boolean"},"allowProvider":{"type":"boolean"},"allowVoice":{"type":"boolean"},"allowModelId":{"type":"boolean"},"allowVoiceSettings":{"type":"boolean"},"allowNormalization":{"type":"boolean"},"allowSeed":{"type":"boolean"}},"additionalProperties":false},"providers":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"apiKey":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"store"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false}]}]}},"additionalProperties":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"},{"type":"array","items":{}},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}]}}},"maxTextLength":{"type":"integer","minimum":1,"maximum":9007199254740991},"timeoutMs":{"type":"integer","minimum":1000,"maximum":120000},"prefsPath":{"type":"string"}},"additionalProperties":false},"skillsLimits":{"type":"object","properties":{"maxSkillsPromptChars":{"type":"integer","minimum":0,"maximum":9007199254740991,"title":"Agent Skills Prompt Max Chars","description":"Per-agent override for the skills prompt character budget. This extends the existing skills.limits.maxSkillsPromptChars path instead of routing the same budget through contextLimits."}},"additionalProperties":false,"title":"Agent Skills Limits","description":"Optional per-agent overrides for skills subsystem budgets. Use this when an agent needs a different skills prompt budget without introducing a second generic context-limits path."},"contextLimits":{"type":"object","properties":{"memoryGetMaxChars":{"type":"integer","minimum":1,"maximum":250000,"title":"Agent memory_get Max Chars","description":"Per-agent override for the default memory_get max character budget."},"postCompactionMaxChars":{"type":"integer","minimum":1,"maximum":50000,"title":"Agent Post-compaction Max Chars","description":"Per-agent override for the post-compaction AGENTS.md excerpt budget."}},"additionalProperties":false,"title":"Agent Context Limits","description":"Optional per-agent overrides for the focused context budget knobs. Omitted fields inherit agents.defaults.contextLimits."},"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"},"target":{"type":"string"},"directPolicy":{"anyOf":[{"type":"string","const":"allow"},{"type":"string","const":"block"}],"title":"Heartbeat Direct Policy","description":"Per-agent override for heartbeat direct/DM delivery policy; use \"block\" for agents that should only send heartbeat alerts to non-DM destinations."},"to":{"type":"string"},"accountId":{"type":"string"},"prompt":{"type":"string"},"timeoutSeconds":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"title":"Heartbeat Timeout (Seconds)","description":"Per-agent maximum time in seconds allowed for a heartbeat agent turn before it is aborted. Leave unset to inherit the merged heartbeat timeout, then agents.defaults.timeoutSeconds when set, otherwise the heartbeat cadence capped at 600 seconds."},"lightContext":{"type":"boolean"},"isolatedSession":{"type":"boolean"}},"additionalProperties":false},"identity":{"type":"object","properties":{"name":{"type":"string"},"theme":{"type":"string"},"emoji":{"type":"string"},"avatar":{"type":"string","title":"Identity Avatar","description":"Agent avatar (workspace-relative path, http(s) URL, or data URI)."}},"additionalProperties":false},"groupChat":{"type":"object","properties":{"mentionPatterns":{"type":"array","items":{"type":"string"}},"historyLimit":{"type":"integer","minimum":0,"maximum":9007199254740991},"unmentionedInbound":{"type":"string","enum":["user_request","room_event"]}},"additionalProperties":false},"subagents":{"type":"object","properties":{"delegationMode":{"type":"string","enum":["suggest","prefer"],"title":"Sub-agent Delegation Mode","description":"Per-agent override for sub-agent delegation strength. Omit to use \"prefer\" in this agent's main session and \"suggest\" elsewhere; explicit \"prefer\" or \"suggest\" always wins."},"allowAgents":{"type":"array","items":{"type":"string"}},"model":{"anyOf":[{"type":"string"},{"type":"object","properties":{"primary":{"type":"string"},"fallbacks":{"type":"array","items":{"type":"string"}}},"additionalProperties":false}]},"thinking":{"type":"string"},"requireAgentId":{"type":"boolean"}},"additionalProperties":false},"embeddedAgent":{"type":"object","properties":{"executionContract":{"anyOf":[{"type":"string","const":"default"},{"type":"string","const":"strict-agentic"}],"title":"Agent Embedded OpenClaw Execution Contract","description":"Optional per-agent embedded OpenClaw execution contract override. Set \"strict-agentic\" to enable structured plan tracking and non-visible turn recovery for that agent on supported OpenAI/OpenAI Codex GPT-5-family runs, or \"default\" to inherit the standard runner behavior."}},"additionalProperties":false,"title":"Agent Embedded OpenClaw","description":"Optional per-agent embedded OpenClaw overrides. Use this to opt specific agents into stricter GPT-5 execution behavior without changing the global default."},"sandbox":{"type":"object","properties":{"mode":{"anyOf":[{"type":"string","const":"off"},{"type":"string","const":"non-main"},{"type":"string","const":"all"}]},"backend":{"type":"string","minLength":1},"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"}]},"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":{"anyOf":[{"type":"string"},{"type":"array","items":{"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},"gpus":{"type":"string","minLength":1,"title":"Agent Sandbox Docker GPUs","description":"Per-agent Docker GPU passthrough override for sandbox containers."},"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"}},"dangerouslyAllowReservedContainerTargets":{"type":"boolean"},"dangerouslyAllowExternalBindSources":{"type":"boolean"},"dangerouslyAllowContainerNamespaceJoin":{"type":"boolean","title":"Agent Sandbox Docker Allow Container Namespace Join","description":"Per-agent DANGEROUS override for container namespace joins in sandbox Docker network mode."}},"additionalProperties":false},"ssh":{"type":"object","properties":{"target":{"type":"string","minLength":1},"command":{"type":"string","minLength":1},"workspaceRoot":{"type":"string","minLength":1},"strictHostKeyChecking":{"type":"boolean"},"updateHostKeys":{"type":"boolean"},"identityFile":{"type":"string","minLength":1},"certificateFile":{"type":"string","minLength":1},"knownHostsFile":{"type":"string","minLength":1},"identityData":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"store"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false}]}]},"certificateData":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"store"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false}]}]},"knownHostsData":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"store"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false}]}]}},"additionalProperties":false},"browser":{"type":"object","properties":{"enabled":{"type":"boolean"},"image":{"type":"string"},"containerPrefix":{"type":"string"},"network":{"type":"string","title":"Agent Sandbox Browser Network","description":"Per-agent override for the sandbox browser Docker network. Use a bridge network; \"none\" is unsupported because browser control requires published CDP ports."},"cdpPort":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"cdpSourceRange":{"type":"string","title":"Agent Sandbox Browser CDP Source Range","description":"Per-agent override for CDP source CIDR allowlist."},"vncPort":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"noVncPort":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"headless":{"type":"boolean"},"noVncEnabled":{"type":"boolean"},"allowHostControl":{"type":"boolean"},"autoStart":{"type":"boolean"},"autoStartTimeoutMs":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"binds":{"type":"array","items":{"type":"string"}}},"additionalProperties":false},"prune":{"type":"object","properties":{"idleHours":{"type":"integer","minimum":0,"maximum":9007199254740991},"maxAgeDays":{"type":"integer","minimum":0,"maximum":9007199254740991}},"additionalProperties":false}},"additionalProperties":false},"params":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},"tools":{"type":"object","properties":{"profile":{"anyOf":[{"type":"string","const":"minimal"},{"type":"string","const":"coding"},{"type":"string","const":"messaging"},{"type":"string","const":"full"}],"title":"Agent Tool Profile","description":"Per-agent override for tool profile selection when one agent needs a different capability baseline. Use this sparingly so policy differences across agents stay intentional and reviewable."},"allow":{"type":"array","items":{"type":"string"}},"alsoAllow":{"type":"array","items":{"type":"string"},"title":"Agent Tool Allowlist Additions","description":"Per-agent additive allowlist for tools on top of global and profile policy. Keep narrow to avoid accidental privilege expansion on specialized agents."},"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},"title":"Agent Tool Policy by Provider","description":"Per-agent provider-specific tool policy overrides for channel-scoped capability control. Use this when a single agent needs tighter restrictions on one provider than others."},"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}},"codeMode":{"anyOf":[{"type":"boolean"},{"type":"string","const":"auto"},{"type":"object","properties":{"enabled":{"anyOf":[{"type":"boolean"},{"type":"string","const":"auto"}]},"runtime":{"type":"string","const":"quickjs-wasi"},"mode":{"type":"string","const":"only"},"languages":{"type":"array","items":{"type":"string","enum":["javascript","typescript"]}},"timeoutMs":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"memoryLimitBytes":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"maxOutputBytes":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"maxSnapshotBytes":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"maxPendingToolCalls":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"snapshotTtlSeconds":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"searchDefaultLimit":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"maxSearchLimit":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"additionalProperties":false}],"title":"Agent Code Mode","description":"Per-agent Code Mode options. Explicit enabled overrides the shared model and global activation defaults; an agent-specific model codeMode override wins. Other options merge over tools.codeMode without changing activation."},"swarm":{"anyOf":[{"type":"boolean"},{"type":"object","properties":{"enabled":{"type":"boolean"},"maxConcurrent":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"maxChildrenPerGroup":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"maxTotalPerGroup":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"waitTimeoutSecondsMax":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"defaultAgentId":{"type":"string"}},"additionalProperties":false}],"title":"Agent Swarm","description":"Per-agent swarm override. Values merge over the top-level tools.swarm configuration."},"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":["auto","sandbox","gateway","node"]},"mode":{"type":"string","enum":["deny","allowlist","ask","auto","full"]},"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"}},"strictInlineEval":{"type":"boolean"},"commandHighlighting":{"type":"boolean"},"grantExpiryDays":{"type":"integer","minimum":1,"maximum":3650},"safeBinTrustedDirs":{"type":"array","items":{"type":"string"}},"safeBinProfiles":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"minPositional":{"type":"integer","minimum":0,"maximum":9007199254740991},"maxPositional":{"type":"integer","minimum":0,"maximum":9007199254740991},"allowedValueFlags":{"type":"array","items":{"type":"string"}},"deniedFlags":{"type":"array","items":{"type":"string"}}},"additionalProperties":false}},"reviewer":{"type":"object","properties":{"model":{"anyOf":[{"type":"string"},{"type":"object","properties":{"primary":{"type":"string"},"fallbacks":{"type":"array","items":{"type":"string"}}},"additionalProperties":false}]},"timeoutMs":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"additionalProperties":false},"backgroundMs":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"approvalRunningNoticeMs":{"type":"integer","minimum":0,"maximum":9007199254740991},"timeoutSeconds":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"title":"Agent Exec Timeout (Seconds)"},"cleanupMs":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"notifyOnExit":{"type":"boolean"},"notifyOnExitEmptySuccess":{"type":"boolean"},"applyPatch":{"type":"object","properties":{"enabled":{"type":"boolean"},"workspaceOnly":{"type":"boolean"},"allowModels":{"type":"array","items":{"type":"string"}}},"additionalProperties":false}},"additionalProperties":false},"github":{"type":"object","properties":{"profileId":{"type":"string","pattern":"^ghp_[a-f0-9]{32}$","title":"Agent GitHub Profile Version"},"kind":{"type":"string","const":"oauth","title":"Agent GitHub Credential Kind"},"gitAuthor":{"type":"object","properties":{"name":{"type":"string","minLength":1,"title":"Agent Git Author Name"},"email":{"type":"string","minLength":1,"title":"Agent Git Author Email"}},"additionalProperties":false}},"required":["profileId"],"additionalProperties":false,"title":"Agent GitHub CLI Identity Override","description":"Complete managed GitHub CLI identity and Git author override for this agent. Omit it to inherit the system identity."},"fs":{"type":"object","properties":{"workspaceOnly":{"type":"boolean"}},"additionalProperties":false},"loopDetection":{"type":"object","properties":{"enabled":{"type":"boolean"}},"additionalProperties":false},"message":{"type":"object","properties":{"crossContext":{"type":"object","properties":{"allowWithinProvider":{"type":"boolean","title":"Agent Cross-Context Messaging (Same Provider)","description":"Per-agent message guard for sending to other conversations on the same provider. Set false for current-conversation-only public agents."},"allowAcrossProviders":{"type":"boolean","title":"Agent Cross-Context Messaging (Across Providers)","description":"Per-agent message guard for sending across providers. Keep false for public or sandboxed agents."},"marker":{"type":"object","properties":{"enabled":{"type":"boolean"},"prefix":{"type":"string"},"suffix":{"type":"string"}},"additionalProperties":false}},"additionalProperties":false},"actions":{"type":"object","properties":{"allow":{"type":"array","items":{"type":"string"},"title":"Agent Message Action Allowlist","description":"Per-agent message action allowlist for the message tool. Set to a minimal list such as [\"send\"] for public sandbox agents so read, edit, delete, reaction, and other provider-specific message actions stay hidden and blocked."}},"additionalProperties":false},"broadcast":{"type":"object","properties":{"enabled":{"type":"boolean"}},"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},"runtime":{"anyOf":[{"type":"object","properties":{"type":{"type":"string","const":"embedded","title":"Agent Runtime Type","description":"Runtime type for this agent: \"embedded\" (default OpenClaw runtime) or \"acp\" (ACP harness defaults)."}},"required":["type"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","const":"acp","title":"Agent Runtime Type","description":"Runtime type for this agent: \"embedded\" (default OpenClaw runtime) or \"acp\" (ACP harness defaults)."},"acp":{"type":"object","properties":{"agent":{"type":"string","title":"Agent ACP Harness Agent","description":"Optional ACP harness agent id to use for this OpenClaw agent (for example codex, claude, cursor, gemini, openclaw)."},"backend":{"type":"string","title":"Agent ACP Backend","description":"Optional ACP backend override for this agent's ACP sessions (falls back to global acp.backend)."},"mode":{"type":"string","enum":["persistent","oneshot"],"title":"Agent ACP Mode","description":"Optional ACP session mode default for this agent (persistent or oneshot)."},"cwd":{"type":"string","title":"Agent ACP Working Directory","description":"Optional default working directory for this agent's ACP sessions."}},"additionalProperties":false,"title":"Agent ACP Runtime","description":"ACP runtime defaults for this agent when runtime.type=acp. Binding-level ACP overrides still take precedence per conversation."}},"required":["type"],"additionalProperties":false}],"title":"Agent Runtime","description":"Optional runtime descriptor for this agent. Use embedded for default OpenClaw execution or acp for external ACP harness defaults."},"default":{"type":"boolean"}},"additionalProperties":false},"title":"Agent List","description":"Explicit list of configured agents with IDs and optional overrides for model, tools, identity, and workspace. Keep IDs stable over time so bindings, approvals, and session routing remain deterministic."}},"additionalProperties":false,"title":"Agents","description":"Agent runtime configuration root. Root siblings own infrastructure and cross-agent defaults; agents.defaults owns agent-loop behavior; agent entries may override either where supported."},"worktreeRoot":{"type":"string","minLength":1,"title":"Worktree Root","description":"Global directory for new managed worktrees. Use an absolute path or ~ for your home directory; defaults to <state-dir>/worktrees. Existing worktrees keep their recorded paths when this changes."},"tools":{"type":"object","properties":{"profile":{"anyOf":[{"type":"string","const":"minimal"},{"type":"string","const":"coding"},{"type":"string","const":"messaging"},{"type":"string","const":"full"}],"title":"Tool Profile","description":"Global tool profile name used to select a predefined tool policy baseline before applying allow/deny overrides. Use this for consistent environment posture across agents and keep profile names stable."},"allow":{"type":"array","items":{"type":"string"},"title":"Tool Allowlist","description":"Absolute tool allowlist that replaces profile-derived defaults for strict environments. Use this only when you intentionally run a tightly curated subset of tool capabilities."},"alsoAllow":{"type":"array","items":{"type":"string"},"title":"Tool Allowlist Additions","description":"Extra tool allowlist entries merged on top of the selected tool profile and default policy. Keep this list small and explicit so audits can quickly identify intentional policy exceptions."},"deny":{"type":"array","items":{"type":"string"},"title":"Tool Denylist","description":"Global tool denylist that blocks listed tools even when profile or provider rules would allow them. Use deny rules for emergency lockouts and long-term defense-in-depth."},"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},"title":"Tool Policy by Provider","description":"Per-provider tool allow/deny overrides keyed by channel/provider ID to tailor capabilities by surface. Use this when one provider needs stricter controls than global tool policy."},"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}},"web":{"type":"object","properties":{"search":{"type":"object","properties":{"enabled":{"type":"boolean","title":"Enable Web Search Tool","description":"Enable managed web_search and optional Codex-native search for eligible models."},"provider":{"type":"string","title":"Web Search Provider","description":"Search provider id. Auto-detected from available API keys if omitted."},"maxResults":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"title":"Web Search Max Results","description":"Number of results to return (1-10)."},"timeoutSeconds":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"title":"Web Search Timeout (sec)","description":"Timeout in seconds for web_search requests."},"cacheTtlMinutes":{"type":"number","minimum":0,"title":"Web Search Cache TTL (min)","description":"Cache TTL in minutes for web_search results."},"openaiCodex":{"type":"object","properties":{"enabled":{"type":"boolean","title":"Enable Native Codex Web Search","description":"Enable native Codex web search for Codex-capable models."},"mode":{"anyOf":[{"type":"string","const":"cached"},{"type":"string","const":"live"}],"title":"Codex Web Search Mode","description":"Native Codex web search preference: \"cached\" (default; unrestricted Codex turns resolve it to live) or \"live\"."},"allowedDomains":{"type":"array","items":{"type":"string"},"title":"Codex Allowed Domains","description":"Domain allowlist for native Codex web_search. On native-hosted-search turns, it also gates managed web_fetch; managed-provider turns are unchanged."},"contextSize":{"anyOf":[{"type":"string","const":"low"},{"type":"string","const":"medium"},{"type":"string","const":"high"}],"title":"Codex Search Context Size","description":"Native Codex search context size hint: \"low\", \"medium\", or \"high\"."},"userLocation":{"type":"object","properties":{"country":{"type":"string","title":"Codex User Country","description":"Approximate country sent to native Codex web search."},"region":{"type":"string","title":"Codex User Region","description":"Approximate region/state sent to native Codex web search."},"city":{"type":"string","title":"Codex User City","description":"Approximate city sent to native Codex web search."},"timezone":{"type":"string","title":"Codex User Timezone","description":"Approximate timezone sent to native Codex web search."}},"additionalProperties":false}},"additionalProperties":false}},"additionalProperties":{}},"fetch":{"type":"object","properties":{"enabled":{"type":"boolean","title":"Enable Web Fetch Tool","description":"Enable the web_fetch tool (lightweight HTTP fetch)."},"provider":{"type":"string","title":"Web Fetch Provider","description":"Web fetch fallback provider id."},"maxChars":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"title":"Web Fetch Max Chars","description":"Max characters returned by web_fetch (truncated)."},"maxCharsCap":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"title":"Web Fetch Hard Max Chars","description":"Hard cap for web_fetch maxChars (applies to config and tool calls)."},"maxResponseBytes":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"title":"Web Fetch Max Download Size (bytes)","description":"Max download size before truncation."},"timeoutSeconds":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"title":"Web Fetch Timeout (sec)","description":"Timeout in seconds for web_fetch requests."},"cacheTtlMinutes":{"type":"number","minimum":0,"title":"Web Fetch Cache TTL (min)","description":"Cache TTL in minutes for web_fetch results."},"maxRedirects":{"type":"integer","minimum":0,"maximum":9007199254740991,"title":"Web Fetch Max Redirects","description":"Maximum redirects allowed for web_fetch (default: 3)."},"userAgent":{"type":"string","title":"Web Fetch User-Agent","description":"Override User-Agent header for web_fetch requests."},"headers":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"},"title":"Web Fetch Request Headers","description":"Extra request headers sent with direct web_fetch requests, for example gateway routing or authentication headers. Every configured value is treated as sensitive and redacted from exposed config and debug captures. Values are plain strings, support ${VAR} substitution and the global $${VAR} literal escape, and are sent to model-chosen URLs. Entries are validated when the request is built rather than at config load, so a bad name or unsendable value is dropped and logged instead of disabling the surface; Accept, Accept-Language, User-Agent, and framing headers such as Transfer-Encoding are dropped too. Use tools.web.fetch.userAgent to change the user agent. Cross-origin redirects retain only the guarded-fetch safe header allowlist, and changing the headers actually sent partitions the fetch cache."},"readability":{"type":"boolean","title":"Web Fetch Readability Extraction","description":"Use Readability to extract main content from HTML (fallbacks to basic HTML cleanup)."},"useTrustedEnvProxy":{"type":"boolean","title":"Web Fetch Trusted Env Proxy","description":"Route web_fetch through a trusted HTTP(S) env proxy and let the proxy resolve DNS. Enable only when that proxy is operator-controlled and enforces outbound policy after DNS resolution."},"ssrfPolicy":{"type":"object","properties":{"dangerouslyAllowPrivateNetwork":{"type":"boolean","title":"Web Fetch Dangerously Allow Private Network","description":"Allows web_fetch access to private and internal network targets. Keep disabled unless model-selected URLs are trusted in this deployment."},"allowRfc2544BenchmarkRange":{"type":"boolean","title":"Web Fetch Allow RFC 2544 Benchmark Range","description":"Allow RFC 2544 benchmark-range IPs (198.18.0.0/15) for fake-IP proxy compatibility such as Clash or Surge."},"allowIpv6UniqueLocalRange":{"type":"boolean","title":"Web Fetch Allow IPv6 Unique Local Range","description":"Allow IPv6 Unique Local Addresses (fc00::/7) for trusted fake-IP proxy compatibility such as sing-box, Clash, or Surge."},"allowedHostnames":{"type":"array","items":{"type":"string"},"title":"Web Fetch Allowed Hostnames","description":"Exact hostnames or IP literals allowed for web_fetch, including otherwise blocked targets. Keep the list minimal."},"blockedHostnames":{"type":"array","items":{"type":"string"},"title":"Web Fetch Blocked Hostnames","description":"Hostname patterns denied before DNS and allow rules on every web_fetch redirect. Supports exact hosts and \"*.example.com\" for subdomains only; add \"example.com\" separately to block the apex. Empty or unset adds no denials."}},"additionalProperties":false,"title":"Web Fetch SSRF Policy","description":"Scoped SSRF policy overrides for web_fetch. Keep this narrow and opt in only for known local-network proxy environments."}},"additionalProperties":false}},"additionalProperties":false,"title":"Web Tools","description":"Web-tool policy grouping for search/fetch providers, limits, and fallback behavior tuning. Keep enabled settings aligned with API key availability and outbound networking policy."},"github":{"type":"object","properties":{"profileId":{"type":"string","pattern":"^ghp_[a-f0-9]{32}$","title":"GitHub Profile Version","description":"Opaque generated profile version used to switch managed credentials atomically."},"kind":{"type":"string","const":"oauth","title":"GitHub Credential Kind","description":"Marks a managed OAuth profile whose rotating refresh credential is owned by the Gateway. Omitted profiles use a personal access token."},"gitAuthor":{"type":"object","properties":{"name":{"type":"string","minLength":1,"title":"Git Author Name","description":"Optional process-local Git author and committer name."},"email":{"type":"string","minLength":1,"title":"Git Author Email","description":"Optional process-local Git author and committer email."}},"additionalProperties":false}},"required":["profileId"],"additionalProperties":false,"title":"GitHub CLI Identity and Git Author","description":"Managed local GitHub CLI profile and optional Git author for agent tools. Omit this object to preserve the Gateway runtime user's native account and author; repository remote credentials are never overridden."},"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"}},"maxChars":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"maxBytes":{"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"}]}}},"baseUrl":{"type":"string"},"headers":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"}},"request":{"type":"object","properties":{"headers":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"store"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false}]}]}},"auth":{"anyOf":[{"type":"object","properties":{"mode":{"type":"string","const":"provider-default"}},"required":["mode"],"additionalProperties":false},{"type":"object","properties":{"mode":{"type":"string","const":"authorization-bearer"},"token":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"store"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false}]}]}},"required":["mode","token"],"additionalProperties":false},{"type":"object","properties":{"mode":{"type":"string","const":"header"},"headerName":{"type":"string","minLength":1},"value":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"store"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false}]}]},"prefix":{"type":"string"}},"required":["mode","headerName","value"],"additionalProperties":false}]},"proxy":{"anyOf":[{"type":"object","properties":{"mode":{"type":"string","const":"env-proxy"},"tls":{"type":"object","properties":{"ca":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"store"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false}]}]},"cert":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"store"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false}]}]},"key":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"store"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false}]}]},"passphrase":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"store"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false}]}]},"serverName":{"type":"string"},"insecureSkipVerify":{"type":"boolean"}},"additionalProperties":false}},"required":["mode"],"additionalProperties":false},{"type":"object","properties":{"mode":{"type":"string","const":"explicit-proxy"},"url":{"type":"string","minLength":1},"tls":{"type":"object","properties":{"ca":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"store"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false}]}]},"cert":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"store"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false}]}]},"key":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"store"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false}]}]},"passphrase":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"store"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false}]}]},"serverName":{"type":"string"},"insecureSkipVerify":{"type":"boolean"}},"additionalProperties":false}},"required":["mode","url"],"additionalProperties":false}]},"tls":{"type":"object","properties":{"ca":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"store"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false}]}]},"cert":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"store"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false}]}]},"key":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"store"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false}]}]},"passphrase":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"store"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false}]}]},"serverName":{"type":"string"},"insecureSkipVerify":{"type":"boolean"}},"additionalProperties":false}},"additionalProperties":false},"profile":{"type":"string"},"preferredProfile":{"type":"string"}},"additionalProperties":false},"title":"Media Understanding Shared Models","description":"Canonical media-understanding model list. Use image, audio, or video capability tags on every entry so each pipeline selects only compatible fallbacks."},"concurrency":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"title":"Media Understanding Concurrency","description":"Maximum number of concurrent media understanding operations per turn across image, audio, and video tasks. Lower this in resource-constrained deployments to prevent CPU/network saturation."},"image":{"type":"object","properties":{"enabled":{"type":"boolean","title":"Enable Image Understanding","description":"Enable image understanding so attached or referenced images can be interpreted into textual context. Disable if you need text-only operation or want to avoid image-processing cost."},"preferredModel":{"type":"string","minLength":1,"title":"Preferred Image Understanding Model","description":"Prefer one capability-tagged tools.media.models entry for image understanding before the remaining compatible fallbacks."},"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"},"rawKeyPrefix":{"type":"string"}},"additionalProperties":false}},"required":["action"],"additionalProperties":false}}},"additionalProperties":false,"title":"Image Understanding Scope","description":"Restrict image understanding by channel, chat type, or source key. Keep this narrow in busy or untrusted channels to control processing."},"maxBytes":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"title":"Image Understanding Max Bytes","description":"Default image input size limit for configured and auto-detected models. Set this to match provider payload limits and deployment bandwidth."},"maxChars":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"title":"Image Understanding Max Chars","description":"Default maximum image description length. Use a lower value for compact context or a higher value for detailed OCR and scene analysis."},"prompt":{"type":"string","title":"Image Understanding Prompt","description":"Default image-understanding prompt when an entry does not override it. Keep this deterministic when consumers rely on stable descriptions."},"timeoutSeconds":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"title":"Image Understanding Timeout (sec)","description":"Default timeout for image-understanding requests. Increase it for large images or slower local vision models."},"language":{"type":"string"},"providerOptions":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]}}},"baseUrl":{"type":"string"},"headers":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"}},"request":{"type":"object","properties":{"headers":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"store"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false}]}]}},"auth":{"anyOf":[{"type":"object","properties":{"mode":{"type":"string","const":"provider-default"}},"required":["mode"],"additionalProperties":false},{"type":"object","properties":{"mode":{"type":"string","const":"authorization-bearer"},"token":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"store"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false}]}]}},"required":["mode","token"],"additionalProperties":false},{"type":"object","properties":{"mode":{"type":"string","const":"header"},"headerName":{"type":"string","minLength":1},"value":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"store"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false}]}]},"prefix":{"type":"string"}},"required":["mode","headerName","value"],"additionalProperties":false}]},"proxy":{"anyOf":[{"type":"object","properties":{"mode":{"type":"string","const":"env-proxy"},"tls":{"type":"object","properties":{"ca":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"store"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false}]}]},"cert":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"store"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false}]}]},"key":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"store"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false}]}]},"passphrase":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"store"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false}]}]},"serverName":{"type":"string"},"insecureSkipVerify":{"type":"boolean"}},"additionalProperties":false}},"required":["mode"],"additionalProperties":false},{"type":"object","properties":{"mode":{"type":"string","const":"explicit-proxy"},"url":{"type":"string","minLength":1},"tls":{"type":"object","properties":{"ca":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"store"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false}]}]},"cert":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"store"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false}]}]},"key":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"store"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false}]}]},"passphrase":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"store"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false}]}]},"serverName":{"type":"string"},"insecureSkipVerify":{"type":"boolean"}},"additionalProperties":false}},"required":["mode","url"],"additionalProperties":false}]},"tls":{"type":"object","properties":{"ca":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"store"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false}]}]},"cert":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"store"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false}]}]},"key":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"store"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false}]}]},"passphrase":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"store"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false}]}]},"serverName":{"type":"string"},"insecureSkipVerify":{"type":"boolean"}},"additionalProperties":false}},"additionalProperties":false},"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,"title":"Image Understanding Attachment Policy","description":"Choose which matching image attachments are processed. Use first-only handling unless multi-image analysis is intentional."}},"additionalProperties":false},"audio":{"type":"object","properties":{"enabled":{"type":"boolean","title":"Enable Audio Understanding","description":"Enable audio understanding so voice notes or audio clips can be transcribed for agent context."},"preferredModel":{"type":"string","minLength":1,"title":"Preferred Audio Understanding Model","description":"Prefer one capability-tagged tools.media.models entry for audio transcription before the remaining compatible fallbacks."},"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"},"rawKeyPrefix":{"type":"string"}},"additionalProperties":false}},"required":["action"],"additionalProperties":false}}},"additionalProperties":false,"title":"Audio Understanding Scope","description":"Restrict audio understanding by channel, chat type, or source key. Keep this narrow where automatic transcription is sensitive or expensive."},"maxBytes":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"title":"Audio Understanding Max Bytes","description":"Default audio input size limit for configured and auto-detected models. Set this to the largest recording your providers and network should accept."},"maxChars":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"title":"Audio Understanding Max Chars","description":"Default maximum transcript length for configured and auto-detected models. Use a lower value to keep long voice notes from expanding agent context."},"prompt":{"type":"string","title":"Audio Understanding Prompt","description":"Default audio transcription prompt when a model entry does not override it. Keep the instruction stable when downstream workflows rely on transcript style."},"timeoutSeconds":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"title":"Audio Understanding Timeout (sec)","description":"Default timeout for audio understanding requests. Increase it for long recordings or slower local transcription models."},"language":{"type":"string","title":"Audio Understanding Language","description":"Default language hint for audio transcription providers. Set it when the primary spoken language is known and provider detection is unreliable."},"providerOptions":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]}}},"baseUrl":{"type":"string"},"headers":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"}},"request":{"type":"object","properties":{"headers":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"store"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false}]}]}},"auth":{"anyOf":[{"type":"object","properties":{"mode":{"type":"string","const":"provider-default"}},"required":["mode"],"additionalProperties":false},{"type":"object","properties":{"mode":{"type":"string","const":"authorization-bearer"},"token":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"store"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false}]}]}},"required":["mode","token"],"additionalProperties":false},{"type":"object","properties":{"mode":{"type":"string","const":"header"},"headerName":{"type":"string","minLength":1},"value":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"store"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false}]}]},"prefix":{"type":"string"}},"required":["mode","headerName","value"],"additionalProperties":false}]},"proxy":{"anyOf":[{"type":"object","properties":{"mode":{"type":"string","const":"env-proxy"},"tls":{"type":"object","properties":{"ca":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"store"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false}]}]},"cert":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"store"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false}]}]},"key":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"store"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false}]}]},"passphrase":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"store"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false}]}]},"serverName":{"type":"string"},"insecureSkipVerify":{"type":"boolean"}},"additionalProperties":false}},"required":["mode"],"additionalProperties":false},{"type":"object","properties":{"mode":{"type":"string","const":"explicit-proxy"},"url":{"type":"string","minLength":1},"tls":{"type":"object","properties":{"ca":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"store"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false}]}]},"cert":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"store"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false}]}]},"key":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"store"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false}]}]},"passphrase":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"store"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false}]}]},"serverName":{"type":"string"},"insecureSkipVerify":{"type":"boolean"}},"additionalProperties":false}},"required":["mode","url"],"additionalProperties":false}]},"tls":{"type":"object","properties":{"ca":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"store"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false}]}]},"cert":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"store"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false}]}]},"key":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"store"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false}]}]},"passphrase":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"store"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false}]}]},"serverName":{"type":"string"},"insecureSkipVerify":{"type":"boolean"}},"additionalProperties":false}},"additionalProperties":false},"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,"title":"Audio Understanding Attachment Policy","description":"Choose which matching audio attachments are processed. Use first-only handling unless multi-attachment transcription is intentional."},"echoTranscript":{"type":"boolean","title":"Echo Transcript to Chat","description":"Echo the audio transcript to the originating chat before agent processing. Enable this when users need to verify what the system heard."},"echoFormat":{"type":"string","title":"Transcript Echo Format","description":"Format the echoed transcript with a {transcript} placeholder. Keep the placeholder intact so delivery includes the transcript."}},"additionalProperties":false},"video":{"type":"object","properties":{"enabled":{"type":"boolean","title":"Enable Video Understanding","description":"Enable video understanding so clips can be summarized into text for downstream reasoning and responses. Disable when processing video is out of policy or too expensive for your deployment."},"preferredModel":{"type":"string","minLength":1,"title":"Preferred Video Understanding Model","description":"Prefer one capability-tagged tools.media.models entry for video understanding before the remaining compatible fallbacks."},"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"},"rawKeyPrefix":{"type":"string"}},"additionalProperties":false}},"required":["action"],"additionalProperties":false}}},"additionalProperties":false,"title":"Video Understanding Scope","description":"Restrict video understanding by channel, chat type, or source key. Keep this narrow in busy or untrusted channels to control processing."},"maxBytes":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"title":"Video Understanding Max Bytes","description":"Default video input size limit for configured and auto-detected models. Set this to match provider payload limits and deployment bandwidth."},"maxChars":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"title":"Video Understanding Max Chars","description":"Default maximum video description length. Use a lower value for compact context or a higher value for detailed scene summaries."},"prompt":{"type":"string","title":"Video Understanding Prompt","description":"Default video-understanding prompt when an entry does not override it. Keep this deterministic when consumers rely on stable summaries."},"timeoutSeconds":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"title":"Video Understanding Timeout (sec)","description":"Default timeout for video-understanding requests. Increase it for longer clips or slower local analysis models."},"language":{"type":"string"},"providerOptions":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]}}},"baseUrl":{"type":"string"},"headers":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"}},"request":{"type":"object","properties":{"headers":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"store"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false}]}]}},"auth":{"anyOf":[{"type":"object","properties":{"mode":{"type":"string","const":"provider-default"}},"required":["mode"],"additionalProperties":false},{"type":"object","properties":{"mode":{"type":"string","const":"authorization-bearer"},"token":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"store"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false}]}]}},"required":["mode","token"],"additionalProperties":false},{"type":"object","properties":{"mode":{"type":"string","const":"header"},"headerName":{"type":"string","minLength":1},"value":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"store"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false}]}]},"prefix":{"type":"string"}},"required":["mode","headerName","value"],"additionalProperties":false}]},"proxy":{"anyOf":[{"type":"object","properties":{"mode":{"type":"string","const":"env-proxy"},"tls":{"type":"object","properties":{"ca":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"store"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false}]}]},"cert":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"store"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false}]}]},"key":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"store"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false}]}]},"passphrase":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"store"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false}]}]},"serverName":{"type":"string"},"insecureSkipVerify":{"type":"boolean"}},"additionalProperties":false}},"required":["mode"],"additionalProperties":false},{"type":"object","properties":{"mode":{"type":"string","const":"explicit-proxy"},"url":{"type":"string","minLength":1},"tls":{"type":"object","properties":{"ca":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"store"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false}]}]},"cert":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"store"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false}]}]},"key":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"store"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false}]}]},"passphrase":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"store"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false}]}]},"serverName":{"type":"string"},"insecureSkipVerify":{"type":"boolean"}},"additionalProperties":false}},"required":["mode","url"],"additionalProperties":false}]},"tls":{"type":"object","properties":{"ca":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"store"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false}]}]},"cert":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"store"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false}]}]},"key":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"store"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false}]}]},"passphrase":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"store"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false}]}]},"serverName":{"type":"string"},"insecureSkipVerify":{"type":"boolean"}},"additionalProperties":false}},"additionalProperties":false},"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,"title":"Video Understanding Attachment Policy","description":"Choose which matching video attachments are processed. Use first-only handling unless multi-video analysis is intentional."}},"additionalProperties":false}},"additionalProperties":false},"links":{"type":"object","properties":{"enabled":{"type":"boolean","title":"Enable Link Understanding","description":"Enable automatic link understanding pre-processing so URLs can be summarized before agent reasoning. Keep enabled for richer context, and disable when strict minimal processing is required."},"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"},"rawKeyPrefix":{"type":"string"}},"additionalProperties":false}},"required":["action"],"additionalProperties":false}}},"additionalProperties":false,"title":"Link Understanding Scope","description":"Controls when link understanding runs relative to conversation context and message type. Keep scope conservative to avoid unnecessary fetches on messages where links are not actionable."},"maxLinks":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"title":"Link Understanding Max Links","description":"Maximum number of links expanded per turn during link understanding. Use lower values to control latency/cost in chatty threads and higher values when multi-link context is critical."},"timeoutSeconds":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"title":"Link Understanding Timeout (sec)","description":"Per-link understanding timeout budget in seconds before unresolved links are skipped. Keep this bounded to avoid long stalls when external sites are slow or unreachable."},"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},"title":"Link Understanding Models","description":"Preferred model list for link understanding tasks, evaluated in order as fallbacks when supported. Use lightweight models first for routine summarization and heavier models only when needed."}},"additionalProperties":false},"sessions":{"type":"object","properties":{"visibility":{"type":"string","enum":["self","tree","agent","all"],"title":"Session Tools Visibility","description":"Controls which sessions can be targeted by sessions_list/sessions_history/sessions_search/sessions_send. (\"agent\" default = any session in the current agent id, including other users; \"self\" = only current; \"tree\" = current session + spawned subagent sessions; \"all\" = any session; cross-agent still requires tools.agentToAgent)."}},"additionalProperties":false},"loopDetection":{"type":"object","properties":{"enabled":{"type":"boolean","title":"Tool-loop Detection","description":"Enable repetitive tool-call loop detection and backoff safety checks (default: false)."}},"additionalProperties":false},"toolSearch":{"anyOf":[{"type":"boolean"},{"type":"object","properties":{"enabled":{"type":"boolean","title":"Enable Tool Search","description":"Enables Tool Search. When on, OpenClaw hides large tool catalogs behind `tool_search_code` or structured search/describe/call tools during embedded runtime runs."},"mode":{"type":"string","enum":["code","tools","directory"],"title":"Tool Search Surface","description":"Choose the model-facing surface: \"code\" exposes `tool_search_code`; \"tools\" exposes structured search/describe/call fallback tools; \"directory\" keeps a bounded tool directory visible, exposes a bounded set of likely or required schemas, and defers the rest behind search/describe/call."},"codeTimeoutMs":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"title":"Tool Search Code Timeout","description":"Maximum milliseconds for one `tool_search_code` execution. Runtime clamps values to the supported 1s..60s range."},"searchDefaultLimit":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"title":"Tool Search Default Results","description":"Default number of Tool Search results returned when the model omits a limit. Runtime clamps this to `maxSearchLimit`."},"maxSearchLimit":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"title":"Tool Search Max Results","description":"Maximum number of Tool Search results a model can request. Runtime clamps values to the supported 1..50 range."}},"additionalProperties":false}],"title":"Tool Search","description":"Compact large OpenClaw, MCP, and client tool catalogs. Set to true for the default code bridge or use the object form to choose structured controls or a compact visible tool directory."},"codeMode":{"anyOf":[{"type":"boolean"},{"type":"string","const":"auto"},{"type":"object","properties":{"enabled":{"anyOf":[{"type":"boolean"},{"type":"string","const":"auto"}],"title":"Enable Code Mode","description":"Global OpenClaw Code Mode default. Off when omitted, including objects without `enabled`. `\"auto\"` engages catalog-preferred models; `true` engages tool-capable runs. Agent and model activation overrides take precedence. An engaged run fails closed if the runtime is unavailable instead of exposing the full tool list."},"runtime":{"type":"string","const":"quickjs-wasi","title":"Code Mode Runtime","description":"Guest JavaScript runtime. Only \"quickjs-wasi\" is supported."},"mode":{"type":"string","const":"only","title":"Code Mode Surface","description":"Model-facing surface. Only \"only\" is supported: expose code-mode `exec` and `wait` and hide normal tools."},"languages":{"type":"array","items":{"type":"string","enum":["javascript","typescript"]},"title":"Code Mode Languages","description":"Accepted source languages for `exec`. Supported values are \"javascript\" and \"typescript\"."},"timeoutMs":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"title":"Code Mode Timeout","description":"Maximum milliseconds for one code-mode `exec` or `wait` call."},"memoryLimitBytes":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"title":"Code Mode Memory Limit","description":"QuickJS heap limit for one code-mode VM."},"maxOutputBytes":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"title":"Code Mode Output Limit","description":"Maximum serialized bytes returned through code-mode output."},"maxSnapshotBytes":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"title":"Code Mode Snapshot Limit","description":"Maximum serialized bytes retained for one suspended QuickJS snapshot."},"maxPendingToolCalls":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"title":"Code Mode Pending Tool Limit","description":"Maximum concurrent nested tool calls a code-mode VM can start before it must resume later."},"snapshotTtlSeconds":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"title":"Code Mode Snapshot TTL","description":"How long suspended code-mode snapshots can be resumed with `wait` before they expire."},"searchDefaultLimit":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"title":"Code Mode Default Search Results","description":"Default number of hidden catalog search results returned by `catalog.search` inside code mode."},"maxSearchLimit":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"title":"Code Mode Max Search Results","description":"Maximum number of hidden catalog search results a code-mode program can request."}},"additionalProperties":false}],"title":"Code Mode","description":"Generic OpenClaw code mode. When enabled, agent runs expose only `exec` and `wait` to the model and hide normal tools behind a QuickJS-WASI catalog bridge."},"swarm":{"anyOf":[{"type":"boolean"},{"type":"object","properties":{"enabled":{"type":"boolean","title":"Enable Swarm","description":"Enables collector-mode subagents and agents_wait. Default is off."},"maxConcurrent":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"title":"Swarm Concurrent Children","description":"Maximum concurrently running collector children per swarm group."},"maxChildrenPerGroup":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"title":"Swarm Live Children per Group","description":"Maximum live collector children per swarm group."},"maxTotalPerGroup":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"title":"Swarm Total Children per Group","description":"Maximum lifetime collector spawns per swarm group."},"waitTimeoutSecondsMax":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"title":"Swarm Maximum Wait Timeout","description":"Maximum timeout accepted by agents_wait, in seconds."},"defaultAgentId":{"type":"string","title":"Swarm Default Agent","description":"Default target agent for swarm spawns that omit agentId. The subagent allowlist still applies."}},"additionalProperties":false}],"title":"Swarm","description":"Collector-mode subagent orchestration. Default is off; enable it to expose agents_wait and swarm spawn options."},"message":{"type":"object","properties":{"crossContext":{"type":"object","properties":{"allowWithinProvider":{"type":"boolean","title":"Allow Cross-Context (Same Provider)","description":"Allow sends to other channels within the same provider (default: true)."},"allowAcrossProviders":{"type":"boolean","title":"Allow Cross-Context (Across Providers)","description":"Allow sends across different providers (default: false)."},"marker":{"type":"object","properties":{"enabled":{"type":"boolean","title":"Cross-Context Marker","description":"Add a visible origin marker when sending cross-context (default: true)."},"prefix":{"type":"string","title":"Cross-Context Marker Prefix","description":"Text prefix for cross-context markers (supports \"{channel}\")."},"suffix":{"type":"string","title":"Cross-Context Marker Suffix","description":"Text suffix for cross-context markers (supports \"{channel}\")."}},"additionalProperties":false}},"additionalProperties":false},"actions":{"type":"object","properties":{"allow":{"type":"array","items":{"type":"string"},"title":"Message Action Allowlist","description":"Global message action allowlist for the message tool. Use only when the whole runtime should expose and accept a reduced action set; prefer per-agent allowlists for public or sandboxed agents."}},"additionalProperties":false},"broadcast":{"type":"object","properties":{"enabled":{"type":"boolean","title":"Enable Message Broadcast","description":"Enable broadcast action (default: true)."}},"additionalProperties":false}},"additionalProperties":false},"agentToAgent":{"type":"object","properties":{"enabled":{"type":"boolean","title":"Enable Agent-to-Agent Tool","description":"Enables the agent_to_agent tool surface so one agent can invoke another agent at runtime. Keep off in simple deployments and enable only when orchestration value outweighs complexity."},"allow":{"type":"array","items":{"type":"string"},"title":"Agent-to-Agent Target Allowlist","description":"Allowlist of target agent IDs permitted for agent_to_agent calls when orchestration is enabled. Use explicit allowlists to avoid uncontrolled cross-agent call graphs."}},"additionalProperties":false,"title":"Agent-to-Agent Tool Access","description":"Policy for allowing agent-to-agent tool calls and constraining which target agents can be reached. Keep disabled or tightly scoped unless cross-agent orchestration is intentionally enabled."},"elevated":{"type":"object","properties":{"enabled":{"type":"boolean","title":"Enable Elevated Tool Access","description":"Enables elevated tool execution path when sender and policy checks pass. Keep disabled in public/shared channels and enable only for trusted owner-operated contexts."},"allowFrom":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"title":"Elevated Tool Allow Rules","description":"Sender allow rules for elevated tools, usually keyed by channel/provider identity formats. Use narrow, explicit identities so elevated commands cannot be triggered by unintended users."}},"additionalProperties":false,"title":"Elevated Tool Access","description":"Elevated tool access controls for privileged command surfaces that should only be reachable from trusted senders. Keep disabled unless operator workflows explicitly require elevated actions."},"exec":{"type":"object","properties":{"host":{"type":"string","enum":["auto","sandbox","gateway","node"],"title":"Exec Target","description":"Selects execution target strategy for shell commands. Use \"auto\" for runtime-aware behavior (sandbox when available, otherwise gateway), or pin sandbox/gateway/node explicitly when you need a fixed surface."},"mode":{"type":"string","enum":["deny","allowlist","ask","auto","full"],"title":"Exec Mode","description":"Normalized exec policy selector. Use \"auto\" for classifier-reviewed approval misses, \"ask\" for human-reviewed misses, \"allowlist\" for deterministic safe commands only, or \"full\" for trusted local operation."},"security":{"type":"string","enum":["deny","allowlist","full"],"title":"Exec Security"},"ask":{"type":"string","enum":["off","on-miss","always"],"title":"Exec Ask"},"node":{"type":"string","title":"Exec Node Binding","description":"Node binding configuration for exec tooling when command execution is delegated through connected nodes. Use explicit node binding only when multi-node routing is required."},"pathPrepend":{"type":"array","items":{"type":"string"},"title":"Exec PATH Prepend","description":"Directories to prepend to PATH for exec runs (gateway/sandbox)."},"safeBins":{"type":"array","items":{"type":"string"},"title":"Exec Safe Bins","description":"Allow stdin-only safe binaries to run without explicit allowlist entries."},"strictInlineEval":{"type":"boolean","title":"Require Inline-Eval Approval","description":"Require explicit approval for interpreter inline-eval forms such as `python -c`, `node -e`, `ruby -e`, or `osascript -e`. Prevents silent allowlist reuse and downgrades allow-always to ask-each-time for those forms."},"commandHighlighting":{"type":"boolean","title":"Exec Command Highlighting","description":"Show parser-derived command highlights in exec approval prompts (default: false). Enable this to render highlighted command text without changing exec approval policy."},"grantExpiryDays":{"type":"integer","minimum":1,"maximum":3650,"title":"Standing Grant Expiry (Days)","description":"Default lifetime, in days (1-3650), for standing grants minted by allow-always on automation approvals. Unset keeps grants valid until revoked or the owning automation changes. Terms freeze at mint, so changing this affects only future grants."},"safeBinTrustedDirs":{"type":"array","items":{"type":"string"},"title":"Exec Safe Bin Trusted Dirs","description":"Additional explicit directories trusted for safe-bin path checks (PATH entries are never auto-trusted)."},"safeBinProfiles":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"minPositional":{"type":"integer","minimum":0,"maximum":9007199254740991},"maxPositional":{"type":"integer","minimum":0,"maximum":9007199254740991},"allowedValueFlags":{"type":"array","items":{"type":"string"}},"deniedFlags":{"type":"array","items":{"type":"string"}}},"additionalProperties":false},"title":"Exec Safe Bin Profiles","description":"Optional per-binary safe-bin profiles (positional limits + allowed/denied flags)."},"reviewer":{"type":"object","properties":{"model":{"anyOf":[{"type":"string"},{"type":"object","properties":{"primary":{"type":"string"},"fallbacks":{"type":"array","items":{"type":"string"}}},"additionalProperties":false}],"title":"Exec Reviewer Model","description":"Optional provider/model override for the exec reviewer agent. Omit to reuse the configured primary model for the target agent."},"timeoutMs":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"title":"Exec Reviewer Timeout (ms)","description":"Per-stage exec reviewer timeout in milliseconds for model preparation and completion before falling back to human approval (default: 30000)."}},"additionalProperties":false,"title":"Exec Reviewer","description":"Model-backed exec reviewer used by auto mode before human approval fallback. Configure a narrow model override here when you want exec review isolated from the main agent model."},"backgroundMs":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"approvalRunningNoticeMs":{"type":"integer","minimum":0,"maximum":9007199254740991,"title":"Exec Approval Running Notice (ms)","description":"Delay in milliseconds before showing an in-progress notice after an exec approval is granted. Increase to reduce flicker for fast commands, or lower for quicker operator feedback."},"timeoutSeconds":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"title":"Exec Timeout (Seconds)"},"cleanupMs":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"notifyOnExit":{"type":"boolean","title":"Exec Notify On Exit","description":"When true (default), backgrounded exec sessions on exit and node exec lifecycle events enqueue a system event and request a heartbeat."},"notifyOnExitEmptySuccess":{"type":"boolean","title":"Exec Notify On Empty Success","description":"When true, successful backgrounded exec exits with empty output still enqueue a completion system event (default: false)."},"applyPatch":{"type":"object","properties":{"enabled":{"type":"boolean","title":"Enable apply_patch","description":"Enable or disable apply_patch for OpenAI and OpenAI Codex models when allowed by tool policy (default: true)."},"workspaceOnly":{"type":"boolean","title":"apply_patch Workspace-Only","description":"Restrict apply_patch paths to the workspace directory (default: true). Set false to allow writing outside the workspace (dangerous)."},"allowModels":{"type":"array","items":{"type":"string"},"title":"apply_patch Model Allowlist","description":"Optional allowlist of model ids (e.g. \"gpt-5.4\" or \"openai/gpt-5.4\")."}},"additionalProperties":false}},"additionalProperties":false,"title":"Exec Tool","description":"Exec-tool policy grouping for shell execution host, security mode, approval behavior, and runtime bindings. Keep conservative defaults in production and tighten elevated execution paths."},"fs":{"type":"object","properties":{"workspaceOnly":{"type":"boolean","title":"Workspace-only FS tools","description":"Restrict filesystem tools (read/write/edit/apply_patch) to the workspace directory (default: 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,"title":"Subagent Tool Allow/Deny Policy","description":"Allow/deny tool policy applied to spawned subagent runtimes for per-subagent hardening. Keep this narrower than parent scope when subagents run semi-autonomous workflows."}},"additionalProperties":false,"title":"Subagent Tool Policy","description":"Tool policy wrapper for spawned subagents to restrict or expand tool availability compared to parent defaults. Use this to keep delegated agent capabilities scoped to task intent."},"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,"title":"Sandbox Tool Allow/Deny Policy","description":"Allow/deny tool policy applied when agents run in sandboxed execution environments. Keep policies minimal so sandbox tasks cannot escalate into unnecessary external actions."}},"additionalProperties":false,"title":"Sandbox Tool Policy","description":"Tool policy wrapper for sandboxed agent executions so sandbox runs can have distinct capability boundaries. Use this to enforce stronger safety in sandbox contexts."},"sessions_spawn":{"type":"object","properties":{"attachments":{"type":"object","properties":{"enabled":{"type":"boolean"},"maxTotalBytes":{"type":"number"},"maxFiles":{"type":"number"},"maxFileBytes":{"type":"number"},"retainOnSessionKeep":{"type":"boolean"}},"additionalProperties":false}},"additionalProperties":false},"updatePlan":{"type":"boolean","title":"Enable Structured Plan Tool","description":"Unified `progress_card` status tool for durable plans and narrative notes. Enabled by default; set false to opt out."}},"additionalProperties":false,"title":"Tools","description":"Tool infrastructure and cross-agent defaults. Root siblings own infrastructure and cross-agent defaults; agents.defaults owns agent-loop behavior; agent entries may override either where supported."},"security":{"type":"object","properties":{"audit":{"type":"object","properties":{"suppressions":{"type":"array","items":{"type":"object","properties":{"checkId":{"type":"string","minLength":1},"titleIncludes":{"type":"string","minLength":1},"detailIncludes":{"type":"string","minLength":1},"reason":{"type":"string","minLength":1}},"required":["checkId"],"additionalProperties":false}}},"additionalProperties":false},"installPolicy":{"type":"object","properties":{"enabled":{"type":"boolean"},"targets":{"minItems":1,"type":"array","items":{"anyOf":[{"type":"string","const":"skill"},{"type":"string","const":"plugin"}]}},"exec":{"type":"object","properties":{"source":{"type":"string","const":"exec"},"command":{"type":"string","minLength":1},"args":{"type":"array","items":{"type":"string"}},"timeoutMs":{"type":"integer","minimum":1,"maximum":9007199254740991},"noOutputTimeoutMs":{"type":"integer","minimum":1,"maximum":9007199254740991},"maxOutputBytes":{"type":"integer","minimum":1,"maximum":9007199254740991},"env":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"}},"passEnv":{"type":"array","items":{"type":"string"}},"trustedDirs":{"type":"array","items":{"type":"string"}}},"required":["source","command"],"additionalProperties":false}},"additionalProperties":false}},"additionalProperties":false},"bindings":{"type":"array","items":{"anyOf":[{"type":"object","properties":{"type":{"type":"string","const":"route","title":"Binding Type","description":"Binding kind. Use \"route\" (or omit for legacy route entries) for normal routing, and \"acp\" for persistent ACP conversation bindings."},"agentId":{"type":"string","title":"Binding Agent ID","description":"Target agent ID that receives traffic when the corresponding binding match rule is satisfied. Use valid configured agent IDs only so routing does not fail at runtime."},"comment":{"type":"string"},"match":{"type":"object","properties":{"channel":{"type":"string","title":"Binding Channel","description":"Channel/provider identifier this binding applies to, such as `telegram`, `discord`, or a plugin channel ID. Use the configured channel key exactly so binding evaluation works reliably."},"accountId":{"type":"string","title":"Binding Account ID","description":"Optional account selector for multi-account channel setups so the binding applies only to one identity. Use this when account scoping is required for the route and leave unset otherwise."},"peer":{"type":"object","properties":{"kind":{"anyOf":[{"type":"string","const":"direct"},{"type":"string","const":"group"},{"type":"string","const":"channel"}],"title":"Binding Peer Kind","description":"Peer conversation type: \"direct\", \"group\", \"channel\", or legacy \"dm\" (deprecated alias for direct). Prefer \"direct\" for new configs and keep kind aligned with channel semantics."},"id":{"type":"string","title":"Binding Peer ID","description":"Conversation identifier used with peer matching, such as a chat ID, channel ID, or group ID from the provider. Keep this exact to avoid silent non-matches."}},"required":["kind","id"],"additionalProperties":false,"title":"Binding Peer Match","description":"Optional peer matcher for specific conversations including peer kind and peer id. Use this when only one direct/group/channel target should be pinned to an agent."},"guildId":{"type":"string","title":"Binding Guild ID","description":"Optional Discord-style guild/server ID constraint for binding evaluation in multi-server deployments. Use this when the same peer identifiers can appear across different guilds."},"teamId":{"type":"string","title":"Binding Team ID","description":"Optional team/workspace ID constraint used by providers that scope chats under teams. Add this when you need bindings isolated to one workspace context."},"roles":{"type":"array","items":{"type":"string"},"title":"Binding Roles","description":"Optional role-based filter list used by providers that attach roles to chat context. Use this to route privileged or operational role traffic to specialized agents."}},"required":["channel"],"additionalProperties":false,"title":"Binding Match Rule","description":"Match rule object for deciding when a binding applies, including channel and optional account/peer constraints. Keep rules narrow to avoid accidental agent takeover across contexts."},"session":{"type":"object","properties":{"dmScope":{"type":"string","enum":["main","per-peer","per-channel-peer","per-account-channel-peer"],"title":"Binding Session DM Scope","description":"Optional DM session scope override for this route binding. For example, keep global session.dmScope=\"main\" while using \"per-account-channel-peer\" for selected direct peers."},"groupScope":{"type":"string","enum":["main","per-group"],"title":"Binding Session Group Scope","description":"Optional group/channel session scope override for this route binding. \"per-group\" keeps matched rooms separate and ambiently watched by the agent main session regardless of dmScope; \"main\" merges their context into main and needs no watch."}},"additionalProperties":false,"title":"Binding Session","description":"Optional route session overrides for conversations matched by this binding. Use this when a narrow route should keep the same agent but isolate session continuity differently."}},"required":["agentId","match"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","const":"acp","title":"Binding Type","description":"Binding kind. Use \"route\" (or omit for legacy route entries) for normal routing, and \"acp\" for persistent ACP conversation bindings."},"agentId":{"type":"string","title":"Binding Agent ID","description":"Target agent ID that receives traffic when the corresponding binding match rule is satisfied. Use valid configured agent IDs only so routing does not fail at runtime."},"comment":{"type":"string"},"match":{"type":"object","properties":{"channel":{"type":"string","title":"Binding Channel","description":"Channel/provider identifier this binding applies to, such as `telegram`, `discord`, or a plugin channel ID. Use the configured channel key exactly so binding evaluation works reliably."},"accountId":{"type":"string","title":"Binding Account ID","description":"Optional account selector for multi-account channel setups so the binding applies only to one identity. Use this when account scoping is required for the route and leave unset otherwise."},"peer":{"type":"object","properties":{"kind":{"anyOf":[{"type":"string","const":"direct"},{"type":"string","const":"group"},{"type":"string","const":"channel"}],"title":"Binding Peer Kind","description":"Peer conversation type: \"direct\", \"group\", \"channel\", or legacy \"dm\" (deprecated alias for direct). Prefer \"direct\" for new configs and keep kind aligned with channel semantics."},"id":{"type":"string","title":"Binding Peer ID","description":"Conversation identifier used with peer matching, such as a chat ID, channel ID, or group ID from the provider. Keep this exact to avoid silent non-matches."}},"required":["kind","id"],"additionalProperties":false,"title":"Binding Peer Match","description":"Optional peer matcher for specific conversations including peer kind and peer id. Use this when only one direct/group/channel target should be pinned to an agent."},"guildId":{"type":"string","title":"Binding Guild ID","description":"Optional Discord-style guild/server ID constraint for binding evaluation in multi-server deployments. Use this when the same peer identifiers can appear across different guilds."},"teamId":{"type":"string","title":"Binding Team ID","description":"Optional team/workspace ID constraint used by providers that scope chats under teams. Add this when you need bindings isolated to one workspace context."},"roles":{"type":"array","items":{"type":"string"},"title":"Binding Roles","description":"Optional role-based filter list used by providers that attach roles to chat context. Use this to route privileged or operational role traffic to specialized agents."}},"required":["channel"],"additionalProperties":false,"title":"Binding Match Rule","description":"Match rule object for deciding when a binding applies, including channel and optional account/peer constraints. Keep rules narrow to avoid accidental agent takeover across contexts."},"acp":{"type":"object","properties":{"mode":{"type":"string","enum":["persistent","oneshot"],"title":"ACP Binding Mode","description":"ACP session mode override for this binding (persistent or oneshot)."},"label":{"type":"string","title":"ACP Binding Label","description":"Human-friendly label for ACP status/diagnostics in this bound conversation."},"cwd":{"type":"string","title":"ACP Binding Working Directory","description":"Working directory override for ACP sessions created from this binding."},"backend":{"type":"string","title":"ACP Binding Backend","description":"ACP backend override for this binding (falls back to agent runtime ACP backend, then global acp.backend)."}},"additionalProperties":false,"title":"ACP Binding Overrides","description":"Optional per-binding ACP overrides for bindings[].type=acp. This layer overrides agents.entries.*.runtime.acp defaults for the matched conversation."}},"required":["type","agentId","match"],"additionalProperties":false}]},"title":"Bindings","description":"Top-level binding rules for routing and persistent ACP conversation ownership. Use type=route for normal routing and type=acp for persistent ACP harness bindings."},"broadcast":{"type":"object","properties":{"strategy":{"type":"string","enum":["parallel","sequential"],"title":"Broadcast Strategy","description":"Delivery order for broadcast fan-out: \"parallel\" sends to all targets concurrently, while \"sequential\" sends one-by-one. Use \"parallel\" for speed and \"sequential\" for stricter ordering/backpressure control."}},"additionalProperties":{"type":"array","items":{"type":"string"},"title":"Broadcast Destination List","description":"Per-source broadcast destination list where each key is a source peer ID and the value is an array of destination peer IDs. Keep lists intentional to avoid accidental message amplification."},"title":"Broadcast","description":"Broadcast routing map for sending the same outbound message to multiple peer IDs per source conversation. Keep this minimal and audited because one source can fan out to many destinations."},"attachments":{"type":"object","properties":{"ttlHours":{"type":"integer","minimum":1,"maximum":168,"title":"Attachment Retention TTL (hours)","description":"Optional retention window in hours for persisted media handled by the general mtime sweep. Leave unset to disable that sweep, or set values like 24 (1 day) or 168 (7 days) to periodically remove older staged media. Managed outgoing media (chat-generated attachments) is excluded and follows its own SQLite- and transcript-aware retention."}},"additionalProperties":false,"title":"Attachments","description":"Top-level retention behavior shared across providers and tools that persist media. Use ttlHours when general staged media needs bounded cleanup."},"messages":{"type":"object","properties":{"visibleReplies":{"anyOf":[{"type":"string","enum":["automatic","message_tool"]},{"type":"boolean"}],"title":"Visible Replies","description":"Controls model-authored source replies across direct, group, and channel conversations. \"message_tool\" requires message(action=send) for normal assistant output and generic tool media; explicitly host-owned runtime output remains deliverable except for ambient room events. \"automatic\" posts normal replies as before."},"responsePrefix":{"type":"string","title":"Outbound Response Prefix"},"usageTemplate":{"anyOf":[{"type":"string"},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}],"title":"Usage Footer Template","description":"Custom /usage full footer template, either an inline object or a JSON file path. Invalid or unavailable templates fall back to the built-in usage line."},"responseUsage":{"anyOf":[{"type":"string","enum":["on","off","tokens","full"]},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string","enum":["on","off","tokens","full"]}}],"title":"Default Usage Footer Mode","description":"Default per-reply usage footer mode (\"off\"|\"tokens\"|\"full\") seeded into sessions that have not chosen one via /usage. Also accepts \"on\" as a legacy alias for \"tokens\". Accepts a bare mode or a per-channel map with a \"default\" fallback. Precedence: session value -> channel entry -> default -> off; an explicit /usage choice (including off) is persisted and overrides the default. Use /usage reset (aliases: inherit, clear, default) to clear a session override and re-inherit this configured default."},"groupChat":{"type":"object","properties":{"mentionPatterns":{"type":"array","items":{"type":"string"},"title":"Group Mention Patterns","description":"Safe case-insensitive regex patterns used to detect explicit mentions/trigger phrases in group chats. Use precise patterns to reduce false positives in high-volume channels; invalid or unsafe nested-repetition patterns are ignored."},"historyLimit":{"type":"integer","minimum":0,"maximum":9007199254740991,"title":"Group History Limit","description":"Maximum number of prior group messages loaded as context per turn for group sessions. Use higher values for richer continuity, or lower values for faster and cheaper responses."},"unmentionedInbound":{"type":"string","enum":["user_request","room_event"],"title":"Group Unmentioned Inbound","description":"Controls how unmentioned always-on group chatter is submitted. \"user_request\" treats it as a user request; \"room_event\" submits it as quiet context where visible output requires the message tool."},"visibleReplies":{"anyOf":[{"type":"string","enum":["automatic","message_tool"]},{"type":"boolean"}],"title":"Group Visible Replies","description":"Overrides model-authored source replies for group/channel conversations. Defaults to \"automatic\" when no global visible reply policy is set. \"message_tool\" requires message(action=send) for normal assistant output and generic tool media; explicitly host-owned runtime output remains deliverable except for ambient room events. \"automatic\" posts normal replies as before."}},"additionalProperties":false,"title":"Group Chat Rules","description":"Group-message handling controls including mention triggers and history window sizing. Keep mention patterns narrow so group channels do not trigger on every message."},"queue":{"type":"object","properties":{"mode":{"anyOf":[{"type":"string","const":"steer"},{"type":"string","const":"followup"},{"type":"string","const":"collect"},{"type":"string","const":"interrupt"}],"title":"Queue Mode","description":"Queue mode for active runs. Use \"steer\" to inject prompts into the active run, \"followup\" to run later, \"collect\" to batch compatible messages later, or \"interrupt\" to abort the active run before starting the newest prompt."},"byChannel":{"type":"object","properties":{"whatsapp":{"anyOf":[{"type":"string","const":"steer"},{"type":"string","const":"followup"},{"type":"string","const":"collect"},{"type":"string","const":"interrupt"}]},"telegram":{"anyOf":[{"type":"string","const":"steer"},{"type":"string","const":"followup"},{"type":"string","const":"collect"},{"type":"string","const":"interrupt"}]},"discord":{"anyOf":[{"type":"string","const":"steer"},{"type":"string","const":"followup"},{"type":"string","const":"collect"},{"type":"string","const":"interrupt"}]},"irc":{"anyOf":[{"type":"string","const":"steer"},{"type":"string","const":"followup"},{"type":"string","const":"collect"},{"type":"string","const":"interrupt"}]},"googlechat":{"anyOf":[{"type":"string","const":"steer"},{"type":"string","const":"followup"},{"type":"string","const":"collect"},{"type":"string","const":"interrupt"}]},"slack":{"anyOf":[{"type":"string","const":"steer"},{"type":"string","const":"followup"},{"type":"string","const":"collect"},{"type":"string","const":"interrupt"}]},"mattermost":{"anyOf":[{"type":"string","const":"steer"},{"type":"string","const":"followup"},{"type":"string","const":"collect"},{"type":"string","const":"interrupt"}]},"signal":{"anyOf":[{"type":"string","const":"steer"},{"type":"string","const":"followup"},{"type":"string","const":"collect"},{"type":"string","const":"interrupt"}]},"imessage":{"anyOf":[{"type":"string","const":"steer"},{"type":"string","const":"followup"},{"type":"string","const":"collect"},{"type":"string","const":"interrupt"}]},"msteams":{"anyOf":[{"type":"string","const":"steer"},{"type":"string","const":"followup"},{"type":"string","const":"collect"},{"type":"string","const":"interrupt"}]},"webchat":{"anyOf":[{"type":"string","const":"steer"},{"type":"string","const":"followup"},{"type":"string","const":"collect"},{"type":"string","const":"interrupt"}]},"matrix":{"anyOf":[{"type":"string","const":"steer"},{"type":"string","const":"followup"},{"type":"string","const":"collect"},{"type":"string","const":"interrupt"}]}},"additionalProperties":false,"title":"Queue Mode by Channel","description":"Per-channel queue mode overrides keyed by provider id (for example telegram, discord, slack). Use this when one channel's traffic pattern needs different behavior than global defaults."},"debounceMsByChannel":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"integer","minimum":0,"maximum":9007199254740991},"title":"Queue Fallback Debounce by Channel (ms)","description":"Per-channel debounce overrides for queue behavior keyed by provider id. Use this to tune burst handling independently for chat surfaces with different pacing."},"cap":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"title":"Queue Capacity","description":"Maximum number of queued inbound items retained before drop policy applies. Default is 20; keep caps bounded in noisy channels so memory usage remains predictable."},"drop":{"anyOf":[{"type":"string","const":"old"},{"type":"string","const":"new"},{"type":"string","const":"summarize"}],"title":"Queue Drop Strategy","description":"Drop strategy when queue cap is exceeded. \"summarize\" drops oldest entries but preserves compact summaries; \"old\" drops oldest without summaries; \"new\" rejects the newest item. Use \"summarize\" for long-running chats where context matters."}},"additionalProperties":false,"title":"Inbound Queue","description":"Queue strategy for inbound messages that arrive while a session run is active. Use this to tune steering, deferred followups, batching, or interruption."},"inbound":{"type":"object","properties":{"debounceMs":{"type":"integer","minimum":0,"maximum":9007199254740991,"title":"Inbound Message Debounce (ms)","description":"Debounce window (ms) for batching rapid inbound messages from the same sender (0 to disable)."},"byChannel":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"integer","minimum":0,"maximum":9007199254740991},"title":"Inbound Debounce by Channel (ms)","description":"Per-channel inbound debounce overrides keyed by provider id in milliseconds. Use this where some providers send message fragments more aggressively than others."}},"additionalProperties":false,"title":"Inbound Debounce","description":"Direct inbound debounce settings used before queue/turn processing starts. Configure this for provider-specific rapid message bursts from the same sender."},"ackReaction":{"type":"string","title":"Ack Reaction Emoji","description":"Emoji reaction used to acknowledge inbound messages (empty disables)."},"ackReactionScope":{"type":"string","enum":["group-mentions","group-all","direct","all","off","none"],"title":"Ack Reaction Scope","description":"When to send ack reactions (\"group-mentions\", \"group-all\", \"direct\", \"all\", \"off\", \"none\"). \"group-mentions\" acks group messages that mention the agent, whether or not the group requires mentions; \"group-all\" acks every group message. \"off\"/\"none\" disables ack reactions entirely."},"statusReactions":{"type":"object","properties":{"enabled":{"type":"boolean","title":"Enable Status Reactions","description":"Enable lifecycle status reactions on supported channels. Discord treats unset as enabled when ack reactions are active; Slack, Signal, Telegram, and WhatsApp require this to be true before lifecycle reactions are used. Slack uses native assistant thread status for progress by default."}},"additionalProperties":false,"title":"Status Reactions","description":"Lifecycle status reactions that update the emoji on the trigger message as the agent progresses (queued → thinking → tool → done/error)."},"suppressToolErrors":{"type":"boolean","title":"Suppress Tool Error Warnings","description":"When true, suppress ⚠️ tool-error warnings from being shown to the user. The agent already sees errors in context and can retry. Default: false."}},"additionalProperties":false,"title":"Messages","description":"Message infrastructure and cross-agent defaults. Root siblings own infrastructure and cross-agent defaults; agents.defaults owns agent-loop behavior; agent entries may override either where supported."},"tts":{"type":"object","properties":{"auto":{"type":"string","enum":["off","always","inbound","tagged"]},"enabled":{"type":"boolean"},"mode":{"type":"string","enum":["final","all"]},"provider":{"type":"string","minLength":1},"persona":{"type":"string","title":"TTS Persona","description":"Default TTS persona id. Local TTS persona preferences can override this per host."},"personas":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"label":{"type":"string"},"description":{"type":"string"},"provider":{"type":"string","minLength":1},"fallbackPolicy":{"anyOf":[{"type":"string","const":"preserve-persona"},{"type":"string","const":"provider-defaults"},{"type":"string","const":"fail"}]},"providers":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"apiKey":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"store"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false}]}]}},"additionalProperties":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"},{"type":"array","items":{}},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}]}},"title":"TTS Persona Provider Bindings","description":"Provider-specific TTS persona bindings keyed by speech provider id. These merge over tts.providers for the active persona."}},"additionalProperties":false,"title":"TTS Persona","description":"One TTS persona. Use provider-specific bindings for exact voices/models and prompt templates."},"title":"TTS Personas","description":"Named TTS personas that define stable spoken identity plus provider-specific speech bindings."},"summaryModel":{"type":"string"},"modelOverrides":{"type":"object","properties":{"enabled":{"type":"boolean"},"allowText":{"type":"boolean"},"allowProvider":{"type":"boolean"},"allowVoice":{"type":"boolean"},"allowModelId":{"type":"boolean"},"allowVoiceSettings":{"type":"boolean"},"allowNormalization":{"type":"boolean"},"allowSeed":{"type":"boolean"}},"additionalProperties":false},"providers":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"apiKey":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"store"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false}]}],"title":"TTS Provider API Key","description":"Provider API key used by that speech provider when its plugin requires authenticated TTS access."}},"additionalProperties":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"},{"type":"array","items":{}},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}]},"title":"TTS Provider Config","description":"Provider-specific TTS configuration for one speech provider id. Keep fields scoped to the plugin that owns that provider."},"title":"TTS Provider Settings","description":"Provider-specific TTS settings keyed by speech provider id. Use this instead of bundled provider-specific top-level keys so speech plugins stay decoupled from core config schema."},"maxTextLength":{"type":"integer","minimum":1,"maximum":9007199254740991},"timeoutMs":{"type":"integer","minimum":1000,"maximum":120000}},"additionalProperties":false,"title":"Text-to-Speech","description":"Text-to-speech policy for reading agent replies aloud on supported voice or audio surfaces. Keep disabled unless voice playback is part of your operator/user workflow."},"commands":{"default":{"native":"auto","nativeSkills":"auto","restart":true},"type":"object","properties":{"native":{"default":"auto","anyOf":[{"type":"boolean"},{"type":"string","const":"auto"}],"title":"Native Commands","description":"Registers native slash/menu commands with channels that support command registration (Discord, Slack, Telegram). Keep enabled for discoverability unless you intentionally run text-only command workflows."},"nativeSkills":{"default":"auto","anyOf":[{"type":"boolean"},{"type":"string","const":"auto"}],"title":"Native Skill Commands","description":"Registers native skill commands so users can invoke skills directly from provider command menus where supported. Keep aligned with your skill policy so exposed commands match what operators expect."},"text":{"type":"boolean","title":"Text Commands","description":"Enables text-command parsing in chat input in addition to native command surfaces where available. Keep this enabled for compatibility across channels that do not support native command registration."},"bash":{"type":"boolean","title":"Allow Bash Chat Command","description":"Allow bash chat command (`!`; `/bash` alias) to run host shell commands (default: false; requires tools.elevated)."},"bashForegroundMs":{"type":"integer","minimum":0,"maximum":30000,"title":"Bash Foreground Window (ms)","description":"How long bash waits before backgrounding (default: 2000; 0 backgrounds immediately)."},"config":{"type":"boolean","title":"Allow /config","description":"Allow /config chat command to read/write config on disk (default: false)."},"mcp":{"type":"boolean","title":"Allow /mcp","description":"Allow /mcp chat command to manage OpenClaw MCP server config under mcp.servers (default: false)."},"plugins":{"type":"boolean","title":"Allow /plugins","description":"Allow /plugins chat command to list discovered plugins and toggle plugin enablement in config (default: false)."},"debug":{"type":"boolean","title":"Allow /debug","description":"Allow /debug chat command for runtime-only overrides (default: false)."},"restart":{"default":true,"type":"boolean","title":"Allow Restart","description":"Allow /restart and external SIGUSR1 restart requests (default: true)."},"ownerAllowFrom":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]},"title":"Command Owners","description":"Explicit owner allowlist for owner-scoped commands. Use channel-native IDs (optionally prefixed like \"whatsapp:+15551234567\"). '*' is ignored."},"allowFrom":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"title":"Command Elevated Access Rules","description":"Defines elevated command allow rules by channel and sender for owner-level command surfaces. Use narrow provider-specific identities so privileged commands are not exposed to broad chat audiences."}},"additionalProperties":false,"title":"Commands","description":"Controls chat command surfaces, owner gating, and elevated command access behavior across providers. Keep defaults unless you need stricter operator controls or broader command availability."},"approvals":{"type":"object","properties":{"exec":{"type":"object","properties":{"enabled":{"type":"boolean","title":"Forward Exec Approvals","description":"Enables forwarding of exec approval requests to configured delivery destinations (default: false). Keep disabled in low-risk setups and enable only when human approval responders need channel-visible prompts."},"mode":{"anyOf":[{"type":"string","const":"session"},{"type":"string","const":"targets"},{"type":"string","const":"both"}],"title":"Approval Forwarding Mode","description":"Controls where approval prompts are sent: \"session\" uses origin chat, \"targets\" uses configured targets, and \"both\" sends to both paths. Use \"session\" as baseline and expand only when operational workflow requires redundancy."},"agentFilter":{"type":"array","items":{"type":"string"},"title":"Approval Agent Filter","description":"Optional allowlist of agent IDs eligible for forwarded approvals, for example `[\"primary\", \"ops-agent\"]`. Use this to limit forwarding blast radius and avoid notifying channels for unrelated agents."},"sessionFilter":{"type":"array","items":{"type":"string"},"title":"Approval Session Filter","description":"Optional session-key filters matched as substring or regex-style patterns, for example `[\"discord:\", \"^agent:ops:\"]`. Use narrow patterns so only intended approval contexts are forwarded to shared destinations."},"targets":{"type":"array","items":{"type":"object","properties":{"channel":{"type":"string","minLength":1,"title":"Approval Target Channel","description":"Channel/provider ID used for forwarded approval delivery, such as discord, slack, or a plugin channel id. Use valid channel IDs only so approvals do not silently fail due to unknown routes."},"to":{"type":"string","minLength":1,"title":"Approval Target Destination","description":"Destination identifier inside the target channel (channel ID, user ID, or thread root depending on provider). Verify semantics per provider because destination format differs across channel integrations."},"accountId":{"type":"string","title":"Approval Target Account ID","description":"Optional account selector for multi-account channel setups when approvals must route through a specific account context. Use this only when the target channel has multiple configured identities."},"threadId":{"anyOf":[{"type":"string"},{"type":"number"}],"title":"Approval Target Thread ID","description":"Optional thread/topic target for channels that support threaded delivery of forwarded approvals. Use this to keep approval traffic contained in operational threads instead of main channels."}},"required":["channel","to"],"additionalProperties":false},"title":"Approval Forwarding Targets","description":"Explicit delivery targets used when forwarding mode includes targets, each with channel and destination details. Keep target lists least-privilege and validate each destination before enabling broad forwarding."}},"additionalProperties":false,"title":"Exec Approval Forwarding","description":"Groups exec-approval forwarding behavior including enablement, routing mode, filters, and explicit targets. Configure here when approval prompts must reach operational channels instead of only the origin thread."},"plugin":{"type":"object","properties":{"enabled":{"type":"boolean","title":"Forward Plugin Approvals","description":"Enables forwarding of plugin approval requests to configured delivery destinations (default: false). Independent of approvals.exec.enabled."},"mode":{"anyOf":[{"type":"string","const":"session"},{"type":"string","const":"targets"},{"type":"string","const":"both"}],"title":"Plugin Approval Forwarding Mode","description":"Controls where plugin approval prompts are sent: \"session\" uses origin chat, \"targets\" uses configured targets, and \"both\" sends to both paths."},"agentFilter":{"type":"array","items":{"type":"string"},"title":"Plugin Approval Agent Filter","description":"Optional allowlist of agent IDs eligible for forwarded plugin approvals, for example `[\"primary\", \"ops-agent\"]`. Use this to limit forwarding blast radius."},"sessionFilter":{"type":"array","items":{"type":"string"},"title":"Plugin Approval Session Filter","description":"Optional session-key filters matched as substring or regex-style patterns, for example `[\"discord:\", \"^agent:ops:\"]`. Use narrow patterns so only intended approval contexts are forwarded."},"targets":{"type":"array","items":{"type":"object","properties":{"channel":{"type":"string","minLength":1,"title":"Plugin Approval Target Channel","description":"Channel/provider ID used for forwarded plugin approval delivery, such as discord, slack, or a plugin channel id."},"to":{"type":"string","minLength":1,"title":"Plugin Approval Target Destination","description":"Destination identifier inside the target channel (channel ID, user ID, or thread root depending on provider)."},"accountId":{"type":"string","title":"Plugin Approval Target Account ID","description":"Optional account selector for multi-account channel setups when plugin approvals must route through a specific account context."},"threadId":{"anyOf":[{"type":"string"},{"type":"number"}],"title":"Plugin Approval Target Thread ID","description":"Optional thread/topic target for channels that support threaded delivery of forwarded plugin approvals."}},"required":["channel","to"],"additionalProperties":false},"title":"Plugin Approval Forwarding Targets","description":"Explicit delivery targets used when plugin approval forwarding mode includes targets, each with channel and destination details."}},"additionalProperties":false,"title":"Plugin Approval Forwarding","description":"Groups plugin-approval forwarding behavior including enablement, routing mode, filters, and explicit targets. Independent of exec approval forwarding. Configure here when plugin approval prompts must reach operational channels."}},"additionalProperties":false,"title":"Approvals","description":"Approval routing controls for forwarding exec and plugin approval requests to chat destinations outside the originating session. Keep these disabled unless operators need explicit out-of-band approval visibility."},"session":{"type":"object","properties":{"scope":{"anyOf":[{"type":"string","const":"per-sender"},{"type":"string","const":"global"}],"title":"Session Scope","description":"Sets base session grouping strategy: \"per-sender\" isolates by sender and \"global\" shares one session per channel context. Keep \"per-sender\" for safer multi-user behavior unless deliberate shared context is required."},"dmScope":{"type":"string","enum":["main","per-peer","per-channel-peer","per-account-channel-peer"],"title":"DM Session Scope","description":"DM session scoping: \"main\" keeps continuity, while \"per-peer\", \"per-channel-peer\", and \"per-account-channel-peer\" increase isolation. Use isolated modes for shared inboxes or multi-account deployments."},"groupScope":{"type":"string","enum":["main","per-group"],"title":"Group Session Scope","description":"Group/channel session scoping: \"per-group\" keeps rooms separate while the agent main session ambiently watches them, independently of dmScope; \"main\" merges room context into main and needs no watch. Use \"main\" only for trusted rooms."},"identityLinks":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"array","items":{"type":"string"}},"title":"Session Identity Links","description":"Maps canonical identities to provider-prefixed peer IDs so equivalent users resolve to one DM thread (example: telegram:123456). Use this when the same human appears across multiple channels or accounts."},"resetTriggers":{"type":"array","items":{"type":"string"},"title":"Session Reset Triggers","description":"Lists message triggers that force a session reset when matched in inbound content. Use sparingly for explicit reset phrases so context is not dropped unexpectedly during normal conversation."},"reset":{"type":"object","properties":{"mode":{"anyOf":[{"type":"string","const":"none"},{"type":"string","const":"daily"},{"type":"string","const":"idle"}],"title":"Session Reset Mode","description":"Selects reset strategy: \"none\" disables automatic reset (the default), \"daily\" resets at a configured hour, and \"idle\" resets after inactivity. /new and /reset remain available in every mode."},"atHour":{"type":"integer","minimum":0,"maximum":23,"title":"Session Daily Reset Hour","description":"Sets local-hour boundary (0-23) for daily reset mode so sessions roll over at predictable times. Use with mode=daily and align to operator timezone expectations for human-readable behavior."},"idleMinutes":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"title":"Session Reset Idle Minutes","description":"Sets inactivity window before reset for idle mode and can also act as secondary guard with daily mode. Use larger values to preserve continuity or smaller values for fresher short-lived threads."}},"additionalProperties":false,"title":"Session Reset Policy","description":"Defines the default reset policy object used when no type-specific or channel-specific override applies. By default sessions do not reset automatically; use daily or idle schedules to opt in, while /new and /reset remain available at any time."},"resetByType":{"type":"object","properties":{"direct":{"type":"object","properties":{"mode":{"anyOf":[{"type":"string","const":"none"},{"type":"string","const":"daily"},{"type":"string","const":"idle"}]},"atHour":{"type":"integer","minimum":0,"maximum":23},"idleMinutes":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"additionalProperties":false,"title":"Session Reset (Direct)","description":"Defines reset policy for direct chats and supersedes the base session.reset configuration for that type. Use this as the canonical direct-message override instead of the legacy dm alias."},"group":{"type":"object","properties":{"mode":{"anyOf":[{"type":"string","const":"none"},{"type":"string","const":"daily"},{"type":"string","const":"idle"}]},"atHour":{"type":"integer","minimum":0,"maximum":23},"idleMinutes":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"additionalProperties":false,"title":"Session Reset (Group)","description":"Defines reset policy for group chat sessions where continuity and noise patterns differ from DMs. Use shorter idle windows for busy groups if context drift becomes a problem."},"thread":{"type":"object","properties":{"mode":{"anyOf":[{"type":"string","const":"none"},{"type":"string","const":"daily"},{"type":"string","const":"idle"}]},"atHour":{"type":"integer","minimum":0,"maximum":23},"idleMinutes":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"additionalProperties":false,"title":"Session Reset (Thread)","description":"Defines reset policy for thread-scoped sessions, including focused channel thread workflows. Use this when thread sessions should expire faster or slower than other chat types."}},"additionalProperties":false,"title":"Session Reset by Chat Type","description":"Overrides reset behavior by chat type (direct, group, thread) when defaults are not sufficient. Use this when group/thread traffic needs different reset cadence than direct messages."},"resetByChannel":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"mode":{"anyOf":[{"type":"string","const":"none"},{"type":"string","const":"daily"},{"type":"string","const":"idle"}]},"atHour":{"type":"integer","minimum":0,"maximum":23},"idleMinutes":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"additionalProperties":false},"title":"Session Reset by Channel","description":"Provides channel-specific reset overrides keyed by provider/channel id for fine-grained behavior control. Use this only when one channel needs exceptional reset behavior beyond type-level policies."},"store":{"type":"string","title":"Session Store Path","description":"Sets the session storage file path used to persist session records across restarts. Use an explicit path only when you need custom disk layout, backup routing, or mounted-volume storage."},"mainKey":{"type":"string","title":"Session Main Key","description":"Accepted but ignored: the per-agent main session suffix is always \"main\". Omit this field; global session scope uses \"global\" instead."},"sendPolicy":{"type":"object","properties":{"default":{"anyOf":[{"type":"string","const":"allow"},{"type":"string","const":"deny"}],"title":"Session Send Policy Default Action","description":"Sets fallback action when no sendPolicy rule matches: \"allow\" or \"deny\". Keep \"allow\" for simpler setups, or choose \"deny\" when you require explicit allow rules for every destination."},"rules":{"type":"array","items":{"type":"object","properties":{"action":{"anyOf":[{"type":"string","const":"allow"},{"type":"string","const":"deny"}],"title":"Session Send Rule Action","description":"Defines rule decision as \"allow\" or \"deny\" when the corresponding match criteria are satisfied. Use deny-first ordering when enforcing strict boundaries with explicit allow exceptions."},"match":{"type":"object","properties":{"channel":{"type":"string","title":"Session Send Rule Channel","description":"Matches rule application to a specific channel/provider id (for example discord, telegram, slack). Use this when one channel should permit or deny delivery independently of others."},"chatType":{"anyOf":[{"type":"string","const":"direct"},{"type":"string","const":"group"},{"type":"string","const":"channel"}],"title":"Session Send Rule Chat Type","description":"Matches rule application to chat type (direct, group, thread) so behavior varies by conversation form. Use this when DM and group destinations require different safety boundaries."},"keyPrefix":{"type":"string","title":"Session Send Rule Key Prefix","description":"Matches a normalized session-key prefix after internal key normalization steps in policy consumers. Use this for general prefix controls, and prefer rawKeyPrefix when exact full-key matching is required."},"rawKeyPrefix":{"type":"string","title":"Session Send Rule Raw Key Prefix","description":"Matches the raw, unnormalized session-key prefix for exact full-key policy targeting. Use this when normalized keyPrefix is too broad and you need agent-prefixed or transport-specific precision."}},"additionalProperties":false,"title":"Session Send Rule Match","description":"Defines optional rule match conditions that can combine channel, chatType, and key-prefix constraints. Keep matches narrow so policy intent stays readable and debugging remains straightforward."}},"required":["action"],"additionalProperties":false},"title":"Session Send Policy Rules","description":"Ordered allow/deny rules evaluated before the default action, for example `{ action: \"deny\", match: { channel: \"discord\" } }`. Put most specific rules first so broad rules do not shadow exceptions."}},"additionalProperties":false,"title":"Session Send Policy","description":"Controls cross-session send permissions using allow/deny rules evaluated against channel, chatType, and key prefixes. Use this to fence where session tools can deliver messages in complex environments."},"threadBindings":{"type":"object","properties":{"enabled":{"type":"boolean","title":"Thread Binding Enabled","description":"Global master switch for thread-bound session spawning, routing, and delivery. Disable to turn off thread binding globally."},"idleHours":{"type":"number","minimum":0,"title":"Thread Binding Idle Timeout (hours)","description":"Default inactivity window in hours for thread-bound sessions across providers/channels (0 disables idle expiry). Default: 24."},"maxAgeHours":{"type":"number","minimum":0,"title":"Thread Binding Max Age (hours)","description":"Optional hard max age in hours for thread-bound sessions across providers/channels (0 disables hard cap). Default: 0."},"spawnSessions":{"type":"boolean","title":"Thread-Bound Session Spawns","description":"Global default gate for creating thread-bound work sessions from sessions_spawn and ACP thread spawns. Default: true when thread bindings are enabled."},"defaultSpawnContext":{"type":"string","enum":["isolated","fork"],"title":"Thread Spawn Context","description":"Default native subagent context for thread-bound spawns. Use \"fork\" to start from the requester transcript or \"isolated\" for a clean child. Default: \"fork\"."}},"additionalProperties":false,"title":"Session Thread Bindings","description":"Shared defaults for thread-bound session spawning and routing across supported channels. Configure global defaults here and override per channel only when behavior differs."},"sharing":{"type":"object","properties":{"readOnly":{"type":"boolean","title":"Allow Read-only Sessions","description":"Allows sessions to be made read-only for non-participants. Default: true."},"suggest":{"type":"boolean","title":"Allow Suggest Sessions","description":"Allows suggest visibility. In this phase it enforces the same admission policy as read-only; suggestion queues are configured by a later feature. Default: true."},"drafts":{"type":"boolean","title":"Allow Draft Sessions","description":"Allows draft visibility, which hides sessions from non-owner, non-admin operators. Default: true."}},"additionalProperties":false,"title":"Session Sharing Modes","description":"Controls which collaboration modes session owners and administrators may select. Omitted booleans default to enabled; set a mode false to remove it from the picker and reject new selections."},"maintenance":{"type":"object","properties":{"mode":{"type":"string","enum":["enforce","warn"],"title":"Session Maintenance Mode","description":"Determines whether maintenance policies are only reported (\"warn\") or actively applied (\"enforce\"). Keep \"warn\" during rollout and switch to \"enforce\" after validating safe thresholds."},"pruneAfter":{"anyOf":[{"type":"string"},{"type":"number"}],"title":"Session Prune After","description":"Removes entries older than this duration (for example `30d` or `12h`) during maintenance passes. Use this as the primary age-retention control and align it with data retention policy."},"archiveDashboardAfter":{"anyOf":[{"anyOf":[{"type":"string"},{"type":"number"}]},{"type":"boolean","const":false},{"type":"number","const":0}],"title":"Archive Inactive Dashboard Sessions After","description":"Archives inactive dashboard sessions after this duration (for example `7d`) so they remain available without crowding the active session list. Set `false` or `0` to disable automatic dashboard archiving."},"maxEntries":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"title":"Session Max Entries","description":"Caps total session entry count retained in the store to prevent unbounded growth over time. Protected entries count toward the limit but are never automatically removed, so the store can remain above the cap when protection alone exceeds it. Use lower limits for constrained environments, or higher limits when longer history is required."},"preserveRecent":{"anyOf":[{"anyOf":[{"type":"string"},{"type":"number"}]},{"type":"boolean","const":false}],"title":"Preserve Recent Sessions","description":"Protects interactive sessions active within this duration (for example `7d`) from automatic age, count, and disk-budget history eviction. Unset or `false` keeps the normal oldest-first policy. Synthetic model-run, cron, hook, heartbeat, ACP, and sub-agent rows remain eligible for bounded cleanup."},"resetArchiveRetention":{"anyOf":[{"anyOf":[{"type":"string"},{"type":"number"}]},{"type":"boolean","const":false}],"title":"Session Reset Archive Retention","description":"Age-based retention for archived transcripts (`*.reset.<timestamp>` and `*.deleted.<timestamp>`). Defaults to keeping archives until the disk budget evicts them oldest-first; set a duration (for example `30d`) to opt into wall-clock deletion, or `false` to disable it explicitly."},"maxDiskBytes":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean","const":false}],"title":"Session Max Disk Budget","description":"Per-agent sessions-directory disk budget (for example `500mb`). Defaults to `10gb`; when exceeded, warn mode reports pressure and enforce mode performs oldest-first cleanup (archived transcripts before live sessions). Set `false`, `0`, or `\"0\"` to disable."},"highWaterBytes":{"anyOf":[{"type":"string"},{"type":"number"}],"title":"Session Disk High-water Target","description":"Target size after disk-budget cleanup (high-water mark). Defaults to 80% of maxDiskBytes; set explicitly for tighter reclaim behavior on constrained disks. A value that resolves to zero falls back to the default; negative values are invalid. Disable the budget with maxDiskBytes instead."}},"additionalProperties":false,"title":"Session Maintenance","description":"Automatic session-store maintenance controls for dashboard archiving, pruning age, entry caps, reset archive retention, and disk budget cleanup. Start in warn mode to observe impact, then enforce once thresholds are tuned."}},"additionalProperties":false,"title":"Session","description":"Global session routing, reset, delivery policy, and maintenance controls for conversation history behavior. Keep defaults unless you need stricter isolation, retention, or delivery constraints."},"cron":{"type":"object","properties":{"enabled":{"type":"boolean","title":"Automations Enabled","description":"Enables automation execution for stored schedules managed by the gateway. Keep enabled for normal reminder/automation flows, and disable only to pause all automation execution without deleting jobs."},"skipMissedJobs":{"type":"boolean","title":"Skip Missed Recurring Automations","description":"Skips missed recurring cron/every slots at Gateway startup and schedules their next future occurrence instead of catching up. Default: false. Enable to avoid stale reminders after downtime; one-shot at jobs still catch up."},"triggers":{"type":"object","properties":{"enabled":{"type":"boolean"}},"additionalProperties":false},"webhookToken":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"store"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false}]}],"title":"Automations Webhook Bearer Token","description":"Bearer token attached to automation webhook POST deliveries when webhook mode is used. Prefer secret/env substitution and rotate this token regularly if shared webhook endpoints are internet-reachable."},"webhookSsrfPolicy":{"type":"object","properties":{"dangerouslyAllowPrivateNetwork":{"type":"boolean","title":"Automations Webhook Dangerously Allow Private Network","description":"Allows automation webhooks to private and internal network targets. Keep disabled unless every configured webhook destination is trusted."},"allowRfc2544BenchmarkRange":{"type":"boolean","title":"Automations Webhook Allow RFC 2544 Benchmark Range","description":"Allows automation webhooks to RFC 2544 benchmark-range IPs (198.18.0.0/15). Use only with trusted fake-IP proxy environments."},"allowIpv6UniqueLocalRange":{"type":"boolean","title":"Automations Webhook Allow IPv6 Unique Local Range","description":"Allows automation webhooks to IPv6 Unique Local Addresses (fc00::/7). Use only with trusted fake-IP proxy environments."},"allowedHostnames":{"type":"array","items":{"type":"string"},"title":"Automations Webhook Allowed Hostnames","description":"Exact hostnames or IP literals allowed for automation webhook delivery, including otherwise blocked targets. Keep the list minimal."},"blockedHostnames":{"type":"array","items":{"type":"string"},"title":"Automations Webhook Blocked Hostnames","description":"Hostname patterns denied before DNS and allow rules for automation webhook delivery. Supports exact hosts and \"*.example.com\" for subdomains only; add \"example.com\" separately to block the apex. Empty or unset adds no denials."}},"additionalProperties":false,"title":"Automations Webhook SSRF Policy","description":"SSRF policy applied to every outbound automation webhook. Private, loopback, link-local, and internal targets stay blocked unless this policy explicitly allows them. Keep unset for strict delivery."},"sessionRetention":{"anyOf":[{"type":"string"},{"type":"boolean","const":false}],"title":"Automations Session Retention","description":"Controls how long completed automation run sessions are kept before pruning (`24h`, `7d`, `1h30m`, or `false` to disable pruning; a zero duration such as `0h` also disables; default: `24h`). Use shorter retention to reduce storage growth on high-frequency schedules."},"failureAlert":{"type":"object","properties":{"enabled":{"type":"boolean"},"after":{"type":"integer","minimum":1,"maximum":9007199254740991},"cooldownMs":{"type":"integer","minimum":0,"maximum":9007199254740991},"includeSkipped":{"type":"boolean"},"mode":{"type":"string","enum":["announce","webhook"]},"accountId":{"type":"string"},"channel":{"type":"string"},"to":{"type":"string"}},"additionalProperties":false}},"additionalProperties":false,"title":"Automations","description":"Global scheduler settings for stored automations, run concurrency, delivery fallback, and run-session retention. Keep defaults unless you are scaling automation volume or integrating external webhook receivers."},"transcripts":{"type":"object","properties":{"enabled":{"type":"boolean","title":"Transcripts Enabled","description":"Enables durable automatic meeting notes, the transcripts agent tool, and configured auto-start sources. Default: true. Set false to disable persistence and the tool; explicit meeting transcribe mode retains its bounded live tail."},"autoStart":{"type":"array","items":{"type":"object","properties":{"providerId":{"type":"string","minLength":1,"title":"Transcript Source Provider ID","description":"Transcript source provider id, such as a Discord voice or future Slack huddle provider. Use the exact id exposed by the provider plugin."},"sessionId":{"type":"string","minLength":1,"title":"Transcript Session ID","description":"Optional fixed transcript session id for this auto-start source. Leave unset for generated ids unless you need a stable daily selector and can avoid same-day collisions."},"title":{"type":"string","minLength":1,"title":"Transcript Title","description":"Optional human-readable title stored with the transcript session and shown in transcript listings. Use concise meeting names that help operators identify the captured source."},"accountId":{"type":"string","minLength":1,"title":"Transcript Account ID","description":"Optional provider account or workspace identifier for transcript sources that need account disambiguation. Use the provider's documented account id format."},"guildId":{"type":"string","minLength":1,"title":"Discord Guild ID","description":"Optional Discord guild id for Discord voice transcript sources. Configure this with the matching channelId when the provider needs guild-scoped voice channel lookup."},"channelId":{"type":"string","minLength":1,"title":"Transcript Channel ID","description":"Provider channel id for the live transcript source, such as a Discord voice channel or Slack huddle channel. Verify provider-specific id semantics before enabling auto-start."},"meetingUrl":{"type":"string","minLength":1,"title":"Transcript Meeting URL","description":"Optional meeting URL for providers that join by URL instead of channel id. Use only trusted meeting links because auto-start may join and capture that meeting."}},"required":["providerId"],"additionalProperties":false},"title":"Transcripts Auto-start Sources","description":"Live transcript sources started automatically when the gateway starts. Each entry is enabled by being present; remove an entry to disable that source."}},"additionalProperties":false,"title":"Transcripts","description":"Core transcript capture settings for meeting notes, recording-capable agent tools, and configured live meeting auto-start sources. Meeting plugins capture durable notes by default; set enabled to false to opt out globally."},"hooks":{"type":"object","properties":{"enabled":{"type":"boolean","title":"Hooks Enabled","description":"Enables the hooks endpoint and mapping execution pipeline for inbound webhook requests. Keep disabled unless you are actively routing external events into the gateway."},"path":{"type":"string","title":"Hooks Endpoint Path","description":"HTTP path used by the hooks endpoint (for example `/hooks`) on the gateway control server. Use a non-guessable path and combine it with token validation for defense in depth."},"token":{"type":"string","title":"Hooks Auth Token","description":"Shared bearer token checked by hooks ingress for request authentication before mappings run. Treat holders as full-trust callers for the hook ingress surface, not as a separate non-owner role. Use environment substitution and rotate regularly when webhook endpoints are internet-accessible."},"defaultSessionKey":{"type":"string","title":"Hooks Default Session Key","description":"Fallback session key used for hook deliveries when a request does not provide one through allowed channels. Use a stable but scoped key to avoid mixing unrelated automation conversations."},"allowRequestSessionKey":{"type":"boolean","title":"Hooks Allow Request Session Key","description":"Allows callers to supply a session key in hook requests when true, enabling caller-controlled routing. Keep false unless trusted integrators explicitly need custom session threading."},"allowedSessionKeyPrefixes":{"type":"array","items":{"type":"string"},"title":"Hooks Allowed Session Key Prefixes","description":"Allowlist of accepted session-key prefixes for inbound hook requests when caller-provided keys are enabled. Use narrow prefixes to prevent arbitrary session-key injection."},"allowedAgentIds":{"type":"array","items":{"type":"string"},"title":"Hooks Allowed Agent IDs","description":"Allowlist of effective agent IDs that hook requests and mappings are allowed to target, including default-agent routing when agentId is omitted. Use this to constrain automation events to dedicated service agents and reduce blast radius if a hook token is exposed."},"presets":{"type":"array","items":{"type":"string"},"title":"Hooks Presets","description":"Named hook preset bundles applied at load time to seed standard mappings and behavior defaults. Keep preset usage explicit so operators can audit which automations are active."},"transformsDir":{"type":"string","title":"Hooks Transforms Directory","description":"Base directory for hook transform modules referenced by mapping transform.module paths. Use a controlled repo directory so dynamic imports remain reviewable and predictable."},"mappings":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","title":"Hook Mapping ID","description":"Optional stable identifier for a hook mapping entry used for auditing, troubleshooting, and targeted updates. Use unique IDs so logs and config diffs can reference mappings unambiguously."},"match":{"type":"object","properties":{"path":{"type":"string","title":"Hook Mapping Match Path","description":"Path match condition for a hook mapping, usually compared against the inbound request path. Use this to split automation behavior by webhook endpoint path families."},"source":{"type":"string","title":"Hook Mapping Match Source","description":"Source match condition for a hook mapping, typically set by trusted upstream metadata or adapter logic. Use stable source identifiers so routing remains deterministic across retries."}},"title":"Hook Mapping Match","description":"Grouping object for mapping match predicates such as path and source before action routing is applied. Keep match criteria specific so unrelated webhook traffic does not trigger automations."},"action":{"anyOf":[{"type":"string","const":"wake"},{"type":"string","const":"agent"}],"title":"Hook Mapping Action","description":"Mapping action type: \"wake\" triggers agent wake flow, while \"agent\" sends directly to agent handling. Use \"agent\" for immediate execution and \"wake\" when heartbeat-driven processing is preferred."},"wakeMode":{"anyOf":[{"type":"string","const":"now"},{"type":"string","const":"next-heartbeat"}],"title":"Hook Mapping Wake Mode","description":"Wake scheduling mode: \"now\" wakes immediately, while \"next-heartbeat\" defers until the next heartbeat cycle. Use deferred mode for lower-priority automations that can tolerate slight delay."},"name":{"type":"string","title":"Hook Mapping Name","description":"Human-readable mapping display name used in diagnostics and operator-facing config UIs. Keep names concise and descriptive so routing intent is obvious during incident review."},"agentId":{"type":"string","title":"Hook Mapping Agent ID","description":"Target agent ID for mapping execution when action routing should not use defaults. Use dedicated automation agents to isolate webhook behavior from interactive operator sessions."},"sessionKey":{"type":"string","title":"Hook Mapping Session Key","description":"Explicit session key override for mapping-delivered messages to control thread continuity. Use stable scoped keys so repeated events correlate without leaking into unrelated conversations."},"sessionMode":{"anyOf":[{"type":"string","const":"isolated"},{"type":"string","const":"persistent"}],"title":"Hook Mapping Session Mode","description":"Controls mapping session continuity: \"isolated\" starts a fresh run session, while \"persistent\" reuses the resolved sessionKey. Keep isolated unless the integration intentionally needs durable context."},"messageTemplate":{"type":"string","title":"Hook Mapping Message Template","description":"Template for synthesizing structured mapping input into the final message content sent to the target action path. Keep templates deterministic so downstream parsing and behavior remain stable."},"textTemplate":{"type":"string","title":"Hook Mapping Text Template","description":"Text-only fallback template used when rich payload rendering is not desired or not supported. Use this to provide a concise, consistent summary string for chat delivery surfaces."},"forEach":{"type":"string","pattern":"^[^.[\\]]+$","title":"Hook Mapping Fan-Out Key","description":"Top-level payload array key the mapping fans out over: each element dispatches its own action, and templates or transforms see a payload whose array holds only the current element. The Gmail preset uses forEach: messages so batched pushes dispatch one run per email."},"deliver":{"type":"boolean","title":"Hook Mapping Deliver Reply","description":"Controls whether mapping execution results are delivered back to a channel destination versus being processed silently. Disable delivery for background automations that should not post user-facing output."},"allowUnsafeExternalContent":{"type":"boolean","title":"Hook Mapping Allow Unsafe External Content","description":"When true, mapping content may include less-sanitized external payload data in generated messages. Keep false by default and enable only for trusted sources with reviewed transform logic."},"channel":{"type":"string","minLength":1,"title":"Hook Mapping Delivery Channel","description":"Delivery channel override for mapping outputs (for example \"last\", \"telegram\", \"discord\", \"slack\", \"signal\", \"imessage\", or \"msteams\"). Keep channel overrides explicit to avoid accidental cross-channel sends."},"to":{"type":"string","title":"Hook Mapping Delivery Destination","description":"Destination identifier inside the selected channel when mapping replies should route to a fixed target. Verify provider-specific destination formats before enabling production mappings."},"model":{"type":"string","title":"Hook Mapping Model Override","description":"Optional model override for mapping-triggered runs when automation should use a different model than agent defaults. Use this sparingly so behavior remains predictable across mapping executions."},"thinking":{"type":"string","title":"Hook Mapping Thinking Override","description":"Optional thinking-effort override for mapping-triggered runs to tune latency versus reasoning depth. Keep low or minimal for high-volume hooks unless deeper reasoning is clearly required."},"timeoutSeconds":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"title":"Hook Mapping Timeout (sec)","description":"Maximum runtime allowed for mapping action execution before timeout handling applies. Use tighter limits for high-volume webhook sources to prevent queue pileups."},"transform":{"type":"object","properties":{"module":{"type":"string","title":"Hook Transform Module","description":"Relative transform module path loaded from hooks.transformsDir to rewrite incoming payloads before delivery. Keep modules local, reviewed, and free of path traversal patterns."},"export":{"type":"string","title":"Hook Transform Export","description":"Named export to invoke from the transform module; defaults to module default export when omitted. Set this when one file hosts multiple transform handlers."}},"required":["module"],"additionalProperties":false,"title":"Hook Mapping Transform","description":"Transform configuration block defining module/export preprocessing before mapping action handling. Use transforms only from reviewed code paths and keep behavior deterministic for repeatable automation."}},"additionalProperties":false},"title":"Hook Mappings","description":"Ordered mapping rules that match inbound hook requests and choose wake or agent actions with optional delivery routing. Use specific mappings first to avoid broad pattern rules capturing everything."},"gmail":{"type":"object","properties":{"account":{"type":"string","title":"Gmail Hook Account","description":"Google account identifier used for Gmail watch/subscription operations in this hook integration. Use a dedicated automation mailbox account to isolate operational permissions."},"label":{"type":"string","title":"Gmail Hook Label","description":"Optional Gmail label filter limiting which labeled messages trigger hook events. Keep filters narrow to avoid flooding automations with unrelated inbox traffic."},"topic":{"type":"string","title":"Gmail Hook Pub/Sub Topic","description":"Google Pub/Sub topic name used by Gmail watch to publish change notifications for this account. Ensure the topic IAM grants Gmail publish access before enabling watches."},"subscription":{"type":"string","title":"Gmail Hook Subscription","description":"Pub/Sub subscription consumed by the gateway to receive Gmail change notifications from the configured topic. Keep subscription ownership clear so multiple consumers do not race unexpectedly."},"pushToken":{"type":"string","title":"Gmail Hook Push Token","description":"Shared secret token required on Gmail push hook callbacks before processing notifications. Use env substitution and rotate if callback endpoints are exposed externally."},"hookUrl":{"type":"string","title":"Gmail Hook Callback URL","description":"Public callback URL Gmail or intermediaries invoke to deliver notifications into this hook pipeline. Keep this URL protected with token validation and restricted network exposure."},"includeBody":{"type":"boolean","title":"Gmail Hook Include Body","description":"When true, fetch and include email body content for downstream mapping/agent processing. Keep false unless body text is required, because this increases payload size and sensitivity."},"maxBytes":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"title":"Gmail Hook Max Body Bytes","description":"Maximum Gmail payload bytes processed per event when includeBody is enabled. Keep conservative limits to reduce oversized message processing cost and risk."},"renewEveryMinutes":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"title":"Gmail Hook Renew Interval (min)","description":"Renewal cadence in minutes for Gmail watch subscriptions to prevent expiration. Set below provider expiration windows and monitor renew failures in logs."},"allowUnsafeExternalContent":{"type":"boolean","title":"Gmail Hook Allow Unsafe External Content","description":"Allows less-sanitized external Gmail content to pass into processing when enabled. Keep disabled for safer defaults, and enable only for trusted mail streams with controlled transforms."},"serve":{"type":"object","properties":{"bind":{"type":"string","title":"Gmail Hook Server Bind Address","description":"Bind address for the local Gmail callback HTTP server used when serving hooks directly. Keep loopback-only unless external ingress is intentionally required."},"port":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"title":"Gmail Hook Server Port","description":"Port for the local Gmail callback HTTP server when serve mode is enabled. Use a dedicated port to avoid collisions with gateway/control interfaces."},"path":{"type":"string","title":"Gmail Hook Server Path","description":"HTTP path on the local Gmail callback server where push notifications are accepted. Keep this consistent with subscription configuration to avoid dropped events."}},"additionalProperties":false,"title":"Gmail Hook Local Server","description":"Local callback server settings block for directly receiving Gmail notifications without a separate ingress layer. Enable only when this process should terminate webhook traffic itself."},"tailscale":{"type":"object","properties":{"mode":{"anyOf":[{"type":"string","const":"off"},{"type":"string","const":"serve"},{"type":"string","const":"funnel"}],"title":"Gmail Hook Tailscale Mode","description":"Tailscale exposure mode for Gmail callbacks: \"off\", \"serve\", or \"funnel\". Use \"serve\" for private tailnet delivery and \"funnel\" only when public internet ingress is required."},"path":{"type":"string","title":"Gmail Hook Tailscale Path","description":"Path published by Tailscale Serve/Funnel for Gmail callback forwarding when enabled. Keep it aligned with Gmail webhook config so requests reach the expected handler."},"target":{"type":"string","title":"Gmail Hook Tailscale Target","description":"Local service target forwarded by Tailscale Serve/Funnel (for example http://127.0.0.1:8787). Use explicit loopback targets to avoid ambiguous routing."}},"additionalProperties":false,"title":"Gmail Hook Tailscale","description":"Tailscale exposure configuration block for publishing Gmail callbacks through Serve/Funnel routes. Use private tailnet modes before enabling any public ingress path."},"model":{"type":"string","title":"Gmail Hook Model Override","description":"Optional model override for Gmail-triggered runs when mailbox automations should use dedicated model behavior. Keep unset to inherit agent defaults unless mailbox tasks need specialization."},"thinking":{"anyOf":[{"type":"string","const":"off"},{"type":"string","const":"minimal"},{"type":"string","const":"low"},{"type":"string","const":"medium"},{"type":"string","const":"high"}],"title":"Gmail Hook Thinking Override","description":"Thinking effort override for Gmail-driven agent runs: \"off\", \"minimal\", \"low\", \"medium\", or \"high\". Keep modest defaults for routine inbox automations to control cost and latency."}},"additionalProperties":false,"title":"Gmail Hook","description":"Gmail push integration settings used for Pub/Sub notifications and optional local callback serving. Keep this scoped to dedicated Gmail automation accounts where possible."},"internal":{"type":"object","properties":{"enabled":{"type":"boolean","title":"Internal Hooks Enabled","description":"Enables processing for internal hooks and configured entries in the internal hook runtime. Keep disabled unless internal hooks are intentionally configured."},"entries":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"enabled":{"type":"boolean"},"env":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"}}},"additionalProperties":{}},"title":"Internal Hook Entries","description":"Configured internal hook entry records used to register concrete runtime handlers and metadata. Keep entries explicit and versioned so production behavior is auditable."},"load":{"type":"object","properties":{"extraDirs":{"type":"array","items":{"type":"string"},"title":"Internal Hook Extra Directories","description":"Additional directories searched for internal hook modules beyond default load paths. Keep this minimal and controlled to reduce accidental module shadowing."}},"additionalProperties":false,"title":"Internal Hook Loader","description":"Internal hook loader settings controlling where handler modules are discovered at startup. Use constrained load roots to reduce accidental module conflicts or shadowing."}},"additionalProperties":false,"title":"Internal Hooks","description":"Internal hook runtime settings for bundled/custom event handlers loaded from module paths. Use this for trusted in-process automations and keep handler loading tightly scoped."}},"additionalProperties":false,"title":"Hooks","description":"Inbound webhook automation surface for mapping external events into wake or agent actions in OpenClaw. Keep this locked down with explicit token/session/agent controls before exposing it beyond trusted networks."},"channels":{"type":"object","properties":{"defaults":{"type":"object","properties":{"groupPolicy":{"type":"string","enum":["open","disabled","allowlist"],"title":"Default Group Policy","description":"Default group policy across channels: \"open\", \"disabled\", or \"allowlist\". Keep \"allowlist\" for safer production setups unless broad group participation is intentional."},"contextVisibility":{"type":"string","enum":["all","allowlist","allowlist_quote"],"title":"Default Context Visibility","description":"Default supplemental context visibility for fetched quote/thread/history content: \"all\" (keep all context), \"allowlist\" (only allowlisted senders), or \"allowlist_quote\" (allowlist + keep explicit quotes)."},"heartbeatVisibility":{"type":"object","properties":{"showOk":{"type":"boolean","title":"Heartbeat Show OK","description":"Shows healthy/OK heartbeat status entries when true in channel status outputs. Keep false in noisy environments and enable only when operators need explicit healthy confirmations."},"showAlerts":{"type":"boolean","title":"Heartbeat Show Alerts","description":"Shows degraded/error heartbeat alerts when true so operator channels surface problems promptly. Keep enabled in production so broken channel states are visible."},"useIndicator":{"type":"boolean","title":"Heartbeat Use Indicator","description":"Enables concise indicator-style heartbeat rendering instead of verbose status text where supported. Use indicator mode for dense dashboards with many active channels."}},"additionalProperties":false,"title":"Default Heartbeat Visibility","description":"Default heartbeat visibility settings for status messages emitted by providers/channels. Tune this globally to reduce noisy healthy-state updates while keeping alerts visible."},"botLoopProtection":{"type":"object","properties":{"enabled":{"type":"boolean","title":"Default Bot Loop Protection Enabled","description":"Enables pair loop protection by default for supporting channels when bot-authored messages can reach dispatch. Providers may still disable the guard when bots are ignored."},"maxEventsPerWindow":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"title":"Default Bot Loop Events per Window","description":"Maximum events a sender/receiver pair may exchange within the configured window before suppression starts. Default for supporting channels is 20."},"windowSeconds":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"title":"Default Bot Loop Window Seconds","description":"Sliding window length in seconds for pair loop budgets. Default for supporting channels is 60."},"cooldownSeconds":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"title":"Default Bot Loop Cooldown Seconds","description":"Cooldown seconds applied to a pair after it exceeds the loop budget. Default for supporting channels is 60."}},"additionalProperties":false,"title":"Default Bot Loop Protection","description":"Default pair loop protection settings for channel providers that support bot-to-bot loop guards. Use provider-specific overrides only when one channel needs a different budget."},"implicitMentions":{"type":"object","properties":{"replyToBot":{"type":"boolean","title":"Default Reply-to-Bot Implicit Mentions","description":"Treat replies to the bot's own messages as implicit mentions by default. Defaults to true for backward compatibility."},"quotedBot":{"type":"boolean","title":"Default Quoted-Bot Implicit Mentions","description":"Treat quoted bot messages as implicit mentions by default. Defaults to true for backward compatibility."},"threadParticipation":{"type":"boolean","title":"Default Thread-Participation Implicit Mentions","description":"Treat follow-ups in threads where the bot participated as implicit mentions by default. Defaults to true for backward compatibility."}},"additionalProperties":false,"title":"Default Implicit Mentions","description":"Default policy for whether reply-to-bot, quoted-bot, and bot-participated-thread facts activate supporting message channels without an explicit mention."}},"additionalProperties":false,"title":"Channel Defaults","description":"Default channel behavior applied across providers when provider-specific settings are not set. Use this to enforce consistent baseline policy before per-provider tuning."},"modelByChannel":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"}},"title":"Channel Model Overrides","description":"Map provider -> channel id / DM peer id -> model override (values are provider/model or aliases)."},"a2a":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"enabled":{"type":"boolean"},"configWrites":{"type":"boolean"},"advertisedUrl":{"allOf":[{"type":"string","format":"uri"},{"type":"string","pattern":"^https?:\\/\\/"}]},"replyTimeoutMs":{"type":"integer","minimum":5000,"maximum":600000},"rateLimitPerMinute":{"type":"integer","minimum":0,"maximum":9007199254740991},"exposeAgents":{"type":"array","items":{"type":"string"}},"peers":{"type":"object","propertyNames":{"type":"string","pattern":"^[a-z0-9][a-z0-9._-]{0,63}$"},"additionalProperties":{"type":"object","properties":{"token":{"type":"string","minLength":1},"url":{"allOf":[{"type":"string","format":"uri"},{"type":"string","pattern":"^https?:\\/\\/"}]},"outboundToken":{"type":"string","minLength":1}},"required":["token"],"additionalProperties":false}}},"additionalProperties":false},"buzz":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"name":{"type":"string"},"enabled":{"type":"boolean"},"configWrites":{"type":"boolean"},"responsePrefix":{"type":"string"},"replyToMode":{"type":"string","enum":["off","all"]},"markdown":{"type":"object","properties":{"tables":{"type":"string","enum":["off","bullets","code","block"]}},"additionalProperties":false},"relayUrl":{"allOf":[{"type":"string","format":"uri"},{"type":"string","pattern":"^[wW][sS][sS]?:\\/\\/"}]},"privateKey":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"store"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false}]}]},"authTag":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"store"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false}]}]},"groupPolicy":{"default":"allowlist","type":"string","enum":["open","disabled","allowlist"]},"groupAllowFrom":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"groups":{"type":"object","propertyNames":{"type":"string","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-5][0-9a-fA-F]{3}-[89aAbB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}$"},"additionalProperties":{"type":"object","properties":{"enabled":{"type":"boolean"},"requireMention":{"type":"boolean"},"groupPolicy":{"type":"string","enum":["open","disabled","allowlist"]},"groupAllowFrom":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}}},"additionalProperties":false}},"historyLimit":{"type":"integer","minimum":0,"maximum":20},"defaultTo":{"type":"string"},"accounts":{"type":"object","propertyNames":{"type":"string","pattern":"^(?!(?:constructor|prototype)$)[a-z0-9][a-z0-9_-]{0,63}$"},"additionalProperties":{"type":"object","properties":{"name":{"type":"string"},"enabled":{"type":"boolean"},"configWrites":{"type":"boolean"},"responsePrefix":{"type":"string"},"replyToMode":{"type":"string","enum":["off","all"]},"markdown":{"type":"object","properties":{"tables":{"type":"string","enum":["off","bullets","code","block"]}},"additionalProperties":false},"relayUrl":{"allOf":[{"type":"string","format":"uri"},{"type":"string","pattern":"^[wW][sS][sS]?:\\/\\/"}]},"privateKey":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"store"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false}]}]},"authTag":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"store"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false}]}]},"groupPolicy":{"type":"string","enum":["open","disabled","allowlist"]},"groupAllowFrom":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"groups":{"type":"object","propertyNames":{"type":"string","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-5][0-9a-fA-F]{3}-[89aAbB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}$"},"additionalProperties":{"type":"object","properties":{"enabled":{"type":"boolean"},"requireMention":{"type":"boolean"},"groupPolicy":{"type":"string","enum":["open","disabled","allowlist"]},"groupAllowFrom":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}}},"additionalProperties":false}},"historyLimit":{"type":"integer","minimum":0,"maximum":20},"defaultTo":{"type":"string"}},"additionalProperties":false}},"defaultAccount":{"type":"string","pattern":"^(?!(?:constructor|prototype)$)[a-z0-9][a-z0-9_-]{0,63}$"}},"required":["groupPolicy"],"additionalProperties":false},"clickclack":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"name":{"type":"string"},"enabled":{"type":"boolean"},"configWrites":{"type":"boolean"},"mediaMaxMb":{"type":"number","exclusiveMinimum":0},"responsePrefix":{"type":"string"},"baseUrl":{"type":"string","format":"uri"},"apiBaseUrl":{"type":"string","format":"uri"},"token":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"store"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false}]}]},"tokenFile":{"type":"string"},"workspace":{"type":"string"},"botUserId":{"type":"string"},"agentId":{"type":"string"},"replyMode":{"type":"string","enum":["agent","model"]},"model":{"type":"string"},"systemPrompt":{"type":"string"},"toolsAllow":{"type":"array","items":{"type":"string"}},"defaultTo":{"type":"string"},"allowFrom":{"type":"array","items":{"type":"string"}},"allowBots":{"anyOf":[{"type":"boolean"},{"type":"string","const":"mentions"}]},"botLoopProtection":{"type":"object","properties":{"enabled":{"type":"boolean"},"maxEventsPerWindow":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"windowSeconds":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"cooldownSeconds":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"additionalProperties":false},"reconnectMs":{"type":"integer","minimum":100,"maximum":60000},"agentActivity":{"type":"boolean"},"nativeProgress":{"type":"boolean"},"commandMenu":{"type":"boolean"},"requireMention":{"type":"boolean"},"mentionPatterns":{"type":"array","items":{"type":"string"}},"groups":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"requireMention":{"type":"boolean"},"mentionPatterns":{"type":"array","items":{"type":"string"}},"allowBots":{"anyOf":[{"type":"boolean"},{"type":"string","const":"mentions"}]},"botLoopProtection":{"type":"object","properties":{"enabled":{"type":"boolean"},"maxEventsPerWindow":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"windowSeconds":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"cooldownSeconds":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"additionalProperties":false}},"additionalProperties":false}},"discussions":{"type":"object","properties":{"enabled":{"type":"boolean"},"workspace":{"type":"string"},"controlUrlBase":{"type":"string","format":"uri"},"section":{"type":"string"}},"additionalProperties":false},"historyLimit":{"type":"integer","minimum":0,"maximum":9007199254740991},"accounts":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"name":{"type":"string"},"enabled":{"type":"boolean"},"configWrites":{"type":"boolean"},"mediaMaxMb":{"type":"number","exclusiveMinimum":0},"responsePrefix":{"type":"string"},"baseUrl":{"type":"string","format":"uri"},"apiBaseUrl":{"type":"string","format":"uri"},"token":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"store"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false}]}]},"tokenFile":{"type":"string"},"workspace":{"type":"string"},"botUserId":{"type":"string"},"agentId":{"type":"string"},"replyMode":{"type":"string","enum":["agent","model"]},"model":{"type":"string"},"systemPrompt":{"type":"string"},"toolsAllow":{"type":"array","items":{"type":"string"}},"defaultTo":{"type":"string"},"allowFrom":{"type":"array","items":{"type":"string"}},"allowBots":{"anyOf":[{"type":"boolean"},{"type":"string","const":"mentions"}]},"botLoopProtection":{"type":"object","properties":{"enabled":{"type":"boolean"},"maxEventsPerWindow":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"windowSeconds":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"cooldownSeconds":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"additionalProperties":false},"reconnectMs":{"type":"integer","minimum":100,"maximum":60000},"agentActivity":{"type":"boolean"},"nativeProgress":{"type":"boolean"},"commandMenu":{"type":"boolean"},"requireMention":{"type":"boolean"},"mentionPatterns":{"type":"array","items":{"type":"string"}},"groups":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"requireMention":{"type":"boolean"},"mentionPatterns":{"type":"array","items":{"type":"string"}},"allowBots":{"anyOf":[{"type":"boolean"},{"type":"string","const":"mentions"}]},"botLoopProtection":{"type":"object","properties":{"enabled":{"type":"boolean"},"maxEventsPerWindow":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"windowSeconds":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"cooldownSeconds":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"additionalProperties":false}},"additionalProperties":false}},"discussions":{"type":"object","properties":{"enabled":{"type":"boolean"},"workspace":{"type":"string"},"controlUrlBase":{"type":"string","format":"uri"},"section":{"type":"string"}},"additionalProperties":false}},"additionalProperties":false}},"defaultAccount":{"type":"string"}},"additionalProperties":false},"discord":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"name":{"type":"string"},"capabilities":{"type":"array","items":{"type":"string"}},"markdown":{"type":"object","properties":{"tables":{"type":"string","enum":["off","bullets","code","block"]}},"additionalProperties":false},"configWrites":{"type":"boolean"},"enabled":{"type":"boolean"},"dmPolicy":{"default":"pairing","type":"string","enum":["pairing","allowlist","open","disabled"]},"allowFrom":{"type":"array","items":{"type":"string"}},"defaultTo":{"type":"string"},"groupPolicy":{"default":"allowlist","type":"string","enum":["open","disabled","allowlist"]},"mentionPatterns":{"type":"object","properties":{"mode":{"anyOf":[{"type":"string","const":"allow"},{"type":"string","const":"deny"}]},"allowIn":{"type":"array","items":{"type":"string"}},"denyIn":{"type":"array","items":{"type":"string"}}},"additionalProperties":false},"contextVisibility":{"type":"string","enum":["all","allowlist","allowlist_quote"]},"historyLimit":{"type":"integer","minimum":0,"maximum":9007199254740991},"dmHistoryLimit":{"type":"integer","minimum":0,"maximum":9007199254740991},"dms":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"historyLimit":{"type":"integer","minimum":0,"maximum":9007199254740991}},"additionalProperties":false}},"textChunkLimit":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"streaming":{"type":"object","properties":{"mode":{"type":"string","enum":["off","partial","block","progress"]},"chunkMode":{"type":"string","enum":["length","newline"]},"preview":{"type":"object","properties":{"chunk":{"type":"object","properties":{"minChars":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"maxChars":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"breakPreference":{"anyOf":[{"type":"string","const":"paragraph"},{"type":"string","const":"newline"},{"type":"string","const":"sentence"}]}},"additionalProperties":false},"toolProgress":{"type":"boolean"},"commandText":{"type":"string","enum":["raw","status"]}},"additionalProperties":false},"progress":{"type":"object","properties":{"label":{"anyOf":[{"type":"string"},{"type":"boolean","const":false}]},"labels":{"type":"array","items":{"type":"string"}},"maxLines":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"maxLineChars":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"toolProgress":{"type":"boolean"},"commandText":{"type":"string","enum":["raw","status"]},"commentary":{"type":"boolean"},"narration":{"type":"boolean"}},"additionalProperties":false},"block":{"type":"object","properties":{"enabled":{"type":"boolean"},"coalesce":{"type":"object","properties":{"minChars":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"maxChars":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"idleMs":{"type":"integer","minimum":0,"maximum":9007199254740991}},"additionalProperties":false}},"additionalProperties":false}},"additionalProperties":false},"heartbeatVisibility":{"type":"object","properties":{"showOk":{"type":"boolean"},"showAlerts":{"type":"boolean"},"useIndicator":{"type":"boolean"}},"additionalProperties":false},"healthMonitor":{"type":"object","properties":{"enabled":{"type":"boolean"}},"additionalProperties":false},"responsePrefix":{"type":"string"},"mediaMaxMb":{"type":"number","exclusiveMinimum":0},"replyToMode":{"anyOf":[{"type":"string","const":"off"},{"type":"string","const":"first"},{"type":"string","const":"all"},{"type":"string","const":"batched"}]},"joinIntro":{"type":"boolean"},"commands":{"type":"object","properties":{"native":{"anyOf":[{"type":"boolean"},{"type":"string","const":"auto"}]},"nativeSkills":{"anyOf":[{"type":"boolean"},{"type":"string","const":"auto"}]}},"additionalProperties":false},"token":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"store"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false}]}]},"applicationId":{"type":"string"},"activities":{"type":"object","properties":{"clientSecret":{"type":"string","minLength":1},"applicationId":{"type":"string","pattern":"^\\d+$"}},"additionalProperties":false},"proxy":{"type":"string"},"allowBots":{"anyOf":[{"type":"boolean"},{"type":"string","const":"mentions"}]},"botLoopProtection":{"type":"object","properties":{"enabled":{"type":"boolean"},"maxEventsPerWindow":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"windowSeconds":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"cooldownSeconds":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"additionalProperties":false},"dangerouslyAllowNameMatching":{"type":"boolean"},"mentionAliases":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string","pattern":"^\\d+$"}},"suppressEmbeds":{"type":"boolean"},"maxLinesPerMessage":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"actions":{"type":"object","properties":{"reactions":{"type":"boolean"},"stickers":{"type":"boolean"},"emojiUploads":{"type":"boolean"},"stickerUploads":{"type":"boolean"},"polls":{"type":"boolean"},"permissions":{"type":"boolean"},"messages":{"type":"boolean"},"threads":{"type":"boolean"},"pins":{"type":"boolean"},"search":{"type":"boolean"},"memberInfo":{"type":"boolean"},"roleInfo":{"type":"boolean"},"roles":{"type":"boolean"},"channelInfo":{"type":"boolean"},"voiceStatus":{"type":"boolean"},"events":{"type":"boolean"},"moderation":{"type":"boolean"},"channels":{"type":"boolean"},"presence":{"type":"boolean"}},"additionalProperties":false},"thread":{"type":"object","properties":{"inheritParent":{"type":"boolean"}},"additionalProperties":false},"dm":{"type":"object","properties":{"enabled":{"type":"boolean"},"groupEnabled":{"type":"boolean"},"groupChannels":{"type":"array","items":{"type":"string"}}},"additionalProperties":false},"guilds":{"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}},"slug":{"type":"string"},"ignoreOtherMentions":{"type":"boolean"},"reactionNotifications":{"type":"string","enum":["off","own","all","allowlist"]},"users":{"type":"array","items":{"type":"string"}},"roles":{"type":"array","items":{"type":"string"}},"presenceEvents":{"type":"object","properties":{"enabled":{"type":"boolean"},"channelId":{"type":"string","pattern":"^\\d+$"},"users":{"type":"array","items":{"type":"string","pattern":"^\\d+$"}},"reconnectSuppressSeconds":{"type":"integer","minimum":0,"maximum":9007199254740991},"burstLimit":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"burstWindowSeconds":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"required":["channelId"],"additionalProperties":false},"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}},"skills":{"type":"array","items":{"type":"string"}},"enabled":{"type":"boolean"},"systemPrompt":{"type":"string"},"ignoreOtherMentions":{"type":"boolean"},"users":{"type":"array","items":{"type":"string"}},"roles":{"type":"array","items":{"type":"string"}},"includeThreadStarter":{"type":"boolean"},"autoThread":{"type":"boolean"},"autoThreadName":{"type":"string","enum":["message","generated"]},"autoArchiveDuration":{"anyOf":[{"type":"string","enum":["60","1440","4320","10080"]},{"type":"number","const":60},{"type":"number","const":1440},{"type":"number","const":4320},{"type":"number","const":10080}]}},"additionalProperties":false}}},"additionalProperties":false}},"execApprovals":{"type":"object","properties":{"enabled":{"anyOf":[{"type":"boolean"},{"type":"string","const":"auto"}]},"approvers":{"type":"array","items":{"type":"string"}},"agentFilter":{"type":"array","items":{"type":"string"}},"sessionFilter":{"type":"array","items":{"type":"string"}},"target":{"type":"string","enum":["dm","channel","both"]},"cleanupAfterResolve":{"type":"boolean"}},"additionalProperties":false},"agentComponents":{"type":"object","properties":{"enabled":{"type":"boolean"},"ttlMs":{"type":"integer","exclusiveMinimum":0,"maximum":86400000}},"additionalProperties":false},"slashCommand":{"type":"object","properties":{"ephemeral":{"type":"boolean"}},"additionalProperties":false},"threadBindings":{"type":"object","properties":{"enabled":{"type":"boolean"},"idleHours":{"type":"number","minimum":0},"maxAgeHours":{"type":"number","minimum":0},"spawnSessions":{"type":"boolean"},"defaultSpawnContext":{"type":"string","enum":["isolated","fork"]}},"additionalProperties":false},"intents":{"type":"object","properties":{"messageContent":{"type":"boolean"},"presence":{"type":"boolean"},"guildMembers":{"type":"boolean"},"voiceStates":{"type":"boolean"}},"additionalProperties":false},"voice":{"type":"object","properties":{"enabled":{"type":"boolean"},"mode":{"type":"string","enum":["stt-tts","agent-proxy","bidi"]},"agentSession":{"type":"object","properties":{"mode":{"type":"string","enum":["voice","target"]},"target":{"type":"string","minLength":1}},"additionalProperties":false},"model":{"type":"string","minLength":1},"realtime":{"type":"object","properties":{"provider":{"type":"string","minLength":1},"model":{"type":"string","minLength":1},"speakerVoice":{"type":"string","minLength":1},"speakerVoiceId":{"type":"string","minLength":1},"instructions":{"type":"string","minLength":1},"toolPolicy":{"type":"string","enum":["safe-read-only","owner","none"]},"consultPolicy":{"type":"string","enum":["auto","always"]},"requireWakeName":{"type":"boolean"},"wakeNames":{"minItems":1,"type":"array","items":{"type":"string","minLength":1,"pattern":"^\\s*[^a-z0-9]*[a-z0-9]+(?:[^a-z0-9]+[a-z0-9]+)?[^a-z0-9]*\\s*$"}},"bootstrapContextFiles":{"type":"array","items":{"type":"string","enum":["IDENTITY.md","USER.md","SOUL.md"]}},"bargeIn":{"type":"boolean"},"minBargeInAudioEndMs":{"type":"integer","minimum":0,"maximum":10000},"debounceMs":{"type":"integer","exclusiveMinimum":0,"maximum":10000},"providers":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}}},"additionalProperties":false},"autoJoin":{"type":"array","items":{"type":"object","properties":{"guildId":{"type":"string","minLength":1},"channelId":{"type":"string","minLength":1},"whenOccupied":{"type":"boolean"}},"required":["guildId","channelId"],"additionalProperties":false}},"followUsersEnabled":{"type":"boolean"},"followUsers":{"type":"array","items":{"type":"string","minLength":1}},"allowedChannels":{"type":"array","items":{"type":"object","properties":{"guildId":{"type":"string","minLength":1},"channelId":{"type":"string","minLength":1}},"required":["guildId","channelId"],"additionalProperties":false}},"daveEncryption":{"type":"boolean"},"decryptionFailureTolerance":{"type":"integer","minimum":0,"maximum":9007199254740991},"connectTimeoutMs":{"type":"integer","exclusiveMinimum":0,"maximum":120000},"reconnectGraceMs":{"type":"integer","exclusiveMinimum":0,"maximum":120000},"captureSilenceGraceMs":{"type":"integer","exclusiveMinimum":0,"maximum":30000},"tts":{"type":"object","properties":{"auto":{"type":"string","enum":["off","always","inbound","tagged"]},"enabled":{"type":"boolean"},"mode":{"type":"string","enum":["final","all"]},"provider":{"type":"string","minLength":1},"persona":{"type":"string"},"personas":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"label":{"type":"string"},"description":{"type":"string"},"provider":{"type":"string","minLength":1},"fallbackPolicy":{"anyOf":[{"type":"string","const":"preserve-persona"},{"type":"string","const":"provider-defaults"},{"type":"string","const":"fail"}]},"providers":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"apiKey":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"store"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false}]}]}},"additionalProperties":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"},{"type":"array","items":{}},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}]}}}},"additionalProperties":false}},"summaryModel":{"type":"string"},"modelOverrides":{"type":"object","properties":{"enabled":{"type":"boolean"},"allowText":{"type":"boolean"},"allowProvider":{"type":"boolean"},"allowVoice":{"type":"boolean"},"allowModelId":{"type":"boolean"},"allowVoiceSettings":{"type":"boolean"},"allowNormalization":{"type":"boolean"},"allowSeed":{"type":"boolean"}},"additionalProperties":false},"providers":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"apiKey":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"store"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false}]}]}},"additionalProperties":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"},{"type":"array","items":{}},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}]}}},"maxTextLength":{"type":"integer","minimum":1,"maximum":9007199254740991},"timeoutMs":{"type":"integer","minimum":1000,"maximum":120000}},"additionalProperties":false}},"additionalProperties":false},"pluralkit":{"type":"object","properties":{"enabled":{"type":"boolean"},"token":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"store"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false}]}]}},"additionalProperties":false},"ackReaction":{"type":"string"},"ackReactionScope":{"type":"string","enum":["group-mentions","group-all","direct","all","off","none"]},"activity":{"type":"string"},"status":{"type":"string","enum":["online","dnd","idle","invisible"]},"autoPresence":{"type":"object","properties":{"enabled":{"type":"boolean"},"intervalMs":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"minUpdateIntervalMs":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"additionalProperties":false},"activityType":{"anyOf":[{"type":"number","const":0},{"type":"number","const":1},{"type":"number","const":2},{"type":"number","const":3},{"type":"number","const":4},{"type":"number","const":5}]},"activityUrl":{"type":"string","format":"uri"},"inboundWorker":{"type":"object","properties":{"runTimeoutMs":{"type":"integer","minimum":0,"maximum":9007199254740991}},"additionalProperties":false},"accounts":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"name":{"type":"string"},"capabilities":{"type":"array","items":{"type":"string"}},"markdown":{"type":"object","properties":{"tables":{"type":"string","enum":["off","bullets","code","block"]}},"additionalProperties":false},"configWrites":{"type":"boolean"},"enabled":{"type":"boolean"},"dmPolicy":{"type":"string","enum":["pairing","allowlist","open","disabled"]},"allowFrom":{"type":"array","items":{"type":"string"}},"defaultTo":{"type":"string"},"groupPolicy":{"type":"string","enum":["open","disabled","allowlist"]},"mentionPatterns":{"type":"object","properties":{"mode":{"anyOf":[{"type":"string","const":"allow"},{"type":"string","const":"deny"}]},"allowIn":{"type":"array","items":{"type":"string"}},"denyIn":{"type":"array","items":{"type":"string"}}},"additionalProperties":false},"contextVisibility":{"type":"string","enum":["all","allowlist","allowlist_quote"]},"historyLimit":{"type":"integer","minimum":0,"maximum":9007199254740991},"dmHistoryLimit":{"type":"integer","minimum":0,"maximum":9007199254740991},"dms":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"historyLimit":{"type":"integer","minimum":0,"maximum":9007199254740991}},"additionalProperties":false}},"textChunkLimit":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"streaming":{"type":"object","properties":{"mode":{"type":"string","enum":["off","partial","block","progress"]},"chunkMode":{"type":"string","enum":["length","newline"]},"preview":{"type":"object","properties":{"chunk":{"type":"object","properties":{"minChars":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"maxChars":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"breakPreference":{"anyOf":[{"type":"string","const":"paragraph"},{"type":"string","const":"newline"},{"type":"string","const":"sentence"}]}},"additionalProperties":false},"toolProgress":{"type":"boolean"},"commandText":{"type":"string","enum":["raw","status"]}},"additionalProperties":false},"progress":{"type":"object","properties":{"label":{"anyOf":[{"type":"string"},{"type":"boolean","const":false}]},"labels":{"type":"array","items":{"type":"string"}},"maxLines":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"maxLineChars":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"toolProgress":{"type":"boolean"},"commandText":{"type":"string","enum":["raw","status"]},"commentary":{"type":"boolean"},"narration":{"type":"boolean"}},"additionalProperties":false},"block":{"type":"object","properties":{"enabled":{"type":"boolean"},"coalesce":{"type":"object","properties":{"minChars":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"maxChars":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"idleMs":{"type":"integer","minimum":0,"maximum":9007199254740991}},"additionalProperties":false}},"additionalProperties":false}},"additionalProperties":false},"heartbeatVisibility":{"type":"object","properties":{"showOk":{"type":"boolean"},"showAlerts":{"type":"boolean"},"useIndicator":{"type":"boolean"}},"additionalProperties":false},"healthMonitor":{"type":"object","properties":{"enabled":{"type":"boolean"}},"additionalProperties":false},"responsePrefix":{"type":"string"},"mediaMaxMb":{"type":"number","exclusiveMinimum":0},"replyToMode":{"anyOf":[{"type":"string","const":"off"},{"type":"string","const":"first"},{"type":"string","const":"all"},{"type":"string","const":"batched"}]},"joinIntro":{"type":"boolean"},"commands":{"type":"object","properties":{"native":{"anyOf":[{"type":"boolean"},{"type":"string","const":"auto"}]},"nativeSkills":{"anyOf":[{"type":"boolean"},{"type":"string","const":"auto"}]}},"additionalProperties":false},"token":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"store"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false}]}]},"applicationId":{"type":"string"},"activities":{"type":"object","properties":{"clientSecret":{"type":"string","minLength":1},"applicationId":{"type":"string","pattern":"^\\d+$"}},"additionalProperties":false},"proxy":{"type":"string"},"allowBots":{"anyOf":[{"type":"boolean"},{"type":"string","const":"mentions"}]},"botLoopProtection":{"type":"object","properties":{"enabled":{"type":"boolean"},"maxEventsPerWindow":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"windowSeconds":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"cooldownSeconds":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"additionalProperties":false},"dangerouslyAllowNameMatching":{"type":"boolean"},"mentionAliases":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string","pattern":"^\\d+$"}},"suppressEmbeds":{"type":"boolean"},"maxLinesPerMessage":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"actions":{"type":"object","properties":{"reactions":{"type":"boolean"},"stickers":{"type":"boolean"},"emojiUploads":{"type":"boolean"},"stickerUploads":{"type":"boolean"},"polls":{"type":"boolean"},"permissions":{"type":"boolean"},"messages":{"type":"boolean"},"threads":{"type":"boolean"},"pins":{"type":"boolean"},"search":{"type":"boolean"},"memberInfo":{"type":"boolean"},"roleInfo":{"type":"boolean"},"roles":{"type":"boolean"},"channelInfo":{"type":"boolean"},"voiceStatus":{"type":"boolean"},"events":{"type":"boolean"},"moderation":{"type":"boolean"},"channels":{"type":"boolean"},"presence":{"type":"boolean"}},"additionalProperties":false},"thread":{"type":"object","properties":{"inheritParent":{"type":"boolean"}},"additionalProperties":false},"dm":{"type":"object","properties":{"enabled":{"type":"boolean"},"groupEnabled":{"type":"boolean"},"groupChannels":{"type":"array","items":{"type":"string"}}},"additionalProperties":false},"guilds":{"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}},"slug":{"type":"string"},"ignoreOtherMentions":{"type":"boolean"},"reactionNotifications":{"type":"string","enum":["off","own","all","allowlist"]},"users":{"type":"array","items":{"type":"string"}},"roles":{"type":"array","items":{"type":"string"}},"presenceEvents":{"type":"object","properties":{"enabled":{"type":"boolean"},"channelId":{"type":"string","pattern":"^\\d+$"},"users":{"type":"array","items":{"type":"string","pattern":"^\\d+$"}},"reconnectSuppressSeconds":{"type":"integer","minimum":0,"maximum":9007199254740991},"burstLimit":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"burstWindowSeconds":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"required":["channelId"],"additionalProperties":false},"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}},"skills":{"type":"array","items":{"type":"string"}},"enabled":{"type":"boolean"},"systemPrompt":{"type":"string"},"ignoreOtherMentions":{"type":"boolean"},"users":{"type":"array","items":{"type":"string"}},"roles":{"type":"array","items":{"type":"string"}},"includeThreadStarter":{"type":"boolean"},"autoThread":{"type":"boolean"},"autoThreadName":{"type":"string","enum":["message","generated"]},"autoArchiveDuration":{"anyOf":[{"type":"string","enum":["60","1440","4320","10080"]},{"type":"number","const":60},{"type":"number","const":1440},{"type":"number","const":4320},{"type":"number","const":10080}]}},"additionalProperties":false}}},"additionalProperties":false}},"execApprovals":{"type":"object","properties":{"enabled":{"anyOf":[{"type":"boolean"},{"type":"string","const":"auto"}]},"approvers":{"type":"array","items":{"type":"string"}},"agentFilter":{"type":"array","items":{"type":"string"}},"sessionFilter":{"type":"array","items":{"type":"string"}},"target":{"type":"string","enum":["dm","channel","both"]},"cleanupAfterResolve":{"type":"boolean"}},"additionalProperties":false},"agentComponents":{"type":"object","properties":{"enabled":{"type":"boolean"},"ttlMs":{"type":"integer","exclusiveMinimum":0,"maximum":86400000}},"additionalProperties":false},"slashCommand":{"type":"object","properties":{"ephemeral":{"type":"boolean"}},"additionalProperties":false},"threadBindings":{"type":"object","properties":{"enabled":{"type":"boolean"},"idleHours":{"type":"number","minimum":0},"maxAgeHours":{"type":"number","minimum":0},"spawnSessions":{"type":"boolean"},"defaultSpawnContext":{"type":"string","enum":["isolated","fork"]}},"additionalProperties":false},"intents":{"type":"object","properties":{"messageContent":{"type":"boolean"},"presence":{"type":"boolean"},"guildMembers":{"type":"boolean"},"voiceStates":{"type":"boolean"}},"additionalProperties":false},"voice":{"type":"object","properties":{"enabled":{"type":"boolean"},"mode":{"type":"string","enum":["stt-tts","agent-proxy","bidi"]},"agentSession":{"type":"object","properties":{"mode":{"type":"string","enum":["voice","target"]},"target":{"type":"string","minLength":1}},"additionalProperties":false},"model":{"type":"string","minLength":1},"realtime":{"type":"object","properties":{"provider":{"type":"string","minLength":1},"model":{"type":"string","minLength":1},"speakerVoice":{"type":"string","minLength":1},"speakerVoiceId":{"type":"string","minLength":1},"instructions":{"type":"string","minLength":1},"toolPolicy":{"type":"string","enum":["safe-read-only","owner","none"]},"consultPolicy":{"type":"string","enum":["auto","always"]},"requireWakeName":{"type":"boolean"},"wakeNames":{"minItems":1,"type":"array","items":{"type":"string","minLength":1,"pattern":"^\\s*[^a-z0-9]*[a-z0-9]+(?:[^a-z0-9]+[a-z0-9]+)?[^a-z0-9]*\\s*$"}},"bootstrapContextFiles":{"type":"array","items":{"type":"string","enum":["IDENTITY.md","USER.md","SOUL.md"]}},"bargeIn":{"type":"boolean"},"minBargeInAudioEndMs":{"type":"integer","minimum":0,"maximum":10000},"debounceMs":{"type":"integer","exclusiveMinimum":0,"maximum":10000},"providers":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}}},"additionalProperties":false},"autoJoin":{"type":"array","items":{"type":"object","properties":{"guildId":{"type":"string","minLength":1},"channelId":{"type":"string","minLength":1},"whenOccupied":{"type":"boolean"}},"required":["guildId","channelId"],"additionalProperties":false}},"followUsersEnabled":{"type":"boolean"},"followUsers":{"type":"array","items":{"type":"string","minLength":1}},"allowedChannels":{"type":"array","items":{"type":"object","properties":{"guildId":{"type":"string","minLength":1},"channelId":{"type":"string","minLength":1}},"required":["guildId","channelId"],"additionalProperties":false}},"daveEncryption":{"type":"boolean"},"decryptionFailureTolerance":{"type":"integer","minimum":0,"maximum":9007199254740991},"connectTimeoutMs":{"type":"integer","exclusiveMinimum":0,"maximum":120000},"reconnectGraceMs":{"type":"integer","exclusiveMinimum":0,"maximum":120000},"captureSilenceGraceMs":{"type":"integer","exclusiveMinimum":0,"maximum":30000},"tts":{"type":"object","properties":{"auto":{"type":"string","enum":["off","always","inbound","tagged"]},"enabled":{"type":"boolean"},"mode":{"type":"string","enum":["final","all"]},"provider":{"type":"string","minLength":1},"persona":{"type":"string"},"personas":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"label":{"type":"string"},"description":{"type":"string"},"provider":{"type":"string","minLength":1},"fallbackPolicy":{"anyOf":[{"type":"string","const":"preserve-persona"},{"type":"string","const":"provider-defaults"},{"type":"string","const":"fail"}]},"providers":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"apiKey":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"store"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false}]}]}},"additionalProperties":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"},{"type":"array","items":{}},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}]}}}},"additionalProperties":false}},"summaryModel":{"type":"string"},"modelOverrides":{"type":"object","properties":{"enabled":{"type":"boolean"},"allowText":{"type":"boolean"},"allowProvider":{"type":"boolean"},"allowVoice":{"type":"boolean"},"allowModelId":{"type":"boolean"},"allowVoiceSettings":{"type":"boolean"},"allowNormalization":{"type":"boolean"},"allowSeed":{"type":"boolean"}},"additionalProperties":false},"providers":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"apiKey":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"store"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false}]}]}},"additionalProperties":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"},{"type":"array","items":{}},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}]}}},"maxTextLength":{"type":"integer","minimum":1,"maximum":9007199254740991},"timeoutMs":{"type":"integer","minimum":1000,"maximum":120000}},"additionalProperties":false}},"additionalProperties":false},"pluralkit":{"type":"object","properties":{"enabled":{"type":"boolean"},"token":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"store"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false}]}]}},"additionalProperties":false},"ackReaction":{"type":"string"},"ackReactionScope":{"type":"string","enum":["group-mentions","group-all","direct","all","off","none"]},"activity":{"type":"string"},"status":{"type":"string","enum":["online","dnd","idle","invisible"]},"autoPresence":{"type":"object","properties":{"enabled":{"type":"boolean"},"intervalMs":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"minUpdateIntervalMs":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"additionalProperties":false},"activityType":{"anyOf":[{"type":"number","const":0},{"type":"number","const":1},{"type":"number","const":2},{"type":"number","const":3},{"type":"number","const":4},{"type":"number","const":5}]},"activityUrl":{"type":"string","format":"uri"},"inboundWorker":{"type":"object","properties":{"runTimeoutMs":{"type":"integer","minimum":0,"maximum":9007199254740991}},"additionalProperties":false}},"additionalProperties":false}},"defaultAccount":{"type":"string"}},"required":["dmPolicy","groupPolicy"],"additionalProperties":false},"feishu":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"enabled":{"type":"boolean"},"defaultAccount":{"type":"string"},"stickerSets":{"type":"object","propertyNames":{"type":"string","pattern":"^(?!\\s)(?![\\s\\S]*\\s$)[^\\p{Cs}]{1,128}$"},"additionalProperties":{"type":"object","propertyNames":{"type":"string","pattern":"^(?!\\s)(?![\\s\\S]*\\s$)(?![\\s\\S]*\\.\\.)[^\\p{Cc}\\p{Cs}/\\\\]{1,512}$"},"additionalProperties":{"minItems":1,"maxItems":8,"type":"array","items":{"type":"string","pattern":"^(?!\\s)(?![\\s\\S]*\\s$)[^\\p{Cs}]{1,64}$"}},"maxProperties":256},"maxProperties":32},"appId":{"type":"string"},"appSecret":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"store"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false}]}]},"encryptKey":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"store"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false}]}]},"verificationToken":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"store"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false}]}]},"domain":{"default":"feishu","anyOf":[{"type":"string","enum":["feishu","lark"]},{"type":"string","format":"uri","pattern":"^https:\\/\\/.*"}]},"connectionMode":{"default":"websocket","type":"string","enum":["websocket","webhook"]},"webhookPath":{"default":"/feishu/events","type":"string"},"webhookHost":{"type":"string"},"webhookPort":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"capabilities":{"type":"array","items":{"type":"string"}},"markdown":{"type":"object","properties":{"mode":{"type":"string","enum":["native","escape","strip"]},"tableMode":{"type":"string","enum":["native","ascii","simple"]}},"additionalProperties":false},"configWrites":{"type":"boolean"},"contextVisibility":{"type":"string","enum":["all","allowlist","allowlist_quote"]},"replyToMode":{"anyOf":[{"type":"string","const":"off"},{"type":"string","const":"first"},{"type":"string","const":"all"},{"type":"string","const":"batched"}]},"responsePrefix":{"type":"string"},"dmPolicy":{"default":"pairing","type":"string","enum":["pairing","allowlist","open","disabled"]},"allowFrom":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"groupPolicy":{"anyOf":[{"type":"string","enum":["open","disabled","allowlist"]},{"type":"string","const":"allowall"}]},"groupAllowFrom":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"groupSenderAllowFrom":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"requireMention":{"type":"boolean"},"groups":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"requireMention":{"type":"boolean"},"tools":{"type":"object","properties":{"allow":{"type":"array","items":{"type":"string"}},"deny":{"type":"array","items":{"type":"string"}}},"additionalProperties":false},"skills":{"type":"array","items":{"type":"string"}},"enabled":{"type":"boolean"},"allowFrom":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"systemPrompt":{"type":"string"},"groupSessionScope":{"type":"string","enum":["group","group_sender","group_topic","group_topic_sender"]},"topicSessionMode":{"type":"string","enum":["disabled","enabled"]},"replyInThread":{"type":"string","enum":["disabled","enabled"]}},"additionalProperties":false}},"historyLimit":{"type":"integer","minimum":0,"maximum":9007199254740991},"dmHistoryLimit":{"type":"integer","minimum":0,"maximum":9007199254740991},"dms":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"enabled":{"type":"boolean"},"systemPrompt":{"type":"string"}},"additionalProperties":false}},"textChunkLimit":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"mediaMaxMb":{"type":"number","exclusiveMinimum":0},"httpTimeoutMs":{"type":"integer","exclusiveMinimum":0,"maximum":300000},"heartbeatVisibility":{"type":"object","properties":{"visibility":{"type":"string","enum":["visible","hidden"]},"intervalMs":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"additionalProperties":false},"renderMode":{"type":"string","enum":["auto","raw","card"]},"streaming":{"type":"object","properties":{"mode":{"type":"string","enum":["off","partial"]},"chunkMode":{"type":"string","enum":["length","newline"]},"block":{"type":"object","properties":{"enabled":{"type":"boolean"},"coalesce":{"type":"object","properties":{"minChars":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"maxChars":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"idleMs":{"type":"integer","minimum":0,"maximum":9007199254740991}},"additionalProperties":false}},"additionalProperties":false}},"additionalProperties":false},"tools":{"type":"object","properties":{"doc":{"type":"boolean"},"chat":{"type":"boolean"},"wiki":{"type":"boolean"},"drive":{"type":"boolean"},"perm":{"type":"boolean"},"scopes":{"type":"boolean"},"bitable":{"type":"boolean"}},"additionalProperties":false},"actions":{"type":"object","properties":{"reactions":{"type":"boolean"},"sticker":{"type":"boolean"}},"additionalProperties":false},"replyInThread":{"type":"string","enum":["disabled","enabled"]},"reactionNotifications":{"default":"own","type":"string","enum":["off","own","all"]},"typingIndicator":{"default":true,"type":"boolean"},"resolveSenderNames":{"default":true,"type":"boolean"},"allowBots":{"type":"boolean"},"vcAutoJoin":{"type":"boolean"},"tts":{"type":"object","properties":{"auto":{"type":"string","enum":["off","always","inbound","tagged"]},"enabled":{"type":"boolean"},"mode":{"type":"string","enum":["final","all"]},"provider":{"type":"string"},"persona":{"type":"string"},"personas":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}},"summaryModel":{"type":"string"},"modelOverrides":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},"providers":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}},"prefsPath":{"type":"string"},"maxTextLength":{"type":"integer","minimum":1,"maximum":9007199254740991},"timeoutMs":{"type":"integer","minimum":1000,"maximum":120000}},"additionalProperties":false},"groupSessionScope":{"type":"string","enum":["group","group_sender","group_topic","group_topic_sender"]},"topicSessionMode":{"type":"string","enum":["disabled","enabled"]},"dynamicAgentCreation":{"type":"object","properties":{"enabled":{"type":"boolean"},"workspaceTemplate":{"type":"string"},"agentDirTemplate":{"type":"string"},"maxAgents":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"additionalProperties":false},"accounts":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"enabled":{"type":"boolean"},"name":{"type":"string"},"appId":{"type":"string"},"appSecret":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"store"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false}]}]},"encryptKey":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"store"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false}]}]},"verificationToken":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"store"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false}]}]},"domain":{"anyOf":[{"type":"string","enum":["feishu","lark"]},{"type":"string","format":"uri","pattern":"^https:\\/\\/.*"}]},"connectionMode":{"type":"string","enum":["websocket","webhook"]},"webhookPath":{"type":"string"},"webhookHost":{"type":"string"},"webhookPort":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"capabilities":{"type":"array","items":{"type":"string"}},"markdown":{"type":"object","properties":{"mode":{"type":"string","enum":["native","escape","strip"]},"tableMode":{"type":"string","enum":["native","ascii","simple"]}},"additionalProperties":false},"configWrites":{"type":"boolean"},"contextVisibility":{"type":"string","enum":["all","allowlist","allowlist_quote"]},"replyToMode":{"anyOf":[{"type":"string","const":"off"},{"type":"string","const":"first"},{"type":"string","const":"all"},{"type":"string","const":"batched"}]},"responsePrefix":{"type":"string"},"dmPolicy":{"type":"string","enum":["pairing","allowlist","open","disabled"]},"allowFrom":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"groupPolicy":{"anyOf":[{"type":"string","enum":["open","disabled","allowlist"]},{"type":"string","const":"allowall"}]},"groupAllowFrom":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"groupSenderAllowFrom":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"requireMention":{"type":"boolean"},"groups":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"requireMention":{"type":"boolean"},"tools":{"type":"object","properties":{"allow":{"type":"array","items":{"type":"string"}},"deny":{"type":"array","items":{"type":"string"}}},"additionalProperties":false},"skills":{"type":"array","items":{"type":"string"}},"enabled":{"type":"boolean"},"allowFrom":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"systemPrompt":{"type":"string"},"groupSessionScope":{"type":"string","enum":["group","group_sender","group_topic","group_topic_sender"]},"topicSessionMode":{"type":"string","enum":["disabled","enabled"]},"replyInThread":{"type":"string","enum":["disabled","enabled"]}},"additionalProperties":false}},"historyLimit":{"type":"integer","minimum":0,"maximum":9007199254740991},"dmHistoryLimit":{"type":"integer","minimum":0,"maximum":9007199254740991},"dms":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"enabled":{"type":"boolean"},"systemPrompt":{"type":"string"}},"additionalProperties":false}},"textChunkLimit":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"mediaMaxMb":{"type":"number","exclusiveMinimum":0},"httpTimeoutMs":{"type":"integer","exclusiveMinimum":0,"maximum":300000},"heartbeatVisibility":{"type":"object","properties":{"visibility":{"type":"string","enum":["visible","hidden"]},"intervalMs":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"additionalProperties":false},"renderMode":{"type":"string","enum":["auto","raw","card"]},"streaming":{"type":"object","properties":{"mode":{"type":"string","enum":["off","partial"]},"chunkMode":{"type":"string","enum":["length","newline"]},"block":{"type":"object","properties":{"enabled":{"type":"boolean"},"coalesce":{"type":"object","properties":{"minChars":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"maxChars":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"idleMs":{"type":"integer","minimum":0,"maximum":9007199254740991}},"additionalProperties":false}},"additionalProperties":false}},"additionalProperties":false},"tools":{"type":"object","properties":{"doc":{"type":"boolean"},"chat":{"type":"boolean"},"wiki":{"type":"boolean"},"drive":{"type":"boolean"},"perm":{"type":"boolean"},"scopes":{"type":"boolean"},"bitable":{"type":"boolean"}},"additionalProperties":false},"actions":{"type":"object","properties":{"reactions":{"type":"boolean"},"sticker":{"type":"boolean"}},"additionalProperties":false},"replyInThread":{"type":"string","enum":["disabled","enabled"]},"reactionNotifications":{"type":"string","enum":["off","own","all"]},"typingIndicator":{"type":"boolean"},"resolveSenderNames":{"type":"boolean"},"allowBots":{"type":"boolean"},"vcAutoJoin":{"type":"boolean"},"tts":{"type":"object","properties":{"auto":{"type":"string","enum":["off","always","inbound","tagged"]},"enabled":{"type":"boolean"},"mode":{"type":"string","enum":["final","all"]},"provider":{"type":"string"},"persona":{"type":"string"},"personas":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}},"summaryModel":{"type":"string"},"modelOverrides":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},"providers":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}},"prefsPath":{"type":"string"},"maxTextLength":{"type":"integer","minimum":1,"maximum":9007199254740991},"timeoutMs":{"type":"integer","minimum":1000,"maximum":120000}},"additionalProperties":false},"groupSessionScope":{"type":"string","enum":["group","group_sender","group_topic","group_topic_sender"]},"topicSessionMode":{"type":"string","enum":["disabled","enabled"]}},"additionalProperties":false}}},"additionalProperties":false},"googlechat":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"name":{"type":"string"},"capabilities":{"type":"array","items":{"type":"string"}},"markdown":{"type":"object","properties":{"tables":{"type":"string","enum":["off","bullets","code","block"]}},"additionalProperties":false},"configWrites":{"type":"boolean"},"enabled":{"type":"boolean"},"dmPolicy":{"default":"pairing","type":"string","enum":["pairing","allowlist","open","disabled"]},"allowFrom":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"defaultTo":{"type":"string"},"groupAllowFrom":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"groupPolicy":{"default":"allowlist","type":"string","enum":["open","disabled","allowlist"]},"contextVisibility":{"type":"string","enum":["all","allowlist","allowlist_quote"]},"historyLimit":{"type":"integer","minimum":0,"maximum":9007199254740991},"dmHistoryLimit":{"type":"integer","minimum":0,"maximum":9007199254740991},"dms":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"historyLimit":{"type":"integer","minimum":0,"maximum":9007199254740991}},"additionalProperties":false}},"textChunkLimit":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"streaming":{"type":"object","properties":{"chunkMode":{"type":"string","enum":["length","newline"]},"block":{"type":"object","properties":{"enabled":{"type":"boolean"},"coalesce":{"type":"object","properties":{"minChars":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"maxChars":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"idleMs":{"type":"integer","minimum":0,"maximum":9007199254740991}},"additionalProperties":false}},"additionalProperties":false}},"additionalProperties":false},"heartbeatVisibility":{"type":"object","properties":{"showOk":{"type":"boolean"},"showAlerts":{"type":"boolean"},"useIndicator":{"type":"boolean"}},"additionalProperties":false},"healthMonitor":{"type":"object","properties":{"enabled":{"type":"boolean"}},"additionalProperties":false},"responsePrefix":{"type":"string"},"mediaMaxMb":{"type":"number","exclusiveMinimum":0},"replyToMode":{"anyOf":[{"type":"string","const":"off"},{"type":"string","const":"first"},{"type":"string","const":"all"},{"type":"string","const":"batched"}]},"allowBots":{"type":"boolean"},"botLoopProtection":{"type":"object","properties":{"enabled":{"type":"boolean"},"maxEventsPerWindow":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"windowSeconds":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"cooldownSeconds":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"additionalProperties":false},"dangerouslyAllowNameMatching":{"type":"boolean"},"requireMention":{"type":"boolean"},"groups":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"enabled":{"type":"boolean"},"requireMention":{"type":"boolean"},"botLoopProtection":{"type":"object","properties":{"enabled":{"type":"boolean"},"maxEventsPerWindow":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"windowSeconds":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"cooldownSeconds":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"additionalProperties":false},"users":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"systemPrompt":{"type":"string"}},"additionalProperties":false}},"serviceAccount":{"anyOf":[{"type":"string"},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"store"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false}]}]},"serviceAccountFile":{"type":"string"},"audienceType":{"type":"string","enum":["app-url","project-number"]},"audience":{"type":"string"},"appPrincipal":{"type":"string"},"webhookPath":{"type":"string"},"webhookUrl":{"type":"string"},"botUser":{"type":"string"},"dm":{"type":"object","properties":{"enabled":{"type":"boolean"}},"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"}},"markdown":{"type":"object","properties":{"tables":{"type":"string","enum":["off","bullets","code","block"]}},"additionalProperties":false},"configWrites":{"type":"boolean"},"enabled":{"type":"boolean"},"dmPolicy":{"type":"string","enum":["pairing","allowlist","open","disabled"]},"allowFrom":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"defaultTo":{"type":"string"},"groupAllowFrom":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"groupPolicy":{"type":"string","enum":["open","disabled","allowlist"]},"contextVisibility":{"type":"string","enum":["all","allowlist","allowlist_quote"]},"historyLimit":{"type":"integer","minimum":0,"maximum":9007199254740991},"dmHistoryLimit":{"type":"integer","minimum":0,"maximum":9007199254740991},"dms":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"historyLimit":{"type":"integer","minimum":0,"maximum":9007199254740991}},"additionalProperties":false}},"textChunkLimit":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"streaming":{"type":"object","properties":{"chunkMode":{"type":"string","enum":["length","newline"]},"block":{"type":"object","properties":{"enabled":{"type":"boolean"},"coalesce":{"type":"object","properties":{"minChars":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"maxChars":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"idleMs":{"type":"integer","minimum":0,"maximum":9007199254740991}},"additionalProperties":false}},"additionalProperties":false}},"additionalProperties":false},"heartbeatVisibility":{"type":"object","properties":{"showOk":{"type":"boolean"},"showAlerts":{"type":"boolean"},"useIndicator":{"type":"boolean"}},"additionalProperties":false},"healthMonitor":{"type":"object","properties":{"enabled":{"type":"boolean"}},"additionalProperties":false},"responsePrefix":{"type":"string"},"mediaMaxMb":{"type":"number","exclusiveMinimum":0},"replyToMode":{"anyOf":[{"type":"string","const":"off"},{"type":"string","const":"first"},{"type":"string","const":"all"},{"type":"string","const":"batched"}]},"allowBots":{"type":"boolean"},"botLoopProtection":{"type":"object","properties":{"enabled":{"type":"boolean"},"maxEventsPerWindow":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"windowSeconds":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"cooldownSeconds":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"additionalProperties":false},"dangerouslyAllowNameMatching":{"type":"boolean"},"requireMention":{"type":"boolean"},"groups":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"enabled":{"type":"boolean"},"requireMention":{"type":"boolean"},"botLoopProtection":{"type":"object","properties":{"enabled":{"type":"boolean"},"maxEventsPerWindow":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"windowSeconds":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"cooldownSeconds":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"additionalProperties":false},"users":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"systemPrompt":{"type":"string"}},"additionalProperties":false}},"serviceAccount":{"anyOf":[{"type":"string"},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"store"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false}]}]},"serviceAccountFile":{"type":"string"},"audienceType":{"type":"string","enum":["app-url","project-number"]},"audience":{"type":"string"},"appPrincipal":{"type":"string"},"webhookPath":{"type":"string"},"webhookUrl":{"type":"string"},"botUser":{"type":"string"},"dm":{"type":"object","properties":{"enabled":{"type":"boolean"}},"additionalProperties":false},"typingIndicator":{"type":"string","enum":["none","message","reaction"]}},"additionalProperties":false}},"defaultAccount":{"type":"string"}},"required":["dmPolicy","groupPolicy"],"additionalProperties":false},"imessage":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"name":{"type":"string"},"capabilities":{"type":"array","items":{"type":"string"}},"markdown":{"type":"object","properties":{"tables":{"type":"string","enum":["off","bullets","code","block"]}},"additionalProperties":false},"configWrites":{"type":"boolean"},"enabled":{"type":"boolean"},"dmPolicy":{"default":"pairing","type":"string","enum":["pairing","allowlist","open","disabled"]},"allowFrom":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"defaultTo":{"type":"string"},"groupAllowFrom":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"groupPolicy":{"default":"allowlist","type":"string","enum":["open","disabled","allowlist"]},"contextVisibility":{"type":"string","enum":["all","allowlist","allowlist_quote"]},"historyLimit":{"type":"integer","minimum":0,"maximum":9007199254740991},"dmHistoryLimit":{"type":"integer","minimum":0,"maximum":9007199254740991},"dms":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"historyLimit":{"type":"integer","minimum":0,"maximum":9007199254740991}},"additionalProperties":false}},"textChunkLimit":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"streaming":{"type":"object","properties":{"chunkMode":{"type":"string","enum":["length","newline"]},"block":{"type":"object","properties":{"enabled":{"type":"boolean"},"coalesce":{"type":"object","properties":{"minChars":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"maxChars":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"idleMs":{"type":"integer","minimum":0,"maximum":9007199254740991}},"additionalProperties":false}},"additionalProperties":false}},"additionalProperties":false},"heartbeatVisibility":{"type":"object","properties":{"showOk":{"type":"boolean"},"showAlerts":{"type":"boolean"},"useIndicator":{"type":"boolean"}},"additionalProperties":false},"healthMonitor":{"type":"object","properties":{"enabled":{"type":"boolean"}},"additionalProperties":false},"responsePrefix":{"type":"string"},"mediaMaxMb":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"cliPath":{"type":"string"},"dbPath":{"type":"string"},"remoteHost":{"type":"string"},"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"},"polls":{"type":"boolean"}},"additionalProperties":false},"service":{"anyOf":[{"type":"string","const":"imessage"},{"type":"string","const":"sms"},{"type":"string","const":"auto"}]},"sendTransport":{"type":"string","enum":["auto","bridge","applescript"]},"region":{"type":"string"},"includeAttachments":{"type":"boolean"},"attachmentRoots":{"type":"array","items":{"type":"string"}},"remoteAttachmentRoots":{"type":"array","items":{"type":"string"}},"probeTimeoutMs":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"sendReadReceipts":{"type":"boolean"},"reactionNotifications":{"type":"string","enum":["off","own","all"]},"catchup":{"type":"object","properties":{"enabled":{"type":"boolean"},"maxAgeMinutes":{"type":"integer","minimum":1,"maximum":720},"perRunLimit":{"type":"integer","minimum":1,"maximum":500},"firstRunLookbackMinutes":{"type":"integer","minimum":1,"maximum":720},"maxFailureRetries":{"type":"integer","minimum":1,"maximum":1000}},"additionalProperties":false},"groups":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"requireMention":{"type":"boolean"},"tools":{"type":"object","properties":{"allow":{"type":"array","items":{"type":"string"}},"alsoAllow":{"type":"array","items":{"type":"string"}},"deny":{"type":"array","items":{"type":"string"}}},"additionalProperties":false},"toolsBySender":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"allow":{"type":"array","items":{"type":"string"}},"alsoAllow":{"type":"array","items":{"type":"string"}},"deny":{"type":"array","items":{"type":"string"}}},"additionalProperties":false}},"systemPrompt":{"type":"string"}},"additionalProperties":false}},"accounts":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"name":{"type":"string"},"capabilities":{"type":"array","items":{"type":"string"}},"markdown":{"type":"object","properties":{"tables":{"type":"string","enum":["off","bullets","code","block"]}},"additionalProperties":false},"configWrites":{"type":"boolean"},"enabled":{"type":"boolean"},"dmPolicy":{"type":"string","enum":["pairing","allowlist","open","disabled"]},"allowFrom":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"defaultTo":{"type":"string"},"groupAllowFrom":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"groupPolicy":{"type":"string","enum":["open","disabled","allowlist"]},"contextVisibility":{"type":"string","enum":["all","allowlist","allowlist_quote"]},"historyLimit":{"type":"integer","minimum":0,"maximum":9007199254740991},"dmHistoryLimit":{"type":"integer","minimum":0,"maximum":9007199254740991},"dms":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"historyLimit":{"type":"integer","minimum":0,"maximum":9007199254740991}},"additionalProperties":false}},"textChunkLimit":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"streaming":{"type":"object","properties":{"chunkMode":{"type":"string","enum":["length","newline"]},"block":{"type":"object","properties":{"enabled":{"type":"boolean"},"coalesce":{"type":"object","properties":{"minChars":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"maxChars":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"idleMs":{"type":"integer","minimum":0,"maximum":9007199254740991}},"additionalProperties":false}},"additionalProperties":false}},"additionalProperties":false},"heartbeatVisibility":{"type":"object","properties":{"showOk":{"type":"boolean"},"showAlerts":{"type":"boolean"},"useIndicator":{"type":"boolean"}},"additionalProperties":false},"healthMonitor":{"type":"object","properties":{"enabled":{"type":"boolean"}},"additionalProperties":false},"responsePrefix":{"type":"string"},"mediaMaxMb":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"cliPath":{"type":"string"},"dbPath":{"type":"string"},"remoteHost":{"type":"string"},"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"},"polls":{"type":"boolean"}},"additionalProperties":false},"service":{"anyOf":[{"type":"string","const":"imessage"},{"type":"string","const":"sms"},{"type":"string","const":"auto"}]},"sendTransport":{"type":"string","enum":["auto","bridge","applescript"]},"region":{"type":"string"},"includeAttachments":{"type":"boolean"},"attachmentRoots":{"type":"array","items":{"type":"string"}},"remoteAttachmentRoots":{"type":"array","items":{"type":"string"}},"probeTimeoutMs":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"sendReadReceipts":{"type":"boolean"},"reactionNotifications":{"type":"string","enum":["off","own","all"]},"catchup":{"type":"object","properties":{"enabled":{"type":"boolean"},"maxAgeMinutes":{"type":"integer","minimum":1,"maximum":720},"perRunLimit":{"type":"integer","minimum":1,"maximum":500},"firstRunLookbackMinutes":{"type":"integer","minimum":1,"maximum":720},"maxFailureRetries":{"type":"integer","minimum":1,"maximum":1000}},"additionalProperties":false},"groups":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"requireMention":{"type":"boolean"},"tools":{"type":"object","properties":{"allow":{"type":"array","items":{"type":"string"}},"alsoAllow":{"type":"array","items":{"type":"string"}},"deny":{"type":"array","items":{"type":"string"}}},"additionalProperties":false},"toolsBySender":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"allow":{"type":"array","items":{"type":"string"}},"alsoAllow":{"type":"array","items":{"type":"string"}},"deny":{"type":"array","items":{"type":"string"}}},"additionalProperties":false}},"systemPrompt":{"type":"string"}},"additionalProperties":false}}},"additionalProperties":false}},"defaultAccount":{"type":"string"}},"required":["dmPolicy","groupPolicy"],"additionalProperties":false},"irc":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"name":{"type":"string"},"enabled":{"type":"boolean"},"configWrites":{"type":"boolean"},"replyToMode":{"anyOf":[{"type":"string","const":"off"},{"type":"string","const":"first"},{"type":"string","const":"all"},{"type":"string","const":"batched"}]},"dangerouslyAllowNameMatching":{"type":"boolean"},"host":{"type":"string"},"port":{"type":"integer","minimum":1,"maximum":65535},"tls":{"type":"boolean"},"nick":{"type":"string"},"username":{"type":"string"},"realname":{"type":"string"},"password":{"type":"string"},"passwordFile":{"type":"string"},"nickserv":{"type":"object","properties":{"enabled":{"type":"boolean"},"service":{"type":"string"},"password":{"type":"string"},"passwordFile":{"type":"string"},"register":{"type":"boolean"},"registerEmail":{"type":"string"}},"additionalProperties":false},"dmPolicy":{"default":"pairing","type":"string","enum":["pairing","allowlist","open","disabled"]},"allowFrom":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"groupPolicy":{"default":"allowlist","type":"string","enum":["open","disabled","allowlist"]},"groupAllowFrom":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"groups":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"requireMention":{"type":"boolean"},"tools":{"type":"object","properties":{"allow":{"type":"array","items":{"type":"string"}},"alsoAllow":{"type":"array","items":{"type":"string"}},"deny":{"type":"array","items":{"type":"string"}}},"additionalProperties":false},"toolsBySender":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"allow":{"type":"array","items":{"type":"string"}},"alsoAllow":{"type":"array","items":{"type":"string"}},"deny":{"type":"array","items":{"type":"string"}}},"additionalProperties":false}},"skills":{"type":"array","items":{"type":"string"}},"enabled":{"type":"boolean"},"allowFrom":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"systemPrompt":{"type":"string"}},"additionalProperties":false}},"channels":{"type":"array","items":{"type":"string"}},"markdown":{"type":"object","properties":{"tables":{"type":"string","enum":["off","bullets","code","block"]}},"additionalProperties":false},"historyLimit":{"type":"integer","minimum":0,"maximum":9007199254740991},"dmHistoryLimit":{"type":"integer","minimum":0,"maximum":9007199254740991},"contextVisibility":{"type":"string","enum":["all","allowlist","allowlist_quote"]},"dms":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"historyLimit":{"type":"integer","minimum":0,"maximum":9007199254740991}},"additionalProperties":false}},"textChunkLimit":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"streaming":{"type":"object","properties":{"chunkMode":{"type":"string","enum":["length","newline"]},"block":{"type":"object","properties":{"enabled":{"type":"boolean"},"coalesce":{"type":"object","properties":{"minChars":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"maxChars":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"idleMs":{"type":"integer","minimum":0,"maximum":9007199254740991}},"additionalProperties":false}},"additionalProperties":false}},"additionalProperties":false},"responsePrefix":{"type":"string"},"mediaMaxMb":{"type":"number","exclusiveMinimum":0},"accounts":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"name":{"type":"string"},"enabled":{"type":"boolean"},"configWrites":{"type":"boolean"},"replyToMode":{"anyOf":[{"type":"string","const":"off"},{"type":"string","const":"first"},{"type":"string","const":"all"},{"type":"string","const":"batched"}]},"dangerouslyAllowNameMatching":{"type":"boolean"},"host":{"type":"string"},"port":{"type":"integer","minimum":1,"maximum":65535},"tls":{"type":"boolean"},"nick":{"type":"string"},"username":{"type":"string"},"realname":{"type":"string"},"password":{"type":"string"},"passwordFile":{"type":"string"},"nickserv":{"type":"object","properties":{"enabled":{"type":"boolean"},"service":{"type":"string"},"password":{"type":"string"},"passwordFile":{"type":"string"},"register":{"type":"boolean"},"registerEmail":{"type":"string"}},"additionalProperties":false},"dmPolicy":{"default":"pairing","type":"string","enum":["pairing","allowlist","open","disabled"]},"allowFrom":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"groupPolicy":{"default":"allowlist","type":"string","enum":["open","disabled","allowlist"]},"groupAllowFrom":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"groups":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"requireMention":{"type":"boolean"},"tools":{"type":"object","properties":{"allow":{"type":"array","items":{"type":"string"}},"alsoAllow":{"type":"array","items":{"type":"string"}},"deny":{"type":"array","items":{"type":"string"}}},"additionalProperties":false},"toolsBySender":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"allow":{"type":"array","items":{"type":"string"}},"alsoAllow":{"type":"array","items":{"type":"string"}},"deny":{"type":"array","items":{"type":"string"}}},"additionalProperties":false}},"skills":{"type":"array","items":{"type":"string"}},"enabled":{"type":"boolean"},"allowFrom":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"systemPrompt":{"type":"string"}},"additionalProperties":false}},"channels":{"type":"array","items":{"type":"string"}},"markdown":{"type":"object","properties":{"tables":{"type":"string","enum":["off","bullets","code","block"]}},"additionalProperties":false},"historyLimit":{"type":"integer","minimum":0,"maximum":9007199254740991},"dmHistoryLimit":{"type":"integer","minimum":0,"maximum":9007199254740991},"contextVisibility":{"type":"string","enum":["all","allowlist","allowlist_quote"]},"dms":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"historyLimit":{"type":"integer","minimum":0,"maximum":9007199254740991}},"additionalProperties":false}},"textChunkLimit":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"streaming":{"type":"object","properties":{"chunkMode":{"type":"string","enum":["length","newline"]},"block":{"type":"object","properties":{"enabled":{"type":"boolean"},"coalesce":{"type":"object","properties":{"minChars":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"maxChars":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"idleMs":{"type":"integer","minimum":0,"maximum":9007199254740991}},"additionalProperties":false}},"additionalProperties":false}},"additionalProperties":false},"responsePrefix":{"type":"string"},"mediaMaxMb":{"type":"number","exclusiveMinimum":0}},"required":["dmPolicy","groupPolicy"],"additionalProperties":false}},"defaultAccount":{"type":"string"}},"required":["dmPolicy","groupPolicy"],"additionalProperties":false},"line":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"enabled":{"type":"boolean"},"configWrites":{"type":"boolean"},"joinIntro":{"type":"boolean"},"historyLimit":{"type":"integer","minimum":0,"maximum":9007199254740991},"channelAccessToken":{"type":"string"},"channelSecret":{"type":"string"},"tokenFile":{"type":"string"},"secretFile":{"type":"string"},"name":{"type":"string"},"allowFrom":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"groupAllowFrom":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"dmPolicy":{"default":"pairing","type":"string","enum":["pairing","allowlist","open","disabled"]},"groupPolicy":{"default":"allowlist","type":"string","enum":["open","disabled","allowlist"]},"responsePrefix":{"type":"string"},"mediaMaxMb":{"type":"number"},"webhookPath":{"type":"string"},"threadBindings":{"type":"object","properties":{"enabled":{"type":"boolean"},"idleHours":{"type":"number"},"maxAgeHours":{"type":"number"},"spawnSessions":{"type":"boolean"},"defaultSpawnContext":{"type":"string","enum":["isolated","fork"]}},"additionalProperties":false},"groups":{"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}},"accounts":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"enabled":{"type":"boolean"},"configWrites":{"type":"boolean"},"joinIntro":{"type":"boolean"},"historyLimit":{"type":"integer","minimum":0,"maximum":9007199254740991},"channelAccessToken":{"type":"string"},"channelSecret":{"type":"string"},"tokenFile":{"type":"string"},"secretFile":{"type":"string"},"name":{"type":"string"},"allowFrom":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"groupAllowFrom":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"dmPolicy":{"default":"pairing","type":"string","enum":["pairing","allowlist","open","disabled"]},"groupPolicy":{"default":"allowlist","type":"string","enum":["open","disabled","allowlist"]},"responsePrefix":{"type":"string"},"mediaMaxMb":{"type":"number"},"webhookPath":{"type":"string"},"threadBindings":{"type":"object","properties":{"enabled":{"type":"boolean"},"idleHours":{"type":"number"},"maxAgeHours":{"type":"number"},"spawnSessions":{"type":"boolean"},"defaultSpawnContext":{"type":"string","enum":["isolated","fork"]}},"additionalProperties":false},"groups":{"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}}},"required":["dmPolicy","groupPolicy"],"additionalProperties":false}},"defaultAccount":{"type":"string"}},"required":["dmPolicy","groupPolicy"],"additionalProperties":false},"matrix":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"name":{"type":"string"},"enabled":{"type":"boolean"},"configWrites":{"type":"boolean"},"joinIntro":{"type":"boolean"},"defaultAccount":{"type":"string"},"accounts":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"joinIntro":{"type":"boolean"}},"additionalProperties":{}}},"markdown":{"type":"object","properties":{"tables":{"type":"string","enum":["off","bullets","code","block"]}},"additionalProperties":false},"homeserver":{"type":"string"},"network":{"type":"object","properties":{"dangerouslyAllowPrivateNetwork":{"type":"boolean"}},"additionalProperties":false},"proxy":{"type":"string"},"userId":{"type":"string"},"accessToken":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"store"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false}]}]},"password":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"store"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false}]}]},"deviceId":{"type":"string"},"deviceName":{"type":"string"},"avatarUrl":{"type":"string"},"initialSyncLimit":{"type":"number"},"encryption":{"type":"boolean"},"allowlistOnly":{"type":"boolean"},"dangerouslyAllowNameMatching":{"type":"boolean"},"allowBots":{"anyOf":[{"type":"boolean"},{"type":"string","const":"mentions"}]},"botLoopProtection":{"type":"object","properties":{"enabled":{"type":"boolean"},"maxEventsPerWindow":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"windowSeconds":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"cooldownSeconds":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"additionalProperties":false},"groupPolicy":{"type":"string","enum":["open","disabled","allowlist"]},"mentionPatterns":{"type":"object","properties":{"mode":{"anyOf":[{"type":"string","const":"allow"},{"type":"string","const":"deny"}]},"allowIn":{"type":"array","items":{"type":"string"}},"denyIn":{"type":"array","items":{"type":"string"}}},"additionalProperties":false},"contextVisibility":{"type":"string","enum":["all","allowlist","allowlist_quote"]},"streaming":{"type":"object","properties":{"mode":{"type":"string","enum":["partial","quiet","progress","off"]},"chunkMode":{"type":"string","enum":["length","newline"]},"block":{"type":"object","properties":{"enabled":{"type":"boolean"},"coalesce":{"type":"object","properties":{"minChars":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"maxChars":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"idleMs":{"type":"integer","minimum":0,"maximum":9007199254740991}},"additionalProperties":false}},"additionalProperties":false},"progress":{"type":"object","properties":{"label":{"anyOf":[{"type":"string"},{"type":"boolean","const":false}]},"labels":{"type":"array","items":{"type":"string"}},"maxLines":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"maxLineChars":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"toolProgress":{"type":"boolean"},"commandText":{"type":"string","enum":["raw","status"]}},"additionalProperties":false},"preview":{"type":"object","properties":{"toolProgress":{"type":"boolean"}},"additionalProperties":false}},"additionalProperties":false},"replyToMode":{"type":"string","enum":["off","first","all","batched"]},"threadReplies":{"type":"string","enum":["off","inbound","always"]},"textChunkLimit":{"type":"number"},"responsePrefix":{"type":"string"},"ackReaction":{"type":"string"},"ackReactionScope":{"type":"string","enum":["group-mentions","group-all","direct","all","none","off"]},"reactionNotifications":{"type":"string","enum":["off","own"]},"threadBindings":{"type":"object","properties":{"enabled":{"type":"boolean"},"idleHours":{"type":"number","minimum":0},"maxAgeHours":{"type":"number","minimum":0},"spawnSessions":{"type":"boolean"},"defaultSpawnContext":{"type":"string","enum":["isolated","fork"]}},"additionalProperties":false},"startupVerification":{"type":"string","enum":["off","if-unverified"]},"startupVerificationCooldownHours":{"type":"number"},"mediaMaxMb":{"type":"number"},"historyLimit":{"type":"integer","minimum":0,"maximum":9007199254740991},"autoJoin":{"type":"string","enum":["always","allowlist","off"]},"autoJoinAllowlist":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"groupAllowFrom":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"dm":{"type":"object","properties":{"enabled":{"type":"boolean"},"policy":{"type":"string","enum":["pairing","allowlist","open","disabled"]},"allowFrom":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"sessionScope":{"type":"string","enum":["per-user","per-room"]},"threadReplies":{"type":"string","enum":["off","inbound","always"]}},"additionalProperties":false},"execApprovals":{"type":"object","properties":{"enabled":{"anyOf":[{"type":"boolean"},{"type":"string","const":"auto"}]},"approvers":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"agentFilter":{"type":"array","items":{"type":"string"}},"sessionFilter":{"type":"array","items":{"type":"string"}},"target":{"type":"string","enum":["dm","channel","both"]}},"additionalProperties":false},"groups":{"type":"object","properties":{},"additionalProperties":{"type":"object","properties":{"requireMention":{"type":"boolean"},"tools":{"type":"object","properties":{"allow":{"type":"array","items":{"type":"string"}},"alsoAllow":{"type":"array","items":{"type":"string"}},"deny":{"type":"array","items":{"type":"string"}}},"additionalProperties":false},"skills":{"type":"array","items":{"type":"string"}},"enabled":{"type":"boolean"},"systemPrompt":{"type":"string"},"account":{"type":"string"},"allowBots":{"anyOf":[{"type":"boolean"},{"type":"string","const":"mentions"}]},"botLoopProtection":{"type":"object","properties":{"enabled":{"type":"boolean"},"maxEventsPerWindow":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"windowSeconds":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"cooldownSeconds":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"additionalProperties":false},"autoReply":{"type":"boolean"},"users":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}}},"additionalProperties":false}},"rooms":{"type":"object","properties":{},"additionalProperties":{"type":"object","properties":{"requireMention":{"type":"boolean"},"tools":{"type":"object","properties":{"allow":{"type":"array","items":{"type":"string"}},"alsoAllow":{"type":"array","items":{"type":"string"}},"deny":{"type":"array","items":{"type":"string"}}},"additionalProperties":false},"skills":{"type":"array","items":{"type":"string"}},"enabled":{"type":"boolean"},"systemPrompt":{"type":"string"},"account":{"type":"string"},"allowBots":{"anyOf":[{"type":"boolean"},{"type":"string","const":"mentions"}]},"botLoopProtection":{"type":"object","properties":{"enabled":{"type":"boolean"},"maxEventsPerWindow":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"windowSeconds":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"cooldownSeconds":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"additionalProperties":false},"autoReply":{"type":"boolean"},"users":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}}},"additionalProperties":false}},"actions":{"type":"object","properties":{"reactions":{"type":"boolean"},"messages":{"type":"boolean"},"pins":{"type":"boolean"},"profile":{"type":"boolean"},"memberInfo":{"type":"boolean"},"channelInfo":{"type":"boolean"},"verification":{"type":"boolean"}},"additionalProperties":false}},"additionalProperties":false},"mattermost":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"name":{"type":"string"},"capabilities":{"type":"array","items":{"type":"string"}},"dangerouslyAllowNameMatching":{"type":"boolean"},"markdown":{"type":"object","properties":{"tables":{"type":"string","enum":["off","bullets","code","block"]}},"additionalProperties":false},"enabled":{"type":"boolean"},"configWrites":{"type":"boolean"},"contextVisibility":{"type":"string","enum":["all","allowlist","allowlist_quote"]},"historyLimit":{"type":"integer","minimum":0,"maximum":9007199254740991},"mediaMaxMb":{"type":"number","exclusiveMinimum":0},"botToken":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"store"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false}]}]},"baseUrl":{"type":"string"},"chatmode":{"type":"string","enum":["oncall","onmessage","onchar"]},"oncharPrefixes":{"type":"array","items":{"type":"string"}},"requireMention":{"type":"boolean"},"implicitMentions":{"type":"object","properties":{"replyToBot":{"type":"boolean"},"quotedBot":{"type":"boolean"},"threadParticipation":{"type":"boolean"}},"additionalProperties":false},"dmPolicy":{"default":"pairing","type":"string","enum":["pairing","allowlist","open","disabled"]},"allowFrom":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"groupAllowFrom":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"groupPolicy":{"default":"allowlist","type":"string","enum":["open","disabled","allowlist"]},"textChunkLimit":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"streaming":{"type":"object","properties":{"mode":{"type":"string","enum":["off","partial","block","progress"]},"chunkMode":{"type":"string","enum":["length","newline"]},"preview":{"type":"object","properties":{"toolProgress":{"type":"boolean"},"commandText":{"type":"string","enum":["raw","status"]}},"additionalProperties":false},"progress":{"type":"object","properties":{"label":{"anyOf":[{"type":"string"},{"type":"boolean","const":false}]},"labels":{"type":"array","items":{"type":"string"}},"maxLines":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"maxLineChars":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"toolProgress":{"type":"boolean"},"commandText":{"type":"string","enum":["raw","status"]}},"additionalProperties":false},"block":{"type":"object","properties":{"enabled":{"type":"boolean"},"coalesce":{"type":"object","properties":{"minChars":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"maxChars":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"idleMs":{"type":"integer","minimum":0,"maximum":9007199254740991}},"additionalProperties":false}},"additionalProperties":false}},"additionalProperties":false},"replyToMode":{"type":"string","enum":["off","first","all","batched"]},"replyToModeByChatType":{"type":"object","properties":{"direct":{"type":"string","enum":["off","first","all","batched"]},"group":{"type":"string","enum":["off","first","all","batched"]},"channel":{"type":"string","enum":["off","first","all","batched"]}},"additionalProperties":false},"responsePrefix":{"type":"string"},"actions":{"type":"object","properties":{"messages":{"type":"boolean"},"reactions":{"type":"boolean"}},"additionalProperties":false},"commands":{"type":"object","properties":{"native":{"anyOf":[{"type":"boolean"},{"type":"string","const":"auto"}]},"nativeSkills":{"anyOf":[{"type":"boolean"},{"type":"string","const":"auto"}]},"callbackPath":{"type":"string"},"callbackUrl":{"type":"string"}},"additionalProperties":false},"interactions":{"type":"object","properties":{"callbackBaseUrl":{"type":"string"},"allowedSourceIps":{"type":"array","items":{"type":"string"}}},"additionalProperties":false},"groups":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"requireMention":{"type":"boolean"}},"additionalProperties":false}},"network":{"type":"object","properties":{"dangerouslyAllowPrivateNetwork":{"type":"boolean"}},"additionalProperties":false},"dmChannelRetry":{"type":"object","properties":{"maxRetries":{"type":"integer","minimum":0,"maximum":10},"initialDelayMs":{"type":"integer","minimum":100,"maximum":60000},"maxDelayMs":{"type":"integer","minimum":1000,"maximum":60000},"timeoutMs":{"type":"integer","minimum":5000,"maximum":120000}},"additionalProperties":false},"accounts":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"name":{"type":"string"},"capabilities":{"type":"array","items":{"type":"string"}},"dangerouslyAllowNameMatching":{"type":"boolean"},"markdown":{"type":"object","properties":{"tables":{"type":"string","enum":["off","bullets","code","block"]}},"additionalProperties":false},"enabled":{"type":"boolean"},"configWrites":{"type":"boolean"},"contextVisibility":{"type":"string","enum":["all","allowlist","allowlist_quote"]},"historyLimit":{"type":"integer","minimum":0,"maximum":9007199254740991},"mediaMaxMb":{"type":"number","exclusiveMinimum":0},"botToken":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"store"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false}]}]},"baseUrl":{"type":"string"},"chatmode":{"type":"string","enum":["oncall","onmessage","onchar"]},"oncharPrefixes":{"type":"array","items":{"type":"string"}},"requireMention":{"type":"boolean"},"implicitMentions":{"type":"object","properties":{"replyToBot":{"type":"boolean"},"quotedBot":{"type":"boolean"},"threadParticipation":{"type":"boolean"}},"additionalProperties":false},"dmPolicy":{"default":"pairing","type":"string","enum":["pairing","allowlist","open","disabled"]},"allowFrom":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"groupAllowFrom":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"groupPolicy":{"default":"allowlist","type":"string","enum":["open","disabled","allowlist"]},"textChunkLimit":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"streaming":{"type":"object","properties":{"mode":{"type":"string","enum":["off","partial","block","progress"]},"chunkMode":{"type":"string","enum":["length","newline"]},"preview":{"type":"object","properties":{"toolProgress":{"type":"boolean"},"commandText":{"type":"string","enum":["raw","status"]}},"additionalProperties":false},"progress":{"type":"object","properties":{"label":{"anyOf":[{"type":"string"},{"type":"boolean","const":false}]},"labels":{"type":"array","items":{"type":"string"}},"maxLines":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"maxLineChars":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"toolProgress":{"type":"boolean"},"commandText":{"type":"string","enum":["raw","status"]}},"additionalProperties":false},"block":{"type":"object","properties":{"enabled":{"type":"boolean"},"coalesce":{"type":"object","properties":{"minChars":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"maxChars":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"idleMs":{"type":"integer","minimum":0,"maximum":9007199254740991}},"additionalProperties":false}},"additionalProperties":false}},"additionalProperties":false},"replyToMode":{"type":"string","enum":["off","first","all","batched"]},"replyToModeByChatType":{"type":"object","properties":{"direct":{"type":"string","enum":["off","first","all","batched"]},"group":{"type":"string","enum":["off","first","all","batched"]},"channel":{"type":"string","enum":["off","first","all","batched"]}},"additionalProperties":false},"responsePrefix":{"type":"string"},"actions":{"type":"object","properties":{"messages":{"type":"boolean"},"reactions":{"type":"boolean"}},"additionalProperties":false},"commands":{"type":"object","properties":{"native":{"anyOf":[{"type":"boolean"},{"type":"string","const":"auto"}]},"nativeSkills":{"anyOf":[{"type":"boolean"},{"type":"string","const":"auto"}]},"callbackPath":{"type":"string"},"callbackUrl":{"type":"string"}},"additionalProperties":false},"interactions":{"type":"object","properties":{"callbackBaseUrl":{"type":"string"},"allowedSourceIps":{"type":"array","items":{"type":"string"}}},"additionalProperties":false},"groups":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"requireMention":{"type":"boolean"}},"additionalProperties":false}},"network":{"type":"object","properties":{"dangerouslyAllowPrivateNetwork":{"type":"boolean"}},"additionalProperties":false},"dmChannelRetry":{"type":"object","properties":{"maxRetries":{"type":"integer","minimum":0,"maximum":10},"initialDelayMs":{"type":"integer","minimum":100,"maximum":60000},"maxDelayMs":{"type":"integer","minimum":1000,"maximum":60000},"timeoutMs":{"type":"integer","minimum":5000,"maximum":120000}},"additionalProperties":false}},"required":["dmPolicy","groupPolicy"],"additionalProperties":false}},"defaultAccount":{"type":"string"}},"required":["dmPolicy","groupPolicy"],"additionalProperties":false},"msteams":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"capabilities":{"type":"array","items":{"type":"string"}},"markdown":{"type":"object","properties":{"tables":{"type":"string","enum":["off","bullets","code","block"]}},"additionalProperties":false},"configWrites":{"type":"boolean"},"enabled":{"type":"boolean"},"dmPolicy":{"default":"pairing","type":"string","enum":["pairing","allowlist","open","disabled"]},"allowFrom":{"type":"array","items":{"type":"string"}},"defaultTo":{"type":"string"},"groupAllowFrom":{"type":"array","items":{"type":"string"}},"groupPolicy":{"default":"allowlist","type":"string","enum":["open","disabled","allowlist"]},"contextVisibility":{"type":"string","enum":["all","allowlist","allowlist_quote"]},"historyLimit":{"type":"integer","minimum":0,"maximum":9007199254740991},"dmHistoryLimit":{"type":"integer","minimum":0,"maximum":9007199254740991},"dms":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"historyLimit":{"type":"integer","minimum":0,"maximum":9007199254740991}},"additionalProperties":false}},"textChunkLimit":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"streaming":{"type":"object","properties":{"mode":{"type":"string","enum":["off","partial","block","progress"]},"chunkMode":{"type":"string","enum":["length","newline"]},"preview":{"type":"object","properties":{"chunk":{"type":"object","properties":{"minChars":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"maxChars":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"breakPreference":{"anyOf":[{"type":"string","const":"paragraph"},{"type":"string","const":"newline"},{"type":"string","const":"sentence"}]}},"additionalProperties":false},"toolProgress":{"type":"boolean"},"commandText":{"type":"string","enum":["raw","status"]}},"additionalProperties":false},"progress":{"type":"object","properties":{"label":{"anyOf":[{"type":"string"},{"type":"boolean","const":false}]},"labels":{"type":"array","items":{"type":"string"}},"maxLines":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"maxLineChars":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"toolProgress":{"type":"boolean"},"commandText":{"type":"string","enum":["raw","status"]},"commentary":{"type":"boolean"},"narration":{"type":"boolean"}},"additionalProperties":false},"block":{"type":"object","properties":{"enabled":{"type":"boolean"},"coalesce":{"type":"object","properties":{"minChars":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"maxChars":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"idleMs":{"type":"integer","minimum":0,"maximum":9007199254740991}},"additionalProperties":false}},"additionalProperties":false}},"additionalProperties":false},"heartbeatVisibility":{"type":"object","properties":{"showOk":{"type":"boolean"},"showAlerts":{"type":"boolean"},"useIndicator":{"type":"boolean"}},"additionalProperties":false},"healthMonitor":{"type":"object","properties":{"enabled":{"type":"boolean"}},"additionalProperties":false},"responsePrefix":{"type":"string"},"mediaMaxMb":{"type":"number","exclusiveMinimum":0},"dangerouslyAllowNameMatching":{"type":"boolean"},"appId":{"type":"string"},"appPassword":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"store"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false}]}]},"tenantId":{"type":"string"},"cloud":{"type":"string","enum":["Public","USGov","USGovDoD","China"]},"serviceUrl":{"type":"string","format":"uri"},"authType":{"type":"string","enum":["secret","federated"]},"certificatePath":{"type":"string"},"certificateThumbprint":{"type":"string"},"useManagedIdentity":{"type":"boolean"},"managedIdentityClientId":{"type":"string"},"webhook":{"type":"object","properties":{"port":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"path":{"type":"string"}},"additionalProperties":false},"typingIndicator":{"type":"boolean"},"mediaAllowHosts":{"type":"array","items":{"type":"string"}},"mediaAuthAllowHosts":{"type":"array","items":{"type":"string"}},"graphMediaFallback":{"type":"boolean"},"requireMention":{"type":"boolean"},"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}},"sharePointSiteId":{"type":"string"},"welcomeCard":{"type":"boolean"},"promptStarters":{"type":"array","items":{"type":"string"}},"groupWelcomeCard":{"type":"boolean"},"feedbackEnabled":{"type":"boolean"},"feedbackReflection":{"type":"boolean"},"feedbackReflectionCooldownMs":{"type":"integer","minimum":0,"maximum":9007199254740991},"delegatedAuth":{"type":"object","properties":{"enabled":{"type":"boolean"},"scopes":{"type":"array","items":{"type":"string"}}},"additionalProperties":false},"sso":{"type":"object","properties":{"enabled":{"type":"boolean"},"connectionName":{"type":"string"}},"additionalProperties":false}},"required":["dmPolicy","groupPolicy"],"additionalProperties":false},"nextcloud-talk":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"name":{"type":"string"},"enabled":{"type":"boolean"},"configWrites":{"type":"boolean"},"replyToMode":{"anyOf":[{"type":"string","const":"off"},{"type":"string","const":"first"},{"type":"string","const":"all"},{"type":"string","const":"batched"}]},"markdown":{"type":"object","properties":{"tables":{"type":"string","enum":["off","bullets","code","block"]}},"additionalProperties":false},"baseUrl":{"type":"string"},"botSecret":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"store"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false}]}]},"botSecretFile":{"type":"string"},"apiUser":{"type":"string"},"apiPassword":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"store"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false}]}]},"apiPasswordFile":{"type":"string"},"dmPolicy":{"default":"pairing","type":"string","enum":["pairing","allowlist","open","disabled"]},"webhookPort":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"webhookHost":{"type":"string"},"webhookPath":{"type":"string"},"webhookPublicUrl":{"type":"string"},"allowFrom":{"type":"array","items":{"type":"string"}},"groupAllowFrom":{"type":"array","items":{"type":"string"}},"groupPolicy":{"default":"allowlist","type":"string","enum":["open","disabled","allowlist"]},"rooms":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"requireMention":{"type":"boolean"},"tools":{"type":"object","properties":{"allow":{"type":"array","items":{"type":"string"}},"alsoAllow":{"type":"array","items":{"type":"string"}},"deny":{"type":"array","items":{"type":"string"}}},"additionalProperties":false},"skills":{"type":"array","items":{"type":"string"}},"enabled":{"type":"boolean"},"allowFrom":{"type":"array","items":{"type":"string"}},"systemPrompt":{"type":"string"}},"additionalProperties":false}},"network":{"type":"object","properties":{"dangerouslyAllowPrivateNetwork":{"type":"boolean"}},"additionalProperties":false},"historyLimit":{"type":"integer","minimum":0,"maximum":9007199254740991},"dmHistoryLimit":{"type":"integer","minimum":0,"maximum":9007199254740991},"contextVisibility":{"type":"string","enum":["all","allowlist","allowlist_quote"]},"dms":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"historyLimit":{"type":"integer","minimum":0,"maximum":9007199254740991}},"additionalProperties":false}},"textChunkLimit":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"streaming":{"type":"object","properties":{"chunkMode":{"type":"string","enum":["length","newline"]},"block":{"type":"object","properties":{"enabled":{"type":"boolean"},"coalesce":{"type":"object","properties":{"minChars":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"maxChars":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"idleMs":{"type":"integer","minimum":0,"maximum":9007199254740991}},"additionalProperties":false}},"additionalProperties":false}},"additionalProperties":false},"responsePrefix":{"type":"string"},"mediaMaxMb":{"type":"number","exclusiveMinimum":0},"accounts":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"name":{"type":"string"},"enabled":{"type":"boolean"},"configWrites":{"type":"boolean"},"replyToMode":{"anyOf":[{"type":"string","const":"off"},{"type":"string","const":"first"},{"type":"string","const":"all"},{"type":"string","const":"batched"}]},"markdown":{"type":"object","properties":{"tables":{"type":"string","enum":["off","bullets","code","block"]}},"additionalProperties":false},"baseUrl":{"type":"string"},"botSecret":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"store"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false}]}]},"botSecretFile":{"type":"string"},"apiUser":{"type":"string"},"apiPassword":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"store"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false}]}]},"apiPasswordFile":{"type":"string"},"dmPolicy":{"default":"pairing","type":"string","enum":["pairing","allowlist","open","disabled"]},"webhookPort":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"webhookHost":{"type":"string"},"webhookPath":{"type":"string"},"webhookPublicUrl":{"type":"string"},"allowFrom":{"type":"array","items":{"type":"string"}},"groupAllowFrom":{"type":"array","items":{"type":"string"}},"groupPolicy":{"default":"allowlist","type":"string","enum":["open","disabled","allowlist"]},"rooms":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"requireMention":{"type":"boolean"},"tools":{"type":"object","properties":{"allow":{"type":"array","items":{"type":"string"}},"alsoAllow":{"type":"array","items":{"type":"string"}},"deny":{"type":"array","items":{"type":"string"}}},"additionalProperties":false},"skills":{"type":"array","items":{"type":"string"}},"enabled":{"type":"boolean"},"allowFrom":{"type":"array","items":{"type":"string"}},"systemPrompt":{"type":"string"}},"additionalProperties":false}},"network":{"type":"object","properties":{"dangerouslyAllowPrivateNetwork":{"type":"boolean"}},"additionalProperties":false},"historyLimit":{"type":"integer","minimum":0,"maximum":9007199254740991},"dmHistoryLimit":{"type":"integer","minimum":0,"maximum":9007199254740991},"contextVisibility":{"type":"string","enum":["all","allowlist","allowlist_quote"]},"dms":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"historyLimit":{"type":"integer","minimum":0,"maximum":9007199254740991}},"additionalProperties":false}},"textChunkLimit":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"streaming":{"type":"object","properties":{"chunkMode":{"type":"string","enum":["length","newline"]},"block":{"type":"object","properties":{"enabled":{"type":"boolean"},"coalesce":{"type":"object","properties":{"minChars":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"maxChars":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"idleMs":{"type":"integer","minimum":0,"maximum":9007199254740991}},"additionalProperties":false}},"additionalProperties":false}},"additionalProperties":false},"responsePrefix":{"type":"string"},"mediaMaxMb":{"type":"number","exclusiveMinimum":0}},"required":["dmPolicy","groupPolicy"],"additionalProperties":false}},"defaultAccount":{"type":"string"}},"required":["dmPolicy","groupPolicy"],"additionalProperties":false},"nostr":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"name":{"type":"string"},"defaultAccount":{"type":"string"},"enabled":{"type":"boolean"},"configWrites":{"type":"boolean"},"markdown":{"type":"object","properties":{"tables":{"type":"string","enum":["off","bullets","code","block"]}},"additionalProperties":false},"privateKey":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"store"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false}]}]},"relays":{"type":"array","items":{"type":"string"}},"dmPolicy":{"type":"string","enum":["pairing","allowlist","open","disabled"]},"allowFrom":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"profile":{"type":"object","properties":{"name":{"type":"string","maxLength":256},"displayName":{"type":"string","maxLength":256},"about":{"type":"string","maxLength":2000},"picture":{"type":"string","format":"uri"},"banner":{"type":"string","format":"uri"},"website":{"type":"string","format":"uri"},"nip05":{"type":"string"},"lud16":{"type":"string"}},"additionalProperties":false}},"additionalProperties":false},"qa-channel":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"name":{"type":"string"},"enabled":{"type":"boolean"},"configWrites":{"type":"boolean"},"mediaMaxMb":{"type":"number","exclusiveMinimum":0},"responsePrefix":{"type":"string"},"baseUrl":{"type":"string","format":"uri"},"botUserId":{"type":"string"},"botDisplayName":{"type":"string"},"pollTimeoutMs":{"type":"integer","minimum":100,"maximum":30000},"allowFrom":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"groupPolicy":{"type":"string","enum":["open","allowlist","disabled"]},"groupAllowFrom":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"groups":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"requireMention":{"type":"boolean"},"tools":{"type":"object","properties":{"allow":{"type":"array","items":{"type":"string"}},"alsoAllow":{"type":"array","items":{"type":"string"}},"deny":{"type":"array","items":{"type":"string"}}},"additionalProperties":false},"toolsBySender":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"allow":{"type":"array","items":{"type":"string"}},"alsoAllow":{"type":"array","items":{"type":"string"}},"deny":{"type":"array","items":{"type":"string"}}},"additionalProperties":false}}},"additionalProperties":false}},"defaultTo":{"type":"string"},"actions":{"type":"object","properties":{"messages":{"type":"boolean"},"reactions":{"type":"boolean"},"search":{"type":"boolean"},"threads":{"type":"boolean"}},"additionalProperties":false},"historyLimit":{"type":"integer","minimum":0,"maximum":9007199254740991},"accounts":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"name":{"type":"string"},"enabled":{"type":"boolean"},"configWrites":{"type":"boolean"},"mediaMaxMb":{"type":"number","exclusiveMinimum":0},"responsePrefix":{"type":"string"},"baseUrl":{"type":"string","format":"uri"},"botUserId":{"type":"string"},"botDisplayName":{"type":"string"},"pollTimeoutMs":{"type":"integer","minimum":100,"maximum":30000},"allowFrom":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"groupPolicy":{"type":"string","enum":["open","allowlist","disabled"]},"groupAllowFrom":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"groups":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"requireMention":{"type":"boolean"},"tools":{"type":"object","properties":{"allow":{"type":"array","items":{"type":"string"}},"alsoAllow":{"type":"array","items":{"type":"string"}},"deny":{"type":"array","items":{"type":"string"}}},"additionalProperties":false},"toolsBySender":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"allow":{"type":"array","items":{"type":"string"}},"alsoAllow":{"type":"array","items":{"type":"string"}},"deny":{"type":"array","items":{"type":"string"}}},"additionalProperties":false}}},"additionalProperties":false}},"defaultTo":{"type":"string"},"actions":{"type":"object","properties":{"messages":{"type":"boolean"},"reactions":{"type":"boolean"},"search":{"type":"boolean"},"threads":{"type":"boolean"}},"additionalProperties":false}},"additionalProperties":false}},"defaultAccount":{"type":"string"}},"additionalProperties":false},"raft":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"name":{"type":"string"},"enabled":{"type":"boolean"},"configWrites":{"type":"boolean"},"profile":{"type":"string","minLength":1},"accounts":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"name":{"type":"string"},"enabled":{"type":"boolean"},"configWrites":{"type":"boolean"},"profile":{"type":"string","minLength":1}},"additionalProperties":false}},"defaultAccount":{"type":"string"}},"additionalProperties":false},"reef":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"enabled":{"default":true,"type":"boolean"},"configWrites":{"type":"boolean"},"relayUrl":{"default":"https://reefwire.ai","type":"string","format":"uri","pattern":"^[hH][tT][tT][pP][sS]?:\\/\\/[^\\\\/?#@]+\\/?$"},"handle":{"type":"string","pattern":"^[a-z0-9][a-z0-9_-]{0,62}$"},"email":{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},"guard":{"type":"object","properties":{"provider":{"type":"string","enum":["anthropic","openai"]},"pinnedModel":{"type":"string","minLength":1},"apiKeyEnv":{"type":"string","pattern":"^[A-Z_][A-Z0-9_]*$"},"policyVersion":{"type":"string","minLength":1},"timeoutMs":{"type":"integer","minimum":100,"maximum":120000},"rules":{"type":"object","properties":{"outbound":{"type":"string","maxLength":2000,"pattern":"\\S"},"inbound":{"type":"string","maxLength":2000,"pattern":"\\S"}},"additionalProperties":false}},"required":["provider","pinnedModel","apiKeyEnv","policyVersion","timeoutMs"],"additionalProperties":false},"stateDir":{"type":"string","minLength":1},"requestPolicy":{"default":"code-only","type":"string","enum":["code-only","friends-of-friends","open"]},"friends":{}},"required":["enabled","relayUrl","requestPolicy"],"additionalProperties":false},"signal":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"name":{"type":"string"},"capabilities":{"type":"array","items":{"type":"string"}},"markdown":{"type":"object","properties":{"tables":{"type":"string","enum":["off","bullets","code","block"]}},"additionalProperties":false},"configWrites":{"type":"boolean"},"enabled":{"type":"boolean"},"dmPolicy":{"default":"pairing","type":"string","enum":["pairing","allowlist","open","disabled"]},"allowFrom":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"defaultTo":{"type":"string"},"groupAllowFrom":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"groupPolicy":{"default":"allowlist","type":"string","enum":["open","disabled","allowlist"]},"contextVisibility":{"type":"string","enum":["all","allowlist","allowlist_quote"]},"historyLimit":{"type":"integer","minimum":0,"maximum":9007199254740991},"dmHistoryLimit":{"type":"integer","minimum":0,"maximum":9007199254740991},"dms":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"historyLimit":{"type":"integer","minimum":0,"maximum":9007199254740991}},"additionalProperties":false}},"textChunkLimit":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"streaming":{"type":"object","properties":{"chunkMode":{"type":"string","enum":["length","newline"]},"block":{"type":"object","properties":{"enabled":{"type":"boolean"},"coalesce":{"type":"object","properties":{"minChars":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"maxChars":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"idleMs":{"type":"integer","minimum":0,"maximum":9007199254740991}},"additionalProperties":false}},"additionalProperties":false}},"additionalProperties":false},"heartbeatVisibility":{"type":"object","properties":{"showOk":{"type":"boolean"},"showAlerts":{"type":"boolean"},"useIndicator":{"type":"boolean"}},"additionalProperties":false},"healthMonitor":{"type":"object","properties":{"enabled":{"type":"boolean"}},"additionalProperties":false},"responsePrefix":{"type":"string"},"mediaMaxMb":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"replyToMode":{"anyOf":[{"type":"string","const":"off"},{"type":"string","const":"first"},{"type":"string","const":"all"},{"type":"string","const":"batched"}]},"account":{"type":"string"},"accountUuid":{"type":"string"},"transport":{"oneOf":[{"type":"object","properties":{"kind":{"type":"string","const":"managed-native"},"configPath":{"type":"string"},"url":{"type":"string","pattern":"^[Hh][Tt][Tt][Pp][Ss]?:\\/\\/(?![^/?#]*@)"},"httpHost":{"type":"string"},"httpPort":{"type":"integer","minimum":1,"maximum":65535},"cliPath":{"type":"string"},"startupTimeoutMs":{"type":"integer","minimum":1000,"maximum":120000},"receiveMode":{"anyOf":[{"type":"string","const":"on-start"},{"type":"string","const":"manual"}]},"ignoreStories":{"type":"boolean"}},"required":["kind"],"additionalProperties":false},{"type":"object","properties":{"kind":{"type":"string","const":"external-native"},"url":{"type":"string","pattern":"^[Hh][Tt][Tt][Pp][Ss]?:\\/\\/(?![^/?#]*@)"}},"required":["kind","url"],"additionalProperties":false},{"type":"object","properties":{"kind":{"type":"string","const":"container"},"url":{"type":"string","pattern":"^[Hh][Tt][Tt][Pp][Ss]?:\\/\\/(?![^/?#]*@)"}},"required":["kind","url"],"additionalProperties":false}]},"ignoreAttachments":{"type":"boolean"},"sendReadReceipts":{"type":"boolean"},"aliases":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"}},"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}},"ingest":{"type":"boolean"}},"additionalProperties":false}},"replyToModeByChatType":{"type":"object","properties":{"direct":{"anyOf":[{"type":"string","const":"off"},{"type":"string","const":"first"},{"type":"string","const":"all"},{"type":"string","const":"batched"}]},"group":{"anyOf":[{"type":"string","const":"off"},{"type":"string","const":"first"},{"type":"string","const":"all"},{"type":"string","const":"batched"}]}},"additionalProperties":false},"reactionNotifications":{"type":"string","enum":["off","own","all","allowlist"]},"reactionAllowlist":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"reactionLevel":{"type":"string","enum":["off","ack","minimal","extensive"]},"actions":{"type":"object","properties":{"reactions":{"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","block"]}},"additionalProperties":false},"configWrites":{"type":"boolean"},"enabled":{"type":"boolean"},"dmPolicy":{"type":"string","enum":["pairing","allowlist","open","disabled"]},"allowFrom":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"defaultTo":{"type":"string"},"groupAllowFrom":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"groupPolicy":{"type":"string","enum":["open","disabled","allowlist"]},"contextVisibility":{"type":"string","enum":["all","allowlist","allowlist_quote"]},"historyLimit":{"type":"integer","minimum":0,"maximum":9007199254740991},"dmHistoryLimit":{"type":"integer","minimum":0,"maximum":9007199254740991},"dms":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"historyLimit":{"type":"integer","minimum":0,"maximum":9007199254740991}},"additionalProperties":false}},"textChunkLimit":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"streaming":{"type":"object","properties":{"chunkMode":{"type":"string","enum":["length","newline"]},"block":{"type":"object","properties":{"enabled":{"type":"boolean"},"coalesce":{"type":"object","properties":{"minChars":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"maxChars":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"idleMs":{"type":"integer","minimum":0,"maximum":9007199254740991}},"additionalProperties":false}},"additionalProperties":false}},"additionalProperties":false},"heartbeatVisibility":{"type":"object","properties":{"showOk":{"type":"boolean"},"showAlerts":{"type":"boolean"},"useIndicator":{"type":"boolean"}},"additionalProperties":false},"healthMonitor":{"type":"object","properties":{"enabled":{"type":"boolean"}},"additionalProperties":false},"responsePrefix":{"type":"string"},"mediaMaxMb":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"replyToMode":{"anyOf":[{"type":"string","const":"off"},{"type":"string","const":"first"},{"type":"string","const":"all"},{"type":"string","const":"batched"}]},"account":{"type":"string"},"accountUuid":{"type":"string"},"transport":{"oneOf":[{"type":"object","properties":{"kind":{"type":"string","const":"managed-native"},"configPath":{"type":"string"},"url":{"type":"string","pattern":"^[Hh][Tt][Tt][Pp][Ss]?:\\/\\/(?![^/?#]*@)"},"httpHost":{"type":"string"},"httpPort":{"type":"integer","minimum":1,"maximum":65535},"cliPath":{"type":"string"},"startupTimeoutMs":{"type":"integer","minimum":1000,"maximum":120000},"receiveMode":{"anyOf":[{"type":"string","const":"on-start"},{"type":"string","const":"manual"}]},"ignoreStories":{"type":"boolean"}},"required":["kind"],"additionalProperties":false},{"type":"object","properties":{"kind":{"type":"string","const":"external-native"},"url":{"type":"string","pattern":"^[Hh][Tt][Tt][Pp][Ss]?:\\/\\/(?![^/?#]*@)"}},"required":["kind","url"],"additionalProperties":false},{"type":"object","properties":{"kind":{"type":"string","const":"container"},"url":{"type":"string","pattern":"^[Hh][Tt][Tt][Pp][Ss]?:\\/\\/(?![^/?#]*@)"}},"required":["kind","url"],"additionalProperties":false}]},"ignoreAttachments":{"type":"boolean"},"sendReadReceipts":{"type":"boolean"},"aliases":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"}},"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}},"ingest":{"type":"boolean"}},"additionalProperties":false}},"replyToModeByChatType":{"type":"object","properties":{"direct":{"anyOf":[{"type":"string","const":"off"},{"type":"string","const":"first"},{"type":"string","const":"all"},{"type":"string","const":"batched"}]},"group":{"anyOf":[{"type":"string","const":"off"},{"type":"string","const":"first"},{"type":"string","const":"all"},{"type":"string","const":"batched"}]}},"additionalProperties":false},"reactionNotifications":{"type":"string","enum":["off","own","all","allowlist"]},"reactionAllowlist":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"reactionLevel":{"type":"string","enum":["off","ack","minimal","extensive"]},"actions":{"type":"object","properties":{"reactions":{"type":"boolean"}},"additionalProperties":false}},"additionalProperties":false}},"defaultAccount":{"type":"string"}},"required":["dmPolicy","groupPolicy"],"additionalProperties":false},"slack":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"name":{"type":"string"},"capabilities":{"type":"array","items":{"type":"string"}},"markdown":{"type":"object","properties":{"tables":{"type":"string","enum":["off","bullets","code","block"]}},"additionalProperties":false},"configWrites":{"type":"boolean"},"enabled":{"type":"boolean"},"dmPolicy":{"default":"pairing","type":"string","enum":["pairing","allowlist","open","disabled"]},"allowFrom":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"defaultTo":{"type":"string"},"groupPolicy":{"default":"allowlist","type":"string","enum":["open","disabled","allowlist"]},"mentionPatterns":{"type":"object","properties":{"mode":{"anyOf":[{"type":"string","const":"allow"},{"type":"string","const":"deny"}]},"allowIn":{"type":"array","items":{"type":"string"}},"denyIn":{"type":"array","items":{"type":"string"}}},"additionalProperties":false},"contextVisibility":{"type":"string","enum":["all","allowlist","allowlist_quote"]},"historyLimit":{"type":"integer","minimum":0,"maximum":9007199254740991},"dmHistoryLimit":{"type":"integer","minimum":0,"maximum":9007199254740991},"dms":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"historyLimit":{"type":"integer","minimum":0,"maximum":9007199254740991}},"additionalProperties":false}},"textChunkLimit":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"streaming":{"type":"object","properties":{"mode":{"type":"string","enum":["off","partial","block","progress"]},"chunkMode":{"type":"string","enum":["length","newline"]},"preview":{"type":"object","properties":{"chunk":{"type":"object","properties":{"minChars":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"maxChars":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"breakPreference":{"anyOf":[{"type":"string","const":"paragraph"},{"type":"string","const":"newline"},{"type":"string","const":"sentence"}]}},"additionalProperties":false},"toolProgress":{"type":"boolean"},"commandText":{"type":"string","enum":["raw","status"]}},"additionalProperties":false},"progress":{"type":"object","properties":{"label":{"anyOf":[{"type":"string"},{"type":"boolean","const":false}]},"labels":{"type":"array","items":{"type":"string"}},"maxLines":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"maxLineChars":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"toolProgress":{"type":"boolean"},"commandText":{"type":"string","enum":["raw","status"]},"commentary":{"type":"boolean"},"narration":{"type":"boolean"},"style":{"type":"string","enum":["card","compact"]},"nativeTaskCards":{"type":"boolean"}},"additionalProperties":false},"block":{"type":"object","properties":{"enabled":{"type":"boolean"},"coalesce":{"type":"object","properties":{"minChars":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"maxChars":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"idleMs":{"type":"integer","minimum":0,"maximum":9007199254740991}},"additionalProperties":false}},"additionalProperties":false},"nativeTransport":{"type":"boolean"}},"additionalProperties":false},"heartbeatVisibility":{"type":"object","properties":{"showOk":{"type":"boolean"},"showAlerts":{"type":"boolean"},"useIndicator":{"type":"boolean"}},"additionalProperties":false},"healthMonitor":{"type":"object","properties":{"enabled":{"type":"boolean"}},"additionalProperties":false},"responsePrefix":{"type":"string"},"mediaMaxMb":{"type":"number","exclusiveMinimum":0},"replyToMode":{"anyOf":[{"type":"string","const":"off"},{"type":"string","const":"first"},{"type":"string","const":"all"},{"type":"string","const":"batched"}]},"joinIntro":{"type":"boolean"},"postAs":{"default":"bot","type":"string","enum":["bot","user"]},"mode":{"default":"socket","type":"string","enum":["socket","http","relay"]},"relay":{"type":"object","properties":{"url":{"type":"string"},"authToken":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"store"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false}]}]},"gatewayId":{"type":"string"}},"additionalProperties":false},"signingSecret":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"store"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false}]}]},"webhookPath":{"default":"/slack/events","type":"string"},"execApprovals":{"type":"object","properties":{"enabled":{"anyOf":[{"type":"boolean"},{"type":"string","const":"auto"}]},"approvers":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"agentFilter":{"type":"array","items":{"type":"string"}},"sessionFilter":{"type":"array","items":{"type":"string"}},"target":{"type":"string","enum":["dm","channel","both"]}},"additionalProperties":false},"commands":{"type":"object","properties":{"native":{"anyOf":[{"type":"boolean"},{"type":"string","const":"auto"}]},"nativeSkills":{"anyOf":[{"type":"boolean"},{"type":"string","const":"auto"}]}},"additionalProperties":false},"botToken":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"store"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false}]}]},"appToken":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"store"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false}]}]},"userToken":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"store"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false}]}]},"userTokenReadOnly":{"default":true,"type":"boolean"},"allowBots":{"anyOf":[{"type":"boolean"},{"type":"string","const":"mentions"}]},"botLoopProtection":{"type":"object","properties":{"enabled":{"type":"boolean"},"maxEventsPerWindow":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"windowSeconds":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"cooldownSeconds":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"additionalProperties":false},"dangerouslyAllowNameMatching":{"type":"boolean"},"requireMention":{"type":"boolean"},"implicitMentions":{"type":"object","properties":{"replyToBot":{"type":"boolean"},"quotedBot":{"type":"boolean"},"threadParticipation":{"type":"boolean"}},"additionalProperties":false},"unfurlLinks":{"type":"boolean"},"unfurlMedia":{"type":"boolean"},"reactionNotifications":{"type":"string","enum":["off","own","all","allowlist"]},"reactionAllowlist":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"ackReaction":{"type":"string"},"replyToModeByChatType":{"type":"object","properties":{"direct":{"anyOf":[{"type":"string","const":"off"},{"type":"string","const":"first"},{"type":"string","const":"all"},{"type":"string","const":"batched"}]},"group":{"anyOf":[{"type":"string","const":"off"},{"type":"string","const":"first"},{"type":"string","const":"all"},{"type":"string","const":"batched"}]},"channel":{"anyOf":[{"type":"string","const":"off"},{"type":"string","const":"first"},{"type":"string","const":"all"},{"type":"string","const":"batched"}]}},"additionalProperties":false},"thread":{"type":"object","properties":{"historyScope":{"type":"string","enum":["thread","channel"]},"inheritParent":{"type":"boolean"},"initialHistoryLimit":{"type":"integer","minimum":0,"maximum":9007199254740991}},"additionalProperties":false},"presenceEvents":{"type":"object","properties":{"mode":{"type":"string","enum":["off","auto","on"]},"prompt":{"type":"string","maxLength":20000}},"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"},"groupEnabled":{"type":"boolean"},"groupChannels":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}}},"additionalProperties":false},"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}},"skills":{"type":"array","items":{"type":"string"}},"enabled":{"type":"boolean"},"systemPrompt":{"type":"string"},"ignoreOtherMentions":{"type":"boolean"},"replyToMode":{"anyOf":[{"type":"string","const":"off"},{"type":"string","const":"first"},{"type":"string","const":"all"},{"type":"string","const":"batched"}]},"allowBots":{"anyOf":[{"type":"boolean"},{"type":"string","const":"mentions"}]},"botLoopProtection":{"type":"object","properties":{"enabled":{"type":"boolean"},"maxEventsPerWindow":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"windowSeconds":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"cooldownSeconds":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"additionalProperties":false},"users":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"presenceEvents":{"type":"object","properties":{"mode":{"type":"string","enum":["off","auto","on"]},"prompt":{"type":"string","maxLength":20000}},"additionalProperties":false}},"additionalProperties":false}},"typingReaction":{"type":"string"},"accounts":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"name":{"type":"string"},"capabilities":{"type":"array","items":{"type":"string"}},"markdown":{"type":"object","properties":{"tables":{"type":"string","enum":["off","bullets","code","block"]}},"additionalProperties":false},"configWrites":{"type":"boolean"},"enabled":{"type":"boolean"},"dmPolicy":{"type":"string","enum":["pairing","allowlist","open","disabled"]},"allowFrom":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"defaultTo":{"type":"string"},"groupPolicy":{"type":"string","enum":["open","disabled","allowlist"]},"mentionPatterns":{"type":"object","properties":{"mode":{"anyOf":[{"type":"string","const":"allow"},{"type":"string","const":"deny"}]},"allowIn":{"type":"array","items":{"type":"string"}},"denyIn":{"type":"array","items":{"type":"string"}}},"additionalProperties":false},"contextVisibility":{"type":"string","enum":["all","allowlist","allowlist_quote"]},"historyLimit":{"type":"integer","minimum":0,"maximum":9007199254740991},"dmHistoryLimit":{"type":"integer","minimum":0,"maximum":9007199254740991},"dms":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"historyLimit":{"type":"integer","minimum":0,"maximum":9007199254740991}},"additionalProperties":false}},"textChunkLimit":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"streaming":{"type":"object","properties":{"mode":{"type":"string","enum":["off","partial","block","progress"]},"chunkMode":{"type":"string","enum":["length","newline"]},"preview":{"type":"object","properties":{"chunk":{"type":"object","properties":{"minChars":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"maxChars":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"breakPreference":{"anyOf":[{"type":"string","const":"paragraph"},{"type":"string","const":"newline"},{"type":"string","const":"sentence"}]}},"additionalProperties":false},"toolProgress":{"type":"boolean"},"commandText":{"type":"string","enum":["raw","status"]}},"additionalProperties":false},"progress":{"type":"object","properties":{"label":{"anyOf":[{"type":"string"},{"type":"boolean","const":false}]},"labels":{"type":"array","items":{"type":"string"}},"maxLines":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"maxLineChars":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"toolProgress":{"type":"boolean"},"commandText":{"type":"string","enum":["raw","status"]},"commentary":{"type":"boolean"},"narration":{"type":"boolean"},"style":{"type":"string","enum":["card","compact"]},"nativeTaskCards":{"type":"boolean"}},"additionalProperties":false},"block":{"type":"object","properties":{"enabled":{"type":"boolean"},"coalesce":{"type":"object","properties":{"minChars":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"maxChars":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"idleMs":{"type":"integer","minimum":0,"maximum":9007199254740991}},"additionalProperties":false}},"additionalProperties":false},"nativeTransport":{"type":"boolean"}},"additionalProperties":false},"heartbeatVisibility":{"type":"object","properties":{"showOk":{"type":"boolean"},"showAlerts":{"type":"boolean"},"useIndicator":{"type":"boolean"}},"additionalProperties":false},"healthMonitor":{"type":"object","properties":{"enabled":{"type":"boolean"}},"additionalProperties":false},"responsePrefix":{"type":"string"},"mediaMaxMb":{"type":"number","exclusiveMinimum":0},"replyToMode":{"anyOf":[{"type":"string","const":"off"},{"type":"string","const":"first"},{"type":"string","const":"all"},{"type":"string","const":"batched"}]},"joinIntro":{"type":"boolean"},"postAs":{"type":"string","enum":["bot","user"]},"mode":{"type":"string","enum":["socket","http","relay"]},"relay":{"type":"object","properties":{"url":{"type":"string"},"authToken":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"store"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false}]}]},"gatewayId":{"type":"string"}},"additionalProperties":false},"signingSecret":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"store"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false}]}]},"webhookPath":{"type":"string"},"execApprovals":{"type":"object","properties":{"enabled":{"anyOf":[{"type":"boolean"},{"type":"string","const":"auto"}]},"approvers":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"agentFilter":{"type":"array","items":{"type":"string"}},"sessionFilter":{"type":"array","items":{"type":"string"}},"target":{"type":"string","enum":["dm","channel","both"]}},"additionalProperties":false},"commands":{"type":"object","properties":{"native":{"anyOf":[{"type":"boolean"},{"type":"string","const":"auto"}]},"nativeSkills":{"anyOf":[{"type":"boolean"},{"type":"string","const":"auto"}]}},"additionalProperties":false},"botToken":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"store"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false}]}]},"appToken":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"store"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false}]}]},"userToken":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"store"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false}]}]},"userTokenReadOnly":{"type":"boolean"},"allowBots":{"anyOf":[{"type":"boolean"},{"type":"string","const":"mentions"}]},"botLoopProtection":{"type":"object","properties":{"enabled":{"type":"boolean"},"maxEventsPerWindow":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"windowSeconds":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"cooldownSeconds":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"additionalProperties":false},"dangerouslyAllowNameMatching":{"type":"boolean"},"requireMention":{"type":"boolean"},"implicitMentions":{"type":"object","properties":{"replyToBot":{"type":"boolean"},"quotedBot":{"type":"boolean"},"threadParticipation":{"type":"boolean"}},"additionalProperties":false},"unfurlLinks":{"type":"boolean"},"unfurlMedia":{"type":"boolean"},"reactionNotifications":{"type":"string","enum":["off","own","all","allowlist"]},"reactionAllowlist":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"ackReaction":{"type":"string"},"replyToModeByChatType":{"type":"object","properties":{"direct":{"anyOf":[{"type":"string","const":"off"},{"type":"string","const":"first"},{"type":"string","const":"all"},{"type":"string","const":"batched"}]},"group":{"anyOf":[{"type":"string","const":"off"},{"type":"string","const":"first"},{"type":"string","const":"all"},{"type":"string","const":"batched"}]},"channel":{"anyOf":[{"type":"string","const":"off"},{"type":"string","const":"first"},{"type":"string","const":"all"},{"type":"string","const":"batched"}]}},"additionalProperties":false},"thread":{"type":"object","properties":{"historyScope":{"type":"string","enum":["thread","channel"]},"inheritParent":{"type":"boolean"},"initialHistoryLimit":{"type":"integer","minimum":0,"maximum":9007199254740991}},"additionalProperties":false},"presenceEvents":{"type":"object","properties":{"mode":{"type":"string","enum":["off","auto","on"]},"prompt":{"type":"string","maxLength":20000}},"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"},"groupEnabled":{"type":"boolean"},"groupChannels":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}}},"additionalProperties":false},"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}},"skills":{"type":"array","items":{"type":"string"}},"enabled":{"type":"boolean"},"systemPrompt":{"type":"string"},"ignoreOtherMentions":{"type":"boolean"},"replyToMode":{"anyOf":[{"type":"string","const":"off"},{"type":"string","const":"first"},{"type":"string","const":"all"},{"type":"string","const":"batched"}]},"allowBots":{"anyOf":[{"type":"boolean"},{"type":"string","const":"mentions"}]},"botLoopProtection":{"type":"object","properties":{"enabled":{"type":"boolean"},"maxEventsPerWindow":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"windowSeconds":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"cooldownSeconds":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"additionalProperties":false},"users":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"presenceEvents":{"type":"object","properties":{"mode":{"type":"string","enum":["off","auto","on"]},"prompt":{"type":"string","maxLength":20000}},"additionalProperties":false}},"additionalProperties":false}},"typingReaction":{"type":"string"}},"additionalProperties":false}},"defaultAccount":{"type":"string"}},"required":["dmPolicy","groupPolicy","postAs","mode","webhookPath","userTokenReadOnly"],"additionalProperties":false},"sms":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"name":{"type":"string"},"enabled":{"type":"boolean"},"configWrites":{"type":"boolean"},"mediaMaxMb":{"type":"number","exclusiveMinimum":0},"accountSid":{"type":"string"},"authToken":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"store"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false}]}]},"fromNumber":{"type":"string"},"messagingServiceSid":{"type":"string"},"defaultTo":{"type":"string"},"webhookPath":{"type":"string"},"publicWebhookUrl":{"type":"string"},"dangerouslyDisableSignatureValidation":{"type":"boolean"},"dmPolicy":{"default":"pairing","type":"string","enum":["pairing","allowlist","open","disabled"]},"allowFrom":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"textChunkLimit":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"accounts":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"name":{"type":"string"},"enabled":{"type":"boolean"},"configWrites":{"type":"boolean"},"mediaMaxMb":{"type":"number","exclusiveMinimum":0},"accountSid":{"type":"string"},"authToken":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"store"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false}]}]},"fromNumber":{"type":"string"},"messagingServiceSid":{"type":"string"},"defaultTo":{"type":"string"},"webhookPath":{"type":"string"},"publicWebhookUrl":{"type":"string"},"dangerouslyDisableSignatureValidation":{"type":"boolean"},"dmPolicy":{"default":"pairing","type":"string","enum":["pairing","allowlist","open","disabled"]},"allowFrom":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"textChunkLimit":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"required":["dmPolicy"],"additionalProperties":false}},"defaultAccount":{"type":"string"}},"required":["dmPolicy"],"additionalProperties":false},"synology-chat":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"webhookUrl":{"type":"string"},"dangerouslyAllowNameMatching":{"type":"boolean"},"dangerouslyAllowInheritedWebhookPath":{"type":"boolean"}},"additionalProperties":{}},"telegram":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"name":{"type":"string"},"capabilities":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"object","properties":{"inlineButtons":{"type":"string","enum":["off","dm","group","all","allowlist"]}},"additionalProperties":false}]},"markdown":{"type":"object","properties":{"tables":{"type":"string","enum":["off","bullets","code","block"]}},"additionalProperties":false},"configWrites":{"type":"boolean"},"enabled":{"type":"boolean"},"dmPolicy":{"default":"pairing","type":"string","enum":["pairing","allowlist","open","disabled"]},"allowFrom":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"defaultTo":{"anyOf":[{"type":"string"},{"type":"number"}]},"groupAllowFrom":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"groupPolicy":{"default":"allowlist","type":"string","enum":["open","disabled","allowlist"]},"mentionPatterns":{"type":"object","properties":{"mode":{"anyOf":[{"type":"string","const":"allow"},{"type":"string","const":"deny"}]},"allowIn":{"type":"array","items":{"type":"string"}},"denyIn":{"type":"array","items":{"type":"string"}}},"additionalProperties":false},"contextVisibility":{"type":"string","enum":["all","allowlist","allowlist_quote"]},"historyLimit":{"type":"integer","minimum":0,"maximum":9007199254740991},"dmHistoryLimit":{"type":"integer","minimum":0,"maximum":9007199254740991},"dms":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"historyLimit":{"type":"integer","minimum":0,"maximum":9007199254740991}},"additionalProperties":false}},"textChunkLimit":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"streaming":{"type":"object","properties":{"mode":{"type":"string","enum":["off","partial","block","progress"]},"chunkMode":{"type":"string","enum":["length","newline"]},"preview":{"type":"object","properties":{"chunk":{"type":"object","properties":{"minChars":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"maxChars":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"breakPreference":{"anyOf":[{"type":"string","const":"paragraph"},{"type":"string","const":"newline"},{"type":"string","const":"sentence"}]}},"additionalProperties":false},"toolProgress":{"type":"boolean"},"commandText":{"type":"string","enum":["raw","status"]}},"additionalProperties":false},"progress":{"type":"object","properties":{"label":{"anyOf":[{"type":"string"},{"type":"boolean","const":false}]},"labels":{"type":"array","items":{"type":"string"}},"maxLines":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"maxLineChars":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"toolProgress":{"type":"boolean"},"commandText":{"type":"string","enum":["raw","status"]},"commentary":{"type":"boolean"},"narration":{"type":"boolean"}},"additionalProperties":false},"block":{"type":"object","properties":{"enabled":{"type":"boolean"},"coalesce":{"type":"object","properties":{"minChars":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"maxChars":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"idleMs":{"type":"integer","minimum":0,"maximum":9007199254740991}},"additionalProperties":false}},"additionalProperties":false}},"additionalProperties":false},"heartbeatVisibility":{"type":"object","properties":{"showOk":{"type":"boolean"},"showAlerts":{"type":"boolean"},"useIndicator":{"type":"boolean"}},"additionalProperties":false},"healthMonitor":{"type":"object","properties":{"enabled":{"type":"boolean"}},"additionalProperties":false},"responsePrefix":{"type":"string"},"mediaMaxMb":{"type":"number","exclusiveMinimum":0},"replyToMode":{"anyOf":[{"type":"string","const":"off"},{"type":"string","const":"first"},{"type":"string","const":"all"},{"type":"string","const":"batched"}]},"joinIntro":{"type":"boolean"},"execApprovals":{"type":"object","properties":{"enabled":{"anyOf":[{"type":"boolean"},{"type":"string","const":"auto"}]},"approvers":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"agentFilter":{"type":"array","items":{"type":"string"}},"sessionFilter":{"type":"array","items":{"type":"string"}},"target":{"type":"string","enum":["dm","channel","both"]}},"additionalProperties":false},"commands":{"type":"object","properties":{"native":{"anyOf":[{"type":"boolean"},{"type":"string","const":"auto"}]},"nativeSkills":{"anyOf":[{"type":"boolean"},{"type":"string","const":"auto"}]}},"additionalProperties":false},"customCommands":{"type":"array","items":{"type":"object","properties":{"command":{"type":"string"},"description":{"type":"string"}},"required":["command","description"],"additionalProperties":false}},"botToken":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"store"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false}]}]},"tokenFile":{"type":"string"},"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"},"ingest":{"type":"boolean"},"disableAudioPreflight":{"type":"boolean"},"groupPolicy":{"type":"string","enum":["open","disabled","allowlist"]},"topics":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"requireMention":{"type":"boolean"},"ingest":{"type":"boolean"},"disableAudioPreflight":{"type":"boolean"},"groupPolicy":{"type":"string","enum":["open","disabled","allowlist"]},"skills":{"type":"array","items":{"type":"string"}},"enabled":{"type":"boolean"},"allowFrom":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"systemPrompt":{"type":"string"},"agentId":{"type":"string"},"errorPolicy":{"type":"string","enum":["always","once","silent"]}},"additionalProperties":false}},"errorPolicy":{"type":"string","enum":["always","once","silent"]}},"additionalProperties":false}},"direct":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"dmPolicy":{"type":"string","enum":["pairing","allowlist","open","disabled"]},"tools":{"type":"object","properties":{"allow":{"type":"array","items":{"type":"string"}},"alsoAllow":{"type":"array","items":{"type":"string"}},"deny":{"type":"array","items":{"type":"string"}}},"additionalProperties":false},"toolsBySender":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"allow":{"type":"array","items":{"type":"string"}},"alsoAllow":{"type":"array","items":{"type":"string"}},"deny":{"type":"array","items":{"type":"string"}}},"additionalProperties":false}},"skills":{"type":"array","items":{"type":"string"}},"enabled":{"type":"boolean"},"allowFrom":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"systemPrompt":{"type":"string"},"topics":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"requireMention":{"type":"boolean"},"ingest":{"type":"boolean"},"disableAudioPreflight":{"type":"boolean"},"groupPolicy":{"type":"string","enum":["open","disabled","allowlist"]},"skills":{"type":"array","items":{"type":"string"}},"enabled":{"type":"boolean"},"allowFrom":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"systemPrompt":{"type":"string"},"agentId":{"type":"string"},"errorPolicy":{"type":"string","enum":["always","once","silent"]}},"additionalProperties":false}},"errorPolicy":{"type":"string","enum":["always","once","silent"]},"requireTopic":{"type":"boolean"},"autoTopicLabel":{"anyOf":[{"type":"boolean"},{"type":"object","properties":{"enabled":{"type":"boolean"},"prompt":{"type":"string"}},"additionalProperties":false}]}},"additionalProperties":false}},"richMessages":{"type":"boolean"},"network":{"type":"object","properties":{"autoSelectFamily":{"type":"boolean"},"dnsResultOrder":{"type":"string","enum":["ipv4first","verbatim"]},"dangerouslyAllowPrivateNetwork":{"description":"Dangerous opt-in for trusted Telegram fake-IP or transparent-proxy environments where api.telegram.org resolves to private/internal/special-use addresses during media downloads.","type":"boolean"}},"additionalProperties":false},"proxy":{"type":"string"},"webhookUrl":{"description":"Public HTTPS webhook URL registered with Telegram for inbound updates. This must be internet-reachable and requires channels.telegram.webhookSecret.","type":"string"},"webhookSecret":{"description":"Secret token sent to Telegram during webhook registration and verified on inbound webhook requests. Telegram returns this value for verification; this is not the gateway auth token and not the bot token.","anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"store"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false}]}]},"webhookPath":{"description":"Local webhook route path served by the gateway listener. Defaults to /telegram-webhook.","type":"string"},"webhookHost":{"description":"Local bind host for the webhook listener. Defaults to 127.0.0.1; keep loopback unless you intentionally expose direct ingress.","type":"string"},"webhookPort":{"description":"Local bind port for the webhook listener. Defaults to 8787; set to 0 to let the OS assign an ephemeral port.","type":"integer","minimum":0,"maximum":9007199254740991},"webhookCertPath":{"description":"Path to the self-signed certificate (PEM) to upload to Telegram during webhook registration. Required for self-signed certs (direct IP or no domain).","type":"string"},"actions":{"type":"object","properties":{"reactions":{"type":"boolean"},"sendMessage":{"type":"boolean"},"poll":{"type":"boolean"},"deleteMessage":{"type":"boolean"},"editMessage":{"type":"boolean"},"sticker":{"type":"boolean"},"createForumTopic":{"type":"boolean"},"editForumTopic":{"type":"boolean"}},"additionalProperties":false},"threadBindings":{"type":"object","properties":{"enabled":{"type":"boolean"},"idleHours":{"type":"number","minimum":0},"maxAgeHours":{"type":"number","minimum":0},"spawnSessions":{"type":"boolean"},"defaultSpawnContext":{"type":"string","enum":["isolated","fork"]}},"additionalProperties":false},"reactionNotifications":{"type":"string","enum":["off","own","all"]},"reactionLevel":{"type":"string","enum":["off","ack","minimal","extensive"]},"ackReaction":{"type":"string"},"linkPreview":{"type":"boolean"},"silentErrorReplies":{"type":"boolean"},"errorPolicy":{"type":"string","enum":["always","once","silent"]},"apiRoot":{"type":"string","format":"uri"},"trustedLocalFileRoots":{"description":"Trusted local filesystem roots for self-hosted Telegram Bot API absolute file_path values. Only absolute paths under these roots are read directly; all other absolute paths are rejected.","type":"array","items":{"type":"string"}},"autoTopicLabel":{"anyOf":[{"type":"boolean"},{"type":"object","properties":{"enabled":{"type":"boolean"},"prompt":{"type":"string"}},"additionalProperties":false}]},"accounts":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"name":{"type":"string"},"capabilities":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"object","properties":{"inlineButtons":{"type":"string","enum":["off","dm","group","all","allowlist"]}},"additionalProperties":false}]},"markdown":{"type":"object","properties":{"tables":{"type":"string","enum":["off","bullets","code","block"]}},"additionalProperties":false},"configWrites":{"type":"boolean"},"enabled":{"type":"boolean"},"dmPolicy":{"type":"string","enum":["pairing","allowlist","open","disabled"]},"allowFrom":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"defaultTo":{"anyOf":[{"type":"string"},{"type":"number"}]},"groupAllowFrom":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"groupPolicy":{"type":"string","enum":["open","disabled","allowlist"]},"mentionPatterns":{"type":"object","properties":{"mode":{"anyOf":[{"type":"string","const":"allow"},{"type":"string","const":"deny"}]},"allowIn":{"type":"array","items":{"type":"string"}},"denyIn":{"type":"array","items":{"type":"string"}}},"additionalProperties":false},"contextVisibility":{"type":"string","enum":["all","allowlist","allowlist_quote"]},"historyLimit":{"type":"integer","minimum":0,"maximum":9007199254740991},"dmHistoryLimit":{"type":"integer","minimum":0,"maximum":9007199254740991},"dms":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"historyLimit":{"type":"integer","minimum":0,"maximum":9007199254740991}},"additionalProperties":false}},"textChunkLimit":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"streaming":{"type":"object","properties":{"mode":{"type":"string","enum":["off","partial","block","progress"]},"chunkMode":{"type":"string","enum":["length","newline"]},"preview":{"type":"object","properties":{"chunk":{"type":"object","properties":{"minChars":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"maxChars":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"breakPreference":{"anyOf":[{"type":"string","const":"paragraph"},{"type":"string","const":"newline"},{"type":"string","const":"sentence"}]}},"additionalProperties":false},"toolProgress":{"type":"boolean"},"commandText":{"type":"string","enum":["raw","status"]}},"additionalProperties":false},"progress":{"type":"object","properties":{"label":{"anyOf":[{"type":"string"},{"type":"boolean","const":false}]},"labels":{"type":"array","items":{"type":"string"}},"maxLines":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"maxLineChars":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"toolProgress":{"type":"boolean"},"commandText":{"type":"string","enum":["raw","status"]},"commentary":{"type":"boolean"},"narration":{"type":"boolean"}},"additionalProperties":false},"block":{"type":"object","properties":{"enabled":{"type":"boolean"},"coalesce":{"type":"object","properties":{"minChars":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"maxChars":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"idleMs":{"type":"integer","minimum":0,"maximum":9007199254740991}},"additionalProperties":false}},"additionalProperties":false}},"additionalProperties":false},"heartbeatVisibility":{"type":"object","properties":{"showOk":{"type":"boolean"},"showAlerts":{"type":"boolean"},"useIndicator":{"type":"boolean"}},"additionalProperties":false},"healthMonitor":{"type":"object","properties":{"enabled":{"type":"boolean"}},"additionalProperties":false},"responsePrefix":{"type":"string"},"mediaMaxMb":{"type":"number","exclusiveMinimum":0},"replyToMode":{"anyOf":[{"type":"string","const":"off"},{"type":"string","const":"first"},{"type":"string","const":"all"},{"type":"string","const":"batched"}]},"joinIntro":{"type":"boolean"},"execApprovals":{"type":"object","properties":{"enabled":{"anyOf":[{"type":"boolean"},{"type":"string","const":"auto"}]},"approvers":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"agentFilter":{"type":"array","items":{"type":"string"}},"sessionFilter":{"type":"array","items":{"type":"string"}},"target":{"type":"string","enum":["dm","channel","both"]}},"additionalProperties":false},"commands":{"type":"object","properties":{"native":{"anyOf":[{"type":"boolean"},{"type":"string","const":"auto"}]},"nativeSkills":{"anyOf":[{"type":"boolean"},{"type":"string","const":"auto"}]}},"additionalProperties":false},"customCommands":{"type":"array","items":{"type":"object","properties":{"command":{"type":"string"},"description":{"type":"string"}},"required":["command","description"],"additionalProperties":false}},"botToken":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"store"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false}]}]},"tokenFile":{"type":"string"},"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"},"ingest":{"type":"boolean"},"disableAudioPreflight":{"type":"boolean"},"groupPolicy":{"type":"string","enum":["open","disabled","allowlist"]},"topics":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"requireMention":{"type":"boolean"},"ingest":{"type":"boolean"},"disableAudioPreflight":{"type":"boolean"},"groupPolicy":{"type":"string","enum":["open","disabled","allowlist"]},"skills":{"type":"array","items":{"type":"string"}},"enabled":{"type":"boolean"},"allowFrom":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"systemPrompt":{"type":"string"},"agentId":{"type":"string"},"errorPolicy":{"type":"string","enum":["always","once","silent"]}},"additionalProperties":false}},"errorPolicy":{"type":"string","enum":["always","once","silent"]}},"additionalProperties":false}},"direct":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"dmPolicy":{"type":"string","enum":["pairing","allowlist","open","disabled"]},"tools":{"type":"object","properties":{"allow":{"type":"array","items":{"type":"string"}},"alsoAllow":{"type":"array","items":{"type":"string"}},"deny":{"type":"array","items":{"type":"string"}}},"additionalProperties":false},"toolsBySender":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"allow":{"type":"array","items":{"type":"string"}},"alsoAllow":{"type":"array","items":{"type":"string"}},"deny":{"type":"array","items":{"type":"string"}}},"additionalProperties":false}},"skills":{"type":"array","items":{"type":"string"}},"enabled":{"type":"boolean"},"allowFrom":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"systemPrompt":{"type":"string"},"topics":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"requireMention":{"type":"boolean"},"ingest":{"type":"boolean"},"disableAudioPreflight":{"type":"boolean"},"groupPolicy":{"type":"string","enum":["open","disabled","allowlist"]},"skills":{"type":"array","items":{"type":"string"}},"enabled":{"type":"boolean"},"allowFrom":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"systemPrompt":{"type":"string"},"agentId":{"type":"string"},"errorPolicy":{"type":"string","enum":["always","once","silent"]}},"additionalProperties":false}},"errorPolicy":{"type":"string","enum":["always","once","silent"]},"requireTopic":{"type":"boolean"},"autoTopicLabel":{"anyOf":[{"type":"boolean"},{"type":"object","properties":{"enabled":{"type":"boolean"},"prompt":{"type":"string"}},"additionalProperties":false}]}},"additionalProperties":false}},"richMessages":{"type":"boolean"},"network":{"type":"object","properties":{"autoSelectFamily":{"type":"boolean"},"dnsResultOrder":{"type":"string","enum":["ipv4first","verbatim"]},"dangerouslyAllowPrivateNetwork":{"description":"Dangerous opt-in for trusted Telegram fake-IP or transparent-proxy environments where api.telegram.org resolves to private/internal/special-use addresses during media downloads.","type":"boolean"}},"additionalProperties":false},"proxy":{"type":"string"},"webhookUrl":{"description":"Public HTTPS webhook URL registered with Telegram for inbound updates. This must be internet-reachable and requires channels.telegram.webhookSecret.","type":"string"},"webhookSecret":{"description":"Secret token sent to Telegram during webhook registration and verified on inbound webhook requests. Telegram returns this value for verification; this is not the gateway auth token and not the bot token.","anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"store"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false}]}]},"webhookPath":{"description":"Local webhook route path served by the gateway listener. Defaults to /telegram-webhook.","type":"string"},"webhookHost":{"description":"Local bind host for the webhook listener. Defaults to 127.0.0.1; keep loopback unless you intentionally expose direct ingress.","type":"string"},"webhookPort":{"description":"Local bind port for the webhook listener. Defaults to 8787; set to 0 to let the OS assign an ephemeral port.","type":"integer","minimum":0,"maximum":9007199254740991},"webhookCertPath":{"description":"Path to the self-signed certificate (PEM) to upload to Telegram during webhook registration. Required for self-signed certs (direct IP or no domain).","type":"string"},"actions":{"type":"object","properties":{"reactions":{"type":"boolean"},"sendMessage":{"type":"boolean"},"poll":{"type":"boolean"},"deleteMessage":{"type":"boolean"},"editMessage":{"type":"boolean"},"sticker":{"type":"boolean"},"createForumTopic":{"type":"boolean"},"editForumTopic":{"type":"boolean"}},"additionalProperties":false},"threadBindings":{"type":"object","properties":{"enabled":{"type":"boolean"},"idleHours":{"type":"number","minimum":0},"maxAgeHours":{"type":"number","minimum":0},"spawnSessions":{"type":"boolean"},"defaultSpawnContext":{"type":"string","enum":["isolated","fork"]}},"additionalProperties":false},"reactionNotifications":{"type":"string","enum":["off","own","all"]},"reactionLevel":{"type":"string","enum":["off","ack","minimal","extensive"]},"ackReaction":{"type":"string"},"linkPreview":{"type":"boolean"},"silentErrorReplies":{"type":"boolean"},"errorPolicy":{"type":"string","enum":["always","once","silent"]},"apiRoot":{"type":"string","format":"uri"},"trustedLocalFileRoots":{"description":"Trusted local filesystem roots for self-hosted Telegram Bot API absolute file_path values. Only absolute paths under these roots are read directly; all other absolute paths are rejected.","type":"array","items":{"type":"string"}},"autoTopicLabel":{"anyOf":[{"type":"boolean"},{"type":"object","properties":{"enabled":{"type":"boolean"},"prompt":{"type":"string"}},"additionalProperties":false}]}},"additionalProperties":false}},"defaultAccount":{"type":"string"}},"required":["dmPolicy","groupPolicy"],"additionalProperties":false},"tlon":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"name":{"type":"string"},"enabled":{"type":"boolean"},"configWrites":{"type":"boolean"},"mediaMaxMb":{"type":"number","exclusiveMinimum":0},"ship":{"type":"string","minLength":1},"url":{"type":"string"},"code":{"type":"string"},"network":{"type":"object","properties":{"dangerouslyAllowPrivateNetwork":{"type":"boolean"}},"additionalProperties":false},"groupChannels":{"type":"array","items":{"type":"string","minLength":1}},"dmAllowlist":{"type":"array","items":{"type":"string","minLength":1}},"groupInviteAllowlist":{"type":"array","items":{"type":"string","minLength":1}},"autoDiscoverChannels":{"type":"boolean"},"showModelSignature":{"type":"boolean"},"responsePrefix":{"type":"string"},"implicitMentions":{"type":"object","properties":{"replyToBot":{"type":"boolean"},"quotedBot":{"type":"boolean"},"threadParticipation":{"type":"boolean"}},"additionalProperties":false},"autoAcceptDmInvites":{"type":"boolean"},"autoAcceptGroupInvites":{"type":"boolean"},"ownerShip":{"type":"string","minLength":1},"historyLimit":{"type":"integer","minimum":0,"maximum":9007199254740991},"authorization":{"type":"object","properties":{"channelRules":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"mode":{"type":"string","enum":["restricted","open"]},"allowedShips":{"type":"array","items":{"type":"string","minLength":1}}},"additionalProperties":false}}},"additionalProperties":false},"defaultAuthorizedShips":{"type":"array","items":{"type":"string","minLength":1}},"accounts":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"name":{"type":"string"},"enabled":{"type":"boolean"},"configWrites":{"type":"boolean"},"mediaMaxMb":{"type":"number","exclusiveMinimum":0},"ship":{"type":"string","minLength":1},"url":{"type":"string"},"code":{"type":"string"},"network":{"type":"object","properties":{"dangerouslyAllowPrivateNetwork":{"type":"boolean"}},"additionalProperties":false},"groupChannels":{"type":"array","items":{"type":"string","minLength":1}},"dmAllowlist":{"type":"array","items":{"type":"string","minLength":1}},"groupInviteAllowlist":{"type":"array","items":{"type":"string","minLength":1}},"autoDiscoverChannels":{"type":"boolean"},"showModelSignature":{"type":"boolean"},"responsePrefix":{"type":"string"},"implicitMentions":{"type":"object","properties":{"replyToBot":{"type":"boolean"},"quotedBot":{"type":"boolean"},"threadParticipation":{"type":"boolean"}},"additionalProperties":false},"autoAcceptDmInvites":{"type":"boolean"},"autoAcceptGroupInvites":{"type":"boolean"},"ownerShip":{"type":"string","minLength":1}},"additionalProperties":false}}},"additionalProperties":false},"twitch":{"$schema":"http://json-schema.org/draft-07/schema#","anyOf":[{"type":"object","properties":{"name":{"type":"string"},"enabled":{"type":"boolean"},"configWrites":{"type":"boolean"},"markdown":{"type":"object","properties":{"tables":{"type":"string","enum":["off","bullets","code","block"]}},"additionalProperties":false},"defaultAccount":{"type":"string"},"historyLimit":{"type":"integer","minimum":0,"maximum":9007199254740991},"responsePrefix":{"type":"string"},"username":{"type":"string"},"accessToken":{"type":"string"},"clientId":{"type":"string"},"channel":{"type":"string","minLength":1},"allowFrom":{"type":"array","items":{"type":"string"}},"allowedRoles":{"type":"array","items":{"type":"string","enum":["moderator","owner","vip","subscriber","all"]}},"requireMention":{"type":"boolean"},"clientSecret":{"type":"string"},"refreshToken":{"type":"string"},"expiresIn":{"anyOf":[{"type":"number"},{"type":"null"}]},"obtainmentTimestamp":{"type":"number"}},"required":["username","accessToken","channel"],"additionalProperties":false},{"type":"object","properties":{"name":{"type":"string"},"enabled":{"type":"boolean"},"configWrites":{"type":"boolean"},"markdown":{"type":"object","properties":{"tables":{"type":"string","enum":["off","bullets","code","block"]}},"additionalProperties":false},"defaultAccount":{"type":"string"},"historyLimit":{"type":"integer","minimum":0,"maximum":9007199254740991},"responsePrefix":{"type":"string"},"accounts":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"username":{"type":"string"},"accessToken":{"type":"string"},"clientId":{"type":"string"},"channel":{"type":"string","minLength":1},"enabled":{"type":"boolean"},"configWrites":{"type":"boolean"},"allowFrom":{"type":"array","items":{"type":"string"}},"allowedRoles":{"type":"array","items":{"type":"string","enum":["moderator","owner","vip","subscriber","all"]}},"requireMention":{"type":"boolean"},"responsePrefix":{"type":"string"},"clientSecret":{"type":"string"},"refreshToken":{"type":"string"},"expiresIn":{"anyOf":[{"type":"number"},{"type":"null"}]},"obtainmentTimestamp":{"type":"number"}},"required":["username","accessToken","channel"],"additionalProperties":false}}},"required":["accounts"],"additionalProperties":false}]},"whatsapp":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"capabilities":{"type":"array","items":{"type":"string"}},"markdown":{"type":"object","properties":{"tables":{"type":"string","enum":["off","bullets","code","block"]}},"additionalProperties":false},"configWrites":{"type":"boolean"},"enabled":{"type":"boolean"},"dmPolicy":{"default":"pairing","type":"string","enum":["pairing","allowlist","open","disabled"]},"allowFrom":{"type":"array","items":{"type":"string"}},"defaultTo":{"type":"string"},"groupAllowFrom":{"type":"array","items":{"type":"string"}},"groupPolicy":{"default":"allowlist","type":"string","enum":["open","disabled","allowlist"]},"mentionPatterns":{"type":"object","properties":{"mode":{"anyOf":[{"type":"string","const":"allow"},{"type":"string","const":"deny"}]},"allowIn":{"type":"array","items":{"type":"string"}},"denyIn":{"type":"array","items":{"type":"string"}}},"additionalProperties":false},"contextVisibility":{"type":"string","enum":["all","allowlist","allowlist_quote"]},"historyLimit":{"type":"integer","minimum":0,"maximum":9007199254740991},"dmHistoryLimit":{"type":"integer","minimum":0,"maximum":9007199254740991},"dms":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"historyLimit":{"type":"integer","minimum":0,"maximum":9007199254740991}},"additionalProperties":false}},"textChunkLimit":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"streaming":{"type":"object","properties":{"chunkMode":{"type":"string","enum":["length","newline"]},"block":{"type":"object","properties":{"enabled":{"type":"boolean"},"coalesce":{"type":"object","properties":{"minChars":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"maxChars":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"idleMs":{"type":"integer","minimum":0,"maximum":9007199254740991}},"additionalProperties":false}},"additionalProperties":false}},"additionalProperties":false},"heartbeatVisibility":{"type":"object","properties":{"showOk":{"type":"boolean"},"showAlerts":{"type":"boolean"},"useIndicator":{"type":"boolean"}},"additionalProperties":false},"healthMonitor":{"type":"object","properties":{"enabled":{"type":"boolean"}},"additionalProperties":false},"responsePrefix":{"type":"string"},"mediaMaxMb":{"default":50,"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"replyToMode":{"anyOf":[{"type":"string","const":"off"},{"type":"string","const":"first"},{"type":"string","const":"all"},{"type":"string","const":"batched"}]},"sendReadReceipts":{"type":"boolean"},"selfChatMode":{"type":"boolean"},"groups":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"requireMention":{"type":"boolean"},"tools":{"type":"object","properties":{"allow":{"type":"array","items":{"type":"string"}},"alsoAllow":{"type":"array","items":{"type":"string"}},"deny":{"type":"array","items":{"type":"string"}}},"additionalProperties":false},"toolsBySender":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"allow":{"type":"array","items":{"type":"string"}},"alsoAllow":{"type":"array","items":{"type":"string"}},"deny":{"type":"array","items":{"type":"string"}}},"additionalProperties":false}},"systemPrompt":{"type":"string"}},"additionalProperties":false}},"direct":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"systemPrompt":{"type":"string"}},"additionalProperties":false}},"reactionLevel":{"type":"string","enum":["off","ack","minimal","extensive"]},"pluginHooks":{"type":"object","properties":{"messageReceived":{"type":"boolean"}},"additionalProperties":false},"accounts":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"capabilities":{"type":"array","items":{"type":"string"}},"markdown":{"type":"object","properties":{"tables":{"type":"string","enum":["off","bullets","code","block"]}},"additionalProperties":false},"configWrites":{"type":"boolean"},"enabled":{"type":"boolean"},"dmPolicy":{"type":"string","enum":["pairing","allowlist","open","disabled"]},"allowFrom":{"type":"array","items":{"type":"string"}},"defaultTo":{"type":"string"},"groupAllowFrom":{"type":"array","items":{"type":"string"}},"groupPolicy":{"type":"string","enum":["open","disabled","allowlist"]},"mentionPatterns":{"type":"object","properties":{"mode":{"anyOf":[{"type":"string","const":"allow"},{"type":"string","const":"deny"}]},"allowIn":{"type":"array","items":{"type":"string"}},"denyIn":{"type":"array","items":{"type":"string"}}},"additionalProperties":false},"contextVisibility":{"type":"string","enum":["all","allowlist","allowlist_quote"]},"historyLimit":{"type":"integer","minimum":0,"maximum":9007199254740991},"dmHistoryLimit":{"type":"integer","minimum":0,"maximum":9007199254740991},"dms":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"historyLimit":{"type":"integer","minimum":0,"maximum":9007199254740991}},"additionalProperties":false}},"textChunkLimit":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"streaming":{"type":"object","properties":{"chunkMode":{"type":"string","enum":["length","newline"]},"block":{"type":"object","properties":{"enabled":{"type":"boolean"},"coalesce":{"type":"object","properties":{"minChars":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"maxChars":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"idleMs":{"type":"integer","minimum":0,"maximum":9007199254740991}},"additionalProperties":false}},"additionalProperties":false}},"additionalProperties":false},"heartbeatVisibility":{"type":"object","properties":{"showOk":{"type":"boolean"},"showAlerts":{"type":"boolean"},"useIndicator":{"type":"boolean"}},"additionalProperties":false},"healthMonitor":{"type":"object","properties":{"enabled":{"type":"boolean"}},"additionalProperties":false},"responsePrefix":{"type":"string"},"mediaMaxMb":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"replyToMode":{"anyOf":[{"type":"string","const":"off"},{"type":"string","const":"first"},{"type":"string","const":"all"},{"type":"string","const":"batched"}]},"sendReadReceipts":{"type":"boolean"},"selfChatMode":{"type":"boolean"},"groups":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"requireMention":{"type":"boolean"},"tools":{"type":"object","properties":{"allow":{"type":"array","items":{"type":"string"}},"alsoAllow":{"type":"array","items":{"type":"string"}},"deny":{"type":"array","items":{"type":"string"}}},"additionalProperties":false},"toolsBySender":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"allow":{"type":"array","items":{"type":"string"}},"alsoAllow":{"type":"array","items":{"type":"string"}},"deny":{"type":"array","items":{"type":"string"}}},"additionalProperties":false}},"systemPrompt":{"type":"string"}},"additionalProperties":false}},"direct":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"systemPrompt":{"type":"string"}},"additionalProperties":false}},"reactionLevel":{"type":"string","enum":["off","ack","minimal","extensive"]},"pluginHooks":{"type":"object","properties":{"messageReceived":{"type":"boolean"}},"additionalProperties":false},"name":{"type":"string"},"authDir":{"type":"string"}},"additionalProperties":false}},"defaultAccount":{"type":"string"},"actions":{"type":"object","properties":{"reactions":{"type":"boolean"},"sendMessage":{"type":"boolean"},"polls":{"type":"boolean"},"calls":{"type":"boolean"}},"additionalProperties":false}},"required":["dmPolicy","groupPolicy","mediaMaxMb"],"additionalProperties":false},"zalo":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"name":{"type":"string"},"enabled":{"type":"boolean"},"configWrites":{"type":"boolean"},"markdown":{"type":"object","properties":{"tables":{"type":"string","enum":["off","bullets","code","block"]}},"additionalProperties":false},"botToken":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"store"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false}]}]},"tokenFile":{"type":"string"},"webhookUrl":{"type":"string"},"webhookSecret":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"store"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false}]}]},"webhookPath":{"type":"string"},"dmPolicy":{"type":"string","enum":["pairing","allowlist","open","disabled"]},"allowFrom":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"groupPolicy":{"type":"string","enum":["open","disabled","allowlist"]},"groupAllowFrom":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"mediaMaxMb":{"type":"number"},"proxy":{"type":"string"},"responsePrefix":{"type":"string"},"historyLimit":{"type":"integer","minimum":0,"maximum":9007199254740991},"accounts":{"type":"object","properties":{},"additionalProperties":{"type":"object","properties":{"name":{"type":"string"},"enabled":{"type":"boolean"},"configWrites":{"type":"boolean"},"markdown":{"type":"object","properties":{"tables":{"type":"string","enum":["off","bullets","code","block"]}},"additionalProperties":false},"botToken":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"store"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false}]}]},"tokenFile":{"type":"string"},"webhookUrl":{"type":"string"},"webhookSecret":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"store"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false}]}]},"webhookPath":{"type":"string"},"dmPolicy":{"type":"string","enum":["pairing","allowlist","open","disabled"]},"allowFrom":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"groupPolicy":{"type":"string","enum":["open","disabled","allowlist"]},"groupAllowFrom":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"mediaMaxMb":{"type":"number"},"proxy":{"type":"string"},"responsePrefix":{"type":"string"}},"additionalProperties":false}},"defaultAccount":{"type":"string"}},"additionalProperties":false},"zalouser":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"name":{"type":"string"},"enabled":{"type":"boolean"},"configWrites":{"type":"boolean"},"mediaMaxMb":{"type":"number","exclusiveMinimum":0},"markdown":{"type":"object","properties":{"tables":{"type":"string","enum":["off","bullets","code","block"]}},"additionalProperties":false},"profile":{"type":"string"},"dangerouslyAllowNameMatching":{"type":"boolean"},"dmPolicy":{"type":"string","enum":["pairing","allowlist","open","disabled"]},"allowFrom":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"historyLimit":{"type":"integer","minimum":0,"maximum":9007199254740991},"groupAllowFrom":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"groupPolicy":{"default":"allowlist","type":"string","enum":["open","disabled","allowlist"]},"groups":{"type":"object","properties":{},"additionalProperties":{"type":"object","properties":{"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},"enabled":{"type":"boolean"}},"additionalProperties":false}},"messagePrefix":{"type":"string"},"responsePrefix":{"type":"string"},"accounts":{"type":"object","properties":{},"additionalProperties":{"type":"object","properties":{"name":{"type":"string"},"enabled":{"type":"boolean"},"configWrites":{"type":"boolean"},"mediaMaxMb":{"type":"number","exclusiveMinimum":0},"markdown":{"type":"object","properties":{"tables":{"type":"string","enum":["off","bullets","code","block"]}},"additionalProperties":false},"profile":{"type":"string"},"dangerouslyAllowNameMatching":{"type":"boolean"},"dmPolicy":{"type":"string","enum":["pairing","allowlist","open","disabled"]},"allowFrom":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"historyLimit":{"type":"integer","minimum":0,"maximum":9007199254740991},"groupAllowFrom":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"groupPolicy":{"default":"allowlist","type":"string","enum":["open","disabled","allowlist"]},"groups":{"type":"object","properties":{},"additionalProperties":{"type":"object","properties":{"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},"enabled":{"type":"boolean"}},"additionalProperties":false}},"messagePrefix":{"type":"string"},"responsePrefix":{"type":"string"}},"required":["groupPolicy"],"additionalProperties":false}},"defaultAccount":{"type":"string"}},"required":["groupPolicy"],"additionalProperties":false}},"additionalProperties":true,"title":"Channels","description":"Channel provider configurations plus shared defaults that control access policies, heartbeat visibility, and per-surface behavior. Keep defaults centralized and override per provider only where required."},"discovery":{"type":"object","properties":{"wideArea":{"type":"object","properties":{"domain":{"type":"string","title":"Wide-area Discovery Domain","description":"Optional unicast DNS-SD domain for wide-area discovery, such as openclaw.internal. Use this when you intentionally publish gateway discovery beyond local mDNS scopes."}},"additionalProperties":false,"title":"Wide-area Discovery","description":"Wide-area discovery configuration group for exposing discovery signals beyond local-link scopes. Enable only in deployments that intentionally aggregate gateway presence across sites."},"mdns":{"type":"object","properties":{"mode":{"type":"string","enum":["off","minimal","full"],"title":"mDNS Discovery Mode","description":"mDNS broadcast mode (\"minimal\" default, \"full\" includes cliPath/sshPort, \"off\" disables mDNS)."}},"additionalProperties":false,"title":"mDNS Discovery","description":"mDNS discovery configuration group for local network advertisement and discovery behavior tuning. Keep minimal mode for routine LAN discovery unless extra metadata is required."}},"additionalProperties":false,"title":"Discovery","description":"Service discovery settings for local mDNS advertisement and optional wide-area presence signaling. Keep discovery scoped to expected networks to avoid leaking service metadata."},"talk":{"type":"object","properties":{"agentId":{"type":"string","minLength":1,"title":"Talk Agent","description":"Agent that owns Talk sessions created without an explicit agent-scoped session key."},"provider":{"type":"string","title":"Talk Active Provider","description":"Active Talk provider id (for example \"acme-speech\")."},"providers":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"apiKey":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"store"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false}]}],"title":"Talk Provider API Key","description":"Provider API key for Talk mode."}},"additionalProperties":{},"title":"Talk Provider Config","description":"Provider-owned Talk config fields for the matching provider id."},"title":"Talk Provider Settings","description":"Provider-specific Talk settings keyed by provider id. During migration, prefer this over legacy talk.* keys."},"realtime":{"type":"object","properties":{"provider":{"type":"string","title":"Talk Realtime Provider","description":"Active realtime voice provider id, such as openai or google."},"providers":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"apiKey":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"store"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false}]}],"title":"Talk Realtime Provider API Key","description":"Provider API key for realtime Talk."}},"additionalProperties":{},"title":"Talk Realtime Provider Config","description":"Provider-owned realtime voice config for the matching provider id."},"title":"Talk Realtime Provider Settings","description":"Provider-specific realtime voice settings keyed by provider id."},"model":{"type":"string","title":"Talk Realtime Model","description":"Realtime provider model id override for browser or Gateway-owned Talk sessions."},"speakerVoice":{"type":"string","title":"Talk Realtime Speaker Voice","description":"Realtime provider speaker voice name override for browser or Gateway-owned Talk sessions."},"speakerVoiceId":{"type":"string","title":"Talk Realtime Speaker Voice ID","description":"Realtime provider speaker voice id override for browser or Gateway-owned Talk sessions."},"instructions":{"type":"string","title":"Talk Realtime Instructions","description":"Additional system instructions appended to OpenClaw's built-in realtime Talk prompt. Use this for voice style, tone, and other provider-facing realtime behavior while keeping agent-consult guidance intact."},"mode":{"type":"string","enum":["realtime","stt-tts","transcription"],"title":"Talk Realtime Mode","description":"Talk execution mode: realtime, stt-tts, or transcription."},"transport":{"type":"string","enum":["webrtc","provider-websocket","gateway-relay","managed-room"],"title":"Talk Realtime Transport","description":"Talk byte/session transport: webrtc, provider-websocket, gateway-relay, or managed-room."},"vadThreshold":{"type":"number","minimum":0,"maximum":1,"title":"Talk Realtime VAD Threshold","description":"Realtime voice activity detection threshold from 0 (most sensitive) to 1 (least sensitive)."},"silenceDurationMs":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"title":"Talk Realtime Silence Duration (ms)","description":"Milliseconds of silence before a realtime Talk user turn is committed."},"prefixPaddingMs":{"type":"integer","minimum":0,"maximum":9007199254740991,"title":"Talk Realtime Prefix Padding (ms)","description":"Milliseconds of audio retained before realtime voice activity is detected."},"reasoningEffort":{"type":"string","minLength":1,"title":"Talk Realtime Reasoning Effort","description":"Provider-specific reasoning effort for realtime Talk sessions, such as minimal, low, medium, or high."},"brain":{"type":"string","enum":["agent-consult","direct-tools","none"],"title":"Talk Realtime Brain","description":"Talk reasoning strategy: agent-consult for Gateway-mediated agent help, direct-tools for local tool calls, or none."},"consultRouting":{"type":"string","enum":["provider-direct","force-agent-consult"],"title":"Talk Realtime Consult Routing","description":"Gateway relay fallback for final user transcripts when the realtime provider skips openclaw_agent_consult. provider-direct preserves provider replies; force-agent-consult routes through OpenClaw."}},"additionalProperties":false,"title":"Talk Realtime","description":"Realtime Talk provider, model, voice, mode, transport, and brain strategy. Keep speech/TTS provider config in talk.provider and talk.providers."},"consultThinkingLevel":{"type":"string","enum":["off","minimal","low","medium","high","xhigh","adaptive","max","ultra"],"title":"Talk Consult Thinking Level","description":"Use this to override the thinking level for the regular agent run behind Talk realtime consults."},"consultFastMode":{"type":"boolean","title":"Talk Consult Fast Mode","description":"Use this to set true or false fast mode for the regular agent run behind Talk realtime consults."},"speechLocale":{"type":"string","title":"Talk Speech Locale","description":"BCP 47 locale id for Talk speech recognition on device nodes and the iOS system-voice fallback, for example \"ru-RU\". Leave unset to use each device default."},"interruptOnSpeech":{"type":"boolean","title":"Talk Interrupt on Speech","description":"If true (default), stop assistant speech when the user starts speaking in Talk mode. Keep enabled for conversational turn-taking."},"silenceTimeoutMs":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"title":"Talk Silence Timeout (ms)","description":"Milliseconds of user silence before Talk mode finalizes and sends the current transcript. Leave unset to keep the platform default pause window (700 ms on macOS and Android, 900 ms on iOS)."}},"additionalProperties":false,"title":"Talk","description":"Talk-mode voice synthesis settings for voice identity, model selection, output format, and interruption behavior. Use this section to tune human-facing voice UX while controlling latency and cost."},"gateway":{"type":"object","properties":{"port":{"type":"integer","minimum":1,"maximum":65535,"title":"Gateway Port","description":"TCP port used by the gateway listener for API, control UI, and channel-facing ingress paths. Use a dedicated port and avoid collisions with reverse proxies or local developer services."},"mode":{"anyOf":[{"type":"string","const":"local"},{"type":"string","const":"remote"}],"title":"Gateway Mode","description":"Gateway operation mode: \"local\" runs channels and agent runtime on this host, while \"remote\" connects through remote transport. Keep \"local\" unless you intentionally run a split remote gateway topology."},"bind":{"anyOf":[{"type":"string","const":"auto"},{"type":"string","const":"lan"},{"type":"string","const":"loopback"},{"type":"string","const":"custom"},{"type":"string","const":"tailnet"}],"title":"Gateway Bind Mode","description":"Network bind profile: \"auto\", \"lan\", \"loopback\", \"custom\", or \"tailnet\" to control interface exposure. Keep \"loopback\" for local-only operation; \"auto\" can expose all interfaces."},"customBindHost":{"type":"string","title":"Gateway Custom Bind Host","description":"IPv4 address used for a custom bind. Specific IPv4s also require the same Gateway port on 127.0.0.1; avoid 0.0.0.0 unless all-interface exposure is required."},"publicOrigin":{"type":"string","format":"uri","title":"Gateway Public Origin","description":"Externally reachable HTTPS origin of the Gateway. HTTP is allowed only for localhost, 127.0.0.1, or [::1]. Per-requester MCP OAuth uses it to build the callback URL at /oauth/mcp/callback; channel session links and plugin-generated viewer links use it to reach the Control UI and Gateway routes."},"controlUi":{"type":"object","properties":{"dangerouslyDisableDeviceAuth":{"type":"boolean"},"enabled":{"type":"boolean","title":"Control UI Enabled","description":"Enables serving the gateway Control UI from the gateway HTTP process when true. Keep enabled for local administration, and disable when an external control surface replaces it."},"basePath":{"type":"string","title":"Control UI Base Path","description":"Optional URL prefix where the Control UI is served (e.g. /openclaw)."},"root":{"type":"string","title":"Control UI Assets Root","description":"Optional filesystem root for Control UI assets (defaults to dist/control-ui)."},"environment":{"type":"object","properties":{"label":{"type":"string","minLength":1,"maxLength":24,"title":"Control UI Environment Label","description":"Environment label displayed in the Control UI and browser tab; surrounding whitespace is trimmed and the label must contain 1 to 24 characters."},"color":{"type":"string","enum":["teal","amber","purple","coral","pink","blue","green","red","gray"],"title":"Control UI Environment Color","description":"Named environment color ramp: teal, amber, purple, coral, pink, blue, green, red, or gray."}},"required":["label","color"],"additionalProperties":false,"title":"Control UI Environment","description":"Optional public environment identity shown in the Control UI stripe, agent avatar, label pills, browser title, and favicon. Omit it to preserve the default appearance."},"github":{"type":"object","properties":{"token":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"store"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false}]}],"title":"Control UI GitHub Service Credential","description":"SecretRef-backed service credential for Control UI GitHub previews and project discovery. Prefer explicit configuration for clear service ownership. Omit it to retain the GH_TOKEN/GITHUB_TOKEN fallback from the shared Gateway process environment. An explicitly configured but unavailable credential fails closed. Agent tool identities are never used here."}},"additionalProperties":false},"toolTitles":{"type":"boolean","title":"Control UI Tool Call Titles","description":"Opt-in AI purpose titles for tool calls in Control UI chat (default off). When enabled, the chat.toolTitles method generates short titles for complex tool calls with the agent's utility model (an explicit utilityModel may route bounded tool arguments to the operator-chosen provider like every utility task; the derived default stays on the session's provider) and caches them in the per-agent state database. Setting utilityModel to an empty string disables titles too. Leave off to keep tool rendering fully deterministic with no background model calls."},"sessionObserver":{"type":"boolean","title":"Control UI Session Observer","description":"Produce live session status digests for subscribed Control UI clients with each agent's utility model (default on). Set false to disable observer model calls gateway-wide; setting agents.defaults.utilityModel to an empty string disables utility-model observation for agents that do not override it."},"embedSandbox":{"anyOf":[{"type":"string","const":"strict"},{"type":"string","const":"scripts"},{"type":"string","const":"trusted"}],"title":"Control UI Embed Sandbox Mode","description":"Iframe sandbox policy for hosted Control UI embeds. \"strict\" disables scripts, \"scripts\" allows interactive embeds while keeping origin isolation (default), and \"trusted\" adds `allow-same-origin` for same-site documents that intentionally need stronger privileges."},"allowExternalEmbedUrls":{"type":"boolean","title":"Allow External Control UI Embed URLs","description":"DANGEROUS toggle that allows hosted embeds to load absolute external http(s) URLs. Keep this off unless your Control UI intentionally embeds trusted third-party pages; hosted /__openclaw__/canvas and /__openclaw__/a2ui documents do not need it."},"automaticallyFetchFavicons":{"type":"boolean","title":"Automatically Fetch Link Favicons","description":"Fetch link favicons through the Gateway (default on). The Gateway requests only HTTPS /favicon.ico from public destinations, applies strict SSRF checks to every DNS result and redirect, and validates bounded image bytes. Set false to prevent all favicon route requests and destination fetches."},"allowedOrigins":{"type":"array","items":{"type":"string"},"title":"Control UI Allowed Origins","description":"Allowed browser origins for Control UI/WebChat websocket connections (full origins only, e.g. https://control.example.com). Required for non-loopback Control UI deployments unless dangerous Host-header fallback is explicitly enabled. Setting [\"*\"] means allow any browser origin and should be avoided outside tightly controlled local testing."},"dangerouslyAllowHostHeaderOriginFallback":{"type":"boolean","title":"Dangerously Allow Host-Header Origin Fallback","description":"DANGEROUS toggle that enables Host-header based origin fallback for Control UI/WebChat websocket checks. This mode is supported when your deployment intentionally relies on Host-header origin policy; explicit gateway.controlUi.allowedOrigins remains the recommended hardened default."}},"additionalProperties":false,"title":"Control UI","description":"Control UI hosting settings including enablement, pathing, and browser-origin/auth hardening behavior. Keep UI exposure minimal and pair with strong auth controls before internet-facing deployments."},"cliAgents":{"type":"object","properties":{"enabled":{"type":"boolean","title":"CLI Agents Enabled","description":"Shows catalog-backed CLI agents in the Control UI new-session model picker when true (default: false). Only catalogs that advertise session creation are listed, and the picker stays hidden when the Gateway does not advertise session catalog support."}},"additionalProperties":false,"title":"CLI Agents","description":"Experimental Control UI discovery for external CLI session engines exposed by the Gateway session catalog. Keep disabled unless operators should be able to start those engines from the new-session model picker."},"terminal":{"type":"object","properties":{"enabled":{"type":"boolean","title":"Operator Terminal Enabled","description":"Enables the operator terminal for admin-scope clients (default: true). This exposes a browser/mobile shell with the gateway process environment; set false to opt out on deployments where admin operators should not get a host shell. Changing this restarts the gateway so connected clients reload with the correct terminal availability and content-security policy."},"shell":{"type":"string","title":"Operator Terminal Shell","description":"Shell executable the operator terminal launches. Leave unset to use the host login shell ($SHELL on Unix, %ComSpec% on Windows), or pin an explicit interpreter for a consistent operator environment."},"detachedSessionTimeoutSeconds":{"type":"integer","minimum":0,"maximum":9007199254740991,"title":"Operator Terminal Detached Session Timeout","description":"Seconds a terminal session survives after its connection drops (laptop sleep, page reload), staying reattachable via terminal.attach with its recent output replayed. Set 0 to kill sessions the moment the connection drops. Default: 300 (5 minutes). Detached sessions keep running their commands, so shorten this on shared or exposed hosts."}},"additionalProperties":false,"title":"Operator Terminal","description":"Operator terminal served to Control UI and mobile clients: a PTY-backed shell on the gateway host, restricted to admin-scope operator sessions. It starts in the target agent's workspace and is refused for fully-sandboxed agents (sandbox.mode 'all') rather than handing back an unconfined host shell."},"auth":{"type":"object","properties":{"mode":{"anyOf":[{"type":"string","const":"none"},{"type":"string","const":"token"},{"type":"string","const":"password"},{"type":"string","const":"trusted-proxy"}],"title":"Gateway Auth Mode","description":"Gateway auth mode: \"none\", \"token\", \"password\", or \"trusted-proxy\" depending on your edge architecture. Use token/password for direct exposure, and trusted-proxy only behind hardened identity-aware proxies."},"token":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"store"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false}]}],"title":"Gateway Token","description":"Required by default for gateway access (unless using Tailscale Serve identity); required for non-loopback binds."},"password":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"store"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false}]}],"title":"Gateway Password","description":"Required for Tailscale funnel."},"allowTailscale":{"type":"boolean","title":"Gateway Auth Allow Tailscale Identity","description":"Allows trusted Tailscale identity paths to satisfy gateway auth checks when configured. Use this only when your tailnet identity posture is strong and operator workflows depend on it."},"identityScopes":{"type":"object","propertyNames":{"type":"string","minLength":1},"additionalProperties":{"type":"array","items":{"type":"string","enum":["operator.admin","operator.read","operator.write","operator.approvals","operator.questions","operator.pairing","operator.talk","operator.talk.secrets"]}},"title":"Gateway Identity Scope Grants","description":"Maps verified trusted-proxy or Tailscale identities to connection-only operator scope grants. Email keys match case-insensitively; grants augment device scopes before the connection scope cap is applied."},"rateLimit":{"type":"object","properties":{"maxAttempts":{"type":"number"},"windowMs":{"type":"number"},"lockoutMs":{"type":"number"},"exemptLoopback":{"type":"boolean"}},"additionalProperties":false,"title":"Gateway Auth Rate Limit","description":"Login/auth attempt throttling controls to reduce credential brute-force risk at the gateway boundary. Keep enabled in exposed environments and tune thresholds to your traffic baseline."},"trustedProxy":{"type":"object","properties":{"userHeader":{"type":"string","minLength":1},"requiredHeaders":{"type":"array","items":{"type":"string"}},"allowUsers":{"type":"array","items":{"type":"string"}},"allowLoopback":{"type":"boolean"},"deviceAutoApprove":{"type":"object","properties":{"enabled":{"type":"boolean","title":"Trusted Proxy Device Auto-Approval Enabled","description":"Automatically approves new browser operator devices and same-key scope upgrades after the reverse proxy authenticates an allowed user. Default: false. Enable only when the proxy identity boundary is strong enough to replace manual device pairing."},"scopes":{"type":"array","items":{"type":"string","minLength":1},"title":"Trusted Proxy Device Auto-Approval Scopes","description":"Maximum scopes granted to auto-approved browser devices. Defaults to operator.read, operator.write, operator.approvals, and operator.questions. Requested scopes are capped to this list; requests without scopes receive this list. When unset, auto-approval also adds operator.questions for older browser clients; an explicit list is never widened. Explicitly listing operator.admin lets every proxy-authenticated user auto-approve full admin and makes scope-less requests receive full admin automatically; it also triggers a critical security audit finding and Gateway startup warning."}},"additionalProperties":false,"title":"Trusted Proxy Device Auto-Approval","description":"Optional policy for automatically approving new browser operator devices and same-key scope upgrades after trusted-proxy authentication. Grants are capped by deviceAutoApprove.scopes and the proxy's x-openclaw-scopes header when present."}},"required":["userHeader"],"additionalProperties":false,"title":"Gateway Trusted Proxy Auth","description":"Trusted-proxy auth header mapping for upstream identity providers that inject user claims. Use only with known proxy CIDRs and strict header allowlists to prevent spoofed identity headers."}},"additionalProperties":false,"title":"Gateway Auth","description":"Authentication policy for gateway HTTP/WebSocket access including mode, credentials, trusted-proxy behavior, and rate limiting. Keep auth enabled for every non-loopback deployment."},"roles":{"type":"object","properties":{"default":{"type":"string","minLength":1,"maxLength":128,"title":"Default Operator Role","description":"Required role assigned to authenticated profiles without a valid explicit assignment whenever operator roles are configured. Its name must match a configured role definition."},"definitions":{"type":"object","propertyNames":{"type":"string","minLength":1,"maxLength":128},"additionalProperties":{"type":"object","properties":{"sessions":{"type":"object","properties":{"others":{"type":"string","enum":["none","view","suggest","write"],"title":"Operator Role Access to Other Sessions","description":"Access to other people's sessions: \"none\" hides them, \"view\" allows reading, \"suggest\" permits the suggestion flow, and \"write\" permits participation. Explicit session membership can grant additional access."}},"required":["others"],"additionalProperties":false,"title":"Operator Role Session Access","description":"Session-sharing permissions granted to this role for sessions created by other authenticated people; a person's own sessions remain owner-accessible."},"sandbox":{"type":"string","enum":["inherit","required"],"title":"Operator Role Sandbox Isolation","description":"Execution isolation for newly created sessions: \"inherit\" (default) uses the agent policy; \"required\" permanently requires a sandbox, even when the agent sandbox mode is off, and fails closed if the backend is unavailable."},"agents":{"anyOf":[{"type":"string","const":"*"},{"type":"array","items":{"type":"string","minLength":1}}],"title":"Operator Role Allowed Agents","description":"Agents available when this role creates sessions or starts runs: set \"*\" to allow every agent, list agent IDs to allow only those agents, or use an empty list to disable both."},"scopes":{"type":"array","items":{"type":"string","enum":["operator.admin","operator.read","operator.write","operator.approvals","operator.questions","operator.pairing","operator.talk","operator.talk.secrets"]},"title":"Operator Role Scope Ceiling","description":"Closed list of operator scopes granted as this role's maximum connection authority. Requested, paired, identity-granted, and upgraded scopes are intersected with this list."}},"required":["sessions","agents","scopes"],"additionalProperties":false,"title":"Operator Role Definition","description":"One named operator role. Every definition must explicitly provide its session-sharing policy, allowed session and run agents, and operator-scope ceiling, and can require sandbox isolation for newly created sessions."},"title":"Operator Role Definitions","description":"Nonempty administrator-named role definitions bundling the closed session-sharing, sandbox-isolation, agent-access, and operator-scope policies applied to authenticated user profiles."}},"required":["default","definitions"],"additionalProperties":false,"title":"Gateway Operator Roles","description":"Optional profile-bound operator roles for team Gateways. Each named role controls access to other people's sessions, sandbox isolation, session and run agents, and granted operator scopes; omitting this section preserves existing operator behavior."},"trustedProxies":{"type":"array","items":{"type":"string"},"title":"Gateway Trusted Proxy CIDRs","description":"CIDR/IP allowlist of upstream proxies permitted to provide forwarded client identity headers. Keep this list narrow so untrusted hops cannot impersonate users."},"allowRealIpFallback":{"type":"boolean","title":"Gateway Allow x-real-ip Fallback","description":"Enables x-real-ip fallback when x-forwarded-for is missing in proxy scenarios. Keep disabled unless your ingress stack requires this compatibility behavior."},"tools":{"type":"object","properties":{"deny":{"type":"array","items":{"type":"string"},"title":"Gateway Tool Denylist","description":"Explicit gateway-level tool denylist to block risky tools even if lower-level policies allow them. Use deny rules for emergency response and defense-in-depth hardening."},"allow":{"type":"array","items":{"type":"string"},"title":"Gateway Tool Allowlist","description":"Explicit gateway-level tool allowlist when you want a narrow set of tools available at runtime. Use this for locked-down environments where tool scope must be tightly controlled."}},"additionalProperties":false,"title":"Gateway Tool Exposure Policy","description":"Gateway-level tool exposure allow/deny policy that can restrict runtime tool availability independent of agent/tool profiles. Use this for coarse emergency controls and production hardening."},"tailscale":{"type":"object","properties":{"mode":{"anyOf":[{"type":"string","const":"off"},{"type":"string","const":"serve"},{"type":"string","const":"funnel"}],"title":"Gateway Tailscale Mode","description":"Tailscale publish mode: \"off\", \"serve\", or \"funnel\" for private or public exposure paths. Use \"serve\" for tailnet-only access and \"funnel\" only when public internet reachability is required."},"preserveFunnel":{"type":"boolean","title":"Gateway Tailscale External Funnel Migration Guard","description":"Deprecated migration guard for mode='serve'. If an external Funnel still targets the ordinary Gateway listener, OpenClaw leaves exposure unchanged and warns that only plugin-authenticated webhooks remain usable until password auth is configured and mode is migrated to 'funnel'."}},"additionalProperties":false,"title":"Gateway Tailscale","description":"Tailscale integration settings for Serve/Funnel exposure and lifecycle handling on gateway start/exit. Keep off unless your deployment intentionally relies on Tailscale ingress."},"remote":{"type":"object","properties":{"url":{"type":"string","title":"Remote Gateway URL","description":"Remote Gateway WebSocket URL (ws:// or wss://)."},"transport":{"anyOf":[{"type":"string","const":"ssh"},{"type":"string","const":"direct"}],"title":"Remote Gateway Transport","description":"Remote connection transport: \"direct\" uses configured URL connectivity, while \"ssh\" tunnels through SSH. Use SSH when you need encrypted tunnel semantics without exposing remote ports."},"remotePort":{"type":"integer","minimum":1,"maximum":65535},"token":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"store"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false}]}],"title":"Remote Gateway Token","description":"Bearer token used to authenticate this client to a remote gateway in token-auth deployments. Store via secret/env substitution and rotate alongside remote gateway auth changes."},"password":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"store"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false}]}],"title":"Remote Gateway Password","description":"Password credential used for remote gateway authentication when password mode is enabled. Keep this secret managed externally and avoid plaintext values in committed config."},"edgeAuth":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"store"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false}]}]},"title":"Remote Gateway Edge Auth Headers","description":"Secret-backed HTTP headers presented to an identity-aware proxy in front of the configured remote Gateway. Headers are sent only to the exact gateway.remote.url origin over WSS and never follow redirects."},"tlsFingerprint":{"type":"string","title":"Remote Gateway TLS Fingerprint","description":"Expected sha256 TLS fingerprint for the remote gateway (pin to avoid MITM)."},"sshTarget":{"type":"string","title":"Remote Gateway SSH Target","description":"Remote gateway over SSH (tunnels the gateway port to localhost). Format: user@host or user@host:port."},"sshIdentity":{"type":"string","title":"Remote Gateway SSH Identity","description":"Optional SSH identity file path (passed to ssh -i)."},"sshHostKeyPolicy":{"anyOf":[{"type":"string","const":"strict"},{"type":"string","const":"openssh"}],"title":"Remote Gateway SSH Host-Key Policy","description":"macOS SSH host-key verification policy. \"strict\" requires an already trusted host key; \"openssh\" explicitly delegates to effective OpenSSH configuration."}},"additionalProperties":false,"title":"Remote Gateway","description":"Remote gateway connection settings for direct or SSH transport when this instance proxies to another runtime host. Use remote mode only when split-host operation is intentionally configured."},"reload":{"type":"object","properties":{"mode":{"anyOf":[{"type":"string","const":"off"},{"type":"string","const":"hybrid"}],"title":"Config Reload Mode","description":"Controls how config edits are applied: \"off\" ignores live edits and \"hybrid\" applies hot-safe changes then restarts when required."}},"additionalProperties":false,"title":"Config Reload","description":"Live config-reload policy for how edits are applied and when full restarts are triggered. Keep hybrid behavior for safest operational updates unless debugging reload internals."},"tls":{"type":"object","properties":{"enabled":{"type":"boolean","title":"Gateway TLS Enabled","description":"Enables TLS termination at the gateway listener so clients connect over HTTPS/WSS directly. Keep enabled for direct internet exposure or any untrusted network boundary."},"autoGenerate":{"type":"boolean","title":"Gateway TLS Auto-Generate Cert","description":"Auto-generates a local TLS certificate/key pair when explicit files are not configured. Use only for local/dev setups and replace with real certificates for production traffic."},"certPath":{"type":"string","title":"Gateway TLS Certificate Path","description":"Filesystem path to the TLS certificate file used by the gateway when TLS is enabled. Use managed certificate paths and keep renewal automation aligned with this location."},"keyPath":{"type":"string","title":"Gateway TLS Key Path","description":"Filesystem path to the TLS private key file used by the gateway when TLS is enabled. Keep this key file permission-restricted and rotate per your security policy."},"caPath":{"type":"string","title":"Gateway TLS CA Path","description":"Optional CA bundle path for client verification or custom trust-chain requirements at the gateway edge. Use this when private PKI or custom certificate chains are part of deployment."}},"title":"Gateway TLS","description":"TLS certificate and key settings for terminating HTTPS directly in the gateway process. Use explicit certificates in production and avoid plaintext exposure on untrusted networks."},"http":{"type":"object","properties":{"endpoints":{"type":"object","properties":{"chatCompletions":{"type":"object","properties":{"enabled":{"type":"boolean","title":"OpenAI Chat Completions Endpoint","description":"Enable the OpenAI-compatible `POST /v1/chat/completions` endpoint (default: false)."},"images":{"type":"object","properties":{"allowUrl":{"type":"boolean","title":"OpenAI Chat Completions Allow Image URLs","description":"Allow server-side URL fetches for `image_url` parts (default: false; data URIs remain supported). Set this to `false` to disable URL fetching entirely."},"urlAllowlist":{"type":"array","items":{"type":"string"},"title":"OpenAI Chat Completions Image URL Allowlist","description":"Optional hostname allowlist for `image_url` URL fetches; supports exact hosts and `*.example.com` wildcards. Empty or omitted lists mean no hostname allowlist restriction."},"allowedMimes":{"type":"array","items":{"type":"string"},"title":"OpenAI Chat Completions Image MIME Allowlist","description":"Allowed MIME types for `image_url` parts (case-insensitive list)."},"maxBytes":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"title":"OpenAI Chat Completions Image Max Bytes","description":"Max bytes per fetched/decoded `image_url` image (default: 10MB)."},"maxRedirects":{"type":"integer","minimum":0,"maximum":9007199254740991,"title":"OpenAI Chat Completions Image Max Redirects","description":"Max HTTP redirects allowed when fetching `image_url` URLs (default: 3)."},"timeoutMs":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"title":"OpenAI Chat Completions Image Timeout (ms)","description":"Timeout in milliseconds for `image_url` URL fetches (default: 10000)."}},"additionalProperties":false,"title":"OpenAI Chat Completions Image Limits","description":"Image fetch/validation controls for OpenAI-compatible `image_url` parts."}},"additionalProperties":false},"responses":{"type":"object","properties":{"enabled":{"type":"boolean"},"maxUrlParts":{"type":"integer","minimum":0,"maximum":9007199254740991},"files":{"type":"object","properties":{"allowUrl":{"type":"boolean"},"urlAllowlist":{"type":"array","items":{"type":"string"}},"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},"maxChars":{"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"},"urlAllowlist":{"type":"array","items":{"type":"string"}},"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,"title":"Gateway HTTP Endpoints","description":"HTTP endpoint feature toggles under the gateway API surface for compatibility routes and optional integrations. Enable endpoints intentionally and monitor access patterns after rollout."},"securityHeaders":{"type":"object","properties":{"strictTransportSecurity":{"anyOf":[{"type":"string"},{"type":"boolean","const":false}],"title":"Strict Transport Security Header","description":"Value for the Strict-Transport-Security response header. Set only on HTTPS origins that you fully control; use false to explicitly disable."}},"additionalProperties":false,"title":"Gateway HTTP Security Headers","description":"Optional HTTP response security headers applied by the gateway process itself. Prefer setting these at your reverse proxy when TLS terminates there."}},"additionalProperties":false,"title":"Gateway HTTP API","description":"Gateway HTTP API configuration grouping endpoint toggles and transport-facing API exposure controls. Keep only required endpoints enabled to reduce attack surface."},"push":{"type":"object","properties":{"apns":{"type":"object","properties":{"relay":{"type":"object","properties":{"baseUrl":{"type":"string","title":"Gateway APNs Relay Base URL","description":"Optional custom base HTTPS URL for the external APNs relay service used by official App Store iOS builds. Keep this aligned with the relay URL baked into the iOS build so registration and send traffic hit the same deployment."},"timeoutMs":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"title":"Gateway APNs Relay Timeout (ms)","description":"Timeout in milliseconds for relay send requests from the gateway to the APNs relay (default: 10000). Increase for slower relays or networks, or lower to fail wake attempts faster."}},"additionalProperties":false,"title":"Gateway APNs Relay","description":"External relay settings for relay-backed APNs sends. The gateway uses the hosted OpenClaw relay by default, or this custom relay for push.test, wake nudges, and reconnect wakes after a paired official iOS build publishes a relay-backed registration."}},"additionalProperties":false,"title":"Gateway APNs Delivery","description":"APNs delivery settings for iOS devices paired to this gateway. Use relay settings for official App Store builds that register through the external push relay."}},"additionalProperties":false,"title":"Gateway Push Delivery","description":"Push-delivery settings used by the gateway when it needs to wake or notify paired devices. Configure relay-backed APNs here for official iOS builds; direct APNs auth remains env-based for local/manual builds."},"nodes":{"type":"object","properties":{"browser":{"type":"object","properties":{"mode":{"anyOf":[{"type":"string","const":"auto"},{"type":"string","const":"manual"},{"type":"string","const":"off"}],"title":"Gateway Node Browser Mode","description":"Node browser routing (\"auto\" = pick single connected browser node, \"manual\" = require node param, \"off\" = disable)."},"node":{"type":"string","title":"Gateway Node Browser Pin","description":"Pin browser routing to a specific node id or name (optional)."}},"additionalProperties":false},"pairing":{"type":"object","properties":{"autoApproveLocal":{"type":"boolean","title":"Gateway Node Pairing Auto-Approve Local","description":"Silently approve trusted local pairing and access upgrades (default: true); set false to trade convenience for explicit approval of every device."},"autoApproveCidrs":{"type":"array","items":{"type":"string"},"title":"Gateway Node Pairing Auto-Approve CIDRs","description":"Opt-in CIDR/IP allowlist for auto-approving first-time node-role device pairing with no requested scopes. Disabled when unset. Operator, browser, Control UI, and any role, scope, metadata, or public-key upgrade pairing still require manual approval."},"sshVerify":{"anyOf":[{"type":"boolean"},{"type":"object","properties":{"user":{"type":"string"},"identity":{"type":"string"},"timeoutMs":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"cidrs":{"type":"array","items":{"type":"string"}}},"additionalProperties":false}],"title":"Gateway Node Pairing SSH Verification","description":"SSH-verified auto-approval for first-time node-role device pairing (default: enabled). The gateway SSHes back to the pairing host (BatchMode, strict host keys) and approves only when the remote `openclaw node identity` output matches the pending device key. Set false to disable SSH verification (independent of autoApproveCidrs, which stays active); for manual-only pairing also unset autoApproveCidrs. Pass an object to override user/identity/timeoutMs/cidrs."}},"additionalProperties":false,"title":"Gateway Node Pairing","description":"Node pairing policy settings. SSH-verified auto-approval is enabled by default; CIDR auto-approval stays disabled unless explicit trusted CIDR/IP allowlists are configured."},"pluginTools":{"type":"object","properties":{"enabled":{"type":"boolean","title":"Gateway Node Plugin Tools Enabled","description":"Accept agent-visible plugin tool descriptors published by paired nodes (default: true). Set false to ignore and remove all node-published plugin tools."}},"additionalProperties":false,"title":"Gateway Node Plugin Tools","description":"Controls whether paired nodes may publish agent-visible plugin tool descriptors."},"allowSkills":{"type":"boolean","title":"Gateway Node Skills Enabled","description":"Accept skills published by paired nodes while they are connected (default: true). Set false to ignore node-published skills."},"commands":{"type":"object","properties":{"allow":{"type":"array","items":{"type":"string"},"title":"Gateway Node Allowlist (Extra Commands)","description":"Extra node.invoke commands to allow beyond the gateway defaults (array of command strings). Enabling dangerous commands here is a security-sensitive override and is flagged by `openclaw security audit`."},"deny":{"type":"array","items":{"type":"string"},"title":"Gateway Node Denylist","description":"Node command names to block even if present in node claims or default allowlist (exact command-name matching only, e.g. `system.run`; does not inspect shell text inside that command)."}},"additionalProperties":false}},"additionalProperties":false}},"additionalProperties":false,"title":"Gateway","description":"Gateway runtime surface for bind mode, auth, control UI, remote transport, and operational safety controls. Keep conservative defaults unless you intentionally expose the gateway beyond trusted local interfaces."},"cloudWorkers":{"type":"object","properties":{"desktop":{"type":"boolean","title":"Cloud Worker Desktop (Labs)","description":"Enables the experimental worker.desktop.observe surface and Control UI Desktop panel for desktop-capable cloud worker environments."},"projectProfiles":{"type":"object","propertyNames":{"type":"string","minLength":1},"additionalProperties":{"type":"string","minLength":1,"title":"Cloud Worker Project Profile","description":"Cloud worker profile name used by default when a session worktree's origin matches this repository identity."},"title":"Cloud Worker Project Profiles","description":"Default cloud worker profile names keyed by normalized lowercase repository identity (host/owner/repo). Explicit dispatch profile ids take precedence."},"profiles":{"type":"object","propertyNames":{"type":"string","minLength":1},"additionalProperties":{"type":"object","properties":{"provider":{"type":"string","minLength":1,"title":"Cloud Worker Provider","description":"Worker provider id registered by a plugin. The configured plugin must expose this id before the gateway can provision environments from the profile."},"install":{"default":"bundle","type":"string","enum":["bundle","npm"],"title":"Cloud Worker Install Method","description":"Worker installation method: \"bundle\" (default) transfers the gateway's content-hashed installed build and supports released, development, and unreleased versions; \"npm\" installs the exact gateway version and is available only when that version is released."},"suspendAfter":{"type":"string","title":"Cloud Worker Idle Suspend Duration","description":"Automatically reclaims an idle cloud worker after this duration, such as 45m or 2h; the next message provisions a replacement. Minimum: 1m. Leave unset to keep workers running."},"settings":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{},"title":"Cloud Worker Provider Settings","description":"Provider-owned settings validated by the selected plugin. Use SecretRef objects for secret-bearing values; opaque settings do not gain automatic secret resolution."}},"required":["provider"],"additionalProperties":false,"title":"Cloud Worker Profile","description":"One cloud worker profile selected by name when creating an environment. Keep provider credentials in supported references rather than embedding secret material in this block."},"title":"Cloud Worker Profiles","description":"Named cloud worker profiles. Each profile selects a worker provider registered by a plugin and carries provider-owned settings."}},"additionalProperties":false,"title":"Cloud Workers","description":"Opt-in cloud worker profiles for disposable remote environments. When this section is omitted or has no profiles, cloud worker creation remains unavailable and existing gateway/node status behavior is unchanged."},"desktop":{"type":"object","properties":{"host":{"type":"object","properties":{"enabled":{"type":"boolean","title":"Gateway Host Desktop (Labs)","description":"Enables the experimental gateway-host desktop source. Restart the gateway after changing this setting."},"managed":{"type":"boolean","title":"Managed Linux Host Desktop","description":"Runs and supervises a loopback-only headless TigerVNC/XFCE desktop on Linux. An explicit port or existing default-port VNC server still takes precedence."},"port":{"type":"integer","minimum":1,"maximum":65535,"title":"Gateway Host VNC Port","description":"Loopback RFB port of an already-running VNC server on the gateway host (default: 5900)."},"passwordFile":{"type":"string","minLength":1,"title":"Gateway Host VNC Password File","description":"Absolute path to the VNC password file. Omit on macOS to use account/ARD authentication after that support lands."}},"required":["enabled"],"additionalProperties":false,"title":"Gateway Host Desktop","description":"Experimental gateway-host desktop observation backed by an existing or managed loopback VNC server."}},"additionalProperties":false},"memory":{"type":"object","properties":{"citations":{"anyOf":[{"type":"string","const":"auto"},{"type":"string","const":"on"},{"type":"string","const":"off"}],"title":"Memory Citations Mode","description":"Controls citation visibility in replies: \"auto\" shows citations when useful, \"on\" always shows them, and \"off\" hides them. Keep \"auto\" for a balanced signal-to-noise default."},"search":{"type":"object","properties":{"enabled":{"type":"boolean","title":"Enable Memory Search","description":"Master toggle for memory search indexing and retrieval behavior on this agent profile. Keep enabled for semantic recall, and disable when you want fully stateless responses."},"rememberAcrossConversations":{"type":"boolean","title":"Remember Across Conversations","description":"Use relevant context from this agent's other private conversations through protected transcript recall. Defaults on only when global session.dmScope is unset or \"main\" and no binding overrides DM scope; any configured DM isolation defaults it off. An explicit true or false always wins."},"sources":{"type":"array","items":{"anyOf":[{"type":"string","const":"memory"},{"type":"string","const":"sessions"}]},"title":"Memory Search Sources","description":"Chooses which sources are indexed: \"memory\" reads MEMORY.md + memory files, and \"sessions\" includes transcript history. Keep [\"memory\"] unless you need recall from prior chat transcripts."},"extraPaths":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"object","properties":{"path":{"type":"string","title":"Extra Memory Path","description":"Sets the extra memory directory or file. Relative paths resolve from the agent workspace; direct file entries are indexed exactly."},"pattern":{"type":"string","title":"Extra Memory Path Pattern","description":"Limits a directory entry to supported files matching this root-relative glob, for example \"runbooks/**/*.md\". Omit it to scan all supported files recursively."}},"required":["path"],"additionalProperties":false}]},"title":"Extra Memory Paths","description":"Adds extra directories or .md files to the memory index beyond default memory files. Entries may be path strings or objects with a root-relative glob pattern. When multimodal memory is enabled, matching image/audio files under these paths are also eligible for indexing."},"multimodal":{"type":"object","properties":{"enabled":{"type":"boolean","title":"Enable Memory Search Multimodal","description":"Enables image/audio memory indexing from extraPaths. This currently requires Gemini embedding-2, keeps the default memory roots Markdown-only, disables memory-search fallback providers, and uploads matching binary content to the configured remote embedding provider."},"modalities":{"type":"array","items":{"anyOf":[{"type":"string","const":"image"},{"type":"string","const":"audio"},{"type":"string","const":"all"}]},"title":"Memory Search Multimodal Modalities","description":"Selects which multimodal file types are indexed from extraPaths: \"image\", \"audio\", or \"all\". Keep this narrow to avoid indexing large binary corpora unintentionally."},"maxFileBytes":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"title":"Memory Search Multimodal Max File Bytes","description":"Sets the maximum bytes allowed per multimodal file before it is skipped during memory indexing. Use this to cap upload cost and indexing latency, or raise it for short high-quality audio clips."}},"additionalProperties":false,"title":"Memory Search Multimodal","description":"Optional multimodal memory settings for indexing image and audio files from configured extra paths. Keep this off unless your embedding model explicitly supports cross-modal embeddings, and set `memory.search.fallback` to \"none\" while it is enabled. Matching files are uploaded to the configured remote embedding provider during indexing."},"experimental":{"type":"object","properties":{"sessionMemory":{"type":"boolean","title":"Memory Search Session Index (Experimental)","description":"Indexes session transcripts into memory search. Keep this advanced override when root and per-agent recall inheritance differ."}},"additionalProperties":false},"provider":{"type":"string","title":"Memory Search Provider","description":"Selects the embedding backend used to build/query memory vectors. Defaults to \"openai\"; set \"openai-compatible\", \"gemini\", \"voyage\", \"mistral\", \"bedrock\", \"deepinfra\", \"github-copilot\", \"lmstudio\", \"ollama\", or \"local\" when you want a different backend."},"remote":{"type":"object","properties":{"baseUrl":{"type":"string","title":"Remote Embedding Base URL","description":"Overrides the embedding API endpoint, such as an OpenAI-compatible proxy or custom Gemini base URL. Use this only when routing through your own gateway or vendor endpoint; keep provider defaults otherwise."},"apiKey":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"store"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false}]}],"title":"Remote Embedding API Key","description":"Supplies a dedicated API key for remote embedding calls used by memory indexing and query-time embeddings. Use this when memory embeddings should use different credentials than global defaults or environment variables."},"headers":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"},"title":"Remote Embedding Headers","description":"Adds custom HTTP headers to remote embedding requests, merged with provider defaults. Use this for proxy auth and tenant routing headers, and keep values minimal to avoid leaking sensitive metadata."},"batch":{"type":"object","properties":{"enabled":{"type":"boolean","title":"Remote Batch Embedding Enabled","description":"Enables provider batch APIs for embedding jobs when supported (OpenAI/Gemini), improving throughput on larger index runs. Keep this enabled unless debugging provider batch failures or running very small workloads."}},"additionalProperties":false}},"additionalProperties":false},"fallback":{"type":"string","title":"Memory Search Fallback","description":"Backup provider used when primary embeddings fail: \"openai\", \"gemini\", \"voyage\", \"mistral\", \"bedrock\", \"lmstudio\", \"ollama\", \"local\", or \"none\". Set a real fallback for production reliability; use \"none\" only if you prefer explicit failures."},"model":{"type":"string","title":"Memory Search Model","description":"Embedding model override used by the selected memory provider when a non-default model is required. Set this only when you need explicit recall quality/cost tuning beyond provider defaults."},"inputType":{"type":"string","minLength":1,"title":"Memory Search Input Type","description":"Use this optional provider-specific `input_type` value only when the same label should apply to both query and document embedding requests. For asymmetric providers, prefer queryInputType and documentInputType."},"queryInputType":{"type":"string","minLength":1,"title":"Memory Search Query Input Type","description":"Optional provider-specific `input_type` value for query-time memory embeddings. Use this with OpenAI-compatible asymmetric embedding endpoints that require a query label."},"documentInputType":{"type":"string","minLength":1,"title":"Memory Search Document Input Type","description":"Optional provider-specific `input_type` value for document and indexing memory embeddings. Use this with OpenAI-compatible asymmetric embedding endpoints that require a passage or document label."},"outputDimensionality":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"title":"Memory Search Output Dimensionality","description":"Provider-specific output vector size override for memory embeddings. Gemini models support 128-3072 dimensions and recommend 768, 1536, or 3072; Bedrock families such as Titan V2, Cohere V4, and Nova expose their own allowed sizes. Expect a full reindex when you change it because stored vector dimensions must stay consistent."},"local":{"type":"object","properties":{"modelPath":{"type":"string","title":"Local Embedding Model Path","description":"Specifies the local embedding model source for local memory search, such as a GGUF file path or `hf:` URI. Use this only when provider is `local`, and verify model compatibility before large index rebuilds."}},"additionalProperties":false},"store":{"type":"object","properties":{"fts":{"type":"object","properties":{"tokenizer":{"anyOf":[{"type":"string","const":"unicode61"},{"type":"string","const":"trigram"}]}},"additionalProperties":false},"vector":{"type":"object","properties":{"enabled":{"type":"boolean","title":"Memory Search Vector Index","description":"Controls the sqlite-vec semantic index. Keep this advanced override when root and per-agent vector policies differ."},"extensionPath":{"type":"string","title":"Memory Search Vector Extension Path","description":"Overrides the auto-discovered sqlite-vec extension library path (`.dylib`, `.so`, or `.dll`). Use this when your runtime cannot find sqlite-vec automatically or you pin a known-good build."}},"additionalProperties":false}},"additionalProperties":false},"query":{"type":"object","properties":{"maxResults":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"title":"Memory Search Max Results","description":"Maximum number of memory hits returned from search before downstream reranking and prompt injection. Raise for broader recall, or lower for tighter prompts and faster responses."},"minScore":{"type":"number","minimum":0,"maximum":1,"title":"Memory Search Min Score","description":"Minimum relevance score threshold for including memory results in final recall output. Increase to reduce weak/noisy matches, or lower when you need more permissive retrieval."}},"additionalProperties":false},"cache":{"type":"object","properties":{"enabled":{"type":"boolean","title":"Memory Search Embedding Cache","description":"Caches computed chunk embeddings in SQLite so reindexing and incremental updates run faster (default: true). Keep this enabled unless investigating cache correctness or minimizing disk usage."}},"additionalProperties":false}},"additionalProperties":false,"title":"Memory Search","description":"Vector search over MEMORY.md and memory/*.md (per-agent overrides supported)."}},"additionalProperties":false,"title":"Memory","description":"Built-in memory configuration (global)."},"mcp":{"type":"object","properties":{"servers":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"enabled":{"type":"boolean","title":"MCP Server Enabled"},"command":{"type":"string"},"args":{"type":"array","items":{"type":"string"}},"env":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]}},"cwd":{"type":"string"},"url":{"type":"string","format":"uri"},"transport":{"anyOf":[{"type":"string","const":"stdio"},{"type":"string","const":"sse"},{"type":"string","const":"streamable-http"}]},"headers":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]}},"connectionTimeoutMs":{"type":"number","exclusiveMinimum":0,"title":"MCP Connect Timeout (ms)"},"requestTimeoutMs":{"type":"number","exclusiveMinimum":0,"title":"MCP Request Timeout (ms)"},"supportsParallelToolCalls":{"type":"boolean","title":"MCP Parallel Tool Calls"},"auth":{"type":"string","const":"oauth","title":"MCP Server Auth"},"oauth":{"type":"object","properties":{"identity":{"type":"string","enum":["shared","per-requester"],"title":"MCP OAuth Identity","description":"OAuth credential ownership for this server. Omit this field or use \"shared\" for operator-managed credentials; use \"per-requester\" to let each authenticated sender connect their own account."},"authProfileId":{"type":"string","minLength":1,"title":"MCP OAuth Auth Profile","description":"Refresh-capable auth profile id used to inject the current bearer token into this remote MCP server. When set, OpenClaw resolves and refreshes the profile at runtime and does not project refresh material downstream."},"scope":{"type":"string","minLength":1,"title":"MCP OAuth Scope"},"redirectUrl":{"type":"string","format":"uri","title":"MCP OAuth Redirect URL"},"clientMetadataUrl":{"type":"string","format":"uri","title":"MCP OAuth Client Metadata URL"}},"additionalProperties":false,"title":"MCP OAuth"},"sslVerify":{"type":"boolean","title":"MCP TLS Verification"},"clientCert":{"type":"string","title":"MCP Client Certificate"},"clientKey":{"type":"string","title":"MCP Client Key"},"toolFilter":{"type":"object","properties":{"include":{"minItems":1,"type":"array","items":{"type":"string","minLength":1},"title":"Included MCP Tools","description":"Exact MCP tool names or simple '*' globs to expose from this server. When omitted, all server tools remain eligible unless excluded."},"exclude":{"minItems":1,"type":"array","items":{"type":"string","minLength":1},"title":"Excluded MCP Tools","description":"Exact MCP tool names or simple '*' globs to hide from this server."}},"additionalProperties":false,"title":"MCP Tool Selection","description":"Per-server MCP tool selection. Use include to expose only selected MCP tool names, or exclude to hide selected MCP tool names. Entries accept exact names and simple '*' globs."},"codex":{"type":"object","properties":{"agents":{"minItems":1,"type":"array","items":{"type":"string","pattern":"^[a-z0-9][a-z0-9_-]{0,63}$"},"title":"Codex MCP Agents","description":"Optional non-empty OpenClaw agent ids that should receive this MCP server in Codex app-server thread config. Empty, blank, or invalid lists fail closed; when omitted, the server is projected for all Codex app-server agents."},"defaultToolsApprovalMode":{"type":"string","enum":["auto","prompt","approve"],"title":"Codex MCP Tool Approval","description":"Optional Codex MCP tool approval mode for this server: \"auto\", \"prompt\", or \"approve\". Use only for MCP servers you intentionally trust."}},"additionalProperties":false,"title":"Codex MCP Projection","description":"OpenClaw projection metadata for Codex app-server threads only. It does not affect ACP sessions or generic Codex harness config. Omit this block to keep the server available to every Codex app-server agent with Codex's default MCP approval behavior."}},"additionalProperties":{}},"title":"MCP Servers","description":"Named MCP server definitions. OpenClaw stores them in its own config and runtime adapters decide which transports are supported at execution time."},"apps":{"type":"object","properties":{"enabled":{"type":"boolean","title":"MCP Apps Enabled","description":"Opt-in MCP Apps rendering and app-to-server bridge. Keep disabled unless you trust the configured MCP servers that provide app UI resources."},"sandboxOrigin":{"type":"string","format":"uri","title":"MCP Apps Sandbox Origin","description":"Optional dedicated public HTTP(S) origin for MCP Apps. Use this behind a reverse proxy or TLS terminator and proxy it only to the configured MCP Apps sandbox port. It must differ from the Control UI origin and must not serve authenticated content."},"sandboxPort":{"type":"integer","minimum":1,"maximum":65535,"title":"MCP Apps Sandbox Port","description":"Dedicated MCP Apps sandbox listener port. Defaults to the Gateway port plus one. Set an unused port when another local service or Gateway profile already owns that port."}},"additionalProperties":false,"title":"MCP Apps","description":"MCP Apps UI support. When enabled, configured MCP servers may provide interactive HTML views for their tool results."}},"additionalProperties":false,"title":"MCP","description":"Global MCP server definitions managed by OpenClaw. Embedded OpenClaw and other runtime adapters can consume these servers without storing them inside runtime-owned project settings."},"skills":{"type":"object","properties":{"allowBundled":{"type":"array","items":{"type":"string"}},"load":{"type":"object","properties":{"extraDirs":{"type":"array","items":{"type":"string"},"title":"Extra Skill Directories","description":"Additional shared skill roots to scan at lowest precedence. Use this for sibling repos or shared skill packs that should be available without copying them into the OpenClaw workspace."},"allowSymlinkTargets":{"type":"array","items":{"type":"string"},"title":"Allowed Skill Symlink Targets","description":"Trusted real target roots that skill symlinks may resolve into when they sit outside their configured source root. Keep this narrow, such as a sibling repo skills directory."},"watch":{"type":"boolean","title":"Watch Skills","description":"Enable filesystem watching for skill-definition changes so updates can be applied without full process restart. Keep enabled in development workflows and disable in immutable production images."}},"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"}]},"allowUploadedArchives":{"type":"boolean"}},"additionalProperties":false},"limits":{"type":"object","properties":{"maxCandidatesPerRoot":{"type":"integer","minimum":1,"maximum":9007199254740991},"maxSkillsLoadedPerSource":{"type":"integer","minimum":1,"maximum":9007199254740991},"maxSkillsInPrompt":{"type":"integer","minimum":0,"maximum":9007199254740991},"maxSkillsPromptChars":{"type":"integer","minimum":0,"maximum":9007199254740991},"maxSkillFileBytes":{"type":"integer","minimum":0,"maximum":9007199254740991}},"additionalProperties":false},"workshop":{"type":"object","properties":{"autonomous":{"type":"object","properties":{"mode":{"anyOf":[{"type":"string","const":"off"},{"type":"string","const":"propose"},{"type":"string","const":"auto"}],"title":"Skill Workshop Autonomous Mode","description":"Controls background learning: \"off\" keeps only the suggestion nudge, \"propose\" creates pending proposals, and \"auto\" applies captured proposals and runs daily scanner-gated cleanup that can rewrite or drop eligible writable skills. Default: \"auto\"."}},"additionalProperties":false},"approvalPolicy":{"anyOf":[{"type":"string","const":"pending"},{"type":"string","const":"auto"}]},"allowSymlinkTargetWrites":{"type":"boolean","title":"Allow Skill Workshop Symlink Writes","description":"Allows Skill Workshop apply to write through symlinked workspace skill paths whose real target is already trusted by skills.load.allowSymlinkTargets. Keep disabled unless operators intentionally want generated proposal applies to mutate those shared skill roots."},"maxPending":{"type":"integer","minimum":1,"maximum":9007199254740991},"maxSkillBytes":{"type":"integer","minimum":1,"maximum":9007199254740991}},"additionalProperties":false},"entries":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"enabled":{"type":"boolean"},"apiKey":{"anyOf":[{"type":"string"},{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"env"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"file"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"exec"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string"}},"required":["source","provider","id"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","const":"store"},"provider":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"},"id":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,127}$"}},"required":["source","provider","id"],"additionalProperties":false}]}]},"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","title":"Enable Plugins","description":"Enable or disable plugin/extension loading globally during startup and config reload (default: true). Keep enabled only when extension capabilities are required by your deployment."},"allow":{"type":"array","items":{"type":"string"},"title":"Plugin Allowlist","description":"Optional allowlist of plugin IDs; when set, only listed plugins are eligible to load. Configured bundled chat channels can still activate their bundled plugin when the channel is explicitly enabled in config. Use this to enforce approved extension inventories in controlled environments."},"deny":{"type":"array","items":{"type":"string"},"title":"Plugin Denylist","description":"Optional denylist of plugin IDs that are blocked even if allowlists or paths include them. Use deny rules for emergency rollback and hard blocks on risky plugins."},"load":{"type":"object","properties":{"paths":{"type":"array","items":{"type":"string"},"title":"Plugin Load Paths","description":"Additional plugin files or directories scanned by the loader beyond built-in defaults. Use dedicated extension directories and avoid broad paths with unrelated executable content."}},"additionalProperties":false,"title":"Plugin Loader","description":"Plugin loader configuration group for specifying filesystem paths where plugins are discovered. Keep load paths explicit and reviewed to avoid accidental untrusted extension loading."},"slots":{"type":"object","properties":{"memory":{"type":"string","title":"Memory Plugin","description":"Select the active memory plugin by id, or \"none\" to disable memory plugins."},"contextEngine":{"type":"string","title":"Context Engine Plugin","description":"Selects the active context engine plugin by id so one plugin provides context orchestration behavior."}},"additionalProperties":false,"title":"Plugin Slots","description":"Selects which plugins own exclusive runtime slots such as memory so only one plugin provides that capability. Use explicit slot ownership to avoid overlapping providers with conflicting behavior."},"entries":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"enabled":{"type":"boolean","title":"Plugin Enabled","description":"Per-plugin enablement override for a specific entry, applied on top of global plugin policy (restart required). Use this to stage plugin rollout gradually across environments."},"hooks":{"type":"object","properties":{"allowPromptInjection":{"type":"boolean","title":"Allow Prompt Injection Hooks","description":"Controls whether this plugin may mutate prompts through typed hooks. Set false to block `before_prompt_build`."},"allowConversationAccess":{"type":"boolean","title":"Allow Conversation Access Hooks","description":"Controls whether this plugin may read raw conversation content from typed hooks such as `before_agent_run`, `before_model_resolve`, `before_agent_reply`, `llm_input`, `llm_output`, `before_agent_finalize`, and `agent_end`. Non-bundled plugins must opt in explicitly."},"timeoutMs":{"type":"integer","exclusiveMinimum":0,"maximum":600000,"title":"Plugin Hook Timeout (ms)","description":"Default timeout in milliseconds for this plugin's typed hooks, capped at 600000. Use this to bound slow plugin hooks without changing plugin code; per-hook values in hooks.timeouts take precedence."},"timeouts":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"integer","exclusiveMinimum":0,"maximum":600000},"title":"Plugin Hook Timeout Overrides","description":"Per-hook timeout overrides in milliseconds keyed by typed hook name, capped at 600000. Use narrow overrides for known slow hooks such as before_prompt_build or agent_end instead of raising every hook timeout."}},"additionalProperties":false,"title":"Plugin Hook Policy","description":"Per-plugin typed hook policy controls for core-enforced safety gates. Use this to constrain high-impact hook categories without disabling the entire plugin."},"subagent":{"type":"object","properties":{"allowModelOverride":{"type":"boolean","title":"Allow Plugin Subagent Model Override","description":"Explicitly allows this plugin to request provider/model overrides in background subagent runs. Keep false unless the plugin is trusted to steer model selection."},"allowedModels":{"type":"array","items":{"type":"string"},"title":"Plugin Subagent Allowed Models","description":"Allowed override targets for trusted plugin subagent runs as canonical \"provider/model\" refs. Use \"*\" only when you intentionally allow any model."}},"additionalProperties":false,"title":"Plugin Subagent Policy","description":"Per-plugin subagent runtime controls for model override trust and allowlists. Keep this unset unless a plugin must explicitly steer subagent model selection."},"llm":{"type":"object","properties":{"allowModelOverride":{"type":"boolean","title":"Allow Plugin LLM Model Override","description":"Explicitly allows this plugin to request model overrides in api.runtime.llm.complete. Keep false unless the plugin is trusted to steer model selection."},"allowedModels":{"type":"array","items":{"type":"string"},"title":"Plugin LLM Allowed Models","description":"Allowed override targets for trusted plugin LLM calls as canonical \"provider/model\" refs. Use \"*\" only when you intentionally allow any model override."},"allowedCompletionModels":{"type":"array","items":{"type":"string"},"title":"Plugin LLM Allowed Completion Models","description":"Allowed targets for every plugin LLM completion as canonical \"provider/model\" refs, including host-resolved defaults and overrides. Use \"*\" only when you intentionally allow any model."},"allowAuthProfileOverride":{"type":"boolean","title":"Allow Plugin LLM Auth Profile Override","description":"Allows this plugin to select a non-default auth profile for isolated agent-runtime completions. Keep false unless the plugin is trusted for explicit isolated credential routing."},"allowAgentIdOverride":{"type":"boolean","title":"Allow Plugin LLM Agent Override","description":"Explicitly allows this plugin to request api.runtime.llm.complete against a non-default agent id. Keep false unless the plugin is trusted for cross-agent model access."}},"additionalProperties":false,"title":"Plugin LLM Policy","description":"Per-plugin api.runtime.llm.complete controls for model and agent override trust. Keep this unset unless a plugin must explicitly steer host-owned completion calls."},"config":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{},"title":"Plugin Config","description":"Plugin-defined configuration payload interpreted by that plugin's own schema and validation rules. Use only documented fields from the plugin to prevent ignored or invalid settings."}},"additionalProperties":false},"title":"Plugin Entries","description":"Per-plugin settings keyed by plugin ID including enablement and plugin-specific runtime configuration payloads. Use this for scoped plugin tuning without changing global loader policy.","properties":{"a2a":{"type":"object","properties":{"enabled":{"type":"boolean","title":"Plugin Enabled","description":"Per-plugin enablement override for a specific entry, applied on top of global plugin policy (restart required). Use this to stage plugin rollout gradually across environments."},"hooks":{"type":"object","properties":{"allowPromptInjection":{"type":"boolean","title":"Allow Prompt Injection Hooks","description":"Controls whether this plugin may mutate prompts through typed hooks. Set false to block `before_prompt_build`."},"allowConversationAccess":{"type":"boolean","title":"Allow Conversation Access Hooks","description":"Controls whether this plugin may read raw conversation content from typed hooks such as `before_agent_run`, `before_model_resolve`, `before_agent_reply`, `llm_input`, `llm_output`, `before_agent_finalize`, and `agent_end`. Non-bundled plugins must opt in explicitly."},"timeoutMs":{"type":"integer","exclusiveMinimum":0,"maximum":600000,"title":"Plugin Hook Timeout (ms)","description":"Default timeout in milliseconds for this plugin's typed hooks, capped at 600000. Use this to bound slow plugin hooks without changing plugin code; per-hook values in hooks.timeouts take precedence."},"timeouts":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"integer","exclusiveMinimum":0,"maximum":600000},"title":"Plugin Hook Timeout Overrides","description":"Per-hook timeout overrides in milliseconds keyed by typed hook name, capped at 600000. Use narrow overrides for known slow hooks such as before_prompt_build or agent_end instead of raising every hook timeout."}},"additionalProperties":false,"title":"Plugin Hook Policy","description":"Per-plugin typed hook policy controls for core-enforced safety gates. Use this to constrain high-impact hook categories without disabling the entire plugin."},"subagent":{"type":"object","properties":{"allowModelOverride":{"type":"boolean","title":"Allow Plugin Subagent Model Override","description":"Explicitly allows this plugin to request provider/model overrides in background subagent runs. Keep false unless the plugin is trusted to steer model selection."},"allowedModels":{"type":"array","items":{"type":"string"},"title":"Plugin Subagent Allowed Models","description":"Allowed override targets for trusted plugin subagent runs as canonical \"provider/model\" refs. Use \"*\" only when you intentionally allow any model."}},"additionalProperties":false,"title":"Plugin Subagent Policy","description":"Per-plugin subagent runtime controls for model override trust and allowlists. Keep this unset unless a plugin must explicitly steer subagent model selection."},"llm":{"type":"object","properties":{"allowModelOverride":{"type":"boolean","title":"Allow Plugin LLM Model Override","description":"Explicitly allows this plugin to request model overrides in api.runtime.llm.complete. Keep false unless the plugin is trusted to steer model selection."},"allowedModels":{"type":"array","items":{"type":"string"},"title":"Plugin LLM Allowed Models","description":"Allowed override targets for trusted plugin LLM calls as canonical \"provider/model\" refs. Use \"*\" only when you intentionally allow any model override."},"allowedCompletionModels":{"type":"array","items":{"type":"string"},"title":"Plugin LLM Allowed Completion Models","description":"Allowed targets for every plugin LLM completion as canonical \"provider/model\" refs, including host-resolved defaults and overrides. Use \"*\" only when you intentionally allow any model."},"allowAuthProfileOverride":{"type":"boolean","title":"Allow Plugin LLM Auth Profile Override","description":"Allows this plugin to select a non-default auth profile for isolated agent-runtime completions. Keep false unless the plugin is trusted for explicit isolated credential routing."},"allowAgentIdOverride":{"type":"boolean","title":"Allow Plugin LLM Agent Override","description":"Explicitly allows this plugin to request api.runtime.llm.complete against a non-default agent id. Keep false unless the plugin is trusted for cross-agent model access."}},"additionalProperties":false,"title":"Plugin LLM Policy","description":"Per-plugin api.runtime.llm.complete controls for model and agent override trust. Keep this unset unless a plugin must explicitly steer host-owned completion calls."},"config":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":false,"title":"Plugin Config","description":"Plugin-defined configuration payload interpreted by that plugin's own schema and validation rules. Use only documented fields from the plugin to prevent ignored or invalid settings.","properties":{}}},"additionalProperties":false},"active-memory":{"type":"object","properties":{"enabled":{"type":"boolean","title":"Plugin Enabled","description":"Per-plugin enablement override for a specific entry, applied on top of global plugin policy (restart required). Use this to stage plugin rollout gradually across environments."},"hooks":{"type":"object","properties":{"allowPromptInjection":{"type":"boolean","title":"Allow Prompt Injection Hooks","description":"Controls whether this plugin may mutate prompts through typed hooks. Set false to block `before_prompt_build`."},"allowConversationAccess":{"type":"boolean","title":"Allow Conversation Access Hooks","description":"Controls whether this plugin may read raw conversation content from typed hooks such as `before_agent_run`, `before_model_resolve`, `before_agent_reply`, `llm_input`, `llm_output`, `before_agent_finalize`, and `agent_end`. Non-bundled plugins must opt in explicitly."},"timeoutMs":{"type":"integer","exclusiveMinimum":0,"maximum":600000,"title":"Plugin Hook Timeout (ms)","description":"Default timeout in milliseconds for this plugin's typed hooks, capped at 600000. Use this to bound slow plugin hooks without changing plugin code; per-hook values in hooks.timeouts take precedence."},"timeouts":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"integer","exclusiveMinimum":0,"maximum":600000},"title":"Plugin Hook Timeout Overrides","description":"Per-hook timeout overrides in milliseconds keyed by typed hook name, capped at 600000. Use narrow overrides for known slow hooks such as before_prompt_build or agent_end instead of raising every hook timeout."}},"additionalProperties":false,"title":"Plugin Hook Policy","description":"Per-plugin typed hook policy controls for core-enforced safety gates. Use this to constrain high-impact hook categories without disabling the entire plugin."},"subagent":{"type":"object","properties":{"allowModelOverride":{"type":"boolean","title":"Allow Plugin Subagent Model Override","description":"Explicitly allows this plugin to request provider/model overrides in background subagent runs. Keep false unless the plugin is trusted to steer model selection."},"allowedModels":{"type":"array","items":{"type":"string"},"title":"Plugin Subagent Allowed Models","description":"Allowed override targets for trusted plugin subagent runs as canonical \"provider/model\" refs. Use \"*\" only when you intentionally allow any model."}},"additionalProperties":false,"title":"Plugin Subagent Policy","description":"Per-plugin subagent runtime controls for model override trust and allowlists. Keep this unset unless a plugin must explicitly steer subagent model selection."},"llm":{"type":"object","properties":{"allowModelOverride":{"type":"boolean","title":"Allow Plugin LLM Model Override","description":"Explicitly allows this plugin to request model overrides in api.runtime.llm.complete. Keep false unless the plugin is trusted to steer model selection."},"allowedModels":{"type":"array","items":{"type":"string"},"title":"Plugin LLM Allowed Models","description":"Allowed override targets for trusted plugin LLM calls as canonical \"provider/model\" refs. Use \"*\" only when you intentionally allow any model override."},"allowedCompletionModels":{"type":"array","items":{"type":"string"},"title":"Plugin LLM Allowed Completion Models","description":"Allowed targets for every plugin LLM completion as canonical \"provider/model\" refs, including host-resolved defaults and overrides. Use \"*\" only when you intentionally allow any model."},"allowAuthProfileOverride":{"type":"boolean","title":"Allow Plugin LLM Auth Profile Override","description":"Allows this plugin to select a non-default auth profile for isolated agent-runtime completions. Keep false unless the plugin is trusted for explicit isolated credential routing."},"allowAgentIdOverride":{"type":"boolean","title":"Allow Plugin LLM Agent Override","description":"Explicitly allows this plugin to request api.runtime.llm.complete against a non-default agent id. Keep false unless the plugin is trusted for cross-agent model access."}},"additionalProperties":false,"title":"Plugin LLM Policy","description":"Per-plugin api.runtime.llm.complete controls for model and agent override trust. Keep this unset unless a plugin must explicitly steer host-owned completion calls."},"config":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":false,"title":"Plugin Config","description":"Plugin-defined configuration payload interpreted by that plugin's own schema and validation rules. Use only documented fields from the plugin to prevent ignored or invalid settings.","properties":{"enabled":{"type":"boolean"},"mode":{"type":"string","enum":["escalate","always","off"]},"agents":{"type":"array","items":{"type":"string"}},"model":{"type":"string"},"modelFallback":{"type":"string"},"modelFallbackPolicy":{"type":"string","enum":["default-remote","resolved-only"]},"allowedChatTypes":{"type":"array","items":{"type":"string","enum":["direct","group","channel","explicit"]}},"allowedChatIds":{"type":"array","items":{"type":"string"}},"deniedChatIds":{"type":"array","items":{"type":"string"}},"thinking":{"type":"string","enum":["off","minimal","low","medium","high","xhigh","adaptive","max"]},"fastMode":{"anyOf":[{"type":"boolean"},{"type":"string","enum":["auto"]}]},"timeoutMs":{"type":"integer","minimum":250,"maximum":120000},"setupGraceTimeoutMs":{"type":"integer","minimum":0,"maximum":30000},"queryMode":{"type":"string","enum":["message","recent","full"]},"promptStyle":{"type":"string","enum":["balanced","strict","contextual","recall-heavy","precision-heavy","preference-only"]},"toolsAllow":{"type":"array","items":{"type":"string","pattern":"^(?!\\*$)(?![Gg][Rr][Oo][Uu][Pp]:).+"},"maxItems":32},"promptOverride":{"type":"string"},"promptAppend":{"type":"string"},"maxSummaryChars":{"type":"integer","minimum":40,"maximum":1000},"recentUserTurns":{"type":"integer","minimum":0,"maximum":4},"recentAssistantTurns":{"type":"integer","minimum":0,"maximum":3},"recentUserChars":{"type":"integer","minimum":40,"maximum":1000},"recentAssistantChars":{"type":"integer","minimum":40,"maximum":1000},"logging":{"type":"boolean"},"persistTranscripts":{"type":"boolean"},"transcriptDir":{"type":"string"},"cacheTtlMs":{"type":"integer","minimum":1000,"maximum":120000},"circuitBreakerMaxTimeouts":{"type":"integer","minimum":1,"maximum":20},"circuitBreakerCooldownMs":{"type":"integer","minimum":5000,"maximum":600000}}}},"additionalProperties":false},"admin-http-rpc":{"type":"object","properties":{"enabled":{"type":"boolean","title":"Plugin Enabled","description":"Per-plugin enablement override for a specific entry, applied on top of global plugin policy (restart required). Use this to stage plugin rollout gradually across environments."},"hooks":{"type":"object","properties":{"allowPromptInjection":{"type":"boolean","title":"Allow Prompt Injection Hooks","description":"Controls whether this plugin may mutate prompts through typed hooks. Set false to block `before_prompt_build`."},"allowConversationAccess":{"type":"boolean","title":"Allow Conversation Access Hooks","description":"Controls whether this plugin may read raw conversation content from typed hooks such as `before_agent_run`, `before_model_resolve`, `before_agent_reply`, `llm_input`, `llm_output`, `before_agent_finalize`, and `agent_end`. Non-bundled plugins must opt in explicitly."},"timeoutMs":{"type":"integer","exclusiveMinimum":0,"maximum":600000,"title":"Plugin Hook Timeout (ms)","description":"Default timeout in milliseconds for this plugin's typed hooks, capped at 600000. Use this to bound slow plugin hooks without changing plugin code; per-hook values in hooks.timeouts take precedence."},"timeouts":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"integer","exclusiveMinimum":0,"maximum":600000},"title":"Plugin Hook Timeout Overrides","description":"Per-hook timeout overrides in milliseconds keyed by typed hook name, capped at 600000. Use narrow overrides for known slow hooks such as before_prompt_build or agent_end instead of raising every hook timeout."}},"additionalProperties":false,"title":"Plugin Hook Policy","description":"Per-plugin typed hook policy controls for core-enforced safety gates. Use this to constrain high-impact hook categories without disabling the entire plugin."},"subagent":{"type":"object","properties":{"allowModelOverride":{"type":"boolean","title":"Allow Plugin Subagent Model Override","description":"Explicitly allows this plugin to request provider/model overrides in background subagent runs. Keep false unless the plugin is trusted to steer model selection."},"allowedModels":{"type":"array","items":{"type":"string"},"title":"Plugin Subagent Allowed Models","description":"Allowed override targets for trusted plugin subagent runs as canonical \"provider/model\" refs. Use \"*\" only when you intentionally allow any model."}},"additionalProperties":false,"title":"Plugin Subagent Policy","description":"Per-plugin subagent runtime controls for model override trust and allowlists. Keep this unset unless a plugin must explicitly steer subagent model selection."},"llm":{"type":"object","properties":{"allowModelOverride":{"type":"boolean","title":"Allow Plugin LLM Model Override","description":"Explicitly allows this plugin to request model overrides in api.runtime.llm.complete. Keep false unless the plugin is trusted to steer model selection."},"allowedModels":{"type":"array","items":{"type":"string"},"title":"Plugin LLM Allowed Models","description":"Allowed override targets for trusted plugin LLM calls as canonical \"provider/model\" refs. Use \"*\" only when you intentionally allow any model override."},"allowedCompletionModels":{"type":"array","items":{"type":"string"},"title":"Plugin LLM Allowed Completion Models","description":"Allowed targets for every plugin LLM completion as canonical \"provider/model\" refs, including host-resolved defaults and overrides. Use \"*\" only when you intentionally allow any model."},"allowAuthProfileOverride":{"type":"boolean","title":"Allow Plugin LLM Auth Profile Override","description":"Allows this plugin to select a non-default auth profile for isolated agent-runtime completions. Keep false unless the plugin is trusted for explicit isolated credential routing."},"allowAgentIdOverride":{"type":"boolean","title":"Allow Plugin LLM Agent Override","description":"Explicitly allows this plugin to request api.runtime.llm.complete against a non-default agent id. Keep false unless the plugin is trusted for cross-agent model access."}},"additionalProperties":false,"title":"Plugin LLM Policy","description":"Per-plugin api.runtime.llm.complete controls for model and agent override trust. Keep this unset unless a plugin must explicitly steer host-owned completion calls."},"config":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":false,"title":"Plugin Config","description":"Plugin-defined configuration payload interpreted by that plugin's own schema and validation rules. Use only documented fields from the plugin to prevent ignored or invalid settings.","properties":{}}},"additionalProperties":false},"alibaba":{"type":"object","properties":{"enabled":{"type":"boolean","title":"Plugin Enabled","description":"Per-plugin enablement override for a specific entry, applied on top of global plugin policy (restart required). Use this to stage plugin rollout gradually across environments."},"hooks":{"type":"object","properties":{"allowPromptInjection":{"type":"boolean","title":"Allow Prompt Injection Hooks","description":"Controls whether this plugin may mutate prompts through typed hooks. Set false to block `before_prompt_build`."},"allowConversationAccess":{"type":"boolean","title":"Allow Conversation Access Hooks","description":"Controls whether this plugin may read raw conversation content from typed hooks such as `before_agent_run`, `before_model_resolve`, `before_agent_reply`, `llm_input`, `llm_output`, `before_agent_finalize`, and `agent_end`. Non-bundled plugins must opt in explicitly."},"timeoutMs":{"type":"integer","exclusiveMinimum":0,"maximum":600000,"title":"Plugin Hook Timeout (ms)","description":"Default timeout in milliseconds for this plugin's typed hooks, capped at 600000. Use this to bound slow plugin hooks without changing plugin code; per-hook values in hooks.timeouts take precedence."},"timeouts":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"integer","exclusiveMinimum":0,"maximum":600000},"title":"Plugin Hook Timeout Overrides","description":"Per-hook timeout overrides in milliseconds keyed by typed hook name, capped at 600000. Use narrow overrides for known slow hooks such as before_prompt_build or agent_end instead of raising every hook timeout."}},"additionalProperties":false,"title":"Plugin Hook Policy","description":"Per-plugin typed hook policy controls for core-enforced safety gates. Use this to constrain high-impact hook categories without disabling the entire plugin."},"subagent":{"type":"object","properties":{"allowModelOverride":{"type":"boolean","title":"Allow Plugin Subagent Model Override","description":"Explicitly allows this plugin to request provider/model overrides in background subagent runs. Keep false unless the plugin is trusted to steer model selection."},"allowedModels":{"type":"array","items":{"type":"string"},"title":"Plugin Subagent Allowed Models","description":"Allowed override targets for trusted plugin subagent runs as canonical \"provider/model\" refs. Use \"*\" only when you intentionally allow any model."}},"additionalProperties":false,"title":"Plugin Subagent Policy","description":"Per-plugin subagent runtime controls for model override trust and allowlists. Keep this unset unless a plugin must explicitly steer subagent model selection."},"llm":{"type":"object","properties":{"allowModelOverride":{"type":"boolean","title":"Allow Plugin LLM Model Override","description":"Explicitly allows this plugin to request model overrides in api.runtime.llm.complete. Keep false unless the plugin is trusted to steer model selection."},"allowedModels":{"type":"array","items":{"type":"string"},"title":"Plugin LLM Allowed Models","description":"Allowed override targets for trusted plugin LLM calls as canonical \"provider/model\" refs. Use \"*\" only when you intentionally allow any model override."},"allowedCompletionModels":{"type":"array","items":{"type":"string"},"title":"Plugin LLM Allowed Completion Models","description":"Allowed targets for every plugin LLM completion as canonical \"provider/model\" refs, including host-resolved defaults and overrides. Use \"*\" only when you intentionally allow any model."},"allowAuthProfileOverride":{"type":"boolean","title":"Allow Plugin LLM Auth Profile Override","description":"Allows this plugin to select a non-default auth profile for isolated agent-runtime completions. Keep false unless the plugin is trusted for explicit isolated credential routing."},"allowAgentIdOverride":{"type":"boolean","title":"Allow Plugin LLM Agent Override","description":"Explicitly allows this plugin to request api.runtime.llm.complete against a non-default agent id. Keep false unless the plugin is trusted for cross-agent model access."}},"additionalProperties":false,"title":"Plugin LLM Policy","description":"Per-plugin api.runtime.llm.complete controls for model and agent override trust. Keep this unset unless a plugin must explicitly steer host-owned completion calls."},"config":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":false,"title":"Plugin Config","description":"Plugin-defined configuration payload interpreted by that plugin's own schema and validation rules. Use only documented fields from the plugin to prevent ignored or invalid settings.","properties":{}}},"additionalProperties":false},"anthropic":{"type":"object","properties":{"enabled":{"type":"boolean","title":"Plugin Enabled","description":"Per-plugin enablement override for a specific entry, applied on top of global plugin policy (restart required). Use this to stage plugin rollout gradually across environments."},"hooks":{"type":"object","properties":{"allowPromptInjection":{"type":"boolean","title":"Allow Prompt Injection Hooks","description":"Controls whether this plugin may mutate prompts through typed hooks. Set false to block `before_prompt_build`."},"allowConversationAccess":{"type":"boolean","title":"Allow Conversation Access Hooks","description":"Controls whether this plugin may read raw conversation content from typed hooks such as `before_agent_run`, `before_model_resolve`, `before_agent_reply`, `llm_input`, `llm_output`, `before_agent_finalize`, and `agent_end`. Non-bundled plugins must opt in explicitly."},"timeoutMs":{"type":"integer","exclusiveMinimum":0,"maximum":600000,"title":"Plugin Hook Timeout (ms)","description":"Default timeout in milliseconds for this plugin's typed hooks, capped at 600000. Use this to bound slow plugin hooks without changing plugin code; per-hook values in hooks.timeouts take precedence."},"timeouts":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"integer","exclusiveMinimum":0,"maximum":600000},"title":"Plugin Hook Timeout Overrides","description":"Per-hook timeout overrides in milliseconds keyed by typed hook name, capped at 600000. Use narrow overrides for known slow hooks such as before_prompt_build or agent_end instead of raising every hook timeout."}},"additionalProperties":false,"title":"Plugin Hook Policy","description":"Per-plugin typed hook policy controls for core-enforced safety gates. Use this to constrain high-impact hook categories without disabling the entire plugin."},"subagent":{"type":"object","properties":{"allowModelOverride":{"type":"boolean","title":"Allow Plugin Subagent Model Override","description":"Explicitly allows this plugin to request provider/model overrides in background subagent runs. Keep false unless the plugin is trusted to steer model selection."},"allowedModels":{"type":"array","items":{"type":"string"},"title":"Plugin Subagent Allowed Models","description":"Allowed override targets for trusted plugin subagent runs as canonical \"provider/model\" refs. Use \"*\" only when you intentionally allow any model."}},"additionalProperties":false,"title":"Plugin Subagent Policy","description":"Per-plugin subagent runtime controls for model override trust and allowlists. Keep this unset unless a plugin must explicitly steer subagent model selection."},"llm":{"type":"object","properties":{"allowModelOverride":{"type":"boolean","title":"Allow Plugin LLM Model Override","description":"Explicitly allows this plugin to request model overrides in api.runtime.llm.complete. Keep false unless the plugin is trusted to steer model selection."},"allowedModels":{"type":"array","items":{"type":"string"},"title":"Plugin LLM Allowed Models","description":"Allowed override targets for trusted plugin LLM calls as canonical \"provider/model\" refs. Use \"*\" only when you intentionally allow any model override."},"allowedCompletionModels":{"type":"array","items":{"type":"string"},"title":"Plugin LLM Allowed Completion Models","description":"Allowed targets for every plugin LLM completion as canonical \"provider/model\" refs, including host-resolved defaults and overrides. Use \"*\" only when you intentionally allow any model."},"allowAuthProfileOverride":{"type":"boolean","title":"Allow Plugin LLM Auth Profile Override","description":"Allows this plugin to select a non-default auth profile for isolated agent-runtime completions. Keep false unless the plugin is trusted for explicit isolated credential routing."},"allowAgentIdOverride":{"type":"boolean","title":"Allow Plugin LLM Agent Override","description":"Explicitly allows this plugin to request api.runtime.llm.complete against a non-default agent id. Keep false unless the plugin is trusted for cross-agent model access."}},"additionalProperties":false,"title":"Plugin LLM Policy","description":"Per-plugin api.runtime.llm.complete controls for model and agent override trust. Keep this unset unless a plugin must explicitly steer host-owned completion calls."},"config":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":false,"title":"Plugin Config","description":"Plugin-defined configuration payload interpreted by that plugin's own schema and validation rules. Use only documented fields from the plugin to prevent ignored or invalid settings.","properties":{"sessionCatalog":{"type":"object","additionalProperties":false,"properties":{"enabled":{"type":"boolean","default":true}}}}}},"additionalProperties":false},"azure-speech":{"type":"object","properties":{"enabled":{"type":"boolean","title":"Plugin Enabled","description":"Per-plugin enablement override for a specific entry, applied on top of global plugin policy (restart required). Use this to stage plugin rollout gradually across environments."},"hooks":{"type":"object","properties":{"allowPromptInjection":{"type":"boolean","title":"Allow Prompt Injection Hooks","description":"Controls whether this plugin may mutate prompts through typed hooks. Set false to block `before_prompt_build`."},"allowConversationAccess":{"type":"boolean","title":"Allow Conversation Access Hooks","description":"Controls whether this plugin may read raw conversation content from typed hooks such as `before_agent_run`, `before_model_resolve`, `before_agent_reply`, `llm_input`, `llm_output`, `before_agent_finalize`, and `agent_end`. Non-bundled plugins must opt in explicitly."},"timeoutMs":{"type":"integer","exclusiveMinimum":0,"maximum":600000,"title":"Plugin Hook Timeout (ms)","description":"Default timeout in milliseconds for this plugin's typed hooks, capped at 600000. Use this to bound slow plugin hooks without changing plugin code; per-hook values in hooks.timeouts take precedence."},"timeouts":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"integer","exclusiveMinimum":0,"maximum":600000},"title":"Plugin Hook Timeout Overrides","description":"Per-hook timeout overrides in milliseconds keyed by typed hook name, capped at 600000. Use narrow overrides for known slow hooks such as before_prompt_build or agent_end instead of raising every hook timeout."}},"additionalProperties":false,"title":"Plugin Hook Policy","description":"Per-plugin typed hook policy controls for core-enforced safety gates. Use this to constrain high-impact hook categories without disabling the entire plugin."},"subagent":{"type":"object","properties":{"allowModelOverride":{"type":"boolean","title":"Allow Plugin Subagent Model Override","description":"Explicitly allows this plugin to request provider/model overrides in background subagent runs. Keep false unless the plugin is trusted to steer model selection."},"allowedModels":{"type":"array","items":{"type":"string"},"title":"Plugin Subagent Allowed Models","description":"Allowed override targets for trusted plugin subagent runs as canonical \"provider/model\" refs. Use \"*\" only when you intentionally allow any model."}},"additionalProperties":false,"title":"Plugin Subagent Policy","description":"Per-plugin subagent runtime controls for model override trust and allowlists. Keep this unset unless a plugin must explicitly steer subagent model selection."},"llm":{"type":"object","properties":{"allowModelOverride":{"type":"boolean","title":"Allow Plugin LLM Model Override","description":"Explicitly allows this plugin to request model overrides in api.runtime.llm.complete. Keep false unless the plugin is trusted to steer model selection."},"allowedModels":{"type":"array","items":{"type":"string"},"title":"Plugin LLM Allowed Models","description":"Allowed override targets for trusted plugin LLM calls as canonical \"provider/model\" refs. Use \"*\" only when you intentionally allow any model override."},"allowedCompletionModels":{"type":"array","items":{"type":"string"},"title":"Plugin LLM Allowed Completion Models","description":"Allowed targets for every plugin LLM completion as canonical \"provider/model\" refs, including host-resolved defaults and overrides. Use \"*\" only when you intentionally allow any model."},"allowAuthProfileOverride":{"type":"boolean","title":"Allow Plugin LLM Auth Profile Override","description":"Allows this plugin to select a non-default auth profile for isolated agent-runtime completions. Keep false unless the plugin is trusted for explicit isolated credential routing."},"allowAgentIdOverride":{"type":"boolean","title":"Allow Plugin LLM Agent Override","description":"Explicitly allows this plugin to request api.runtime.llm.complete against a non-default agent id. Keep false unless the plugin is trusted for cross-agent model access."}},"additionalProperties":false,"title":"Plugin LLM Policy","description":"Per-plugin api.runtime.llm.complete controls for model and agent override trust. Keep this unset unless a plugin must explicitly steer host-owned completion calls."},"config":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":false,"title":"Plugin Config","description":"Plugin-defined configuration payload interpreted by that plugin's own schema and validation rules. Use only documented fields from the plugin to prevent ignored or invalid settings.","properties":{"apiKey":{"type":"string","description":"Azure Speech resource key. Falls back to AZURE_SPEECH_KEY, AZURE_SPEECH_API_KEY, or SPEECH_KEY."},"region":{"type":"string","description":"Azure Speech resource region, for example eastus. Falls back to AZURE_SPEECH_REGION or SPEECH_REGION."},"endpoint":{"type":"string","description":"Optional Azure Speech endpoint/base URL override."},"baseUrl":{"type":"string","description":"Optional Azure Speech base URL override."},"voice":{"type":"string","description":"Azure Speech voice ShortName (default en-US-JennyNeural)."},"lang":{"type":"string","description":"SSML language code (default en-US)."},"outputFormat":{"type":"string","description":"Azure Speech X-Microsoft-OutputFormat for audio-file output."},"voiceNoteOutputFormat":{"type":"string","description":"Azure Speech X-Microsoft-OutputFormat for voice-note output."}}}},"additionalProperties":false},"beam":{"type":"object","properties":{"enabled":{"type":"boolean","title":"Plugin Enabled","description":"Per-plugin enablement override for a specific entry, applied on top of global plugin policy (restart required). Use this to stage plugin rollout gradually across environments."},"hooks":{"type":"object","properties":{"allowPromptInjection":{"type":"boolean","title":"Allow Prompt Injection Hooks","description":"Controls whether this plugin may mutate prompts through typed hooks. Set false to block `before_prompt_build`."},"allowConversationAccess":{"type":"boolean","title":"Allow Conversation Access Hooks","description":"Controls whether this plugin may read raw conversation content from typed hooks such as `before_agent_run`, `before_model_resolve`, `before_agent_reply`, `llm_input`, `llm_output`, `before_agent_finalize`, and `agent_end`. Non-bundled plugins must opt in explicitly."},"timeoutMs":{"type":"integer","exclusiveMinimum":0,"maximum":600000,"title":"Plugin Hook Timeout (ms)","description":"Default timeout in milliseconds for this plugin's typed hooks, capped at 600000. Use this to bound slow plugin hooks without changing plugin code; per-hook values in hooks.timeouts take precedence."},"timeouts":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"integer","exclusiveMinimum":0,"maximum":600000},"title":"Plugin Hook Timeout Overrides","description":"Per-hook timeout overrides in milliseconds keyed by typed hook name, capped at 600000. Use narrow overrides for known slow hooks such as before_prompt_build or agent_end instead of raising every hook timeout."}},"additionalProperties":false,"title":"Plugin Hook Policy","description":"Per-plugin typed hook policy controls for core-enforced safety gates. Use this to constrain high-impact hook categories without disabling the entire plugin."},"subagent":{"type":"object","properties":{"allowModelOverride":{"type":"boolean","title":"Allow Plugin Subagent Model Override","description":"Explicitly allows this plugin to request provider/model overrides in background subagent runs. Keep false unless the plugin is trusted to steer model selection."},"allowedModels":{"type":"array","items":{"type":"string"},"title":"Plugin Subagent Allowed Models","description":"Allowed override targets for trusted plugin subagent runs as canonical \"provider/model\" refs. Use \"*\" only when you intentionally allow any model."}},"additionalProperties":false,"title":"Plugin Subagent Policy","description":"Per-plugin subagent runtime controls for model override trust and allowlists. Keep this unset unless a plugin must explicitly steer subagent model selection."},"llm":{"type":"object","properties":{"allowModelOverride":{"type":"boolean","title":"Allow Plugin LLM Model Override","description":"Explicitly allows this plugin to request model overrides in api.runtime.llm.complete. Keep false unless the plugin is trusted to steer model selection."},"allowedModels":{"type":"array","items":{"type":"string"},"title":"Plugin LLM Allowed Models","description":"Allowed override targets for trusted plugin LLM calls as canonical \"provider/model\" refs. Use \"*\" only when you intentionally allow any model override."},"allowedCompletionModels":{"type":"array","items":{"type":"string"},"title":"Plugin LLM Allowed Completion Models","description":"Allowed targets for every plugin LLM completion as canonical \"provider/model\" refs, including host-resolved defaults and overrides. Use \"*\" only when you intentionally allow any model."},"allowAuthProfileOverride":{"type":"boolean","title":"Allow Plugin LLM Auth Profile Override","description":"Allows this plugin to select a non-default auth profile for isolated agent-runtime completions. Keep false unless the plugin is trusted for explicit isolated credential routing."},"allowAgentIdOverride":{"type":"boolean","title":"Allow Plugin LLM Agent Override","description":"Explicitly allows this plugin to request api.runtime.llm.complete against a non-default agent id. Keep false unless the plugin is trusted for cross-agent model access."}},"additionalProperties":false,"title":"Plugin LLM Policy","description":"Per-plugin api.runtime.llm.complete controls for model and agent override trust. Keep this unset unless a plugin must explicitly steer host-owned completion calls."},"config":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":false,"title":"Plugin Config","description":"Plugin-defined configuration payload interpreted by that plugin's own schema and validation rules. Use only documented fields from the plugin to prevent ignored or invalid settings.","properties":{"mirror":{"type":"object","additionalProperties":false,"required":["endpoint","catalogs"],"properties":{"endpoint":{"type":"string"},"token":{"type":["string","object"]},"catalogs":{"type":"array","items":{"type":"string"}},"pollSeconds":{"type":"number"},"activeWindowMinutes":{"type":"number"}}}}}},"additionalProperties":false},"bonjour":{"type":"object","properties":{"enabled":{"type":"boolean","title":"Plugin Enabled","description":"Per-plugin enablement override for a specific entry, applied on top of global plugin policy (restart required). Use this to stage plugin rollout gradually across environments."},"hooks":{"type":"object","properties":{"allowPromptInjection":{"type":"boolean","title":"Allow Prompt Injection Hooks","description":"Controls whether this plugin may mutate prompts through typed hooks. Set false to block `before_prompt_build`."},"allowConversationAccess":{"type":"boolean","title":"Allow Conversation Access Hooks","description":"Controls whether this plugin may read raw conversation content from typed hooks such as `before_agent_run`, `before_model_resolve`, `before_agent_reply`, `llm_input`, `llm_output`, `before_agent_finalize`, and `agent_end`. Non-bundled plugins must opt in explicitly."},"timeoutMs":{"type":"integer","exclusiveMinimum":0,"maximum":600000,"title":"Plugin Hook Timeout (ms)","description":"Default timeout in milliseconds for this plugin's typed hooks, capped at 600000. Use this to bound slow plugin hooks without changing plugin code; per-hook values in hooks.timeouts take precedence."},"timeouts":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"integer","exclusiveMinimum":0,"maximum":600000},"title":"Plugin Hook Timeout Overrides","description":"Per-hook timeout overrides in milliseconds keyed by typed hook name, capped at 600000. Use narrow overrides for known slow hooks such as before_prompt_build or agent_end instead of raising every hook timeout."}},"additionalProperties":false,"title":"Plugin Hook Policy","description":"Per-plugin typed hook policy controls for core-enforced safety gates. Use this to constrain high-impact hook categories without disabling the entire plugin."},"subagent":{"type":"object","properties":{"allowModelOverride":{"type":"boolean","title":"Allow Plugin Subagent Model Override","description":"Explicitly allows this plugin to request provider/model overrides in background subagent runs. Keep false unless the plugin is trusted to steer model selection."},"allowedModels":{"type":"array","items":{"type":"string"},"title":"Plugin Subagent Allowed Models","description":"Allowed override targets for trusted plugin subagent runs as canonical \"provider/model\" refs. Use \"*\" only when you intentionally allow any model."}},"additionalProperties":false,"title":"Plugin Subagent Policy","description":"Per-plugin subagent runtime controls for model override trust and allowlists. Keep this unset unless a plugin must explicitly steer subagent model selection."},"llm":{"type":"object","properties":{"allowModelOverride":{"type":"boolean","title":"Allow Plugin LLM Model Override","description":"Explicitly allows this plugin to request model overrides in api.runtime.llm.complete. Keep false unless the plugin is trusted to steer model selection."},"allowedModels":{"type":"array","items":{"type":"string"},"title":"Plugin LLM Allowed Models","description":"Allowed override targets for trusted plugin LLM calls as canonical \"provider/model\" refs. Use \"*\" only when you intentionally allow any model override."},"allowedCompletionModels":{"type":"array","items":{"type":"string"},"title":"Plugin LLM Allowed Completion Models","description":"Allowed targets for every plugin LLM completion as canonical \"provider/model\" refs, including host-resolved defaults and overrides. Use \"*\" only when you intentionally allow any model."},"allowAuthProfileOverride":{"type":"boolean","title":"Allow Plugin LLM Auth Profile Override","description":"Allows this plugin to select a non-default auth profile for isolated agent-runtime completions. Keep false unless the plugin is trusted for explicit isolated credential routing."},"allowAgentIdOverride":{"type":"boolean","title":"Allow Plugin LLM Agent Override","description":"Explicitly allows this plugin to request api.runtime.llm.complete against a non-default agent id. Keep false unless the plugin is trusted for cross-agent model access."}},"additionalProperties":false,"title":"Plugin LLM Policy","description":"Per-plugin api.runtime.llm.complete controls for model and agent override trust. Keep this unset unless a plugin must explicitly steer host-owned completion calls."},"config":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":false,"title":"Plugin Config","description":"Plugin-defined configuration payload interpreted by that plugin's own schema and validation rules. Use only documented fields from the plugin to prevent ignored or invalid settings.","properties":{}}},"additionalProperties":false},"browser":{"type":"object","properties":{"enabled":{"type":"boolean","title":"Plugin Enabled","description":"Per-plugin enablement override for a specific entry, applied on top of global plugin policy (restart required). Use this to stage plugin rollout gradually across environments."},"hooks":{"type":"object","properties":{"allowPromptInjection":{"type":"boolean","title":"Allow Prompt Injection Hooks","description":"Controls whether this plugin may mutate prompts through typed hooks. Set false to block `before_prompt_build`."},"allowConversationAccess":{"type":"boolean","title":"Allow Conversation Access Hooks","description":"Controls whether this plugin may read raw conversation content from typed hooks such as `before_agent_run`, `before_model_resolve`, `before_agent_reply`, `llm_input`, `llm_output`, `before_agent_finalize`, and `agent_end`. Non-bundled plugins must opt in explicitly."},"timeoutMs":{"type":"integer","exclusiveMinimum":0,"maximum":600000,"title":"Plugin Hook Timeout (ms)","description":"Default timeout in milliseconds for this plugin's typed hooks, capped at 600000. Use this to bound slow plugin hooks without changing plugin code; per-hook values in hooks.timeouts take precedence."},"timeouts":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"integer","exclusiveMinimum":0,"maximum":600000},"title":"Plugin Hook Timeout Overrides","description":"Per-hook timeout overrides in milliseconds keyed by typed hook name, capped at 600000. Use narrow overrides for known slow hooks such as before_prompt_build or agent_end instead of raising every hook timeout."}},"additionalProperties":false,"title":"Plugin Hook Policy","description":"Per-plugin typed hook policy controls for core-enforced safety gates. Use this to constrain high-impact hook categories without disabling the entire plugin."},"subagent":{"type":"object","properties":{"allowModelOverride":{"type":"boolean","title":"Allow Plugin Subagent Model Override","description":"Explicitly allows this plugin to request provider/model overrides in background subagent runs. Keep false unless the plugin is trusted to steer model selection."},"allowedModels":{"type":"array","items":{"type":"string"},"title":"Plugin Subagent Allowed Models","description":"Allowed override targets for trusted plugin subagent runs as canonical \"provider/model\" refs. Use \"*\" only when you intentionally allow any model."}},"additionalProperties":false,"title":"Plugin Subagent Policy","description":"Per-plugin subagent runtime controls for model override trust and allowlists. Keep this unset unless a plugin must explicitly steer subagent model selection."},"llm":{"type":"object","properties":{"allowModelOverride":{"type":"boolean","title":"Allow Plugin LLM Model Override","description":"Explicitly allows this plugin to request model overrides in api.runtime.llm.complete. Keep false unless the plugin is trusted to steer model selection."},"allowedModels":{"type":"array","items":{"type":"string"},"title":"Plugin LLM Allowed Models","description":"Allowed override targets for trusted plugin LLM calls as canonical \"provider/model\" refs. Use \"*\" only when you intentionally allow any model override."},"allowedCompletionModels":{"type":"array","items":{"type":"string"},"title":"Plugin LLM Allowed Completion Models","description":"Allowed targets for every plugin LLM completion as canonical \"provider/model\" refs, including host-resolved defaults and overrides. Use \"*\" only when you intentionally allow any model."},"allowAuthProfileOverride":{"type":"boolean","title":"Allow Plugin LLM Auth Profile Override","description":"Allows this plugin to select a non-default auth profile for isolated agent-runtime completions. Keep false unless the plugin is trusted for explicit isolated credential routing."},"allowAgentIdOverride":{"type":"boolean","title":"Allow Plugin LLM Agent Override","description":"Explicitly allows this plugin to request api.runtime.llm.complete against a non-default agent id. Keep false unless the plugin is trusted for cross-agent model access."}},"additionalProperties":false,"title":"Plugin LLM Policy","description":"Per-plugin api.runtime.llm.complete controls for model and agent override trust. Keep this unset unless a plugin must explicitly steer host-owned completion calls."},"config":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":false,"title":"Plugin Config","description":"Plugin-defined configuration payload interpreted by that plugin's own schema and validation rules. Use only documented fields from the plugin to prevent ignored or invalid settings.","properties":{}}},"additionalProperties":false},"canvas":{"type":"object","properties":{"enabled":{"type":"boolean","title":"Plugin Enabled","description":"Per-plugin enablement override for a specific entry, applied on top of global plugin policy (restart required). Use this to stage plugin rollout gradually across environments."},"hooks":{"type":"object","properties":{"allowPromptInjection":{"type":"boolean","title":"Allow Prompt Injection Hooks","description":"Controls whether this plugin may mutate prompts through typed hooks. Set false to block `before_prompt_build`."},"allowConversationAccess":{"type":"boolean","title":"Allow Conversation Access Hooks","description":"Controls whether this plugin may read raw conversation content from typed hooks such as `before_agent_run`, `before_model_resolve`, `before_agent_reply`, `llm_input`, `llm_output`, `before_agent_finalize`, and `agent_end`. Non-bundled plugins must opt in explicitly."},"timeoutMs":{"type":"integer","exclusiveMinimum":0,"maximum":600000,"title":"Plugin Hook Timeout (ms)","description":"Default timeout in milliseconds for this plugin's typed hooks, capped at 600000. Use this to bound slow plugin hooks without changing plugin code; per-hook values in hooks.timeouts take precedence."},"timeouts":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"integer","exclusiveMinimum":0,"maximum":600000},"title":"Plugin Hook Timeout Overrides","description":"Per-hook timeout overrides in milliseconds keyed by typed hook name, capped at 600000. Use narrow overrides for known slow hooks such as before_prompt_build or agent_end instead of raising every hook timeout."}},"additionalProperties":false,"title":"Plugin Hook Policy","description":"Per-plugin typed hook policy controls for core-enforced safety gates. Use this to constrain high-impact hook categories without disabling the entire plugin."},"subagent":{"type":"object","properties":{"allowModelOverride":{"type":"boolean","title":"Allow Plugin Subagent Model Override","description":"Explicitly allows this plugin to request provider/model overrides in background subagent runs. Keep false unless the plugin is trusted to steer model selection."},"allowedModels":{"type":"array","items":{"type":"string"},"title":"Plugin Subagent Allowed Models","description":"Allowed override targets for trusted plugin subagent runs as canonical \"provider/model\" refs. Use \"*\" only when you intentionally allow any model."}},"additionalProperties":false,"title":"Plugin Subagent Policy","description":"Per-plugin subagent runtime controls for model override trust and allowlists. Keep this unset unless a plugin must explicitly steer subagent model selection."},"llm":{"type":"object","properties":{"allowModelOverride":{"type":"boolean","title":"Allow Plugin LLM Model Override","description":"Explicitly allows this plugin to request model overrides in api.runtime.llm.complete. Keep false unless the plugin is trusted to steer model selection."},"allowedModels":{"type":"array","items":{"type":"string"},"title":"Plugin LLM Allowed Models","description":"Allowed override targets for trusted plugin LLM calls as canonical \"provider/model\" refs. Use \"*\" only when you intentionally allow any model override."},"allowedCompletionModels":{"type":"array","items":{"type":"string"},"title":"Plugin LLM Allowed Completion Models","description":"Allowed targets for every plugin LLM completion as canonical \"provider/model\" refs, including host-resolved defaults and overrides. Use \"*\" only when you intentionally allow any model."},"allowAuthProfileOverride":{"type":"boolean","title":"Allow Plugin LLM Auth Profile Override","description":"Allows this plugin to select a non-default auth profile for isolated agent-runtime completions. Keep false unless the plugin is trusted for explicit isolated credential routing."},"allowAgentIdOverride":{"type":"boolean","title":"Allow Plugin LLM Agent Override","description":"Explicitly allows this plugin to request api.runtime.llm.complete against a non-default agent id. Keep false unless the plugin is trusted for cross-agent model access."}},"additionalProperties":false,"title":"Plugin LLM Policy","description":"Per-plugin api.runtime.llm.complete controls for model and agent override trust. Keep this unset unless a plugin must explicitly steer host-owned completion calls."},"config":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":false,"title":"Plugin Config","description":"Plugin-defined configuration payload interpreted by that plugin's own schema and validation rules. Use only documented fields from the plugin to prevent ignored or invalid settings.","properties":{"host":{"type":"object","additionalProperties":false,"properties":{"enabled":{"type":"boolean"}}}}}},"additionalProperties":false},"clawrouter":{"type":"object","properties":{"enabled":{"type":"boolean","title":"Plugin Enabled","description":"Per-plugin enablement override for a specific entry, applied on top of global plugin policy (restart required). Use this to stage plugin rollout gradually across environments."},"hooks":{"type":"object","properties":{"allowPromptInjection":{"type":"boolean","title":"Allow Prompt Injection Hooks","description":"Controls whether this plugin may mutate prompts through typed hooks. Set false to block `before_prompt_build`."},"allowConversationAccess":{"type":"boolean","title":"Allow Conversation Access Hooks","description":"Controls whether this plugin may read raw conversation content from typed hooks such as `before_agent_run`, `before_model_resolve`, `before_agent_reply`, `llm_input`, `llm_output`, `before_agent_finalize`, and `agent_end`. Non-bundled plugins must opt in explicitly."},"timeoutMs":{"type":"integer","exclusiveMinimum":0,"maximum":600000,"title":"Plugin Hook Timeout (ms)","description":"Default timeout in milliseconds for this plugin's typed hooks, capped at 600000. Use this to bound slow plugin hooks without changing plugin code; per-hook values in hooks.timeouts take precedence."},"timeouts":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"integer","exclusiveMinimum":0,"maximum":600000},"title":"Plugin Hook Timeout Overrides","description":"Per-hook timeout overrides in milliseconds keyed by typed hook name, capped at 600000. Use narrow overrides for known slow hooks such as before_prompt_build or agent_end instead of raising every hook timeout."}},"additionalProperties":false,"title":"Plugin Hook Policy","description":"Per-plugin typed hook policy controls for core-enforced safety gates. Use this to constrain high-impact hook categories without disabling the entire plugin."},"subagent":{"type":"object","properties":{"allowModelOverride":{"type":"boolean","title":"Allow Plugin Subagent Model Override","description":"Explicitly allows this plugin to request provider/model overrides in background subagent runs. Keep false unless the plugin is trusted to steer model selection."},"allowedModels":{"type":"array","items":{"type":"string"},"title":"Plugin Subagent Allowed Models","description":"Allowed override targets for trusted plugin subagent runs as canonical \"provider/model\" refs. Use \"*\" only when you intentionally allow any model."}},"additionalProperties":false,"title":"Plugin Subagent Policy","description":"Per-plugin subagent runtime controls for model override trust and allowlists. Keep this unset unless a plugin must explicitly steer subagent model selection."},"llm":{"type":"object","properties":{"allowModelOverride":{"type":"boolean","title":"Allow Plugin LLM Model Override","description":"Explicitly allows this plugin to request model overrides in api.runtime.llm.complete. Keep false unless the plugin is trusted to steer model selection."},"allowedModels":{"type":"array","items":{"type":"string"},"title":"Plugin LLM Allowed Models","description":"Allowed override targets for trusted plugin LLM calls as canonical \"provider/model\" refs. Use \"*\" only when you intentionally allow any model override."},"allowedCompletionModels":{"type":"array","items":{"type":"string"},"title":"Plugin LLM Allowed Completion Models","description":"Allowed targets for every plugin LLM completion as canonical \"provider/model\" refs, including host-resolved defaults and overrides. Use \"*\" only when you intentionally allow any model."},"allowAuthProfileOverride":{"type":"boolean","title":"Allow Plugin LLM Auth Profile Override","description":"Allows this plugin to select a non-default auth profile for isolated agent-runtime completions. Keep false unless the plugin is trusted for explicit isolated credential routing."},"allowAgentIdOverride":{"type":"boolean","title":"Allow Plugin LLM Agent Override","description":"Explicitly allows this plugin to request api.runtime.llm.complete against a non-default agent id. Keep false unless the plugin is trusted for cross-agent model access."}},"additionalProperties":false,"title":"Plugin LLM Policy","description":"Per-plugin api.runtime.llm.complete controls for model and agent override trust. Keep this unset unless a plugin must explicitly steer host-owned completion calls."},"config":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":false,"title":"Plugin Config","description":"Plugin-defined configuration payload interpreted by that plugin's own schema and validation rules. Use only documented fields from the plugin to prevent ignored or invalid settings.","properties":{}}},"additionalProperties":false},"codex":{"type":"object","properties":{"enabled":{"type":"boolean","title":"Plugin Enabled","description":"Per-plugin enablement override for a specific entry, applied on top of global plugin policy (restart required). Use this to stage plugin rollout gradually across environments."},"hooks":{"type":"object","properties":{"allowPromptInjection":{"type":"boolean","title":"Allow Prompt Injection Hooks","description":"Controls whether this plugin may mutate prompts through typed hooks. Set false to block `before_prompt_build`."},"allowConversationAccess":{"type":"boolean","title":"Allow Conversation Access Hooks","description":"Controls whether this plugin may read raw conversation content from typed hooks such as `before_agent_run`, `before_model_resolve`, `before_agent_reply`, `llm_input`, `llm_output`, `before_agent_finalize`, and `agent_end`. Non-bundled plugins must opt in explicitly."},"timeoutMs":{"type":"integer","exclusiveMinimum":0,"maximum":600000,"title":"Plugin Hook Timeout (ms)","description":"Default timeout in milliseconds for this plugin's typed hooks, capped at 600000. Use this to bound slow plugin hooks without changing plugin code; per-hook values in hooks.timeouts take precedence."},"timeouts":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"integer","exclusiveMinimum":0,"maximum":600000},"title":"Plugin Hook Timeout Overrides","description":"Per-hook timeout overrides in milliseconds keyed by typed hook name, capped at 600000. Use narrow overrides for known slow hooks such as before_prompt_build or agent_end instead of raising every hook timeout."}},"additionalProperties":false,"title":"Plugin Hook Policy","description":"Per-plugin typed hook policy controls for core-enforced safety gates. Use this to constrain high-impact hook categories without disabling the entire plugin."},"subagent":{"type":"object","properties":{"allowModelOverride":{"type":"boolean","title":"Allow Plugin Subagent Model Override","description":"Explicitly allows this plugin to request provider/model overrides in background subagent runs. Keep false unless the plugin is trusted to steer model selection."},"allowedModels":{"type":"array","items":{"type":"string"},"title":"Plugin Subagent Allowed Models","description":"Allowed override targets for trusted plugin subagent runs as canonical \"provider/model\" refs. Use \"*\" only when you intentionally allow any model."}},"additionalProperties":false,"title":"Plugin Subagent Policy","description":"Per-plugin subagent runtime controls for model override trust and allowlists. Keep this unset unless a plugin must explicitly steer subagent model selection."},"llm":{"type":"object","properties":{"allowModelOverride":{"type":"boolean","title":"Allow Plugin LLM Model Override","description":"Explicitly allows this plugin to request model overrides in api.runtime.llm.complete. Keep false unless the plugin is trusted to steer model selection."},"allowedModels":{"type":"array","items":{"type":"string"},"title":"Plugin LLM Allowed Models","description":"Allowed override targets for trusted plugin LLM calls as canonical \"provider/model\" refs. Use \"*\" only when you intentionally allow any model override."},"allowedCompletionModels":{"type":"array","items":{"type":"string"},"title":"Plugin LLM Allowed Completion Models","description":"Allowed targets for every plugin LLM completion as canonical \"provider/model\" refs, including host-resolved defaults and overrides. Use \"*\" only when you intentionally allow any model."},"allowAuthProfileOverride":{"type":"boolean","title":"Allow Plugin LLM Auth Profile Override","description":"Allows this plugin to select a non-default auth profile for isolated agent-runtime completions. Keep false unless the plugin is trusted for explicit isolated credential routing."},"allowAgentIdOverride":{"type":"boolean","title":"Allow Plugin LLM Agent Override","description":"Explicitly allows this plugin to request api.runtime.llm.complete against a non-default agent id. Keep false unless the plugin is trusted for cross-agent model access."}},"additionalProperties":false,"title":"Plugin LLM Policy","description":"Per-plugin api.runtime.llm.complete controls for model and agent override trust. Keep this unset unless a plugin must explicitly steer host-owned completion calls."},"config":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":false,"title":"Plugin Config","description":"Plugin-defined configuration payload interpreted by that plugin's own schema and validation rules. Use only documented fields from the plugin to prevent ignored or invalid settings.","properties":{"codexDynamicToolsLoading":{"type":"string","enum":["searchable","direct"],"default":"searchable"},"codexDynamicToolsExclude":{"type":"array","items":{"type":"string"},"default":[]},"sessionCatalog":{"type":"object","additionalProperties":false,"properties":{"enabled":{"type":"boolean","default":true},"homes":{"type":"array","items":{"anyOf":[{"type":"string","minLength":1,"pattern":"\\S"},{"type":"object","additionalProperties":false,"required":["path"],"properties":{"path":{"type":"string","minLength":1,"pattern":"\\S"},"label":{"type":"string","minLength":1,"pattern":"\\S"}}}]}}}},"discovery":{"type":"object","additionalProperties":false,"properties":{"enabled":{"type":"boolean"},"timeoutMs":{"type":"number","minimum":1,"default":2500}}},"computerUse":{"type":"object","additionalProperties":false,"properties":{"enabled":{"type":"boolean","default":false},"autoInstall":{"type":"boolean","default":false},"marketplaceDiscoveryTimeoutMs":{"type":"number","minimum":1,"default":60000},"liveTestTimeoutMs":{"type":"number","minimum":1,"default":60000},"toolCallTimeoutMs":{"type":"number","minimum":1,"default":60000},"healthCheckEnabled":{"type":"boolean","default":false},"healthCheckIntervalMinutes":{"type":"number","enum":[30,60,120,240],"default":60},"pluginCacheMode":{"type":"string","enum":["shared","independent"],"default":"independent"},"strictReadiness":{"type":"boolean","default":false},"autoRepair":{"type":"boolean","default":false},"marketplaceSource":{"type":"string"},"marketplacePath":{"type":"string"},"marketplaceName":{"type":"string"},"pluginName":{"type":"string","default":"computer-use"},"mcpServerName":{"type":"string","default":"computer-use"}}},"codexPlugins":{"type":"object","additionalProperties":false,"properties":{"enabled":{"type":"boolean","default":false},"allow_all_plugins":{"type":"boolean","default":false},"allow_destructive_actions":{"oneOf":[{"type":"boolean"},{"const":"auto"},{"const":"ask"}],"default":true},"plugins":{"type":"object","additionalProperties":{"type":"object","additionalProperties":false,"properties":{"enabled":{"type":"boolean"},"marketplaceName":{"type":"string","pattern":"^[A-Za-z0-9_-]+$"},"pluginName":{"type":"string"},"allow_destructive_actions":{"oneOf":[{"type":"boolean"},{"const":"auto"},{"const":"ask"}]}}}}}},"supervision":{"type":"object","additionalProperties":false,"properties":{"enabled":{"type":"boolean","default":false},"endpoints":{"type":"array","items":{"oneOf":[{"type":"object","additionalProperties":false,"properties":{"id":{"type":"string"},"label":{"type":"string"},"transport":{"const":"stdio-proxy"},"command":{"type":"string"},"args":{"type":"array","items":{"type":"string"}},"cwd":{"type":"string"}}},{"type":"object","additionalProperties":false,"required":["transport","url"],"properties":{"id":{"type":"string"},"label":{"type":"string"},"transport":{"const":"websocket"},"url":{"type":"string"},"authTokenEnv":{"type":"string"}}}]}},"allowRawTranscripts":{"type":"boolean","default":false},"allowWriteControls":{"type":"boolean","default":false}}},"appServer":{"type":"object","additionalProperties":false,"properties":{"mode":{"type":"string","enum":["yolo","guardian"]},"transport":{"type":"string","enum":["stdio","websocket","unix"],"default":"stdio"},"homeScope":{"type":"string","enum":["agent","user"]},"command":{"type":"string"},"args":{"oneOf":[{"type":"array","items":{"type":"string"}},{"type":"string"}]},"url":{"type":"string"},"authToken":{"type":["string","object"]},"headers":{"type":"object","additionalProperties":{"type":["string","object"]}},"clearEnv":{"type":"array","items":{"type":"string"}},"remoteWorkspaceRoot":{"type":"string"},"codeModeOnly":{"type":"boolean","default":false},"loopDetectionPreToolUseRelay":{"type":"boolean","default":true},"requestTimeoutMs":{"type":"number","minimum":1,"default":60000},"approvalPolicy":{"type":"string","enum":["never","on-request","on-failure","untrusted"]},"sandbox":{"type":"string","enum":["read-only","workspace-write","danger-full-access"]},"approvalsReviewer":{"type":"string","enum":["user","auto_review","guardian_subagent"]},"serviceTier":{"type":["string","null"]},"networkProxy":{"type":"object","additionalProperties":false,"properties":{"enabled":{"type":"boolean","default":false},"profileName":{"type":"string"},"baseProfile":{"type":"string","enum":["read-only","workspace"]},"mode":{"type":"string","enum":["limited","full"]},"domains":{"type":"object","additionalProperties":{"type":"string","enum":["allow","deny"]}},"unixSockets":{"type":"object","additionalProperties":{"type":"string","enum":["allow","none"]}},"proxyUrl":{"type":"string"},"socksUrl":{"type":"string"},"enableSocks5":{"type":"boolean"},"enableSocks5Udp":{"type":"boolean"},"allowUpstreamProxy":{"type":"boolean"},"allowLocalBinding":{"type":"boolean"},"dangerouslyAllowNonLoopbackProxy":{"type":"boolean"},"dangerouslyAllowAllUnixSockets":{"type":"boolean"}}},"defaultWorkspaceDir":{"type":"string"},"experimental":{"type":"object","additionalProperties":false,"properties":{"sandboxExecServer":{"type":"boolean","default":false}}}}}}}},"additionalProperties":false},"copilot-proxy":{"type":"object","properties":{"enabled":{"type":"boolean","title":"Plugin Enabled","description":"Per-plugin enablement override for a specific entry, applied on top of global plugin policy (restart required). Use this to stage plugin rollout gradually across environments."},"hooks":{"type":"object","properties":{"allowPromptInjection":{"type":"boolean","title":"Allow Prompt Injection Hooks","description":"Controls whether this plugin may mutate prompts through typed hooks. Set false to block `before_prompt_build`."},"allowConversationAccess":{"type":"boolean","title":"Allow Conversation Access Hooks","description":"Controls whether this plugin may read raw conversation content from typed hooks such as `before_agent_run`, `before_model_resolve`, `before_agent_reply`, `llm_input`, `llm_output`, `before_agent_finalize`, and `agent_end`. Non-bundled plugins must opt in explicitly."},"timeoutMs":{"type":"integer","exclusiveMinimum":0,"maximum":600000,"title":"Plugin Hook Timeout (ms)","description":"Default timeout in milliseconds for this plugin's typed hooks, capped at 600000. Use this to bound slow plugin hooks without changing plugin code; per-hook values in hooks.timeouts take precedence."},"timeouts":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"integer","exclusiveMinimum":0,"maximum":600000},"title":"Plugin Hook Timeout Overrides","description":"Per-hook timeout overrides in milliseconds keyed by typed hook name, capped at 600000. Use narrow overrides for known slow hooks such as before_prompt_build or agent_end instead of raising every hook timeout."}},"additionalProperties":false,"title":"Plugin Hook Policy","description":"Per-plugin typed hook policy controls for core-enforced safety gates. Use this to constrain high-impact hook categories without disabling the entire plugin."},"subagent":{"type":"object","properties":{"allowModelOverride":{"type":"boolean","title":"Allow Plugin Subagent Model Override","description":"Explicitly allows this plugin to request provider/model overrides in background subagent runs. Keep false unless the plugin is trusted to steer model selection."},"allowedModels":{"type":"array","items":{"type":"string"},"title":"Plugin Subagent Allowed Models","description":"Allowed override targets for trusted plugin subagent runs as canonical \"provider/model\" refs. Use \"*\" only when you intentionally allow any model."}},"additionalProperties":false,"title":"Plugin Subagent Policy","description":"Per-plugin subagent runtime controls for model override trust and allowlists. Keep this unset unless a plugin must explicitly steer subagent model selection."},"llm":{"type":"object","properties":{"allowModelOverride":{"type":"boolean","title":"Allow Plugin LLM Model Override","description":"Explicitly allows this plugin to request model overrides in api.runtime.llm.complete. Keep false unless the plugin is trusted to steer model selection."},"allowedModels":{"type":"array","items":{"type":"string"},"title":"Plugin LLM Allowed Models","description":"Allowed override targets for trusted plugin LLM calls as canonical \"provider/model\" refs. Use \"*\" only when you intentionally allow any model override."},"allowedCompletionModels":{"type":"array","items":{"type":"string"},"title":"Plugin LLM Allowed Completion Models","description":"Allowed targets for every plugin LLM completion as canonical \"provider/model\" refs, including host-resolved defaults and overrides. Use \"*\" only when you intentionally allow any model."},"allowAuthProfileOverride":{"type":"boolean","title":"Allow Plugin LLM Auth Profile Override","description":"Allows this plugin to select a non-default auth profile for isolated agent-runtime completions. Keep false unless the plugin is trusted for explicit isolated credential routing."},"allowAgentIdOverride":{"type":"boolean","title":"Allow Plugin LLM Agent Override","description":"Explicitly allows this plugin to request api.runtime.llm.complete against a non-default agent id. Keep false unless the plugin is trusted for cross-agent model access."}},"additionalProperties":false,"title":"Plugin LLM Policy","description":"Per-plugin api.runtime.llm.complete controls for model and agent override trust. Keep this unset unless a plugin must explicitly steer host-owned completion calls."},"config":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":false,"title":"Plugin Config","description":"Plugin-defined configuration payload interpreted by that plugin's own schema and validation rules. Use only documented fields from the plugin to prevent ignored or invalid settings.","properties":{}}},"additionalProperties":false},"crabbox":{"type":"object","properties":{"enabled":{"type":"boolean","title":"Plugin Enabled","description":"Per-plugin enablement override for a specific entry, applied on top of global plugin policy (restart required). Use this to stage plugin rollout gradually across environments."},"hooks":{"type":"object","properties":{"allowPromptInjection":{"type":"boolean","title":"Allow Prompt Injection Hooks","description":"Controls whether this plugin may mutate prompts through typed hooks. Set false to block `before_prompt_build`."},"allowConversationAccess":{"type":"boolean","title":"Allow Conversation Access Hooks","description":"Controls whether this plugin may read raw conversation content from typed hooks such as `before_agent_run`, `before_model_resolve`, `before_agent_reply`, `llm_input`, `llm_output`, `before_agent_finalize`, and `agent_end`. Non-bundled plugins must opt in explicitly."},"timeoutMs":{"type":"integer","exclusiveMinimum":0,"maximum":600000,"title":"Plugin Hook Timeout (ms)","description":"Default timeout in milliseconds for this plugin's typed hooks, capped at 600000. Use this to bound slow plugin hooks without changing plugin code; per-hook values in hooks.timeouts take precedence."},"timeouts":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"integer","exclusiveMinimum":0,"maximum":600000},"title":"Plugin Hook Timeout Overrides","description":"Per-hook timeout overrides in milliseconds keyed by typed hook name, capped at 600000. Use narrow overrides for known slow hooks such as before_prompt_build or agent_end instead of raising every hook timeout."}},"additionalProperties":false,"title":"Plugin Hook Policy","description":"Per-plugin typed hook policy controls for core-enforced safety gates. Use this to constrain high-impact hook categories without disabling the entire plugin."},"subagent":{"type":"object","properties":{"allowModelOverride":{"type":"boolean","title":"Allow Plugin Subagent Model Override","description":"Explicitly allows this plugin to request provider/model overrides in background subagent runs. Keep false unless the plugin is trusted to steer model selection."},"allowedModels":{"type":"array","items":{"type":"string"},"title":"Plugin Subagent Allowed Models","description":"Allowed override targets for trusted plugin subagent runs as canonical \"provider/model\" refs. Use \"*\" only when you intentionally allow any model."}},"additionalProperties":false,"title":"Plugin Subagent Policy","description":"Per-plugin subagent runtime controls for model override trust and allowlists. Keep this unset unless a plugin must explicitly steer subagent model selection."},"llm":{"type":"object","properties":{"allowModelOverride":{"type":"boolean","title":"Allow Plugin LLM Model Override","description":"Explicitly allows this plugin to request model overrides in api.runtime.llm.complete. Keep false unless the plugin is trusted to steer model selection."},"allowedModels":{"type":"array","items":{"type":"string"},"title":"Plugin LLM Allowed Models","description":"Allowed override targets for trusted plugin LLM calls as canonical \"provider/model\" refs. Use \"*\" only when you intentionally allow any model override."},"allowedCompletionModels":{"type":"array","items":{"type":"string"},"title":"Plugin LLM Allowed Completion Models","description":"Allowed targets for every plugin LLM completion as canonical \"provider/model\" refs, including host-resolved defaults and overrides. Use \"*\" only when you intentionally allow any model."},"allowAuthProfileOverride":{"type":"boolean","title":"Allow Plugin LLM Auth Profile Override","description":"Allows this plugin to select a non-default auth profile for isolated agent-runtime completions. Keep false unless the plugin is trusted for explicit isolated credential routing."},"allowAgentIdOverride":{"type":"boolean","title":"Allow Plugin LLM Agent Override","description":"Explicitly allows this plugin to request api.runtime.llm.complete against a non-default agent id. Keep false unless the plugin is trusted for cross-agent model access."}},"additionalProperties":false,"title":"Plugin LLM Policy","description":"Per-plugin api.runtime.llm.complete controls for model and agent override trust. Keep this unset unless a plugin must explicitly steer host-owned completion calls."},"config":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":false,"title":"Plugin Config","description":"Plugin-defined configuration payload interpreted by that plugin's own schema and validation rules. Use only documented fields from the plugin to prevent ignored or invalid settings.","properties":{}}},"additionalProperties":false},"cua-computer":{"type":"object","properties":{"enabled":{"type":"boolean","title":"Plugin Enabled","description":"Per-plugin enablement override for a specific entry, applied on top of global plugin policy (restart required). Use this to stage plugin rollout gradually across environments."},"hooks":{"type":"object","properties":{"allowPromptInjection":{"type":"boolean","title":"Allow Prompt Injection Hooks","description":"Controls whether this plugin may mutate prompts through typed hooks. Set false to block `before_prompt_build`."},"allowConversationAccess":{"type":"boolean","title":"Allow Conversation Access Hooks","description":"Controls whether this plugin may read raw conversation content from typed hooks such as `before_agent_run`, `before_model_resolve`, `before_agent_reply`, `llm_input`, `llm_output`, `before_agent_finalize`, and `agent_end`. Non-bundled plugins must opt in explicitly."},"timeoutMs":{"type":"integer","exclusiveMinimum":0,"maximum":600000,"title":"Plugin Hook Timeout (ms)","description":"Default timeout in milliseconds for this plugin's typed hooks, capped at 600000. Use this to bound slow plugin hooks without changing plugin code; per-hook values in hooks.timeouts take precedence."},"timeouts":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"integer","exclusiveMinimum":0,"maximum":600000},"title":"Plugin Hook Timeout Overrides","description":"Per-hook timeout overrides in milliseconds keyed by typed hook name, capped at 600000. Use narrow overrides for known slow hooks such as before_prompt_build or agent_end instead of raising every hook timeout."}},"additionalProperties":false,"title":"Plugin Hook Policy","description":"Per-plugin typed hook policy controls for core-enforced safety gates. Use this to constrain high-impact hook categories without disabling the entire plugin."},"subagent":{"type":"object","properties":{"allowModelOverride":{"type":"boolean","title":"Allow Plugin Subagent Model Override","description":"Explicitly allows this plugin to request provider/model overrides in background subagent runs. Keep false unless the plugin is trusted to steer model selection."},"allowedModels":{"type":"array","items":{"type":"string"},"title":"Plugin Subagent Allowed Models","description":"Allowed override targets for trusted plugin subagent runs as canonical \"provider/model\" refs. Use \"*\" only when you intentionally allow any model."}},"additionalProperties":false,"title":"Plugin Subagent Policy","description":"Per-plugin subagent runtime controls for model override trust and allowlists. Keep this unset unless a plugin must explicitly steer subagent model selection."},"llm":{"type":"object","properties":{"allowModelOverride":{"type":"boolean","title":"Allow Plugin LLM Model Override","description":"Explicitly allows this plugin to request model overrides in api.runtime.llm.complete. Keep false unless the plugin is trusted to steer model selection."},"allowedModels":{"type":"array","items":{"type":"string"},"title":"Plugin LLM Allowed Models","description":"Allowed override targets for trusted plugin LLM calls as canonical \"provider/model\" refs. Use \"*\" only when you intentionally allow any model override."},"allowedCompletionModels":{"type":"array","items":{"type":"string"},"title":"Plugin LLM Allowed Completion Models","description":"Allowed targets for every plugin LLM completion as canonical \"provider/model\" refs, including host-resolved defaults and overrides. Use \"*\" only when you intentionally allow any model."},"allowAuthProfileOverride":{"type":"boolean","title":"Allow Plugin LLM Auth Profile Override","description":"Allows this plugin to select a non-default auth profile for isolated agent-runtime completions. Keep false unless the plugin is trusted for explicit isolated credential routing."},"allowAgentIdOverride":{"type":"boolean","title":"Allow Plugin LLM Agent Override","description":"Explicitly allows this plugin to request api.runtime.llm.complete against a non-default agent id. Keep false unless the plugin is trusted for cross-agent model access."}},"additionalProperties":false,"title":"Plugin LLM Policy","description":"Per-plugin api.runtime.llm.complete controls for model and agent override trust. Keep this unset unless a plugin must explicitly steer host-owned completion calls."},"config":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":false,"title":"Plugin Config","description":"Plugin-defined configuration payload interpreted by that plugin's own schema and validation rules. Use only documented fields from the plugin to prevent ignored or invalid settings.","properties":{"driverPath":{"type":"string"}}}},"additionalProperties":false},"deepgram":{"type":"object","properties":{"enabled":{"type":"boolean","title":"Plugin Enabled","description":"Per-plugin enablement override for a specific entry, applied on top of global plugin policy (restart required). Use this to stage plugin rollout gradually across environments."},"hooks":{"type":"object","properties":{"allowPromptInjection":{"type":"boolean","title":"Allow Prompt Injection Hooks","description":"Controls whether this plugin may mutate prompts through typed hooks. Set false to block `before_prompt_build`."},"allowConversationAccess":{"type":"boolean","title":"Allow Conversation Access Hooks","description":"Controls whether this plugin may read raw conversation content from typed hooks such as `before_agent_run`, `before_model_resolve`, `before_agent_reply`, `llm_input`, `llm_output`, `before_agent_finalize`, and `agent_end`. Non-bundled plugins must opt in explicitly."},"timeoutMs":{"type":"integer","exclusiveMinimum":0,"maximum":600000,"title":"Plugin Hook Timeout (ms)","description":"Default timeout in milliseconds for this plugin's typed hooks, capped at 600000. Use this to bound slow plugin hooks without changing plugin code; per-hook values in hooks.timeouts take precedence."},"timeouts":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"integer","exclusiveMinimum":0,"maximum":600000},"title":"Plugin Hook Timeout Overrides","description":"Per-hook timeout overrides in milliseconds keyed by typed hook name, capped at 600000. Use narrow overrides for known slow hooks such as before_prompt_build or agent_end instead of raising every hook timeout."}},"additionalProperties":false,"title":"Plugin Hook Policy","description":"Per-plugin typed hook policy controls for core-enforced safety gates. Use this to constrain high-impact hook categories without disabling the entire plugin."},"subagent":{"type":"object","properties":{"allowModelOverride":{"type":"boolean","title":"Allow Plugin Subagent Model Override","description":"Explicitly allows this plugin to request provider/model overrides in background subagent runs. Keep false unless the plugin is trusted to steer model selection."},"allowedModels":{"type":"array","items":{"type":"string"},"title":"Plugin Subagent Allowed Models","description":"Allowed override targets for trusted plugin subagent runs as canonical \"provider/model\" refs. Use \"*\" only when you intentionally allow any model."}},"additionalProperties":false,"title":"Plugin Subagent Policy","description":"Per-plugin subagent runtime controls for model override trust and allowlists. Keep this unset unless a plugin must explicitly steer subagent model selection."},"llm":{"type":"object","properties":{"allowModelOverride":{"type":"boolean","title":"Allow Plugin LLM Model Override","description":"Explicitly allows this plugin to request model overrides in api.runtime.llm.complete. Keep false unless the plugin is trusted to steer model selection."},"allowedModels":{"type":"array","items":{"type":"string"},"title":"Plugin LLM Allowed Models","description":"Allowed override targets for trusted plugin LLM calls as canonical \"provider/model\" refs. Use \"*\" only when you intentionally allow any model override."},"allowedCompletionModels":{"type":"array","items":{"type":"string"},"title":"Plugin LLM Allowed Completion Models","description":"Allowed targets for every plugin LLM completion as canonical \"provider/model\" refs, including host-resolved defaults and overrides. Use \"*\" only when you intentionally allow any model."},"allowAuthProfileOverride":{"type":"boolean","title":"Allow Plugin LLM Auth Profile Override","description":"Allows this plugin to select a non-default auth profile for isolated agent-runtime completions. Keep false unless the plugin is trusted for explicit isolated credential routing."},"allowAgentIdOverride":{"type":"boolean","title":"Allow Plugin LLM Agent Override","description":"Explicitly allows this plugin to request api.runtime.llm.complete against a non-default agent id. Keep false unless the plugin is trusted for cross-agent model access."}},"additionalProperties":false,"title":"Plugin LLM Policy","description":"Per-plugin api.runtime.llm.complete controls for model and agent override trust. Keep this unset unless a plugin must explicitly steer host-owned completion calls."},"config":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":false,"title":"Plugin Config","description":"Plugin-defined configuration payload interpreted by that plugin's own schema and validation rules. Use only documented fields from the plugin to prevent ignored or invalid settings.","properties":{}}},"additionalProperties":false},"device-pair":{"type":"object","properties":{"enabled":{"type":"boolean","title":"Plugin Enabled","description":"Per-plugin enablement override for a specific entry, applied on top of global plugin policy (restart required). Use this to stage plugin rollout gradually across environments."},"hooks":{"type":"object","properties":{"allowPromptInjection":{"type":"boolean","title":"Allow Prompt Injection Hooks","description":"Controls whether this plugin may mutate prompts through typed hooks. Set false to block `before_prompt_build`."},"allowConversationAccess":{"type":"boolean","title":"Allow Conversation Access Hooks","description":"Controls whether this plugin may read raw conversation content from typed hooks such as `before_agent_run`, `before_model_resolve`, `before_agent_reply`, `llm_input`, `llm_output`, `before_agent_finalize`, and `agent_end`. Non-bundled plugins must opt in explicitly."},"timeoutMs":{"type":"integer","exclusiveMinimum":0,"maximum":600000,"title":"Plugin Hook Timeout (ms)","description":"Default timeout in milliseconds for this plugin's typed hooks, capped at 600000. Use this to bound slow plugin hooks without changing plugin code; per-hook values in hooks.timeouts take precedence."},"timeouts":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"integer","exclusiveMinimum":0,"maximum":600000},"title":"Plugin Hook Timeout Overrides","description":"Per-hook timeout overrides in milliseconds keyed by typed hook name, capped at 600000. Use narrow overrides for known slow hooks such as before_prompt_build or agent_end instead of raising every hook timeout."}},"additionalProperties":false,"title":"Plugin Hook Policy","description":"Per-plugin typed hook policy controls for core-enforced safety gates. Use this to constrain high-impact hook categories without disabling the entire plugin."},"subagent":{"type":"object","properties":{"allowModelOverride":{"type":"boolean","title":"Allow Plugin Subagent Model Override","description":"Explicitly allows this plugin to request provider/model overrides in background subagent runs. Keep false unless the plugin is trusted to steer model selection."},"allowedModels":{"type":"array","items":{"type":"string"},"title":"Plugin Subagent Allowed Models","description":"Allowed override targets for trusted plugin subagent runs as canonical \"provider/model\" refs. Use \"*\" only when you intentionally allow any model."}},"additionalProperties":false,"title":"Plugin Subagent Policy","description":"Per-plugin subagent runtime controls for model override trust and allowlists. Keep this unset unless a plugin must explicitly steer subagent model selection."},"llm":{"type":"object","properties":{"allowModelOverride":{"type":"boolean","title":"Allow Plugin LLM Model Override","description":"Explicitly allows this plugin to request model overrides in api.runtime.llm.complete. Keep false unless the plugin is trusted to steer model selection."},"allowedModels":{"type":"array","items":{"type":"string"},"title":"Plugin LLM Allowed Models","description":"Allowed override targets for trusted plugin LLM calls as canonical \"provider/model\" refs. Use \"*\" only when you intentionally allow any model override."},"allowedCompletionModels":{"type":"array","items":{"type":"string"},"title":"Plugin LLM Allowed Completion Models","description":"Allowed targets for every plugin LLM completion as canonical \"provider/model\" refs, including host-resolved defaults and overrides. Use \"*\" only when you intentionally allow any model."},"allowAuthProfileOverride":{"type":"boolean","title":"Allow Plugin LLM Auth Profile Override","description":"Allows this plugin to select a non-default auth profile for isolated agent-runtime completions. Keep false unless the plugin is trusted for explicit isolated credential routing."},"allowAgentIdOverride":{"type":"boolean","title":"Allow Plugin LLM Agent Override","description":"Explicitly allows this plugin to request api.runtime.llm.complete against a non-default agent id. Keep false unless the plugin is trusted for cross-agent model access."}},"additionalProperties":false,"title":"Plugin LLM Policy","description":"Per-plugin api.runtime.llm.complete controls for model and agent override trust. Keep this unset unless a plugin must explicitly steer host-owned completion calls."},"config":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":false,"title":"Plugin Config","description":"Plugin-defined configuration payload interpreted by that plugin's own schema and validation rules. Use only documented fields from the plugin to prevent ignored or invalid settings.","properties":{"publicUrl":{"type":"string"}}}},"additionalProperties":false},"diagnostics-otel":{"type":"object","properties":{"enabled":{"type":"boolean","title":"Plugin Enabled","description":"Per-plugin enablement override for a specific entry, applied on top of global plugin policy (restart required). Use this to stage plugin rollout gradually across environments."},"hooks":{"type":"object","properties":{"allowPromptInjection":{"type":"boolean","title":"Allow Prompt Injection Hooks","description":"Controls whether this plugin may mutate prompts through typed hooks. Set false to block `before_prompt_build`."},"allowConversationAccess":{"type":"boolean","title":"Allow Conversation Access Hooks","description":"Controls whether this plugin may read raw conversation content from typed hooks such as `before_agent_run`, `before_model_resolve`, `before_agent_reply`, `llm_input`, `llm_output`, `before_agent_finalize`, and `agent_end`. Non-bundled plugins must opt in explicitly."},"timeoutMs":{"type":"integer","exclusiveMinimum":0,"maximum":600000,"title":"Plugin Hook Timeout (ms)","description":"Default timeout in milliseconds for this plugin's typed hooks, capped at 600000. Use this to bound slow plugin hooks without changing plugin code; per-hook values in hooks.timeouts take precedence."},"timeouts":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"integer","exclusiveMinimum":0,"maximum":600000},"title":"Plugin Hook Timeout Overrides","description":"Per-hook timeout overrides in milliseconds keyed by typed hook name, capped at 600000. Use narrow overrides for known slow hooks such as before_prompt_build or agent_end instead of raising every hook timeout."}},"additionalProperties":false,"title":"Plugin Hook Policy","description":"Per-plugin typed hook policy controls for core-enforced safety gates. Use this to constrain high-impact hook categories without disabling the entire plugin."},"subagent":{"type":"object","properties":{"allowModelOverride":{"type":"boolean","title":"Allow Plugin Subagent Model Override","description":"Explicitly allows this plugin to request provider/model overrides in background subagent runs. Keep false unless the plugin is trusted to steer model selection."},"allowedModels":{"type":"array","items":{"type":"string"},"title":"Plugin Subagent Allowed Models","description":"Allowed override targets for trusted plugin subagent runs as canonical \"provider/model\" refs. Use \"*\" only when you intentionally allow any model."}},"additionalProperties":false,"title":"Plugin Subagent Policy","description":"Per-plugin subagent runtime controls for model override trust and allowlists. Keep this unset unless a plugin must explicitly steer subagent model selection."},"llm":{"type":"object","properties":{"allowModelOverride":{"type":"boolean","title":"Allow Plugin LLM Model Override","description":"Explicitly allows this plugin to request model overrides in api.runtime.llm.complete. Keep false unless the plugin is trusted to steer model selection."},"allowedModels":{"type":"array","items":{"type":"string"},"title":"Plugin LLM Allowed Models","description":"Allowed override targets for trusted plugin LLM calls as canonical \"provider/model\" refs. Use \"*\" only when you intentionally allow any model override."},"allowedCompletionModels":{"type":"array","items":{"type":"string"},"title":"Plugin LLM Allowed Completion Models","description":"Allowed targets for every plugin LLM completion as canonical \"provider/model\" refs, including host-resolved defaults and overrides. Use \"*\" only when you intentionally allow any model."},"allowAuthProfileOverride":{"type":"boolean","title":"Allow Plugin LLM Auth Profile Override","description":"Allows this plugin to select a non-default auth profile for isolated agent-runtime completions. Keep false unless the plugin is trusted for explicit isolated credential routing."},"allowAgentIdOverride":{"type":"boolean","title":"Allow Plugin LLM Agent Override","description":"Explicitly allows this plugin to request api.runtime.llm.complete against a non-default agent id. Keep false unless the plugin is trusted for cross-agent model access."}},"additionalProperties":false,"title":"Plugin LLM Policy","description":"Per-plugin api.runtime.llm.complete controls for model and agent override trust. Keep this unset unless a plugin must explicitly steer host-owned completion calls."},"config":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":false,"title":"Plugin Config","description":"Plugin-defined configuration payload interpreted by that plugin's own schema and validation rules. Use only documented fields from the plugin to prevent ignored or invalid settings.","properties":{}}},"additionalProperties":false},"document-extract":{"type":"object","properties":{"enabled":{"type":"boolean","title":"Plugin Enabled","description":"Per-plugin enablement override for a specific entry, applied on top of global plugin policy (restart required). Use this to stage plugin rollout gradually across environments."},"hooks":{"type":"object","properties":{"allowPromptInjection":{"type":"boolean","title":"Allow Prompt Injection Hooks","description":"Controls whether this plugin may mutate prompts through typed hooks. Set false to block `before_prompt_build`."},"allowConversationAccess":{"type":"boolean","title":"Allow Conversation Access Hooks","description":"Controls whether this plugin may read raw conversation content from typed hooks such as `before_agent_run`, `before_model_resolve`, `before_agent_reply`, `llm_input`, `llm_output`, `before_agent_finalize`, and `agent_end`. Non-bundled plugins must opt in explicitly."},"timeoutMs":{"type":"integer","exclusiveMinimum":0,"maximum":600000,"title":"Plugin Hook Timeout (ms)","description":"Default timeout in milliseconds for this plugin's typed hooks, capped at 600000. Use this to bound slow plugin hooks without changing plugin code; per-hook values in hooks.timeouts take precedence."},"timeouts":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"integer","exclusiveMinimum":0,"maximum":600000},"title":"Plugin Hook Timeout Overrides","description":"Per-hook timeout overrides in milliseconds keyed by typed hook name, capped at 600000. Use narrow overrides for known slow hooks such as before_prompt_build or agent_end instead of raising every hook timeout."}},"additionalProperties":false,"title":"Plugin Hook Policy","description":"Per-plugin typed hook policy controls for core-enforced safety gates. Use this to constrain high-impact hook categories without disabling the entire plugin."},"subagent":{"type":"object","properties":{"allowModelOverride":{"type":"boolean","title":"Allow Plugin Subagent Model Override","description":"Explicitly allows this plugin to request provider/model overrides in background subagent runs. Keep false unless the plugin is trusted to steer model selection."},"allowedModels":{"type":"array","items":{"type":"string"},"title":"Plugin Subagent Allowed Models","description":"Allowed override targets for trusted plugin subagent runs as canonical \"provider/model\" refs. Use \"*\" only when you intentionally allow any model."}},"additionalProperties":false,"title":"Plugin Subagent Policy","description":"Per-plugin subagent runtime controls for model override trust and allowlists. Keep this unset unless a plugin must explicitly steer subagent model selection."},"llm":{"type":"object","properties":{"allowModelOverride":{"type":"boolean","title":"Allow Plugin LLM Model Override","description":"Explicitly allows this plugin to request model overrides in api.runtime.llm.complete. Keep false unless the plugin is trusted to steer model selection."},"allowedModels":{"type":"array","items":{"type":"string"},"title":"Plugin LLM Allowed Models","description":"Allowed override targets for trusted plugin LLM calls as canonical \"provider/model\" refs. Use \"*\" only when you intentionally allow any model override."},"allowedCompletionModels":{"type":"array","items":{"type":"string"},"title":"Plugin LLM Allowed Completion Models","description":"Allowed targets for every plugin LLM completion as canonical \"provider/model\" refs, including host-resolved defaults and overrides. Use \"*\" only when you intentionally allow any model."},"allowAuthProfileOverride":{"type":"boolean","title":"Allow Plugin LLM Auth Profile Override","description":"Allows this plugin to select a non-default auth profile for isolated agent-runtime completions. Keep false unless the plugin is trusted for explicit isolated credential routing."},"allowAgentIdOverride":{"type":"boolean","title":"Allow Plugin LLM Agent Override","description":"Explicitly allows this plugin to request api.runtime.llm.complete against a non-default agent id. Keep false unless the plugin is trusted for cross-agent model access."}},"additionalProperties":false,"title":"Plugin LLM Policy","description":"Per-plugin api.runtime.llm.complete controls for model and agent override trust. Keep this unset unless a plugin must explicitly steer host-owned completion calls."},"config":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":false,"title":"Plugin Config","description":"Plugin-defined configuration payload interpreted by that plugin's own schema and validation rules. Use only documented fields from the plugin to prevent ignored or invalid settings.","properties":{}}},"additionalProperties":false},"elevenlabs":{"type":"object","properties":{"enabled":{"type":"boolean","title":"Plugin Enabled","description":"Per-plugin enablement override for a specific entry, applied on top of global plugin policy (restart required). Use this to stage plugin rollout gradually across environments."},"hooks":{"type":"object","properties":{"allowPromptInjection":{"type":"boolean","title":"Allow Prompt Injection Hooks","description":"Controls whether this plugin may mutate prompts through typed hooks. Set false to block `before_prompt_build`."},"allowConversationAccess":{"type":"boolean","title":"Allow Conversation Access Hooks","description":"Controls whether this plugin may read raw conversation content from typed hooks such as `before_agent_run`, `before_model_resolve`, `before_agent_reply`, `llm_input`, `llm_output`, `before_agent_finalize`, and `agent_end`. Non-bundled plugins must opt in explicitly."},"timeoutMs":{"type":"integer","exclusiveMinimum":0,"maximum":600000,"title":"Plugin Hook Timeout (ms)","description":"Default timeout in milliseconds for this plugin's typed hooks, capped at 600000. Use this to bound slow plugin hooks without changing plugin code; per-hook values in hooks.timeouts take precedence."},"timeouts":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"integer","exclusiveMinimum":0,"maximum":600000},"title":"Plugin Hook Timeout Overrides","description":"Per-hook timeout overrides in milliseconds keyed by typed hook name, capped at 600000. Use narrow overrides for known slow hooks such as before_prompt_build or agent_end instead of raising every hook timeout."}},"additionalProperties":false,"title":"Plugin Hook Policy","description":"Per-plugin typed hook policy controls for core-enforced safety gates. Use this to constrain high-impact hook categories without disabling the entire plugin."},"subagent":{"type":"object","properties":{"allowModelOverride":{"type":"boolean","title":"Allow Plugin Subagent Model Override","description":"Explicitly allows this plugin to request provider/model overrides in background subagent runs. Keep false unless the plugin is trusted to steer model selection."},"allowedModels":{"type":"array","items":{"type":"string"},"title":"Plugin Subagent Allowed Models","description":"Allowed override targets for trusted plugin subagent runs as canonical \"provider/model\" refs. Use \"*\" only when you intentionally allow any model."}},"additionalProperties":false,"title":"Plugin Subagent Policy","description":"Per-plugin subagent runtime controls for model override trust and allowlists. Keep this unset unless a plugin must explicitly steer subagent model selection."},"llm":{"type":"object","properties":{"allowModelOverride":{"type":"boolean","title":"Allow Plugin LLM Model Override","description":"Explicitly allows this plugin to request model overrides in api.runtime.llm.complete. Keep false unless the plugin is trusted to steer model selection."},"allowedModels":{"type":"array","items":{"type":"string"},"title":"Plugin LLM Allowed Models","description":"Allowed override targets for trusted plugin LLM calls as canonical \"provider/model\" refs. Use \"*\" only when you intentionally allow any model override."},"allowedCompletionModels":{"type":"array","items":{"type":"string"},"title":"Plugin LLM Allowed Completion Models","description":"Allowed targets for every plugin LLM completion as canonical \"provider/model\" refs, including host-resolved defaults and overrides. Use \"*\" only when you intentionally allow any model."},"allowAuthProfileOverride":{"type":"boolean","title":"Allow Plugin LLM Auth Profile Override","description":"Allows this plugin to select a non-default auth profile for isolated agent-runtime completions. Keep false unless the plugin is trusted for explicit isolated credential routing."},"allowAgentIdOverride":{"type":"boolean","title":"Allow Plugin LLM Agent Override","description":"Explicitly allows this plugin to request api.runtime.llm.complete against a non-default agent id. Keep false unless the plugin is trusted for cross-agent model access."}},"additionalProperties":false,"title":"Plugin LLM Policy","description":"Per-plugin api.runtime.llm.complete controls for model and agent override trust. Keep this unset unless a plugin must explicitly steer host-owned completion calls."},"config":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":false,"title":"Plugin Config","description":"Plugin-defined configuration payload interpreted by that plugin's own schema and validation rules. Use only documented fields from the plugin to prevent ignored or invalid settings.","properties":{}}},"additionalProperties":false},"fal":{"type":"object","properties":{"enabled":{"type":"boolean","title":"Plugin Enabled","description":"Per-plugin enablement override for a specific entry, applied on top of global plugin policy (restart required). Use this to stage plugin rollout gradually across environments."},"hooks":{"type":"object","properties":{"allowPromptInjection":{"type":"boolean","title":"Allow Prompt Injection Hooks","description":"Controls whether this plugin may mutate prompts through typed hooks. Set false to block `before_prompt_build`."},"allowConversationAccess":{"type":"boolean","title":"Allow Conversation Access Hooks","description":"Controls whether this plugin may read raw conversation content from typed hooks such as `before_agent_run`, `before_model_resolve`, `before_agent_reply`, `llm_input`, `llm_output`, `before_agent_finalize`, and `agent_end`. Non-bundled plugins must opt in explicitly."},"timeoutMs":{"type":"integer","exclusiveMinimum":0,"maximum":600000,"title":"Plugin Hook Timeout (ms)","description":"Default timeout in milliseconds for this plugin's typed hooks, capped at 600000. Use this to bound slow plugin hooks without changing plugin code; per-hook values in hooks.timeouts take precedence."},"timeouts":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"integer","exclusiveMinimum":0,"maximum":600000},"title":"Plugin Hook Timeout Overrides","description":"Per-hook timeout overrides in milliseconds keyed by typed hook name, capped at 600000. Use narrow overrides for known slow hooks such as before_prompt_build or agent_end instead of raising every hook timeout."}},"additionalProperties":false,"title":"Plugin Hook Policy","description":"Per-plugin typed hook policy controls for core-enforced safety gates. Use this to constrain high-impact hook categories without disabling the entire plugin."},"subagent":{"type":"object","properties":{"allowModelOverride":{"type":"boolean","title":"Allow Plugin Subagent Model Override","description":"Explicitly allows this plugin to request provider/model overrides in background subagent runs. Keep false unless the plugin is trusted to steer model selection."},"allowedModels":{"type":"array","items":{"type":"string"},"title":"Plugin Subagent Allowed Models","description":"Allowed override targets for trusted plugin subagent runs as canonical \"provider/model\" refs. Use \"*\" only when you intentionally allow any model."}},"additionalProperties":false,"title":"Plugin Subagent Policy","description":"Per-plugin subagent runtime controls for model override trust and allowlists. Keep this unset unless a plugin must explicitly steer subagent model selection."},"llm":{"type":"object","properties":{"allowModelOverride":{"type":"boolean","title":"Allow Plugin LLM Model Override","description":"Explicitly allows this plugin to request model overrides in api.runtime.llm.complete. Keep false unless the plugin is trusted to steer model selection."},"allowedModels":{"type":"array","items":{"type":"string"},"title":"Plugin LLM Allowed Models","description":"Allowed override targets for trusted plugin LLM calls as canonical \"provider/model\" refs. Use \"*\" only when you intentionally allow any model override."},"allowedCompletionModels":{"type":"array","items":{"type":"string"},"title":"Plugin LLM Allowed Completion Models","description":"Allowed targets for every plugin LLM completion as canonical \"provider/model\" refs, including host-resolved defaults and overrides. Use \"*\" only when you intentionally allow any model."},"allowAuthProfileOverride":{"type":"boolean","title":"Allow Plugin LLM Auth Profile Override","description":"Allows this plugin to select a non-default auth profile for isolated agent-runtime completions. Keep false unless the plugin is trusted for explicit isolated credential routing."},"allowAgentIdOverride":{"type":"boolean","title":"Allow Plugin LLM Agent Override","description":"Explicitly allows this plugin to request api.runtime.llm.complete against a non-default agent id. Keep false unless the plugin is trusted for cross-agent model access."}},"additionalProperties":false,"title":"Plugin LLM Policy","description":"Per-plugin api.runtime.llm.complete controls for model and agent override trust. Keep this unset unless a plugin must explicitly steer host-owned completion calls."},"config":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":false,"title":"Plugin Config","description":"Plugin-defined configuration payload interpreted by that plugin's own schema and validation rules. Use only documented fields from the plugin to prevent ignored or invalid settings.","properties":{}}},"additionalProperties":false},"file-transfer":{"type":"object","properties":{"enabled":{"type":"boolean","title":"Plugin Enabled","description":"Per-plugin enablement override for a specific entry, applied on top of global plugin policy (restart required). Use this to stage plugin rollout gradually across environments."},"hooks":{"type":"object","properties":{"allowPromptInjection":{"type":"boolean","title":"Allow Prompt Injection Hooks","description":"Controls whether this plugin may mutate prompts through typed hooks. Set false to block `before_prompt_build`."},"allowConversationAccess":{"type":"boolean","title":"Allow Conversation Access Hooks","description":"Controls whether this plugin may read raw conversation content from typed hooks such as `before_agent_run`, `before_model_resolve`, `before_agent_reply`, `llm_input`, `llm_output`, `before_agent_finalize`, and `agent_end`. Non-bundled plugins must opt in explicitly."},"timeoutMs":{"type":"integer","exclusiveMinimum":0,"maximum":600000,"title":"Plugin Hook Timeout (ms)","description":"Default timeout in milliseconds for this plugin's typed hooks, capped at 600000. Use this to bound slow plugin hooks without changing plugin code; per-hook values in hooks.timeouts take precedence."},"timeouts":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"integer","exclusiveMinimum":0,"maximum":600000},"title":"Plugin Hook Timeout Overrides","description":"Per-hook timeout overrides in milliseconds keyed by typed hook name, capped at 600000. Use narrow overrides for known slow hooks such as before_prompt_build or agent_end instead of raising every hook timeout."}},"additionalProperties":false,"title":"Plugin Hook Policy","description":"Per-plugin typed hook policy controls for core-enforced safety gates. Use this to constrain high-impact hook categories without disabling the entire plugin."},"subagent":{"type":"object","properties":{"allowModelOverride":{"type":"boolean","title":"Allow Plugin Subagent Model Override","description":"Explicitly allows this plugin to request provider/model overrides in background subagent runs. Keep false unless the plugin is trusted to steer model selection."},"allowedModels":{"type":"array","items":{"type":"string"},"title":"Plugin Subagent Allowed Models","description":"Allowed override targets for trusted plugin subagent runs as canonical \"provider/model\" refs. Use \"*\" only when you intentionally allow any model."}},"additionalProperties":false,"title":"Plugin Subagent Policy","description":"Per-plugin subagent runtime controls for model override trust and allowlists. Keep this unset unless a plugin must explicitly steer subagent model selection."},"llm":{"type":"object","properties":{"allowModelOverride":{"type":"boolean","title":"Allow Plugin LLM Model Override","description":"Explicitly allows this plugin to request model overrides in api.runtime.llm.complete. Keep false unless the plugin is trusted to steer model selection."},"allowedModels":{"type":"array","items":{"type":"string"},"title":"Plugin LLM Allowed Models","description":"Allowed override targets for trusted plugin LLM calls as canonical \"provider/model\" refs. Use \"*\" only when you intentionally allow any model override."},"allowedCompletionModels":{"type":"array","items":{"type":"string"},"title":"Plugin LLM Allowed Completion Models","description":"Allowed targets for every plugin LLM completion as canonical \"provider/model\" refs, including host-resolved defaults and overrides. Use \"*\" only when you intentionally allow any model."},"allowAuthProfileOverride":{"type":"boolean","title":"Allow Plugin LLM Auth Profile Override","description":"Allows this plugin to select a non-default auth profile for isolated agent-runtime completions. Keep false unless the plugin is trusted for explicit isolated credential routing."},"allowAgentIdOverride":{"type":"boolean","title":"Allow Plugin LLM Agent Override","description":"Explicitly allows this plugin to request api.runtime.llm.complete against a non-default agent id. Keep false unless the plugin is trusted for cross-agent model access."}},"additionalProperties":false,"title":"Plugin LLM Policy","description":"Per-plugin api.runtime.llm.complete controls for model and agent override trust. Keep this unset unless a plugin must explicitly steer host-owned completion calls."},"config":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":false,"title":"Plugin Config","description":"Plugin-defined configuration payload interpreted by that plugin's own schema and validation rules. Use only documented fields from the plugin to prevent ignored or invalid settings.","properties":{"policyVersion":{"type":"integer","const":2},"literalGrants":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["nodeId","command","requestedPath","canonicalPath"],"properties":{"nodeId":{"type":"string","minLength":1},"command":{"type":"string","enum":["file.fetch","dir.list","dir.fetch","file.write"]},"requestedPath":{"type":"string","minLength":1},"canonicalPath":{"type":"string","minLength":1}}}},"pendingReapprovals":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["selector","kind","path"],"properties":{"selector":{"type":"string","minLength":1},"kind":{"type":"string","enum":["read","write"]},"path":{"type":"string","minLength":1}}}},"nodes":{"type":"object","additionalProperties":{"type":"object","additionalProperties":false,"properties":{"ask":{"type":"string","enum":["off","on-miss","always"]},"allowReadPaths":{"type":"array","items":{"type":"string"}},"allowWritePaths":{"type":"array","items":{"type":"string"}},"denyPaths":{"type":"array","items":{"type":"string"}},"maxBytes":{"type":"number"},"followSymlinks":{"type":"boolean","default":false}}}}}}},"additionalProperties":false},"geolocation":{"type":"object","properties":{"enabled":{"type":"boolean","title":"Plugin Enabled","description":"Per-plugin enablement override for a specific entry, applied on top of global plugin policy (restart required). Use this to stage plugin rollout gradually across environments."},"hooks":{"type":"object","properties":{"allowPromptInjection":{"type":"boolean","title":"Allow Prompt Injection Hooks","description":"Controls whether this plugin may mutate prompts through typed hooks. Set false to block `before_prompt_build`."},"allowConversationAccess":{"type":"boolean","title":"Allow Conversation Access Hooks","description":"Controls whether this plugin may read raw conversation content from typed hooks such as `before_agent_run`, `before_model_resolve`, `before_agent_reply`, `llm_input`, `llm_output`, `before_agent_finalize`, and `agent_end`. Non-bundled plugins must opt in explicitly."},"timeoutMs":{"type":"integer","exclusiveMinimum":0,"maximum":600000,"title":"Plugin Hook Timeout (ms)","description":"Default timeout in milliseconds for this plugin's typed hooks, capped at 600000. Use this to bound slow plugin hooks without changing plugin code; per-hook values in hooks.timeouts take precedence."},"timeouts":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"integer","exclusiveMinimum":0,"maximum":600000},"title":"Plugin Hook Timeout Overrides","description":"Per-hook timeout overrides in milliseconds keyed by typed hook name, capped at 600000. Use narrow overrides for known slow hooks such as before_prompt_build or agent_end instead of raising every hook timeout."}},"additionalProperties":false,"title":"Plugin Hook Policy","description":"Per-plugin typed hook policy controls for core-enforced safety gates. Use this to constrain high-impact hook categories without disabling the entire plugin."},"subagent":{"type":"object","properties":{"allowModelOverride":{"type":"boolean","title":"Allow Plugin Subagent Model Override","description":"Explicitly allows this plugin to request provider/model overrides in background subagent runs. Keep false unless the plugin is trusted to steer model selection."},"allowedModels":{"type":"array","items":{"type":"string"},"title":"Plugin Subagent Allowed Models","description":"Allowed override targets for trusted plugin subagent runs as canonical \"provider/model\" refs. Use \"*\" only when you intentionally allow any model."}},"additionalProperties":false,"title":"Plugin Subagent Policy","description":"Per-plugin subagent runtime controls for model override trust and allowlists. Keep this unset unless a plugin must explicitly steer subagent model selection."},"llm":{"type":"object","properties":{"allowModelOverride":{"type":"boolean","title":"Allow Plugin LLM Model Override","description":"Explicitly allows this plugin to request model overrides in api.runtime.llm.complete. Keep false unless the plugin is trusted to steer model selection."},"allowedModels":{"type":"array","items":{"type":"string"},"title":"Plugin LLM Allowed Models","description":"Allowed override targets for trusted plugin LLM calls as canonical \"provider/model\" refs. Use \"*\" only when you intentionally allow any model override."},"allowedCompletionModels":{"type":"array","items":{"type":"string"},"title":"Plugin LLM Allowed Completion Models","description":"Allowed targets for every plugin LLM completion as canonical \"provider/model\" refs, including host-resolved defaults and overrides. Use \"*\" only when you intentionally allow any model."},"allowAuthProfileOverride":{"type":"boolean","title":"Allow Plugin LLM Auth Profile Override","description":"Allows this plugin to select a non-default auth profile for isolated agent-runtime completions. Keep false unless the plugin is trusted for explicit isolated credential routing."},"allowAgentIdOverride":{"type":"boolean","title":"Allow Plugin LLM Agent Override","description":"Explicitly allows this plugin to request api.runtime.llm.complete against a non-default agent id. Keep false unless the plugin is trusted for cross-agent model access."}},"additionalProperties":false,"title":"Plugin LLM Policy","description":"Per-plugin api.runtime.llm.complete controls for model and agent override trust. Keep this unset unless a plugin must explicitly steer host-owned completion calls."},"config":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":false,"title":"Plugin Config","description":"Plugin-defined configuration payload interpreted by that plugin's own schema and validation rules. Use only documented fields from the plugin to prevent ignored or invalid settings.","properties":{"databaseUrl":{"type":"string"},"attributionText":{"type":"string"},"attributionUrl":{"type":"string"},"refreshDays":{"type":"number","minimum":1}}}},"additionalProperties":false},"github-copilot":{"type":"object","properties":{"enabled":{"type":"boolean","title":"Plugin Enabled","description":"Per-plugin enablement override for a specific entry, applied on top of global plugin policy (restart required). Use this to stage plugin rollout gradually across environments."},"hooks":{"type":"object","properties":{"allowPromptInjection":{"type":"boolean","title":"Allow Prompt Injection Hooks","description":"Controls whether this plugin may mutate prompts through typed hooks. Set false to block `before_prompt_build`."},"allowConversationAccess":{"type":"boolean","title":"Allow Conversation Access Hooks","description":"Controls whether this plugin may read raw conversation content from typed hooks such as `before_agent_run`, `before_model_resolve`, `before_agent_reply`, `llm_input`, `llm_output`, `before_agent_finalize`, and `agent_end`. Non-bundled plugins must opt in explicitly."},"timeoutMs":{"type":"integer","exclusiveMinimum":0,"maximum":600000,"title":"Plugin Hook Timeout (ms)","description":"Default timeout in milliseconds for this plugin's typed hooks, capped at 600000. Use this to bound slow plugin hooks without changing plugin code; per-hook values in hooks.timeouts take precedence."},"timeouts":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"integer","exclusiveMinimum":0,"maximum":600000},"title":"Plugin Hook Timeout Overrides","description":"Per-hook timeout overrides in milliseconds keyed by typed hook name, capped at 600000. Use narrow overrides for known slow hooks such as before_prompt_build or agent_end instead of raising every hook timeout."}},"additionalProperties":false,"title":"Plugin Hook Policy","description":"Per-plugin typed hook policy controls for core-enforced safety gates. Use this to constrain high-impact hook categories without disabling the entire plugin."},"subagent":{"type":"object","properties":{"allowModelOverride":{"type":"boolean","title":"Allow Plugin Subagent Model Override","description":"Explicitly allows this plugin to request provider/model overrides in background subagent runs. Keep false unless the plugin is trusted to steer model selection."},"allowedModels":{"type":"array","items":{"type":"string"},"title":"Plugin Subagent Allowed Models","description":"Allowed override targets for trusted plugin subagent runs as canonical \"provider/model\" refs. Use \"*\" only when you intentionally allow any model."}},"additionalProperties":false,"title":"Plugin Subagent Policy","description":"Per-plugin subagent runtime controls for model override trust and allowlists. Keep this unset unless a plugin must explicitly steer subagent model selection."},"llm":{"type":"object","properties":{"allowModelOverride":{"type":"boolean","title":"Allow Plugin LLM Model Override","description":"Explicitly allows this plugin to request model overrides in api.runtime.llm.complete. Keep false unless the plugin is trusted to steer model selection."},"allowedModels":{"type":"array","items":{"type":"string"},"title":"Plugin LLM Allowed Models","description":"Allowed override targets for trusted plugin LLM calls as canonical \"provider/model\" refs. Use \"*\" only when you intentionally allow any model override."},"allowedCompletionModels":{"type":"array","items":{"type":"string"},"title":"Plugin LLM Allowed Completion Models","description":"Allowed targets for every plugin LLM completion as canonical \"provider/model\" refs, including host-resolved defaults and overrides. Use \"*\" only when you intentionally allow any model."},"allowAuthProfileOverride":{"type":"boolean","title":"Allow Plugin LLM Auth Profile Override","description":"Allows this plugin to select a non-default auth profile for isolated agent-runtime completions. Keep false unless the plugin is trusted for explicit isolated credential routing."},"allowAgentIdOverride":{"type":"boolean","title":"Allow Plugin LLM Agent Override","description":"Explicitly allows this plugin to request api.runtime.llm.complete against a non-default agent id. Keep false unless the plugin is trusted for cross-agent model access."}},"additionalProperties":false,"title":"Plugin LLM Policy","description":"Per-plugin api.runtime.llm.complete controls for model and agent override trust. Keep this unset unless a plugin must explicitly steer host-owned completion calls."},"config":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":false,"title":"Plugin Config","description":"Plugin-defined configuration payload interpreted by that plugin's own schema and validation rules. Use only documented fields from the plugin to prevent ignored or invalid settings.","properties":{"discovery":{"type":"object","additionalProperties":false,"properties":{"enabled":{"type":"boolean"}}}}}},"additionalProperties":false},"google":{"type":"object","properties":{"enabled":{"type":"boolean","title":"Plugin Enabled","description":"Per-plugin enablement override for a specific entry, applied on top of global plugin policy (restart required). Use this to stage plugin rollout gradually across environments."},"hooks":{"type":"object","properties":{"allowPromptInjection":{"type":"boolean","title":"Allow Prompt Injection Hooks","description":"Controls whether this plugin may mutate prompts through typed hooks. Set false to block `before_prompt_build`."},"allowConversationAccess":{"type":"boolean","title":"Allow Conversation Access Hooks","description":"Controls whether this plugin may read raw conversation content from typed hooks such as `before_agent_run`, `before_model_resolve`, `before_agent_reply`, `llm_input`, `llm_output`, `before_agent_finalize`, and `agent_end`. Non-bundled plugins must opt in explicitly."},"timeoutMs":{"type":"integer","exclusiveMinimum":0,"maximum":600000,"title":"Plugin Hook Timeout (ms)","description":"Default timeout in milliseconds for this plugin's typed hooks, capped at 600000. Use this to bound slow plugin hooks without changing plugin code; per-hook values in hooks.timeouts take precedence."},"timeouts":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"integer","exclusiveMinimum":0,"maximum":600000},"title":"Plugin Hook Timeout Overrides","description":"Per-hook timeout overrides in milliseconds keyed by typed hook name, capped at 600000. Use narrow overrides for known slow hooks such as before_prompt_build or agent_end instead of raising every hook timeout."}},"additionalProperties":false,"title":"Plugin Hook Policy","description":"Per-plugin typed hook policy controls for core-enforced safety gates. Use this to constrain high-impact hook categories without disabling the entire plugin."},"subagent":{"type":"object","properties":{"allowModelOverride":{"type":"boolean","title":"Allow Plugin Subagent Model Override","description":"Explicitly allows this plugin to request provider/model overrides in background subagent runs. Keep false unless the plugin is trusted to steer model selection."},"allowedModels":{"type":"array","items":{"type":"string"},"title":"Plugin Subagent Allowed Models","description":"Allowed override targets for trusted plugin subagent runs as canonical \"provider/model\" refs. Use \"*\" only when you intentionally allow any model."}},"additionalProperties":false,"title":"Plugin Subagent Policy","description":"Per-plugin subagent runtime controls for model override trust and allowlists. Keep this unset unless a plugin must explicitly steer subagent model selection."},"llm":{"type":"object","properties":{"allowModelOverride":{"type":"boolean","title":"Allow Plugin LLM Model Override","description":"Explicitly allows this plugin to request model overrides in api.runtime.llm.complete. Keep false unless the plugin is trusted to steer model selection."},"allowedModels":{"type":"array","items":{"type":"string"},"title":"Plugin LLM Allowed Models","description":"Allowed override targets for trusted plugin LLM calls as canonical \"provider/model\" refs. Use \"*\" only when you intentionally allow any model override."},"allowedCompletionModels":{"type":"array","items":{"type":"string"},"title":"Plugin LLM Allowed Completion Models","description":"Allowed targets for every plugin LLM completion as canonical \"provider/model\" refs, including host-resolved defaults and overrides. Use \"*\" only when you intentionally allow any model."},"allowAuthProfileOverride":{"type":"boolean","title":"Allow Plugin LLM Auth Profile Override","description":"Allows this plugin to select a non-default auth profile for isolated agent-runtime completions. Keep false unless the plugin is trusted for explicit isolated credential routing."},"allowAgentIdOverride":{"type":"boolean","title":"Allow Plugin LLM Agent Override","description":"Explicitly allows this plugin to request api.runtime.llm.complete against a non-default agent id. Keep false unless the plugin is trusted for cross-agent model access."}},"additionalProperties":false,"title":"Plugin LLM Policy","description":"Per-plugin api.runtime.llm.complete controls for model and agent override trust. Keep this unset unless a plugin must explicitly steer host-owned completion calls."},"config":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":false,"title":"Plugin Config","description":"Plugin-defined configuration payload interpreted by that plugin's own schema and validation rules. Use only documented fields from the plugin to prevent ignored or invalid settings.","properties":{"webSearch":{"type":"object","additionalProperties":false,"properties":{"apiKey":{"type":["string","object"]},"model":{"type":"string"},"baseUrl":{"type":"string"},"headers":{"type":"object","additionalProperties":{"type":["string","object"]}}}}}}},"additionalProperties":false},"huggingface":{"type":"object","properties":{"enabled":{"type":"boolean","title":"Plugin Enabled","description":"Per-plugin enablement override for a specific entry, applied on top of global plugin policy (restart required). Use this to stage plugin rollout gradually across environments."},"hooks":{"type":"object","properties":{"allowPromptInjection":{"type":"boolean","title":"Allow Prompt Injection Hooks","description":"Controls whether this plugin may mutate prompts through typed hooks. Set false to block `before_prompt_build`."},"allowConversationAccess":{"type":"boolean","title":"Allow Conversation Access Hooks","description":"Controls whether this plugin may read raw conversation content from typed hooks such as `before_agent_run`, `before_model_resolve`, `before_agent_reply`, `llm_input`, `llm_output`, `before_agent_finalize`, and `agent_end`. Non-bundled plugins must opt in explicitly."},"timeoutMs":{"type":"integer","exclusiveMinimum":0,"maximum":600000,"title":"Plugin Hook Timeout (ms)","description":"Default timeout in milliseconds for this plugin's typed hooks, capped at 600000. Use this to bound slow plugin hooks without changing plugin code; per-hook values in hooks.timeouts take precedence."},"timeouts":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"integer","exclusiveMinimum":0,"maximum":600000},"title":"Plugin Hook Timeout Overrides","description":"Per-hook timeout overrides in milliseconds keyed by typed hook name, capped at 600000. Use narrow overrides for known slow hooks such as before_prompt_build or agent_end instead of raising every hook timeout."}},"additionalProperties":false,"title":"Plugin Hook Policy","description":"Per-plugin typed hook policy controls for core-enforced safety gates. Use this to constrain high-impact hook categories without disabling the entire plugin."},"subagent":{"type":"object","properties":{"allowModelOverride":{"type":"boolean","title":"Allow Plugin Subagent Model Override","description":"Explicitly allows this plugin to request provider/model overrides in background subagent runs. Keep false unless the plugin is trusted to steer model selection."},"allowedModels":{"type":"array","items":{"type":"string"},"title":"Plugin Subagent Allowed Models","description":"Allowed override targets for trusted plugin subagent runs as canonical \"provider/model\" refs. Use \"*\" only when you intentionally allow any model."}},"additionalProperties":false,"title":"Plugin Subagent Policy","description":"Per-plugin subagent runtime controls for model override trust and allowlists. Keep this unset unless a plugin must explicitly steer subagent model selection."},"llm":{"type":"object","properties":{"allowModelOverride":{"type":"boolean","title":"Allow Plugin LLM Model Override","description":"Explicitly allows this plugin to request model overrides in api.runtime.llm.complete. Keep false unless the plugin is trusted to steer model selection."},"allowedModels":{"type":"array","items":{"type":"string"},"title":"Plugin LLM Allowed Models","description":"Allowed override targets for trusted plugin LLM calls as canonical \"provider/model\" refs. Use \"*\" only when you intentionally allow any model override."},"allowedCompletionModels":{"type":"array","items":{"type":"string"},"title":"Plugin LLM Allowed Completion Models","description":"Allowed targets for every plugin LLM completion as canonical \"provider/model\" refs, including host-resolved defaults and overrides. Use \"*\" only when you intentionally allow any model."},"allowAuthProfileOverride":{"type":"boolean","title":"Allow Plugin LLM Auth Profile Override","description":"Allows this plugin to select a non-default auth profile for isolated agent-runtime completions. Keep false unless the plugin is trusted for explicit isolated credential routing."},"allowAgentIdOverride":{"type":"boolean","title":"Allow Plugin LLM Agent Override","description":"Explicitly allows this plugin to request api.runtime.llm.complete against a non-default agent id. Keep false unless the plugin is trusted for cross-agent model access."}},"additionalProperties":false,"title":"Plugin LLM Policy","description":"Per-plugin api.runtime.llm.complete controls for model and agent override trust. Keep this unset unless a plugin must explicitly steer host-owned completion calls."},"config":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":false,"title":"Plugin Config","description":"Plugin-defined configuration payload interpreted by that plugin's own schema and validation rules. Use only documented fields from the plugin to prevent ignored or invalid settings.","properties":{"discovery":{"type":"object","additionalProperties":false,"properties":{"enabled":{"type":"boolean"}}}}}},"additionalProperties":false},"imap":{"type":"object","properties":{"enabled":{"type":"boolean","title":"Plugin Enabled","description":"Per-plugin enablement override for a specific entry, applied on top of global plugin policy (restart required). Use this to stage plugin rollout gradually across environments."},"hooks":{"type":"object","properties":{"allowPromptInjection":{"type":"boolean","title":"Allow Prompt Injection Hooks","description":"Controls whether this plugin may mutate prompts through typed hooks. Set false to block `before_prompt_build`."},"allowConversationAccess":{"type":"boolean","title":"Allow Conversation Access Hooks","description":"Controls whether this plugin may read raw conversation content from typed hooks such as `before_agent_run`, `before_model_resolve`, `before_agent_reply`, `llm_input`, `llm_output`, `before_agent_finalize`, and `agent_end`. Non-bundled plugins must opt in explicitly."},"timeoutMs":{"type":"integer","exclusiveMinimum":0,"maximum":600000,"title":"Plugin Hook Timeout (ms)","description":"Default timeout in milliseconds for this plugin's typed hooks, capped at 600000. Use this to bound slow plugin hooks without changing plugin code; per-hook values in hooks.timeouts take precedence."},"timeouts":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"integer","exclusiveMinimum":0,"maximum":600000},"title":"Plugin Hook Timeout Overrides","description":"Per-hook timeout overrides in milliseconds keyed by typed hook name, capped at 600000. Use narrow overrides for known slow hooks such as before_prompt_build or agent_end instead of raising every hook timeout."}},"additionalProperties":false,"title":"Plugin Hook Policy","description":"Per-plugin typed hook policy controls for core-enforced safety gates. Use this to constrain high-impact hook categories without disabling the entire plugin."},"subagent":{"type":"object","properties":{"allowModelOverride":{"type":"boolean","title":"Allow Plugin Subagent Model Override","description":"Explicitly allows this plugin to request provider/model overrides in background subagent runs. Keep false unless the plugin is trusted to steer model selection."},"allowedModels":{"type":"array","items":{"type":"string"},"title":"Plugin Subagent Allowed Models","description":"Allowed override targets for trusted plugin subagent runs as canonical \"provider/model\" refs. Use \"*\" only when you intentionally allow any model."}},"additionalProperties":false,"title":"Plugin Subagent Policy","description":"Per-plugin subagent runtime controls for model override trust and allowlists. Keep this unset unless a plugin must explicitly steer subagent model selection."},"llm":{"type":"object","properties":{"allowModelOverride":{"type":"boolean","title":"Allow Plugin LLM Model Override","description":"Explicitly allows this plugin to request model overrides in api.runtime.llm.complete. Keep false unless the plugin is trusted to steer model selection."},"allowedModels":{"type":"array","items":{"type":"string"},"title":"Plugin LLM Allowed Models","description":"Allowed override targets for trusted plugin LLM calls as canonical \"provider/model\" refs. Use \"*\" only when you intentionally allow any model override."},"allowedCompletionModels":{"type":"array","items":{"type":"string"},"title":"Plugin LLM Allowed Completion Models","description":"Allowed targets for every plugin LLM completion as canonical \"provider/model\" refs, including host-resolved defaults and overrides. Use \"*\" only when you intentionally allow any model."},"allowAuthProfileOverride":{"type":"boolean","title":"Allow Plugin LLM Auth Profile Override","description":"Allows this plugin to select a non-default auth profile for isolated agent-runtime completions. Keep false unless the plugin is trusted for explicit isolated credential routing."},"allowAgentIdOverride":{"type":"boolean","title":"Allow Plugin LLM Agent Override","description":"Explicitly allows this plugin to request api.runtime.llm.complete against a non-default agent id. Keep false unless the plugin is trusted for cross-agent model access."}},"additionalProperties":false,"title":"Plugin LLM Policy","description":"Per-plugin api.runtime.llm.complete controls for model and agent override trust. Keep this unset unless a plugin must explicitly steer host-owned completion calls."},"config":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":false,"title":"Plugin Config","description":"Plugin-defined configuration payload interpreted by that plugin's own schema and validation rules. Use only documented fields from the plugin to prevent ignored or invalid settings.","$defs":{"secretRef":{"type":"object","additionalProperties":false,"properties":{"source":{"type":"string","enum":["env","file","exec","store"]},"provider":{"type":"string"},"id":{"type":"string"}},"required":["source","provider","id"]},"secretInput":{"anyOf":[{"type":"string","minLength":1},{"$ref":"#/properties/plugins/properties/entries/properties/imap/properties/config/$defs/secretRef"}]},"senderAuth":{"type":"object","additionalProperties":false,"properties":{"min":{"type":"string","enum":["verified","asserted","unverified","mutable"],"default":"verified"},"trustedAuthservIds":{"type":"array","items":{"type":"string","minLength":1}},"acceptTrustedAuthservId":{"type":"boolean","default":false}}},"addressToken":{"type":"object","additionalProperties":false,"properties":{"token":{"type":"string","minLength":1},"senders":{"type":"array","items":{"type":"string","minLength":1},"minItems":1}},"required":["token","senders"]},"watch":{"type":"object","additionalProperties":false,"properties":{"mode":{"type":"string","enum":["auto","idle","interval"],"default":"auto"},"pollSeconds":{"type":"integer","minimum":15,"default":60}}},"account":{"type":"object","additionalProperties":false,"properties":{"host":{"type":"string","minLength":1},"port":{"type":"integer","minimum":1,"maximum":65535,"default":993},"secure":{"type":"boolean","default":true},"user":{"type":"string","minLength":1},"password":{"$ref":"#/properties/plugins/properties/entries/properties/imap/properties/config/$defs/secretInput"},"mailbox":{"type":"string","minLength":1,"default":"INBOX"},"watch":{"$ref":"#/properties/plugins/properties/entries/properties/imap/properties/config/$defs/watch"},"allowedSenders":{"type":"array","items":{"type":"string","minLength":1}},"senderAuth":{"$ref":"#/properties/plugins/properties/entries/properties/imap/properties/config/$defs/senderAuth"},"addressTokens":{"type":"array","items":{"$ref":"#/properties/plugins/properties/entries/properties/imap/properties/config/$defs/addressToken"}},"agentId":{"type":"string","minLength":1},"deliver":{"type":"boolean","default":false},"includeBody":{"type":"boolean","default":true},"maxBytes":{"type":"integer","minimum":256,"maximum":1048576,"default":20000},"model":{"type":"string","minLength":1},"thinking":{"type":"string","enum":["off","minimal","low","medium","high","xhigh","adaptive","max","ultra"]},"timeoutSeconds":{"type":"integer","minimum":1}},"required":["host","user","password","agentId"]}},"properties":{"accounts":{"type":"object","propertyNames":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]*$"},"additionalProperties":{"$ref":"#/properties/plugins/properties/entries/properties/imap/properties/config/$defs/account"}}}}},"additionalProperties":false},"linux-node":{"type":"object","properties":{"enabled":{"type":"boolean","title":"Plugin Enabled","description":"Per-plugin enablement override for a specific entry, applied on top of global plugin policy (restart required). Use this to stage plugin rollout gradually across environments."},"hooks":{"type":"object","properties":{"allowPromptInjection":{"type":"boolean","title":"Allow Prompt Injection Hooks","description":"Controls whether this plugin may mutate prompts through typed hooks. Set false to block `before_prompt_build`."},"allowConversationAccess":{"type":"boolean","title":"Allow Conversation Access Hooks","description":"Controls whether this plugin may read raw conversation content from typed hooks such as `before_agent_run`, `before_model_resolve`, `before_agent_reply`, `llm_input`, `llm_output`, `before_agent_finalize`, and `agent_end`. Non-bundled plugins must opt in explicitly."},"timeoutMs":{"type":"integer","exclusiveMinimum":0,"maximum":600000,"title":"Plugin Hook Timeout (ms)","description":"Default timeout in milliseconds for this plugin's typed hooks, capped at 600000. Use this to bound slow plugin hooks without changing plugin code; per-hook values in hooks.timeouts take precedence."},"timeouts":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"integer","exclusiveMinimum":0,"maximum":600000},"title":"Plugin Hook Timeout Overrides","description":"Per-hook timeout overrides in milliseconds keyed by typed hook name, capped at 600000. Use narrow overrides for known slow hooks such as before_prompt_build or agent_end instead of raising every hook timeout."}},"additionalProperties":false,"title":"Plugin Hook Policy","description":"Per-plugin typed hook policy controls for core-enforced safety gates. Use this to constrain high-impact hook categories without disabling the entire plugin."},"subagent":{"type":"object","properties":{"allowModelOverride":{"type":"boolean","title":"Allow Plugin Subagent Model Override","description":"Explicitly allows this plugin to request provider/model overrides in background subagent runs. Keep false unless the plugin is trusted to steer model selection."},"allowedModels":{"type":"array","items":{"type":"string"},"title":"Plugin Subagent Allowed Models","description":"Allowed override targets for trusted plugin subagent runs as canonical \"provider/model\" refs. Use \"*\" only when you intentionally allow any model."}},"additionalProperties":false,"title":"Plugin Subagent Policy","description":"Per-plugin subagent runtime controls for model override trust and allowlists. Keep this unset unless a plugin must explicitly steer subagent model selection."},"llm":{"type":"object","properties":{"allowModelOverride":{"type":"boolean","title":"Allow Plugin LLM Model Override","description":"Explicitly allows this plugin to request model overrides in api.runtime.llm.complete. Keep false unless the plugin is trusted to steer model selection."},"allowedModels":{"type":"array","items":{"type":"string"},"title":"Plugin LLM Allowed Models","description":"Allowed override targets for trusted plugin LLM calls as canonical \"provider/model\" refs. Use \"*\" only when you intentionally allow any model override."},"allowedCompletionModels":{"type":"array","items":{"type":"string"},"title":"Plugin LLM Allowed Completion Models","description":"Allowed targets for every plugin LLM completion as canonical \"provider/model\" refs, including host-resolved defaults and overrides. Use \"*\" only when you intentionally allow any model."},"allowAuthProfileOverride":{"type":"boolean","title":"Allow Plugin LLM Auth Profile Override","description":"Allows this plugin to select a non-default auth profile for isolated agent-runtime completions. Keep false unless the plugin is trusted for explicit isolated credential routing."},"allowAgentIdOverride":{"type":"boolean","title":"Allow Plugin LLM Agent Override","description":"Explicitly allows this plugin to request api.runtime.llm.complete against a non-default agent id. Keep false unless the plugin is trusted for cross-agent model access."}},"additionalProperties":false,"title":"Plugin LLM Policy","description":"Per-plugin api.runtime.llm.complete controls for model and agent override trust. Keep this unset unless a plugin must explicitly steer host-owned completion calls."},"config":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":false,"title":"Plugin Config","description":"Plugin-defined configuration payload interpreted by that plugin's own schema and validation rules. Use only documented fields from the plugin to prevent ignored or invalid settings.","properties":{"notify":{"type":"object","additionalProperties":false,"properties":{"enabled":{"type":"boolean","default":true}}},"camera":{"type":"object","additionalProperties":false,"properties":{"enabled":{"type":"boolean","default":false}}},"location":{"type":"object","additionalProperties":false,"properties":{"enabled":{"type":"boolean","default":false}}}}}},"additionalProperties":false},"litellm":{"type":"object","properties":{"enabled":{"type":"boolean","title":"Plugin Enabled","description":"Per-plugin enablement override for a specific entry, applied on top of global plugin policy (restart required). Use this to stage plugin rollout gradually across environments."},"hooks":{"type":"object","properties":{"allowPromptInjection":{"type":"boolean","title":"Allow Prompt Injection Hooks","description":"Controls whether this plugin may mutate prompts through typed hooks. Set false to block `before_prompt_build`."},"allowConversationAccess":{"type":"boolean","title":"Allow Conversation Access Hooks","description":"Controls whether this plugin may read raw conversation content from typed hooks such as `before_agent_run`, `before_model_resolve`, `before_agent_reply`, `llm_input`, `llm_output`, `before_agent_finalize`, and `agent_end`. Non-bundled plugins must opt in explicitly."},"timeoutMs":{"type":"integer","exclusiveMinimum":0,"maximum":600000,"title":"Plugin Hook Timeout (ms)","description":"Default timeout in milliseconds for this plugin's typed hooks, capped at 600000. Use this to bound slow plugin hooks without changing plugin code; per-hook values in hooks.timeouts take precedence."},"timeouts":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"integer","exclusiveMinimum":0,"maximum":600000},"title":"Plugin Hook Timeout Overrides","description":"Per-hook timeout overrides in milliseconds keyed by typed hook name, capped at 600000. Use narrow overrides for known slow hooks such as before_prompt_build or agent_end instead of raising every hook timeout."}},"additionalProperties":false,"title":"Plugin Hook Policy","description":"Per-plugin typed hook policy controls for core-enforced safety gates. Use this to constrain high-impact hook categories without disabling the entire plugin."},"subagent":{"type":"object","properties":{"allowModelOverride":{"type":"boolean","title":"Allow Plugin Subagent Model Override","description":"Explicitly allows this plugin to request provider/model overrides in background subagent runs. Keep false unless the plugin is trusted to steer model selection."},"allowedModels":{"type":"array","items":{"type":"string"},"title":"Plugin Subagent Allowed Models","description":"Allowed override targets for trusted plugin subagent runs as canonical \"provider/model\" refs. Use \"*\" only when you intentionally allow any model."}},"additionalProperties":false,"title":"Plugin Subagent Policy","description":"Per-plugin subagent runtime controls for model override trust and allowlists. Keep this unset unless a plugin must explicitly steer subagent model selection."},"llm":{"type":"object","properties":{"allowModelOverride":{"type":"boolean","title":"Allow Plugin LLM Model Override","description":"Explicitly allows this plugin to request model overrides in api.runtime.llm.complete. Keep false unless the plugin is trusted to steer model selection."},"allowedModels":{"type":"array","items":{"type":"string"},"title":"Plugin LLM Allowed Models","description":"Allowed override targets for trusted plugin LLM calls as canonical \"provider/model\" refs. Use \"*\" only when you intentionally allow any model override."},"allowedCompletionModels":{"type":"array","items":{"type":"string"},"title":"Plugin LLM Allowed Completion Models","description":"Allowed targets for every plugin LLM completion as canonical \"provider/model\" refs, including host-resolved defaults and overrides. Use \"*\" only when you intentionally allow any model."},"allowAuthProfileOverride":{"type":"boolean","title":"Allow Plugin LLM Auth Profile Override","description":"Allows this plugin to select a non-default auth profile for isolated agent-runtime completions. Keep false unless the plugin is trusted for explicit isolated credential routing."},"allowAgentIdOverride":{"type":"boolean","title":"Allow Plugin LLM Agent Override","description":"Explicitly allows this plugin to request api.runtime.llm.complete against a non-default agent id. Keep false unless the plugin is trusted for cross-agent model access."}},"additionalProperties":false,"title":"Plugin LLM Policy","description":"Per-plugin api.runtime.llm.complete controls for model and agent override trust. Keep this unset unless a plugin must explicitly steer host-owned completion calls."},"config":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":false,"title":"Plugin Config","description":"Plugin-defined configuration payload interpreted by that plugin's own schema and validation rules. Use only documented fields from the plugin to prevent ignored or invalid settings.","properties":{}}},"additionalProperties":false},"llm-task":{"type":"object","properties":{"enabled":{"type":"boolean","title":"Plugin Enabled","description":"Per-plugin enablement override for a specific entry, applied on top of global plugin policy (restart required). Use this to stage plugin rollout gradually across environments."},"hooks":{"type":"object","properties":{"allowPromptInjection":{"type":"boolean","title":"Allow Prompt Injection Hooks","description":"Controls whether this plugin may mutate prompts through typed hooks. Set false to block `before_prompt_build`."},"allowConversationAccess":{"type":"boolean","title":"Allow Conversation Access Hooks","description":"Controls whether this plugin may read raw conversation content from typed hooks such as `before_agent_run`, `before_model_resolve`, `before_agent_reply`, `llm_input`, `llm_output`, `before_agent_finalize`, and `agent_end`. Non-bundled plugins must opt in explicitly."},"timeoutMs":{"type":"integer","exclusiveMinimum":0,"maximum":600000,"title":"Plugin Hook Timeout (ms)","description":"Default timeout in milliseconds for this plugin's typed hooks, capped at 600000. Use this to bound slow plugin hooks without changing plugin code; per-hook values in hooks.timeouts take precedence."},"timeouts":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"integer","exclusiveMinimum":0,"maximum":600000},"title":"Plugin Hook Timeout Overrides","description":"Per-hook timeout overrides in milliseconds keyed by typed hook name, capped at 600000. Use narrow overrides for known slow hooks such as before_prompt_build or agent_end instead of raising every hook timeout."}},"additionalProperties":false,"title":"Plugin Hook Policy","description":"Per-plugin typed hook policy controls for core-enforced safety gates. Use this to constrain high-impact hook categories without disabling the entire plugin."},"subagent":{"type":"object","properties":{"allowModelOverride":{"type":"boolean","title":"Allow Plugin Subagent Model Override","description":"Explicitly allows this plugin to request provider/model overrides in background subagent runs. Keep false unless the plugin is trusted to steer model selection."},"allowedModels":{"type":"array","items":{"type":"string"},"title":"Plugin Subagent Allowed Models","description":"Allowed override targets for trusted plugin subagent runs as canonical \"provider/model\" refs. Use \"*\" only when you intentionally allow any model."}},"additionalProperties":false,"title":"Plugin Subagent Policy","description":"Per-plugin subagent runtime controls for model override trust and allowlists. Keep this unset unless a plugin must explicitly steer subagent model selection."},"llm":{"type":"object","properties":{"allowModelOverride":{"type":"boolean","title":"Allow Plugin LLM Model Override","description":"Explicitly allows this plugin to request model overrides in api.runtime.llm.complete. Keep false unless the plugin is trusted to steer model selection."},"allowedModels":{"type":"array","items":{"type":"string"},"title":"Plugin LLM Allowed Models","description":"Allowed override targets for trusted plugin LLM calls as canonical \"provider/model\" refs. Use \"*\" only when you intentionally allow any model override."},"allowedCompletionModels":{"type":"array","items":{"type":"string"},"title":"Plugin LLM Allowed Completion Models","description":"Allowed targets for every plugin LLM completion as canonical \"provider/model\" refs, including host-resolved defaults and overrides. Use \"*\" only when you intentionally allow any model."},"allowAuthProfileOverride":{"type":"boolean","title":"Allow Plugin LLM Auth Profile Override","description":"Allows this plugin to select a non-default auth profile for isolated agent-runtime completions. Keep false unless the plugin is trusted for explicit isolated credential routing."},"allowAgentIdOverride":{"type":"boolean","title":"Allow Plugin LLM Agent Override","description":"Explicitly allows this plugin to request api.runtime.llm.complete against a non-default agent id. Keep false unless the plugin is trusted for cross-agent model access."}},"additionalProperties":false,"title":"Plugin LLM Policy","description":"Per-plugin api.runtime.llm.complete controls for model and agent override trust. Keep this unset unless a plugin must explicitly steer host-owned completion calls."},"config":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":false,"title":"Plugin Config","description":"Plugin-defined configuration payload interpreted by that plugin's own schema and validation rules. Use only documented fields from the plugin to prevent ignored or invalid settings.","properties":{"defaultProvider":{"type":"string"},"defaultModel":{"type":"string"},"defaultAuthProfileId":{"type":"string"},"maxTokens":{"type":"integer","minimum":1},"timeoutMs":{"type":"integer","minimum":1}}}},"additionalProperties":false},"lmstudio":{"type":"object","properties":{"enabled":{"type":"boolean","title":"Plugin Enabled","description":"Per-plugin enablement override for a specific entry, applied on top of global plugin policy (restart required). Use this to stage plugin rollout gradually across environments."},"hooks":{"type":"object","properties":{"allowPromptInjection":{"type":"boolean","title":"Allow Prompt Injection Hooks","description":"Controls whether this plugin may mutate prompts through typed hooks. Set false to block `before_prompt_build`."},"allowConversationAccess":{"type":"boolean","title":"Allow Conversation Access Hooks","description":"Controls whether this plugin may read raw conversation content from typed hooks such as `before_agent_run`, `before_model_resolve`, `before_agent_reply`, `llm_input`, `llm_output`, `before_agent_finalize`, and `agent_end`. Non-bundled plugins must opt in explicitly."},"timeoutMs":{"type":"integer","exclusiveMinimum":0,"maximum":600000,"title":"Plugin Hook Timeout (ms)","description":"Default timeout in milliseconds for this plugin's typed hooks, capped at 600000. Use this to bound slow plugin hooks without changing plugin code; per-hook values in hooks.timeouts take precedence."},"timeouts":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"integer","exclusiveMinimum":0,"maximum":600000},"title":"Plugin Hook Timeout Overrides","description":"Per-hook timeout overrides in milliseconds keyed by typed hook name, capped at 600000. Use narrow overrides for known slow hooks such as before_prompt_build or agent_end instead of raising every hook timeout."}},"additionalProperties":false,"title":"Plugin Hook Policy","description":"Per-plugin typed hook policy controls for core-enforced safety gates. Use this to constrain high-impact hook categories without disabling the entire plugin."},"subagent":{"type":"object","properties":{"allowModelOverride":{"type":"boolean","title":"Allow Plugin Subagent Model Override","description":"Explicitly allows this plugin to request provider/model overrides in background subagent runs. Keep false unless the plugin is trusted to steer model selection."},"allowedModels":{"type":"array","items":{"type":"string"},"title":"Plugin Subagent Allowed Models","description":"Allowed override targets for trusted plugin subagent runs as canonical \"provider/model\" refs. Use \"*\" only when you intentionally allow any model."}},"additionalProperties":false,"title":"Plugin Subagent Policy","description":"Per-plugin subagent runtime controls for model override trust and allowlists. Keep this unset unless a plugin must explicitly steer subagent model selection."},"llm":{"type":"object","properties":{"allowModelOverride":{"type":"boolean","title":"Allow Plugin LLM Model Override","description":"Explicitly allows this plugin to request model overrides in api.runtime.llm.complete. Keep false unless the plugin is trusted to steer model selection."},"allowedModels":{"type":"array","items":{"type":"string"},"title":"Plugin LLM Allowed Models","description":"Allowed override targets for trusted plugin LLM calls as canonical \"provider/model\" refs. Use \"*\" only when you intentionally allow any model override."},"allowedCompletionModels":{"type":"array","items":{"type":"string"},"title":"Plugin LLM Allowed Completion Models","description":"Allowed targets for every plugin LLM completion as canonical \"provider/model\" refs, including host-resolved defaults and overrides. Use \"*\" only when you intentionally allow any model."},"allowAuthProfileOverride":{"type":"boolean","title":"Allow Plugin LLM Auth Profile Override","description":"Allows this plugin to select a non-default auth profile for isolated agent-runtime completions. Keep false unless the plugin is trusted for explicit isolated credential routing."},"allowAgentIdOverride":{"type":"boolean","title":"Allow Plugin LLM Agent Override","description":"Explicitly allows this plugin to request api.runtime.llm.complete against a non-default agent id. Keep false unless the plugin is trusted for cross-agent model access."}},"additionalProperties":false,"title":"Plugin LLM Policy","description":"Per-plugin api.runtime.llm.complete controls for model and agent override trust. Keep this unset unless a plugin must explicitly steer host-owned completion calls."},"config":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":false,"title":"Plugin Config","description":"Plugin-defined configuration payload interpreted by that plugin's own schema and validation rules. Use only documented fields from the plugin to prevent ignored or invalid settings.","properties":{}}},"additionalProperties":false},"logbook":{"type":"object","properties":{"enabled":{"type":"boolean","title":"Plugin Enabled","description":"Per-plugin enablement override for a specific entry, applied on top of global plugin policy (restart required). Use this to stage plugin rollout gradually across environments."},"hooks":{"type":"object","properties":{"allowPromptInjection":{"type":"boolean","title":"Allow Prompt Injection Hooks","description":"Controls whether this plugin may mutate prompts through typed hooks. Set false to block `before_prompt_build`."},"allowConversationAccess":{"type":"boolean","title":"Allow Conversation Access Hooks","description":"Controls whether this plugin may read raw conversation content from typed hooks such as `before_agent_run`, `before_model_resolve`, `before_agent_reply`, `llm_input`, `llm_output`, `before_agent_finalize`, and `agent_end`. Non-bundled plugins must opt in explicitly."},"timeoutMs":{"type":"integer","exclusiveMinimum":0,"maximum":600000,"title":"Plugin Hook Timeout (ms)","description":"Default timeout in milliseconds for this plugin's typed hooks, capped at 600000. Use this to bound slow plugin hooks without changing plugin code; per-hook values in hooks.timeouts take precedence."},"timeouts":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"integer","exclusiveMinimum":0,"maximum":600000},"title":"Plugin Hook Timeout Overrides","description":"Per-hook timeout overrides in milliseconds keyed by typed hook name, capped at 600000. Use narrow overrides for known slow hooks such as before_prompt_build or agent_end instead of raising every hook timeout."}},"additionalProperties":false,"title":"Plugin Hook Policy","description":"Per-plugin typed hook policy controls for core-enforced safety gates. Use this to constrain high-impact hook categories without disabling the entire plugin."},"subagent":{"type":"object","properties":{"allowModelOverride":{"type":"boolean","title":"Allow Plugin Subagent Model Override","description":"Explicitly allows this plugin to request provider/model overrides in background subagent runs. Keep false unless the plugin is trusted to steer model selection."},"allowedModels":{"type":"array","items":{"type":"string"},"title":"Plugin Subagent Allowed Models","description":"Allowed override targets for trusted plugin subagent runs as canonical \"provider/model\" refs. Use \"*\" only when you intentionally allow any model."}},"additionalProperties":false,"title":"Plugin Subagent Policy","description":"Per-plugin subagent runtime controls for model override trust and allowlists. Keep this unset unless a plugin must explicitly steer subagent model selection."},"llm":{"type":"object","properties":{"allowModelOverride":{"type":"boolean","title":"Allow Plugin LLM Model Override","description":"Explicitly allows this plugin to request model overrides in api.runtime.llm.complete. Keep false unless the plugin is trusted to steer model selection."},"allowedModels":{"type":"array","items":{"type":"string"},"title":"Plugin LLM Allowed Models","description":"Allowed override targets for trusted plugin LLM calls as canonical \"provider/model\" refs. Use \"*\" only when you intentionally allow any model override."},"allowedCompletionModels":{"type":"array","items":{"type":"string"},"title":"Plugin LLM Allowed Completion Models","description":"Allowed targets for every plugin LLM completion as canonical \"provider/model\" refs, including host-resolved defaults and overrides. Use \"*\" only when you intentionally allow any model."},"allowAuthProfileOverride":{"type":"boolean","title":"Allow Plugin LLM Auth Profile Override","description":"Allows this plugin to select a non-default auth profile for isolated agent-runtime completions. Keep false unless the plugin is trusted for explicit isolated credential routing."},"allowAgentIdOverride":{"type":"boolean","title":"Allow Plugin LLM Agent Override","description":"Explicitly allows this plugin to request api.runtime.llm.complete against a non-default agent id. Keep false unless the plugin is trusted for cross-agent model access."}},"additionalProperties":false,"title":"Plugin LLM Policy","description":"Per-plugin api.runtime.llm.complete controls for model and agent override trust. Keep this unset unless a plugin must explicitly steer host-owned completion calls."},"config":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":false,"title":"Plugin Config","description":"Plugin-defined configuration payload interpreted by that plugin's own schema and validation rules. Use only documented fields from the plugin to prevent ignored or invalid settings.","properties":{"captureEnabled":{"type":"boolean","default":true},"captureIntervalSeconds":{"type":"number","default":30},"analysisIntervalMinutes":{"type":"number","default":15},"nodeId":{"type":"string"},"screenIndex":{"type":"number","default":0},"maxWidth":{"type":"number","default":1440},"visionModel":{"type":"string"},"retentionDays":{"type":"number","default":14}}}},"additionalProperties":false},"memory-core":{"type":"object","properties":{"enabled":{"type":"boolean","title":"Plugin Enabled","description":"Per-plugin enablement override for a specific entry, applied on top of global plugin policy (restart required). Use this to stage plugin rollout gradually across environments."},"hooks":{"type":"object","properties":{"allowPromptInjection":{"type":"boolean","title":"Allow Prompt Injection Hooks","description":"Controls whether this plugin may mutate prompts through typed hooks. Set false to block `before_prompt_build`."},"allowConversationAccess":{"type":"boolean","title":"Allow Conversation Access Hooks","description":"Controls whether this plugin may read raw conversation content from typed hooks such as `before_agent_run`, `before_model_resolve`, `before_agent_reply`, `llm_input`, `llm_output`, `before_agent_finalize`, and `agent_end`. Non-bundled plugins must opt in explicitly."},"timeoutMs":{"type":"integer","exclusiveMinimum":0,"maximum":600000,"title":"Plugin Hook Timeout (ms)","description":"Default timeout in milliseconds for this plugin's typed hooks, capped at 600000. Use this to bound slow plugin hooks without changing plugin code; per-hook values in hooks.timeouts take precedence."},"timeouts":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"integer","exclusiveMinimum":0,"maximum":600000},"title":"Plugin Hook Timeout Overrides","description":"Per-hook timeout overrides in milliseconds keyed by typed hook name, capped at 600000. Use narrow overrides for known slow hooks such as before_prompt_build or agent_end instead of raising every hook timeout."}},"additionalProperties":false,"title":"Plugin Hook Policy","description":"Per-plugin typed hook policy controls for core-enforced safety gates. Use this to constrain high-impact hook categories without disabling the entire plugin."},"subagent":{"type":"object","properties":{"allowModelOverride":{"type":"boolean","title":"Allow Plugin Subagent Model Override","description":"Explicitly allows this plugin to request provider/model overrides in background subagent runs. Keep false unless the plugin is trusted to steer model selection."},"allowedModels":{"type":"array","items":{"type":"string"},"title":"Plugin Subagent Allowed Models","description":"Allowed override targets for trusted plugin subagent runs as canonical \"provider/model\" refs. Use \"*\" only when you intentionally allow any model."}},"additionalProperties":false,"title":"Plugin Subagent Policy","description":"Per-plugin subagent runtime controls for model override trust and allowlists. Keep this unset unless a plugin must explicitly steer subagent model selection."},"llm":{"type":"object","properties":{"allowModelOverride":{"type":"boolean","title":"Allow Plugin LLM Model Override","description":"Explicitly allows this plugin to request model overrides in api.runtime.llm.complete. Keep false unless the plugin is trusted to steer model selection."},"allowedModels":{"type":"array","items":{"type":"string"},"title":"Plugin LLM Allowed Models","description":"Allowed override targets for trusted plugin LLM calls as canonical \"provider/model\" refs. Use \"*\" only when you intentionally allow any model override."},"allowedCompletionModels":{"type":"array","items":{"type":"string"},"title":"Plugin LLM Allowed Completion Models","description":"Allowed targets for every plugin LLM completion as canonical \"provider/model\" refs, including host-resolved defaults and overrides. Use \"*\" only when you intentionally allow any model."},"allowAuthProfileOverride":{"type":"boolean","title":"Allow Plugin LLM Auth Profile Override","description":"Allows this plugin to select a non-default auth profile for isolated agent-runtime completions. Keep false unless the plugin is trusted for explicit isolated credential routing."},"allowAgentIdOverride":{"type":"boolean","title":"Allow Plugin LLM Agent Override","description":"Explicitly allows this plugin to request api.runtime.llm.complete against a non-default agent id. Keep false unless the plugin is trusted for cross-agent model access."}},"additionalProperties":false,"title":"Plugin LLM Policy","description":"Per-plugin api.runtime.llm.complete controls for model and agent override trust. Keep this unset unless a plugin must explicitly steer host-owned completion calls."},"config":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":false,"title":"Plugin Config","description":"Plugin-defined configuration payload interpreted by that plugin's own schema and validation rules. Use only documented fields from the plugin to prevent ignored or invalid settings.","properties":{"memoryPolicy":{"type":"object","additionalProperties":false,"properties":{"excludeSessions":{"type":"object","additionalProperties":false,"properties":{"hookExternalContentSources":{"type":"array","items":{"type":"string"}},"channels":{"type":"array","items":{"type":"string"}},"chatTypes":{"type":"array","items":{"type":"string","enum":["direct","group","channel"]}}}}}},"dreaming":{"type":"object","additionalProperties":false,"properties":{"enabled":{"type":"boolean","default":true},"frequency":{"type":"string"},"model":{"type":"string"},"timezone":{"type":"string"},"verboseLogging":{"type":"boolean"},"storage":{"type":"object","additionalProperties":false,"properties":{"mode":{"type":"string","enum":["inline","separate","both"]},"separateReports":{"type":"boolean"}}},"execution":{"type":"object","additionalProperties":false,"properties":{"defaults":{"type":"object","additionalProperties":false,"properties":{"model":{"type":"string"}}}}},"phases":{"type":"object","additionalProperties":false,"properties":{"light":{"type":"object","additionalProperties":false,"properties":{"enabled":{"type":"boolean"},"lookbackDays":{"type":"integer","minimum":0},"limit":{"type":"integer","minimum":0},"dedupeSimilarity":{"type":"number","minimum":0,"maximum":1},"execution":{"type":"object","additionalProperties":false,"properties":{"model":{"type":"string"}}}}},"deep":{"type":"object","additionalProperties":false,"properties":{"enabled":{"type":"boolean"},"limit":{"type":"integer","minimum":0},"minScore":{"type":"number","minimum":0,"maximum":1,"default":0.75},"minRecallCount":{"type":"integer","minimum":0,"default":3},"minUniqueQueries":{"type":"integer","minimum":0,"default":3},"recencyHalfLifeDays":{"type":"integer","minimum":0},"maxAgeDays":{"type":"integer","minimum":1},"maxPromotedSnippetTokens":{"type":"integer","minimum":1,"description":"Maximum estimated token count for each short-term recall snippet promoted into MEMORY.md. Provenance metadata remains attached to the entry."},"maxPriorEntryLossFraction":{"type":"number","minimum":0,"maximum":1,"description":"Maximum fraction of prior MEMORY.md entries a consolidation rewrite may remove before OpenClaw rejects it and uses append-only fallback."},"execution":{"type":"object","additionalProperties":false,"properties":{"model":{"type":"string"}}}}},"rem":{"type":"object","additionalProperties":false,"properties":{"enabled":{"type":"boolean"},"lookbackDays":{"type":"integer","minimum":0},"limit":{"type":"integer","minimum":0},"minPatternStrength":{"type":"number","minimum":0,"maximum":1},"execution":{"type":"object","additionalProperties":false,"properties":{"model":{"type":"string"}}}}}}}}}}}},"additionalProperties":false},"memory-wiki":{"type":"object","properties":{"enabled":{"type":"boolean","title":"Plugin Enabled","description":"Per-plugin enablement override for a specific entry, applied on top of global plugin policy (restart required). Use this to stage plugin rollout gradually across environments."},"hooks":{"type":"object","properties":{"allowPromptInjection":{"type":"boolean","title":"Allow Prompt Injection Hooks","description":"Controls whether this plugin may mutate prompts through typed hooks. Set false to block `before_prompt_build`."},"allowConversationAccess":{"type":"boolean","title":"Allow Conversation Access Hooks","description":"Controls whether this plugin may read raw conversation content from typed hooks such as `before_agent_run`, `before_model_resolve`, `before_agent_reply`, `llm_input`, `llm_output`, `before_agent_finalize`, and `agent_end`. Non-bundled plugins must opt in explicitly."},"timeoutMs":{"type":"integer","exclusiveMinimum":0,"maximum":600000,"title":"Plugin Hook Timeout (ms)","description":"Default timeout in milliseconds for this plugin's typed hooks, capped at 600000. Use this to bound slow plugin hooks without changing plugin code; per-hook values in hooks.timeouts take precedence."},"timeouts":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"integer","exclusiveMinimum":0,"maximum":600000},"title":"Plugin Hook Timeout Overrides","description":"Per-hook timeout overrides in milliseconds keyed by typed hook name, capped at 600000. Use narrow overrides for known slow hooks such as before_prompt_build or agent_end instead of raising every hook timeout."}},"additionalProperties":false,"title":"Plugin Hook Policy","description":"Per-plugin typed hook policy controls for core-enforced safety gates. Use this to constrain high-impact hook categories without disabling the entire plugin."},"subagent":{"type":"object","properties":{"allowModelOverride":{"type":"boolean","title":"Allow Plugin Subagent Model Override","description":"Explicitly allows this plugin to request provider/model overrides in background subagent runs. Keep false unless the plugin is trusted to steer model selection."},"allowedModels":{"type":"array","items":{"type":"string"},"title":"Plugin Subagent Allowed Models","description":"Allowed override targets for trusted plugin subagent runs as canonical \"provider/model\" refs. Use \"*\" only when you intentionally allow any model."}},"additionalProperties":false,"title":"Plugin Subagent Policy","description":"Per-plugin subagent runtime controls for model override trust and allowlists. Keep this unset unless a plugin must explicitly steer subagent model selection."},"llm":{"type":"object","properties":{"allowModelOverride":{"type":"boolean","title":"Allow Plugin LLM Model Override","description":"Explicitly allows this plugin to request model overrides in api.runtime.llm.complete. Keep false unless the plugin is trusted to steer model selection."},"allowedModels":{"type":"array","items":{"type":"string"},"title":"Plugin LLM Allowed Models","description":"Allowed override targets for trusted plugin LLM calls as canonical \"provider/model\" refs. Use \"*\" only when you intentionally allow any model override."},"allowedCompletionModels":{"type":"array","items":{"type":"string"},"title":"Plugin LLM Allowed Completion Models","description":"Allowed targets for every plugin LLM completion as canonical \"provider/model\" refs, including host-resolved defaults and overrides. Use \"*\" only when you intentionally allow any model."},"allowAuthProfileOverride":{"type":"boolean","title":"Allow Plugin LLM Auth Profile Override","description":"Allows this plugin to select a non-default auth profile for isolated agent-runtime completions. Keep false unless the plugin is trusted for explicit isolated credential routing."},"allowAgentIdOverride":{"type":"boolean","title":"Allow Plugin LLM Agent Override","description":"Explicitly allows this plugin to request api.runtime.llm.complete against a non-default agent id. Keep false unless the plugin is trusted for cross-agent model access."}},"additionalProperties":false,"title":"Plugin LLM Policy","description":"Per-plugin api.runtime.llm.complete controls for model and agent override trust. Keep this unset unless a plugin must explicitly steer host-owned completion calls."},"config":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":false,"title":"Plugin Config","description":"Plugin-defined configuration payload interpreted by that plugin's own schema and validation rules. Use only documented fields from the plugin to prevent ignored or invalid settings.","allOf":[{"not":{"required":["vaultMode","vault"],"properties":{"vaultMode":{"const":"unsafe-local"},"vault":{"required":["scope"],"properties":{"scope":{"const":"agent"}}}}}},{"not":{"required":["vault","obsidian"],"properties":{"vault":{"required":["scope"],"properties":{"scope":{"const":"agent"}}},"obsidian":{"required":["useOfficialCli"],"properties":{"useOfficialCli":{"const":true}}}}}}],"properties":{"vaultMode":{"type":"string","enum":["isolated","bridge","unsafe-local"]},"vault":{"type":"object","additionalProperties":false,"properties":{"scope":{"type":"string","enum":["global","agent"]},"path":{"type":"string"},"renderMode":{"type":"string","enum":["native","obsidian"]}}},"obsidian":{"type":"object","additionalProperties":false,"properties":{"enabled":{"type":"boolean"},"useOfficialCli":{"type":"boolean"},"vaultName":{"type":"string"},"openAfterWrites":{"type":"boolean"}}},"bridge":{"type":"object","additionalProperties":false,"properties":{"enabled":{"type":"boolean"},"readMemoryArtifacts":{"type":"boolean"},"indexDreamReports":{"type":"boolean"},"indexDailyNotes":{"type":"boolean"},"indexMemoryRoot":{"type":"boolean"},"followMemoryEvents":{"type":"boolean"}}},"unsafeLocal":{"type":"object","additionalProperties":false,"properties":{"allowPrivateMemoryCoreAccess":{"type":"boolean"},"paths":{"type":"array","items":{"type":"string"}}}},"ingest":{"type":"object","additionalProperties":false,"properties":{"autoCompile":{"type":"boolean"},"maxConcurrentJobs":{"type":"number","minimum":1},"allowUrlIngest":{"type":"boolean"}}},"search":{"type":"object","additionalProperties":false,"properties":{"backend":{"type":"string","enum":["shared","local"]},"corpus":{"type":"string","enum":["wiki","memory","all"]}}},"context":{"type":"object","additionalProperties":false,"properties":{"includeCompiledDigestPrompt":{"type":"boolean"}}},"render":{"type":"object","additionalProperties":false,"properties":{"preserveHumanBlocks":{"type":"boolean"},"createBacklinks":{"type":"boolean"},"createDashboards":{"type":"boolean"}}}}}},"additionalProperties":false},"microsoft":{"type":"object","properties":{"enabled":{"type":"boolean","title":"Plugin Enabled","description":"Per-plugin enablement override for a specific entry, applied on top of global plugin policy (restart required). Use this to stage plugin rollout gradually across environments."},"hooks":{"type":"object","properties":{"allowPromptInjection":{"type":"boolean","title":"Allow Prompt Injection Hooks","description":"Controls whether this plugin may mutate prompts through typed hooks. Set false to block `before_prompt_build`."},"allowConversationAccess":{"type":"boolean","title":"Allow Conversation Access Hooks","description":"Controls whether this plugin may read raw conversation content from typed hooks such as `before_agent_run`, `before_model_resolve`, `before_agent_reply`, `llm_input`, `llm_output`, `before_agent_finalize`, and `agent_end`. Non-bundled plugins must opt in explicitly."},"timeoutMs":{"type":"integer","exclusiveMinimum":0,"maximum":600000,"title":"Plugin Hook Timeout (ms)","description":"Default timeout in milliseconds for this plugin's typed hooks, capped at 600000. Use this to bound slow plugin hooks without changing plugin code; per-hook values in hooks.timeouts take precedence."},"timeouts":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"integer","exclusiveMinimum":0,"maximum":600000},"title":"Plugin Hook Timeout Overrides","description":"Per-hook timeout overrides in milliseconds keyed by typed hook name, capped at 600000. Use narrow overrides for known slow hooks such as before_prompt_build or agent_end instead of raising every hook timeout."}},"additionalProperties":false,"title":"Plugin Hook Policy","description":"Per-plugin typed hook policy controls for core-enforced safety gates. Use this to constrain high-impact hook categories without disabling the entire plugin."},"subagent":{"type":"object","properties":{"allowModelOverride":{"type":"boolean","title":"Allow Plugin Subagent Model Override","description":"Explicitly allows this plugin to request provider/model overrides in background subagent runs. Keep false unless the plugin is trusted to steer model selection."},"allowedModels":{"type":"array","items":{"type":"string"},"title":"Plugin Subagent Allowed Models","description":"Allowed override targets for trusted plugin subagent runs as canonical \"provider/model\" refs. Use \"*\" only when you intentionally allow any model."}},"additionalProperties":false,"title":"Plugin Subagent Policy","description":"Per-plugin subagent runtime controls for model override trust and allowlists. Keep this unset unless a plugin must explicitly steer subagent model selection."},"llm":{"type":"object","properties":{"allowModelOverride":{"type":"boolean","title":"Allow Plugin LLM Model Override","description":"Explicitly allows this plugin to request model overrides in api.runtime.llm.complete. Keep false unless the plugin is trusted to steer model selection."},"allowedModels":{"type":"array","items":{"type":"string"},"title":"Plugin LLM Allowed Models","description":"Allowed override targets for trusted plugin LLM calls as canonical \"provider/model\" refs. Use \"*\" only when you intentionally allow any model override."},"allowedCompletionModels":{"type":"array","items":{"type":"string"},"title":"Plugin LLM Allowed Completion Models","description":"Allowed targets for every plugin LLM completion as canonical \"provider/model\" refs, including host-resolved defaults and overrides. Use \"*\" only when you intentionally allow any model."},"allowAuthProfileOverride":{"type":"boolean","title":"Allow Plugin LLM Auth Profile Override","description":"Allows this plugin to select a non-default auth profile for isolated agent-runtime completions. Keep false unless the plugin is trusted for explicit isolated credential routing."},"allowAgentIdOverride":{"type":"boolean","title":"Allow Plugin LLM Agent Override","description":"Explicitly allows this plugin to request api.runtime.llm.complete against a non-default agent id. Keep false unless the plugin is trusted for cross-agent model access."}},"additionalProperties":false,"title":"Plugin LLM Policy","description":"Per-plugin api.runtime.llm.complete controls for model and agent override trust. Keep this unset unless a plugin must explicitly steer host-owned completion calls."},"config":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":false,"title":"Plugin Config","description":"Plugin-defined configuration payload interpreted by that plugin's own schema and validation rules. Use only documented fields from the plugin to prevent ignored or invalid settings.","properties":{}}},"additionalProperties":false},"microsoft-foundry":{"type":"object","properties":{"enabled":{"type":"boolean","title":"Plugin Enabled","description":"Per-plugin enablement override for a specific entry, applied on top of global plugin policy (restart required). Use this to stage plugin rollout gradually across environments."},"hooks":{"type":"object","properties":{"allowPromptInjection":{"type":"boolean","title":"Allow Prompt Injection Hooks","description":"Controls whether this plugin may mutate prompts through typed hooks. Set false to block `before_prompt_build`."},"allowConversationAccess":{"type":"boolean","title":"Allow Conversation Access Hooks","description":"Controls whether this plugin may read raw conversation content from typed hooks such as `before_agent_run`, `before_model_resolve`, `before_agent_reply`, `llm_input`, `llm_output`, `before_agent_finalize`, and `agent_end`. Non-bundled plugins must opt in explicitly."},"timeoutMs":{"type":"integer","exclusiveMinimum":0,"maximum":600000,"title":"Plugin Hook Timeout (ms)","description":"Default timeout in milliseconds for this plugin's typed hooks, capped at 600000. Use this to bound slow plugin hooks without changing plugin code; per-hook values in hooks.timeouts take precedence."},"timeouts":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"integer","exclusiveMinimum":0,"maximum":600000},"title":"Plugin Hook Timeout Overrides","description":"Per-hook timeout overrides in milliseconds keyed by typed hook name, capped at 600000. Use narrow overrides for known slow hooks such as before_prompt_build or agent_end instead of raising every hook timeout."}},"additionalProperties":false,"title":"Plugin Hook Policy","description":"Per-plugin typed hook policy controls for core-enforced safety gates. Use this to constrain high-impact hook categories without disabling the entire plugin."},"subagent":{"type":"object","properties":{"allowModelOverride":{"type":"boolean","title":"Allow Plugin Subagent Model Override","description":"Explicitly allows this plugin to request provider/model overrides in background subagent runs. Keep false unless the plugin is trusted to steer model selection."},"allowedModels":{"type":"array","items":{"type":"string"},"title":"Plugin Subagent Allowed Models","description":"Allowed override targets for trusted plugin subagent runs as canonical \"provider/model\" refs. Use \"*\" only when you intentionally allow any model."}},"additionalProperties":false,"title":"Plugin Subagent Policy","description":"Per-plugin subagent runtime controls for model override trust and allowlists. Keep this unset unless a plugin must explicitly steer subagent model selection."},"llm":{"type":"object","properties":{"allowModelOverride":{"type":"boolean","title":"Allow Plugin LLM Model Override","description":"Explicitly allows this plugin to request model overrides in api.runtime.llm.complete. Keep false unless the plugin is trusted to steer model selection."},"allowedModels":{"type":"array","items":{"type":"string"},"title":"Plugin LLM Allowed Models","description":"Allowed override targets for trusted plugin LLM calls as canonical \"provider/model\" refs. Use \"*\" only when you intentionally allow any model override."},"allowedCompletionModels":{"type":"array","items":{"type":"string"},"title":"Plugin LLM Allowed Completion Models","description":"Allowed targets for every plugin LLM completion as canonical \"provider/model\" refs, including host-resolved defaults and overrides. Use \"*\" only when you intentionally allow any model."},"allowAuthProfileOverride":{"type":"boolean","title":"Allow Plugin LLM Auth Profile Override","description":"Allows this plugin to select a non-default auth profile for isolated agent-runtime completions. Keep false unless the plugin is trusted for explicit isolated credential routing."},"allowAgentIdOverride":{"type":"boolean","title":"Allow Plugin LLM Agent Override","description":"Explicitly allows this plugin to request api.runtime.llm.complete against a non-default agent id. Keep false unless the plugin is trusted for cross-agent model access."}},"additionalProperties":false,"title":"Plugin LLM Policy","description":"Per-plugin api.runtime.llm.complete controls for model and agent override trust. Keep this unset unless a plugin must explicitly steer host-owned completion calls."},"config":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":false,"title":"Plugin Config","description":"Plugin-defined configuration payload interpreted by that plugin's own schema and validation rules. Use only documented fields from the plugin to prevent ignored or invalid settings.","properties":{}}},"additionalProperties":false},"migrate-claude":{"type":"object","properties":{"enabled":{"type":"boolean","title":"Plugin Enabled","description":"Per-plugin enablement override for a specific entry, applied on top of global plugin policy (restart required). Use this to stage plugin rollout gradually across environments."},"hooks":{"type":"object","properties":{"allowPromptInjection":{"type":"boolean","title":"Allow Prompt Injection Hooks","description":"Controls whether this plugin may mutate prompts through typed hooks. Set false to block `before_prompt_build`."},"allowConversationAccess":{"type":"boolean","title":"Allow Conversation Access Hooks","description":"Controls whether this plugin may read raw conversation content from typed hooks such as `before_agent_run`, `before_model_resolve`, `before_agent_reply`, `llm_input`, `llm_output`, `before_agent_finalize`, and `agent_end`. Non-bundled plugins must opt in explicitly."},"timeoutMs":{"type":"integer","exclusiveMinimum":0,"maximum":600000,"title":"Plugin Hook Timeout (ms)","description":"Default timeout in milliseconds for this plugin's typed hooks, capped at 600000. Use this to bound slow plugin hooks without changing plugin code; per-hook values in hooks.timeouts take precedence."},"timeouts":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"integer","exclusiveMinimum":0,"maximum":600000},"title":"Plugin Hook Timeout Overrides","description":"Per-hook timeout overrides in milliseconds keyed by typed hook name, capped at 600000. Use narrow overrides for known slow hooks such as before_prompt_build or agent_end instead of raising every hook timeout."}},"additionalProperties":false,"title":"Plugin Hook Policy","description":"Per-plugin typed hook policy controls for core-enforced safety gates. Use this to constrain high-impact hook categories without disabling the entire plugin."},"subagent":{"type":"object","properties":{"allowModelOverride":{"type":"boolean","title":"Allow Plugin Subagent Model Override","description":"Explicitly allows this plugin to request provider/model overrides in background subagent runs. Keep false unless the plugin is trusted to steer model selection."},"allowedModels":{"type":"array","items":{"type":"string"},"title":"Plugin Subagent Allowed Models","description":"Allowed override targets for trusted plugin subagent runs as canonical \"provider/model\" refs. Use \"*\" only when you intentionally allow any model."}},"additionalProperties":false,"title":"Plugin Subagent Policy","description":"Per-plugin subagent runtime controls for model override trust and allowlists. Keep this unset unless a plugin must explicitly steer subagent model selection."},"llm":{"type":"object","properties":{"allowModelOverride":{"type":"boolean","title":"Allow Plugin LLM Model Override","description":"Explicitly allows this plugin to request model overrides in api.runtime.llm.complete. Keep false unless the plugin is trusted to steer model selection."},"allowedModels":{"type":"array","items":{"type":"string"},"title":"Plugin LLM Allowed Models","description":"Allowed override targets for trusted plugin LLM calls as canonical \"provider/model\" refs. Use \"*\" only when you intentionally allow any model override."},"allowedCompletionModels":{"type":"array","items":{"type":"string"},"title":"Plugin LLM Allowed Completion Models","description":"Allowed targets for every plugin LLM completion as canonical \"provider/model\" refs, including host-resolved defaults and overrides. Use \"*\" only when you intentionally allow any model."},"allowAuthProfileOverride":{"type":"boolean","title":"Allow Plugin LLM Auth Profile Override","description":"Allows this plugin to select a non-default auth profile for isolated agent-runtime completions. Keep false unless the plugin is trusted for explicit isolated credential routing."},"allowAgentIdOverride":{"type":"boolean","title":"Allow Plugin LLM Agent Override","description":"Explicitly allows this plugin to request api.runtime.llm.complete against a non-default agent id. Keep false unless the plugin is trusted for cross-agent model access."}},"additionalProperties":false,"title":"Plugin LLM Policy","description":"Per-plugin api.runtime.llm.complete controls for model and agent override trust. Keep this unset unless a plugin must explicitly steer host-owned completion calls."},"config":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":false,"title":"Plugin Config","description":"Plugin-defined configuration payload interpreted by that plugin's own schema and validation rules. Use only documented fields from the plugin to prevent ignored or invalid settings.","properties":{}}},"additionalProperties":false},"migrate-hermes":{"type":"object","properties":{"enabled":{"type":"boolean","title":"Plugin Enabled","description":"Per-plugin enablement override for a specific entry, applied on top of global plugin policy (restart required). Use this to stage plugin rollout gradually across environments."},"hooks":{"type":"object","properties":{"allowPromptInjection":{"type":"boolean","title":"Allow Prompt Injection Hooks","description":"Controls whether this plugin may mutate prompts through typed hooks. Set false to block `before_prompt_build`."},"allowConversationAccess":{"type":"boolean","title":"Allow Conversation Access Hooks","description":"Controls whether this plugin may read raw conversation content from typed hooks such as `before_agent_run`, `before_model_resolve`, `before_agent_reply`, `llm_input`, `llm_output`, `before_agent_finalize`, and `agent_end`. Non-bundled plugins must opt in explicitly."},"timeoutMs":{"type":"integer","exclusiveMinimum":0,"maximum":600000,"title":"Plugin Hook Timeout (ms)","description":"Default timeout in milliseconds for this plugin's typed hooks, capped at 600000. Use this to bound slow plugin hooks without changing plugin code; per-hook values in hooks.timeouts take precedence."},"timeouts":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"integer","exclusiveMinimum":0,"maximum":600000},"title":"Plugin Hook Timeout Overrides","description":"Per-hook timeout overrides in milliseconds keyed by typed hook name, capped at 600000. Use narrow overrides for known slow hooks such as before_prompt_build or agent_end instead of raising every hook timeout."}},"additionalProperties":false,"title":"Plugin Hook Policy","description":"Per-plugin typed hook policy controls for core-enforced safety gates. Use this to constrain high-impact hook categories without disabling the entire plugin."},"subagent":{"type":"object","properties":{"allowModelOverride":{"type":"boolean","title":"Allow Plugin Subagent Model Override","description":"Explicitly allows this plugin to request provider/model overrides in background subagent runs. Keep false unless the plugin is trusted to steer model selection."},"allowedModels":{"type":"array","items":{"type":"string"},"title":"Plugin Subagent Allowed Models","description":"Allowed override targets for trusted plugin subagent runs as canonical \"provider/model\" refs. Use \"*\" only when you intentionally allow any model."}},"additionalProperties":false,"title":"Plugin Subagent Policy","description":"Per-plugin subagent runtime controls for model override trust and allowlists. Keep this unset unless a plugin must explicitly steer subagent model selection."},"llm":{"type":"object","properties":{"allowModelOverride":{"type":"boolean","title":"Allow Plugin LLM Model Override","description":"Explicitly allows this plugin to request model overrides in api.runtime.llm.complete. Keep false unless the plugin is trusted to steer model selection."},"allowedModels":{"type":"array","items":{"type":"string"},"title":"Plugin LLM Allowed Models","description":"Allowed override targets for trusted plugin LLM calls as canonical \"provider/model\" refs. Use \"*\" only when you intentionally allow any model override."},"allowedCompletionModels":{"type":"array","items":{"type":"string"},"title":"Plugin LLM Allowed Completion Models","description":"Allowed targets for every plugin LLM completion as canonical \"provider/model\" refs, including host-resolved defaults and overrides. Use \"*\" only when you intentionally allow any model."},"allowAuthProfileOverride":{"type":"boolean","title":"Allow Plugin LLM Auth Profile Override","description":"Allows this plugin to select a non-default auth profile for isolated agent-runtime completions. Keep false unless the plugin is trusted for explicit isolated credential routing."},"allowAgentIdOverride":{"type":"boolean","title":"Allow Plugin LLM Agent Override","description":"Explicitly allows this plugin to request api.runtime.llm.complete against a non-default agent id. Keep false unless the plugin is trusted for cross-agent model access."}},"additionalProperties":false,"title":"Plugin LLM Policy","description":"Per-plugin api.runtime.llm.complete controls for model and agent override trust. Keep this unset unless a plugin must explicitly steer host-owned completion calls."},"config":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":false,"title":"Plugin Config","description":"Plugin-defined configuration payload interpreted by that plugin's own schema and validation rules. Use only documented fields from the plugin to prevent ignored or invalid settings.","properties":{}}},"additionalProperties":false},"minimax":{"type":"object","properties":{"enabled":{"type":"boolean","title":"Plugin Enabled","description":"Per-plugin enablement override for a specific entry, applied on top of global plugin policy (restart required). Use this to stage plugin rollout gradually across environments."},"hooks":{"type":"object","properties":{"allowPromptInjection":{"type":"boolean","title":"Allow Prompt Injection Hooks","description":"Controls whether this plugin may mutate prompts through typed hooks. Set false to block `before_prompt_build`."},"allowConversationAccess":{"type":"boolean","title":"Allow Conversation Access Hooks","description":"Controls whether this plugin may read raw conversation content from typed hooks such as `before_agent_run`, `before_model_resolve`, `before_agent_reply`, `llm_input`, `llm_output`, `before_agent_finalize`, and `agent_end`. Non-bundled plugins must opt in explicitly."},"timeoutMs":{"type":"integer","exclusiveMinimum":0,"maximum":600000,"title":"Plugin Hook Timeout (ms)","description":"Default timeout in milliseconds for this plugin's typed hooks, capped at 600000. Use this to bound slow plugin hooks without changing plugin code; per-hook values in hooks.timeouts take precedence."},"timeouts":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"integer","exclusiveMinimum":0,"maximum":600000},"title":"Plugin Hook Timeout Overrides","description":"Per-hook timeout overrides in milliseconds keyed by typed hook name, capped at 600000. Use narrow overrides for known slow hooks such as before_prompt_build or agent_end instead of raising every hook timeout."}},"additionalProperties":false,"title":"Plugin Hook Policy","description":"Per-plugin typed hook policy controls for core-enforced safety gates. Use this to constrain high-impact hook categories without disabling the entire plugin."},"subagent":{"type":"object","properties":{"allowModelOverride":{"type":"boolean","title":"Allow Plugin Subagent Model Override","description":"Explicitly allows this plugin to request provider/model overrides in background subagent runs. Keep false unless the plugin is trusted to steer model selection."},"allowedModels":{"type":"array","items":{"type":"string"},"title":"Plugin Subagent Allowed Models","description":"Allowed override targets for trusted plugin subagent runs as canonical \"provider/model\" refs. Use \"*\" only when you intentionally allow any model."}},"additionalProperties":false,"title":"Plugin Subagent Policy","description":"Per-plugin subagent runtime controls for model override trust and allowlists. Keep this unset unless a plugin must explicitly steer subagent model selection."},"llm":{"type":"object","properties":{"allowModelOverride":{"type":"boolean","title":"Allow Plugin LLM Model Override","description":"Explicitly allows this plugin to request model overrides in api.runtime.llm.complete. Keep false unless the plugin is trusted to steer model selection."},"allowedModels":{"type":"array","items":{"type":"string"},"title":"Plugin LLM Allowed Models","description":"Allowed override targets for trusted plugin LLM calls as canonical \"provider/model\" refs. Use \"*\" only when you intentionally allow any model override."},"allowedCompletionModels":{"type":"array","items":{"type":"string"},"title":"Plugin LLM Allowed Completion Models","description":"Allowed targets for every plugin LLM completion as canonical \"provider/model\" refs, including host-resolved defaults and overrides. Use \"*\" only when you intentionally allow any model."},"allowAuthProfileOverride":{"type":"boolean","title":"Allow Plugin LLM Auth Profile Override","description":"Allows this plugin to select a non-default auth profile for isolated agent-runtime completions. Keep false unless the plugin is trusted for explicit isolated credential routing."},"allowAgentIdOverride":{"type":"boolean","title":"Allow Plugin LLM Agent Override","description":"Explicitly allows this plugin to request api.runtime.llm.complete against a non-default agent id. Keep false unless the plugin is trusted for cross-agent model access."}},"additionalProperties":false,"title":"Plugin LLM Policy","description":"Per-plugin api.runtime.llm.complete controls for model and agent override trust. Keep this unset unless a plugin must explicitly steer host-owned completion calls."},"config":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":false,"title":"Plugin Config","description":"Plugin-defined configuration payload interpreted by that plugin's own schema and validation rules. Use only documented fields from the plugin to prevent ignored or invalid settings.","properties":{"webSearch":{"type":"object","additionalProperties":false,"properties":{"apiKey":{"type":["string","object"]},"region":{"type":"string","enum":["global","cn"]}}}}}},"additionalProperties":false},"nvidia":{"type":"object","properties":{"enabled":{"type":"boolean","title":"Plugin Enabled","description":"Per-plugin enablement override for a specific entry, applied on top of global plugin policy (restart required). Use this to stage plugin rollout gradually across environments."},"hooks":{"type":"object","properties":{"allowPromptInjection":{"type":"boolean","title":"Allow Prompt Injection Hooks","description":"Controls whether this plugin may mutate prompts through typed hooks. Set false to block `before_prompt_build`."},"allowConversationAccess":{"type":"boolean","title":"Allow Conversation Access Hooks","description":"Controls whether this plugin may read raw conversation content from typed hooks such as `before_agent_run`, `before_model_resolve`, `before_agent_reply`, `llm_input`, `llm_output`, `before_agent_finalize`, and `agent_end`. Non-bundled plugins must opt in explicitly."},"timeoutMs":{"type":"integer","exclusiveMinimum":0,"maximum":600000,"title":"Plugin Hook Timeout (ms)","description":"Default timeout in milliseconds for this plugin's typed hooks, capped at 600000. Use this to bound slow plugin hooks without changing plugin code; per-hook values in hooks.timeouts take precedence."},"timeouts":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"integer","exclusiveMinimum":0,"maximum":600000},"title":"Plugin Hook Timeout Overrides","description":"Per-hook timeout overrides in milliseconds keyed by typed hook name, capped at 600000. Use narrow overrides for known slow hooks such as before_prompt_build or agent_end instead of raising every hook timeout."}},"additionalProperties":false,"title":"Plugin Hook Policy","description":"Per-plugin typed hook policy controls for core-enforced safety gates. Use this to constrain high-impact hook categories without disabling the entire plugin."},"subagent":{"type":"object","properties":{"allowModelOverride":{"type":"boolean","title":"Allow Plugin Subagent Model Override","description":"Explicitly allows this plugin to request provider/model overrides in background subagent runs. Keep false unless the plugin is trusted to steer model selection."},"allowedModels":{"type":"array","items":{"type":"string"},"title":"Plugin Subagent Allowed Models","description":"Allowed override targets for trusted plugin subagent runs as canonical \"provider/model\" refs. Use \"*\" only when you intentionally allow any model."}},"additionalProperties":false,"title":"Plugin Subagent Policy","description":"Per-plugin subagent runtime controls for model override trust and allowlists. Keep this unset unless a plugin must explicitly steer subagent model selection."},"llm":{"type":"object","properties":{"allowModelOverride":{"type":"boolean","title":"Allow Plugin LLM Model Override","description":"Explicitly allows this plugin to request model overrides in api.runtime.llm.complete. Keep false unless the plugin is trusted to steer model selection."},"allowedModels":{"type":"array","items":{"type":"string"},"title":"Plugin LLM Allowed Models","description":"Allowed override targets for trusted plugin LLM calls as canonical \"provider/model\" refs. Use \"*\" only when you intentionally allow any model override."},"allowedCompletionModels":{"type":"array","items":{"type":"string"},"title":"Plugin LLM Allowed Completion Models","description":"Allowed targets for every plugin LLM completion as canonical \"provider/model\" refs, including host-resolved defaults and overrides. Use \"*\" only when you intentionally allow any model."},"allowAuthProfileOverride":{"type":"boolean","title":"Allow Plugin LLM Auth Profile Override","description":"Allows this plugin to select a non-default auth profile for isolated agent-runtime completions. Keep false unless the plugin is trusted for explicit isolated credential routing."},"allowAgentIdOverride":{"type":"boolean","title":"Allow Plugin LLM Agent Override","description":"Explicitly allows this plugin to request api.runtime.llm.complete against a non-default agent id. Keep false unless the plugin is trusted for cross-agent model access."}},"additionalProperties":false,"title":"Plugin LLM Policy","description":"Per-plugin api.runtime.llm.complete controls for model and agent override trust. Keep this unset unless a plugin must explicitly steer host-owned completion calls."},"config":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":false,"title":"Plugin Config","description":"Plugin-defined configuration payload interpreted by that plugin's own schema and validation rules. Use only documented fields from the plugin to prevent ignored or invalid settings.","properties":{}}},"additionalProperties":false},"oc-path":{"type":"object","properties":{"enabled":{"type":"boolean","title":"Plugin Enabled","description":"Per-plugin enablement override for a specific entry, applied on top of global plugin policy (restart required). Use this to stage plugin rollout gradually across environments."},"hooks":{"type":"object","properties":{"allowPromptInjection":{"type":"boolean","title":"Allow Prompt Injection Hooks","description":"Controls whether this plugin may mutate prompts through typed hooks. Set false to block `before_prompt_build`."},"allowConversationAccess":{"type":"boolean","title":"Allow Conversation Access Hooks","description":"Controls whether this plugin may read raw conversation content from typed hooks such as `before_agent_run`, `before_model_resolve`, `before_agent_reply`, `llm_input`, `llm_output`, `before_agent_finalize`, and `agent_end`. Non-bundled plugins must opt in explicitly."},"timeoutMs":{"type":"integer","exclusiveMinimum":0,"maximum":600000,"title":"Plugin Hook Timeout (ms)","description":"Default timeout in milliseconds for this plugin's typed hooks, capped at 600000. Use this to bound slow plugin hooks without changing plugin code; per-hook values in hooks.timeouts take precedence."},"timeouts":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"integer","exclusiveMinimum":0,"maximum":600000},"title":"Plugin Hook Timeout Overrides","description":"Per-hook timeout overrides in milliseconds keyed by typed hook name, capped at 600000. Use narrow overrides for known slow hooks such as before_prompt_build or agent_end instead of raising every hook timeout."}},"additionalProperties":false,"title":"Plugin Hook Policy","description":"Per-plugin typed hook policy controls for core-enforced safety gates. Use this to constrain high-impact hook categories without disabling the entire plugin."},"subagent":{"type":"object","properties":{"allowModelOverride":{"type":"boolean","title":"Allow Plugin Subagent Model Override","description":"Explicitly allows this plugin to request provider/model overrides in background subagent runs. Keep false unless the plugin is trusted to steer model selection."},"allowedModels":{"type":"array","items":{"type":"string"},"title":"Plugin Subagent Allowed Models","description":"Allowed override targets for trusted plugin subagent runs as canonical \"provider/model\" refs. Use \"*\" only when you intentionally allow any model."}},"additionalProperties":false,"title":"Plugin Subagent Policy","description":"Per-plugin subagent runtime controls for model override trust and allowlists. Keep this unset unless a plugin must explicitly steer subagent model selection."},"llm":{"type":"object","properties":{"allowModelOverride":{"type":"boolean","title":"Allow Plugin LLM Model Override","description":"Explicitly allows this plugin to request model overrides in api.runtime.llm.complete. Keep false unless the plugin is trusted to steer model selection."},"allowedModels":{"type":"array","items":{"type":"string"},"title":"Plugin LLM Allowed Models","description":"Allowed override targets for trusted plugin LLM calls as canonical \"provider/model\" refs. Use \"*\" only when you intentionally allow any model override."},"allowedCompletionModels":{"type":"array","items":{"type":"string"},"title":"Plugin LLM Allowed Completion Models","description":"Allowed targets for every plugin LLM completion as canonical \"provider/model\" refs, including host-resolved defaults and overrides. Use \"*\" only when you intentionally allow any model."},"allowAuthProfileOverride":{"type":"boolean","title":"Allow Plugin LLM Auth Profile Override","description":"Allows this plugin to select a non-default auth profile for isolated agent-runtime completions. Keep false unless the plugin is trusted for explicit isolated credential routing."},"allowAgentIdOverride":{"type":"boolean","title":"Allow Plugin LLM Agent Override","description":"Explicitly allows this plugin to request api.runtime.llm.complete against a non-default agent id. Keep false unless the plugin is trusted for cross-agent model access."}},"additionalProperties":false,"title":"Plugin LLM Policy","description":"Per-plugin api.runtime.llm.complete controls for model and agent override trust. Keep this unset unless a plugin must explicitly steer host-owned completion calls."},"config":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":false,"title":"Plugin Config","description":"Plugin-defined configuration payload interpreted by that plugin's own schema and validation rules. Use only documented fields from the plugin to prevent ignored or invalid settings.","properties":{}}},"additionalProperties":false},"ollama":{"type":"object","properties":{"enabled":{"type":"boolean","title":"Plugin Enabled","description":"Per-plugin enablement override for a specific entry, applied on top of global plugin policy (restart required). Use this to stage plugin rollout gradually across environments."},"hooks":{"type":"object","properties":{"allowPromptInjection":{"type":"boolean","title":"Allow Prompt Injection Hooks","description":"Controls whether this plugin may mutate prompts through typed hooks. Set false to block `before_prompt_build`."},"allowConversationAccess":{"type":"boolean","title":"Allow Conversation Access Hooks","description":"Controls whether this plugin may read raw conversation content from typed hooks such as `before_agent_run`, `before_model_resolve`, `before_agent_reply`, `llm_input`, `llm_output`, `before_agent_finalize`, and `agent_end`. Non-bundled plugins must opt in explicitly."},"timeoutMs":{"type":"integer","exclusiveMinimum":0,"maximum":600000,"title":"Plugin Hook Timeout (ms)","description":"Default timeout in milliseconds for this plugin's typed hooks, capped at 600000. Use this to bound slow plugin hooks without changing plugin code; per-hook values in hooks.timeouts take precedence."},"timeouts":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"integer","exclusiveMinimum":0,"maximum":600000},"title":"Plugin Hook Timeout Overrides","description":"Per-hook timeout overrides in milliseconds keyed by typed hook name, capped at 600000. Use narrow overrides for known slow hooks such as before_prompt_build or agent_end instead of raising every hook timeout."}},"additionalProperties":false,"title":"Plugin Hook Policy","description":"Per-plugin typed hook policy controls for core-enforced safety gates. Use this to constrain high-impact hook categories without disabling the entire plugin."},"subagent":{"type":"object","properties":{"allowModelOverride":{"type":"boolean","title":"Allow Plugin Subagent Model Override","description":"Explicitly allows this plugin to request provider/model overrides in background subagent runs. Keep false unless the plugin is trusted to steer model selection."},"allowedModels":{"type":"array","items":{"type":"string"},"title":"Plugin Subagent Allowed Models","description":"Allowed override targets for trusted plugin subagent runs as canonical \"provider/model\" refs. Use \"*\" only when you intentionally allow any model."}},"additionalProperties":false,"title":"Plugin Subagent Policy","description":"Per-plugin subagent runtime controls for model override trust and allowlists. Keep this unset unless a plugin must explicitly steer subagent model selection."},"llm":{"type":"object","properties":{"allowModelOverride":{"type":"boolean","title":"Allow Plugin LLM Model Override","description":"Explicitly allows this plugin to request model overrides in api.runtime.llm.complete. Keep false unless the plugin is trusted to steer model selection."},"allowedModels":{"type":"array","items":{"type":"string"},"title":"Plugin LLM Allowed Models","description":"Allowed override targets for trusted plugin LLM calls as canonical \"provider/model\" refs. Use \"*\" only when you intentionally allow any model override."},"allowedCompletionModels":{"type":"array","items":{"type":"string"},"title":"Plugin LLM Allowed Completion Models","description":"Allowed targets for every plugin LLM completion as canonical \"provider/model\" refs, including host-resolved defaults and overrides. Use \"*\" only when you intentionally allow any model."},"allowAuthProfileOverride":{"type":"boolean","title":"Allow Plugin LLM Auth Profile Override","description":"Allows this plugin to select a non-default auth profile for isolated agent-runtime completions. Keep false unless the plugin is trusted for explicit isolated credential routing."},"allowAgentIdOverride":{"type":"boolean","title":"Allow Plugin LLM Agent Override","description":"Explicitly allows this plugin to request api.runtime.llm.complete against a non-default agent id. Keep false unless the plugin is trusted for cross-agent model access."}},"additionalProperties":false,"title":"Plugin LLM Policy","description":"Per-plugin api.runtime.llm.complete controls for model and agent override trust. Keep this unset unless a plugin must explicitly steer host-owned completion calls."},"config":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":false,"title":"Plugin Config","description":"Plugin-defined configuration payload interpreted by that plugin's own schema and validation rules. Use only documented fields from the plugin to prevent ignored or invalid settings.","properties":{"discovery":{"type":"object","additionalProperties":false,"properties":{"enabled":{"type":"boolean"}}},"nodeInference":{"type":"object","additionalProperties":false,"properties":{"enabled":{"type":"boolean"}}},"webSearch":{"type":"object","additionalProperties":false,"properties":{"baseUrl":{"type":"string"}}}}}},"additionalProperties":false},"onepassword":{"type":"object","properties":{"enabled":{"type":"boolean","title":"Plugin Enabled","description":"Per-plugin enablement override for a specific entry, applied on top of global plugin policy (restart required). Use this to stage plugin rollout gradually across environments."},"hooks":{"type":"object","properties":{"allowPromptInjection":{"type":"boolean","title":"Allow Prompt Injection Hooks","description":"Controls whether this plugin may mutate prompts through typed hooks. Set false to block `before_prompt_build`."},"allowConversationAccess":{"type":"boolean","title":"Allow Conversation Access Hooks","description":"Controls whether this plugin may read raw conversation content from typed hooks such as `before_agent_run`, `before_model_resolve`, `before_agent_reply`, `llm_input`, `llm_output`, `before_agent_finalize`, and `agent_end`. Non-bundled plugins must opt in explicitly."},"timeoutMs":{"type":"integer","exclusiveMinimum":0,"maximum":600000,"title":"Plugin Hook Timeout (ms)","description":"Default timeout in milliseconds for this plugin's typed hooks, capped at 600000. Use this to bound slow plugin hooks without changing plugin code; per-hook values in hooks.timeouts take precedence."},"timeouts":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"integer","exclusiveMinimum":0,"maximum":600000},"title":"Plugin Hook Timeout Overrides","description":"Per-hook timeout overrides in milliseconds keyed by typed hook name, capped at 600000. Use narrow overrides for known slow hooks such as before_prompt_build or agent_end instead of raising every hook timeout."}},"additionalProperties":false,"title":"Plugin Hook Policy","description":"Per-plugin typed hook policy controls for core-enforced safety gates. Use this to constrain high-impact hook categories without disabling the entire plugin."},"subagent":{"type":"object","properties":{"allowModelOverride":{"type":"boolean","title":"Allow Plugin Subagent Model Override","description":"Explicitly allows this plugin to request provider/model overrides in background subagent runs. Keep false unless the plugin is trusted to steer model selection."},"allowedModels":{"type":"array","items":{"type":"string"},"title":"Plugin Subagent Allowed Models","description":"Allowed override targets for trusted plugin subagent runs as canonical \"provider/model\" refs. Use \"*\" only when you intentionally allow any model."}},"additionalProperties":false,"title":"Plugin Subagent Policy","description":"Per-plugin subagent runtime controls for model override trust and allowlists. Keep this unset unless a plugin must explicitly steer subagent model selection."},"llm":{"type":"object","properties":{"allowModelOverride":{"type":"boolean","title":"Allow Plugin LLM Model Override","description":"Explicitly allows this plugin to request model overrides in api.runtime.llm.complete. Keep false unless the plugin is trusted to steer model selection."},"allowedModels":{"type":"array","items":{"type":"string"},"title":"Plugin LLM Allowed Models","description":"Allowed override targets for trusted plugin LLM calls as canonical \"provider/model\" refs. Use \"*\" only when you intentionally allow any model override."},"allowedCompletionModels":{"type":"array","items":{"type":"string"},"title":"Plugin LLM Allowed Completion Models","description":"Allowed targets for every plugin LLM completion as canonical \"provider/model\" refs, including host-resolved defaults and overrides. Use \"*\" only when you intentionally allow any model."},"allowAuthProfileOverride":{"type":"boolean","title":"Allow Plugin LLM Auth Profile Override","description":"Allows this plugin to select a non-default auth profile for isolated agent-runtime completions. Keep false unless the plugin is trusted for explicit isolated credential routing."},"allowAgentIdOverride":{"type":"boolean","title":"Allow Plugin LLM Agent Override","description":"Explicitly allows this plugin to request api.runtime.llm.complete against a non-default agent id. Keep false unless the plugin is trusted for cross-agent model access."}},"additionalProperties":false,"title":"Plugin LLM Policy","description":"Per-plugin api.runtime.llm.complete controls for model and agent override trust. Keep this unset unless a plugin must explicitly steer host-owned completion calls."},"config":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":false,"title":"Plugin Config","description":"Plugin-defined configuration payload interpreted by that plugin's own schema and validation rules. Use only documented fields from the plugin to prevent ignored or invalid settings.","allOf":[{"if":{"required":["vault"]},"then":{"required":["items"]}},{"if":{"required":["items"]},"then":{"required":["vault"]}}],"properties":{"vault":{"type":"string","minLength":1,"pattern":"^(?!\\s*-)"},"opBin":{"type":"string","minLength":1},"defaultPolicy":{"type":"string","enum":["auto","approve","deny"],"default":"approve"},"cacheTtlSeconds":{"type":"integer","minimum":0,"default":300},"grantTtlHours":{"type":"number","exclusiveMinimum":0,"default":720},"opTimeoutMs":{"type":"integer","minimum":1,"default":15000},"items":{"type":"object","minProperties":1,"maxProperties":32,"propertyNames":{"pattern":"^[a-z0-9][a-z0-9-]{0,63}$"},"additionalProperties":{"type":"object","additionalProperties":false,"required":["item"],"properties":{"item":{"type":"string","minLength":1,"pattern":"^(?!\\s*-)"},"vault":{"type":"string","minLength":1,"pattern":"^(?!\\s*-)"},"field":{"type":"string","minLength":1,"pattern":"^[^,]+$","default":"credential"},"policy":{"type":"string","enum":["auto","approve","deny"]},"description":{"type":"string","minLength":1,"maxLength":200}}}}}}},"additionalProperties":false},"openai":{"type":"object","properties":{"enabled":{"type":"boolean","title":"Plugin Enabled","description":"Per-plugin enablement override for a specific entry, applied on top of global plugin policy (restart required). Use this to stage plugin rollout gradually across environments."},"hooks":{"type":"object","properties":{"allowPromptInjection":{"type":"boolean","title":"Allow Prompt Injection Hooks","description":"Controls whether this plugin may mutate prompts through typed hooks. Set false to block `before_prompt_build`."},"allowConversationAccess":{"type":"boolean","title":"Allow Conversation Access Hooks","description":"Controls whether this plugin may read raw conversation content from typed hooks such as `before_agent_run`, `before_model_resolve`, `before_agent_reply`, `llm_input`, `llm_output`, `before_agent_finalize`, and `agent_end`. Non-bundled plugins must opt in explicitly."},"timeoutMs":{"type":"integer","exclusiveMinimum":0,"maximum":600000,"title":"Plugin Hook Timeout (ms)","description":"Default timeout in milliseconds for this plugin's typed hooks, capped at 600000. Use this to bound slow plugin hooks without changing plugin code; per-hook values in hooks.timeouts take precedence."},"timeouts":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"integer","exclusiveMinimum":0,"maximum":600000},"title":"Plugin Hook Timeout Overrides","description":"Per-hook timeout overrides in milliseconds keyed by typed hook name, capped at 600000. Use narrow overrides for known slow hooks such as before_prompt_build or agent_end instead of raising every hook timeout."}},"additionalProperties":false,"title":"Plugin Hook Policy","description":"Per-plugin typed hook policy controls for core-enforced safety gates. Use this to constrain high-impact hook categories without disabling the entire plugin."},"subagent":{"type":"object","properties":{"allowModelOverride":{"type":"boolean","title":"Allow Plugin Subagent Model Override","description":"Explicitly allows this plugin to request provider/model overrides in background subagent runs. Keep false unless the plugin is trusted to steer model selection."},"allowedModels":{"type":"array","items":{"type":"string"},"title":"Plugin Subagent Allowed Models","description":"Allowed override targets for trusted plugin subagent runs as canonical \"provider/model\" refs. Use \"*\" only when you intentionally allow any model."}},"additionalProperties":false,"title":"Plugin Subagent Policy","description":"Per-plugin subagent runtime controls for model override trust and allowlists. Keep this unset unless a plugin must explicitly steer subagent model selection."},"llm":{"type":"object","properties":{"allowModelOverride":{"type":"boolean","title":"Allow Plugin LLM Model Override","description":"Explicitly allows this plugin to request model overrides in api.runtime.llm.complete. Keep false unless the plugin is trusted to steer model selection."},"allowedModels":{"type":"array","items":{"type":"string"},"title":"Plugin LLM Allowed Models","description":"Allowed override targets for trusted plugin LLM calls as canonical \"provider/model\" refs. Use \"*\" only when you intentionally allow any model override."},"allowedCompletionModels":{"type":"array","items":{"type":"string"},"title":"Plugin LLM Allowed Completion Models","description":"Allowed targets for every plugin LLM completion as canonical \"provider/model\" refs, including host-resolved defaults and overrides. Use \"*\" only when you intentionally allow any model."},"allowAuthProfileOverride":{"type":"boolean","title":"Allow Plugin LLM Auth Profile Override","description":"Allows this plugin to select a non-default auth profile for isolated agent-runtime completions. Keep false unless the plugin is trusted for explicit isolated credential routing."},"allowAgentIdOverride":{"type":"boolean","title":"Allow Plugin LLM Agent Override","description":"Explicitly allows this plugin to request api.runtime.llm.complete against a non-default agent id. Keep false unless the plugin is trusted for cross-agent model access."}},"additionalProperties":false,"title":"Plugin LLM Policy","description":"Per-plugin api.runtime.llm.complete controls for model and agent override trust. Keep this unset unless a plugin must explicitly steer host-owned completion calls."},"config":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":false,"title":"Plugin Config","description":"Plugin-defined configuration payload interpreted by that plugin's own schema and validation rules. Use only documented fields from the plugin to prevent ignored or invalid settings.","properties":{"personality":{"type":"string","enum":["friendly","on","off"],"default":"friendly","description":"Controls the canonical OpenAI-family GPT-5 friendly interaction style. Defaults to `friendly`; `on` aliases `friendly`; `off` removes only the style layer while shared stable behavior remains."}}}},"additionalProperties":false},"opencode-go":{"type":"object","properties":{"enabled":{"type":"boolean","title":"Plugin Enabled","description":"Per-plugin enablement override for a specific entry, applied on top of global plugin policy (restart required). Use this to stage plugin rollout gradually across environments."},"hooks":{"type":"object","properties":{"allowPromptInjection":{"type":"boolean","title":"Allow Prompt Injection Hooks","description":"Controls whether this plugin may mutate prompts through typed hooks. Set false to block `before_prompt_build`."},"allowConversationAccess":{"type":"boolean","title":"Allow Conversation Access Hooks","description":"Controls whether this plugin may read raw conversation content from typed hooks such as `before_agent_run`, `before_model_resolve`, `before_agent_reply`, `llm_input`, `llm_output`, `before_agent_finalize`, and `agent_end`. Non-bundled plugins must opt in explicitly."},"timeoutMs":{"type":"integer","exclusiveMinimum":0,"maximum":600000,"title":"Plugin Hook Timeout (ms)","description":"Default timeout in milliseconds for this plugin's typed hooks, capped at 600000. Use this to bound slow plugin hooks without changing plugin code; per-hook values in hooks.timeouts take precedence."},"timeouts":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"integer","exclusiveMinimum":0,"maximum":600000},"title":"Plugin Hook Timeout Overrides","description":"Per-hook timeout overrides in milliseconds keyed by typed hook name, capped at 600000. Use narrow overrides for known slow hooks such as before_prompt_build or agent_end instead of raising every hook timeout."}},"additionalProperties":false,"title":"Plugin Hook Policy","description":"Per-plugin typed hook policy controls for core-enforced safety gates. Use this to constrain high-impact hook categories without disabling the entire plugin."},"subagent":{"type":"object","properties":{"allowModelOverride":{"type":"boolean","title":"Allow Plugin Subagent Model Override","description":"Explicitly allows this plugin to request provider/model overrides in background subagent runs. Keep false unless the plugin is trusted to steer model selection."},"allowedModels":{"type":"array","items":{"type":"string"},"title":"Plugin Subagent Allowed Models","description":"Allowed override targets for trusted plugin subagent runs as canonical \"provider/model\" refs. Use \"*\" only when you intentionally allow any model."}},"additionalProperties":false,"title":"Plugin Subagent Policy","description":"Per-plugin subagent runtime controls for model override trust and allowlists. Keep this unset unless a plugin must explicitly steer subagent model selection."},"llm":{"type":"object","properties":{"allowModelOverride":{"type":"boolean","title":"Allow Plugin LLM Model Override","description":"Explicitly allows this plugin to request model overrides in api.runtime.llm.complete. Keep false unless the plugin is trusted to steer model selection."},"allowedModels":{"type":"array","items":{"type":"string"},"title":"Plugin LLM Allowed Models","description":"Allowed override targets for trusted plugin LLM calls as canonical \"provider/model\" refs. Use \"*\" only when you intentionally allow any model override."},"allowedCompletionModels":{"type":"array","items":{"type":"string"},"title":"Plugin LLM Allowed Completion Models","description":"Allowed targets for every plugin LLM completion as canonical \"provider/model\" refs, including host-resolved defaults and overrides. Use \"*\" only when you intentionally allow any model."},"allowAuthProfileOverride":{"type":"boolean","title":"Allow Plugin LLM Auth Profile Override","description":"Allows this plugin to select a non-default auth profile for isolated agent-runtime completions. Keep false unless the plugin is trusted for explicit isolated credential routing."},"allowAgentIdOverride":{"type":"boolean","title":"Allow Plugin LLM Agent Override","description":"Explicitly allows this plugin to request api.runtime.llm.complete against a non-default agent id. Keep false unless the plugin is trusted for cross-agent model access."}},"additionalProperties":false,"title":"Plugin LLM Policy","description":"Per-plugin api.runtime.llm.complete controls for model and agent override trust. Keep this unset unless a plugin must explicitly steer host-owned completion calls."},"config":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":false,"title":"Plugin Config","description":"Plugin-defined configuration payload interpreted by that plugin's own schema and validation rules. Use only documented fields from the plugin to prevent ignored or invalid settings.","properties":{}}},"additionalProperties":false},"openrouter":{"type":"object","properties":{"enabled":{"type":"boolean","title":"Plugin Enabled","description":"Per-plugin enablement override for a specific entry, applied on top of global plugin policy (restart required). Use this to stage plugin rollout gradually across environments."},"hooks":{"type":"object","properties":{"allowPromptInjection":{"type":"boolean","title":"Allow Prompt Injection Hooks","description":"Controls whether this plugin may mutate prompts through typed hooks. Set false to block `before_prompt_build`."},"allowConversationAccess":{"type":"boolean","title":"Allow Conversation Access Hooks","description":"Controls whether this plugin may read raw conversation content from typed hooks such as `before_agent_run`, `before_model_resolve`, `before_agent_reply`, `llm_input`, `llm_output`, `before_agent_finalize`, and `agent_end`. Non-bundled plugins must opt in explicitly."},"timeoutMs":{"type":"integer","exclusiveMinimum":0,"maximum":600000,"title":"Plugin Hook Timeout (ms)","description":"Default timeout in milliseconds for this plugin's typed hooks, capped at 600000. Use this to bound slow plugin hooks without changing plugin code; per-hook values in hooks.timeouts take precedence."},"timeouts":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"integer","exclusiveMinimum":0,"maximum":600000},"title":"Plugin Hook Timeout Overrides","description":"Per-hook timeout overrides in milliseconds keyed by typed hook name, capped at 600000. Use narrow overrides for known slow hooks such as before_prompt_build or agent_end instead of raising every hook timeout."}},"additionalProperties":false,"title":"Plugin Hook Policy","description":"Per-plugin typed hook policy controls for core-enforced safety gates. Use this to constrain high-impact hook categories without disabling the entire plugin."},"subagent":{"type":"object","properties":{"allowModelOverride":{"type":"boolean","title":"Allow Plugin Subagent Model Override","description":"Explicitly allows this plugin to request provider/model overrides in background subagent runs. Keep false unless the plugin is trusted to steer model selection."},"allowedModels":{"type":"array","items":{"type":"string"},"title":"Plugin Subagent Allowed Models","description":"Allowed override targets for trusted plugin subagent runs as canonical \"provider/model\" refs. Use \"*\" only when you intentionally allow any model."}},"additionalProperties":false,"title":"Plugin Subagent Policy","description":"Per-plugin subagent runtime controls for model override trust and allowlists. Keep this unset unless a plugin must explicitly steer subagent model selection."},"llm":{"type":"object","properties":{"allowModelOverride":{"type":"boolean","title":"Allow Plugin LLM Model Override","description":"Explicitly allows this plugin to request model overrides in api.runtime.llm.complete. Keep false unless the plugin is trusted to steer model selection."},"allowedModels":{"type":"array","items":{"type":"string"},"title":"Plugin LLM Allowed Models","description":"Allowed override targets for trusted plugin LLM calls as canonical \"provider/model\" refs. Use \"*\" only when you intentionally allow any model override."},"allowedCompletionModels":{"type":"array","items":{"type":"string"},"title":"Plugin LLM Allowed Completion Models","description":"Allowed targets for every plugin LLM completion as canonical \"provider/model\" refs, including host-resolved defaults and overrides. Use \"*\" only when you intentionally allow any model."},"allowAuthProfileOverride":{"type":"boolean","title":"Allow Plugin LLM Auth Profile Override","description":"Allows this plugin to select a non-default auth profile for isolated agent-runtime completions. Keep false unless the plugin is trusted for explicit isolated credential routing."},"allowAgentIdOverride":{"type":"boolean","title":"Allow Plugin LLM Agent Override","description":"Explicitly allows this plugin to request api.runtime.llm.complete against a non-default agent id. Keep false unless the plugin is trusted for cross-agent model access."}},"additionalProperties":false,"title":"Plugin LLM Policy","description":"Per-plugin api.runtime.llm.complete controls for model and agent override trust. Keep this unset unless a plugin must explicitly steer host-owned completion calls."},"config":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":false,"title":"Plugin Config","description":"Plugin-defined configuration payload interpreted by that plugin's own schema and validation rules. Use only documented fields from the plugin to prevent ignored or invalid settings.","properties":{}}},"additionalProperties":false},"policy":{"type":"object","properties":{"enabled":{"type":"boolean","title":"Plugin Enabled","description":"Per-plugin enablement override for a specific entry, applied on top of global plugin policy (restart required). Use this to stage plugin rollout gradually across environments."},"hooks":{"type":"object","properties":{"allowPromptInjection":{"type":"boolean","title":"Allow Prompt Injection Hooks","description":"Controls whether this plugin may mutate prompts through typed hooks. Set false to block `before_prompt_build`."},"allowConversationAccess":{"type":"boolean","title":"Allow Conversation Access Hooks","description":"Controls whether this plugin may read raw conversation content from typed hooks such as `before_agent_run`, `before_model_resolve`, `before_agent_reply`, `llm_input`, `llm_output`, `before_agent_finalize`, and `agent_end`. Non-bundled plugins must opt in explicitly."},"timeoutMs":{"type":"integer","exclusiveMinimum":0,"maximum":600000,"title":"Plugin Hook Timeout (ms)","description":"Default timeout in milliseconds for this plugin's typed hooks, capped at 600000. Use this to bound slow plugin hooks without changing plugin code; per-hook values in hooks.timeouts take precedence."},"timeouts":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"integer","exclusiveMinimum":0,"maximum":600000},"title":"Plugin Hook Timeout Overrides","description":"Per-hook timeout overrides in milliseconds keyed by typed hook name, capped at 600000. Use narrow overrides for known slow hooks such as before_prompt_build or agent_end instead of raising every hook timeout."}},"additionalProperties":false,"title":"Plugin Hook Policy","description":"Per-plugin typed hook policy controls for core-enforced safety gates. Use this to constrain high-impact hook categories without disabling the entire plugin."},"subagent":{"type":"object","properties":{"allowModelOverride":{"type":"boolean","title":"Allow Plugin Subagent Model Override","description":"Explicitly allows this plugin to request provider/model overrides in background subagent runs. Keep false unless the plugin is trusted to steer model selection."},"allowedModels":{"type":"array","items":{"type":"string"},"title":"Plugin Subagent Allowed Models","description":"Allowed override targets for trusted plugin subagent runs as canonical \"provider/model\" refs. Use \"*\" only when you intentionally allow any model."}},"additionalProperties":false,"title":"Plugin Subagent Policy","description":"Per-plugin subagent runtime controls for model override trust and allowlists. Keep this unset unless a plugin must explicitly steer subagent model selection."},"llm":{"type":"object","properties":{"allowModelOverride":{"type":"boolean","title":"Allow Plugin LLM Model Override","description":"Explicitly allows this plugin to request model overrides in api.runtime.llm.complete. Keep false unless the plugin is trusted to steer model selection."},"allowedModels":{"type":"array","items":{"type":"string"},"title":"Plugin LLM Allowed Models","description":"Allowed override targets for trusted plugin LLM calls as canonical \"provider/model\" refs. Use \"*\" only when you intentionally allow any model override."},"allowedCompletionModels":{"type":"array","items":{"type":"string"},"title":"Plugin LLM Allowed Completion Models","description":"Allowed targets for every plugin LLM completion as canonical \"provider/model\" refs, including host-resolved defaults and overrides. Use \"*\" only when you intentionally allow any model."},"allowAuthProfileOverride":{"type":"boolean","title":"Allow Plugin LLM Auth Profile Override","description":"Allows this plugin to select a non-default auth profile for isolated agent-runtime completions. Keep false unless the plugin is trusted for explicit isolated credential routing."},"allowAgentIdOverride":{"type":"boolean","title":"Allow Plugin LLM Agent Override","description":"Explicitly allows this plugin to request api.runtime.llm.complete against a non-default agent id. Keep false unless the plugin is trusted for cross-agent model access."}},"additionalProperties":false,"title":"Plugin LLM Policy","description":"Per-plugin api.runtime.llm.complete controls for model and agent override trust. Keep this unset unless a plugin must explicitly steer host-owned completion calls."},"config":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":false,"title":"Plugin Config","description":"Plugin-defined configuration payload interpreted by that plugin's own schema and validation rules. Use only documented fields from the plugin to prevent ignored or invalid settings.","properties":{"enabled":{"type":"boolean","description":"Enable policy doctor checks even before policy.jsonc exists."},"workspaceRepairs":{"type":"boolean","description":"Allow doctor --fix to repair policy-managed workspace settings."},"expectedHash":{"type":"string","description":"Optional sha256 hash for hash-locking the approved policy artifact."},"expectedAttestationHash":{"type":"string","description":"Optional sha256 hash for the last accepted clean policy check."},"path":{"type":"string","description":"Optional policy.jsonc path. Relative paths resolve from the selected agent workspace."}}}},"additionalProperties":false},"reef":{"type":"object","properties":{"enabled":{"type":"boolean","title":"Plugin Enabled","description":"Per-plugin enablement override for a specific entry, applied on top of global plugin policy (restart required). Use this to stage plugin rollout gradually across environments."},"hooks":{"type":"object","properties":{"allowPromptInjection":{"type":"boolean","title":"Allow Prompt Injection Hooks","description":"Controls whether this plugin may mutate prompts through typed hooks. Set false to block `before_prompt_build`."},"allowConversationAccess":{"type":"boolean","title":"Allow Conversation Access Hooks","description":"Controls whether this plugin may read raw conversation content from typed hooks such as `before_agent_run`, `before_model_resolve`, `before_agent_reply`, `llm_input`, `llm_output`, `before_agent_finalize`, and `agent_end`. Non-bundled plugins must opt in explicitly."},"timeoutMs":{"type":"integer","exclusiveMinimum":0,"maximum":600000,"title":"Plugin Hook Timeout (ms)","description":"Default timeout in milliseconds for this plugin's typed hooks, capped at 600000. Use this to bound slow plugin hooks without changing plugin code; per-hook values in hooks.timeouts take precedence."},"timeouts":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"integer","exclusiveMinimum":0,"maximum":600000},"title":"Plugin Hook Timeout Overrides","description":"Per-hook timeout overrides in milliseconds keyed by typed hook name, capped at 600000. Use narrow overrides for known slow hooks such as before_prompt_build or agent_end instead of raising every hook timeout."}},"additionalProperties":false,"title":"Plugin Hook Policy","description":"Per-plugin typed hook policy controls for core-enforced safety gates. Use this to constrain high-impact hook categories without disabling the entire plugin."},"subagent":{"type":"object","properties":{"allowModelOverride":{"type":"boolean","title":"Allow Plugin Subagent Model Override","description":"Explicitly allows this plugin to request provider/model overrides in background subagent runs. Keep false unless the plugin is trusted to steer model selection."},"allowedModels":{"type":"array","items":{"type":"string"},"title":"Plugin Subagent Allowed Models","description":"Allowed override targets for trusted plugin subagent runs as canonical \"provider/model\" refs. Use \"*\" only when you intentionally allow any model."}},"additionalProperties":false,"title":"Plugin Subagent Policy","description":"Per-plugin subagent runtime controls for model override trust and allowlists. Keep this unset unless a plugin must explicitly steer subagent model selection."},"llm":{"type":"object","properties":{"allowModelOverride":{"type":"boolean","title":"Allow Plugin LLM Model Override","description":"Explicitly allows this plugin to request model overrides in api.runtime.llm.complete. Keep false unless the plugin is trusted to steer model selection."},"allowedModels":{"type":"array","items":{"type":"string"},"title":"Plugin LLM Allowed Models","description":"Allowed override targets for trusted plugin LLM calls as canonical \"provider/model\" refs. Use \"*\" only when you intentionally allow any model override."},"allowedCompletionModels":{"type":"array","items":{"type":"string"},"title":"Plugin LLM Allowed Completion Models","description":"Allowed targets for every plugin LLM completion as canonical \"provider/model\" refs, including host-resolved defaults and overrides. Use \"*\" only when you intentionally allow any model."},"allowAuthProfileOverride":{"type":"boolean","title":"Allow Plugin LLM Auth Profile Override","description":"Allows this plugin to select a non-default auth profile for isolated agent-runtime completions. Keep false unless the plugin is trusted for explicit isolated credential routing."},"allowAgentIdOverride":{"type":"boolean","title":"Allow Plugin LLM Agent Override","description":"Explicitly allows this plugin to request api.runtime.llm.complete against a non-default agent id. Keep false unless the plugin is trusted for cross-agent model access."}},"additionalProperties":false,"title":"Plugin LLM Policy","description":"Per-plugin api.runtime.llm.complete controls for model and agent override trust. Keep this unset unless a plugin must explicitly steer host-owned completion calls."},"config":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":false,"title":"Plugin Config","description":"Plugin-defined configuration payload interpreted by that plugin's own schema and validation rules. Use only documented fields from the plugin to prevent ignored or invalid settings.","properties":{}}},"additionalProperties":false},"runway":{"type":"object","properties":{"enabled":{"type":"boolean","title":"Plugin Enabled","description":"Per-plugin enablement override for a specific entry, applied on top of global plugin policy (restart required). Use this to stage plugin rollout gradually across environments."},"hooks":{"type":"object","properties":{"allowPromptInjection":{"type":"boolean","title":"Allow Prompt Injection Hooks","description":"Controls whether this plugin may mutate prompts through typed hooks. Set false to block `before_prompt_build`."},"allowConversationAccess":{"type":"boolean","title":"Allow Conversation Access Hooks","description":"Controls whether this plugin may read raw conversation content from typed hooks such as `before_agent_run`, `before_model_resolve`, `before_agent_reply`, `llm_input`, `llm_output`, `before_agent_finalize`, and `agent_end`. Non-bundled plugins must opt in explicitly."},"timeoutMs":{"type":"integer","exclusiveMinimum":0,"maximum":600000,"title":"Plugin Hook Timeout (ms)","description":"Default timeout in milliseconds for this plugin's typed hooks, capped at 600000. Use this to bound slow plugin hooks without changing plugin code; per-hook values in hooks.timeouts take precedence."},"timeouts":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"integer","exclusiveMinimum":0,"maximum":600000},"title":"Plugin Hook Timeout Overrides","description":"Per-hook timeout overrides in milliseconds keyed by typed hook name, capped at 600000. Use narrow overrides for known slow hooks such as before_prompt_build or agent_end instead of raising every hook timeout."}},"additionalProperties":false,"title":"Plugin Hook Policy","description":"Per-plugin typed hook policy controls for core-enforced safety gates. Use this to constrain high-impact hook categories without disabling the entire plugin."},"subagent":{"type":"object","properties":{"allowModelOverride":{"type":"boolean","title":"Allow Plugin Subagent Model Override","description":"Explicitly allows this plugin to request provider/model overrides in background subagent runs. Keep false unless the plugin is trusted to steer model selection."},"allowedModels":{"type":"array","items":{"type":"string"},"title":"Plugin Subagent Allowed Models","description":"Allowed override targets for trusted plugin subagent runs as canonical \"provider/model\" refs. Use \"*\" only when you intentionally allow any model."}},"additionalProperties":false,"title":"Plugin Subagent Policy","description":"Per-plugin subagent runtime controls for model override trust and allowlists. Keep this unset unless a plugin must explicitly steer subagent model selection."},"llm":{"type":"object","properties":{"allowModelOverride":{"type":"boolean","title":"Allow Plugin LLM Model Override","description":"Explicitly allows this plugin to request model overrides in api.runtime.llm.complete. Keep false unless the plugin is trusted to steer model selection."},"allowedModels":{"type":"array","items":{"type":"string"},"title":"Plugin LLM Allowed Models","description":"Allowed override targets for trusted plugin LLM calls as canonical \"provider/model\" refs. Use \"*\" only when you intentionally allow any model override."},"allowedCompletionModels":{"type":"array","items":{"type":"string"},"title":"Plugin LLM Allowed Completion Models","description":"Allowed targets for every plugin LLM completion as canonical \"provider/model\" refs, including host-resolved defaults and overrides. Use \"*\" only when you intentionally allow any model."},"allowAuthProfileOverride":{"type":"boolean","title":"Allow Plugin LLM Auth Profile Override","description":"Allows this plugin to select a non-default auth profile for isolated agent-runtime completions. Keep false unless the plugin is trusted for explicit isolated credential routing."},"allowAgentIdOverride":{"type":"boolean","title":"Allow Plugin LLM Agent Override","description":"Explicitly allows this plugin to request api.runtime.llm.complete against a non-default agent id. Keep false unless the plugin is trusted for cross-agent model access."}},"additionalProperties":false,"title":"Plugin LLM Policy","description":"Per-plugin api.runtime.llm.complete controls for model and agent override trust. Keep this unset unless a plugin must explicitly steer host-owned completion calls."},"config":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":false,"title":"Plugin Config","description":"Plugin-defined configuration payload interpreted by that plugin's own schema and validation rules. Use only documented fields from the plugin to prevent ignored or invalid settings.","properties":{}}},"additionalProperties":false},"senseaudio":{"type":"object","properties":{"enabled":{"type":"boolean","title":"Plugin Enabled","description":"Per-plugin enablement override for a specific entry, applied on top of global plugin policy (restart required). Use this to stage plugin rollout gradually across environments."},"hooks":{"type":"object","properties":{"allowPromptInjection":{"type":"boolean","title":"Allow Prompt Injection Hooks","description":"Controls whether this plugin may mutate prompts through typed hooks. Set false to block `before_prompt_build`."},"allowConversationAccess":{"type":"boolean","title":"Allow Conversation Access Hooks","description":"Controls whether this plugin may read raw conversation content from typed hooks such as `before_agent_run`, `before_model_resolve`, `before_agent_reply`, `llm_input`, `llm_output`, `before_agent_finalize`, and `agent_end`. Non-bundled plugins must opt in explicitly."},"timeoutMs":{"type":"integer","exclusiveMinimum":0,"maximum":600000,"title":"Plugin Hook Timeout (ms)","description":"Default timeout in milliseconds for this plugin's typed hooks, capped at 600000. Use this to bound slow plugin hooks without changing plugin code; per-hook values in hooks.timeouts take precedence."},"timeouts":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"integer","exclusiveMinimum":0,"maximum":600000},"title":"Plugin Hook Timeout Overrides","description":"Per-hook timeout overrides in milliseconds keyed by typed hook name, capped at 600000. Use narrow overrides for known slow hooks such as before_prompt_build or agent_end instead of raising every hook timeout."}},"additionalProperties":false,"title":"Plugin Hook Policy","description":"Per-plugin typed hook policy controls for core-enforced safety gates. Use this to constrain high-impact hook categories without disabling the entire plugin."},"subagent":{"type":"object","properties":{"allowModelOverride":{"type":"boolean","title":"Allow Plugin Subagent Model Override","description":"Explicitly allows this plugin to request provider/model overrides in background subagent runs. Keep false unless the plugin is trusted to steer model selection."},"allowedModels":{"type":"array","items":{"type":"string"},"title":"Plugin Subagent Allowed Models","description":"Allowed override targets for trusted plugin subagent runs as canonical \"provider/model\" refs. Use \"*\" only when you intentionally allow any model."}},"additionalProperties":false,"title":"Plugin Subagent Policy","description":"Per-plugin subagent runtime controls for model override trust and allowlists. Keep this unset unless a plugin must explicitly steer subagent model selection."},"llm":{"type":"object","properties":{"allowModelOverride":{"type":"boolean","title":"Allow Plugin LLM Model Override","description":"Explicitly allows this plugin to request model overrides in api.runtime.llm.complete. Keep false unless the plugin is trusted to steer model selection."},"allowedModels":{"type":"array","items":{"type":"string"},"title":"Plugin LLM Allowed Models","description":"Allowed override targets for trusted plugin LLM calls as canonical \"provider/model\" refs. Use \"*\" only when you intentionally allow any model override."},"allowedCompletionModels":{"type":"array","items":{"type":"string"},"title":"Plugin LLM Allowed Completion Models","description":"Allowed targets for every plugin LLM completion as canonical \"provider/model\" refs, including host-resolved defaults and overrides. Use \"*\" only when you intentionally allow any model."},"allowAuthProfileOverride":{"type":"boolean","title":"Allow Plugin LLM Auth Profile Override","description":"Allows this plugin to select a non-default auth profile for isolated agent-runtime completions. Keep false unless the plugin is trusted for explicit isolated credential routing."},"allowAgentIdOverride":{"type":"boolean","title":"Allow Plugin LLM Agent Override","description":"Explicitly allows this plugin to request api.runtime.llm.complete against a non-default agent id. Keep false unless the plugin is trusted for cross-agent model access."}},"additionalProperties":false,"title":"Plugin LLM Policy","description":"Per-plugin api.runtime.llm.complete controls for model and agent override trust. Keep this unset unless a plugin must explicitly steer host-owned completion calls."},"config":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":false,"title":"Plugin Config","description":"Plugin-defined configuration payload interpreted by that plugin's own schema and validation rules. Use only documented fields from the plugin to prevent ignored or invalid settings.","properties":{}}},"additionalProperties":false},"sglang":{"type":"object","properties":{"enabled":{"type":"boolean","title":"Plugin Enabled","description":"Per-plugin enablement override for a specific entry, applied on top of global plugin policy (restart required). Use this to stage plugin rollout gradually across environments."},"hooks":{"type":"object","properties":{"allowPromptInjection":{"type":"boolean","title":"Allow Prompt Injection Hooks","description":"Controls whether this plugin may mutate prompts through typed hooks. Set false to block `before_prompt_build`."},"allowConversationAccess":{"type":"boolean","title":"Allow Conversation Access Hooks","description":"Controls whether this plugin may read raw conversation content from typed hooks such as `before_agent_run`, `before_model_resolve`, `before_agent_reply`, `llm_input`, `llm_output`, `before_agent_finalize`, and `agent_end`. Non-bundled plugins must opt in explicitly."},"timeoutMs":{"type":"integer","exclusiveMinimum":0,"maximum":600000,"title":"Plugin Hook Timeout (ms)","description":"Default timeout in milliseconds for this plugin's typed hooks, capped at 600000. Use this to bound slow plugin hooks without changing plugin code; per-hook values in hooks.timeouts take precedence."},"timeouts":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"integer","exclusiveMinimum":0,"maximum":600000},"title":"Plugin Hook Timeout Overrides","description":"Per-hook timeout overrides in milliseconds keyed by typed hook name, capped at 600000. Use narrow overrides for known slow hooks such as before_prompt_build or agent_end instead of raising every hook timeout."}},"additionalProperties":false,"title":"Plugin Hook Policy","description":"Per-plugin typed hook policy controls for core-enforced safety gates. Use this to constrain high-impact hook categories without disabling the entire plugin."},"subagent":{"type":"object","properties":{"allowModelOverride":{"type":"boolean","title":"Allow Plugin Subagent Model Override","description":"Explicitly allows this plugin to request provider/model overrides in background subagent runs. Keep false unless the plugin is trusted to steer model selection."},"allowedModels":{"type":"array","items":{"type":"string"},"title":"Plugin Subagent Allowed Models","description":"Allowed override targets for trusted plugin subagent runs as canonical \"provider/model\" refs. Use \"*\" only when you intentionally allow any model."}},"additionalProperties":false,"title":"Plugin Subagent Policy","description":"Per-plugin subagent runtime controls for model override trust and allowlists. Keep this unset unless a plugin must explicitly steer subagent model selection."},"llm":{"type":"object","properties":{"allowModelOverride":{"type":"boolean","title":"Allow Plugin LLM Model Override","description":"Explicitly allows this plugin to request model overrides in api.runtime.llm.complete. Keep false unless the plugin is trusted to steer model selection."},"allowedModels":{"type":"array","items":{"type":"string"},"title":"Plugin LLM Allowed Models","description":"Allowed override targets for trusted plugin LLM calls as canonical \"provider/model\" refs. Use \"*\" only when you intentionally allow any model override."},"allowedCompletionModels":{"type":"array","items":{"type":"string"},"title":"Plugin LLM Allowed Completion Models","description":"Allowed targets for every plugin LLM completion as canonical \"provider/model\" refs, including host-resolved defaults and overrides. Use \"*\" only when you intentionally allow any model."},"allowAuthProfileOverride":{"type":"boolean","title":"Allow Plugin LLM Auth Profile Override","description":"Allows this plugin to select a non-default auth profile for isolated agent-runtime completions. Keep false unless the plugin is trusted for explicit isolated credential routing."},"allowAgentIdOverride":{"type":"boolean","title":"Allow Plugin LLM Agent Override","description":"Explicitly allows this plugin to request api.runtime.llm.complete against a non-default agent id. Keep false unless the plugin is trusted for cross-agent model access."}},"additionalProperties":false,"title":"Plugin LLM Policy","description":"Per-plugin api.runtime.llm.complete controls for model and agent override trust. Keep this unset unless a plugin must explicitly steer host-owned completion calls."},"config":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":false,"title":"Plugin Config","description":"Plugin-defined configuration payload interpreted by that plugin's own schema and validation rules. Use only documented fields from the plugin to prevent ignored or invalid settings.","properties":{}}},"additionalProperties":false},"talk-voice":{"type":"object","properties":{"enabled":{"type":"boolean","title":"Plugin Enabled","description":"Per-plugin enablement override for a specific entry, applied on top of global plugin policy (restart required). Use this to stage plugin rollout gradually across environments."},"hooks":{"type":"object","properties":{"allowPromptInjection":{"type":"boolean","title":"Allow Prompt Injection Hooks","description":"Controls whether this plugin may mutate prompts through typed hooks. Set false to block `before_prompt_build`."},"allowConversationAccess":{"type":"boolean","title":"Allow Conversation Access Hooks","description":"Controls whether this plugin may read raw conversation content from typed hooks such as `before_agent_run`, `before_model_resolve`, `before_agent_reply`, `llm_input`, `llm_output`, `before_agent_finalize`, and `agent_end`. Non-bundled plugins must opt in explicitly."},"timeoutMs":{"type":"integer","exclusiveMinimum":0,"maximum":600000,"title":"Plugin Hook Timeout (ms)","description":"Default timeout in milliseconds for this plugin's typed hooks, capped at 600000. Use this to bound slow plugin hooks without changing plugin code; per-hook values in hooks.timeouts take precedence."},"timeouts":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"integer","exclusiveMinimum":0,"maximum":600000},"title":"Plugin Hook Timeout Overrides","description":"Per-hook timeout overrides in milliseconds keyed by typed hook name, capped at 600000. Use narrow overrides for known slow hooks such as before_prompt_build or agent_end instead of raising every hook timeout."}},"additionalProperties":false,"title":"Plugin Hook Policy","description":"Per-plugin typed hook policy controls for core-enforced safety gates. Use this to constrain high-impact hook categories without disabling the entire plugin."},"subagent":{"type":"object","properties":{"allowModelOverride":{"type":"boolean","title":"Allow Plugin Subagent Model Override","description":"Explicitly allows this plugin to request provider/model overrides in background subagent runs. Keep false unless the plugin is trusted to steer model selection."},"allowedModels":{"type":"array","items":{"type":"string"},"title":"Plugin Subagent Allowed Models","description":"Allowed override targets for trusted plugin subagent runs as canonical \"provider/model\" refs. Use \"*\" only when you intentionally allow any model."}},"additionalProperties":false,"title":"Plugin Subagent Policy","description":"Per-plugin subagent runtime controls for model override trust and allowlists. Keep this unset unless a plugin must explicitly steer subagent model selection."},"llm":{"type":"object","properties":{"allowModelOverride":{"type":"boolean","title":"Allow Plugin LLM Model Override","description":"Explicitly allows this plugin to request model overrides in api.runtime.llm.complete. Keep false unless the plugin is trusted to steer model selection."},"allowedModels":{"type":"array","items":{"type":"string"},"title":"Plugin LLM Allowed Models","description":"Allowed override targets for trusted plugin LLM calls as canonical \"provider/model\" refs. Use \"*\" only when you intentionally allow any model override."},"allowedCompletionModels":{"type":"array","items":{"type":"string"},"title":"Plugin LLM Allowed Completion Models","description":"Allowed targets for every plugin LLM completion as canonical \"provider/model\" refs, including host-resolved defaults and overrides. Use \"*\" only when you intentionally allow any model."},"allowAuthProfileOverride":{"type":"boolean","title":"Allow Plugin LLM Auth Profile Override","description":"Allows this plugin to select a non-default auth profile for isolated agent-runtime completions. Keep false unless the plugin is trusted for explicit isolated credential routing."},"allowAgentIdOverride":{"type":"boolean","title":"Allow Plugin LLM Agent Override","description":"Explicitly allows this plugin to request api.runtime.llm.complete against a non-default agent id. Keep false unless the plugin is trusted for cross-agent model access."}},"additionalProperties":false,"title":"Plugin LLM Policy","description":"Per-plugin api.runtime.llm.complete controls for model and agent override trust. Keep this unset unless a plugin must explicitly steer host-owned completion calls."},"config":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":false,"title":"Plugin Config","description":"Plugin-defined configuration payload interpreted by that plugin's own schema and validation rules. Use only documented fields from the plugin to prevent ignored or invalid settings.","properties":{}}},"additionalProperties":false},"telegram":{"type":"object","properties":{"enabled":{"type":"boolean","title":"Plugin Enabled","description":"Per-plugin enablement override for a specific entry, applied on top of global plugin policy (restart required). Use this to stage plugin rollout gradually across environments."},"hooks":{"type":"object","properties":{"allowPromptInjection":{"type":"boolean","title":"Allow Prompt Injection Hooks","description":"Controls whether this plugin may mutate prompts through typed hooks. Set false to block `before_prompt_build`."},"allowConversationAccess":{"type":"boolean","title":"Allow Conversation Access Hooks","description":"Controls whether this plugin may read raw conversation content from typed hooks such as `before_agent_run`, `before_model_resolve`, `before_agent_reply`, `llm_input`, `llm_output`, `before_agent_finalize`, and `agent_end`. Non-bundled plugins must opt in explicitly."},"timeoutMs":{"type":"integer","exclusiveMinimum":0,"maximum":600000,"title":"Plugin Hook Timeout (ms)","description":"Default timeout in milliseconds for this plugin's typed hooks, capped at 600000. Use this to bound slow plugin hooks without changing plugin code; per-hook values in hooks.timeouts take precedence."},"timeouts":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"integer","exclusiveMinimum":0,"maximum":600000},"title":"Plugin Hook Timeout Overrides","description":"Per-hook timeout overrides in milliseconds keyed by typed hook name, capped at 600000. Use narrow overrides for known slow hooks such as before_prompt_build or agent_end instead of raising every hook timeout."}},"additionalProperties":false,"title":"Plugin Hook Policy","description":"Per-plugin typed hook policy controls for core-enforced safety gates. Use this to constrain high-impact hook categories without disabling the entire plugin."},"subagent":{"type":"object","properties":{"allowModelOverride":{"type":"boolean","title":"Allow Plugin Subagent Model Override","description":"Explicitly allows this plugin to request provider/model overrides in background subagent runs. Keep false unless the plugin is trusted to steer model selection."},"allowedModels":{"type":"array","items":{"type":"string"},"title":"Plugin Subagent Allowed Models","description":"Allowed override targets for trusted plugin subagent runs as canonical \"provider/model\" refs. Use \"*\" only when you intentionally allow any model."}},"additionalProperties":false,"title":"Plugin Subagent Policy","description":"Per-plugin subagent runtime controls for model override trust and allowlists. Keep this unset unless a plugin must explicitly steer subagent model selection."},"llm":{"type":"object","properties":{"allowModelOverride":{"type":"boolean","title":"Allow Plugin LLM Model Override","description":"Explicitly allows this plugin to request model overrides in api.runtime.llm.complete. Keep false unless the plugin is trusted to steer model selection."},"allowedModels":{"type":"array","items":{"type":"string"},"title":"Plugin LLM Allowed Models","description":"Allowed override targets for trusted plugin LLM calls as canonical \"provider/model\" refs. Use \"*\" only when you intentionally allow any model override."},"allowedCompletionModels":{"type":"array","items":{"type":"string"},"title":"Plugin LLM Allowed Completion Models","description":"Allowed targets for every plugin LLM completion as canonical \"provider/model\" refs, including host-resolved defaults and overrides. Use \"*\" only when you intentionally allow any model."},"allowAuthProfileOverride":{"type":"boolean","title":"Allow Plugin LLM Auth Profile Override","description":"Allows this plugin to select a non-default auth profile for isolated agent-runtime completions. Keep false unless the plugin is trusted for explicit isolated credential routing."},"allowAgentIdOverride":{"type":"boolean","title":"Allow Plugin LLM Agent Override","description":"Explicitly allows this plugin to request api.runtime.llm.complete against a non-default agent id. Keep false unless the plugin is trusted for cross-agent model access."}},"additionalProperties":false,"title":"Plugin LLM Policy","description":"Per-plugin api.runtime.llm.complete controls for model and agent override trust. Keep this unset unless a plugin must explicitly steer host-owned completion calls."},"config":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":false,"title":"Plugin Config","description":"Plugin-defined configuration payload interpreted by that plugin's own schema and validation rules. Use only documented fields from the plugin to prevent ignored or invalid settings.","properties":{}}},"additionalProperties":false},"together":{"type":"object","properties":{"enabled":{"type":"boolean","title":"Plugin Enabled","description":"Per-plugin enablement override for a specific entry, applied on top of global plugin policy (restart required). Use this to stage plugin rollout gradually across environments."},"hooks":{"type":"object","properties":{"allowPromptInjection":{"type":"boolean","title":"Allow Prompt Injection Hooks","description":"Controls whether this plugin may mutate prompts through typed hooks. Set false to block `before_prompt_build`."},"allowConversationAccess":{"type":"boolean","title":"Allow Conversation Access Hooks","description":"Controls whether this plugin may read raw conversation content from typed hooks such as `before_agent_run`, `before_model_resolve`, `before_agent_reply`, `llm_input`, `llm_output`, `before_agent_finalize`, and `agent_end`. Non-bundled plugins must opt in explicitly."},"timeoutMs":{"type":"integer","exclusiveMinimum":0,"maximum":600000,"title":"Plugin Hook Timeout (ms)","description":"Default timeout in milliseconds for this plugin's typed hooks, capped at 600000. Use this to bound slow plugin hooks without changing plugin code; per-hook values in hooks.timeouts take precedence."},"timeouts":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"integer","exclusiveMinimum":0,"maximum":600000},"title":"Plugin Hook Timeout Overrides","description":"Per-hook timeout overrides in milliseconds keyed by typed hook name, capped at 600000. Use narrow overrides for known slow hooks such as before_prompt_build or agent_end instead of raising every hook timeout."}},"additionalProperties":false,"title":"Plugin Hook Policy","description":"Per-plugin typed hook policy controls for core-enforced safety gates. Use this to constrain high-impact hook categories without disabling the entire plugin."},"subagent":{"type":"object","properties":{"allowModelOverride":{"type":"boolean","title":"Allow Plugin Subagent Model Override","description":"Explicitly allows this plugin to request provider/model overrides in background subagent runs. Keep false unless the plugin is trusted to steer model selection."},"allowedModels":{"type":"array","items":{"type":"string"},"title":"Plugin Subagent Allowed Models","description":"Allowed override targets for trusted plugin subagent runs as canonical \"provider/model\" refs. Use \"*\" only when you intentionally allow any model."}},"additionalProperties":false,"title":"Plugin Subagent Policy","description":"Per-plugin subagent runtime controls for model override trust and allowlists. Keep this unset unless a plugin must explicitly steer subagent model selection."},"llm":{"type":"object","properties":{"allowModelOverride":{"type":"boolean","title":"Allow Plugin LLM Model Override","description":"Explicitly allows this plugin to request model overrides in api.runtime.llm.complete. Keep false unless the plugin is trusted to steer model selection."},"allowedModels":{"type":"array","items":{"type":"string"},"title":"Plugin LLM Allowed Models","description":"Allowed override targets for trusted plugin LLM calls as canonical \"provider/model\" refs. Use \"*\" only when you intentionally allow any model override."},"allowedCompletionModels":{"type":"array","items":{"type":"string"},"title":"Plugin LLM Allowed Completion Models","description":"Allowed targets for every plugin LLM completion as canonical \"provider/model\" refs, including host-resolved defaults and overrides. Use \"*\" only when you intentionally allow any model."},"allowAuthProfileOverride":{"type":"boolean","title":"Allow Plugin LLM Auth Profile Override","description":"Allows this plugin to select a non-default auth profile for isolated agent-runtime completions. Keep false unless the plugin is trusted for explicit isolated credential routing."},"allowAgentIdOverride":{"type":"boolean","title":"Allow Plugin LLM Agent Override","description":"Explicitly allows this plugin to request api.runtime.llm.complete against a non-default agent id. Keep false unless the plugin is trusted for cross-agent model access."}},"additionalProperties":false,"title":"Plugin LLM Policy","description":"Per-plugin api.runtime.llm.complete controls for model and agent override trust. Keep this unset unless a plugin must explicitly steer host-owned completion calls."},"config":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":false,"title":"Plugin Config","description":"Plugin-defined configuration payload interpreted by that plugin's own schema and validation rules. Use only documented fields from the plugin to prevent ignored or invalid settings.","properties":{}}},"additionalProperties":false},"tts-local-cli":{"type":"object","properties":{"enabled":{"type":"boolean","title":"Plugin Enabled","description":"Per-plugin enablement override for a specific entry, applied on top of global plugin policy (restart required). Use this to stage plugin rollout gradually across environments."},"hooks":{"type":"object","properties":{"allowPromptInjection":{"type":"boolean","title":"Allow Prompt Injection Hooks","description":"Controls whether this plugin may mutate prompts through typed hooks. Set false to block `before_prompt_build`."},"allowConversationAccess":{"type":"boolean","title":"Allow Conversation Access Hooks","description":"Controls whether this plugin may read raw conversation content from typed hooks such as `before_agent_run`, `before_model_resolve`, `before_agent_reply`, `llm_input`, `llm_output`, `before_agent_finalize`, and `agent_end`. Non-bundled plugins must opt in explicitly."},"timeoutMs":{"type":"integer","exclusiveMinimum":0,"maximum":600000,"title":"Plugin Hook Timeout (ms)","description":"Default timeout in milliseconds for this plugin's typed hooks, capped at 600000. Use this to bound slow plugin hooks without changing plugin code; per-hook values in hooks.timeouts take precedence."},"timeouts":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"integer","exclusiveMinimum":0,"maximum":600000},"title":"Plugin Hook Timeout Overrides","description":"Per-hook timeout overrides in milliseconds keyed by typed hook name, capped at 600000. Use narrow overrides for known slow hooks such as before_prompt_build or agent_end instead of raising every hook timeout."}},"additionalProperties":false,"title":"Plugin Hook Policy","description":"Per-plugin typed hook policy controls for core-enforced safety gates. Use this to constrain high-impact hook categories without disabling the entire plugin."},"subagent":{"type":"object","properties":{"allowModelOverride":{"type":"boolean","title":"Allow Plugin Subagent Model Override","description":"Explicitly allows this plugin to request provider/model overrides in background subagent runs. Keep false unless the plugin is trusted to steer model selection."},"allowedModels":{"type":"array","items":{"type":"string"},"title":"Plugin Subagent Allowed Models","description":"Allowed override targets for trusted plugin subagent runs as canonical \"provider/model\" refs. Use \"*\" only when you intentionally allow any model."}},"additionalProperties":false,"title":"Plugin Subagent Policy","description":"Per-plugin subagent runtime controls for model override trust and allowlists. Keep this unset unless a plugin must explicitly steer subagent model selection."},"llm":{"type":"object","properties":{"allowModelOverride":{"type":"boolean","title":"Allow Plugin LLM Model Override","description":"Explicitly allows this plugin to request model overrides in api.runtime.llm.complete. Keep false unless the plugin is trusted to steer model selection."},"allowedModels":{"type":"array","items":{"type":"string"},"title":"Plugin LLM Allowed Models","description":"Allowed override targets for trusted plugin LLM calls as canonical \"provider/model\" refs. Use \"*\" only when you intentionally allow any model override."},"allowedCompletionModels":{"type":"array","items":{"type":"string"},"title":"Plugin LLM Allowed Completion Models","description":"Allowed targets for every plugin LLM completion as canonical \"provider/model\" refs, including host-resolved defaults and overrides. Use \"*\" only when you intentionally allow any model."},"allowAuthProfileOverride":{"type":"boolean","title":"Allow Plugin LLM Auth Profile Override","description":"Allows this plugin to select a non-default auth profile for isolated agent-runtime completions. Keep false unless the plugin is trusted for explicit isolated credential routing."},"allowAgentIdOverride":{"type":"boolean","title":"Allow Plugin LLM Agent Override","description":"Explicitly allows this plugin to request api.runtime.llm.complete against a non-default agent id. Keep false unless the plugin is trusted for cross-agent model access."}},"additionalProperties":false,"title":"Plugin LLM Policy","description":"Per-plugin api.runtime.llm.complete controls for model and agent override trust. Keep this unset unless a plugin must explicitly steer host-owned completion calls."},"config":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":false,"title":"Plugin Config","description":"Plugin-defined configuration payload interpreted by that plugin's own schema and validation rules. Use only documented fields from the plugin to prevent ignored or invalid settings.","properties":{}}},"additionalProperties":false},"vault":{"type":"object","properties":{"enabled":{"type":"boolean","title":"Plugin Enabled","description":"Per-plugin enablement override for a specific entry, applied on top of global plugin policy (restart required). Use this to stage plugin rollout gradually across environments."},"hooks":{"type":"object","properties":{"allowPromptInjection":{"type":"boolean","title":"Allow Prompt Injection Hooks","description":"Controls whether this plugin may mutate prompts through typed hooks. Set false to block `before_prompt_build`."},"allowConversationAccess":{"type":"boolean","title":"Allow Conversation Access Hooks","description":"Controls whether this plugin may read raw conversation content from typed hooks such as `before_agent_run`, `before_model_resolve`, `before_agent_reply`, `llm_input`, `llm_output`, `before_agent_finalize`, and `agent_end`. Non-bundled plugins must opt in explicitly."},"timeoutMs":{"type":"integer","exclusiveMinimum":0,"maximum":600000,"title":"Plugin Hook Timeout (ms)","description":"Default timeout in milliseconds for this plugin's typed hooks, capped at 600000. Use this to bound slow plugin hooks without changing plugin code; per-hook values in hooks.timeouts take precedence."},"timeouts":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"integer","exclusiveMinimum":0,"maximum":600000},"title":"Plugin Hook Timeout Overrides","description":"Per-hook timeout overrides in milliseconds keyed by typed hook name, capped at 600000. Use narrow overrides for known slow hooks such as before_prompt_build or agent_end instead of raising every hook timeout."}},"additionalProperties":false,"title":"Plugin Hook Policy","description":"Per-plugin typed hook policy controls for core-enforced safety gates. Use this to constrain high-impact hook categories without disabling the entire plugin."},"subagent":{"type":"object","properties":{"allowModelOverride":{"type":"boolean","title":"Allow Plugin Subagent Model Override","description":"Explicitly allows this plugin to request provider/model overrides in background subagent runs. Keep false unless the plugin is trusted to steer model selection."},"allowedModels":{"type":"array","items":{"type":"string"},"title":"Plugin Subagent Allowed Models","description":"Allowed override targets for trusted plugin subagent runs as canonical \"provider/model\" refs. Use \"*\" only when you intentionally allow any model."}},"additionalProperties":false,"title":"Plugin Subagent Policy","description":"Per-plugin subagent runtime controls for model override trust and allowlists. Keep this unset unless a plugin must explicitly steer subagent model selection."},"llm":{"type":"object","properties":{"allowModelOverride":{"type":"boolean","title":"Allow Plugin LLM Model Override","description":"Explicitly allows this plugin to request model overrides in api.runtime.llm.complete. Keep false unless the plugin is trusted to steer model selection."},"allowedModels":{"type":"array","items":{"type":"string"},"title":"Plugin LLM Allowed Models","description":"Allowed override targets for trusted plugin LLM calls as canonical \"provider/model\" refs. Use \"*\" only when you intentionally allow any model override."},"allowedCompletionModels":{"type":"array","items":{"type":"string"},"title":"Plugin LLM Allowed Completion Models","description":"Allowed targets for every plugin LLM completion as canonical \"provider/model\" refs, including host-resolved defaults and overrides. Use \"*\" only when you intentionally allow any model."},"allowAuthProfileOverride":{"type":"boolean","title":"Allow Plugin LLM Auth Profile Override","description":"Allows this plugin to select a non-default auth profile for isolated agent-runtime completions. Keep false unless the plugin is trusted for explicit isolated credential routing."},"allowAgentIdOverride":{"type":"boolean","title":"Allow Plugin LLM Agent Override","description":"Explicitly allows this plugin to request api.runtime.llm.complete against a non-default agent id. Keep false unless the plugin is trusted for cross-agent model access."}},"additionalProperties":false,"title":"Plugin LLM Policy","description":"Per-plugin api.runtime.llm.complete controls for model and agent override trust. Keep this unset unless a plugin must explicitly steer host-owned completion calls."},"config":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":false,"title":"Plugin Config","description":"Plugin-defined configuration payload interpreted by that plugin's own schema and validation rules. Use only documented fields from the plugin to prevent ignored or invalid settings.","properties":{}}},"additionalProperties":false},"vllm":{"type":"object","properties":{"enabled":{"type":"boolean","title":"Plugin Enabled","description":"Per-plugin enablement override for a specific entry, applied on top of global plugin policy (restart required). Use this to stage plugin rollout gradually across environments."},"hooks":{"type":"object","properties":{"allowPromptInjection":{"type":"boolean","title":"Allow Prompt Injection Hooks","description":"Controls whether this plugin may mutate prompts through typed hooks. Set false to block `before_prompt_build`."},"allowConversationAccess":{"type":"boolean","title":"Allow Conversation Access Hooks","description":"Controls whether this plugin may read raw conversation content from typed hooks such as `before_agent_run`, `before_model_resolve`, `before_agent_reply`, `llm_input`, `llm_output`, `before_agent_finalize`, and `agent_end`. Non-bundled plugins must opt in explicitly."},"timeoutMs":{"type":"integer","exclusiveMinimum":0,"maximum":600000,"title":"Plugin Hook Timeout (ms)","description":"Default timeout in milliseconds for this plugin's typed hooks, capped at 600000. Use this to bound slow plugin hooks without changing plugin code; per-hook values in hooks.timeouts take precedence."},"timeouts":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"integer","exclusiveMinimum":0,"maximum":600000},"title":"Plugin Hook Timeout Overrides","description":"Per-hook timeout overrides in milliseconds keyed by typed hook name, capped at 600000. Use narrow overrides for known slow hooks such as before_prompt_build or agent_end instead of raising every hook timeout."}},"additionalProperties":false,"title":"Plugin Hook Policy","description":"Per-plugin typed hook policy controls for core-enforced safety gates. Use this to constrain high-impact hook categories without disabling the entire plugin."},"subagent":{"type":"object","properties":{"allowModelOverride":{"type":"boolean","title":"Allow Plugin Subagent Model Override","description":"Explicitly allows this plugin to request provider/model overrides in background subagent runs. Keep false unless the plugin is trusted to steer model selection."},"allowedModels":{"type":"array","items":{"type":"string"},"title":"Plugin Subagent Allowed Models","description":"Allowed override targets for trusted plugin subagent runs as canonical \"provider/model\" refs. Use \"*\" only when you intentionally allow any model."}},"additionalProperties":false,"title":"Plugin Subagent Policy","description":"Per-plugin subagent runtime controls for model override trust and allowlists. Keep this unset unless a plugin must explicitly steer subagent model selection."},"llm":{"type":"object","properties":{"allowModelOverride":{"type":"boolean","title":"Allow Plugin LLM Model Override","description":"Explicitly allows this plugin to request model overrides in api.runtime.llm.complete. Keep false unless the plugin is trusted to steer model selection."},"allowedModels":{"type":"array","items":{"type":"string"},"title":"Plugin LLM Allowed Models","description":"Allowed override targets for trusted plugin LLM calls as canonical \"provider/model\" refs. Use \"*\" only when you intentionally allow any model override."},"allowedCompletionModels":{"type":"array","items":{"type":"string"},"title":"Plugin LLM Allowed Completion Models","description":"Allowed targets for every plugin LLM completion as canonical \"provider/model\" refs, including host-resolved defaults and overrides. Use \"*\" only when you intentionally allow any model."},"allowAuthProfileOverride":{"type":"boolean","title":"Allow Plugin LLM Auth Profile Override","description":"Allows this plugin to select a non-default auth profile for isolated agent-runtime completions. Keep false unless the plugin is trusted for explicit isolated credential routing."},"allowAgentIdOverride":{"type":"boolean","title":"Allow Plugin LLM Agent Override","description":"Explicitly allows this plugin to request api.runtime.llm.complete against a non-default agent id. Keep false unless the plugin is trusted for cross-agent model access."}},"additionalProperties":false,"title":"Plugin LLM Policy","description":"Per-plugin api.runtime.llm.complete controls for model and agent override trust. Keep this unset unless a plugin must explicitly steer host-owned completion calls."},"config":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":false,"title":"Plugin Config","description":"Plugin-defined configuration payload interpreted by that plugin's own schema and validation rules. Use only documented fields from the plugin to prevent ignored or invalid settings.","properties":{}}},"additionalProperties":false},"web-readability":{"type":"object","properties":{"enabled":{"type":"boolean","title":"Plugin Enabled","description":"Per-plugin enablement override for a specific entry, applied on top of global plugin policy (restart required). Use this to stage plugin rollout gradually across environments."},"hooks":{"type":"object","properties":{"allowPromptInjection":{"type":"boolean","title":"Allow Prompt Injection Hooks","description":"Controls whether this plugin may mutate prompts through typed hooks. Set false to block `before_prompt_build`."},"allowConversationAccess":{"type":"boolean","title":"Allow Conversation Access Hooks","description":"Controls whether this plugin may read raw conversation content from typed hooks such as `before_agent_run`, `before_model_resolve`, `before_agent_reply`, `llm_input`, `llm_output`, `before_agent_finalize`, and `agent_end`. Non-bundled plugins must opt in explicitly."},"timeoutMs":{"type":"integer","exclusiveMinimum":0,"maximum":600000,"title":"Plugin Hook Timeout (ms)","description":"Default timeout in milliseconds for this plugin's typed hooks, capped at 600000. Use this to bound slow plugin hooks without changing plugin code; per-hook values in hooks.timeouts take precedence."},"timeouts":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"integer","exclusiveMinimum":0,"maximum":600000},"title":"Plugin Hook Timeout Overrides","description":"Per-hook timeout overrides in milliseconds keyed by typed hook name, capped at 600000. Use narrow overrides for known slow hooks such as before_prompt_build or agent_end instead of raising every hook timeout."}},"additionalProperties":false,"title":"Plugin Hook Policy","description":"Per-plugin typed hook policy controls for core-enforced safety gates. Use this to constrain high-impact hook categories without disabling the entire plugin."},"subagent":{"type":"object","properties":{"allowModelOverride":{"type":"boolean","title":"Allow Plugin Subagent Model Override","description":"Explicitly allows this plugin to request provider/model overrides in background subagent runs. Keep false unless the plugin is trusted to steer model selection."},"allowedModels":{"type":"array","items":{"type":"string"},"title":"Plugin Subagent Allowed Models","description":"Allowed override targets for trusted plugin subagent runs as canonical \"provider/model\" refs. Use \"*\" only when you intentionally allow any model."}},"additionalProperties":false,"title":"Plugin Subagent Policy","description":"Per-plugin subagent runtime controls for model override trust and allowlists. Keep this unset unless a plugin must explicitly steer subagent model selection."},"llm":{"type":"object","properties":{"allowModelOverride":{"type":"boolean","title":"Allow Plugin LLM Model Override","description":"Explicitly allows this plugin to request model overrides in api.runtime.llm.complete. Keep false unless the plugin is trusted to steer model selection."},"allowedModels":{"type":"array","items":{"type":"string"},"title":"Plugin LLM Allowed Models","description":"Allowed override targets for trusted plugin LLM calls as canonical \"provider/model\" refs. Use \"*\" only when you intentionally allow any model override."},"allowedCompletionModels":{"type":"array","items":{"type":"string"},"title":"Plugin LLM Allowed Completion Models","description":"Allowed targets for every plugin LLM completion as canonical \"provider/model\" refs, including host-resolved defaults and overrides. Use \"*\" only when you intentionally allow any model."},"allowAuthProfileOverride":{"type":"boolean","title":"Allow Plugin LLM Auth Profile Override","description":"Allows this plugin to select a non-default auth profile for isolated agent-runtime completions. Keep false unless the plugin is trusted for explicit isolated credential routing."},"allowAgentIdOverride":{"type":"boolean","title":"Allow Plugin LLM Agent Override","description":"Explicitly allows this plugin to request api.runtime.llm.complete against a non-default agent id. Keep false unless the plugin is trusted for cross-agent model access."}},"additionalProperties":false,"title":"Plugin LLM Policy","description":"Per-plugin api.runtime.llm.complete controls for model and agent override trust. Keep this unset unless a plugin must explicitly steer host-owned completion calls."},"config":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":false,"title":"Plugin Config","description":"Plugin-defined configuration payload interpreted by that plugin's own schema and validation rules. Use only documented fields from the plugin to prevent ignored or invalid settings.","properties":{}}},"additionalProperties":false},"webhooks":{"type":"object","properties":{"enabled":{"type":"boolean","title":"Plugin Enabled","description":"Per-plugin enablement override for a specific entry, applied on top of global plugin policy (restart required). Use this to stage plugin rollout gradually across environments."},"hooks":{"type":"object","properties":{"allowPromptInjection":{"type":"boolean","title":"Allow Prompt Injection Hooks","description":"Controls whether this plugin may mutate prompts through typed hooks. Set false to block `before_prompt_build`."},"allowConversationAccess":{"type":"boolean","title":"Allow Conversation Access Hooks","description":"Controls whether this plugin may read raw conversation content from typed hooks such as `before_agent_run`, `before_model_resolve`, `before_agent_reply`, `llm_input`, `llm_output`, `before_agent_finalize`, and `agent_end`. Non-bundled plugins must opt in explicitly."},"timeoutMs":{"type":"integer","exclusiveMinimum":0,"maximum":600000,"title":"Plugin Hook Timeout (ms)","description":"Default timeout in milliseconds for this plugin's typed hooks, capped at 600000. Use this to bound slow plugin hooks without changing plugin code; per-hook values in hooks.timeouts take precedence."},"timeouts":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"integer","exclusiveMinimum":0,"maximum":600000},"title":"Plugin Hook Timeout Overrides","description":"Per-hook timeout overrides in milliseconds keyed by typed hook name, capped at 600000. Use narrow overrides for known slow hooks such as before_prompt_build or agent_end instead of raising every hook timeout."}},"additionalProperties":false,"title":"Plugin Hook Policy","description":"Per-plugin typed hook policy controls for core-enforced safety gates. Use this to constrain high-impact hook categories without disabling the entire plugin."},"subagent":{"type":"object","properties":{"allowModelOverride":{"type":"boolean","title":"Allow Plugin Subagent Model Override","description":"Explicitly allows this plugin to request provider/model overrides in background subagent runs. Keep false unless the plugin is trusted to steer model selection."},"allowedModels":{"type":"array","items":{"type":"string"},"title":"Plugin Subagent Allowed Models","description":"Allowed override targets for trusted plugin subagent runs as canonical \"provider/model\" refs. Use \"*\" only when you intentionally allow any model."}},"additionalProperties":false,"title":"Plugin Subagent Policy","description":"Per-plugin subagent runtime controls for model override trust and allowlists. Keep this unset unless a plugin must explicitly steer subagent model selection."},"llm":{"type":"object","properties":{"allowModelOverride":{"type":"boolean","title":"Allow Plugin LLM Model Override","description":"Explicitly allows this plugin to request model overrides in api.runtime.llm.complete. Keep false unless the plugin is trusted to steer model selection."},"allowedModels":{"type":"array","items":{"type":"string"},"title":"Plugin LLM Allowed Models","description":"Allowed override targets for trusted plugin LLM calls as canonical \"provider/model\" refs. Use \"*\" only when you intentionally allow any model override."},"allowedCompletionModels":{"type":"array","items":{"type":"string"},"title":"Plugin LLM Allowed Completion Models","description":"Allowed targets for every plugin LLM completion as canonical \"provider/model\" refs, including host-resolved defaults and overrides. Use \"*\" only when you intentionally allow any model."},"allowAuthProfileOverride":{"type":"boolean","title":"Allow Plugin LLM Auth Profile Override","description":"Allows this plugin to select a non-default auth profile for isolated agent-runtime completions. Keep false unless the plugin is trusted for explicit isolated credential routing."},"allowAgentIdOverride":{"type":"boolean","title":"Allow Plugin LLM Agent Override","description":"Explicitly allows this plugin to request api.runtime.llm.complete against a non-default agent id. Keep false unless the plugin is trusted for cross-agent model access."}},"additionalProperties":false,"title":"Plugin LLM Policy","description":"Per-plugin api.runtime.llm.complete controls for model and agent override trust. Keep this unset unless a plugin must explicitly steer host-owned completion calls."},"config":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":false,"title":"Plugin Config","description":"Plugin-defined configuration payload interpreted by that plugin's own schema and validation rules. Use only documented fields from the plugin to prevent ignored or invalid settings.","$defs":{"secretRef":{"type":"object","additionalProperties":false,"properties":{"source":{"type":"string","enum":["env","file","exec","store"]},"provider":{"type":"string"},"id":{"type":"string"}},"required":["source","provider","id"]},"secretInput":{"anyOf":[{"type":"string","minLength":1},{"$ref":"#/properties/plugins/properties/entries/properties/webhooks/properties/config/$defs/secretRef"}]},"route":{"type":"object","additionalProperties":false,"properties":{"enabled":{"type":"boolean"},"path":{"type":"string","minLength":1},"sessionKey":{"type":"string","minLength":1},"secret":{"$ref":"#/properties/plugins/properties/entries/properties/webhooks/properties/config/$defs/secretInput"},"controllerId":{"type":"string","minLength":1},"description":{"type":"string"}},"required":["sessionKey","secret"]}},"properties":{"routes":{"type":"object","additionalProperties":{"$ref":"#/properties/plugins/properties/entries/properties/webhooks/properties/config/$defs/route"}}}}},"additionalProperties":false},"workboard":{"type":"object","properties":{"enabled":{"type":"boolean","title":"Plugin Enabled","description":"Per-plugin enablement override for a specific entry, applied on top of global plugin policy (restart required). Use this to stage plugin rollout gradually across environments."},"hooks":{"type":"object","properties":{"allowPromptInjection":{"type":"boolean","title":"Allow Prompt Injection Hooks","description":"Controls whether this plugin may mutate prompts through typed hooks. Set false to block `before_prompt_build`."},"allowConversationAccess":{"type":"boolean","title":"Allow Conversation Access Hooks","description":"Controls whether this plugin may read raw conversation content from typed hooks such as `before_agent_run`, `before_model_resolve`, `before_agent_reply`, `llm_input`, `llm_output`, `before_agent_finalize`, and `agent_end`. Non-bundled plugins must opt in explicitly."},"timeoutMs":{"type":"integer","exclusiveMinimum":0,"maximum":600000,"title":"Plugin Hook Timeout (ms)","description":"Default timeout in milliseconds for this plugin's typed hooks, capped at 600000. Use this to bound slow plugin hooks without changing plugin code; per-hook values in hooks.timeouts take precedence."},"timeouts":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"integer","exclusiveMinimum":0,"maximum":600000},"title":"Plugin Hook Timeout Overrides","description":"Per-hook timeout overrides in milliseconds keyed by typed hook name, capped at 600000. Use narrow overrides for known slow hooks such as before_prompt_build or agent_end instead of raising every hook timeout."}},"additionalProperties":false,"title":"Plugin Hook Policy","description":"Per-plugin typed hook policy controls for core-enforced safety gates. Use this to constrain high-impact hook categories without disabling the entire plugin."},"subagent":{"type":"object","properties":{"allowModelOverride":{"type":"boolean","title":"Allow Plugin Subagent Model Override","description":"Explicitly allows this plugin to request provider/model overrides in background subagent runs. Keep false unless the plugin is trusted to steer model selection."},"allowedModels":{"type":"array","items":{"type":"string"},"title":"Plugin Subagent Allowed Models","description":"Allowed override targets for trusted plugin subagent runs as canonical \"provider/model\" refs. Use \"*\" only when you intentionally allow any model."}},"additionalProperties":false,"title":"Plugin Subagent Policy","description":"Per-plugin subagent runtime controls for model override trust and allowlists. Keep this unset unless a plugin must explicitly steer subagent model selection."},"llm":{"type":"object","properties":{"allowModelOverride":{"type":"boolean","title":"Allow Plugin LLM Model Override","description":"Explicitly allows this plugin to request model overrides in api.runtime.llm.complete. Keep false unless the plugin is trusted to steer model selection."},"allowedModels":{"type":"array","items":{"type":"string"},"title":"Plugin LLM Allowed Models","description":"Allowed override targets for trusted plugin LLM calls as canonical \"provider/model\" refs. Use \"*\" only when you intentionally allow any model override."},"allowedCompletionModels":{"type":"array","items":{"type":"string"},"title":"Plugin LLM Allowed Completion Models","description":"Allowed targets for every plugin LLM completion as canonical \"provider/model\" refs, including host-resolved defaults and overrides. Use \"*\" only when you intentionally allow any model."},"allowAuthProfileOverride":{"type":"boolean","title":"Allow Plugin LLM Auth Profile Override","description":"Allows this plugin to select a non-default auth profile for isolated agent-runtime completions. Keep false unless the plugin is trusted for explicit isolated credential routing."},"allowAgentIdOverride":{"type":"boolean","title":"Allow Plugin LLM Agent Override","description":"Explicitly allows this plugin to request api.runtime.llm.complete against a non-default agent id. Keep false unless the plugin is trusted for cross-agent model access."}},"additionalProperties":false,"title":"Plugin LLM Policy","description":"Per-plugin api.runtime.llm.complete controls for model and agent override trust. Keep this unset unless a plugin must explicitly steer host-owned completion calls."},"config":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":false,"title":"Plugin Config","description":"Plugin-defined configuration payload interpreted by that plugin's own schema and validation rules. Use only documented fields from the plugin to prevent ignored or invalid settings.","properties":{}}},"additionalProperties":false},"xai":{"type":"object","properties":{"enabled":{"type":"boolean","title":"Plugin Enabled","description":"Per-plugin enablement override for a specific entry, applied on top of global plugin policy (restart required). Use this to stage plugin rollout gradually across environments."},"hooks":{"type":"object","properties":{"allowPromptInjection":{"type":"boolean","title":"Allow Prompt Injection Hooks","description":"Controls whether this plugin may mutate prompts through typed hooks. Set false to block `before_prompt_build`."},"allowConversationAccess":{"type":"boolean","title":"Allow Conversation Access Hooks","description":"Controls whether this plugin may read raw conversation content from typed hooks such as `before_agent_run`, `before_model_resolve`, `before_agent_reply`, `llm_input`, `llm_output`, `before_agent_finalize`, and `agent_end`. Non-bundled plugins must opt in explicitly."},"timeoutMs":{"type":"integer","exclusiveMinimum":0,"maximum":600000,"title":"Plugin Hook Timeout (ms)","description":"Default timeout in milliseconds for this plugin's typed hooks, capped at 600000. Use this to bound slow plugin hooks without changing plugin code; per-hook values in hooks.timeouts take precedence."},"timeouts":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"integer","exclusiveMinimum":0,"maximum":600000},"title":"Plugin Hook Timeout Overrides","description":"Per-hook timeout overrides in milliseconds keyed by typed hook name, capped at 600000. Use narrow overrides for known slow hooks such as before_prompt_build or agent_end instead of raising every hook timeout."}},"additionalProperties":false,"title":"Plugin Hook Policy","description":"Per-plugin typed hook policy controls for core-enforced safety gates. Use this to constrain high-impact hook categories without disabling the entire plugin."},"subagent":{"type":"object","properties":{"allowModelOverride":{"type":"boolean","title":"Allow Plugin Subagent Model Override","description":"Explicitly allows this plugin to request provider/model overrides in background subagent runs. Keep false unless the plugin is trusted to steer model selection."},"allowedModels":{"type":"array","items":{"type":"string"},"title":"Plugin Subagent Allowed Models","description":"Allowed override targets for trusted plugin subagent runs as canonical \"provider/model\" refs. Use \"*\" only when you intentionally allow any model."}},"additionalProperties":false,"title":"Plugin Subagent Policy","description":"Per-plugin subagent runtime controls for model override trust and allowlists. Keep this unset unless a plugin must explicitly steer subagent model selection."},"llm":{"type":"object","properties":{"allowModelOverride":{"type":"boolean","title":"Allow Plugin LLM Model Override","description":"Explicitly allows this plugin to request model overrides in api.runtime.llm.complete. Keep false unless the plugin is trusted to steer model selection."},"allowedModels":{"type":"array","items":{"type":"string"},"title":"Plugin LLM Allowed Models","description":"Allowed override targets for trusted plugin LLM calls as canonical \"provider/model\" refs. Use \"*\" only when you intentionally allow any model override."},"allowedCompletionModels":{"type":"array","items":{"type":"string"},"title":"Plugin LLM Allowed Completion Models","description":"Allowed targets for every plugin LLM completion as canonical \"provider/model\" refs, including host-resolved defaults and overrides. Use \"*\" only when you intentionally allow any model."},"allowAuthProfileOverride":{"type":"boolean","title":"Allow Plugin LLM Auth Profile Override","description":"Allows this plugin to select a non-default auth profile for isolated agent-runtime completions. Keep false unless the plugin is trusted for explicit isolated credential routing."},"allowAgentIdOverride":{"type":"boolean","title":"Allow Plugin LLM Agent Override","description":"Explicitly allows this plugin to request api.runtime.llm.complete against a non-default agent id. Keep false unless the plugin is trusted for cross-agent model access."}},"additionalProperties":false,"title":"Plugin LLM Policy","description":"Per-plugin api.runtime.llm.complete controls for model and agent override trust. Keep this unset unless a plugin must explicitly steer host-owned completion calls."},"config":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":false,"title":"Plugin Config","description":"Plugin-defined configuration payload interpreted by that plugin's own schema and validation rules. Use only documented fields from the plugin to prevent ignored or invalid settings.","properties":{"webSearch":{"type":"object","additionalProperties":false,"properties":{"apiKey":{"type":["string","object"]},"model":{"type":"string"},"baseUrl":{"type":"string"},"inlineCitations":{"type":"boolean"}}},"xSearch":{"type":"object","additionalProperties":false,"properties":{"enabled":{"type":"boolean"},"model":{"type":"string"},"baseUrl":{"type":"string"},"inlineCitations":{"type":"boolean"},"maxTurns":{"type":"number"},"timeoutSeconds":{"type":"number"},"cacheTtlMinutes":{"type":"number"}}},"codeExecution":{"type":"object","additionalProperties":false,"properties":{"enabled":{"type":"boolean"},"model":{"type":"string"},"maxTurns":{"type":"number"},"timeoutSeconds":{"type":"number"}}}}}},"additionalProperties":false}}}},"additionalProperties":false,"title":"Plugins","description":"Plugin system controls for enabling extensions, constraining load scope, configuring entries, and tracking installs. Keep plugin policy explicit and least-privilege in production environments."},"surfaces":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"silentReply":{"type":"object","properties":{"group":{"anyOf":[{"type":"string","const":"allow"},{"type":"string","const":"disallow"}]},"internal":{"anyOf":[{"type":"string","const":"allow"},{"type":"string","const":"disallow"}]}},"additionalProperties":false,"title":"Surface Silent Reply Policy","description":"Overrides silent-reply policy for one resolved delivery surface. Unset fields inherit agents.defaults.silentReply; use narrow surface ids so internal or group-specific behavior does not spill into other destinations."}},"additionalProperties":false},"title":"Surface Policies","description":"Per-surface message policy overrides keyed by the resolved delivery surface id. Use this only when one deployed surface needs stricter silent-reply handling than the agent default."},"proxy":{"type":"object","properties":{"enabled":{"type":"boolean","title":"Managed Proxy Enabled","description":"Explicit managed-proxy override. URL presence enables routing by default; set false to ignore configured or environment proxy URLs without deleting them."},"proxyUrl":{"type":"string","format":"uri","title":"Managed Proxy URL","description":"Managed forward proxy URL. Use http:// for a plain CONNECT proxy or https:// when the connection to the proxy endpoint itself must use TLS."},"tls":{"type":"object","properties":{"caFile":{"type":"string","minLength":1,"title":"Managed Proxy TLS CA File","description":"Filesystem path to a custom CA bundle used to verify an HTTPS managed proxy endpoint certificate."}},"additionalProperties":false,"title":"Managed Proxy TLS","description":"TLS settings used when connecting to the managed proxy endpoint. These settings apply to proxy TLS, not destination TLS after CONNECT."},"loopbackMode":{"type":"string","enum":["gateway-only","proxy","block"],"title":"Managed Proxy Loopback Mode","description":"Controls Gateway loopback control-plane routing while managed proxy mode is active: \"gateway-only\", \"proxy\", or \"block\"."}},"additionalProperties":false,"title":"Managed Proxy","description":"Operator-managed forward proxy routing for OpenClaw runtime HTTP, HTTPS, WebSocket, and supported raw-egress paths. Use this when central egress control is part of the deployment boundary."}},"additionalProperties":false,"title":"OpenClawConfig"}