@symerian/symi 2.7.8 → 2.7.10

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 (197) hide show
  1. package/dist/{acp-cli-DV6gYjcL.js → acp-cli-DwKj-AqM.js} +1 -1
  2. package/dist/{acp-cli-6peVIuMz.js → acp-cli-lkOF8AeX.js} +1 -1
  3. package/dist/{agents-DhWccW-I.js → agents-Qr0BDw_h.js} +5 -5
  4. package/dist/{agents.config-DwibJO90.js → agents.config-D0ih9tP3.js} +1 -1
  5. package/dist/{agents.config-ByNtHnqX.js → agents.config-DIjsIDbS.js} +1 -1
  6. package/dist/{audio-preflight-DIXDvyz5.js → audio-preflight-D0nJ1LEt.js} +4 -4
  7. package/dist/{audit-BZU2PNKl.js → audit-DVUHZrf4.js} +1 -1
  8. package/dist/{audit-CaFXenfE.js → audit-DgAM_dWL.js} +1 -1
  9. package/dist/{auth-choice-Divyczym.js → auth-choice-DhI8MW-5.js} +2 -2
  10. package/dist/{auth-choice-DOQ4Xf6i.js → auth-choice-PdYn-qiM.js} +2 -2
  11. package/dist/{banner-Cyi2LLe-.js → banner-BQhYK_Ag.js} +1 -1
  12. package/dist/{browser-cli-DUcEYbmP.js → browser-cli-CQKRSqbb.js} +2 -2
  13. package/dist/{browser-cli-DM3GvpUm.js → browser-cli-ClxJjz9C.js} +2 -2
  14. package/dist/build-info.json +3 -3
  15. package/dist/bundled/boot-md/handler.js +6 -6
  16. package/dist/bundled/session-memory/handler.js +6 -6
  17. package/dist/{call-CJl0moIs.js → call-BrRWr7Lj.js} +1 -0
  18. package/dist/{call-BHn18ubR.js → call-CVqBgwrx.js} +1 -0
  19. package/dist/canvas-host/a2ui/.bundle.hash +1 -1
  20. package/dist/{channel-options-C1sGPky6.js → channel-options-CFwo8sFR.js} +1 -1
  21. package/dist/{channel-options-Bk4m4-d5.js → channel-options-ZHpChVVk.js} +1 -1
  22. package/dist/{channel-web-BKbzqQ7x.js → channel-web-UmRhDGhI.js} +1 -1
  23. package/dist/{channels-cli-CAz8gCcs.js → channels-cli-CRDgQtex.js} +6 -6
  24. package/dist/{channels-cli-CGOOVbGf.js → channels-cli-rzQvsXSw.js} +6 -6
  25. package/dist/{chrome-ROtrXlNs.js → chrome-C08Z0XAa.js} +7 -7
  26. package/dist/cli/daemon-cli.js +1 -1
  27. package/dist/{cli-7JBNvH2_.js → cli-CC9jaj6w.js} +3 -3
  28. package/dist/{cli-C0zcu-AX.js → cli-DN6fX0Xu.js} +3 -3
  29. package/dist/{command-registry-BGMCr778.js → command-registry-CH1cn-Lz.js} +10 -10
  30. package/dist/{completion-cli-EO1xz8q6.js → completion-cli-BgneZQ7D.js} +1 -1
  31. package/dist/{completion-cli-B1wj8Q43.js → completion-cli-CG24rSh8.js} +2 -2
  32. package/dist/{config-cli-B9RnWD0Y.js → config-cli-CXa7oMTX.js} +1 -1
  33. package/dist/{config-cli-QugXKbsV.js → config-cli-DVEOa8P5.js} +1 -1
  34. package/dist/{configure-DOfxxuzV.js → configure-BDxyPzBl.js} +6 -6
  35. package/dist/{configure-C_BD9gNf.js → configure-U2yrALDt.js} +6 -6
  36. package/dist/control-ui/css/style.css +213 -6
  37. package/dist/control-ui/index.html +24 -2
  38. package/dist/control-ui/js/connections.js +113 -5
  39. package/dist/{cron-cli-CH0XOOxj.js → cron-cli--z6DSGhk.js} +2 -2
  40. package/dist/{cron-cli-DBt3Lxhm.js → cron-cli-DZJZ_EvY.js} +2 -2
  41. package/dist/{daemon-cli-BRMcpQb7.js → daemon-cli-B9yneKpO.js} +2 -2
  42. package/dist/{daemon-cli-DZeTm_F2.js → daemon-cli-bwFAShzf.js} +2 -2
  43. package/dist/daemon-cli.js +1 -0
  44. package/dist/{deliver-BC3liFsT.js → deliver-CLZGlRZt.js} +1 -1
  45. package/dist/{devices-cli-DwCYjYyV.js → devices-cli-fVRpoa9z.js} +1 -1
  46. package/dist/{devices-cli-C7aaQeFG.js → devices-cli-oqibXYae.js} +1 -1
  47. package/dist/{doctor-completion-DL-ojJGb.js → doctor-completion-8zSqfzuU.js} +1 -1
  48. package/dist/{doctor-completion-Dm4QxJdc.js → doctor-completion-ny9DIsuL.js} +1 -1
  49. package/dist/entry.js +1 -1
  50. package/dist/{exec-approvals-cli-BcwVEh83.js → exec-approvals-cli-BpOqYXNL.js} +3 -3
  51. package/dist/{exec-approvals-cli-CWpi7F1X.js → exec-approvals-cli-DjGZKQbZ.js} +3 -3
  52. package/dist/extensionAPI.js +1 -1
  53. package/dist/{gateway-cli-DcrPLnL3.js → gateway-cli-CmfMdGhz.js} +14 -13
  54. package/dist/{gateway-cli-DyFOMcg2.js → gateway-cli-Dg0UoYav.js} +14 -13
  55. package/dist/{gateway-rpc-BzkjTxlD.js → gateway-rpc-Bp0KNJtL.js} +1 -1
  56. package/dist/{gateway-rpc-CJPoGX_W.js → gateway-rpc-XT8cFwtz.js} +1 -1
  57. package/dist/{glass-ui-ws-Czh-1YjO.js → glass-ui-ws-Bgpyl16w.js} +10 -10
  58. package/dist/{glass-ui-ws-nxFknxgE.js → glass-ui-ws-aKGCf5hN.js} +10 -10
  59. package/dist/{health-CFd-Q1SH.js → health-Bj8mUXDd.js} +48 -14
  60. package/dist/{health-1ZDwurPU.js → health-D9pKXesa.js} +48 -14
  61. package/dist/{hooks-cli-C4tUO222.js → hooks-cli-5G9JN39f.js} +4 -4
  62. package/dist/{hooks-cli-nKBiWE2v.js → hooks-cli-DtVT3wM_.js} +4 -4
  63. package/dist/{image-C6v6m8Id.js → image-BnO8X_hj.js} +1 -1
  64. package/dist/index.js +8 -8
  65. package/dist/llm-slug-generator.js +6 -6
  66. package/dist/{logs-cli-DWqkAMwy.js → logs-cli-gU7p7zX0.js} +2 -2
  67. package/dist/{logs-cli-q93Kur4b.js → logs-cli-tJPD_Dps.js} +2 -2
  68. package/dist/{models-Cd9pFy1G.js → models-DQthIpnz.js} +3 -3
  69. package/dist/{models-cli-Cxo55E0S.js → models-cli-D8zc0jSg.js} +5 -5
  70. package/dist/{models-cli-CSqy5xI0.js → models-cli-UaHeUaJq.js} +4 -4
  71. package/dist/{nodes-cli-BHVOxukb.js → nodes-cli-6vHqlpLI.js} +2 -2
  72. package/dist/{nodes-cli-seBKfjdd.js → nodes-cli-DxHMNlWq.js} +2 -2
  73. package/dist/{onboard-SceHniST.js → onboard-B7CIWmHb.js} +3 -3
  74. package/dist/{onboard-CVKCZHVL.js → onboard-CYYcbEPR.js} +3 -3
  75. package/dist/{onboard-channels-BI-59zLH.js → onboard-channels-CUUTFx1F.js} +1 -1
  76. package/dist/{onboard-channels-KGMbYFcP.js → onboard-channels-HyGv2y5c.js} +1 -1
  77. package/dist/{onboard-helpers-BV3zKTt_.js → onboard-helpers-7H_XiJt-.js} +1 -1
  78. package/dist/{onboard-helpers-BFyI1sla.js → onboard-helpers-CPSKXD5k.js} +1 -1
  79. package/dist/{onboard-remote-C-EvSvV9.js → onboard-remote-BlCdyTsP.js} +1 -1
  80. package/dist/{onboard-remote-CvtBwhma.js → onboard-remote-DFavRxQ6.js} +1 -1
  81. package/dist/{onboard-skills-C1jrqA-P.js → onboard-skills-CssuFDjw.js} +1 -1
  82. package/dist/{onboard-skills-CWaMGMQi.js → onboard-skills-DVtfVPsB.js} +1 -1
  83. package/dist/{onboarding-Bs3JhONv.js → onboarding-BHnEBXBG.js} +7 -7
  84. package/dist/{onboarding-BPjquWC3.js → onboarding-CchD1d-n.js} +7 -7
  85. package/dist/{onboarding.finalize-lAwIuZFE.js → onboarding.finalize-BZ6tQzoC.js} +8 -8
  86. package/dist/{onboarding.finalize-Dbx89qG2.js → onboarding.finalize-CnzLAjla.js} +9 -9
  87. package/dist/{onboarding.gateway-config-Btb5PaGv.js → onboarding.gateway-config-TM8ERKyn.js} +2 -2
  88. package/dist/{onboarding.gateway-config-gMhAsXgO.js → onboarding.gateway-config-vGTQDqA6.js} +2 -2
  89. package/dist/{pi-embedded-CG4P3hy3.js → pi-embedded-BIATvD3R.js} +3 -2
  90. package/dist/{pi-embedded-helpers-BUNbSNWw.js → pi-embedded-helpers-DcN8GHTt.js} +4 -4
  91. package/dist/{plugin-registry-DSrgdZKM.js → plugin-registry-7MeuYUTG.js} +1 -1
  92. package/dist/{plugin-registry-C4aoDdOB.js → plugin-registry-Dx8MaVaX.js} +1 -1
  93. package/dist/plugin-sdk/{channel-web-CsZ6epLT.js → channel-web-C6_r-2VI.js} +1 -1
  94. package/dist/plugin-sdk/index.js +2 -2
  95. package/dist/plugin-sdk/{reply-Rv3jE0Rs.js → reply-CIDYJYie.js} +3 -2
  96. package/dist/plugin-sdk/{web-D6R4__wu.js → web-CHKraWl6.js} +2 -2
  97. package/dist/{plugins-cli-DJM_xxIg.js → plugins-cli-bblxpPhT.js} +4 -4
  98. package/dist/{plugins-cli-CSwcV2M6.js → plugins-cli-oatWFlGr.js} +4 -4
  99. package/dist/{program-CtX7o1VN.js → program-cj70FFee.js} +9 -9
  100. package/dist/{program-context-B2HPYMcn.js → program-context-DSkr5IEn.js} +28 -28
  101. package/dist/{prompt-select-styled-5a7_K1sn.js → prompt-select-styled-C9MQv67C.js} +6 -6
  102. package/dist/{prompt-select-styled-Cs79EjHm.js → prompt-select-styled-DxtxwQmE.js} +6 -6
  103. package/dist/{provider-auth-helpers-DOa1Rc3D.js → provider-auth-helpers-CezJXPrZ.js} +1 -1
  104. package/dist/{provider-auth-helpers-fWAoFIwZ.js → provider-auth-helpers-D9BOiQMP.js} +1 -1
  105. package/dist/{push-apns-HnaGVJwW.js → push-apns-CL2MBhWP.js} +1 -1
  106. package/dist/{push-apns-Dnd_jTU-.js → push-apns-DUWtWoB-.js} +1 -1
  107. package/dist/{pw-ai-BLrC_W1X.js → pw-ai-B476LzSK.js} +1 -1
  108. package/dist/{register.agent-CaputGWT.js → register.agent-B-v1ixge.js} +8 -8
  109. package/dist/{register.agent-lqb5eXZs.js → register.agent-Dms0oymW.js} +7 -7
  110. package/dist/{register.configure-C3AQZaAa.js → register.configure-BP_a-E21.js} +10 -10
  111. package/dist/{register.configure-C0KBR4e6.js → register.configure-DcwAboPG.js} +10 -10
  112. package/dist/{register.maintenance-DLY3bZTm.js → register.maintenance-C4tn55a5.js} +9 -9
  113. package/dist/{register.maintenance-c8Ig4nYO.js → register.maintenance-D_1D-fbi.js} +10 -10
  114. package/dist/{register.message-CUclEFp5.js → register.message-Csn-WBH0.js} +4 -4
  115. package/dist/{register.message-Bexo7F0u.js → register.message-FsBEsQeD.js} +4 -4
  116. package/dist/{register.onboard-CVmFRJ__.js → register.onboard-CHpUtNWT.js} +6 -6
  117. package/dist/{register.onboard-DpeqS3GT.js → register.onboard-OXqQs97I.js} +6 -6
  118. package/dist/{register.setup-DogqYYN7.js → register.setup-C8FuEUO_.js} +6 -6
  119. package/dist/{register.setup-NiDBVZE2.js → register.setup-DbPNjezQ.js} +6 -6
  120. package/dist/{register.status-health-sessions-C5noW7M3.js → register.status-health-sessions-BzB_lPbR.js} +6 -6
  121. package/dist/{register.status-health-sessions-CTErhiR9.js → register.status-health-sessions-c8vq6An_.js} +6 -6
  122. package/dist/{register.subclis-E_1XOkdf.js → register.subclis-Dt0Az0gT.js} +19 -19
  123. package/dist/{reply-DAMo5JhO.js → reply-B0azB7WR.js} +4 -4
  124. package/dist/{rpc-IXmOgc1l.js → rpc-CHb_JvbM.js} +1 -1
  125. package/dist/{rpc-k8pnK8TE.js → rpc-Cog-Z1rx.js} +1 -1
  126. package/dist/{run-main-Cv91hLSK.js → run-main-D-OIb2fr.js} +16 -16
  127. package/dist/{runner-QX0Z6K1w.js → runner-D5nFF9E6.js} +1 -1
  128. package/dist/{security-cli-Cxmb5Rpv.js → security-cli-B5s73Le2.js} +2 -2
  129. package/dist/{security-cli-BsStEfWU.js → security-cli-CzWHkrqD.js} +2 -2
  130. package/dist/{server-methods-CXL1Nrbp.js → server-methods-Dph_r18S.js} +68 -10
  131. package/dist/{server-methods-C_rhjm5p.js → server-methods-b55BoGQD.js} +68 -10
  132. package/dist/{server-node-events-B_UZBZn_.js → server-node-events-AVxH5dXs.js} +4 -4
  133. package/dist/{server-node-events-CdUVoXvg.js → server-node-events-Ba9K9DB9.js} +4 -4
  134. package/dist/{status-CzI_lZth.js → status-Bbss-JjB.js} +5 -5
  135. package/dist/{status-DQQ-w3eF.js → status-Cg3Vn5FV.js} +5 -5
  136. package/dist/{status-Ds4oB9tJ.js → status-CpWkGj5h.js} +1 -1
  137. package/dist/{status-Drn5xFtL.js → status-DNxAYvxM.js} +1 -1
  138. package/dist/{subagent-registry-CfoRc8ng.js → subagent-registry-CsYeP8wc.js} +4 -4
  139. package/dist/{system-cli-DnlgTnqh.js → system-cli-D3CVv1ab.js} +2 -2
  140. package/dist/{system-cli-CQNazJoF.js → system-cli-rpyy5jcw.js} +2 -2
  141. package/dist/{tui-CXTwJqpz.js → tui-DfPeXwah.js} +1 -1
  142. package/dist/{tui-DTW81r9y.js → tui-LZPdrFmK.js} +1 -1
  143. package/dist/{tui-cli-KiaTeKr0.js → tui-cli-Bm3TJgXf.js} +2 -2
  144. package/dist/{tui-cli-DGmt1Xs0.js → tui-cli-DFXZ7r1F.js} +2 -2
  145. package/dist/{unified-runner-DweFv8Vx.js → unified-runner-BojeuKIk.js} +17 -16
  146. package/dist/{update-cli-Ba4La00X.js → update-cli-DO0A0UCN.js} +10 -10
  147. package/dist/{update-cli-BkJZPKh8.js → update-cli-Dh_GPhI4.js} +11 -11
  148. package/dist/{update-runner-w3GO-spo.js → update-runner-BE6kDMsw.js} +1 -1
  149. package/dist/{update-runner-CqWSrJXt.js → update-runner-Cv6hDgKV.js} +1 -1
  150. package/dist/{web-0cG6_ynp.js → web-BOv3xM7W.js} +4 -4
  151. package/dist/{web-DHAEIalz.js → web-CYf5I3aU.js} +3 -3
  152. package/dist/{web-9rrJ5lZr.js → web-Dxkxcp7P.js} +6 -6
  153. package/dist/{web-Cx3SfQiX.js → web-Ifwqx6Dt.js} +1 -1
  154. package/docs/connections/email.md +143 -0
  155. package/docs/connections/msteams.md +80 -0
  156. package/docs/connections/slack.md +91 -0
  157. package/extensions/bluebubbles/package.json +1 -1
  158. package/extensions/copilot-proxy/package.json +1 -1
  159. package/extensions/diagnostics-otel/package.json +1 -1
  160. package/extensions/discord/package.json +1 -1
  161. package/extensions/feishu/package.json +1 -1
  162. package/extensions/google-antigravity-auth/package.json +1 -1
  163. package/extensions/google-gemini-cli-auth/package.json +1 -1
  164. package/extensions/googlechat/package.json +1 -1
  165. package/extensions/imessage/package.json +1 -1
  166. package/extensions/irc/package.json +1 -1
  167. package/extensions/learning-loop/package.json +1 -1
  168. package/extensions/line/package.json +1 -1
  169. package/extensions/llm-task/package.json +1 -1
  170. package/extensions/matrix/CHANGELOG.md +12 -0
  171. package/extensions/matrix/package.json +1 -1
  172. package/extensions/mattermost/package.json +1 -1
  173. package/extensions/memory-core/package.json +1 -1
  174. package/extensions/memory-lancedb/package.json +1 -1
  175. package/extensions/minimax-portal-auth/package.json +1 -1
  176. package/extensions/msteams/CHANGELOG.md +12 -0
  177. package/extensions/msteams/package.json +1 -1
  178. package/extensions/nextcloud-talk/package.json +1 -1
  179. package/extensions/nostr/CHANGELOG.md +12 -0
  180. package/extensions/nostr/package.json +1 -1
  181. package/extensions/open-prose/package.json +1 -1
  182. package/extensions/outlook/package.json +1 -1
  183. package/extensions/pipeline/package.json +1 -1
  184. package/extensions/signal/package.json +1 -1
  185. package/extensions/slack/package.json +1 -1
  186. package/extensions/telegram/package.json +1 -1
  187. package/extensions/tlon/package.json +1 -1
  188. package/extensions/twitch/CHANGELOG.md +12 -0
  189. package/extensions/twitch/package.json +1 -1
  190. package/extensions/voice-call/CHANGELOG.md +12 -0
  191. package/extensions/voice-call/package.json +1 -1
  192. package/extensions/whatsapp/package.json +1 -1
  193. package/extensions/zalo/CHANGELOG.md +12 -0
  194. package/extensions/zalo/package.json +1 -1
  195. package/extensions/zalouser/CHANGELOG.md +12 -0
  196. package/extensions/zalouser/package.json +1 -1
  197. package/package.json +1 -1
