@symerian/symi 3.0.20 → 3.0.22

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 (737) hide show
  1. package/dist/{audio-preflight-BaCdNfrk.js → audio-preflight-D7BVT-ls.js} +4 -4
  2. package/dist/build-info.json +3 -3
  3. package/dist/canvas-host/a2ui/.bundle.hash +1 -1
  4. package/dist/{chrome-UfmVM0xR.js → chrome-B5CO2vB5.js} +7 -7
  5. package/dist/{deliver-BqXdac6W.js → deliver-CrwjsDwv.js} +1 -1
  6. package/dist/extensionAPI.js +7 -7
  7. package/dist/{image-DIWsXYcW.js → image-Csu7WcLW.js} +1 -1
  8. package/dist/{manager-DW3SxcPr.js → manager-BkkVjTO8.js} +1 -1
  9. package/dist/{pi-embedded-BNch0U5F.js → pi-embedded-Dhp64z5l.js} +16 -16
  10. package/dist/{pi-embedded-helpers-IkHl02JF.js → pi-embedded-helpers-840E4hop.js} +4 -4
  11. package/dist/{pw-ai-nMkA-oDJ.js → pw-ai-CBgJf_RR.js} +1 -1
  12. package/dist/{runner-DNEC58JI.js → runner-BbFKo1ne.js} +1 -1
  13. package/dist/{synthesis-BWAr0sZ9.js → synthesis-DoEM0E8_.js} +7 -7
  14. package/dist/{web-7a-m_UxL.js → web-BYXJn-Ps.js} +7 -7
  15. package/package.json +1 -1
  16. package/docs/.i18n/README.md +0 -31
  17. package/docs/.i18n/glossary.ja-JP.json +0 -14
  18. package/docs/.i18n/glossary.zh-CN.json +0 -210
  19. package/docs/.i18n/ja-JP.tm.jsonl +0 -0
  20. package/docs/.i18n/zh-CN.tm.jsonl +0 -1303
  21. package/docs/CNAME +0 -1
  22. package/docs/assets/install-script.svg +0 -1
  23. package/docs/assets/macos-onboarding/01-macos-warning.jpeg +0 -0
  24. package/docs/assets/macos-onboarding/02-local-networks.jpeg +0 -0
  25. package/docs/assets/macos-onboarding/03-security-notice.png +0 -0
  26. package/docs/assets/macos-onboarding/04-choose-gateway.png +0 -0
  27. package/docs/assets/macos-onboarding/05-permissions.png +0 -0
  28. package/docs/assets/pixel-symi.svg +0 -60
  29. package/docs/assets/showcase/agents-ui.jpg +0 -0
  30. package/docs/assets/showcase/bambu-cli.png +0 -0
  31. package/docs/assets/showcase/codexmonitor.png +0 -0
  32. package/docs/assets/showcase/gohome-grafana.png +0 -0
  33. package/docs/assets/showcase/ios-testflight.jpg +0 -0
  34. package/docs/assets/showcase/oura-health.png +0 -0
  35. package/docs/assets/showcase/padel-cli.svg +0 -11
  36. package/docs/assets/showcase/padel-screenshot.jpg +0 -0
  37. package/docs/assets/showcase/papla-tts.jpg +0 -0
  38. package/docs/assets/showcase/pr-review-telegram.jpg +0 -0
  39. package/docs/assets/showcase/roborock-screenshot.jpg +0 -0
  40. package/docs/assets/showcase/roborock-status.svg +0 -13
  41. package/docs/assets/showcase/roof-camera-sky.jpg +0 -0
  42. package/docs/assets/showcase/snag.png +0 -0
  43. package/docs/assets/showcase/tesco-shop.jpg +0 -0
  44. package/docs/assets/showcase/wienerlinien.png +0 -0
  45. package/docs/assets/showcase/wine-cellar-skill.jpg +0 -0
  46. package/docs/assets/showcase/winix-air-purifier.jpg +0 -0
  47. package/docs/assets/showcase/xuezh-pronunciation.jpeg +0 -0
  48. package/docs/assets/sponsors/blacksmith.svg +0 -14
  49. package/docs/assets/sponsors/openai.svg +0 -3
  50. package/docs/assets/symi-logo-text-dark.png +0 -0
  51. package/docs/assets/symi-logo-text.png +0 -0
  52. package/docs/automation/auth-monitoring.md +0 -44
  53. package/docs/automation/cron-jobs.md +0 -540
  54. package/docs/automation/cron-vs-heartbeat.md +0 -286
  55. package/docs/automation/gmail-pubsub.md +0 -256
  56. package/docs/automation/hooks.md +0 -998
  57. package/docs/automation/poll.md +0 -61
  58. package/docs/automation/troubleshooting.md +0 -122
  59. package/docs/automation/webhook.md +0 -213
  60. package/docs/brave-search.md +0 -41
  61. package/docs/capabilities.md +0 -151
  62. package/docs/channels/bluebubbles.md +0 -346
  63. package/docs/channels/broadcast-groups.md +0 -441
  64. package/docs/channels/channel-routing.md +0 -112
  65. package/docs/channels/feishu.md +0 -586
  66. package/docs/channels/googlechat.md +0 -253
  67. package/docs/channels/grammy.md +0 -31
  68. package/docs/channels/group-messages.md +0 -82
  69. package/docs/channels/groups.md +0 -364
  70. package/docs/channels/imessage.md +0 -366
  71. package/docs/channels/index.md +0 -46
  72. package/docs/channels/irc.md +0 -234
  73. package/docs/channels/line.md +0 -186
  74. package/docs/channels/location.md +0 -56
  75. package/docs/channels/matrix.md +0 -300
  76. package/docs/channels/mattermost.md +0 -158
  77. package/docs/channels/msteams.md +0 -769
  78. package/docs/channels/nextcloud-talk.md +0 -138
  79. package/docs/channels/nostr.md +0 -233
  80. package/docs/channels/pairing.md +0 -100
  81. package/docs/channels/signal.md +0 -322
  82. package/docs/channels/slack.md +0 -510
  83. package/docs/channels/telegram.md +0 -748
  84. package/docs/channels/tlon.md +0 -148
  85. package/docs/channels/troubleshooting.md +0 -110
  86. package/docs/channels/twitch.md +0 -379
  87. package/docs/channels/whatsapp.md +0 -444
  88. package/docs/channels/zalo.md +0 -192
  89. package/docs/channels/zalouser.md +0 -140
  90. package/docs/ci.md +0 -50
  91. package/docs/cli/acp.md +0 -182
  92. package/docs/cli/agent.md +0 -24
  93. package/docs/cli/agents.md +0 -75
  94. package/docs/cli/approvals.md +0 -50
  95. package/docs/cli/browser.md +0 -107
  96. package/docs/cli/channels.md +0 -73
  97. package/docs/cli/config.md +0 -50
  98. package/docs/cli/configure.md +0 -32
  99. package/docs/cli/cron.md +0 -44
  100. package/docs/cli/dashboard.md +0 -16
  101. package/docs/cli/devices.md +0 -73
  102. package/docs/cli/directory.md +0 -62
  103. package/docs/cli/dns.md +0 -23
  104. package/docs/cli/docs.md +0 -15
  105. package/docs/cli/doctor.md +0 -41
  106. package/docs/cli/gateway.md +0 -202
  107. package/docs/cli/health.md +0 -21
  108. package/docs/cli/hooks.md +0 -313
  109. package/docs/cli/index.md +0 -1029
  110. package/docs/cli/logs.md +0 -28
  111. package/docs/cli/memory.md +0 -45
  112. package/docs/cli/message.md +0 -214
  113. package/docs/cli/models.md +0 -79
  114. package/docs/cli/node.md +0 -112
  115. package/docs/cli/nodes.md +0 -73
  116. package/docs/cli/onboard.md +0 -76
  117. package/docs/cli/pairing.md +0 -21
  118. package/docs/cli/plugins.md +0 -92
  119. package/docs/cli/reset.md +0 -17
  120. package/docs/cli/sandbox.md +0 -152
  121. package/docs/cli/security.md +0 -64
  122. package/docs/cli/sessions.md +0 -16
  123. package/docs/cli/setup.md +0 -29
  124. package/docs/cli/skills.md +0 -26
  125. package/docs/cli/status.md +0 -25
  126. package/docs/cli/system.md +0 -60
  127. package/docs/cli/tui.md +0 -23
  128. package/docs/cli/uninstall.md +0 -17
  129. package/docs/cli/update.md +0 -98
  130. package/docs/cli/voicecall.md +0 -34
  131. package/docs/cli/webhooks.md +0 -25
  132. package/docs/concepts/agent-loop.md +0 -148
  133. package/docs/concepts/agent-workspace.md +0 -234
  134. package/docs/concepts/agent.md +0 -123
  135. package/docs/concepts/architecture.md +0 -135
  136. package/docs/concepts/compaction.md +0 -61
  137. package/docs/concepts/context.md +0 -161
  138. package/docs/concepts/features.md +0 -51
  139. package/docs/concepts/markdown-formatting.md +0 -128
  140. package/docs/concepts/memory.md +0 -729
  141. package/docs/concepts/messages.md +0 -153
  142. package/docs/concepts/model-failover.md +0 -149
  143. package/docs/concepts/model-providers.md +0 -424
  144. package/docs/concepts/models.md +0 -208
  145. package/docs/concepts/multi-agent.md +0 -521
  146. package/docs/concepts/oauth.md +0 -145
  147. package/docs/concepts/presence.md +0 -102
  148. package/docs/concepts/queue.md +0 -86
  149. package/docs/concepts/retry.md +0 -64
  150. package/docs/concepts/session-pruning.md +0 -123
  151. package/docs/concepts/session-tool.md +0 -213
  152. package/docs/concepts/session.md +0 -199
  153. package/docs/concepts/sessions.md +0 -10
  154. package/docs/concepts/streaming.md +0 -129
  155. package/docs/concepts/system-prompt.md +0 -128
  156. package/docs/concepts/timezone.md +0 -90
  157. package/docs/concepts/typebox.md +0 -289
  158. package/docs/concepts/typing-indicators.md +0 -68
  159. package/docs/concepts/usage-tracking.md +0 -35
  160. package/docs/date-time.md +0 -127
  161. package/docs/debug/node-issue.md +0 -85
  162. package/docs/diagnostics/flags.md +0 -91
  163. package/docs/docs.json +0 -1849
  164. package/docs/experiments/onboarding-config-protocol.md +0 -40
  165. package/docs/experiments/plans/browser-evaluate-cdp-refactor.md +0 -229
  166. package/docs/experiments/plans/cron-add-hardening.md +0 -62
  167. package/docs/experiments/plans/group-policy-hardening.md +0 -40
  168. package/docs/experiments/plans/openresponses-gateway.md +0 -123
  169. package/docs/experiments/plans/pty-process-supervision.md +0 -192
  170. package/docs/experiments/plans/session-binding-channel-agnostic.md +0 -202
  171. package/docs/experiments/plans/thread-bound-subagents.md +0 -281
  172. package/docs/experiments/proposals/model-config.md +0 -36
  173. package/docs/experiments/research/memory.md +0 -228
  174. package/docs/gateway/authentication.md +0 -162
  175. package/docs/gateway/background-process.md +0 -96
  176. package/docs/gateway/bonjour.md +0 -177
  177. package/docs/gateway/bridge-protocol.md +0 -91
  178. package/docs/gateway/cli-backends.md +0 -225
  179. package/docs/gateway/configuration-examples.md +0 -610
  180. package/docs/gateway/configuration-reference.md +0 -2465
  181. package/docs/gateway/configuration.md +0 -488
  182. package/docs/gateway/discovery.md +0 -123
  183. package/docs/gateway/doctor.md +0 -282
  184. package/docs/gateway/gateway-lock.md +0 -34
  185. package/docs/gateway/health.md +0 -35
  186. package/docs/gateway/heartbeat.md +0 -374
  187. package/docs/gateway/index.md +0 -254
  188. package/docs/gateway/local-models.md +0 -150
  189. package/docs/gateway/logging.md +0 -113
  190. package/docs/gateway/multiple-gateways.md +0 -112
  191. package/docs/gateway/network-model.md +0 -20
  192. package/docs/gateway/openai-http-api.md +0 -119
  193. package/docs/gateway/openresponses-http-api.md +0 -333
  194. package/docs/gateway/pairing.md +0 -99
  195. package/docs/gateway/protocol.md +0 -221
  196. package/docs/gateway/remote-gateway-readme.md +0 -158
  197. package/docs/gateway/remote.md +0 -131
  198. package/docs/gateway/sandbox-vs-tool-policy-vs-elevated.md +0 -128
  199. package/docs/gateway/sandboxing.md +0 -203
  200. package/docs/gateway/security/index.md +0 -931
  201. package/docs/gateway/tailscale.md +0 -132
  202. package/docs/gateway/tools-invoke-http-api.md +0 -110
  203. package/docs/gateway/troubleshooting.md +0 -317
  204. package/docs/gateway/trusted-proxy-auth.md +0 -270
  205. package/docs/glass-ui-rendering-invariants.md +0 -451
  206. package/docs/help/debugging.md +0 -162
  207. package/docs/help/environment.md +0 -107
  208. package/docs/help/faq.md +0 -2846
  209. package/docs/help/index.md +0 -21
  210. package/docs/help/scripts.md +0 -28
  211. package/docs/help/testing.md +0 -385
  212. package/docs/help/troubleshooting.md +0 -264
  213. package/docs/images/configure-model-picker-unsearchable.png +0 -0
  214. package/docs/images/feishu-step2-create-app.png +0 -0
  215. package/docs/images/feishu-step3-credentials.png +0 -0
  216. package/docs/images/feishu-step4-permissions.png +0 -0
  217. package/docs/images/feishu-step5-bot-capability.png +0 -0
  218. package/docs/images/feishu-step6-event-subscription.png +0 -0
  219. package/docs/images/groups-flow.svg +0 -52
  220. package/docs/images/mobile-ui-screenshot.png +0 -0
  221. package/docs/index.md +0 -186
  222. package/docs/install/ansible.md +0 -207
  223. package/docs/install/bun.md +0 -59
  224. package/docs/install/development-channels.md +0 -75
  225. package/docs/install/docker.md +0 -583
  226. package/docs/install/exe-dev.md +0 -126
  227. package/docs/install/fly.md +0 -472
  228. package/docs/install/gcp.md +0 -499
  229. package/docs/install/hetzner.md +0 -347
  230. package/docs/install/index.md +0 -218
  231. package/docs/install/installer.md +0 -405
  232. package/docs/install/macos-vm.md +0 -281
  233. package/docs/install/migrating.md +0 -192
  234. package/docs/install/nix.md +0 -98
  235. package/docs/install/node.md +0 -138
  236. package/docs/install/northflank.mdx +0 -49
  237. package/docs/install/podman.md +0 -108
  238. package/docs/install/railway.mdx +0 -95
  239. package/docs/install/render.mdx +0 -158
  240. package/docs/install/uninstall.md +0 -128
  241. package/docs/install/updating.md +0 -231
  242. package/docs/ja-JP/AGENTS.md +0 -37
  243. package/docs/ja-JP/index.md +0 -183
  244. package/docs/ja-JP/start/getting-started.md +0 -125
  245. package/docs/ja-JP/start/wizard.md +0 -77
  246. package/docs/logging.md +0 -350
  247. package/docs/nav-tabs-underline.js +0 -100
  248. package/docs/network.md +0 -54
  249. package/docs/nodes/audio.md +0 -133
  250. package/docs/nodes/camera.md +0 -156
  251. package/docs/nodes/images.md +0 -72
  252. package/docs/nodes/index.md +0 -342
  253. package/docs/nodes/location-command.md +0 -113
  254. package/docs/nodes/media-understanding.md +0 -379
  255. package/docs/nodes/talk.md +0 -90
  256. package/docs/nodes/troubleshooting.md +0 -112
  257. package/docs/nodes/voicewake.md +0 -65
  258. package/docs/perplexity.md +0 -80
  259. package/docs/phase-6.5-pre-flight-audit.md +0 -268
  260. package/docs/pi-dev.md +0 -70
  261. package/docs/pi.md +0 -610
  262. package/docs/platforms/android.md +0 -151
  263. package/docs/platforms/digitalocean.md +0 -265
  264. package/docs/platforms/index.md +0 -53
  265. package/docs/platforms/ios.md +0 -108
  266. package/docs/platforms/linux.md +0 -94
  267. package/docs/platforms/mac/bundled-gateway.md +0 -73
  268. package/docs/platforms/mac/canvas.md +0 -125
  269. package/docs/platforms/mac/child-process.md +0 -69
  270. package/docs/platforms/mac/dev-setup.md +0 -104
  271. package/docs/platforms/mac/health.md +0 -34
  272. package/docs/platforms/mac/icon.md +0 -31
  273. package/docs/platforms/mac/logging.md +0 -57
  274. package/docs/platforms/mac/menu-bar.md +0 -81
  275. package/docs/platforms/mac/peekaboo.md +0 -65
  276. package/docs/platforms/mac/permissions.md +0 -50
  277. package/docs/platforms/mac/release.md +0 -85
  278. package/docs/platforms/mac/remote.md +0 -84
  279. package/docs/platforms/mac/signing.md +0 -47
  280. package/docs/platforms/mac/skills.md +0 -33
  281. package/docs/platforms/mac/voice-overlay.md +0 -60
  282. package/docs/platforms/mac/voicewake.md +0 -66
  283. package/docs/platforms/mac/webchat.md +0 -43
  284. package/docs/platforms/mac/xpc.md +0 -61
  285. package/docs/platforms/macos.md +0 -204
  286. package/docs/platforms/oracle.md +0 -303
  287. package/docs/platforms/raspberry-pi.md +0 -358
  288. package/docs/platforms/windows.md +0 -159
  289. package/docs/plugins/agent-tools.md +0 -99
  290. package/docs/plugins/community.md +0 -44
  291. package/docs/plugins/manifest.md +0 -71
  292. package/docs/plugins/voice-call.md +0 -322
  293. package/docs/plugins/zalouser.md +0 -81
  294. package/docs/prose.md +0 -134
  295. package/docs/providers/anthropic.md +0 -174
  296. package/docs/providers/bedrock.md +0 -176
  297. package/docs/providers/claude-max-api-proxy.md +0 -148
  298. package/docs/providers/cloudflare-ai-gateway.md +0 -71
  299. package/docs/providers/deepgram.md +0 -93
  300. package/docs/providers/github-copilot.md +0 -72
  301. package/docs/providers/glm.md +0 -33
  302. package/docs/providers/huggingface.md +0 -209
  303. package/docs/providers/index.md +0 -67
  304. package/docs/providers/litellm.md +0 -153
  305. package/docs/providers/minimax.md +0 -208
  306. package/docs/providers/models.md +0 -52
  307. package/docs/providers/moonshot.md +0 -142
  308. package/docs/providers/nvidia.md +0 -55
  309. package/docs/providers/ollama.md +0 -250
  310. package/docs/providers/openai.md +0 -62
  311. package/docs/providers/opencode.md +0 -36
  312. package/docs/providers/openrouter.md +0 -37
  313. package/docs/providers/qianfan.md +0 -38
  314. package/docs/providers/qwen.md +0 -53
  315. package/docs/providers/synthetic.md +0 -99
  316. package/docs/providers/together.md +0 -65
  317. package/docs/providers/venice.md +0 -267
  318. package/docs/providers/vercel-ai-gateway.md +0 -50
  319. package/docs/providers/vllm.md +0 -92
  320. package/docs/providers/xiaomi.md +0 -64
  321. package/docs/providers/zai.md +0 -38
  322. package/docs/refactor/exec-host.md +0 -316
  323. package/docs/refactor/outbound-session-mirroring.md +0 -83
  324. package/docs/refactor/plugin-sdk.md +0 -214
  325. package/docs/refactor/strict-config.md +0 -93
  326. package/docs/refactor/syminet.md +0 -417
  327. package/docs/reference/AGENTS.default.md +0 -123
  328. package/docs/reference/RELEASING.md +0 -120
  329. package/docs/reference/api-usage-costs.md +0 -138
  330. package/docs/reference/credits.md +0 -28
  331. package/docs/reference/device-models.md +0 -47
  332. package/docs/reference/rpc.md +0 -43
  333. package/docs/reference/session-management-compaction.md +0 -284
  334. package/docs/reference/test.md +0 -51
  335. package/docs/reference/token-use.md +0 -136
  336. package/docs/reference/transcript-hygiene.md +0 -151
  337. package/docs/reference/wizard.md +0 -265
  338. package/docs/security/CONTRIBUTING-THREAT-MODEL.md +0 -89
  339. package/docs/security/README.md +0 -16
  340. package/docs/security/THREAT-MODEL-ATLAS.md +0 -600
  341. package/docs/security/formal-verification.md +0 -164
  342. package/docs/start/bootstrapping.md +0 -41
  343. package/docs/start/docs-directory.md +0 -63
  344. package/docs/start/getting-started.md +0 -135
  345. package/docs/start/hubs.md +0 -196
  346. package/docs/start/lore.md +0 -216
  347. package/docs/start/onboarding-overview.md +0 -51
  348. package/docs/start/onboarding.md +0 -81
  349. package/docs/start/quickstart.md +0 -22
  350. package/docs/start/setup.md +0 -160
  351. package/docs/start/showcase.md +0 -414
  352. package/docs/start/symi.md +0 -211
  353. package/docs/start/wizard-cli-automation.md +0 -158
  354. package/docs/start/wizard-cli-reference.md +0 -255
  355. package/docs/start/wizard.md +0 -109
  356. package/docs/style.css +0 -37
  357. package/docs/tools/agent-send.md +0 -52
  358. package/docs/tools/apply-patch.md +0 -51
  359. package/docs/tools/browser-linux-troubleshooting.md +0 -139
  360. package/docs/tools/browser-login.md +0 -67
  361. package/docs/tools/browser.md +0 -587
  362. package/docs/tools/chrome-extension.md +0 -183
  363. package/docs/tools/creating-skills.md +0 -54
  364. package/docs/tools/elevated.md +0 -55
  365. package/docs/tools/exec-approvals.md +0 -261
  366. package/docs/tools/exec.md +0 -184
  367. package/docs/tools/firecrawl.md +0 -61
  368. package/docs/tools/index.md +0 -540
  369. package/docs/tools/llm-task.md +0 -115
  370. package/docs/tools/loop-detection.md +0 -98
  371. package/docs/tools/multi-agent-sandbox-tools.md +0 -396
  372. package/docs/tools/pipeline.md +0 -340
  373. package/docs/tools/plugin.md +0 -687
  374. package/docs/tools/reactions.md +0 -21
  375. package/docs/tools/skills-config.md +0 -76
  376. package/docs/tools/skills.md +0 -300
  377. package/docs/tools/slash-commands.md +0 -202
  378. package/docs/tools/subagents.md +0 -232
  379. package/docs/tools/symihub.md +0 -256
  380. package/docs/tools/thinking.md +0 -75
  381. package/docs/tools/web.md +0 -265
  382. package/docs/tts.md +0 -398
  383. package/docs/vps.md +0 -43
  384. package/docs/web/control-ui.md +0 -247
  385. package/docs/web/dashboard.md +0 -46
  386. package/docs/web/index.md +0 -118
  387. package/docs/web/tui.md +0 -162
  388. package/docs/web/webchat.md +0 -53
  389. package/docs/whatsapp-symi-ai-zh.jpg +0 -0
  390. package/docs/whatsapp-symi.jpg +0 -0
  391. package/docs/zh-CN/AGENTS.md +0 -59
  392. package/docs/zh-CN/automation/auth-monitoring.md +0 -47
  393. package/docs/zh-CN/automation/cron-jobs.md +0 -422
  394. package/docs/zh-CN/automation/cron-vs-heartbeat.md +0 -286
  395. package/docs/zh-CN/automation/gmail-pubsub.md +0 -249
  396. package/docs/zh-CN/automation/hooks.md +0 -881
  397. package/docs/zh-CN/automation/poll.md +0 -68
  398. package/docs/zh-CN/automation/troubleshooting.md +0 -8
  399. package/docs/zh-CN/automation/webhook.md +0 -161
  400. package/docs/zh-CN/brave-search.md +0 -48
  401. package/docs/zh-CN/channels/bluebubbles.md +0 -271
  402. package/docs/zh-CN/channels/broadcast-groups.md +0 -448
  403. package/docs/zh-CN/channels/channel-routing.md +0 -112
  404. package/docs/zh-CN/channels/feishu.md +0 -629
  405. package/docs/zh-CN/channels/googlechat.md +0 -257
  406. package/docs/zh-CN/channels/grammy.md +0 -38
  407. package/docs/zh-CN/channels/group-messages.md +0 -89
  408. package/docs/zh-CN/channels/groups.md +0 -369
  409. package/docs/zh-CN/channels/imessage.md +0 -300
  410. package/docs/zh-CN/channels/index.md +0 -52
  411. package/docs/zh-CN/channels/line.md +0 -180
  412. package/docs/zh-CN/channels/location.md +0 -63
  413. package/docs/zh-CN/channels/matrix.md +0 -221
  414. package/docs/zh-CN/channels/mattermost.md +0 -144
  415. package/docs/zh-CN/channels/msteams.md +0 -773
  416. package/docs/zh-CN/channels/nextcloud-talk.md +0 -142
  417. package/docs/zh-CN/channels/nostr.md +0 -240
  418. package/docs/zh-CN/channels/pairing.md +0 -86
  419. package/docs/zh-CN/channels/signal.md +0 -207
  420. package/docs/zh-CN/channels/slack.md +0 -529
  421. package/docs/zh-CN/channels/telegram.md +0 -748
  422. package/docs/zh-CN/channels/tlon.md +0 -136
  423. package/docs/zh-CN/channels/troubleshooting.md +0 -34
  424. package/docs/zh-CN/channels/twitch.md +0 -385
  425. package/docs/zh-CN/channels/whatsapp.md +0 -411
  426. package/docs/zh-CN/channels/zalo.md +0 -196
  427. package/docs/zh-CN/channels/zalouser.md +0 -147
  428. package/docs/zh-CN/cli/acp.md +0 -173
  429. package/docs/zh-CN/cli/agent.md +0 -30
  430. package/docs/zh-CN/cli/agents.md +0 -82
  431. package/docs/zh-CN/cli/approvals.md +0 -57
  432. package/docs/zh-CN/cli/browser.md +0 -114
  433. package/docs/zh-CN/cli/channels.md +0 -80
  434. package/docs/zh-CN/cli/config.md +0 -57
  435. package/docs/zh-CN/cli/configure.md +0 -37
  436. package/docs/zh-CN/cli/cron.md +0 -43
  437. package/docs/zh-CN/cli/dashboard.md +0 -23
  438. package/docs/zh-CN/cli/devices.md +0 -74
  439. package/docs/zh-CN/cli/directory.md +0 -69
  440. package/docs/zh-CN/cli/dns.md +0 -30
  441. package/docs/zh-CN/cli/docs.md +0 -22
  442. package/docs/zh-CN/cli/doctor.md +0 -48
  443. package/docs/zh-CN/cli/gateway.md +0 -206
  444. package/docs/zh-CN/cli/health.md +0 -28
  445. package/docs/zh-CN/cli/hooks.md +0 -298
  446. package/docs/zh-CN/cli/index.md +0 -1025
  447. package/docs/zh-CN/cli/logs.md +0 -31
  448. package/docs/zh-CN/cli/memory.md +0 -52
  449. package/docs/zh-CN/cli/message.md +0 -205
  450. package/docs/zh-CN/cli/models.md +0 -85
  451. package/docs/zh-CN/cli/node.md +0 -115
  452. package/docs/zh-CN/cli/nodes.md +0 -80
  453. package/docs/zh-CN/cli/onboard.md +0 -36
  454. package/docs/zh-CN/cli/pairing.md +0 -28
  455. package/docs/zh-CN/cli/plugins.md +0 -66
  456. package/docs/zh-CN/cli/reset.md +0 -24
  457. package/docs/zh-CN/cli/sandbox.md +0 -158
  458. package/docs/zh-CN/cli/security.md +0 -33
  459. package/docs/zh-CN/cli/sessions.md +0 -23
  460. package/docs/zh-CN/cli/setup.md +0 -36
  461. package/docs/zh-CN/cli/skills.md +0 -33
  462. package/docs/zh-CN/cli/status.md +0 -32
  463. package/docs/zh-CN/cli/system.md +0 -63
  464. package/docs/zh-CN/cli/tui.md +0 -30
  465. package/docs/zh-CN/cli/uninstall.md +0 -24
  466. package/docs/zh-CN/cli/update.md +0 -101
  467. package/docs/zh-CN/cli/voicecall.md +0 -41
  468. package/docs/zh-CN/cli/webhooks.md +0 -32
  469. package/docs/zh-CN/concepts/agent-loop.md +0 -146
  470. package/docs/zh-CN/concepts/agent-workspace.md +0 -219
  471. package/docs/zh-CN/concepts/agent.md +0 -115
  472. package/docs/zh-CN/concepts/architecture.md +0 -122
  473. package/docs/zh-CN/concepts/compaction.md +0 -67
  474. package/docs/zh-CN/concepts/context.md +0 -168
  475. package/docs/zh-CN/concepts/features.md +0 -57
  476. package/docs/zh-CN/concepts/markdown-formatting.md +0 -115
  477. package/docs/zh-CN/concepts/memory.md +0 -412
  478. package/docs/zh-CN/concepts/messages.md +0 -140
  479. package/docs/zh-CN/concepts/model-failover.md +0 -145
  480. package/docs/zh-CN/concepts/model-providers.md +0 -320
  481. package/docs/zh-CN/concepts/models.md +0 -196
  482. package/docs/zh-CN/concepts/multi-agent.md +0 -371
  483. package/docs/zh-CN/concepts/oauth.md +0 -151
  484. package/docs/zh-CN/concepts/presence.md +0 -99
  485. package/docs/zh-CN/concepts/queue.md +0 -91
  486. package/docs/zh-CN/concepts/retry.md +0 -71
  487. package/docs/zh-CN/concepts/session-pruning.md +0 -129
  488. package/docs/zh-CN/concepts/session-tool.md +0 -198
  489. package/docs/zh-CN/concepts/session.md +0 -158
  490. package/docs/zh-CN/concepts/sessions.md +0 -17
  491. package/docs/zh-CN/concepts/streaming.md +0 -131
  492. package/docs/zh-CN/concepts/system-prompt.md +0 -99
  493. package/docs/zh-CN/concepts/timezone.md +0 -94
  494. package/docs/zh-CN/concepts/typebox.md +0 -284
  495. package/docs/zh-CN/concepts/typing-indicators.md +0 -74
  496. package/docs/zh-CN/concepts/usage-tracking.md +0 -42
  497. package/docs/zh-CN/date-time.md +0 -128
  498. package/docs/zh-CN/debug/node-issue.md +0 -90
  499. package/docs/zh-CN/diagnostics/flags.md +0 -98
  500. package/docs/zh-CN/experiments/onboarding-config-protocol.md +0 -47
  501. package/docs/zh-CN/experiments/plans/cron-add-hardening.md +0 -69
  502. package/docs/zh-CN/experiments/plans/group-policy-hardening.md +0 -45
  503. package/docs/zh-CN/experiments/plans/openresponses-gateway.md +0 -121
  504. package/docs/zh-CN/experiments/proposals/model-config.md +0 -42
  505. package/docs/zh-CN/experiments/research/memory.md +0 -235
  506. package/docs/zh-CN/gateway/authentication.md +0 -142
  507. package/docs/zh-CN/gateway/background-process.md +0 -100
  508. package/docs/zh-CN/gateway/bonjour.md +0 -174
  509. package/docs/zh-CN/gateway/bridge-protocol.md +0 -86
  510. package/docs/zh-CN/gateway/cli-backends.md +0 -213
  511. package/docs/zh-CN/gateway/configuration-examples.md +0 -580
  512. package/docs/zh-CN/gateway/configuration.md +0 -3284
  513. package/docs/zh-CN/gateway/discovery.md +0 -123
  514. package/docs/zh-CN/gateway/doctor.md +0 -238
  515. package/docs/zh-CN/gateway/gateway-lock.md +0 -41
  516. package/docs/zh-CN/gateway/health.md +0 -42
  517. package/docs/zh-CN/gateway/heartbeat.md +0 -272
  518. package/docs/zh-CN/gateway/index.md +0 -335
  519. package/docs/zh-CN/gateway/local-models.md +0 -157
  520. package/docs/zh-CN/gateway/logging.md +0 -114
  521. package/docs/zh-CN/gateway/multiple-gateways.md +0 -119
  522. package/docs/zh-CN/gateway/network-model.md +0 -23
  523. package/docs/zh-CN/gateway/openai-http-api.md +0 -125
  524. package/docs/zh-CN/gateway/openresponses-http-api.md +0 -317
  525. package/docs/zh-CN/gateway/pairing.md +0 -99
  526. package/docs/zh-CN/gateway/protocol.md +0 -220
  527. package/docs/zh-CN/gateway/remote-gateway-readme.md +0 -164
  528. package/docs/zh-CN/gateway/remote.md +0 -133
  529. package/docs/zh-CN/gateway/sandbox-vs-tool-policy-vs-elevated.md +0 -135
  530. package/docs/zh-CN/gateway/sandboxing.md +0 -188
  531. package/docs/zh-CN/gateway/security/index.md +0 -772
  532. package/docs/zh-CN/gateway/tailscale.md +0 -124
  533. package/docs/zh-CN/gateway/tools-invoke-http-api.md +0 -92
  534. package/docs/zh-CN/gateway/troubleshooting.md +0 -758
  535. package/docs/zh-CN/help/debugging.md +0 -160
  536. package/docs/zh-CN/help/environment.md +0 -88
  537. package/docs/zh-CN/help/faq.md +0 -2613
  538. package/docs/zh-CN/help/index.md +0 -28
  539. package/docs/zh-CN/help/scripts.md +0 -35
  540. package/docs/zh-CN/help/testing.md +0 -375
  541. package/docs/zh-CN/help/troubleshooting.md +0 -104
  542. package/docs/zh-CN/index.md +0 -183
  543. package/docs/zh-CN/install/ansible.md +0 -214
  544. package/docs/zh-CN/install/bun.md +0 -65
  545. package/docs/zh-CN/install/development-channels.md +0 -81
  546. package/docs/zh-CN/install/docker.md +0 -525
  547. package/docs/zh-CN/install/exe-dev.md +0 -127
  548. package/docs/zh-CN/install/fly.md +0 -476
  549. package/docs/zh-CN/install/gcp.md +0 -509
  550. package/docs/zh-CN/install/hetzner.md +0 -336
  551. package/docs/zh-CN/install/index.md +0 -193
  552. package/docs/zh-CN/install/installer.md +0 -128
  553. package/docs/zh-CN/install/macos-vm.md +0 -288
  554. package/docs/zh-CN/install/migrating.md +0 -199
  555. package/docs/zh-CN/install/nix.md +0 -99
  556. package/docs/zh-CN/install/node.md +0 -8
  557. package/docs/zh-CN/install/northflank.mdx +0 -56
  558. package/docs/zh-CN/install/railway.mdx +0 -102
  559. package/docs/zh-CN/install/render.mdx +0 -168
  560. package/docs/zh-CN/install/uninstall.md +0 -135
  561. package/docs/zh-CN/install/updating.md +0 -233
  562. package/docs/zh-CN/logging.md +0 -329
  563. package/docs/zh-CN/network.md +0 -59
  564. package/docs/zh-CN/nodes/audio.md +0 -120
  565. package/docs/zh-CN/nodes/camera.md +0 -162
  566. package/docs/zh-CN/nodes/images.md +0 -79
  567. package/docs/zh-CN/nodes/index.md +0 -348
  568. package/docs/zh-CN/nodes/location-command.md +0 -120
  569. package/docs/zh-CN/nodes/media-understanding.md +0 -380
  570. package/docs/zh-CN/nodes/talk.md +0 -97
  571. package/docs/zh-CN/nodes/troubleshooting.md +0 -8
  572. package/docs/zh-CN/nodes/voicewake.md +0 -72
  573. package/docs/zh-CN/perplexity.md +0 -84
  574. package/docs/zh-CN/pi-dev.md +0 -77
  575. package/docs/zh-CN/pi.md +0 -617
  576. package/docs/zh-CN/platforms/android.md +0 -155
  577. package/docs/zh-CN/platforms/digitalocean.md +0 -268
  578. package/docs/zh-CN/platforms/index.md +0 -60
  579. package/docs/zh-CN/platforms/ios.md +0 -114
  580. package/docs/zh-CN/platforms/linux.md +0 -101
  581. package/docs/zh-CN/platforms/mac/bundled-gateway.md +0 -75
  582. package/docs/zh-CN/platforms/mac/canvas.md +0 -128
  583. package/docs/zh-CN/platforms/mac/child-process.md +0 -73
  584. package/docs/zh-CN/platforms/mac/dev-setup.md +0 -109
  585. package/docs/zh-CN/platforms/mac/health.md +0 -41
  586. package/docs/zh-CN/platforms/mac/icon.md +0 -38
  587. package/docs/zh-CN/platforms/mac/logging.md +0 -64
  588. package/docs/zh-CN/platforms/mac/menu-bar.md +0 -88
  589. package/docs/zh-CN/platforms/mac/peekaboo.md +0 -62
  590. package/docs/zh-CN/platforms/mac/permissions.md +0 -46
  591. package/docs/zh-CN/platforms/mac/release.md +0 -92
  592. package/docs/zh-CN/platforms/mac/remote.md +0 -90
  593. package/docs/zh-CN/platforms/mac/signing.md +0 -54
  594. package/docs/zh-CN/platforms/mac/skills.md +0 -40
  595. package/docs/zh-CN/platforms/mac/voice-overlay.md +0 -67
  596. package/docs/zh-CN/platforms/mac/voicewake.md +0 -73
  597. package/docs/zh-CN/platforms/mac/webchat.md +0 -43
  598. package/docs/zh-CN/platforms/mac/xpc.md +0 -68
  599. package/docs/zh-CN/platforms/macos.md +0 -193
  600. package/docs/zh-CN/platforms/oracle.md +0 -310
  601. package/docs/zh-CN/platforms/raspberry-pi.md +0 -365
  602. package/docs/zh-CN/platforms/windows.md +0 -156
  603. package/docs/zh-CN/plugins/agent-tools.md +0 -99
  604. package/docs/zh-CN/plugins/manifest.md +0 -68
  605. package/docs/zh-CN/plugins/voice-call.md +0 -250
  606. package/docs/zh-CN/plugins/zalouser.md +0 -88
  607. package/docs/zh-CN/prose.md +0 -141
  608. package/docs/zh-CN/providers/anthropic.md +0 -159
  609. package/docs/zh-CN/providers/bedrock.md +0 -170
  610. package/docs/zh-CN/providers/claude-max-api-proxy.md +0 -155
  611. package/docs/zh-CN/providers/deepgram.md +0 -97
  612. package/docs/zh-CN/providers/github-copilot.md +0 -67
  613. package/docs/zh-CN/providers/glm.md +0 -39
  614. package/docs/zh-CN/providers/index.md +0 -66
  615. package/docs/zh-CN/providers/minimax.md +0 -206
  616. package/docs/zh-CN/providers/models.md +0 -55
  617. package/docs/zh-CN/providers/moonshot.md +0 -145
  618. package/docs/zh-CN/providers/ollama.md +0 -230
  619. package/docs/zh-CN/providers/openai.md +0 -68
  620. package/docs/zh-CN/providers/opencode.md +0 -41
  621. package/docs/zh-CN/providers/openrouter.md +0 -43
  622. package/docs/zh-CN/providers/qianfan.md +0 -8
  623. package/docs/zh-CN/providers/qwen.md +0 -55
  624. package/docs/zh-CN/providers/synthetic.md +0 -102
  625. package/docs/zh-CN/providers/venice.md +0 -274
  626. package/docs/zh-CN/providers/vercel-ai-gateway.md +0 -57
  627. package/docs/zh-CN/providers/xiaomi.md +0 -68
  628. package/docs/zh-CN/providers/zai.md +0 -41
  629. package/docs/zh-CN/refactor/exec-host.md +0 -323
  630. package/docs/zh-CN/refactor/outbound-session-mirroring.md +0 -90
  631. package/docs/zh-CN/refactor/plugin-sdk.md +0 -221
  632. package/docs/zh-CN/refactor/strict-config.md +0 -100
  633. package/docs/zh-CN/refactor/syminet.md +0 -424
  634. package/docs/zh-CN/reference/AGENTS.default.md +0 -130
  635. package/docs/zh-CN/reference/RELEASING.md +0 -122
  636. package/docs/zh-CN/reference/api-usage-costs.md +0 -136
  637. package/docs/zh-CN/reference/credits.md +0 -34
  638. package/docs/zh-CN/reference/device-models.md +0 -54
  639. package/docs/zh-CN/reference/rpc.md +0 -48
  640. package/docs/zh-CN/reference/session-management-compaction.md +0 -286
  641. package/docs/zh-CN/reference/templates/AGENTS.dev.md +0 -89
  642. package/docs/zh-CN/reference/templates/AGENTS.md +0 -234
  643. package/docs/zh-CN/reference/templates/BOOT.md +0 -17
  644. package/docs/zh-CN/reference/templates/BOOTSTRAP.md +0 -68
  645. package/docs/zh-CN/reference/templates/IDENTITY.dev.md +0 -54
  646. package/docs/zh-CN/reference/templates/IDENTITY.md +0 -36
  647. package/docs/zh-CN/reference/templates/SYMICORE.dev.md +0 -83
  648. package/docs/zh-CN/reference/templates/SYMICORE.md +0 -49
  649. package/docs/zh-CN/reference/templates/SYMIPULSE.md +0 -69
  650. package/docs/zh-CN/reference/templates/TOOLS.dev.md +0 -31
  651. package/docs/zh-CN/reference/templates/TOOLS.md +0 -53
  652. package/docs/zh-CN/reference/templates/USER.dev.md +0 -25
  653. package/docs/zh-CN/reference/templates/USER.md +0 -30
  654. package/docs/zh-CN/reference/test.md +0 -57
  655. package/docs/zh-CN/reference/token-use.md +0 -119
  656. package/docs/zh-CN/reference/transcript-hygiene.md +0 -109
  657. package/docs/zh-CN/reference/wizard.md +0 -9
  658. package/docs/zh-CN/security/formal-verification.md +0 -171
  659. package/docs/zh-CN/start/bootstrapping.md +0 -9
  660. package/docs/zh-CN/start/docs-directory.md +0 -69
  661. package/docs/zh-CN/start/getting-started.md +0 -201
  662. package/docs/zh-CN/start/hubs.md +0 -199
  663. package/docs/zh-CN/start/lore.md +0 -223
  664. package/docs/zh-CN/start/onboarding.md +0 -105
  665. package/docs/zh-CN/start/quickstart.md +0 -88
  666. package/docs/zh-CN/start/setup.md +0 -151
  667. package/docs/zh-CN/start/showcase.md +0 -421
  668. package/docs/zh-CN/start/symi.md +0 -244
  669. package/docs/zh-CN/start/wizard.md +0 -326
  670. package/docs/zh-CN/tools/agent-send.md +0 -58
  671. package/docs/zh-CN/tools/apply-patch.md +0 -57
  672. package/docs/zh-CN/tools/browser-linux-troubleshooting.md +0 -144
  673. package/docs/zh-CN/tools/browser-login.md +0 -75
  674. package/docs/zh-CN/tools/browser.md +0 -553
  675. package/docs/zh-CN/tools/chrome-extension.md +0 -183
  676. package/docs/zh-CN/tools/creating-skills.md +0 -61
  677. package/docs/zh-CN/tools/elevated.md +0 -62
  678. package/docs/zh-CN/tools/exec-approvals.md +0 -233
  679. package/docs/zh-CN/tools/exec.md +0 -169
  680. package/docs/zh-CN/tools/firecrawl.md +0 -68
  681. package/docs/zh-CN/tools/index.md +0 -508
  682. package/docs/zh-CN/tools/llm-task.md +0 -117
  683. package/docs/zh-CN/tools/multi-agent-sandbox-tools.md +0 -400
  684. package/docs/zh-CN/tools/pipeline.md +0 -349
  685. package/docs/zh-CN/tools/plugin.md +0 -639
  686. package/docs/zh-CN/tools/reactions.md +0 -28
  687. package/docs/zh-CN/tools/skills-config.md +0 -78
  688. package/docs/zh-CN/tools/skills.md +0 -279
  689. package/docs/zh-CN/tools/slash-commands.md +0 -196
  690. package/docs/zh-CN/tools/subagents.md +0 -167
  691. package/docs/zh-CN/tools/symihub.md +0 -209
  692. package/docs/zh-CN/tools/thinking.md +0 -80
  693. package/docs/zh-CN/tools/web.md +0 -257
  694. package/docs/zh-CN/tts.md +0 -373
  695. package/docs/zh-CN/vps.md +0 -47
  696. package/docs/zh-CN/web/control-ui.md +0 -190
  697. package/docs/zh-CN/web/dashboard.md +0 -53
  698. package/docs/zh-CN/web/index.md +0 -118
  699. package/docs/zh-CN/web/tui.md +0 -166
  700. package/docs/zh-CN/web/webchat.md +0 -56
  701. package/extensions/imessage/index.ts +0 -17
  702. package/extensions/imessage/node_modules/.bin/symi +0 -21
  703. package/extensions/imessage/package.json +0 -15
  704. package/extensions/imessage/src/channel.outbound.test.ts +0 -66
  705. package/extensions/imessage/src/channel.ts +0 -298
  706. package/extensions/imessage/src/runtime.ts +0 -14
  707. package/extensions/imessage/symi.plugin.json +0 -9
  708. package/extensions/line/index.ts +0 -19
  709. package/extensions/line/node_modules/.bin/symi +0 -21
  710. package/extensions/line/package.json +0 -30
  711. package/extensions/line/src/card-command.ts +0 -344
  712. package/extensions/line/src/channel.logout.test.ts +0 -133
  713. package/extensions/line/src/channel.sendPayload.test.ts +0 -312
  714. package/extensions/line/src/channel.startup.test.ts +0 -133
  715. package/extensions/line/src/channel.ts +0 -801
  716. package/extensions/line/src/runtime.ts +0 -14
  717. package/extensions/line/symi.plugin.json +0 -9
  718. package/extensions/signal/index.ts +0 -17
  719. package/extensions/signal/node_modules/.bin/symi +0 -21
  720. package/extensions/signal/package.json +0 -15
  721. package/extensions/signal/src/channel.ts +0 -302
  722. package/extensions/signal/src/runtime.ts +0 -14
  723. package/extensions/signal/symi.plugin.json +0 -9
  724. package/extensions/telegram/index.ts +0 -17
  725. package/extensions/telegram/node_modules/.bin/symi +0 -21
  726. package/extensions/telegram/package.json +0 -15
  727. package/extensions/telegram/src/channel.test.ts +0 -125
  728. package/extensions/telegram/src/channel.ts +0 -560
  729. package/extensions/telegram/src/runtime.ts +0 -14
  730. package/extensions/telegram/symi.plugin.json +0 -9
  731. package/extensions/whatsapp/index.ts +0 -17
  732. package/extensions/whatsapp/node_modules/.bin/symi +0 -21
  733. package/extensions/whatsapp/package.json +0 -15
  734. package/extensions/whatsapp/src/channel.ts +0 -465
  735. package/extensions/whatsapp/src/resolve-target.test.ts +0 -170
  736. package/extensions/whatsapp/src/runtime.ts +0 -14
  737. package/extensions/whatsapp/symi.plugin.json +0 -9