@@ -1,6 +1,6 @@
1
1
  import { t as __exportAll } from "./rolldown-runtime-Cbj13DAv.js";
2
2
  import { an as getPrimaryCommand, cn as hasHelpOrVersion } from "./entry.js";
3
- import { i as registerSubCliCommands, o as reparseProgramFromActionArgs } from "./register.subclis-E_1XOkdf.js";
3
+ import { i as registerSubCliCommands, o as reparseProgramFromActionArgs } from "./register.subclis-Dt0Az0gT.js";
4
4
 
5
5
  //#region src/cli/program/command-registry.ts
6
6
  var command_registry_exports = /* @__PURE__ */ __exportAll({
@@ -22,7 +22,7 @@ const coreEntries = [
22
22
  hasSubcommands: false
23
23
  }],
24
24
  register: async ({ program }) => {
25
- (await import("./register.setup-DogqYYN7.js")).registerSetupCommand(program);
25
+ (await import("./register.setup-C8FuEUO_.js")).registerSetupCommand(program);
26
26
  }
27
27
  },
28
28
  {
@@ -32,7 +32,7 @@ const coreEntries = [
32
32
  hasSubcommands: false
33
33
  }],
34
34
  register: async ({ program }) => {
35
- (await import("./register.onboard-CVmFRJ__.js")).registerOnboardCommand(program);
35
+ (await import("./register.onboard-CHpUtNWT.js")).registerOnboardCommand(program);
36
36
  }
37
37
  },
38
38
  {
@@ -42,7 +42,7 @@ const coreEntries = [
42
42
  hasSubcommands: false
43
43
  }],
44
44
  register: async ({ program }) => {
45
- (await import("./register.configure-C0KBR4e6.js")).registerConfigureCommand(program);
45
+ (await import("./register.configure-DcwAboPG.js")).registerConfigureCommand(program);
46
46
  }
47
47
  },
48
48
  {
@@ -52,7 +52,7 @@ const coreEntries = [
52
52
  hasSubcommands: true
53
53
  }],
54
54
  register: async ({ program }) => {
55
- (await import("./config-cli-QugXKbsV.js")).registerConfigCli(program);
55
+ (await import("./config-cli-DVEOa8P5.js")).registerConfigCli(program);
56
56
  }
57
57
  },
58
58
  {
@@ -79,7 +79,7 @@ const coreEntries = [
79
79
  }
80
80
  ],
81
81
  register: async ({ program }) => {
82
- (await import("./register.maintenance-c8Ig4nYO.js")).registerMaintenanceCommands(program);
82
+ (await import("./register.maintenance-D_1D-fbi.js")).registerMaintenanceCommands(program);
83
83
  }
84
84
  },
85
85
  {
@@ -89,7 +89,7 @@ const coreEntries = [
89
89
  hasSubcommands: true
90
90
  }],