@@ -1,2465 +0,0 @@
1
- ---
2
- title: "Configuration Reference"
3
- description: "Complete field-by-field reference for ~/.symi/symi.json"
4
- ---
5
-
6
- # Configuration Reference
7
-
8
- Every field available in `~/.symi/symi.json`. For a task-oriented overview, see [Configuration](/gateway/configuration).
9
-
10
- Config format is **JSON5** (comments + trailing commas allowed). All fields are optional — Symi uses safe defaults when omitted.
11
-
12
- ---
13
-
14
- ## Channels
15
-
16
- Each channel starts automatically when its config section exists (unless `enabled: false`).
17
-
18
- ### DM and group access
19
-
20
- All channels support DM policies and group policies:
21
-
22
- | DM policy | Behavior |
23
- | ------------------- | --------------------------------------------------------------- |
24
- | `pairing` (default) | Unknown senders get a one-time pairing code; owner must approve |
25
- | `allowlist` | Only senders in `allowFrom` (or paired allow store) |
26
- | `open` | Allow all inbound DMs (requires `allowFrom: ["*"]`) |
27
- | `disabled` | Ignore all inbound DMs |
28
-
29
- | Group policy | Behavior |
30
- | --------------------- | ------------------------------------------------------ |
31
- | `allowlist` (default) | Only groups matching the configured allowlist |
32
- | `open` | Bypass group allowlists (mention-gating still applies) |
33
- | `disabled` | Block all group/room messages |
34
-
35
- <Note>
36
- `channels.defaults.groupPolicy` sets the default when a provider's `groupPolicy` is unset.
37
- Pairing codes expire after 1 hour. Pending DM pairing requests are capped at **3 per channel**.
38
- </Note>
39
-
40
- ### Channel model overrides
41
-
42
- Use `channels.modelByChannel` to pin specific channel IDs to a model. Values accept `provider/model` or configured model aliases. The channel mapping applies when a session does not already have a model override (for example, set via `/model`).
43
-
44
- ```json5
45
- {
46
- channels: {
47
- modelByChannel: {
48
- "123456789012345678": "anthropic/claude-opus-4-6",
49
- },
50
- slack: {
51
- C1234567890: "openai/gpt-4.1",
52
- },
53
- telegram: {
54
- "-1001234567890": "openai/gpt-4.1-mini",
55
- "-1001234567890:topic:99": "anthropic/claude-sonnet-4-6",
56
- },
57
- },
58
- },
59
- }
60
- ```
61
-
62
- ### WhatsApp
63
-
64
- WhatsApp runs through the gateway's web channel (Baileys Web). It starts automatically when a linked session exists.
65
-
66
- ```json5
67
- {
68
- channels: {
69
- whatsapp: {
70
- dmPolicy: "pairing", // pairing | allowlist | open | disabled
71
- allowFrom: ["+15555550123", "+447700900123"],
72
- textChunkLimit: 4000,
73
- chunkMode: "length", // length | newline
74
- mediaMaxMb: 50,
75
- sendReadReceipts: true, // blue ticks (false in self-chat mode)
76
- groups: {
77
- "*": { requireMention: true },
78
- },
79
- groupPolicy: "allowlist",
80
- groupAllowFrom: ["+15551234567"],
81
- },
82
- },
83
- web: {
84
- enabled: true,
85
- heartbeatSeconds: 60,
86
- reconnect: {
87
- initialMs: 2000,
88
- maxMs: 120000,
89
- factor: 1.4,
90
- jitter: 0.2,
91
- maxAttempts: 0,
92
- },
93
- },
94
- }
95
- ```
96
-
97
- <Accordion title="Multi-account WhatsApp">
98
-
99
- ```json5
100
- {
101
- channels: {
102
- whatsapp: {
103
- accounts: {
104
- default: {},
105
- personal: {},
106
- biz: {
107
- // authDir: "~/.symi/credentials/whatsapp/biz",
108
- },
109
- },
110
- },
111
- },
112
- }
113
- ```
114
-
115
- - Outbound commands default to account `default` if present; otherwise the first configured account id (sorted).
116
- - Legacy single-account Baileys auth dir is migrated by `symi doctor` into `whatsapp/default`.
117
- - Per-account overrides: `channels.whatsapp.accounts.<id>.sendReadReceipts`, `channels.whatsapp.accounts.<id>.dmPolicy`, `channels.whatsapp.accounts.<id>.allowFrom`.
118
-
119
- </Accordion>
120
-
121
- ### Telegram
122
-
123
- ```json5
124
- {
125
- channels: {
126
- telegram: {
127
- enabled: true,
128
- botToken: "your-bot-token",
129
- dmPolicy: "pairing",
130
- allowFrom: ["tg:123456789"],
131
- groups: {
132
- "*": { requireMention: true },
133
- "-1001234567890": {
134
- allowFrom: ["@admin"],
135
- systemPrompt: "Keep answers brief.",
136
- topics: {
137
- "99": {
138
- requireMention: false,
139
- skills: ["search"],
140
- systemPrompt: "Stay on topic.",
141
- },
142
- },
143
- },
144
- },
145
- customCommands: [
146
- { command: "backup", description: "Git backup" },
147
- { command: "generate", description: "Create an image" },
148
- ],
149
- historyLimit: 50,
150
- replyToMode: "first", // off | first | all
151
- linkPreview: true,
152
- streaming: true, // live preview on/off (default true)
153
- actions: { reactions: true, sendMessage: true },
154
- reactionNotifications: "own", // off | own | all
155
- mediaMaxMb: 5,
156
- retry: {
157
- attempts: 3,
158
- minDelayMs: 400,
159
- maxDelayMs: 30000,
160
- jitter: 0.1,
161
- },
162
- network: { autoSelectFamily: false },
163
- proxy: "socks5://localhost:9050",
164
- webhookUrl: "https://example.com/telegram-webhook",
165
- webhookSecret: "secret",
166
- webhookPath: "/telegram-webhook",
167
- },
168
- },
169
- }
170
- ```
171
-
172
- - Bot token: `channels.telegram.botToken` or `channels.telegram.tokenFile`, with `TELEGRAM_BOT_TOKEN` as fallback for the default account.
173
- - `configWrites: false` blocks Telegram-initiated config writes (supergroup ID migrations, `/config set|unset`).
174
- - Telegram stream previews use `sendMessage` + `editMessageText` (works in direct and group chats).
175
- - Retry policy: see [Retry policy](/concepts/retry).
176
-
177
- ```json5
178
- {
179
- channels: {
180
- enabled: true,
181
- token: "your-bot-token",
182
- mediaMaxMb: 8,
183
- allowBots: false,
184
- actions: {
185
- reactions: true,
186
- stickers: true,
187
- polls: true,
188
- permissions: true,
189
- messages: true,
190
- threads: true,
191
- pins: true,
192
- search: true,
193
- memberInfo: true,
194
- roleInfo: true,
195
- roles: false,
196
- channelInfo: true,
197
- voiceStatus: true,
198
- events: true,
199
- moderation: false,
200
- },
201
- replyToMode: "off", // off | first | all
202
- dmPolicy: "pairing",
203
- allowFrom: ["1234567890", "steipete"],
204
- dm: { enabled: true, groupEnabled: false, groupChannels: ["symi-dm"] },
205
- guilds: {
206
- "123456789012345678": {
207
- slug: "friends-of-symi",
208
- requireMention: false,
209
- reactionNotifications: "own",
210
- users: ["987654321098765432"],
211
- channels: {
212
- general: { allow: true },
213
- help: {
214
- allow: true,
215
- requireMention: true,
216
- users: ["987654321098765432"],
217
- skills: ["docs"],
218
- systemPrompt: "Short answers only.",
219
- },
220
- },
221
- },
222
- },
223
- historyLimit: 20,
224
- textChunkLimit: 2000,
225
- chunkMode: "length", // length | newline
226
- maxLinesPerMessage: 17,
227
- ui: {
228
- components: {
229
- accentColor: "#5865F2",
230
- },
231
- },
232
- voice: {
233
- enabled: true,
234
- autoJoin: [
235
- {
236
- guildId: "123456789012345678",
237
- channelId: "234567890123456789",
238
- },
239
- ],
240
- tts: {
241
- provider: "openai",
242
- openai: { voice: "alloy" },
243
- },
244
- },
245
- retry: {
246
- attempts: 3,
247
- minDelayMs: 500,
248
- maxDelayMs: 30000,
249
- jitter: 0.1,
250
- },
251
- },
252
- },
253
- }
254
- ```
255
-
256
- - Use `user:<id>` (DM) or `channel:<id>` (guild channel) for delivery targets; bare numeric IDs are rejected.
257
- - Guild slugs are lowercase with spaces replaced by `-`; channel keys use the slugged name (no `#`). Prefer guild IDs.
258
- - Bot-authored messages are ignored by default. `allowBots: true` enables them (own messages still filtered).
259
- - `maxLinesPerMessage` (default 17) splits tall messages even when under 2000 chars.
260
-
261
- **Reaction notification modes:** `off` (none), `own` (bot's messages, default), `all` (all messages), `allowlist` (from `guilds.<id>.users` on all messages).
262
-
263
- ### Google Chat
264
-
265
- ```json5
266
- {
267
- channels: {
268
- googlechat: {
269
- enabled: true,
270
- serviceAccountFile: "/path/to/service-account.json",
271
- audienceType: "app-url", // app-url | project-number
272
- audience: "https://gateway.example.com/googlechat",
273
- webhookPath: "/googlechat",
274
- botUser: "users/1234567890",
275
- dm: {
276
- enabled: true,
277
- policy: "pairing",
278
- allowFrom: ["users/1234567890"],
279
- },
280
- groupPolicy: "allowlist",
281
- groups: {
282
- "spaces/AAAA": { allow: true, requireMention: true },
283
- },
284
- actions: { reactions: true },
285
- typingIndicator: "message",
286
- mediaMaxMb: 20,
287
- },
288
- },
289
- }
290
- ```
291
-
292
- - Service account JSON: inline (`serviceAccount`) or file-based (`serviceAccountFile`).
293
- - Env fallbacks: `GOOGLE_CHAT_SERVICE_ACCOUNT` or `GOOGLE_CHAT_SERVICE_ACCOUNT_FILE`.
294
- - Use `spaces/<spaceId>` or `users/<userId|email>` for delivery targets.
295
-
296
- ### Slack
297
-
298
- ```json5
299
- {
300
- channels: {
301
- slack: {
302
- enabled: true,
303
- botToken: "xoxb-...",
304
- appToken: "xapp-...",
305
- dmPolicy: "pairing",
306
- allowFrom: ["U123", "U456", "*"],
307
- dm: { enabled: true, groupEnabled: false, groupChannels: ["G123"] },
308
- channels: {
309
- C123: { allow: true, requireMention: true, allowBots: false },
310
- "#general": {
311
- allow: true,
312
- requireMention: true,
313
- allowBots: false,
314
- users: ["U123"],
315
- skills: ["docs"],
316
- systemPrompt: "Short answers only.",
317
- },
318
- },
319
- historyLimit: 50,
320
- allowBots: false,
321
- reactionNotifications: "own",
322
- reactionAllowlist: ["U123"],
323
- replyToMode: "off", // off | first | all
324
- thread: {
325
- historyScope: "thread", // thread | channel
326
- inheritParent: false,
327
- },
328
- actions: {
329
- reactions: true,
330
- messages: true,
331
- pins: true,
332
- memberInfo: true,
333
- emojiList: true,
334
- },
335
- slashCommand: {
336
- enabled: true,
337
- name: "symi",
338
- sessionPrefix: "slack:slash",
339
- ephemeral: true,
340
- },
341
- textChunkLimit: 4000,
342
- chunkMode: "length",
343
- mediaMaxMb: 20,
344
- },
345
- },
346
- }
347
- ```
348
-
349
- - **Socket mode** requires both `botToken` and `appToken` (`SLACK_BOT_TOKEN` + `SLACK_APP_TOKEN` for default account env fallback).
350
- - **HTTP mode** requires `botToken` plus `signingSecret` (at root or per-account).
351
- - `configWrites: false` blocks Slack-initiated config writes.
352
- - Use `user:<id>` (DM) or `channel:<id>` for delivery targets.
353
-
354
- **Reaction notification modes:** `off`, `own` (default), `all`, `allowlist` (from `reactionAllowlist`).
355
-
356
- **Thread session isolation:** `thread.historyScope` is per-thread (default) or shared across channel. `thread.inheritParent` copies parent channel transcript to new threads.
357
-
358
- | Action group | Default | Notes |
359
- | ------------ | ------- | ---------------------- |
360
- | reactions | enabled | React + list reactions |
361
- | messages | enabled | Read/send/edit/delete |
362
- | pins | enabled | Pin/unpin/list |
363
- | memberInfo | enabled | Member info |
364
- | emojiList | enabled | Custom emoji list |
365
-
366
- ### Mattermost
367
-
368
- Mattermost ships as a plugin: `symi plugins install @symi/mattermost`.
369
-
370
- ```json5
371
- {
372
- channels: {
373
- mattermost: {
374
- enabled: true,
375
- botToken: "mm-token",
376
- baseUrl: "https://chat.example.com",
377
- dmPolicy: "pairing",
378
- chatmode: "oncall", // oncall | onmessage | onchar
379
- oncharPrefixes: [">", "!"],
380
- textChunkLimit: 4000,
381
- chunkMode: "length",
382
- },
383
- },
384
- }
385
- ```
386
-
387
- Chat modes: `oncall` (respond on @-mention, default), `onmessage` (every message), `onchar` (messages starting with trigger prefix).
388
-
389
- ### Signal
390
-
391
- ```json5
392
- {
393
- channels: {
394
- signal: {
395
- reactionNotifications: "own", // off | own | all | allowlist
396
- reactionAllowlist: ["+15551234567", "uuid:123e4567-e89b-12d3-a456-426614174000"],
397
- historyLimit: 50,
398
- },
399
- },
400
- }
401
- ```
402
-
403
- **Reaction notification modes:** `off`, `own` (default), `all`, `allowlist` (from `reactionAllowlist`).
404
-
405
- ### iMessage
406
-
407
- Symi spawns `imsg rpc` (JSON-RPC over stdio). No daemon or port required.
408
-
409
- ```json5
410
- {
411
- channels: {
412
- imessage: {
413
- enabled: true,
414
- cliPath: "imsg",
415
- dbPath: "~/Library/Messages/chat.db",
416
- remoteHost: "user@gateway-host",
417
- dmPolicy: "pairing",
418
- allowFrom: ["+15555550123", "user@example.com", "chat_id:123"],
419
- historyLimit: 50,
420
- includeAttachments: false,
421
- attachmentRoots: ["/Users/*/Library/Messages/Attachments"],
422
- remoteAttachmentRoots: ["/Users/*/Library/Messages/Attachments"],
423
- mediaMaxMb: 16,
424
- service: "auto",
425
- region: "US",
426
- },
427
- },
428
- }
429
- ```
430
-
431
- - Requires Full Disk Access to the Messages DB.
432
- - Prefer `chat_id:<id>` targets. Use `imsg chats --limit 20` to list chats.
433
- - `cliPath` can point to an SSH wrapper; set `remoteHost` (`host` or `user@host`) for SCP attachment fetching.
434
- - `attachmentRoots` and `remoteAttachmentRoots` restrict inbound attachment paths (default: `/Users/*/Library/Messages/Attachments`).
435
- - SCP uses strict host-key checking, so ensure the relay host key already exists in `~/.ssh/known_hosts`.
436
-
437
- <Accordion title="iMessage SSH wrapper example">
438
-
439
- ```bash
440
- #!/usr/bin/env bash
441
- exec ssh -T gateway-host imsg "$@"
442
- ```
443
-
444
- </Accordion>
445
-
446
- ### Multi-account (all channels)
447
-
448
- Run multiple accounts per channel (each with its own `accountId`):
449
-
450
- ```json5
451
- {
452
- channels: {
453
- telegram: {
454
- accounts: {
455
- default: {
456
- name: "Primary bot",
457
- botToken: "123456:ABC...",
458
- },
459
- alerts: {
460
- name: "Alerts bot",
461
- botToken: "987654:XYZ...",
462
- },
463
- },
464
- },
465
- },
466
- }
467
- ```
468
-
469
- - `default` is used when `accountId` is omitted (CLI + routing).
470
- - Env tokens only apply to the **default** account.
471
- - Base channel settings apply to all accounts unless overridden per account.
472
- - Use `bindings[].match.accountId` to route each account to a different agent.
473
-
474
- ### Group chat mention gating
475
-
476
- **Mention types:**
477
-
478
- - **Metadata mentions**: Native platform @-mentions. Ignored in WhatsApp self-chat mode.
479
- - **Text patterns**: Regex patterns in `agents.list[].groupChat.mentionPatterns`. Always checked.
480
- - Mention gating is enforced only when detection is possible (native mentions or at least one pattern).
481
-
482
- ```json5
483
- {
484
- messages: {
485
- groupChat: { historyLimit: 50 },
486
- },
487
- agents: {
488
- list: [{ id: "main", groupChat: { mentionPatterns: ["@symi", "symi"] } }],
489
- },
490
- }
491
- ```
492
-
493
- `messages.groupChat.historyLimit` sets the global default. Channels can override with `channels.<channel>.historyLimit` (or per-account). Set `0` to disable.
494
-
495
- #### DM history limits
496
-
497
- ```json5
498
- {
499
- channels: {
500
- telegram: {
501
- dmHistoryLimit: 30,
502
- dms: {
503
- "123456789": { historyLimit: 50 },
504
- },
505
- },
506
- },
507
- }
508
- ```
509
-
510
- Resolution: per-DM override → provider default → no limit (all retained).
511
-
512
- #### Self-chat mode
513
-
514
- Include your own number in `allowFrom` to enable self-chat mode (ignores native @-mentions, only responds to text patterns):
515
-
516
- ```json5
517
- {
518
- channels: {
519
- whatsapp: {
520
- allowFrom: ["+15555550123"],
521
- groups: { "*": { requireMention: true } },
522
- },
523
- },
524
- agents: {
525
- list: [
526
- {
527
- id: "main",
528
- groupChat: { mentionPatterns: ["reisponde", "@symi"] },
529
- },
530
- ],
531
- },
532
- }
533
- ```
534
-
535
- ### Commands (chat command handling)
536
-
537
- ```json5
538
- {
539
- commands: {
540
- native: "auto", // register native commands when supported
541
- text: true, // parse /commands in chat messages
542
- bash: false, // allow ! (alias: /bash)
543
- bashForegroundMs: 2000,
544
- config: false, // allow /config
545
- debug: false, // allow /debug
546
- restart: false, // allow /restart + gateway restart tool
547
- allowFrom: {
548
- "*": ["user1"],
549
- },
550
- useAccessGroups: true,
551
- },
552
- }
553
- ```
554
-
555
- <Accordion title="Command details">
556
-
557
- - Text commands must be **standalone** messages with leading `/`.
558
- - `channels.telegram.customCommands` adds extra Telegram bot menu entries.
559
- - `bash: true` enables `! <cmd>` for host shell. Requires `tools.elevated.enabled` and sender in `tools.elevated.allowFrom.<channel>`.
560
- - `config: true` enables `/config` (reads/writes `symi.json`).
561
- - `channels.<provider>.configWrites` gates config mutations per channel (default: true).
562
- - `allowFrom` is per-provider. When set, it is the **only** authorization source (channel allowlists/pairing and `useAccessGroups` are ignored).
563
- - `useAccessGroups: false` allows commands to bypass access-group policies when `allowFrom` is not set.
564
-
565
- </Accordion>
566
-
567
- ---
568
-
569
- ## Agent defaults
570
-
571
- ### `agents.defaults.workspace`
572
-
573
- Default: `~/.symi/workspace`.
574
-
575
- ```json5
576
- {
577
- agents: { defaults: { workspace: "~/.symi/workspace" } },
578
- }
579
- ```
580
-
581
- ### `agents.defaults.repoRoot`
582
-
583
- Optional repository root shown in the system prompt's Runtime line. If unset, Symi auto-detects by walking upward from the workspace.
584
-
585
- ```json5
586
- {
587
- agents: { defaults: { repoRoot: "~/Projects/symi" } },
588
- }
589
- ```
590
-
591
- ### `agents.defaults.skipBootstrap`
592
-
593
- Disables automatic creation of workspace bootstrap files (`AGENTS.md`, `SYMICORE.md`, `TOOLS.md`, `IDENTITY.md`, `USER.md`, `SYMIPULSE.md`, `BOOTSTRAP.md`).
594
-
595
- ```json5
596
- {
597
- agents: { defaults: { skipBootstrap: true } },
598
- }
599
- ```
600
-
601
- ### `agents.defaults.bootstrapMaxChars`
602
-
603
- Max characters per workspace bootstrap file before truncation. Default: `20000`.
604
-
605
- ```json5
606
- {
607
- agents: { defaults: { bootstrapMaxChars: 20000 } },
608
- }
609
- ```
610
-
611
- ### `agents.defaults.bootstrapTotalMaxChars`
612
-
613
- Max total characters injected across all workspace bootstrap files. Default: `150000`.
614
-
615
- ```json5
616
- {
617
- agents: { defaults: { bootstrapTotalMaxChars: 150000 } },
618
- }
619
- ```
620
-
621
- ### `agents.defaults.imageMaxDimensionPx`
622
-
623
- Max pixel size for the longest image side in transcript/tool image blocks before provider calls.
624
- Default: `1200`.
625
-
626
- Lower values usually reduce vision-token usage and request payload size for screenshot-heavy runs.
627
- Higher values preserve more visual detail.
628
-
629
- ```json5
630
- {
631
- agents: { defaults: { imageMaxDimensionPx: 1200 } },
632
- }
633
- ```
634
-
635
- ### `agents.defaults.userTimezone`
636
-
637
- Timezone for system prompt context (not message timestamps). Falls back to host timezone.
638
-
639
- ```json5
640
- {
641
- agents: { defaults: { userTimezone: "America/Chicago" } },
642
- }
643
- ```
644
-
645
- ### `agents.defaults.timeFormat`
646
-
647
- Time format in system prompt. Default: `auto` (OS preference).
648
-
649
- ```json5
650
- {
651
- agents: { defaults: { timeFormat: "auto" } }, // auto | 12 | 24
652
- }
653
- ```
654
-
655
- ### `agents.defaults.model`
656
-
657
- ```json5
658
- {
659
- agents: {
660
- defaults: {
661
- models: {
662
- "anthropic/claude-opus-4-6": { alias: "opus" },
663
- "minimax/MiniMax-M2.1": { alias: "minimax" },
664
- },
665
- model: {
666
- primary: "anthropic/claude-opus-4-6",
667
- fallbacks: ["minimax/MiniMax-M2.1"],
668
- },
669
- imageModel: {
670
- primary: "openrouter/qwen/qwen-2.5-vl-72b-instruct:free",
671
- fallbacks: ["openrouter/google/gemini-2.0-flash-vision:free"],
672
- },
673
- thinkingDefault: "low",
674
- verboseDefault: "off",
675
- elevatedDefault: "on",
676
- timeoutSeconds: 600,
677
- mediaMaxMb: 5,
678
- contextTokens: 200000,
679
- maxConcurrent: 3,
680
- },
681
- },
682
- }
683
- ```
684
-
685
- - `model.primary`: format `provider/model` (e.g. `anthropic/claude-opus-4-6`). If you omit the provider, Symi assumes `anthropic` (deprecated).
686
- - `models`: the configured model catalog and allowlist for `/model`. Each entry can include `alias` (shortcut) and `params` (provider-specific: `temperature`, `maxTokens`).
687
- - `imageModel`: only used if the primary model lacks image input.
688
- - `maxConcurrent`: max parallel agent runs across sessions (each session still serialized). Default: 1.
689
-
690
- **Built-in alias shorthands** (only apply when the model is in `agents.defaults.models`):
691
-
692
- | Alias | Model |
693
- | -------------- | ------------------------------- |
694
- | `opus` | `anthropic/claude-opus-4-6` |
695
- | `sonnet` | `anthropic/claude-sonnet-4-5` |
696
- | `gpt` | `openai/gpt-5.2` |
697
- | `gpt-mini` | `openai/gpt-5-mini` |
698
- | `gemini` | `google/gemini-3-pro-preview` |
699
- | `gemini-flash` | `google/gemini-3-flash-preview` |
700
-
701
- Your configured aliases always win over defaults.
702
-
703
- Z.AI GLM-4.x models automatically enable thinking mode unless you set `--thinking off` or define `agents.defaults.models["zai/<model>"].params.thinking` yourself.
704
- Z.AI models enable `tool_stream` by default for tool call streaming. Set `agents.defaults.models["zai/<model>"].params.tool_stream` to `false` to disable it.
705
-
706
- ### `agents.defaults.cliBackends`
707
-
708
- Optional CLI backends for text-only fallback runs (no tool calls). Useful as a backup when API providers fail.
709
-
710
- ```json5
711
- {
712
- agents: {
713
- defaults: {
714
- cliBackends: {
715
- "claude-cli": {
716
- command: "/opt/homebrew/bin/claude",
717
- },
718
- "my-cli": {
719
- command: "my-cli",
720
- args: ["--json"],
721
- output: "json",
722
- modelArg: "--model",
723
- sessionArg: "--session",
724
- sessionMode: "existing",
725
- systemPromptArg: "--system",
726
- systemPromptWhen: "first",
727
- imageArg: "--image",
728
- imageMode: "repeat",
729
- },
730
- },
731
- },
732
- },
733
- }
734
- ```
735
-
736
- - CLI backends are text-first; tools are always disabled.
737
- - Sessions supported when `sessionArg` is set.
738
- - Image pass-through supported when `imageArg` accepts file paths.
739
-
740
- ### `agents.defaults.heartbeat`
741
-
742
- Periodic heartbeat runs.
743
-
744
- ```json5
745
- {
746
- agents: {
747
- defaults: {
748
- heartbeat: {
749
- every: "30m", // 0m disables
750
- model: "openai/gpt-5.2-mini",
751
- includeReasoning: false,
752
- session: "main",
753
- to: "+15555550123",
754
- prompt: "Read SYMIPULSE.md if it exists...",
755
- ackMaxChars: 300,
756
- suppressToolErrorWarnings: false,
757
- },
758
- },
759
- },
760
- }
761
- ```
762
-
763
- - `every`: duration string (ms/s/m/h). Default: `30m`.
764
- - `suppressToolErrorWarnings`: when true, suppresses tool error warning payloads during heartbeat runs.
765
- - Per-agent: set `agents.list[].heartbeat`. When any agent defines `heartbeat`, **only those agents** run heartbeats.
766
- - Heartbeats run full agent turns — shorter intervals burn more tokens.
767
-
768
- ### `agents.defaults.compaction`
769
-
770
- ```json5
771
- {
772
- agents: {
773
- defaults: {
774
- compaction: {
775
- mode: "safeguard", // default | safeguard
776
- reserveTokensFloor: 24000,
777
- memoryFlush: {
778
- enabled: true,
779
- softThresholdTokens: 6000,
780
- systemPrompt: "Session nearing compaction. Store durable memories now.",
781
- prompt: "Write any lasting notes to memory/YYYY-MM-DD.md; reply with NO_REPLY if nothing to store.",
782
- },
783
- },
784
- },
785
- },
786
- }
787
- ```
788
-
789
- - `mode`: `default` or `safeguard` (chunked summarization for long histories). See [Compaction](/concepts/compaction).
790
- - `memoryFlush`: silent agentic turn before auto-compaction to store durable memories. Skipped when workspace is read-only.
791
-
792
- ### `agents.defaults.contextPruning`
793
-
794
- Prunes **old tool results** from in-memory context before sending to the LLM. Does **not** modify session history on disk.
795
-
796
- ```json5
797
- {
798
- agents: {
799
- defaults: {
800
- contextPruning: {
801
- mode: "cache-ttl", // off | cache-ttl
802
- ttl: "1h", // duration (ms/s/m/h), default unit: minutes
803
- keepLastAssistants: 3,
804
- softTrimRatio: 0.3,
805
- hardClearRatio: 0.5,
806
- minPrunableToolChars: 50000,
807
- softTrim: { maxChars: 4000, headChars: 1500, tailChars: 1500 },
808
- hardClear: { enabled: true, placeholder: "[Old tool result content cleared]" },
809
- tools: { deny: ["browser", "canvas"] },
810
- },
811
- },
812
- },
813
- }
814
- ```
815
-
816
- <Accordion title="cache-ttl mode behavior">
817
-
818
- - `mode: "cache-ttl"` enables pruning passes.
819
- - `ttl` controls how often pruning can run again (after the last cache touch).
820
- - Pruning soft-trims oversized tool results first, then hard-clears older tool results if needed.
821
-
822
- **Soft-trim** keeps beginning + end and inserts `...` in the middle.
823
-
824
- **Hard-clear** replaces the entire tool result with the placeholder.
825
-
826
- Notes:
827
-
828
- - Image blocks are never trimmed/cleared.
829
- - Ratios are character-based (approximate), not exact token counts.
830
- - If fewer than `keepLastAssistants` assistant messages exist, pruning is skipped.
831
-
832
- </Accordion>
833
-
834
- See [Session Pruning](/concepts/session-pruning) for behavior details.
835
-
836
- ### Block streaming
837
-
838
- ```json5
839
- {
840
- agents: {
841
- defaults: {
842
- blockStreamingDefault: "off", // on | off
843
- blockStreamingBreak: "text_end", // text_end | message_end
844
- blockStreamingChunk: { minChars: 800, maxChars: 1200 },
845
- blockStreamingCoalesce: { idleMs: 1000 },
846
- humanDelay: { mode: "natural" }, // off | natural | custom (use minMs/maxMs)
847
- },
848
- },
849
- }
850
- ```
851
-
852
- - Non-Telegram channels require explicit `*.blockStreaming: true` to enable block replies.
853
- - `humanDelay`: randomized pause between block replies. `natural` = 800–2500ms. Per-agent override: `agents.list[].humanDelay`.
854
-
855
- See [Streaming](/concepts/streaming) for behavior + chunking details.
856
-
857
- ### Typing indicators
858
-
859
- ```json5
860
- {
861
- agents: {
862
- defaults: {
863
- typingMode: "instant", // never | instant | thinking | message
864
- typingIntervalSeconds: 6,
865
- },
866
- },
867
- }
868
- ```
869
-
870
- - Defaults: `instant` for direct chats/mentions, `message` for unmentioned group chats.
871
- - Per-session overrides: `session.typingMode`, `session.typingIntervalSeconds`.
872
-
873
- See [Typing Indicators](/concepts/typing-indicators).
874
-
875
- ### `agents.defaults.sandbox`
876
-
877
- Optional **Docker sandboxing** for the embedded agent. See [Sandboxing](/gateway/sandboxing) for the full guide.
878
-
879
- ```json5
880
- {
881
- agents: {
882
- defaults: {
883
- sandbox: {
884
- mode: "non-main", // off | non-main | all
885
- scope: "agent", // session | agent | shared
886
- workspaceAccess: "none", // none | ro | rw
887
- workspaceRoot: "~/.symi/sandboxes",
888
- docker: {
889
- image: "symi-sandbox:bookworm-slim",
890
- containerPrefix: "symi-sbx-",
891
- workdir: "/workspace",
892
- readOnlyRoot: true,
893
- tmpfs: ["/tmp", "/var/tmp", "/run"],
894
- network: "none",
895
- user: "1000:1000",
896
- capDrop: ["ALL"],
897
- env: { LANG: "C.UTF-8" },
898
- setupCommand: "apt-get update && apt-get install -y git curl jq",
899
- pidsLimit: 256,
900
- memory: "1g",
901
- memorySwap: "2g",
902
- cpus: 1,
903
- ulimits: {
904
- nofile: { soft: 1024, hard: 2048 },
905
- nproc: 256,
906
- },
907
- seccompProfile: "/path/to/seccomp.json",
908
- apparmorProfile: "symi-sandbox",
909
- dns: ["1.1.1.1", "8.8.8.8"],
910
- extraHosts: ["internal.service:10.0.0.5"],
911
- binds: ["/home/user/source:/source:rw"],
912
- },
913
- browser: {
914
- enabled: false,
915
- image: "symi-sandbox-browser:bookworm-slim",
916
- network: "symi-sandbox-browser",
917
- cdpPort: 9222,
918
- cdpSourceRange: "172.21.0.1/32",
919
- vncPort: 5900,
920
- noVncPort: 6080,
921
- headless: false,
922
- enableNoVnc: true,
923
- allowHostControl: false,
924
- autoStart: true,
925
- autoStartTimeoutMs: 12000,
926
- },
927
- prune: {
928
- idleHours: 24,
929
- maxAgeDays: 7,
930
- },
931
- },
932
- },
933
- },
934
- tools: {
935
- sandbox: {
936
- tools: {
937
- allow: [
938
- "exec",
939
- "process",
940
- "read",
941
- "write",
942
- "edit",
943
- "apply_patch",
944
- "sessions_list",
945
- "sessions_history",
946
- "sessions_send",
947
- "sessions_spawn",
948
- "session_status",
949
- ],
950
- },
951
- },
952
- },
953
- }
954
- ```
955
-
956
- <Accordion title="Sandbox details">
957
-
958
- **Workspace access:**
959
-
960
- - `none`: per-scope sandbox workspace under `~/.symi/sandboxes`
961
- - `ro`: sandbox workspace at `/workspace`, agent workspace mounted read-only at `/agent`
962
- - `rw`: agent workspace mounted read/write at `/workspace`
963
-
964
- **Scope:**
965
-
966
- - `session`: per-session container + workspace
967
- - `agent`: one container + workspace per agent (default)
968
- - `shared`: shared container and workspace (no cross-session isolation)
969
-
970
- **`setupCommand`** runs once after container creation (via `sh -lc`). Needs network egress, writable root, root user.
971
-
972
- **Containers default to `network: "none"`** — set to `"bridge"` if the agent needs outbound access.
973
-
974
- **Inbound attachments** are staged into `media/inbound/*` in the active workspace.
975
-
976
- **`docker.binds`** mounts additional host directories; global and per-agent binds are merged.
977
-
978
- **Sandboxed browser** (`sandbox.browser.enabled`): Chromium + CDP in a container. noVNC URL injected into system prompt. Does not require `browser.enabled` in main config.
979
- noVNC observer access uses VNC auth by default and Symi emits a short-lived token URL (instead of exposing the password in the shared URL).
980
-
981
- - `allowHostControl: false` (default) blocks sandboxed sessions from targeting the host browser.
982
- - `network` defaults to `symi-sandbox-browser` (dedicated bridge network). Set to `bridge` only when you explicitly want global bridge connectivity.
983
- - `cdpSourceRange` optionally restricts CDP ingress at the container edge to a CIDR range (for example `172.21.0.1/32`).
984
- - `sandbox.browser.binds` mounts additional host directories into the sandbox browser container only. When set (including `[]`), it replaces `docker.binds` for the browser container.
985
-
986
- </Accordion>
987
-
988
- Build images:
989
-
990
- ```bash
991
- scripts/sandbox-setup.sh # main sandbox image
992
- scripts/sandbox-browser-setup.sh # optional browser image
993
- ```
994
-
995
- ### `agents.list` (per-agent overrides)
996
-
997
- ```json5
998
- {
999
- agents: {
1000
- list: [
1001
- {
1002
- id: "main",
1003
- default: true,
1004
- name: "Main Agent",
1005
- workspace: "~/.symi/workspace",
1006
- agentDir: "~/.symi/agents/main/agent",
1007
- model: "anthropic/claude-opus-4-6", // or { primary, fallbacks }
1008
- identity: {
1009
- name: "Samantha",
1010
- theme: "helpful sloth",
1011
- emoji: "🦥",
1012
- avatar: "avatars/samantha.png",
1013
- },
1014
- groupChat: { mentionPatterns: ["@symi"] },
1015
- sandbox: { mode: "off" },
1016
- subagents: { allowAgents: ["*"] },
1017
- tools: {
1018
- profile: "coding",
1019
- allow: ["browser"],
1020
- deny: ["canvas"],
1021
- elevated: { enabled: true },
1022
- },
1023
- },
1024
- ],
1025
- },
1026
- }
1027
- ```
1028
-
1029
- - `id`: stable agent id (required).
1030
- - `default`: when multiple are set, first wins (warning logged). If none set, first list entry is default.
1031
- - `model`: string form overrides `primary` only; object form `{ primary, fallbacks }` overrides both (`[]` disables global fallbacks). Cron jobs that only override `primary` still inherit default fallbacks unless you set `fallbacks: []`.
1032
- - `identity.avatar`: workspace-relative path, `http(s)` URL, or `data:` URI.
1033
- - `identity` derives defaults: `ackReaction` from `emoji`, `mentionPatterns` from `name`/`emoji`.
1034
- - `subagents.allowAgents`: allowlist of agent ids for `sessions_spawn` (`["*"]` = any; default: same agent only).
1035
-
1036
- ---
1037
-
1038
- ## Multi-agent routing
1039
-
1040
- Run multiple isolated agents inside one Gateway. See [Multi-Agent](/concepts/multi-agent).
1041
-
1042
- ```json5
1043
- {
1044
- agents: {
1045
- list: [
1046
- { id: "home", default: true, workspace: "~/.symi/workspace-home" },
1047
- { id: "work", workspace: "~/.symi/workspace-work" },
1048
- ],
1049
- },
1050
- bindings: [
1051
- { agentId: "home", match: { channel: "whatsapp", accountId: "personal" } },
1052
- { agentId: "work", match: { channel: "whatsapp", accountId: "biz" } },
1053
- ],
1054
- }
1055
- ```
1056
-
1057
- ### Binding match fields
1058
-
1059
- - `match.channel` (required)
1060
- - `match.accountId` (optional; `*` = any account; omitted = default account)
1061
- - `match.peer` (optional; `{ kind: direct|group|channel, id }`)
1062
- - `match.guildId` / `match.teamId` (optional; channel-specific)
1063
-
1064
- **Deterministic match order:**
1065
-
1066
- 1. `match.peer`
1067
- 2. `match.guildId`
1068
- 3. `match.teamId`
1069
- 4. `match.accountId` (exact, no peer/guild/team)
1070
- 5. `match.accountId: "*"` (channel-wide)
1071
- 6. Default agent
1072
-
1073
- Within each tier, the first matching `bindings` entry wins.
1074
-
1075
- ### Per-agent access profiles
1076
-
1077
- <Accordion title="Full access (no sandbox)">
1078
-
1079
- ```json5
1080
- {
1081
- agents: {
1082
- list: [
1083
- {
1084
- id: "personal",
1085
- workspace: "~/.symi/workspace-personal",
1086
- sandbox: { mode: "off" },
1087
- },
1088
- ],
1089
- },
1090
- }
1091
- ```
1092
-
1093
- </Accordion>
1094
-
1095
- <Accordion title="Read-only tools + workspace">
1096
-
1097
- ```json5
1098
- {
1099
- agents: {
1100
- list: [
1101
- {
1102
- id: "family",
1103
- workspace: "~/.symi/workspace-family",
1104
- sandbox: { mode: "all", scope: "agent", workspaceAccess: "ro" },
1105
- tools: {
1106
- allow: [
1107
- "read",
1108
- "sessions_list",
1109
- "sessions_history",
1110
- "sessions_send",
1111
- "sessions_spawn",
1112
- "session_status",
1113
- ],
1114
- deny: ["write", "edit", "apply_patch", "exec", "process", "browser"],
1115
- },
1116
- },
1117
- ],
1118
- },
1119
- }
1120
- ```
1121
-
1122
- </Accordion>
1123
-
1124
- <Accordion title="No filesystem access (messaging only)">
1125
-
1126
- ```json5
1127
- {
1128
- agents: {
1129
- list: [
1130
- {
1131
- id: "public",
1132
- workspace: "~/.symi/workspace-public",
1133
- sandbox: { mode: "all", scope: "agent", workspaceAccess: "none" },
1134
- tools: {
1135
- allow: [
1136
- "sessions_list",
1137
- "sessions_history",
1138
- "sessions_send",
1139
- "sessions_spawn",
1140
- "session_status",
1141
- "whatsapp",
1142
- "telegram",
1143
- "slack",
1144
- "gateway",
1145
- ],
1146
- deny: [
1147
- "read",
1148
- "write",
1149
- "edit",
1150
- "apply_patch",
1151
- "exec",
1152
- "process",
1153
- "browser",
1154
- "canvas",
1155
- "nodes",
1156
- "cron",
1157
- "gateway",
1158
- "image",
1159
- ],
1160
- },
1161
- },
1162
- ],
1163
- },
1164
- }
1165
- ```
1166
-
1167
- </Accordion>
1168
-
1169
- See [Multi-Agent Sandbox & Tools](/tools/multi-agent-sandbox-tools) for precedence details.
1170
-
1171
- ---
1172
-
1173
- ## Session
1174
-
1175
- ```json5
1176
- {
1177
- session: {
1178
- scope: "per-sender",
1179
- dmScope: "main", // main | per-peer | per-channel-peer | per-account-channel-peer
1180
- identityLinks: {},
1181
- reset: {
1182
- mode: "daily", // daily | idle
1183
- atHour: 4,
1184
- idleMinutes: 60,
1185
- },
1186
- resetByType: {
1187
- thread: { mode: "daily", atHour: 4 },
1188
- direct: { mode: "idle", idleMinutes: 240 },
1189
- group: { mode: "idle", idleMinutes: 120 },
1190
- },
1191
- resetTriggers: ["/new", "/reset"],
1192
- store: "~/.symi/agents/{agentId}/sessions/sessions.json",
1193
- maintenance: {
1194
- mode: "warn", // warn | enforce
1195
- pruneAfter: "30d",
1196
- maxEntries: 500,
1197
- rotateBytes: "10mb",
1198
- },
1199
- mainKey: "main", // legacy (runtime always uses "main")
1200
- agentToAgent: { maxPingPongTurns: 5 },
1201
- sendPolicy: {
1202
- default: "allow",
1203
- },
1204
- },
1205
- }
1206
- ```
1207
-
1208
- <Accordion title="Session field details">
1209
-
1210
- - **`dmScope`**: how DMs are grouped.
1211
- - `main`: all DMs share the main session.
1212
- - `per-peer`: isolate by sender id across channels.
1213
- - `per-channel-peer`: isolate per channel + sender (recommended for multi-user inboxes).
1214
- - `per-account-channel-peer`: isolate per account + channel + sender (recommended for multi-account).
1215
- - **`identityLinks`**: map canonical ids to provider-prefixed peers for cross-channel session sharing.
1216
- - **`reset`**: primary reset policy. `daily` resets at `atHour` local time; `idle` resets after `idleMinutes`. When both configured, whichever expires first wins.
1217
- - **`resetByType`**: per-type overrides (`direct`, `group`, `thread`). Legacy `dm` accepted as alias for `direct`.
1218
- - **`mainKey`**: legacy field. Runtime now always uses `"main"` for the main direct-chat bucket.
1219
- - **`sendPolicy`**: match by `channel`, `chatType` (`direct|group|channel`, with legacy `dm` alias), `keyPrefix`, or `rawKeyPrefix`. First deny wins.
1220
- - **`maintenance`**: `warn` warns the active session on eviction; `enforce` applies pruning and rotation.
1221
-
1222
- </Accordion>
1223
-
1224
- ---
1225
-
1226
- ## Messages
1227
-
1228
- ```json5
1229
- {
1230
- messages: {
1231
- responsePrefix: "🦞", // or "auto"
1232
- ackReaction: "👀",
1233
- ackReactionScope: "group-mentions", // group-mentions | group-all | direct | all
1234
- removeAckAfterReply: false,
1235
- queue: {
1236
- mode: "collect", // steer | followup | collect | steer-backlog | steer+backlog | queue | interrupt
1237
- debounceMs: 1000,
1238
- cap: 20,
1239
- drop: "summarize", // old | new | summarize
1240
- byChannel: {
1241
- whatsapp: "collect",
1242
- telegram: "collect",
1243
- },
1244
- },
1245
- inbound: {
1246
- debounceMs: 2000, // 0 disables
1247
- byChannel: {
1248
- whatsapp: 5000,
1249
- slack: 1500,
1250
- },
1251
- },
1252
- },
1253
- }
1254
- ```
1255
-
1256
- ### Response prefix
1257
-
1258
- Per-channel/account overrides: `channels.<channel>.responsePrefix`, `channels.<channel>.accounts.<id>.responsePrefix`.
1259
-
1260
- Resolution (most specific wins): account → channel → global. `""` disables and stops cascade. `"auto"` derives `[{identity.name}]`.
1261
-
1262
- **Template variables:**
1263
-
1264
- | Variable | Description | Example |
1265
- | ----------------- | ---------------------- | --------------------------- |
1266
- | `{model}` | Short model name | `claude-opus-4-6` |
1267
- | `{modelFull}` | Full model identifier | `anthropic/claude-opus-4-6` |
1268
- | `{provider}` | Provider name | `anthropic` |
1269
- | `{thinkingLevel}` | Current thinking level | `high`, `low`, `off` |
1270
- | `{identity.name}` | Agent identity name | (same as `"auto"`) |
1271
-
1272
- Variables are case-insensitive. `{think}` is an alias for `{thinkingLevel}`.
1273
-
1274
- ### Ack reaction
1275
-
1276
- - Defaults to active agent's `identity.emoji`, otherwise `"👀"`. Set `""` to disable.
1277
- - Per-channel overrides: `channels.<channel>.ackReaction`, `channels.<channel>.accounts.<id>.ackReaction`.
1278
- - Resolution order: account → channel → `messages.ackReaction` → identity fallback.
1279
- - Scope: `group-mentions` (default), `group-all`, `direct`, `all`.
1280
-
1281
- ### Inbound debounce
1282
-
1283
- Batches rapid text-only messages from the same sender into a single agent turn. Media/attachments flush immediately. Control commands bypass debouncing.
1284
-
1285
- ### TTS (text-to-speech)
1286
-
1287
- ```json5
1288
- {
1289
- messages: {
1290
- tts: {
1291
- auto: "always", // off | always | inbound | tagged
1292
- mode: "final", // final | all
1293
- provider: "elevenlabs",
1294
- summaryModel: "openai/gpt-4.1-mini",
1295
- modelOverrides: { enabled: true },
1296
- maxTextLength: 4000,
1297
- timeoutMs: 30000,
1298
- prefsPath: "~/.symi/settings/tts.json",
1299
- elevenlabs: {
1300
- apiKey: "elevenlabs_api_key",
1301
- baseUrl: "https://api.elevenlabs.io",
1302
- voiceId: "voice_id",
1303
- modelId: "eleven_multilingual_v2",
1304
- seed: 42,
1305
- applyTextNormalization: "auto",
1306
- languageCode: "en",
1307
- voiceSettings: {
1308
- stability: 0.5,
1309
- similarityBoost: 0.75,
1310
- style: 0.0,
1311
- useSpeakerBoost: true,
1312
- speed: 1.0,
1313
- },
1314
- },
1315
- openai: {
1316
- apiKey: "openai_api_key",
1317
- model: "gpt-4o-mini-tts",
1318
- voice: "alloy",
1319
- },
1320
- },
1321
- },
1322
- }
1323
- ```
1324
-
1325
- - `auto` controls auto-TTS. `/tts off|always|inbound|tagged` overrides per session.
1326
- - `summaryModel` overrides `agents.defaults.model.primary` for auto-summary.
1327
- - `modelOverrides` is enabled by default; `modelOverrides.allowProvider` defaults to `false` (opt-in).
1328
- - API keys fall back to `ELEVENLABS_API_KEY`/`XI_API_KEY` and `OPENAI_API_KEY`.
1329
-
1330
- ---
1331
-
1332
- ## Talk
1333
-
1334
- Defaults for Talk mode (macOS/iOS/Android).
1335
-
1336
- ```json5
1337
- {
1338
- talk: {
1339
- voiceId: "elevenlabs_voice_id",
1340
- voiceAliases: {
1341
- Symi: "EXAVITQu4vr4xnSDxMaL",
1342
- Roger: "CwhRBWXzGAHq8TQ4Fs17",
1343
- },
1344
- modelId: "eleven_v3",
1345
- outputFormat: "mp3_44100_128",
1346
- apiKey: "elevenlabs_api_key",
1347
- interruptOnSpeech: true,
1348
- },
1349
- }
1350
- ```
1351
-
1352
- - Voice IDs fall back to `ELEVENLABS_VOICE_ID` or `SAG_VOICE_ID`.
1353
- - `apiKey` falls back to `ELEVENLABS_API_KEY`.
1354
- - `voiceAliases` lets Talk directives use friendly names.
1355
-
1356
- ---
1357
-
1358
- ## Tools
1359
-
1360
- ### Tool profiles
1361
-
1362
- `tools.profile` sets a base allowlist before `tools.allow`/`tools.deny`:
1363
-
1364
- | Profile | Includes |
1365
- | ----------- | ----------------------------------------------------------------------------------------- |
1366
- | `minimal` | `session_status` only |
1367
- | `coding` | `group:fs`, `group:runtime`, `group:sessions`, `group:memory`, `image` |
1368
- | `messaging` | `group:messaging`, `sessions_list`, `sessions_history`, `sessions_send`, `session_status` |
1369
- | `full` | No restriction (same as unset) |
1370
-
1371
- ### Tool groups
1372
-
1373
- | Group | Tools |
1374
- | ------------------ | ---------------------------------------------------------------------------------------- |
1375
- | `group:runtime` | `exec`, `process` (`bash` is accepted as an alias for `exec`) |
1376
- | `group:fs` | `read`, `write`, `edit`, `apply_patch` |
1377
- | `group:sessions` | `sessions_list`, `sessions_history`, `sessions_send`, `sessions_spawn`, `session_status` |
1378
- | `group:memory` | `memory_search`, `memory_get` |
1379
- | `group:web` | `web_search`, `web_fetch` |
1380
- | `group:ui` | `browser`, `canvas` |
1381
- | `group:automation` | `cron`, `gateway` |
1382
- | `group:messaging` | `message` |
1383
- | `group:nodes` | `nodes` |
1384
- | `group:symi` | All built-in tools (excludes provider plugins) |
1385
-
1386
- ### `tools.allow` / `tools.deny`
1387
-
1388
- Global tool allow/deny policy (deny wins). Case-insensitive, supports `*` wildcards. Applied even when Docker sandbox is off.
1389
-
1390
- ```json5
1391
- {
1392
- tools: { deny: ["browser", "canvas"] },
1393
- }
1394
- ```
1395
-
1396
- ### `tools.byProvider`
1397
-
1398
- Further restrict tools for specific providers or models. Order: base profile → provider profile → allow/deny.
1399
-
1400
- ```json5
1401
- {
1402
- tools: {
1403
- profile: "coding",
1404
- byProvider: {
1405
- "google-antigravity": { profile: "minimal" },
1406
- "openai/gpt-5.2": { allow: ["group:fs", "sessions_list"] },
1407
- },
1408
- },
1409
- }
1410
- ```
1411
-
1412
- ### `tools.elevated`
1413
-
1414
- Controls elevated (host) exec access:
1415
-
1416
- ```json5
1417
- {
1418
- tools: {
1419
- elevated: {
1420
- enabled: true,
1421
- allowFrom: {
1422
- whatsapp: ["+15555550123"],
1423
- },
1424
- },
1425
- },
1426
- }
1427
- ```
1428
-
1429
- - Per-agent override (`agents.list[].tools.elevated`) can only further restrict.
1430
- - `/elevated on|off|ask|full` stores state per session; inline directives apply to single message.
1431
- - Elevated `exec` runs on the host, bypasses sandboxing.
1432
-
1433
- ### `tools.exec`
1434
-
1435
- ```json5
1436
- {
1437
- tools: {
1438
- exec: {
1439
- backgroundMs: 10000,
1440
- timeoutSec: 1800,
1441
- cleanupMs: 1800000,
1442
- notifyOnExit: true,
1443
- notifyOnExitEmptySuccess: false,
1444
- applyPatch: {
1445
- enabled: false,
1446
- allowModels: ["gpt-5.2"],
1447
- },
1448
- },
1449
- },
1450
- }
1451
- ```
1452
-
1453
- ### `tools.loopDetection`
1454
-
1455
- Tool-loop safety checks are **disabled by default**. Set `enabled: true` to activate detection.
1456
- Settings can be defined globally in `tools.loopDetection` and overridden per-agent at `agents.list[].tools.loopDetection`.
1457
-
1458
- ```json5
1459
- {
1460
- tools: {
1461
- loopDetection: {
1462
- enabled: true,
1463
- historySize: 30,
1464
- warningThreshold: 10,
1465
- criticalThreshold: 20,
1466
- globalCircuitBreakerThreshold: 30,
1467
- detectors: {
1468
- genericRepeat: true,
1469
- knownPollNoProgress: true,
1470
- pingPong: true,
1471
- },
1472
- },
1473
- },
1474
- }
1475
- ```
1476
-
1477
- - `historySize`: max tool-call history retained for loop analysis.
1478
- - `warningThreshold`: repeating no-progress pattern threshold for warnings.
1479
- - `criticalThreshold`: higher repeating threshold for blocking critical loops.
1480
- - `globalCircuitBreakerThreshold`: hard stop threshold for any no-progress run.
1481
- - `detectors.genericRepeat`: warn on repeated same-tool/same-args calls.
1482
- - `detectors.knownPollNoProgress`: warn/block on known poll tools (`process.poll`, `command_status`, etc.).
1483
- - `detectors.pingPong`: warn/block on alternating no-progress pair patterns.
1484
- - If `warningThreshold >= criticalThreshold` or `criticalThreshold >= globalCircuitBreakerThreshold`, validation fails.
1485
-
1486
- ### `tools.web`
1487
-
1488
- ```json5
1489
- {
1490
- tools: {
1491
- web: {
1492
- search: {
1493
- enabled: true,
1494
- apiKey: "brave_api_key", // or BRAVE_API_KEY env
1495
- maxResults: 5,
1496
- timeoutSeconds: 30,
1497
- cacheTtlMinutes: 15,
1498
- },
1499
- fetch: {
1500
- enabled: true,
1501
- maxChars: 50000,
1502
- maxCharsCap: 50000,
1503
- timeoutSeconds: 30,
1504
- cacheTtlMinutes: 15,
1505
- userAgent: "custom-ua",
1506
- },
1507
- },
1508
- },
1509
- }
1510
- ```
1511
-
1512
- ### `tools.media`
1513
-
1514
- Configures inbound media understanding (image/audio/video):
1515
-
1516
- ```json5
1517
- {
1518
- tools: {
1519
- media: {
1520
- concurrency: 2,
1521
- audio: {
1522
- enabled: true,
1523
- maxBytes: 20971520,
1524
- scope: {
1525
- default: "deny",
1526
- rules: [{ action: "allow", match: { chatType: "direct" } }],
1527
- },
1528
- models: [
1529
- { provider: "openai", model: "gpt-4o-mini-transcribe" },
1530
- { type: "cli", command: "whisper", args: ["--model", "base", "{{MediaPath}}"] },
1531
- ],
1532
- },
1533
- video: {
1534
- enabled: true,
1535
- maxBytes: 52428800,
1536
- models: [{ provider: "google", model: "gemini-3-flash-preview" }],
1537
- },
1538
- },
1539
- },
1540
- }
1541
- ```
1542
-
1543
- <Accordion title="Media model entry fields">
1544
-
1545
- **Provider entry** (`type: "provider"` or omitted):
1546
-
1547
- - `provider`: API provider id (`openai`, `anthropic`, `google`/`gemini`, `groq`, etc.)
1548
- - `model`: model id override
1549
- - `profile` / `preferredProfile`: auth profile selection
1550
-
1551
- **CLI entry** (`type: "cli"`):
1552
-
1553
- - `command`: executable to run
1554
- - `args`: templated args (supports `{{MediaPath}}`, `{{Prompt}}`, `{{MaxChars}}`, etc.)
1555
-
1556
- **Common fields:**
1557
-
1558
- - `capabilities`: optional list (`image`, `audio`, `video`). Defaults: `openai`/`anthropic`/`minimax` → image, `google` → image+audio+video, `groq` → audio.
1559
- - `prompt`, `maxChars`, `maxBytes`, `timeoutSeconds`, `language`: per-entry overrides.
1560
- - Failures fall back to the next entry.
1561
-
1562
- Provider auth follows standard order: auth profiles → env vars → `models.providers.*.apiKey`.
1563
-
1564
- </Accordion>
1565
-
1566
- ### `tools.agentToAgent`
1567
-
1568
- ```json5
1569
- {
1570
- tools: {
1571
- agentToAgent: {
1572
- enabled: false,
1573
- allow: ["home", "work"],
1574
- },
1575
- },
1576
- }
1577
- ```
1578
-
1579
- ### `tools.sessions`
1580
-
1581
- Controls which sessions can be targeted by the session tools (`sessions_list`, `sessions_history`, `sessions_send`).
1582
-
1583
- Default: `tree` (current session + sessions spawned by it, such as subagents).
1584
-
1585
- ```json5
1586
- {
1587
- tools: {
1588
- sessions: {
1589
- // "self" | "tree" | "agent" | "all"
1590
- visibility: "tree",
1591
- },
1592
- },
1593
- }
1594
- ```
1595
-
1596
- Notes:
1597
-
1598
- - `self`: only the current session key.
1599
- - `tree`: current session + sessions spawned by the current session (subagents).
1600
- - `agent`: any session belonging to the current agent id (can include other users if you run per-sender sessions under the same agent id).
1601
- - `all`: any session. Cross-agent targeting still requires `tools.agentToAgent`.
1602
- - Sandbox clamp: when the current session is sandboxed and `agents.defaults.sandbox.sessionToolsVisibility="spawned"`, visibility is forced to `tree` even if `tools.sessions.visibility="all"`.
1603
-
1604
- ### `tools.subagents`
1605
-
1606
- ```json5
1607
- {
1608
- agents: {
1609
- defaults: {
1610
- subagents: {
1611
- model: "minimax/MiniMax-M2.1",
1612
- maxConcurrent: 1,
1613
- archiveAfterMinutes: 60,
1614
- },
1615
- },
1616
- },
1617
- }
1618
- ```
1619
-
1620
- - `model`: default model for spawned sub-agents. If omitted, sub-agents inherit the caller's model.
1621
- - Per-subagent tool policy: `tools.subagents.tools.allow` / `tools.subagents.tools.deny`.
1622
-
1623
- ---
1624
-
1625
- ## Custom providers and base URLs
1626
-
1627
- Symi uses the pi-coding-agent model catalog. Add custom providers via `models.providers` in config or `~/.symi/agents/<agentId>/agent/models.json`.
1628
-
1629
- ```json5
1630
- {
1631
- models: {
1632
- mode: "merge", // merge (default) | replace
1633
- providers: {
1634
- "custom-proxy": {
1635
- baseUrl: "http://localhost:4000/v1",
1636
- apiKey: "LITELLM_KEY",
1637
- api: "openai-completions", // openai-completions | openai-responses | anthropic-messages | google-generative-ai
1638
- models: [
1639
- {
1640
- id: "llama-3.1-8b",
1641
- name: "Llama 3.1 8B",
1642
- reasoning: false,
1643
- input: ["text"],
1644
- cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
1645
- contextWindow: 128000,
1646
- maxTokens: 32000,
1647
- },
1648
- ],
1649
- },
1650
- },
1651
- },
1652
- }
1653
- ```
1654
-
1655
- - Use `authHeader: true` + `headers` for custom auth needs.
1656
- - Override agent config root with `SYMI_AGENT_DIR` (or `PI_CODING_AGENT_DIR`).
1657
-
1658
- ### Provider examples
1659
-
1660
- <Accordion title="Cerebras (GLM 4.6 / 4.7)">
1661
-
1662
- ```json5
1663
- {
1664
- env: { CEREBRAS_API_KEY: "sk-..." },
1665
- agents: {
1666
- defaults: {
1667
- model: {
1668
- primary: "cerebras/zai-glm-4.7",
1669
- fallbacks: ["cerebras/zai-glm-4.6"],
1670
- },
1671
- models: {
1672
- "cerebras/zai-glm-4.7": { alias: "GLM 4.7 (Cerebras)" },
1673
- "cerebras/zai-glm-4.6": { alias: "GLM 4.6 (Cerebras)" },
1674
- },
1675
- },
1676
- },
1677
- models: {
1678
- mode: "merge",
1679
- providers: {
1680
- cerebras: {
1681
- baseUrl: "https://api.cerebras.ai/v1",
1682
- apiKey: "${CEREBRAS_API_KEY}",
1683
- api: "openai-completions",
1684
- models: [
1685
- { id: "zai-glm-4.7", name: "GLM 4.7 (Cerebras)" },
1686
- { id: "zai-glm-4.6", name: "GLM 4.6 (Cerebras)" },
1687
- ],
1688
- },
1689
- },
1690
- },
1691
- }
1692
- ```
1693
-
1694
- Use `cerebras/zai-glm-4.7` for Cerebras; `zai/glm-4.7` for Z.AI direct.
1695
-
1696
- </Accordion>
1697
-
1698
- <Accordion title="OpenCode Zen">
1699
-
1700
- ```json5
1701
- {
1702
- agents: {
1703
- defaults: {
1704
- model: { primary: "opencode/claude-opus-4-6" },
1705
- models: { "opencode/claude-opus-4-6": { alias: "Opus" } },
1706
- },
1707
- },
1708
- }
1709
- ```
1710
-
1711
- Set `OPENCODE_API_KEY` (or `OPENCODE_ZEN_API_KEY`). Shortcut: `symi onboard --auth-choice opencode-zen`.
1712
-
1713
- </Accordion>
1714
-
1715
- <Accordion title="Z.AI (GLM-4.7)">
1716
-
1717
- ```json5
1718
- {
1719
- agents: {
1720
- defaults: {
1721
- model: { primary: "zai/glm-4.7" },
1722
- models: { "zai/glm-4.7": {} },
1723
- },
1724
- },
1725
- }
1726
- ```
1727
-
1728
- Set `ZAI_API_KEY`. `z.ai/*` and `z-ai/*` are accepted aliases. Shortcut: `symi onboard --auth-choice zai-api-key`.
1729
-
1730
- - General endpoint: `https://api.z.ai/api/paas/v4`
1731
- - Coding endpoint (default): `https://api.z.ai/api/coding/paas/v4`
1732
- - For the general endpoint, define a custom provider with the base URL override.
1733
-
1734
- </Accordion>
1735
-
1736
- <Accordion title="Moonshot AI (Kimi)">
1737
-
1738
- ```json5
1739
- {
1740
- env: { MOONSHOT_API_KEY: "sk-..." },
1741
- agents: {
1742
- defaults: {
1743
- model: { primary: "moonshot/kimi-k2.5" },
1744
- models: { "moonshot/kimi-k2.5": { alias: "Kimi K2.5" } },
1745
- },
1746
- },
1747
- models: {
1748
- mode: "merge",
1749
- providers: {
1750
- moonshot: {
1751
- baseUrl: "https://api.moonshot.ai/v1",
1752
- apiKey: "${MOONSHOT_API_KEY}",
1753
- api: "openai-completions",
1754
- models: [
1755
- {
1756
- id: "kimi-k2.5",
1757
- name: "Kimi K2.5",
1758
- reasoning: false,
1759
- input: ["text"],
1760
- cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
1761
- contextWindow: 256000,
1762
- maxTokens: 8192,
1763
- },
1764
- ],
1765
- },
1766
- },
1767
- },
1768
- }
1769
- ```
1770
-
1771
- For the China endpoint: `baseUrl: "https://api.moonshot.cn/v1"` or `symi onboard --auth-choice moonshot-api-key-cn`.
1772
-
1773
- </Accordion>
1774
-
1775
- <Accordion title="Kimi Coding">
1776
-
1777
- ```json5
1778
- {
1779
- env: { KIMI_API_KEY: "sk-..." },
1780
- agents: {
1781
- defaults: {
1782
- model: { primary: "kimi-coding/k2p5" },
1783
- models: { "kimi-coding/k2p5": { alias: "Kimi K2.5" } },
1784
- },
1785
- },
1786
- }
1787
- ```
1788
-
1789
- Anthropic-compatible, built-in provider. Shortcut: `symi onboard --auth-choice kimi-code-api-key`.
1790
-
1791
- </Accordion>
1792
-
1793
- <Accordion title="Synthetic (Anthropic-compatible)">
1794
-
1795
- ```json5
1796
- {
1797
- env: { SYNTHETIC_API_KEY: "sk-..." },
1798
- agents: {
1799
- defaults: {
1800
- model: { primary: "synthetic/hf:MiniMaxAI/MiniMax-M2.1" },
1801
- models: { "synthetic/hf:MiniMaxAI/MiniMax-M2.1": { alias: "MiniMax M2.1" } },
1802
- },
1803
- },
1804
- models: {
1805
- mode: "merge",
1806
- providers: {
1807
- synthetic: {
1808
- baseUrl: "https://api.synthetic.new/anthropic",
1809
- apiKey: "${SYNTHETIC_API_KEY}",
1810
- api: "anthropic-messages",
1811
- models: [
1812
- {
1813
- id: "hf:MiniMaxAI/MiniMax-M2.1",
1814
- name: "MiniMax M2.1",
1815
- reasoning: false,
1816
- input: ["text"],
1817
- cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
1818
- contextWindow: 192000,
1819
- maxTokens: 65536,
1820
- },
1821
- ],
1822
- },
1823
- },
1824
- },
1825
- }
1826
- ```
1827
-
1828
- Base URL should omit `/v1` (Anthropic client appends it). Shortcut: `symi onboard --auth-choice synthetic-api-key`.
1829
-
1830
- </Accordion>
1831
-
1832
- <Accordion title="MiniMax M2.1 (direct)">
1833
-
1834
- ```json5
1835
- {
1836
- agents: {
1837
- defaults: {
1838
- model: { primary: "minimax/MiniMax-M2.1" },
1839
- models: {
1840
- "minimax/MiniMax-M2.1": { alias: "Minimax" },
1841
- },
1842
- },
1843
- },
1844
- models: {
1845
- mode: "merge",
1846
- providers: {
1847
- minimax: {
1848
- baseUrl: "https://api.minimax.io/anthropic",
1849
- apiKey: "${MINIMAX_API_KEY}",
1850
- api: "anthropic-messages",
1851
- models: [
1852
- {
1853
- id: "MiniMax-M2.1",
1854
- name: "MiniMax M2.1",
1855
- reasoning: false,
1856
- input: ["text"],
1857
- cost: { input: 15, output: 60, cacheRead: 2, cacheWrite: 10 },
1858
- contextWindow: 200000,
1859
- maxTokens: 8192,
1860
- },
1861
- ],
1862
- },
1863
- },
1864
- },
1865
- }
1866
- ```
1867
-
1868
- Set `MINIMAX_API_KEY`. Shortcut: `symi onboard --auth-choice minimax-api`.
1869
-
1870
- </Accordion>
1871
-
1872
- <Accordion title="Local models (LM Studio)">
1873
-
1874
- See [Local Models](/gateway/local-models). TL;DR: run MiniMax M2.1 via LM Studio Responses API on serious hardware; keep hosted models merged for fallback.
1875
-
1876
- </Accordion>
1877
-
1878
- ---
1879
-
1880
- ## Skills
1881
-
1882
- ```json5
1883
- {
1884
- skills: {
1885
- allowBundled: ["gemini", "peekaboo"],
1886
- load: {
1887
- extraDirs: ["~/Projects/agent-scripts/skills"],
1888
- },
1889
- install: {
1890
- preferBrew: true,
1891
- nodeManager: "npm", // npm | pnpm | yarn
1892
- },
1893
- entries: {
1894
- "nano-banana-pro": {
1895
- apiKey: "GEMINI_KEY_HERE",
1896
- env: { GEMINI_API_KEY: "GEMINI_KEY_HERE" },
1897
- },
1898
- peekaboo: { enabled: true },
1899
- sag: { enabled: false },
1900
- },
1901
- },
1902
- }
1903
- ```
1904
-
1905
- - `allowBundled`: optional allowlist for bundled skills only (managed/workspace skills unaffected).
1906
- - `entries.<skillKey>.enabled: false` disables a skill even if bundled/installed.
1907
- - `entries.<skillKey>.apiKey`: convenience for skills declaring a primary env var.
1908
-
1909
- ---
1910
-
1911
- ## Plugins
1912
-
1913
- ```json5
1914
- {
1915
- plugins: {
1916
- enabled: true,
1917
- allow: ["voice-call"],
1918
- deny: [],
1919
- load: {
1920
- paths: ["~/Projects/oss/voice-call-extension"],
1921
- },
1922
- entries: {
1923
- "voice-call": {
1924
- enabled: true,
1925
- config: { provider: "twilio" },
1926
- },
1927
- },
1928
- },
1929
- }
1930
- ```
1931
-
1932
- - Loaded from `~/.symi/extensions`, `<workspace>/.symi/extensions`, plus `plugins.load.paths`.
1933
- - **Config changes require a gateway restart.**
1934
- - `allow`: optional allowlist (only listed plugins load). `deny` wins.
1935
-
1936
- See [Plugins](/tools/plugin).
1937
-
1938
- ---
1939
-
1940
- ## Browser
1941
-
1942
- ```json5
1943
- {
1944
- browser: {
1945
- enabled: true,
1946
- evaluateEnabled: true,
1947
- defaultProfile: "chrome",
1948
- profiles: {
1949
- symi: { cdpPort: 18800, color: "#FF4500" },
1950
- work: { cdpPort: 18801, color: "#0066CC" },
1951
- remote: { cdpUrl: "http://10.0.0.42:9222", color: "#00AA00" },
1952
- },
1953
- color: "#FF4500",
1954
- // headless: false,
1955
- // noSandbox: false,
1956
- // executablePath: "/Applications/Brave Browser.app/Contents/MacOS/Brave Browser",
1957
- // attachOnly: false,
1958
- },
1959
- }
1960
- ```
1961
-
1962
- - `evaluateEnabled: false` disables `act:evaluate` and `wait --fn`.
1963
- - Remote profiles are attach-only (start/stop/reset disabled).
1964
- - Auto-detect order: default browser if Chromium-based → Chrome → Brave → Edge → Chromium → Chrome Canary.
1965
- - Control service: loopback only (port derived from `gateway.port`, default `18791`).
1966
-
1967
- ---
1968
-
1969
- ## UI
1970
-
1971
- ```json5
1972
- {
1973
- ui: {
1974
- seamColor: "#FF4500",
1975
- assistant: {
1976
- name: "Symi",
1977
- avatar: "CB", // emoji, short text, image URL, or data URI
1978
- },
1979
- },
1980
- }
1981
- ```
1982
-
1983
- - `seamColor`: accent color for native app UI chrome (Talk Mode bubble tint, etc.).
1984
- - `assistant`: Control UI identity override. Falls back to active agent identity.
1985
-
1986
- ---
1987
-
1988
- ## Gateway
1989
-
1990
- ```json5
1991
- {
1992
- gateway: {
1993
- mode: "local", // local | remote
1994
- port: 18789,
1995
- bind: "loopback",
1996
- auth: {
1997
- mode: "token", // none | token | password | trusted-proxy
1998
- token: "your-token",
1999
- // password: "your-password", // or SYMI_GATEWAY_PASSWORD
2000
- // trustedProxy: { userHeader: "x-forwarded-user" }, // for mode=trusted-proxy; see /gateway/trusted-proxy-auth
2001
- allowTailscale: true,
2002
- rateLimit: {
2003
- maxAttempts: 10,
2004
- windowMs: 60000,
2005
- lockoutMs: 300000,
2006
- exemptLoopback: true,
2007
- },
2008
- },
2009
- tailscale: {
2010
- mode: "off", // off | serve | funnel
2011
- resetOnExit: false,
2012
- },
2013
- controlUi: {
2014
- enabled: true,
2015
- basePath: "/symi",
2016
- // root: "dist/control-ui",
2017
- // allowInsecureAuth: false,
2018
- // dangerouslyDisableDeviceAuth: false,
2019
- },
2020
- remote: {
2021
- url: "ws://gateway.tailnet:18789",
2022
- transport: "ssh", // ssh | direct
2023
- token: "your-token",
2024
- // password: "your-password",
2025
- },
2026
- trustedProxies: ["10.0.0.1"],
2027
- // Optional. Default false.
2028
- allowRealIpFallback: false,
2029
- tools: {
2030
- // Additional /tools/invoke HTTP denies
2031
- deny: ["browser"],
2032
- // Remove tools from the default HTTP deny list
2033
- allow: ["gateway"],
2034
- },
2035
- },
2036
- }
2037
- ```
2038
-
2039
- <Accordion title="Gateway field details">
2040
-
2041
- - `mode`: `local` (run gateway) or `remote` (connect to remote gateway). Gateway refuses to start unless `local`.
2042
- - `port`: single multiplexed port for WS + HTTP. Precedence: `--port` > `SYMI_GATEWAY_PORT` > `gateway.port` > `18789`.
2043
- - `bind`: `auto`, `loopback` (default), `lan` (`0.0.0.0`), `tailnet` (Tailscale IP only), or `custom`.
2044
- - **Auth**: required by default. Non-loopback binds require a shared token/password. Onboarding wizard generates a token by default.
2045
- - `auth.mode: "none"`: explicit no-auth mode. Use only for trusted local loopback setups; this is intentionally not offered by onboarding prompts.
2046
- - `auth.mode: "trusted-proxy"`: delegate auth to an identity-aware reverse proxy and trust identity headers from `gateway.trustedProxies` (see [Trusted Proxy Auth](/gateway/trusted-proxy-auth)).
2047
- - `auth.allowTailscale`: when `true`, Tailscale Serve identity headers can satisfy Control UI/WebSocket auth (verified via `tailscale whois`); HTTP API endpoints still require token/password auth. This tokenless flow assumes the gateway host is trusted. Defaults to `true` when `tailscale.mode = "serve"`.
2048
- - `auth.rateLimit`: optional failed-auth limiter. Applies per client IP and per auth scope (shared-secret and device-token are tracked independently). Blocked attempts return `429` + `Retry-After`.
2049
- - `auth.rateLimit.exemptLoopback` defaults to `true`; set `false` when you intentionally want localhost traffic rate-limited too (for test setups or strict proxy deployments).
2050
- - `tailscale.mode`: `serve` (tailnet only, loopback bind) or `funnel` (public, requires auth).
2051
- - `remote.transport`: `ssh` (default) or `direct` (ws/wss). For `direct`, `remote.url` must be `ws://` or `wss://`.
2052
- - `gateway.remote.token` is for remote CLI calls only; does not enable local gateway auth.
2053
- - `trustedProxies`: reverse proxy IPs that terminate TLS. Only list proxies you control.
2054
- - `allowRealIpFallback`: when `true`, the gateway accepts `X-Real-IP` if `X-Forwarded-For` is missing. Default `false` for fail-closed behavior.
2055
- - `gateway.tools.deny`: extra tool names blocked for HTTP `POST /tools/invoke` (extends default deny list).
2056
- - `gateway.tools.allow`: remove tool names from the default HTTP deny list.
2057
-
2058
- </Accordion>
2059
-
2060
- ### OpenAI-compatible endpoints
2061
-
2062
- - Chat Completions: disabled by default. Enable with `gateway.http.endpoints.chatCompletions.enabled: true`.
2063
- - Responses API: `gateway.http.endpoints.responses.enabled`.
2064
- - Responses URL-input hardening:
2065
- - `gateway.http.endpoints.responses.maxUrlParts`
2066
- - `gateway.http.endpoints.responses.files.urlAllowlist`
2067
- - `gateway.http.endpoints.responses.images.urlAllowlist`
2068
-
2069
- ### Multi-instance isolation
2070
-
2071
- Run multiple gateways on one host with unique ports and state dirs:
2072
-
2073
- ```bash
2074
- SYMI_CONFIG_PATH=~/.symi/a.json \
2075
- SYMI_STATE_DIR=~/.symi-a \
2076
- symi gateway --port 19001
2077
- ```
2078
-
2079
- Convenience flags: `--dev` (uses `~/.symi-dev` + port `19001`), `--profile <name>` (uses `~/.symi-<name>`).
2080
-
2081
- See [Multiple Gateways](/gateway/multiple-gateways).
2082
-
2083
- ---
2084
-
2085
- ## Hooks
2086
-
2087
- ```json5
2088
- {
2089
- hooks: {
2090
- enabled: true,
2091
- token: "shared-secret",
2092
- path: "/hooks",
2093
- maxBodyBytes: 262144,
2094
- defaultSessionKey: "hook:ingress",
2095
- allowRequestSessionKey: false,
2096
- allowedSessionKeyPrefixes: ["hook:"],
2097
- allowedAgentIds: ["hooks", "main"],
2098
- presets: ["gmail"],
2099
- transformsDir: "~/.symi/hooks/transforms",
2100
- mappings: [
2101
- {
2102
- match: { path: "gmail" },
2103
- action: "agent",
2104
- agentId: "hooks",
2105
- wakeMode: "now",
2106
- name: "Gmail",
2107
- sessionKey: "hook:gmail:{{messages[0].id}}",
2108
- messageTemplate: "From: {{messages[0].from}}\nSubject: {{messages[0].subject}}\n{{messages[0].snippet}}",
2109
- deliver: true,
2110
- channel: "last",
2111
- model: "openai/gpt-5.2-mini",
2112
- },
2113
- ],
2114
- },
2115
- }
2116
- ```
2117
-
2118
- Auth: `Authorization: Bearer <token>` or `x-symi-token: <token>`.
2119
-
2120
- **Endpoints:**
2121
-
2122
- - `POST /hooks/wake` → `{ text, mode?: "now"|"next-heartbeat" }`
2123
- - `POST /hooks/agent` → `{ message, name?, agentId?, sessionKey?, wakeMode?, deliver?, channel?, to?, model?, thinking?, timeoutSeconds? }`
2124
- - `sessionKey` from request payload is accepted only when `hooks.allowRequestSessionKey=true` (default: `false`).
2125
- - `POST /hooks/<name>` → resolved via `hooks.mappings`
2126
-
2127
- <Accordion title="Mapping details">
2128
-
2129
- - `match.path` matches sub-path after `/hooks` (e.g. `/hooks/gmail` → `gmail`).
2130
- - `match.source` matches a payload field for generic paths.
2131
- - Templates like `{{messages[0].subject}}` read from the payload.
2132
- - `transform` can point to a JS/TS module returning a hook action.
2133
- - `transform.module` must be a relative path and stays within `hooks.transformsDir` (absolute paths and traversal are rejected).
2134
- - `agentId` routes to a specific agent; unknown IDs fall back to default.
2135
- - `allowedAgentIds`: restricts explicit routing (`*` or omitted = allow all, `[]` = deny all).
2136
- - `defaultSessionKey`: optional fixed session key for hook agent runs without explicit `sessionKey`.
2137
- - `allowRequestSessionKey`: allow `/hooks/agent` callers to set `sessionKey` (default: `false`).
2138
- - `allowedSessionKeyPrefixes`: optional prefix allowlist for explicit `sessionKey` values (request + mapping), e.g. `["hook:"]`.
2139
- - `deliver: true` sends final reply to a channel; `channel` defaults to `last`.
2140
- - `model` overrides LLM for this hook run (must be allowed if model catalog is set).
2141
-
2142
- </Accordion>
2143
-
2144
- ### Gmail integration
2145
-
2146
- ```json5
2147
- {
2148
- hooks: {
2149
- gmail: {
2150
- account: "symi@gmail.com",
2151
- topic: "projects/<project-id>/topics/gog-gmail-watch",
2152
- subscription: "gog-gmail-watch-push",
2153
- pushToken: "shared-push-token",
2154
- hookUrl: "http://127.0.0.1:18789/hooks/gmail",
2155
- includeBody: true,
2156
- maxBytes: 20000,
2157
- renewEveryMinutes: 720,
2158
- serve: { bind: "127.0.0.1", port: 8788, path: "/" },
2159
- tailscale: { mode: "funnel", path: "/gmail-pubsub" },
2160
- model: "openrouter/meta-llama/llama-3.3-70b-instruct:free",
2161
- thinking: "off",
2162
- },
2163
- },
2164
- }
2165
- ```
2166
-
2167
- - Gateway auto-starts `gog gmail watch serve` on boot when configured. Set `SYMI_SKIP_GMAIL_WATCHER=1` to disable.
2168
- - Don't run a separate `gog gmail watch serve` alongside the Gateway.
2169
-
2170
- ---
2171
-
2172
- ## Canvas host
2173
-
2174
- ```json5
2175
- {
2176
- canvasHost: {
2177
- root: "~/.symi/workspace/canvas",
2178
- liveReload: true,
2179
- // enabled: false, // or SYMI_SKIP_CANVAS_HOST=1
2180
- },
2181
- }
2182
- ```
2183
-
2184
- - Serves agent-editable HTML/CSS/JS and A2UI over HTTP under the Gateway port:
2185
- - `http://<gateway-host>:<gateway.port>/__symi__/canvas/`
2186
- - `http://<gateway-host>:<gateway.port>/__symi__/a2ui/`
2187
- - Local-only: keep `gateway.bind: "loopback"` (default).
2188
- - Non-loopback binds: canvas routes require Gateway auth (token/password/trusted-proxy), same as other Gateway HTTP surfaces.
2189
- - Node WebViews typically don't send auth headers; after a node is paired and connected, the Gateway advertises node-scoped capability URLs for canvas/A2UI access.
2190
- - Capability URLs are bound to the active node WS session and expire quickly. IP-based fallback is not used.
2191
- - Injects live-reload client into served HTML.
2192
- - Auto-creates starter `index.html` when empty.
2193
- - Also serves A2UI at `/__symi__/a2ui/`.
2194
- - Changes require a gateway restart.
2195
- - Disable live reload for large directories or `EMFILE` errors.
2196
-
2197
- ---
2198
-
2199
- ## Discovery
2200
-
2201
- ### mDNS (Bonjour)
2202
-
2203
- ```json5
2204
- {
2205
- discovery: {
2206
- mdns: {
2207
- mode: "minimal", // minimal | full | off
2208
- },
2209
- },
2210
- }
2211
- ```
2212
-
2213
- - `minimal` (default): omit `cliPath` + `sshPort` from TXT records.
2214
- - `full`: include `cliPath` + `sshPort`.
2215
- - Hostname defaults to `symi`. Override with `SYMI_MDNS_HOSTNAME`.
2216
-
2217
- ### Wide-area (DNS-SD)
2218
-
2219
- ```json5
2220
- {
2221
- discovery: {
2222
- wideArea: { enabled: true },
2223
- },
2224
- }
2225
- ```
2226
-
2227
- Writes a unicast DNS-SD zone under `~/.symi/dns/`. For cross-network discovery, pair with a DNS server (CoreDNS recommended) + Tailscale split DNS.
2228
-
2229
- Setup: `symi dns setup --apply`.
2230
-
2231
- ---
2232
-
2233
- ## Environment
2234
-
2235
- ### `env` (inline env vars)
2236
-
2237
- ```json5
2238
- {
2239
- env: {
2240
- OPENROUTER_API_KEY: "sk-or-...",
2241
- vars: {
2242
- GROQ_API_KEY: "gsk-...",
2243
- },
2244
- shellEnv: {
2245
- enabled: true,
2246
- timeoutMs: 15000,
2247
- },
2248
- },
2249
- }
2250
- ```
2251
-
2252
- - Inline env vars are only applied if the process env is missing the key.
2253
- - `.env` files: CWD `.env` + `~/.symi/.env` (neither overrides existing vars).
2254
- - `shellEnv`: imports missing expected keys from your login shell profile.
2255
- - See [Environment](/help/environment) for full precedence.
2256
-
2257
- ### Env var substitution
2258
-
2259
- Reference env vars in any config string with `${VAR_NAME}`:
2260
-
2261
- ```json5
2262
- {
2263
- gateway: {
2264
- auth: { token: "${SYMI_GATEWAY_TOKEN}" },
2265
- },
2266
- }
2267
- ```
2268
-
2269
- - Only uppercase names matched: `[A-Z_][A-Z0-9_]*`.
2270
- - Missing/empty vars throw an error at config load.
2271
- - Escape with `$${VAR}` for a literal `${VAR}`.
2272
- - Works with `$include`.
2273
-
2274
- ---
2275
-
2276
- ## Auth storage
2277
-
2278
- ```json5
2279
- {
2280
- auth: {
2281
- profiles: {
2282
- "anthropic:me@example.com": { provider: "anthropic", mode: "oauth", email: "me@example.com" },
2283
- "anthropic:work": { provider: "anthropic", mode: "api_key" },
2284
- },
2285
- order: {
2286
- anthropic: ["anthropic:me@example.com", "anthropic:work"],
2287
- },
2288
- },
2289
- }
2290
- ```
2291
-
2292
- - Per-agent auth profiles stored at `<agentDir>/auth-profiles.json`.
2293
- - Legacy OAuth imports from `~/.symi/credentials/oauth.json`.
2294
- - See [OAuth](/concepts/oauth).
2295
-
2296
- ---
2297
-
2298
- ## Logging
2299
-
2300
- ```json5
2301
- {
2302
- logging: {
2303
- level: "info",
2304
- file: "/tmp/symi/symi.log",
2305
- consoleLevel: "info",
2306
- consoleStyle: "pretty", // pretty | compact | json
2307
- redactSensitive: "tools", // off | tools
2308
- redactPatterns: ["\\bTOKEN\\b\\s*[=:]\\s*([\"']?)([^\\s\"']+)\\1"],
2309
- },
2310
- }
2311
- ```
2312
-
2313
- - Default log file: `/tmp/symi/symi-YYYY-MM-DD.log`.
2314
- - Set `logging.file` for a stable path.
2315
- - `consoleLevel` bumps to `debug` when `--verbose`.
2316
-
2317
- ---
2318
-
2319
- ## Wizard
2320
-
2321
- Metadata written by CLI wizards (`onboard`, `configure`, `doctor`):
2322
-
2323
- ```json5
2324
- {
2325
- wizard: {
2326
- lastRunAt: "2026-01-01T00:00:00.000Z",
2327
- lastRunVersion: "2026.1.4",
2328
- lastRunCommit: "abc1234",
2329
- lastRunCommand: "configure",
2330
- lastRunMode: "local",
2331
- },
2332
- }
2333
- ```
2334
-
2335
- ---
2336
-
2337
- ## Identity
2338
-
2339
- ```json5
2340
- {
2341
- agents: {
2342
- list: [
2343
- {
2344
- id: "main",
2345
- identity: {
2346
- name: "Samantha",
2347
- theme: "helpful sloth",
2348
- emoji: "🦥",
2349
- avatar: "avatars/samantha.png",
2350
- },
2351
- },
2352
- ],
2353
- },
2354
- }
2355
- ```
2356
-
2357
- Written by the macOS onboarding assistant. Derives defaults:
2358
-
2359
- - `messages.ackReaction` from `identity.emoji` (falls back to 👀)
2360
- - `mentionPatterns` from `identity.name`/`identity.emoji`
2361
- - `avatar` accepts: workspace-relative path, `http(s)` URL, or `data:` URI
2362
-
2363
- ---
2364
-
2365
- ## Bridge (legacy, removed)
2366
-
2367
- Current builds no longer include the TCP bridge. Nodes connect over the Gateway WebSocket. `bridge.*` keys are no longer part of the config schema (validation fails until removed; `symi doctor --fix` can strip unknown keys).
2368
-
2369
- <Accordion title="Legacy bridge config (historical reference)">
2370
-
2371
- ```json
2372
- {
2373
- "bridge": {
2374
- "enabled": true,
2375
- "port": 18790,
2376
- "bind": "tailnet",
2377
- "tls": {
2378
- "enabled": true,
2379
- "autoGenerate": true
2380
- }
2381
- }
2382
- }
2383
- ```
2384
-
2385
- </Accordion>
2386
-
2387
- ---
2388
-
2389
- ## Cron
2390
-
2391
- ```json5
2392
- {
2393
- cron: {
2394
- enabled: true,
2395
- maxConcurrentRuns: 2,
2396
- webhook: "https://example.invalid/legacy", // deprecated fallback for stored notify:true jobs
2397
- webhookToken: "replace-with-dedicated-token", // optional bearer token for outbound webhook auth
2398
- sessionRetention: "24h", // duration string or false
2399
- },
2400
- }
2401
- ```
2402
-
2403
- - `sessionRetention`: how long to keep completed cron sessions before pruning. Default: `24h`.
2404
- - `webhookToken`: bearer token used for cron webhook POST delivery (`delivery.mode = "webhook"`), if omitted no auth header is sent.
2405
- - `webhook`: deprecated legacy fallback webhook URL (http/https) used only for stored jobs that still have `notify: true`.
2406
-
2407
- See [Cron Jobs](/automation/cron-jobs).
2408
-
2409
- ---
2410
-
2411
- ## Media model template variables
2412
-
2413
- Template placeholders expanded in `tools.media.*.models[].args`:
2414
-
2415
- | Variable | Description |
2416
- | ------------------ | ----------------------------------------- |
2417
- | `{{Body}}` | Full inbound message body |
2418
- | `{{RawBody}}` | Raw body (no history/sender wrappers) |
2419
- | `{{BodyStripped}}` | Body with group mentions stripped |
2420
- | `{{From}}` | Sender identifier |
2421
- | `{{To}}` | Destination identifier |
2422
- | `{{MessageSid}}` | Channel message id |
2423
- | `{{SessionId}}` | Current session UUID |
2424
- | `{{IsNewSession}}` | `"true"` when new session created |
2425
- | `{{MediaUrl}}` | Inbound media pseudo-URL |
2426
- | `{{MediaPath}}` | Local media path |
2427
- | `{{MediaType}}` | Media type (image/audio/document/…) |
2428
- | `{{Transcript}}` | Audio transcript |
2429
- | `{{Prompt}}` | Resolved media prompt for CLI entries |
2430
- | `{{MaxChars}}` | Resolved max output chars for CLI entries |
2431
- | `{{ChatType}}` | `"direct"` or `"group"` |
2432
- | `{{GroupSubject}}` | Group subject (best effort) |
2433
- | `{{GroupMembers}}` | Group members preview (best effort) |
2434
- | `{{SenderName}}` | Sender display name (best effort) |
2435
- | `{{SenderE164}}` | Sender phone number (best effort) |
2436
-
2437
- ---
2438
-
2439
- ## Config includes (`$include`)
2440
-
2441
- Split config into multiple files:
2442
-
2443
- ```json5
2444
- // ~/.symi/symi.json
2445
- {
2446
- gateway: { port: 18789 },
2447
- agents: { $include: "./agents.json5" },
2448
- broadcast: {
2449
- $include: ["./clients/mueller.json5", "./clients/schmidt.json5"],
2450
- },
2451
- }
2452
- ```
2453
-
2454
- **Merge behavior:**
2455
-
2456
- - Single file: replaces the containing object.
2457
- - Array of files: deep-merged in order (later overrides earlier).
2458
- - Sibling keys: merged after includes (override included values).
2459
- - Nested includes: up to 10 levels deep.
2460
- - Paths: resolved relative to the including file, but must stay inside the top-level config directory (`dirname` of the main config file). Absolute/`../` forms are allowed only when they still resolve inside that boundary.
2461
- - Errors: clear messages for missing files, parse errors, and circular includes.
2462
-
2463
- ---
2464
-
2465
- _Related: [Configuration](/gateway/configuration) · [Configuration Examples](/gateway/configuration-examples) · [Doctor](/gateway/doctor)_