91
91
  register: async ({ program, ctx }) => {
92
- (await import("./register.message-CUclEFp5.js")).registerMessageCommands(program, ctx);
92
+ (await import("./register.message-Csn-WBH0.js")).registerMessageCommands(program, ctx);
93
93
  }
94
94
  },
95
95
  {
@@ -113,7 +113,7 @@ const coreEntries = [
113
113
  hasSubcommands: true
114
114
  }],
115
115
  register: async ({ program, ctx }) => {
116
- (await import("./register.agent-CaputGWT.js")).registerAgentCommands(program, { agentChannelOptions: ctx.agentChannelOptions });
116
+ (await import("./register.agent-B-v1ixge.js")).registerAgentCommands(program, { agentChannelOptions: ctx.agentChannelOptions });
117
117
  }
118
118
  },
119
119
  {
@@ -135,7 +135,7 @@ const coreEntries = [
135
135
  }
136
136
  ],
137
137
  register: async ({ program }) => {
138
- (await import("./register.status-health-sessions-C5noW7M3.js")).registerStatusHealthSessionsCommands(program);
138
+ (await import("./register.status-health-sessions-BzB_lPbR.js")).registerStatusHealthSessionsCommands(program);
139
139
  }
140
140
  },
141
141
  {
@@ -145,7 +145,7 @@ const coreEntries = [
145
145
  hasSubcommands: true
146
146
  }],
147
147
  register: async ({ program }) => {
148
- (await import("./browser-cli-DUcEYbmP.js")).registerBrowserCli(program);
148
+ (await import("./browser-cli-CQKRSqbb.js")).registerBrowserCli(program);
149
149
  }
150
150
  }
151
151
  ];
@@ -2,7 +2,7 @@ import { t as __exportAll } from "./rolldown-runtime-Cbj13DAv.js";
2
2
  import { g as resolveStateDir } from "./paths-Cqn-zk3M.js";
3
3
  import { h as pathExists } from "./utils-B-0b9bGM.js";
4
4
  import { i as routeLogsToStderr } from "./subsystem-D9vIQve0.js";
5
- import { a as registerCoreCliByName, c as getSubCliEntries, l as registerSubCliByName, r as getCoreCliCommandNames, t as getProgramContext } from "./program-context-B2HPYMcn.js";
5
+ import { a as registerCoreCliByName, c as getSubCliEntries, l as registerSubCliByName, r as getCoreCliCommandNames, t as getProgramContext } from "./program-context-DSkr5IEn.js";
6
6
  import os from "node:os";
7
7
  import path from "node:path";
8
8
  import fs from "node:fs/promises";
@@ -1,7 +1,7 @@
1
1
  import { t as __exportAll } from "./rolldown-runtime-Cbj13DAv.js";
2
2
  import { Yt as resolveStateDir, l as routeLogsToStderr, nt as pathExists } from "./entry.js";
3
- import { n as getSubCliEntries, r as registerSubCliByName } from "./register.subclis-E_1XOkdf.js";
4
- import { i as registerCoreCliByName, n as getCoreCliCommandNames } from "./command-registry-BGMCr778.js";
3
+ import { n as getSubCliEntries, r as registerSubCliByName } from "./register.subclis-Dt0Az0gT.js";
4
+ import { i as registerCoreCliByName, n as getCoreCliCommandNames } from "./command-registry-CH1cn-Lz.js";
5
5
  import { t as getProgramContext } from "./program-context-CqzR_m-7.js";
6
6
  import os from "node:os";
7
7
  import path from "node:path";
@@ -206,7 +206,7 @@ async function runConfigUnset(opts) {
206
206
  }
207
207
  function registerConfigCli(program) {
208
208
  const cmd = program.command("config").description("Non-interactive config helpers (get/set/unset). Run without subcommand for the setup wizard.").addHelpText("after", () => `\n${theme.muted("Docs:")} ${formatDocsLink("/cli/config", "docs.symi.ai/cli/config")}\n`).option("--section <section>", "Configure wizard sections (repeatable). Use with no subcommand.", (value, previous) => [...previous, value], []).action(async (opts) => {
209
- const { configureCommandFromSectionsArg } = await import("./configure-DOfxxuzV.js").then((n) => n.t);
209
+ const { configureCommandFromSectionsArg } = await import("./configure-BDxyPzBl.js").then((n) => n.t);
210
210
  await configureCommandFromSectionsArg(opts.section, defaultRuntime);
211
211
  });
212
212
  cmd.command("get").description("Get a config value by dot path").argument("<path>", "Config path (dot or bracket notation)").option("--json", "Output JSON", false).action(async (path, opts) => {
@@ -201,7 +201,7 @@ async function runConfigUnset(opts) {
201
201
  }
202
202
  function registerConfigCli(program) {
203
203
  const cmd = program.command("config").description("Non-interactive config helpers (get/set/unset). Run without subcommand for the setup wizard.").addHelpText("after", () => `\n${theme.muted("Docs:")} ${formatDocsLink("/cli/config", "docs.symi.ai/cli/config")}\n`).option("--section <section>", "Configure wizard sections (repeatable). Use with no subcommand.", (value, previous) => [...previous, value], []).action(async (opts) => {
204
- const { configureCommandFromSectionsArg } = await import("./configure-C_BD9gNf.js").then((n) => n.t);
204
+ const { configureCommandFromSectionsArg } = await import("./configure-U2yrALDt.js").then((n) => n.t);
205
205
  await configureCommandFromSectionsArg(opts.section, defaultRuntime);
206
206
  });
207
207
  cmd.command("get").description("Get a config value by dot path").argument("<path>", "Config path (dot or bracket notation)").option("--json", "Output JSON", false).action(async (path, opts) => {
@@ -8,26 +8,26 @@ import { i as loadConfig, l as writeConfigFile, o as readConfigFileSnapshot } fr
8
8
  import { a as findTailscaleBinary } from "./tailscale-D5dKabOc.js";
9
9
  import { n as listChannelPlugins, t as getChannelPlugin } from "./plugins-DKDeQZF0.js";
10
10
  import { n as withProgress } from "./progress-jIePzvGA.js";
11
- import { a as ensureWorkspaceAndSessions, b as waitForGatewayReachable, g as resolveControlUiLinks, h as randomToken, m as probeGatewayReachable, n as applyWizardMetadata, p as printWizardHeader, s as guardCancel, t as DEFAULT_WORKSPACE, u as normalizeGatewayTokenInput, v as summarizeExistingConfig, y as validateGatewayPasswordInput } from "./onboard-helpers-BFyI1sla.js";
11
+ import { a as ensureWorkspaceAndSessions, b as waitForGatewayReachable, g as resolveControlUiLinks, h as randomToken, m as probeGatewayReachable, n as applyWizardMetadata, p as printWizardHeader, s as guardCancel, t as DEFAULT_WORKSPACE, u as normalizeGatewayTokenInput, v as summarizeExistingConfig, y as validateGatewayPasswordInput } from "./onboard-helpers-CPSKXD5k.js";
12
12
  import { n as stylePromptMessage, r as stylePromptTitle, t as stylePromptHint } from "./prompt-style-CnkMpSXt.js";
13
13
  import { t as note$1 } from "./note-DQ9BvHF2.js";
14
14
  import { t as WizardCancelledError } from "./prompts-CfOu9uZi.js";
15
15
  import { t as createClackPrompter } from "./clack-prompter-DMuVyYP2.js";
16
- import { r as setupChannels, t as noteChannelStatus } from "./onboard-channels-BI-59zLH.js";
16
+ import { r as setupChannels, t as noteChannelStatus } from "./onboard-channels-CUUTFx1F.js";
17
17
  import { a as gatewayInstallErrorHint, i as buildGatewayInstallPlan, n as GATEWAY_DAEMON_RUNTIME_OPTIONS, t as DEFAULT_GATEWAY_DAEMON_RUNTIME } from "./daemon-runtime-BT1zC2PU.js";
18
18
  import { t as resolveGatewayService } from "./service-osK70kTZ.js";
19
- import { r as healthCommand } from "./health-CFd-Q1SH.js";
19
+ import { r as healthCommand } from "./health-Bj8mUXDd.js";
20
20
  import { t as ensureControlUiAssetsBuilt } from "./control-ui-assets-B7moDVHX.js";
21
21
  import { n as logConfigUpdated } from "./logging-KpicI3yD.js";
22
22
  import { n as promptAuthChoiceGrouped } from "./auth-choice-prompt-Cn6U3t8O.js";
23
- import { i as applyAuthChoice, n as resolvePreferredProviderForAuthChoice } from "./auth-choice-Divyczym.js";
23
+ import { i as applyAuthChoice, n as resolvePreferredProviderForAuthChoice } from "./auth-choice-DhI8MW-5.js";
24
24
  import { a as promptDefaultModel, n as applyModelFallbacksFromSelection, o as promptModelAllowlist, r as applyPrimaryModel, t as applyModelAllowlist } from "./model-picker-D-n-rWyt.js";
25
25
  import { t as ensureSystemdUserLingerInteractive } from "./systemd-linger-DCskIKcx.js";
26
26
  import { a as promptCustomApiConfig } from "./onboard-custom-B3CBlZe5.js";
27
27
  import { i as TAILSCALE_MISSING_BIN_NOTE_LINES, n as TAILSCALE_DOCS_LINES, r as TAILSCALE_EXPOSURE_OPTIONS, t as validateIPv4AddressInput } from "./ipv4-CjlyK5jc.js";
28
28
  import { t as formatHealthCheckFailure } from "./health-format-DRCaak6L.js";
29
- import { n as promptRemoteGatewayConfig } from "./onboard-remote-C-EvSvV9.js";
30
- import { n as setupSkills } from "./onboard-skills-C1jrqA-P.js";
29
+ import { n as promptRemoteGatewayConfig } from "./onboard-remote-BlCdyTsP.js";
30
+ import { n as setupSkills } from "./onboard-skills-CssuFDjw.js";
31
31
  import { confirm, intro, outro, select, text } from "@clack/prompts";
32
32
 
33
33
  //#region src/commands/configure.shared.ts
@@ -6,26 +6,26 @@ import { i as loadConfig, l as writeConfigFile, o as readConfigFileSnapshot } fr
6
6
  import { n as listChannelPlugins, t as getChannelPlugin } from "./plugins-CwSlLxM8.js";
7
7
  import { a as findTailscaleBinary } from "./tailscale-CbbvYNVw.js";
8
8
  import { n as withProgress } from "./progress-BAHiAaDW.js";
9
- import { a as ensureWorkspaceAndSessions, b as waitForGatewayReachable, g as resolveControlUiLinks, h as randomToken, m as probeGatewayReachable, n as applyWizardMetadata, p as printWizardHeader, s as guardCancel, t as DEFAULT_WORKSPACE, u as normalizeGatewayTokenInput, v as summarizeExistingConfig, y as validateGatewayPasswordInput } from "./onboard-helpers-BV3zKTt_.js";
9
+ import { a as ensureWorkspaceAndSessions, b as waitForGatewayReachable, g as resolveControlUiLinks, h as randomToken, m as probeGatewayReachable, n as applyWizardMetadata, p as printWizardHeader, s as guardCancel, t as DEFAULT_WORKSPACE, u as normalizeGatewayTokenInput, v as summarizeExistingConfig, y as validateGatewayPasswordInput } from "./onboard-helpers-7H_XiJt-.js";
10
10
  import { n as stylePromptMessage, r as stylePromptTitle, t as stylePromptHint } from "./prompt-style-DwCXob2h.js";
11
11
  import { t as note$1 } from "./note-DDecZomM.js";
12
12
  import { t as WizardCancelledError } from "./prompts-m1IJwIAx.js";
13
13
  import { t as createClackPrompter } from "./clack-prompter-B1aVoXd5.js";
14
- import { r as setupChannels, t as noteChannelStatus } from "./onboard-channels-KGMbYFcP.js";
14
+ import { r as setupChannels, t as noteChannelStatus } from "./onboard-channels-HyGv2y5c.js";
15
15
  import { a as gatewayInstallErrorHint, i as buildGatewayInstallPlan, n as GATEWAY_DAEMON_RUNTIME_OPTIONS, t as DEFAULT_GATEWAY_DAEMON_RUNTIME } from "./daemon-runtime-BV78EN62.js";
16
16
  import { t as resolveGatewayService } from "./service-Cm9j9WzQ.js";
17
- import { r as healthCommand } from "./health-1ZDwurPU.js";
17
+ import { r as healthCommand } from "./health-D9pKXesa.js";
18
18
  import { t as ensureControlUiAssetsBuilt } from "./control-ui-assets-BseSWee1.js";
19
19
  import { n as logConfigUpdated } from "./logging-BGewRZy0.js";
20
20
  import { n as promptAuthChoiceGrouped } from "./auth-choice-prompt-DVcYPG2v.js";
21
- import { i as applyAuthChoice, n as resolvePreferredProviderForAuthChoice } from "./auth-choice-DOQ4Xf6i.js";
21
+ import { i as applyAuthChoice, n as resolvePreferredProviderForAuthChoice } from "./auth-choice-PdYn-qiM.js";
22
22
  import { a as promptDefaultModel, n as applyModelFallbacksFromSelection, o as promptModelAllowlist, r as applyPrimaryModel, t as applyModelAllowlist } from "./model-picker-RQfDGgfM.js";
23
23
  import { t as ensureSystemdUserLingerInteractive } from "./systemd-linger-DA_LW52P.js";
24
24
  import { a as promptCustomApiConfig } from "./onboard-custom-B1paBymW.js";
25
25
  import { i as TAILSCALE_MISSING_BIN_NOTE_LINES, n as TAILSCALE_DOCS_LINES, r as TAILSCALE_EXPOSURE_OPTIONS, t as validateIPv4AddressInput } from "./ipv4-B-xy96ST.js";
26
26
  import { t as formatHealthCheckFailure } from "./health-format-CzgUHmmX.js";
27
- import { n as promptRemoteGatewayConfig } from "./onboard-remote-CvtBwhma.js";
28
- import { n as setupSkills } from "./onboard-skills-CWaMGMQi.js";
27
+ import { n as promptRemoteGatewayConfig } from "./onboard-remote-DFavRxQ6.js";
28
+ import { n as setupSkills } from "./onboard-skills-DVtfVPsB.js";
29
29
  import { confirm, intro, outro, select, text } from "@clack/prompts";
30
30
 
31
31
  //#region src/commands/configure.shared.ts
@@ -440,7 +440,8 @@ body {
440
440
  white-space: nowrap;
441
441
  appearance: none;
442
442
  -webkit-appearance: none;
443
- background-image: linear-gradient(45deg, transparent 50%, currentColor 50%),
443
+ background-image:
444
+ linear-gradient(45deg, transparent 50%, currentColor 50%),
444
445
  linear-gradient(135deg, currentColor 50%, transparent 50%);
445
446
  background-position:
446
447
  calc(100% - 10px) 50%,
@@ -3630,10 +3631,18 @@ body {
3630
3631
  font-weight: 600;
3631
3632
  letter-spacing: 0.04em;
3632
3633
  }
3633
- .debug-type--chat { color: var(--accent-cyan); }
3634
- .debug-type--agent { color: var(--accent-purple); }
3635
- .debug-type--error { color: #ef4444; }
3636
- .debug-type--other { color: rgba(255, 255, 255, 0.4); }
3634
+ .debug-type--chat {
3635
+ color: var(--accent-cyan);
3636
+ }
3637
+ .debug-type--agent {
3638
+ color: var(--accent-purple);
3639
+ }
3640
+ .debug-type--error {
3641
+ color: #ef4444;
3642
+ }
3643
+ .debug-type--other {
3644
+ color: rgba(255, 255, 255, 0.4);
3645
+ }
3637
3646
 
3638
3647
  .debug-summary {
3639
3648
  color: rgba(255, 255, 255, 0.55);
@@ -4114,10 +4123,12 @@ body {
4114
4123
  display: flex;
4115
4124
  align-items: center;
4116
4125
  gap: 8px;
4126
+ font-family: inherit;
4117
4127
  font-size: 12px;
4118
4128
  font-weight: 500;
4119
4129
  color: var(--accent-cyan);
4120
4130
  text-decoration: none;
4131
+ cursor: pointer;
4121
4132
  padding: 8px 14px;
4122
4133
  background: rgba(0, 212, 255, 0.1);
4123
4134
  border: 1px solid rgba(0, 212, 255, 0.2);
@@ -4129,6 +4140,203 @@ body {
4129
4140
  border-color: rgba(0, 212, 255, 0.35);
4130
4141
  }
4131
4142
 
4143
+ /* ── Docs Viewer Modal (scrollable markdown viewer) ────────────────────── */
4144
+
4145
+ .docs-viewer-overlay {
4146
+ position: fixed;
4147
+ inset: 0;
4148
+ z-index: 9100;
4149
+ display: flex;
4150
+ align-items: center;
4151
+ justify-content: center;
4152
+ background: rgba(0, 0, 0, 0.75);
4153
+ backdrop-filter: blur(10px);
4154
+ opacity: 0;
4155
+ visibility: hidden;
4156
+ transition:
4157
+ opacity 0.25s ease,
4158
+ visibility 0.25s ease;
4159
+ }
4160
+ .docs-viewer-overlay.open {
4161
+ opacity: 1;
4162
+ visibility: visible;
4163
+ }
4164
+
4165
+ .docs-viewer {
4166
+ position: relative;
4167
+ width: 92%;
4168
+ max-width: 820px;
4169
+ max-height: 82vh;
4170
+ display: flex;
4171
+ flex-direction: column;
4172
+ background: linear-gradient(135deg, rgba(15, 15, 25, 0.98), rgba(10, 10, 18, 0.98));
4173
+ border: 1px solid rgba(255, 255, 255, 0.12);
4174
+ border-radius: 16px;
4175
+ box-shadow:
4176
+ 0 28px 90px rgba(0, 0, 0, 0.7),
4177
+ 0 0 1px rgba(255, 255, 255, 0.1);
4178
+ transform: scale(0.96) translateY(12px);
4179
+ transition: transform 0.25s ease;
4180
+ overflow: hidden;
4181
+ }
4182
+ .docs-viewer-overlay.open .docs-viewer {
4183
+ transform: scale(1) translateY(0);
4184
+ }
4185
+
4186
+ .docs-viewer-header {
4187
+ display: flex;
4188
+ align-items: center;
4189
+ gap: 14px;
4190
+ padding: 18px 22px;
4191
+ border-bottom: 1px solid rgba(255, 255, 255, 0.08);
4192
+ flex-shrink: 0;
4193
+ }
4194
+ .docs-viewer-title {
4195
+ flex: 1;
4196
+ font-size: 16px;
4197
+ font-weight: 600;
4198
+ color: var(--text);
4199
+ letter-spacing: 0.02em;
4200
+ }
4201
+ .docs-viewer-close {
4202
+ width: 34px;
4203
+ height: 34px;
4204
+ border: none;
4205
+ background: rgba(255, 255, 255, 0.06);
4206
+ border-radius: 8px;
4207
+ color: var(--text-muted);
4208
+ cursor: pointer;
4209
+ display: flex;
4210
+ align-items: center;
4211
+ justify-content: center;
4212
+ transition: all 0.2s ease;
4213
+ }
4214
+ .docs-viewer-close:hover {
4215
+ background: rgba(255, 255, 255, 0.12);
4216
+ color: var(--text);
4217
+ }
4218
+
4219
+ .docs-viewer-body {
4220
+ padding: 20px 28px 28px;
4221
+ overflow-y: auto;
4222
+ flex: 1 1 auto;
4223
+ color: var(--text);
4224
+ font-size: 14px;
4225
+ line-height: 1.6;
4226
+ }
4227
+ .docs-viewer-loading,
4228
+ .docs-viewer-error {
4229
+ color: var(--text-muted);
4230
+ font-style: italic;
4231
+ padding: 8px 0;
4232
+ }
4233
+ .docs-viewer-error {
4234
+ color: var(--accent-red, #f87171);
4235
+ font-style: normal;
4236
+ }
4237
+
4238
+ .docs-viewer-body h1,
4239
+ .docs-viewer-body h2,
4240
+ .docs-viewer-body h3,
4241
+ .docs-viewer-body h4 {
4242
+ color: var(--text);
4243
+ font-weight: 600;
4244
+ line-height: 1.3;
4245
+ margin-top: 1.4em;
4246
+ margin-bottom: 0.5em;
4247
+ }
4248
+ .docs-viewer-body h1 {
4249
+ font-size: 22px;
4250
+ margin-top: 0;
4251
+ }
4252
+ .docs-viewer-body h2 {
4253
+ font-size: 18px;
4254
+ border-bottom: 1px solid rgba(255, 255, 255, 0.08);
4255
+ padding-bottom: 6px;
4256
+ }
4257
+ .docs-viewer-body h3 {
4258
+ font-size: 15px;
4259
+ color: var(--accent-cyan);
4260
+ }
4261
+ .docs-viewer-body h4 {
4262
+ font-size: 13px;
4263
+ text-transform: uppercase;
4264
+ letter-spacing: 0.06em;
4265
+ color: var(--text-muted);
4266
+ }
4267
+ .docs-viewer-body p {
4268
+ margin: 0.6em 0;
4269
+ }
4270
+ .docs-viewer-body ul,
4271
+ .docs-viewer-body ol {
4272
+ margin: 0.5em 0;
4273
+ padding-left: 1.4em;
4274
+ }
4275
+ .docs-viewer-body li {
4276
+ margin: 0.25em 0;
4277
+ }
4278
+ .docs-viewer-body a {
4279
+ color: var(--accent-cyan);
4280
+ text-decoration: underline;
4281
+ text-underline-offset: 2px;
4282
+ }
4283
+ .docs-viewer-body a:hover {
4284
+ color: var(--text);
4285
+ }
4286
+ .docs-viewer-body code {
4287
+ font-family: var(--font-mono);
4288
+ font-size: 12.5px;
4289
+ background: rgba(255, 255, 255, 0.06);
4290
+ border: 1px solid rgba(255, 255, 255, 0.08);
4291
+ border-radius: 4px;
4292
+ padding: 1px 5px;
4293
+ color: var(--accent-cyan);
4294
+ }
4295
+ .docs-viewer-body pre {
4296
+ background: rgba(0, 0, 0, 0.45);
4297
+ border: 1px solid rgba(255, 255, 255, 0.08);
4298
+ border-radius: 8px;
4299
+ padding: 12px 14px;
4300
+ overflow-x: auto;
4301
+ margin: 0.8em 0;
4302
+ }
4303
+ .docs-viewer-body pre code {
4304
+ background: none;
4305
+ border: none;
4306
+ padding: 0;
4307
+ color: var(--text);
4308
+ font-size: 12px;
4309
+ line-height: 1.55;
4310
+ }
4311
+ .docs-viewer-body table {
4312
+ width: 100%;
4313
+ border-collapse: collapse;
4314
+ margin: 0.8em 0;
4315
+ font-size: 13px;
4316
+ }
4317
+ .docs-viewer-body th,
4318
+ .docs-viewer-body td {
4319
+ text-align: left;
4320
+ padding: 8px 10px;
4321
+ border: 1px solid rgba(255, 255, 255, 0.08);
4322
+ }
4323
+ .docs-viewer-body th {
4324
+ background: rgba(255, 255, 255, 0.04);
4325
+ font-weight: 600;
4326
+ color: var(--text);
4327
+ }
4328
+ .docs-viewer-body blockquote {
4329
+ border-left: 3px solid rgba(0, 212, 255, 0.4);
4330
+ margin: 0.8em 0;
4331
+ padding: 0.3em 0 0.3em 14px;
4332
+ color: var(--text-muted);
4333
+ }
4334
+ .docs-viewer-body hr {
4335
+ border: none;
4336
+ border-top: 1px solid rgba(255, 255, 255, 0.08);
4337
+ margin: 1.4em 0;
4338
+ }
4339
+
4132
4340
  /* ══════════════════════════════════════════════════════════════════════════
4133
4341
  SUBAGENTS PANEL
4134
4342
  ══════════════════════════════════════════════════════════════════════════ */
@@ -5488,4 +5696,3 @@ body {
5488
5696
  box-shadow: 0 0 0 4px rgba(239, 68, 68, 0);
5489
5697
  }
5490
5698
  }
5491
-
@@ -798,7 +798,7 @@
798
798
  </div>
799
799
  <div class="conn-modal-body" id="conn-modal-body"></div>
800
800
  <div class="conn-modal-footer" id="conn-modal-footer">
801
- <a class="conn-modal-docs" id="conn-modal-docs" href="#" target="_blank" rel="noopener">
801
+ <button class="conn-modal-docs" id="conn-modal-docs" type="button">
802
802
  <svg width="12" height="12" viewBox="0 0 24 24" fill="none">
803
803
  <path d="M4 19.5A2.5 2.5 0 0 1 6.5 17H20" stroke="currentColor" stroke-width="2" />
804
804
  <path
@@ -808,7 +808,29 @@
808
808
  />
809
809
  </svg>
810
810
  View Documentation
811
- </a>
811
+ </button>
812
+ </div>
813
+ </div>
814
+ </div>
815
+
816
+ <!-- ── Docs Viewer Modal (scrollable markdown viewer) ─────────────────── -->
817
+ <div class="docs-viewer-overlay" id="docs-viewer-overlay" aria-hidden="true">
818
+ <div class="docs-viewer" id="docs-viewer" role="dialog" aria-modal="true">
819
+ <div class="docs-viewer-header">
820
+ <div class="docs-viewer-title" id="docs-viewer-title">Documentation</div>
821
+ <button class="docs-viewer-close" id="docs-viewer-close" title="Close" type="button">
822
+ <svg width="16" height="16" viewBox="0 0 24 24" fill="none">
823
+ <path
824
+ d="M18 6L6 18M6 6l12 12"
825
+ stroke="currentColor"
826
+ stroke-width="2"
827
+ stroke-linecap="round"
828
+ />
829
+ </svg>
830
+ </button>
831
+ </div>
832
+ <div class="docs-viewer-body" id="docs-viewer-body">
833
+ <p class="docs-viewer-loading">Loading documentation…</p>
812
834
  </div>
813
835
  </div>
814
836
  </div>
@@ -11,7 +11,6 @@
11
11
  id: "slack",
12
12
  name: "Slack",
13
13
  configPath: "channels.slack",
14
- docsUrl: "https://docs.symi.ai/channels/slack",
15
14
  icon: `<svg viewBox="0 0 24 24" fill="currentColor">
16
15
  <path d="M5.042 15.165a2.528 2.528 0 0 1-2.52 2.523A2.528 2.528 0 0 1 0 15.165a2.527 2.527 0 0 1 2.522-2.52h2.52v2.52zm1.271 0a2.527 2.527 0 0 1 2.521-2.52 2.527 2.527 0 0 1 2.521 2.52v6.313A2.528 2.528 0 0 1 8.834 24a2.528 2.528 0 0 1-2.521-2.522v-6.313zM8.834 5.042a2.528 2.528 0 0 1-2.521-2.52A2.528 2.528 0 0 1 8.834 0a2.528 2.528 0 0 1 2.521 2.522v2.52H8.834zm0 1.271a2.528 2.528 0 0 1 2.521 2.521 2.528 2.528 0 0 1-2.521 2.521H2.522A2.528 2.528 0 0 1 0 8.834a2.528 2.528 0 0 1 2.522-2.521h6.312zm10.124 2.521a2.528 2.528 0 0 1 2.52-2.521A2.528 2.528 0 0 1 24 8.834a2.528 2.528 0 0 1-2.522 2.521h-2.52V8.834zm-1.271 0a2.528 2.528 0 0 1-2.521 2.521 2.528 2.528 0 0 1-2.521-2.521V2.522A2.528 2.528 0 0 1 15.166 0a2.528 2.528 0 0 1 2.521 2.522v6.312zm-2.521 10.124a2.528 2.528 0 0 1 2.521 2.52A2.528 2.528 0 0 1 15.166 24a2.528 2.528 0 0 1-2.521-2.522v-2.52h2.521zm0-1.271a2.528 2.528 0 0 1-2.521-2.521 2.528 2.528 0 0 1 2.521-2.521h6.312A2.528 2.528 0 0 1 24 15.166a2.528 2.528 0 0 1-2.522 2.521h-6.312z"/>
17
16
  </svg>`,
@@ -25,7 +24,6 @@
25
24
  id: "email",
26
25
  name: "Email",
27
26
  configPath: "hooks.gmail + outlook plugin",
28
- docsUrl: "https://docs.symi.ai/automation/gmail-pubsub",
29
27
  icon: `<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
30
28
  <rect x="2" y="4" width="20" height="16" rx="2"/>
31
29
  <path d="M22 6l-10 7L2 6"/>
@@ -39,7 +37,6 @@
39
37
  id: "msteams",
40
38
  name: "Microsoft Teams",
41
39
  configPath: "channels.msteams",
42
- docsUrl: "https://docs.symi.ai/channels/msteams",
43
40
  icon: `<svg viewBox="0 0 24 24" fill="currentColor">
44
41
  <path d="M19.19 8.77c-.73 0-1.39.29-1.88.76V8.5a2.5 2.5 0 0 0-2.5-2.5h-1.62c.18-.46.28-.96.28-1.48a4.04 4.04 0 0 0-4.04-4.04c-2.23 0-4.04 1.81-4.04 4.04 0 .52.1 1.02.28 1.48H4.5A2.5 2.5 0 0 0 2 8.5v9a2.5 2.5 0 0 0 2.5 2.5h9a2.5 2.5 0 0 0 2.5-2.5v-.97c.49.47 1.15.76 1.88.76a2.69 2.69 0 0 0 2.69-2.69v-3.14a2.69 2.69 0 0 0-2.69-2.69h.31zM9.43 2.98a2.04 2.04 0 1 1 0 4.08 2.04 2.04 0 0 1 0-4.08zm4.57 14.52a.5.5 0 0 1-.5.5h-9a.5.5 0 0 1-.5-.5v-9a.5.5 0 0 1 .5-.5h9a.5.5 0 0 1 .5.5v9zm5.88-4.17a.69.69 0 0 1-.69.69.69.69 0 0 1-.69-.69v-3.14c0-.38.31-.69.69-.69.38 0 .69.31.69.69v3.14z"/>
45
42
  <circle cx="17.5" cy="5.5" r="2.5"/>
@@ -175,6 +172,93 @@
175
172
  const modalDocs = document.getElementById("conn-modal-docs");
176
173
  const modalClose = document.getElementById("conn-modal-close");
177
174
 
175
+ // Docs viewer (in-app scrollable markdown renderer, stacks above conn modal)
176
+ const docsViewerOverlay = document.getElementById("docs-viewer-overlay");
177
+ const docsViewerBody = document.getElementById("docs-viewer-body");
178
+ const docsViewerTitle = document.getElementById("docs-viewer-title");
179
+ const docsViewerClose = document.getElementById("docs-viewer-close");
180
+
181
+ // Tracks which channel's connection modal is currently open, so the
182
+ // "View Documentation" button knows which docs key to fetch.
183
+ let currentModalChannelId = null;
184
+
185
+ const DOCS_VIEWER_TITLES = {
186
+ email: "Email — Outlook & Gmail",
187
+ slack: "Slack Setup",
188
+ msteams: "Microsoft Teams Setup",
189
+ };
190
+
191
+ function stripFrontmatter(markdown) {
192
+ if (!markdown.startsWith("---\n") && !markdown.startsWith("---\r\n")) {
193
+ return markdown;
194
+ }
195
+ const end = markdown.indexOf("\n---", 4);
196
+ if (end === -1) {
197
+ return markdown;
198
+ }
199
+ return markdown.slice(end + 4).replace(/^\s+/, "");
200
+ }
201
+
202
+ async function openDocsViewer(key) {
203
+ if (!docsViewerOverlay || !docsViewerBody) {
204
+ return;
205
+ }
206
+ docsViewerTitle.textContent = DOCS_VIEWER_TITLES[key] || "Documentation";
207
+ docsViewerBody.innerHTML = '<p class="docs-viewer-loading">Loading documentation…</p>';
208
+ docsViewerOverlay.classList.add("open");
209
+ docsViewerOverlay.setAttribute("aria-hidden", "false");
210
+ // Capture phase so we beat the conn-modal's Esc handler
211
+ document.addEventListener("keydown", onDocsViewerKey, true);
212
+
213
+ if (!window.gateway?.rpc) {
214
+ docsViewerBody.innerHTML =
215
+ '<p class="docs-viewer-error">Gateway is not connected — cannot load documentation.</p>';
216
+ return;
217
+ }
218
+ try {
219
+ const result = await window.gateway.rpc("docs.get", { key });
220
+ const markdown = result && typeof result.markdown === "string" ? result.markdown : "";
221
+ if (!markdown) {
222
+ docsViewerBody.innerHTML =
223
+ '<p class="docs-viewer-error">Documentation is empty or missing on this install.</p>';
224
+ return;
225
+ }
226
+ const body = stripFrontmatter(markdown);
227
+ const html =
228
+ window.marked && typeof window.marked.parse === "function"
229
+ ? window.marked.parse(body)
230
+ : "<pre>" + escHtml(body) + "</pre>";
231
+ docsViewerBody.innerHTML = html;
232
+ // Make external links open in a new tab with safe rel
233
+ docsViewerBody.querySelectorAll('a[href^="http"]').forEach((a) => {
234
+ a.setAttribute("target", "_blank");
235
+ a.setAttribute("rel", "noopener noreferrer");
236
+ });
237
+ docsViewerBody.scrollTop = 0;
238
+ } catch (err) {
239
+ const msg = err && err.message ? err.message : String(err);
240
+ docsViewerBody.innerHTML =
241
+ '<p class="docs-viewer-error">Failed to load documentation: ' + escHtml(msg) + "</p>";
242
+ }
243
+ }
244
+
245
+ function closeDocsViewer() {
246
+ if (!docsViewerOverlay) {
247
+ return;
248
+ }
249
+ docsViewerOverlay.classList.remove("open");
250
+ docsViewerOverlay.setAttribute("aria-hidden", "true");
251
+ document.removeEventListener("keydown", onDocsViewerKey, true);
252
+ }
253
+
254
+ function onDocsViewerKey(e) {
255
+ if (e.key === "Escape") {
256
+ // Stop the conn-modal's keydown listener from also firing
257
+ e.stopImmediatePropagation();
258
+ closeDocsViewer();
259
+ }
260
+ }
261
+
178
262
  function renderProviderSection(title, connected, detailLine, actionLine) {
179
263
  const klass = connected ? "connected" : "disconnected";
180
264
  const badge = connected ? "CONNECTED" : "NOT CONFIGURED";
@@ -229,8 +313,9 @@
229
313
  // Set title
230
314
  modalTitle.textContent = channel.name;
231
315
 
232
- // Set docs link
233
- modalDocs.href = channel.docsUrl;
316
+ // Remember which channel this modal is showing so the
317
+ // "View Documentation" button knows which docs key to fetch.
318
+ currentModalChannelId = channelId;
234
319
 
235
320
  if (channelId === "email") {
236
321
  modalBody.innerHTML = renderEmailModalBody(channelState);
@@ -285,6 +370,29 @@
285
370
  });
286
371
  }
287
372
 
373
+ // "View Documentation" button → open in-app docs viewer.
374
+ // The docs-viewer overlay stacks on top of the conn-modal.
375
+ if (modalDocs) {
376
+ modalDocs.addEventListener("click", (e) => {
377
+ e.preventDefault();
378
+ if (currentModalChannelId) {
379
+ void openDocsViewer(currentModalChannelId);
380
+ }
381
+ });
382
+ }
383
+
384
+ // Docs viewer event listeners
385
+ if (docsViewerClose) {
386
+ docsViewerClose.addEventListener("click", closeDocsViewer);
387
+ }
388
+ if (docsViewerOverlay) {
389
+ docsViewerOverlay.addEventListener("click", (e) => {
390
+ if (e.target === docsViewerOverlay) {
391
+ closeDocsViewer();
392
+ }
393
+ });
394
+ }
395
+
288
396
  // ── Handle Click ─────────────────────────────────────────────────────────
289
397
  function handleChannelClick(channelId) {
290
398
  openModal(channelId);
@@ -17,14 +17,14 @@ import "./accounts-DDuIpcln.js";
17
17
  import "./bindings-DFaVVCsf.js";
18
18
  import "./logging-w5jq5901.js";
19
19
  import "./client-B8xmq-Pw.js";
20
- import "./call-BHn18ubR.js";
20
+ import "./call-CVqBgwrx.js";
21
21
  import "./pairing-token-CX3NN_qj.js";
22
22
  import { t as formatDocsLink } from "./links-3i1eUga4.js";
23
23
  import "./progress-jIePzvGA.js";
24
24
  import { n as formatDurationHuman } from "./format-duration-D0B0Uo-I.js";
25
25
  import { i as parseAbsoluteTimeMs, n as resolveCronStaggerMs } from "./stagger-CvFURHzt.js";
26
26
  import { n as parsePositiveIntOrUndefined } from "./helpers-BtH6pa6c.js";
27
- import { n as callGatewayFromCli, t as addGatewayClientOptions } from "./gateway-rpc-BzkjTxlD.js";
27
+ import { n as callGatewayFromCli, t as addGatewayClientOptions } from "./gateway-rpc-Bp0KNJtL.js";
28
28
 
29
29
  //#region src/cli/cron-cli/shared.ts
30
30
  const getCronChannelOptions = () => ["last", ...listChannelPlugins().map((plugin) => plugin.id)].join("|");