@symerian/symi 3.4.30 → 3.4.32

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 (422) hide show
  1. package/dist/{agent-O3PihJOY.js → agent-BaSGoKPq.js} +17 -17
  2. package/dist/{agent-tdS4G7e8.js → agent-C8IIjDyn.js} +21 -21
  3. package/dist/{agent-scope-Ck_TLGsV.js → agent-scope-B6p555mP.js} +1 -1
  4. package/dist/{agent-scope-DJI5ijOw.js → agent-scope-DIjW66iO.js} +3 -3
  5. package/dist/{agents-C2MpIr16.js → agents-D6Ygz9ED.js} +12 -12
  6. package/dist/{agents.config-PPeqGzAc.js → agents.config-D1nFwU81.js} +1 -1
  7. package/dist/{agents.config-LRW5SZoE.js → agents.config-D7cHU-OU.js} +1 -1
  8. package/dist/{audit-TmPjr_wD.js → audit-BI8Rbs5q.js} +19 -19
  9. package/dist/{audit-yf3H4Y1h.js → audit-nqP-JeOr.js} +17 -17
  10. package/dist/{auth-BSmNj-Lv.js → auth-BbwD4lRX.js} +1 -1
  11. package/dist/{auth-choice-Bw2Kd6RM.js → auth-choice-BBrEzoy2.js} +8 -8
  12. package/dist/{auth-choice-CyBcsQ9T.js → auth-choice-Bx4Duu6u.js} +8 -8
  13. package/dist/{auth-profiles-C1lvfaCM.js → auth-profiles-BFSVvFKy.js} +6 -6
  14. package/dist/{auth-profiles-BG_wMJz6.js → auth-profiles-Bs5D0GUv.js} +4 -4
  15. package/dist/{auth-token-C0-TDuag.js → auth-token-Brb1Askz.js} +2 -2
  16. package/dist/{auth-token-BwQ5Nv4O.js → auth-token-SebYuqfR.js} +2 -2
  17. package/dist/{banner-D7__HlM-.js → banner-l9GjW5Rm.js} +2 -2
  18. package/dist/{bindings-D5s2VRjL.js → bindings-9LSA3Jr1.js} +1 -1
  19. package/dist/{bonjour-discovery-YoubCASb.js → bonjour-discovery-BTpm6P8H.js} +1 -1
  20. package/dist/{bonjour-discovery-CPzedvdf.js → bonjour-discovery-CU1mz7AC.js} +2 -2
  21. package/dist/{browser-cli-R6JagRCf.js → browser-cli-BAxOL41p.js} +22 -22
  22. package/dist/{browser-cli-B_6WWHm_.js → browser-cli-Bk8DxxeA.js} +13 -13
  23. package/dist/build-info.json +3 -3
  24. package/dist/bundled/boot-md/handler.js +4 -4
  25. package/dist/bundled/session-memory/handler.js +4 -4
  26. package/dist/{call-IfleM0ap.js → call-5IE9ycvm.js} +3 -4
  27. package/dist/{call-sikajorp.js → call-BPJn2_th.js} +5 -6
  28. package/dist/canvas-host/a2ui/.bundle.hash +1 -1
  29. package/dist/{catalog-DgsRZ5Yu.js → catalog-CJzUbDcX.js} +2 -2
  30. package/dist/{catalog-Bc0hKvgn.js → catalog-CSgSg5Gp.js} +2 -2
  31. package/dist/{channel-options-DrHwfPTb.js → channel-options-COanIUoQ.js} +5 -5
  32. package/dist/{channel-options-B5974x-7.js → channel-options-DGUqfnbP.js} +2 -2
  33. package/dist/{channel-selection-Cc4Pvn6b.js → channel-selection-BvIcXQLj.js} +2 -2
  34. package/dist/{channels-cli-D50PQAPc.js → channels-cli-B1zmnm5a.js} +83 -83
  35. package/dist/{channels-cli-C6Nv9mzy.js → channels-cli-CZ3M3yE1.js} +62 -62
  36. package/dist/{channels-status-issues-VZcSU4qT.js → channels-status-issues-DC8vgOMo.js} +1 -1
  37. package/dist/{chrome-DJCkCRLf.js → chrome-B0wRtBRB.js} +3 -3
  38. package/dist/{chrome-DT1fIVG1.js → chrome-B4P7ycw5.js} +7 -7
  39. package/dist/{chrome-CPSDqbK6.js → chrome-CQn8fDIy.js} +7 -7
  40. package/dist/{chrome-BM8HZu2p.js → chrome-VbDUdW0_.js} +4 -4
  41. package/dist/{chunk-D2_aCcvs.js → chunk-DQGU0F8t.js} +1 -1
  42. package/dist/{clack-prompter-BwhCW0Jc.js → clack-prompter-CWQQn_CK.js} +5 -5
  43. package/dist/cli-C7I5uEFC.js +128 -0
  44. package/dist/{cli-DZoms4qg.js → cli-CC5GrdTI.js} +52 -52
  45. package/dist/{client-Bcz3rG5V.js → client-Dp8LUTmF.js} +3 -5
  46. package/dist/{client-BzacpVvW.js → client-qjXXRKCO.js} +5 -7
  47. package/dist/{clipboard-Dz-Ob0yt.js → clipboard-McRwF3r0.js} +1 -1
  48. package/dist/{command-format-6B5tP-i9.js → command-format-Xm6vX3qJ.js} +1 -1
  49. package/dist/{command-registry--D98SJ6k.js → command-registry-D8fj6th4.js} +12 -12
  50. package/dist/{commands-DgyiLrAe.js → commands-B3UrgxIz.js} +2 -2
  51. package/dist/{commands-BN08daX-.js → commands-CHkx0oTl.js} +1 -1
  52. package/dist/{commands-registry-Bbs_ugoi.js → commands-registry-BNCcZy2y.js} +5 -5
  53. package/dist/{commands-registry-QB7xD3bc.js → commands-registry-Bccp0eH5.js} +3 -3
  54. package/dist/{completion-cli-CHYvpIPw.js → completion-cli-BxspmuYm.js} +3 -3
  55. package/dist/{completion-cli-QxWULepB.js → completion-cli-C-85b5b8.js} +4 -4
  56. package/dist/{config-vtCLkS2w.js → config-DqMsGcSQ.js} +7 -21
  57. package/dist/{config-cli-CcZo2229.js → config-cli-BqzjDmIH.js} +13 -13
  58. package/dist/{config-cli-DstpcB33.js → config-cli-DSDGwckX.js} +12 -12
  59. package/dist/{config-guard-CC-lFWDU.js → config-guard-CJcSKMuP.js} +21 -21
  60. package/dist/{config-guard-CCJrDmON.js → config-guard-Cu-dwAgi.js} +4 -4
  61. package/dist/{config-BTSBEAnk.js → config-igdtSRrZ.js} +10 -24
  62. package/dist/{config-validation-DSnQNdDO.js → config-validation-Bp2wJ610.js} +1 -1
  63. package/dist/{config-validation-YCrMlM9Z.js → config-validation-Bs1Gp2oG.js} +2 -2
  64. package/dist/{configure-B-UvSZZ7.js → configure-BazJdwKU.js} +14 -14
  65. package/dist/{configure-C4Qjzxdq.js → configure-Dl1f1Den.js} +25 -25
  66. package/dist/{consolidate-CPVaVTv0.js → consolidate-7Usm-b2g.js} +4 -4
  67. package/dist/{control-service-CwRG4M_O.js → control-service-DO8FjrS6.js} +4 -4
  68. package/dist/{control-service--TrXUUt_.js → control-service-Fn3d9AlH.js} +5 -5
  69. package/dist/{control-ui-assets-DI1jLkM6.js → control-ui-assets-DUhvOLUL.js} +2 -2
  70. package/dist/{cron-cli-DUETe3Of.js → cron-cli-DXgI5Lid.js} +10 -10
  71. package/dist/{cron-cli-BfUM5_Kw.js → cron-cli-DZyH2BfZ.js} +19 -19
  72. package/dist/{daemon-cli-DRDkDw_M.js → daemon-cli-C6FSROt1.js} +18 -18
  73. package/dist/{daemon-cli-Dy5eY4M7.js → daemon-cli-DmMYx5Uf.js} +10 -10
  74. package/dist/daemon-cli.js +0 -3
  75. package/dist/{daemon-runtime-ChztAKDA.js → daemon-runtime-2Y9RfgcP.js} +2 -2
  76. package/dist/{daemon-runtime-CqMnoGym.js → daemon-runtime-BpfA4d6Q.js} +2 -2
  77. package/dist/{deliver-59sRVaYQ.js → deliver-BkCYBlzi.js} +4 -4
  78. package/dist/{deliver-Mqq3tgqB.js → deliver-DvW5xHHr.js} +4 -4
  79. package/dist/{deliver-fvcQPsBc.js → deliver-RwovDEDy.js} +8 -8
  80. package/dist/{deliver-BHmK4isn.js → deliver-izdrXPr4.js} +5 -5
  81. package/dist/{delivery-queue-Du1ukE9B.js → delivery-queue-DDs84baU.js} +1 -1
  82. package/dist/{delivery-queue-Bqja5xKq.js → delivery-queue-nheCYaMd.js} +1 -1
  83. package/dist/{deps-CeHgkkO6.js → deps-bCHNuszw.js} +1 -1
  84. package/dist/{devices-cli-DV8wT4cj.js → devices-cli-D6xXc9Ym.js} +17 -17
  85. package/dist/{devices-cli-BCZ2HHjT.js → devices-cli-IMv-0zor.js} +9 -9
  86. package/dist/{diagnostic-Db9MI5bh.js → diagnostic-CwF3MnBL.js} +1 -1
  87. package/dist/{diagnostics-B9e2Kvx8.js → diagnostics-DxdqTfpW.js} +1 -1
  88. package/dist/{directory-cli-BVGd0l0T.js → directory-cli-3wlYB9In.js} +7 -7
  89. package/dist/{directory-cli-B6Ja7314.js → directory-cli-ClbYhd6z.js} +17 -17
  90. package/dist/{dm-policy-shared-Bjdk2L7B.js → dm-policy-shared-5HLej1br.js} +2 -2
  91. package/dist/{dm-policy-shared-BBTioONS.js → dm-policy-shared-CSF4Tw_F.js} +1 -1
  92. package/dist/{dns-cli-MEjZBWpL.js → dns-cli-CY2voLuR.js} +14 -14
  93. package/dist/{dns-cli-DH-ksmiI.js → dns-cli-CoVIqRWx.js} +8 -8
  94. package/dist/{dock-CSF4Y7tm.js → dock-CnGWTXL4.js} +2 -2
  95. package/dist/{docs-cli-BuX8FDdh.js → docs-cli-CFklWCND.js} +5 -5
  96. package/dist/{docs-cli-Cc3Rhfkx.js → docs-cli-DjQ3SvBq.js} +8 -8
  97. package/dist/{doctor-completion-rBc-f29C.js → doctor-completion-BwHbIZjF.js} +2 -2
  98. package/dist/{doctor-completion-C4Sf8CFV.js → doctor-completion-CX7LjkOD.js} +2 -2
  99. package/dist/{doctor-config-flow-CrnteetS.js → doctor-config-flow-CYDx1U0Z.js} +7 -7
  100. package/dist/{doctor-config-flow-BhmF6EAq.js → doctor-config-flow-wvoEFNeZ.js} +8 -8
  101. package/dist/entry.js +4 -7
  102. package/dist/{env-DoZWjLUy.js → env-B97Ms861.js} +1 -1
  103. package/dist/{exec-BcMHopF9.js → exec-DKyLtSjm.js} +2 -2
  104. package/dist/{exec-approvals-BndOYKTM.js → exec-approvals-B8n8es8o.js} +1 -1
  105. package/dist/{exec-approvals-BZBjOrJL.js → exec-approvals-CZOc8M5w.js} +1 -1
  106. package/dist/{exec-approvals-cli-Bqh3x_d1.js → exec-approvals-cli-B_P-1zVp.js} +24 -24
  107. package/dist/{exec-approvals-cli-CyXTXgft.js → exec-approvals-cli-Dy1jvh2M.js} +16 -16
  108. package/dist/extensionAPI.js +4 -4
  109. package/dist/{fetch-guard-BuQQKfW1.js → fetch-guard-DG6T0ZdL.js} +1 -1
  110. package/dist/{frontmatter-BH3ExkUY.js → frontmatter-B4levtVg.js} +2 -2
  111. package/dist/{gateway-cli-BrcMZGyF.js → gateway-cli-CTcK1Az2.js} +113 -114
  112. package/dist/{gateway-cli-fT43bqlv.js → gateway-cli-CW-Z71cE.js} +88 -89
  113. package/dist/{gateway-rpc-BEqCo2JK.js → gateway-rpc-C1xjWlxu.js} +1 -1
  114. package/dist/{gateway-rpc-cpgRv0Yq.js → gateway-rpc-DD_aXogj.js} +3 -3
  115. package/dist/{github-copilot-token-DIIEouRg.js → github-copilot-token-BTNK6Tcd.js} +1 -1
  116. package/dist/{github-copilot-token-CrM1aEWo.js → github-copilot-token-a6a53zx_.js} +1 -1
  117. package/dist/{glass-ui-ws-dERcmtve.js → glass-ui-ws-BNJkhJrL.js} +96 -96
  118. package/dist/{glass-ui-ws-BfMKuf9v.js → glass-ui-ws-BZvH4MBO.js} +68 -68
  119. package/dist/{gmail-setup-utils-Cz9Tb30q.js → gmail-setup-utils-B1BYpISg.js} +2 -2
  120. package/dist/{gmail-setup-utils-5bVmaBiu.js → gmail-setup-utils-fA1VaWLv.js} +3 -3
  121. package/dist/{health-Bpjd5_Oq.js → health-D8cKia4i.js} +10 -10
  122. package/dist/{health-DDxrkioj.js → health-DdzNc1yA.js} +5 -5
  123. package/dist/{health-format-BQcmGV4C.js → health-format-39e76m9p.js} +1 -1
  124. package/dist/{help-format-Bm9CoBSa.js → help-format-BI_G2p1e.js} +1 -1
  125. package/dist/{hooks-cli-Bkp-j7h6.js → hooks-cli-DkP3Y4ou.js} +76 -76
  126. package/dist/{hooks-cli-Btgk__9z.js → hooks-cli-qO421UdO.js} +59 -59
  127. package/dist/{hooks-status-BjjfBQnp.js → hooks-status-COU9Cw9_.js} +2 -2
  128. package/dist/{hooks-status-BaV4_YaJ.js → hooks-status-uaFS2SUa.js} +3 -3
  129. package/dist/{image-ops-CiGlXf65.js → image-ops-C-gIIp7Q.js} +1 -1
  130. package/dist/index.js +81 -81
  131. package/dist/{inspect-B_hklr0u.js → inspect-BDzd6yBs.js} +1 -1
  132. package/dist/{installs-DjzewzNC.js → installs-DhSLZRT7.js} +2 -2
  133. package/dist/{installs-B7y-N4mr.js → installs-cPraL4Dg.js} +2 -2
  134. package/dist/{lifecycle-core-CHB-QdED.js → lifecycle-core-BEmljRfh.js} +7 -7
  135. package/dist/{lifecycle-core-B0tG8ERp.js → lifecycle-core-uN2bsrZs.js} +3 -3
  136. package/dist/{links-Bmkpld9F.js → links-CSaUKNKm.js} +1 -1
  137. package/dist/{links-D4w-tJYZ.js → links-Db3Rw0Tg.js} +1 -1
  138. package/dist/llm-slug-generator.js +4 -4
  139. package/dist/{local-roots-DSeNuIW-.js → local-roots-Bk3321gv.js} +2 -2
  140. package/dist/{local-roots-lknhM9c3.js → local-roots-BnDnugq3.js} +3 -3
  141. package/dist/{logging-miJdTAeb.js → logging-B96FQvnn.js} +2 -2
  142. package/dist/{logging-DrqPd0Fg.js → logging-BeA4q4J_.js} +1 -1
  143. package/dist/{logs-cli-CUhZrDw7.js → logs-cli-BB0Mq8D1.js} +11 -11
  144. package/dist/{logs-cli-CGcdfvBo.js → logs-cli-Dbmzz8m_.js} +18 -18
  145. package/dist/{manager-BeNnzSJv.js → manager-BD_cpL9b.js} +1 -1
  146. package/dist/{manager-Di9qtuZF.js → manager-BQaZlWzK.js} +6 -6
  147. package/dist/{manager-uBAL1G42.js → manager-D0NIHMuQ.js} +1 -1
  148. package/dist/{manager-DqMx0qDw.js → manager-DOiW-Koo.js} +9 -9
  149. package/dist/{manifest-registry-0FO1WTmC.js → manifest-registry-DJcKcUQ9.js} +1 -1
  150. package/dist/{manifest-registry-DYQQ9Cci.js → manifest-registry-D_LsBSyt.js} +1 -1
  151. package/dist/{markdown-tables-Ca1j7TYS.js → markdown-tables-GTLvbzuR.js} +1 -1
  152. package/dist/{memory-BDeydRz3.js → memory-Cl4I_45k.js} +6 -6
  153. package/dist/{memory-cli-D4hZiGr5.js → memory-cli-CszP57Ee.js} +8 -8
  154. package/dist/{memory-cli-BXclq7qt.js → memory-cli-DkD_OD70.js} +13 -13
  155. package/dist/{memory-BXoRMmVn.js → memory-kIYeV9aO.js} +7 -7
  156. package/dist/{message-channel-BqrA0uMO.js → message-channel-C_V8IAYx.js} +1 -1
  157. package/dist/{model-DibfNW71.js → model-BRcKPW49.js} +1 -1
  158. package/dist/{model-Czbmn47-.js → model-DgN15006.js} +1 -1
  159. package/dist/{model-catalog-DPnCNs5N.js → model-catalog-C2rNhRI4.js} +4 -4
  160. package/dist/{model-catalog-Ds0dg_ob.js → model-catalog-CaGfL-2g.js} +4 -4
  161. package/dist/{model-picker-DuPommMc.js → model-picker-4NUXHy8M.js} +3 -3
  162. package/dist/{model-picker-BbaEgNir.js → model-picker-CV56GE8A.js} +3 -3
  163. package/dist/{models-B0wNKA18.js → models-BYi0Fo1a.js} +21 -21
  164. package/dist/{models-cli-CZY5Me88.js → models-cli-Bn9M1TgO.js} +83 -83
  165. package/dist/{models-cli-CL5K06Wu.js → models-cli-EdjvkvFO.js} +59 -59
  166. package/dist/{models-config-Box19p27.js → models-config-Unnduxgs.js} +3 -3
  167. package/dist/{models-config-CPlvO1b0.js → models-config-yKxNCn4V.js} +3 -3
  168. package/dist/{node-cli-BFBfD3vK.js → node-cli-39H0MZ8q.js} +36 -36
  169. package/dist/{node-cli-CWWMajKF.js → node-cli-C8FYMIjN.js} +21 -21
  170. package/dist/{node-service-CkP4-uRI.js → node-service-tPO_yUk7.js} +1 -1
  171. package/dist/{nodes-cli-BY4Ppctn.js → nodes-cli-C-03nIJ0.js} +22 -22
  172. package/dist/{nodes-cli-YmE7S-JB.js → nodes-cli-CqxQexTU.js} +14 -14
  173. package/dist/{nodes-screen-BfQScwqX.js → nodes-screen-Bkq2kswx.js} +2 -2
  174. package/dist/{nodes-screen-BMUoHTPZ.js → nodes-screen-JELuBMBi.js} +1 -1
  175. package/dist/{note-C4Pc_hIl.js → note-CHrtEumO.js} +2 -2
  176. package/dist/{npm-registry-spec-C8W7KCAB.js → npm-registry-spec-BXw_6vF6.js} +2 -2
  177. package/dist/{npm-registry-spec-s-9OX2Kw.js → npm-registry-spec-NLo2PCol.js} +1 -1
  178. package/dist/{onboard-DjlI4mIw.js → onboard-C8IQnigm.js} +19 -19
  179. package/dist/{onboard-HqUZVKyD.js → onboard-CAIujkV7.js} +13 -13
  180. package/dist/{onboard-channels-BbF5-N3g.js → onboard-channels-B2l6OoMg.js} +7 -7
  181. package/dist/{onboard-channels-C5EUFcLq.js → onboard-channels-D_uUQbem.js} +9 -9
  182. package/dist/{onboard-custom-C-6Cooq5.js → onboard-custom-B2fJvyxt.js} +3 -3
  183. package/dist/{onboard-custom-63SI3jrk.js → onboard-custom-DcZ2SEUv.js} +3 -3
  184. package/dist/{onboard-helpers-Cb3WFLl9.js → onboard-helpers-Bm-oyLWy.js} +5 -5
  185. package/dist/{onboard-helpers-Bpa6_3vl.js → onboard-helpers-CHfdRdZR.js} +9 -9
  186. package/dist/{onboard-hooks-ggR6fsQs.js → onboard-hooks-DBYkemjF.js} +8 -8
  187. package/dist/{onboard-hooks-DXXg3YH9.js → onboard-hooks-DgRzMz0E.js} +5 -5
  188. package/dist/{onboard-remote-Cnxe89N8.js → onboard-remote-ecyetiyL.js} +3 -3
  189. package/dist/{onboard-remote-CqtCrqtm.js → onboard-remote-z8XLK4M0.js} +3 -3
  190. package/dist/{onboard-skills-D5Ww8pwO.js → onboard-skills-BLvL0KPR.js} +4 -4
  191. package/dist/{onboard-skills-CS3l5fhH.js → onboard-skills-C53RGq_5.js} +5 -5
  192. package/dist/{onboarding-BPmsmDud.js → onboarding-4v9LJueP.js} +18 -18
  193. package/dist/{onboarding-Be_HJIFA.js → onboarding-BIq5BxG0.js} +16 -16
  194. package/dist/{onboarding.finalize-QwO5yuPm.js → onboarding.finalize-Bkcwe5RS.js} +51 -51
  195. package/dist/{onboarding.finalize-dsCUTKCQ.js → onboarding.finalize-CXAQzVXM.js} +32 -32
  196. package/dist/{onboarding.gateway-config-BZDShYzP.js → onboarding.gateway-config-3JMN1xRf.js} +22 -22
  197. package/dist/{onboarding.gateway-config-Ctd1_QW4.js → onboarding.gateway-config-Ft3f6Jba.js} +11 -11
  198. package/dist/{openai-model-default-Dxlm7Pvs.js → openai-model-default-BVPmAuXK.js} +3 -3
  199. package/dist/{openai-model-default-DT9-42Xb.js → openai-model-default-CDDFpxUr.js} +3 -3
  200. package/dist/{outbound-send-deps-DPsU_Xdy.js → outbound-send-deps-Dmc3B-LK.js} +1 -1
  201. package/dist/{pairing-cli-PtlNv7Gr.js → pairing-cli-B_icqS8Y.js} +9 -9
  202. package/dist/{pairing-cli-C1TeY-2m.js → pairing-cli-CJGA4j6G.js} +15 -15
  203. package/dist/{pairing-store-5oyzSW2X.js → pairing-store-BGf29nPx.js} +4 -4
  204. package/dist/{pairing-store-B9MEud_Y.js → pairing-store-CtBnCGHZ.js} +2 -2
  205. package/dist/{pairing-token-Cup-49D-.js → pairing-token-Bnr7QjVF.js} +1 -1
  206. package/dist/{pairing-token-BaZLnDjo.js → pairing-token-CURbSHdi.js} +1 -1
  207. package/dist/{path-env-C8hRAfiL.js → path-env-DuQralyy.js} +1 -1
  208. package/dist/{paths-By0XjHBk.js → paths-BSzKwaxE.js} +1 -4
  209. package/dist/{paths-BldkKgCk.js → paths-CJcw9nbZ.js} +1 -1
  210. package/dist/{paths-gcw23t43.js → paths-CNexk5_o.js} +1 -1
  211. package/dist/{paths-7zaGPdLp.js → paths-CsQkeUQ3.js} +1 -1
  212. package/dist/{paths-DeDKrl27.js → paths-Dc6A9_vI.js} +1 -1
  213. package/dist/{pi-auth-json-BOXWkXms.js → pi-auth-json-CUZ7IgY7.js} +1 -1
  214. package/dist/{pi-auth-json-DVUJqaKg.js → pi-auth-json-SHGGQzOL.js} +1 -1
  215. package/dist/{pi-embedded-Cp7d6jtB.js → pi-embedded-CGebiST2.js} +10 -13
  216. package/dist/{pi-embedded-helpers-CVKIHnFv.js → pi-embedded-helpers-BwBjqJM5.js} +2 -2
  217. package/dist/{pi-embedded-helpers-DMVyRPBT.js → pi-embedded-helpers-CAdI9wJ5.js} +4 -4
  218. package/dist/{pi-tools.policy-8_wTu7v2.js → pi-tools.policy-BaRznBvu.js} +3 -3
  219. package/dist/{pi-tools.policy-C5aC-K5q.js → pi-tools.policy-Dyx3nBmp.js} +5 -5
  220. package/dist/{plugin-auto-enable-CYoZQPJO.js → plugin-auto-enable-D2TNEv3x.js} +4 -4
  221. package/dist/{plugin-auto-enable-BWd5lJQf.js → plugin-auto-enable-DSliW8o4.js} +3 -3
  222. package/dist/{plugin-registry-BG51uZOA.js → plugin-registry-D7ACpV2Y.js} +3 -3
  223. package/dist/{plugin-registry-BouuQy-X.js → plugin-registry-d4hMhLLZ.js} +5 -5
  224. package/dist/plugin-sdk/gateway/protocol/index.d.ts +2 -5
  225. package/dist/plugin-sdk/gateway/protocol/schema/logs-chat.d.ts +0 -1
  226. package/dist/{plugins-CypN_04v.js → plugins-DuuHorqi.js} +1 -1
  227. package/dist/{plugins-cli-Bk7Al8u3.js → plugins-cli-CPf1hMaZ.js} +76 -76
  228. package/dist/{plugins-cli-B-zVOiQN.js → plugins-cli-D1gd8p9T.js} +58 -58
  229. package/dist/{ports-BgvsHTN5.js → ports-BAzQoIw0.js} +2 -2
  230. package/dist/{ports-YkSuli-C.js → ports-Cv4kt1bT.js} +1 -1
  231. package/dist/{ports-BxtK6PMH.js → ports-DRHSHvqY.js} +2 -2
  232. package/dist/{ports-CduvYJlk.js → ports-DqxP-bXz.js} +3 -3
  233. package/dist/{program-BOh0XGsA.js → program-C19G7o-Q.js} +63 -63
  234. package/dist/{program-context-D73fzUUe.js → program-context-BSUkEz3n.js} +39 -39
  235. package/dist/{progress-B3rWk9lR.js → progress-CyPyGCDn.js} +2 -2
  236. package/dist/{prompt-select-styled-Bz1VV3Qu.js → prompt-select-styled-B5wlPYN5.js} +40 -40
  237. package/dist/{prompt-select-styled-Bj-hrPCx.js → prompt-select-styled-CnYM7W0j.js} +24 -24
  238. package/dist/{prompt-style-LtRrtcTi.js → prompt-style-Cad0BDRS.js} +1 -1
  239. package/dist/{provider-auth-helpers-BK6NFk2Q.js → provider-auth-helpers-BUC4xGK9.js} +5 -5
  240. package/dist/{provider-auth-helpers-D3hXI6HN.js → provider-auth-helpers-DpRoNr_8.js} +7 -7
  241. package/dist/{push-apns-C1guJr4R.js → push-apns-Bm39oOO9.js} +5 -5
  242. package/dist/{push-apns-CMxk3Hxf.js → push-apns-DqmFEcqh.js} +3 -3
  243. package/dist/{pw-ai-CE2TBGif.js → pw-ai-B0-pgbYu.js} +9 -9
  244. package/dist/{pw-ai-EtT_bBJY.js → pw-ai-B2NuWIL7.js} +13 -13
  245. package/dist/{pw-ai-w6Qalz1W.js → pw-ai-BB1pJj9_.js} +1 -1
  246. package/dist/{pw-ai-C5MJKzUM.js → pw-ai-BsEf8C15.js} +1 -1
  247. package/dist/{qmd-manager--xIse9H_.js → qmd-manager--kGuC39q.js} +4 -4
  248. package/dist/{qmd-manager-DgCmfS8D.js → qmd-manager-358OTDns.js} +8 -8
  249. package/dist/{qr-cli-BeHlC33g.js → qr-cli-Cx7DYTSk.js} +5 -5
  250. package/dist/{qr-cli-zto9YWnY.js → qr-cli-hPIeUYAT.js} +11 -11
  251. package/dist/{redact-identifier-B1VHIbnd.js → redact-identifier-Cm1VfV7E.js} +4 -4
  252. package/dist/{register.agent-CNhg2KUt.js → register.agent-CCKcgAXs.js} +91 -91
  253. package/dist/{register.agent-COv5OPLQ.js → register.agent-DZuxoC0a.js} +71 -71
  254. package/dist/register.configure-CJErdFO_.js +129 -0
  255. package/dist/register.configure-JT8T7HO5.js +125 -0
  256. package/dist/{register.maintenance-BAK-DiQY.js → register.maintenance-CKsv0lok.js} +70 -70
  257. package/dist/{register.maintenance-B_slxJa6.js → register.maintenance-DDzKUGYJ.js} +98 -98
  258. package/dist/{register.message-Bbtej3vy.js → register.message-CpOXi1rz.js} +74 -74
  259. package/dist/{register.message-CCBmn5ja.js → register.message-_bfhetTg.js} +55 -55
  260. package/dist/{register.onboard-Cu2KnArg.js → register.onboard-BHtTh0b_.js} +42 -42
  261. package/dist/{register.onboard-B3jO_Goy.js → register.onboard-CkIM3hU7.js} +24 -24
  262. package/dist/{register.setup-Ca6zdWpf.js → register.setup-CLhdFQHW.js} +42 -42
  263. package/dist/{register.setup-CYSISTDO.js → register.setup-CYtYDKMU.js} +27 -27
  264. package/dist/{register.status-health-sessions-D9p0ClqJ.js → register.status-health-sessions-DZnebsxZ.js} +60 -60
  265. package/dist/{register.status-health-sessions-CGbg9k6d.js → register.status-health-sessions-DmX0DLAt.js} +39 -39
  266. package/dist/{register.subclis-loifbhVx.js → register.subclis-CnDo2jzv.js} +29 -29
  267. package/dist/{registry-Sbac4a4z.js → registry-DKJLAPDB.js} +2 -2
  268. package/dist/{replies-PetyGT0p.js → replies-B2O2eRh6.js} +3 -3
  269. package/dist/{replies-Dj640LxQ.js → replies-DIHkSwoW.js} +2 -2
  270. package/dist/{reply-prefix-CXsO5E1Z.js → reply-prefix-B7pYEiW_.js} +1 -1
  271. package/dist/{reply-prefix-DKeEUCUp.js → reply-prefix-BOdARKaY.js} +1 -1
  272. package/dist/{resolve-route-8JoEBwi6.js → resolve-route-CRWE36h5.js} +4 -4
  273. package/dist/{resolve-route-BcYnh5es.js → resolve-route-DNKcB7Q9.js} +1 -1
  274. package/dist/{routes-CJ4en0jL.js → routes-BMShi_eY.js} +7 -7
  275. package/dist/{routes-B5y-oAKp.js → routes-Cio8is5Y.js} +5 -5
  276. package/dist/{rpc-qWm1bRo5.js → rpc-CEhoSTGo.js} +1 -1
  277. package/dist/{rpc-ElDiKzq4.js → rpc-D0Ldc6Hv.js} +3 -3
  278. package/dist/{run-main-B7Ria3zD.js → run-main-BIRbWKyA.js} +73 -73
  279. package/dist/{runtime-guard-oeRbIq84.js → runtime-guard-BZ3_1QqS.js} +1 -1
  280. package/dist/{sandbox-BJgHc4Vu.js → sandbox-B4RfQ7k1.js} +9 -9
  281. package/dist/{sandbox-C8Gh5iJW.js → sandbox-C-UeHmuJ.js} +11 -11
  282. package/dist/{sandbox-cli-CSudrHYL.js → sandbox-cli-B43FqqPT.js} +17 -17
  283. package/dist/{sandbox-cli-DkMmnojU.js → sandbox-cli-CNAPNXJ4.js} +29 -29
  284. package/dist/{security-cli-pLoqKkfb.js → security-cli-BSd8_Gsq.js} +38 -38
  285. package/dist/{security-cli-B2lCR2xX.js → security-cli-DDM0Z6IW.js} +27 -27
  286. package/dist/{send-DuYvWRLE.js → send-DSK6O8SC.js} +9 -9
  287. package/dist/{send-CY9na-Jw.js → send-EluKytgO.js} +3 -3
  288. package/dist/{server-context-DdWWaDf6.js → server-context-CDTuNR-O.js} +5 -5
  289. package/dist/{server-context-CJFU_WfI.js → server-context-DFO6o83F.js} +8 -8
  290. package/dist/{server-methods-Dk_EnINI.js → server-methods-Dz6NGEg3.js} +35 -59
  291. package/dist/{server-methods-RhVqtIqB.js → server-methods-vp5zi6v5.js} +41 -65
  292. package/dist/{server-node-events-BHegSgG9.js → server-node-events-4ufB_olv.js} +55 -55
  293. package/dist/{server-node-events-UQx561GA.js → server-node-events-B7UtUhkC.js} +74 -74
  294. package/dist/{service-BCu0FBzN.js → service-AP9pR9R5.js} +1 -1
  295. package/dist/{session-cost-usage-5VmVPhKy.js → session-cost-usage-Cj3vd7lZ.js} +1 -1
  296. package/dist/{session-cost-usage-XhPrxXSs.js → session-cost-usage-DYcv40ss.js} +1 -1
  297. package/dist/{session-utils-DFJztVrF.js → session-utils-CgGDr4eh.js} +12 -12
  298. package/dist/{session-utils-CAVPV2Hh.js → session-utils-D1VcHni_.js} +7 -7
  299. package/dist/{sessions-CqLQkkWg.js → sessions-BNEDanZO.js} +4 -4
  300. package/dist/{sessions-BsGGoTdl.js → sessions-Dh88Kqd6.js} +9 -9
  301. package/dist/{sessions-BDM9kNY0.js → sessions-iLfSd6VD.js} +5 -5
  302. package/dist/{shared-CpwtQRJB.js → shared-CIeW3aWF.js} +4 -4
  303. package/dist/{shared-D7tsGdxc.js → shared-DP6YX7_w.js} +1 -1
  304. package/dist/{shared-B7nP44vU.js → shared-DmYHvtn2.js} +2 -2
  305. package/dist/{shared-CbUpEKXt.js → shared-_wwqvx84.js} +3 -3
  306. package/dist/{skill-commands-B45w-suH.js → skill-commands-5QB5E8bv.js} +4 -4
  307. package/dist/{skill-commands-CRQniaHy.js → skill-commands-CcCCVblU.js} +4 -4
  308. package/dist/{skills-CTcjFd_F.js → skills-BP6p7GnN.js} +3 -3
  309. package/dist/{skills-haW9gU7e.js → skills-Bmjf5nFv.js} +3 -3
  310. package/dist/{skills-cli-9Mlb7VRg.js → skills-cli-BJDvUT_e.js} +13 -13
  311. package/dist/{skills-cli-CV_42wby.js → skills-cli-Byp9MfZh.js} +17 -17
  312. package/dist/{skills-install-B4JPO_Np.js → skills-install-BB27sD4d.js} +4 -4
  313. package/dist/{skills-install-D5ikt72d.js → skills-install-BzqoHn0x.js} +3 -3
  314. package/dist/{skills-remote-BW2GvG2l.js → skills-remote-CqwR3Zvp.js} +5 -5
  315. package/dist/{skills-remote-BASG1Doo.js → skills-remote-DHfuS68n.js} +4 -4
  316. package/dist/{skills-status-1iVfuVIG.js → skills-status-01KNlWUS.js} +3 -3
  317. package/dist/{skills-status-C9lLJu0B.js → skills-status-BNDqwHkP.js} +3 -3
  318. package/dist/{sqlite-DL_ZWVN-.js → sqlite-DBEvS-Ne.js} +2 -2
  319. package/dist/{sqlite-67BqaVPd.js → sqlite-l3CZYU6t.js} +1 -1
  320. package/dist/{status-CrddsMfu.js → status-B0HecH1s.js} +4 -4
  321. package/dist/{status-D5RhVO0A.js → status-BD8gFYKH.js} +18 -18
  322. package/dist/{status-DPu7qNXE.js → status-DEXnB1sw.js} +27 -27
  323. package/dist/{status-Bci6O3aA.js → status-MMLxoRgQ.js} +3 -3
  324. package/dist/{status.update-D5CachQ_.js → status.update-Be8PuHCh.js} +2 -2
  325. package/dist/{status.update-Dfd0eZOH.js → status.update-CB9e3eWW.js} +2 -2
  326. package/dist/{subagent-registry-CsXaK_sy.js → subagent-registry-C57PFGHU.js} +61 -61
  327. package/dist/{subsystem-CHbO_DkH.js → subsystem-CtH6J8AV.js} +1 -1
  328. package/dist/{synthesis-BwcfS9jt.js → synthesis-CQdzrLFL.js} +4 -4
  329. package/dist/{synthesis-CU_MR7nV.js → synthesis-CjsIBd8X.js} +71 -71
  330. package/dist/{synthesis-dplLmFIP.js → synthesis-DSdF0vsi.js} +4 -4
  331. package/dist/{synthesis-BoZf8BeO.js → synthesis-j_kjlFo1.js} +52 -52
  332. package/dist/{system-cli-CCn-08Zm.js → system-cli-BM8KbtUc.js} +18 -18
  333. package/dist/{system-cli-D5FffFX5.js → system-cli-CQFH_HwX.js} +10 -10
  334. package/dist/{systemd-bkj5giUQ.js → systemd-9LEEqibe.js} +2 -2
  335. package/dist/{systemd-hints-UeG2BDXq.js → systemd-hints-A1W3AdVo.js} +3 -3
  336. package/dist/{systemd-hints-CufcSfMk.js → systemd-hints-BejQ6J2Y.js} +2 -2
  337. package/dist/{systemd-linger-DVkUgWAi.js → systemd-linger-PqG8iGCt.js} +2 -2
  338. package/dist/{table-Sfrx6RZ-.js → table-CSEp22Mk.js} +1 -1
  339. package/dist/{table-B4DunWtf.js → table-DkAQzCOR.js} +2 -2
  340. package/dist/{tailscale-G_tEEN9T.js → tailscale-D7dC-5EX.js} +3 -3
  341. package/dist/{tokens-BdVB8KXo.js → tokens-BKbemuIk.js} +1 -1
  342. package/dist/{tokens-h4i8ww8n.js → tokens-K3kGchJA.js} +1 -1
  343. package/dist/{tool-display-BngPYwnR.js → tool-display-Dr6VaTg5.js} +1 -1
  344. package/dist/{tool-display-DccYrlOh.js → tool-display-wSdT0Ynz.js} +1 -1
  345. package/dist/{tool-loop-detection-ckNnHN4a.js → tool-loop-detection-CLDr_JBu.js} +1 -1
  346. package/dist/{tool-loop-detection-DldKffR8.js → tool-loop-detection-CSSq5kkt.js} +4 -4
  347. package/dist/{trash-S6FbJcDo.js → trash-BjVrPcAx.js} +1 -1
  348. package/dist/{tui-DZ8gksSZ.js → tui-D0j61PXx.js} +8 -8
  349. package/dist/{tui-DroW8IOb.js → tui-DFuScHlA.js} +10 -10
  350. package/dist/{tui-cli-CyBJYh9u.js → tui-cli-25xTveHh.js} +24 -24
  351. package/dist/{tui-cli-1SpmbQMM.js → tui-cli-C3dXNtPo.js} +36 -36
  352. package/dist/{unified-runner-BFLLzEHE.js → unified-runner-BNt7TQKM.js} +10 -13
  353. package/dist/{unified-runner-CSPkKZHX.js → unified-runner-DCiPB--z.js} +73 -73
  354. package/dist/{update-BITFZPr2.js → update-C1rkPV1C.js} +3 -3
  355. package/dist/{update-OkPZ3jjl.js → update-CjZgU686.js} +3 -3
  356. package/dist/{update-check-CMbKkelk.js → update-check-CZxZhEXr.js} +2 -2
  357. package/dist/{update-cli-Dh5dvdv-.js → update-cli-CWufRpkr.js} +104 -104
  358. package/dist/{update-cli-yW6Xl6fs.js → update-cli-Dl_QbjXc.js} +77 -77
  359. package/dist/{update-runner-BI8ZSR1b.js → update-runner-Dq5UYQbo.js} +5 -5
  360. package/dist/{update-runner-CIgLduhH.js → update-runner-ENJw0Mco.js} +2 -2
  361. package/dist/{utils-CTPsqyE_.js → utils-BU8jVQFM.js} +1 -1
  362. package/dist/{webhooks-cli-Cwhu9vyD.js → webhooks-cli-Clx8DGfA.js} +14 -14
  363. package/dist/{webhooks-cli-4bmyKzwb.js → webhooks-cli-UfO_WffC.js} +11 -11
  364. package/dist/{widearea-dns-BZ7fV_kq.js → widearea-dns-C5NqCQ3L.js} +1 -1
  365. package/dist/{widearea-dns-D9KXb2gb.js → widearea-dns-drOINmDM.js} +1 -1
  366. package/dist/{with-timeout-D_FOTx48.js → with-timeout-BE7lxhxW.js} +2 -2
  367. package/dist/{with-timeout-bWr6yBeX.js → with-timeout-BcL6qAbd.js} +2 -2
  368. package/dist/{workspace-DxscDsm6.js → workspace-B3sO7QlN.js} +2 -2
  369. package/dist/{workspace-BHDa_VCi.js → workspace-Bb1HX2I0.js} +1 -1
  370. package/dist/{workspace-dirs-2xcWGse3.js → workspace-dirs-23IYtZj2.js} +1 -1
  371. package/dist/{workspace-dirs-aYEM1rQE.js → workspace-dirs-D5OnUmvw.js} +1 -1
  372. package/extensions/memory-core/node_modules/.bin/symi +0 -0
  373. package/extensions/msteams/node_modules/.bin/symi +0 -0
  374. package/extensions/outlook/node_modules/.bin/symi +0 -0
  375. package/extensions/slack/node_modules/.bin/symi +0 -0
  376. package/package.json +108 -79
  377. package/dist/cli-CK62Eh_9.js +0 -128
  378. package/dist/control-ui/css/revert-red-theme.md +0 -141
  379. package/dist/control-ui/css/style.css +0 -5843
  380. package/dist/control-ui/css/style.css.backup-2026-03-03-162525 +0 -3546
  381. package/dist/control-ui/css/style.css.backup-before-red-2026-03-03-162525 +0 -3546
  382. package/dist/control-ui/css/style.css.backup-before-red-theme-2026-03-03-162530 +0 -3546
  383. package/dist/control-ui/css/style.css.pre-2row +0 -2165
  384. package/dist/control-ui/css/style.css.pre-brand +0 -1776
  385. package/dist/control-ui/css/style.css.pre-history +0 -1974
  386. package/dist/control-ui/css/style.css.pre-nav +0 -2264
  387. package/dist/control-ui/css/style.css.pre-newsession +0 -1898
  388. package/dist/control-ui/css/style.css.pre-queue +0 -2195
  389. package/dist/control-ui/css/style.css.pre-red-prompt +0 -2524
  390. package/dist/control-ui/css/style.css.pre-stop +0 -2239
  391. package/dist/control-ui/css/style.css.pre-textarea +0 -2184
  392. package/dist/control-ui/css/style.css.pre-watchdog +0 -1848
  393. package/dist/control-ui/css/style.css.red-theme +0 -2999
  394. package/dist/control-ui/index.html +0 -1042
  395. package/dist/control-ui/js/app.js +0 -1304
  396. package/dist/control-ui/js/app.js.pre-2row +0 -463
  397. package/dist/control-ui/js/app.js.pre-heartbeat-filter +0 -595
  398. package/dist/control-ui/js/app.js.pre-newsession +0 -408
  399. package/dist/control-ui/js/app.js.pre-queue +0 -476
  400. package/dist/control-ui/js/app.js.pre-stop +0 -564
  401. package/dist/control-ui/js/app.js.pre-textarea +0 -467
  402. package/dist/control-ui/js/app.js.pre-watchdog +0 -293
  403. package/dist/control-ui/js/connections.js +0 -438
  404. package/dist/control-ui/js/gateway.js +0 -233
  405. package/dist/control-ui/js/gateway.js.pre-stop +0 -110
  406. package/dist/control-ui/js/history.js +0 -732
  407. package/dist/control-ui/js/logs.js +0 -238
  408. package/dist/control-ui/js/menu.js +0 -230
  409. package/dist/control-ui/js/menu.js.pre-nav +0 -66
  410. package/dist/control-ui/js/metrics.js +0 -53
  411. package/dist/control-ui/js/models.js +0 -138
  412. package/dist/control-ui/js/render.js +0 -882
  413. package/dist/control-ui/js/render.test.js +0 -112
  414. package/dist/control-ui/js/scheduling.js +0 -461
  415. package/dist/control-ui/js/settings.js +0 -909
  416. package/dist/control-ui/js/slash-autocomplete.js +0 -168
  417. package/dist/control-ui/js/subagents.js +0 -560
  418. package/dist/control-ui/js/utils.js +0 -29
  419. package/dist/control-ui/vendor/highlight.min.js +0 -2518
  420. package/dist/control-ui/vendor/marked.min.js +0 -69
  421. package/dist/register.configure-RhKVlfWH.js +0 -125
  422. package/dist/register.configure-q33027ym.js +0 -129
@@ -1,595 +0,0 @@
1
- // ── Symi UI — Live Gateway App ────────────────────────────────────────
2
-
3
- const responseArea = document.getElementById('response-area');
4
- const promptInput = document.getElementById('prompt-input');
5
- const sendBtn = document.getElementById('send-btn');
6
- const newSessionBtn = document.getElementById('new-session-btn');
7
- const stopBtn = document.getElementById('stop-btn');
8
-
9
- let isStreaming = false;
10
- let currentRunId = null;
11
- let streamBubble = null;
12
- let streamContent = null;
13
- let streamStart = 0;
14
-
15
- // ── Prompt queue ──────────────────────────────────────────────────
16
- let chatQueue = []; // [{id, text}]
17
-
18
- // ── Watchdog + elapsed timer state ────────────────────────────────
19
- let watchdogTimer = null; // fires if no activity for WATCHDOG_MS
20
- let elapsedTimer = null; // ticks every second to show run duration
21
- let activityStart = 0; // timestamp of when current run began
22
- let elapsedBaseText = ''; // base sub-text for the elapsed display
23
- const WATCHDOG_MS = 90000; // 90 seconds of silence → failure
24
-
25
- // ── Utility ───────────────────────────────────────────────────────
26
- const sleep = ms => new Promise(r => setTimeout(r, ms));
27
- function escapeHtml(t) {
28
- return t.replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;');
29
- }
30
-
31
- // ── Status indicator (top-right of response area) ─────────────────
32
- const statusEl = document.createElement('div');
33
- statusEl.className = 'conn-status';
34
- statusEl.innerHTML = '<span class="conn-dot dot-yellow pulse"></span><span class="conn-label">connecting…</span>';
35
- responseArea.before(statusEl);
36
-
37
- function setStatus(state) { // 'connecting' | 'online' | 'offline'
38
- const dot = statusEl.querySelector('.conn-dot');
39
- const label = statusEl.querySelector('.conn-label');
40
- dot.className = `conn-dot ${state === 'online' ? 'dot-green pulse' : state === 'offline' ? 'dot-red' : 'dot-yellow pulse'}`;
41
- label.textContent = state === 'online' ? 'live' : state === 'offline' ? 'disconnected' : 'connecting…';
42
- }
43
-
44
- // ── Render helpers ─────────────────────────────────────────────────
45
- function addUserMessage(text) {
46
- const msg = document.createElement('div');
47
- msg.className = 'message user-msg';
48
- msg.innerHTML = `<div class="bubble">${escapeHtml(text)}</div><div class="message-clearfix"></div>`;
49
- responseArea.appendChild(msg);
50
- msg.scrollIntoView({ behavior: 'smooth', block: 'end' });
51
- }
52
-
53
- // ── Thinking bubble ────────────────────────────────────────────────
54
- function createThinkingBubble() {
55
- const msg = document.createElement('div');
56
- msg.className = 'message symi-msg thinking-msg';
57
- msg.innerHTML = `
58
- <div class="bubble thinking-bubble">
59
- <div class="think-header">
60
- <span class="think-badge">◈ PROCESSING</span>
61
- <span class="think-dots"><span>.</span><span>.</span><span>.</span></span>
62
- </div>
63
- <div class="think-bar-wrap"><div class="think-bar"></div></div>
64
- </div>
65
- <div class="message-clearfix"></div>
66
- `;
67
- responseArea.appendChild(msg);
68
- msg.scrollIntoView({ behavior: 'smooth', block: 'end' });
69
- return msg;
70
- }
71
-
72
- // ── Stream bubble lifecycle ────────────────────────────────────────
73
- function openStreamBubble() {
74
- streamStart = Date.now();
75
- const msg = document.createElement('div');
76
- msg.className = 'message symi-msg stream-msg';
77
- msg.innerHTML = `<div class="bubble stream-bubble streaming"><div class="bubble-content"></div></div><div class="message-clearfix"></div>`;
78
- responseArea.appendChild(msg);
79
- streamBubble = msg.querySelector('.stream-bubble');
80
- streamContent = msg.querySelector('.bubble-content');
81
- msg.scrollIntoView({ behavior: 'smooth', block: 'end' });
82
- return msg;
83
- }
84
-
85
- function updateStream(text) {
86
- if (!streamContent) return;
87
- streamContent.textContent = text;
88
- responseArea.scrollTop = responseArea.scrollHeight;
89
- }
90
-
91
- function closeStreamBubble(model = 'claude-sonnet-4-6') {
92
- if (!streamBubble) return;
93
- streamBubble.classList.remove('streaming');
94
- streamBubble.classList.add('done');
95
-
96
- // Apply full markdown rendering to the final text
97
- const rawText = streamContent?.textContent ?? '';
98
- if (streamContent && rawText) {
99
- streamContent.innerHTML = '';
100
- const textBlock = renderBlock({ type: 'text', text: rawText });
101
- streamContent.appendChild(textBlock);
102
- window.applyHighlighting(streamContent);
103
- }
104
-
105
- const elapsed = Date.now() - streamStart;
106
- const chars = Math.round(rawText.length / 4);
107
-
108
- // Add copy button
109
- const copyBtn = document.createElement('button');
110
- copyBtn.className = 'msg-copy-btn msg-copy-visible';
111
- copyBtn.title = 'Copy';
112
- copyBtn.onclick = function() { window.copyMessage(this); };
113
- copyBtn.innerHTML = `<svg width="12" height="12" viewBox="0 0 24 24" fill="none">
114
- <rect x="9" y="9" width="13" height="13" rx="2" stroke="currentColor" stroke-width="2"/>
115
- <path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1" stroke="currentColor" stroke-width="2"/>
116
- </svg>`;
117
- streamBubble.appendChild(copyBtn);
118
-
119
- const footer = document.createElement('div');
120
- footer.className = 'telemetry';
121
- footer.innerHTML = `
122
- <span class="tele-item">✦ ${model}</span>
123
- <span class="tele-sep">·</span>
124
- <span class="tele-item">${chars} tokens</span>
125
- <span class="tele-sep">·</span>
126
- <span class="tele-item">${elapsed}ms</span>
127
- `;
128
- streamBubble.appendChild(footer);
129
- requestAnimationFrame(() => {
130
- footer.classList.add('tele-visible');
131
- // Scroll to bottom immediately after markdown + footer are in the DOM
132
- responseArea.scrollTop = responseArea.scrollHeight;
133
- });
134
-
135
- // Second scroll after the fit-content width transition finishes (0.3s)
136
- setTimeout(() => { responseArea.scrollTop = responseArea.scrollHeight; }, 350);
137
-
138
- streamBubble = null;
139
- streamContent = null;
140
- }
141
-
142
- // ── Elapsed timer ─────────────────────────────────────────────────
143
- function startElapsedTimer(baseText) {
144
- stopElapsedTimer();
145
- activityStart = Date.now();
146
- elapsedBaseText = baseText;
147
- elapsedTimer = setInterval(() => {
148
- const secs = Math.floor((Date.now() - activityStart) / 1000);
149
- const m = Math.floor(secs / 60);
150
- const s = String(secs % 60).padStart(2, '0');
151
- if (asoSub) asoSub.textContent = `${elapsedBaseText} ${m}:${s}`;
152
- }, 1000);
153
- }
154
-
155
- function stopElapsedTimer() {
156
- if (elapsedTimer) { clearInterval(elapsedTimer); elapsedTimer = null; }
157
- }
158
-
159
- // ── Watchdog ───────────────────────────────────────────────────────
160
- function armWatchdog() {
161
- clearWatchdog();
162
- watchdogTimer = setTimeout(() => handleRunFailure('timeout'), WATCHDOG_MS);
163
- }
164
-
165
- function clearWatchdog() {
166
- if (watchdogTimer) { clearTimeout(watchdogTimer); watchdogTimer = null; }
167
- }
168
-
169
- // ── Unified run failure handler ────────────────────────────────────
170
- // Called when: watchdog fires, gateway disconnects mid-run, or server
171
- // sends an explicit error event. Cleans up all state and shows the user
172
- // a clear error message + ERROR orb state.
173
- function handleRunFailure(reason) {
174
- // Stop timers immediately
175
- stopElapsedTimer();
176
- clearWatchdog();
177
-
178
- // Clean up any in-flight UI elements
179
- if (thinkingEl) { thinkingEl.remove(); thinkingEl = null; }
180
- if (streamBubble) {
181
- // Don't render markdown on a partial/failed response — just mark it failed
182
- streamBubble.classList.remove('streaming');
183
- streamBubble.classList.add('done', 'stream-failed');
184
- streamBubble = null;
185
- streamContent = null;
186
- }
187
-
188
- // Human-readable reason labels
189
- const labels = {
190
- timeout: `No response received after ${WATCHDOG_MS / 1000}s — the agent may still be running in the background`,
191
- disconnected: 'Connection lost mid-run — gateway disconnected',
192
- };
193
- const label = labels[reason] || reason;
194
-
195
- // Inject error bubble into the feed
196
- const errEl = document.createElement('div');
197
- errEl.className = 'message symi-msg';
198
- errEl.innerHTML = `
199
- <div class="bubble stream-bubble done run-error-bubble">
200
- <div class="run-error-icon">⚠</div>
201
- <div class="bubble-content run-error-text">${escapeHtml(label)}</div>
202
- </div>
203
- <div class="message-clearfix"></div>
204
- `;
205
- responseArea.appendChild(errEl);
206
- requestAnimationFrame(() => { responseArea.scrollTop = responseArea.scrollHeight; });
207
-
208
- // Show ERROR state on orb, then reset input
209
- setAgentStatus('error');
210
- isStreaming = false;
211
- currentRunId = null;
212
- stopBtn.style.opacity = '';
213
- stopBtn.disabled = false;
214
- enableInput();
215
- updateQueueBtn(); // keep queue button visible if items remain
216
- }
217
-
218
- // ── Render history (on first connect) ─────────────────────────────
219
- function renderHistory(messages) {
220
- responseArea.innerHTML = '';
221
- for (const m of messages) {
222
- if (!m || !m.role) continue;
223
- const hasContent = Array.isArray(m.content)
224
- ? m.content.some(b => (b.text ?? b.thinking ?? b.name ?? '').trim())
225
- : extractText(m.content).trim();
226
- if (!hasContent) continue;
227
-
228
- const el = window.renderMessage(m);
229
- responseArea.appendChild(el);
230
- window.applyHighlighting(el);
231
- }
232
-
233
- // Scroll to very bottom after history renders
234
- requestAnimationFrame(() => { responseArea.scrollTop = responseArea.scrollHeight; });
235
- }
236
-
237
- // ── Gateway event handler ──────────────────────────────────────────
238
- let thinkingEl = null;
239
-
240
- function handleGatewayEvent(event) {
241
- if (event.event !== 'chat') return;
242
- const p = event.payload;
243
- if (!p || p.sessionKey !== window.SESSION_KEY) return;
244
-
245
- if (p.state === 'delta') {
246
- // Capture runId on first delta so abort can target the exact run
247
- if (p.runId && !currentRunId) currentRunId = p.runId;
248
-
249
- // Each delta proves the agent is alive — reset the watchdog
250
- armWatchdog();
251
-
252
- // First delta — remove thinking bubble, open stream bubble
253
- if (thinkingEl) { thinkingEl.remove(); thinkingEl = null; }
254
- if (!streamBubble) {
255
- openStreamBubble();
256
- setAgentStatus('streaming');
257
- }
258
-
259
- const text = extractText(p.message);
260
- if (text) updateStream(text);
261
-
262
- } else if (p.state === 'final') {
263
- stopElapsedTimer();
264
- clearWatchdog();
265
- closeStreamBubble();
266
- setAgentStatus('done');
267
- isStreaming = false;
268
- currentRunId = null;
269
- stopBtn.style.opacity = ''; // reset stop button visual state
270
- stopBtn.disabled = false;
271
- enableInput();
272
- drainQueue();
273
-
274
- } else if (p.state === 'aborted') {
275
- // Clean abort (user-initiated or model decided to stop) — not an error
276
- stopElapsedTimer();
277
- clearWatchdog();
278
- if (streamBubble) closeStreamBubble();
279
- if (thinkingEl) { thinkingEl.remove(); thinkingEl = null; }
280
- setAgentStatus('idle');
281
- isStreaming = false;
282
- currentRunId = null;
283
- stopBtn.style.opacity = ''; // reset stop button visual state
284
- stopBtn.disabled = false;
285
- enableInput();
286
- drainQueue();
287
-
288
- } else if (p.state === 'error') {
289
- // Server-reported error — route through unified failure handler
290
- handleRunFailure(p.error?.message || 'Server reported an error');
291
- }
292
- }
293
-
294
- // ── Agent Status Orb ───────────────────────────────────────────────
295
- const asoPanel = document.getElementById('agent-status-panel');
296
- const asoLabel = document.getElementById('aso-label');
297
- const asoSub = document.getElementById('aso-sub');
298
- let asoDoneTimer = null;
299
-
300
- const ASO_STATES = {
301
- idle: { state: 'idle', label: 'STANDBY', sub: 'Awaiting your prompt' },
302
- waiting: { state: 'waiting', label: 'WAITING', sub: 'Sending to Symi\u2026' },
303
- thinking: { state: 'thinking', label: 'PROCESSING', sub: 'Reasoning through request' },
304
- streaming: { state: 'streaming', label: 'RESPONDING', sub: 'Generating response' },
305
- done: { state: 'done', label: 'COMPLETE', sub: 'Response ready' },
306
- error: { state: 'error', label: 'FAILED', sub: 'Run ended unexpectedly' },
307
- };
308
-
309
- function setAgentStatus(key) {
310
- if (!asoPanel) return;
311
-
312
- // Clear any pending auto-transition timers
313
- if (asoDoneTimer) { clearTimeout(asoDoneTimer); asoDoneTimer = null; }
314
-
315
- const s = ASO_STATES[key] || ASO_STATES.idle;
316
- asoPanel.dataset.state = s.state;
317
- if (asoLabel) asoLabel.textContent = s.label;
318
- if (asoSub) asoSub.textContent = s.sub;
319
-
320
- // ── Elapsed timer management ──────────────────────────────────
321
- if (key === 'thinking') {
322
- // Start elapsed timer and watchdog when processing begins
323
- armWatchdog();
324
- startElapsedTimer('Reasoning through request');
325
- } else if (key === 'streaming') {
326
- // Transition from thinking → streaming: keep watchdog running (will be
327
- // reset on each delta), switch elapsed timer base text
328
- elapsedBaseText = 'Generating response';
329
- } else {
330
- // Any terminal/non-active state: stop elapsed timer and watchdog
331
- stopElapsedTimer();
332
- clearWatchdog();
333
- }
334
-
335
- // ── Auto-revert timers ────────────────────────────────────────
336
- if (key === 'done') {
337
- asoDoneTimer = setTimeout(() => setAgentStatus('idle'), 3000);
338
- }
339
- if (key === 'error') {
340
- asoDoneTimer = setTimeout(() => setAgentStatus('idle'), 4000);
341
- }
342
- }
343
-
344
- // ── Input state ────────────────────────────────────────────────────
345
- function disableInput() {
346
- // Keep textarea enabled so user can type their next queued message while AI responds
347
- sendBtn.disabled = true;
348
- newSessionBtn.disabled = true;
349
- sendBtn.classList.add('btn-loading');
350
- }
351
-
352
- function enableInput() {
353
- sendBtn.disabled = false;
354
- newSessionBtn.disabled = false;
355
- sendBtn.classList.remove('btn-loading');
356
- promptInput.focus();
357
- }
358
-
359
- // ── Queue helpers ──────────────────────────────────────────────────
360
- const queueBtn = document.getElementById('queue-btn');
361
- const queueCancelX = document.getElementById('queue-cancel-x');
362
-
363
- function updateQueueBtn() {
364
- const streaming = isStreaming;
365
- const count = chatQueue.length;
366
-
367
- if (streaming || count > 0) {
368
- // Show stop + queue buttons, hide New Session
369
- stopBtn.classList.add('visible');
370
- queueBtn.classList.add('visible');
371
- newSessionBtn.style.display = 'none';
372
-
373
- if (count > 0) {
374
- queueBtn.classList.add('has-queue');
375
- queueBtn.querySelector('.queue-btn-label').textContent = `Queued (${count})`;
376
- } else {
377
- queueBtn.classList.remove('has-queue');
378
- queueBtn.querySelector('.queue-btn-label').textContent = 'Queue ↵';
379
- }
380
- } else {
381
- // Hide stop + queue, restore New Session
382
- stopBtn.classList.remove('visible');
383
- queueBtn.classList.remove('visible', 'has-queue');
384
- newSessionBtn.style.display = '';
385
- }
386
- }
387
-
388
- function queueMessage(text) {
389
- if (!text.trim()) return;
390
- chatQueue = [...chatQueue, { id: Date.now(), text: text.trim() }];
391
- updateQueueBtn();
392
- }
393
-
394
- function clearQueue() {
395
- chatQueue = [];
396
- updateQueueBtn();
397
- }
398
-
399
- function drainQueue() {
400
- if (chatQueue.length === 0) {
401
- updateQueueBtn();
402
- return;
403
- }
404
- const [next, ...rest] = chatQueue;
405
- chatQueue = rest;
406
- updateQueueBtn();
407
- // Small delay so the UI settles before starting the next send
408
- setTimeout(() => sendText(next.text), 120);
409
- }
410
-
411
- // ── Core send (no input reading — accepts text directly) ───────────
412
- async function sendText(text) {
413
- if (!gateway.connected) return;
414
- isStreaming = true;
415
- disableInput();
416
- updateQueueBtn();
417
-
418
- addUserMessage(text);
419
- await sleep(200);
420
-
421
- setAgentStatus('waiting');
422
- thinkingEl = createThinkingBubble();
423
- setAgentStatus('thinking');
424
-
425
- try {
426
- await gateway.send(text);
427
- } catch (err) {
428
- handleRunFailure(err.message || 'Failed to send message');
429
- }
430
- }
431
-
432
- // ── Send handler (reads input, queues if busy) ─────────────────────
433
- async function handleSend() {
434
- const text = promptInput.value.trim();
435
- if (!text) return;
436
-
437
- // Clear the input immediately regardless of streaming state
438
- promptInput.value = '';
439
- promptInput.style.height = 'auto';
440
-
441
- if (isStreaming) {
442
- // AI is busy — queue it
443
- queueMessage(text);
444
- return;
445
- }
446
-
447
- if (!gateway.connected) return;
448
- await sendText(text);
449
- }
450
-
451
- // ── New Session handler ────────────────────────────────────────────
452
- async function handleNewSession() {
453
- if (isStreaming || !gateway.connected) return;
454
-
455
- promptInput.disabled = true; // lock textarea during reset
456
- disableInput();
457
- setAgentStatus('waiting');
458
-
459
- try {
460
- // Send the /new slash command — gateway resets the session
461
- await gateway.send('/new');
462
-
463
- // Fade out existing messages, then show cleared state
464
- responseArea.style.transition = 'opacity 0.25s ease';
465
- responseArea.style.opacity = '0';
466
-
467
- await sleep(260);
468
-
469
- responseArea.innerHTML = '';
470
- responseArea.style.opacity = '1';
471
-
472
- // Show empty-state indicator
473
- const cleared = document.createElement('div');
474
- cleared.className = 'session-cleared';
475
- cleared.innerHTML = `
476
- <div class="session-cleared-icon">◈</div>
477
- <div class="session-cleared-text">NEW SESSION STARTED</div>
478
- `;
479
- responseArea.appendChild(cleared);
480
-
481
- setAgentStatus('idle');
482
- clearQueue(); // discard any queued prompts — new session = clean slate
483
-
484
- // Show archive toast — lets user jump directly to history if they regret it
485
- if (typeof window.showArchiveToast === 'function') window.showArchiveToast();
486
-
487
- // After a short pause, remove the cleared indicator and let history load
488
- await sleep(1800);
489
- cleared.style.transition = 'opacity 0.4s ease';
490
- cleared.style.opacity = '0';
491
- await sleep(420);
492
- cleared.remove();
493
-
494
- } catch (err) {
495
- handleRunFailure(err.message || 'Failed to start new session');
496
- return;
497
- }
498
-
499
- promptInput.disabled = false; // re-enable textarea after reset
500
- enableInput();
501
- }
502
-
503
- // ── Stop handler ───────────────────────────────────────────────────
504
- async function handleStop() {
505
- if (!isStreaming || !gateway.connected) return;
506
- try {
507
- await gateway.abort(currentRunId);
508
- // The gateway will send an 'aborted' event which cleans up state.
509
- // Visually dim the stop button while we wait for confirmation.
510
- stopBtn.style.opacity = '0.45';
511
- stopBtn.disabled = true;
512
- } catch (err) {
513
- console.warn('[stop] abort failed:', err.message);
514
- }
515
- }
516
-
517
- sendBtn.addEventListener('click', handleSend);
518
- newSessionBtn.addEventListener('click', handleNewSession);
519
- stopBtn.addEventListener('click', handleStop);
520
-
521
- // Queue button — queue current input (if idle text present) or show queued count
522
- queueBtn.addEventListener('click', e => {
523
- // Cancel X — clears the queue
524
- if (e.target === queueCancelX || queueCancelX.contains(e.target)) {
525
- clearQueue();
526
- return;
527
- }
528
- // Main button click — queue the current input if no item queued yet
529
- if (chatQueue.length === 0) {
530
- const text = promptInput.value.trim();
531
- if (text) {
532
- promptInput.value = '';
533
- promptInput.style.height = 'auto';
534
- queueMessage(text);
535
- }
536
- }
537
- });
538
- promptInput.addEventListener('keydown', e => {
539
- if (e.key === 'Enter' && !e.shiftKey) { e.preventDefault(); handleSend(); }
540
- });
541
-
542
- // ── Textarea auto-resize (up to 3 lines) ──────────────────────────
543
- function autoResizePrompt() {
544
- promptInput.style.height = 'auto';
545
- promptInput.style.height = promptInput.scrollHeight + 'px';
546
- }
547
-
548
- promptInput.addEventListener('input', autoResizePrompt);
549
-
550
- // Clicking anywhere on the prompt bar (padding, icon, gaps) focuses the input
551
- // Click anywhere on the main input row (not buttons) focuses the input
552
- document.getElementById('prompt-bar').addEventListener('click', e => {
553
- const inSend = sendBtn.contains(e.target) || e.target === sendBtn;
554
- const inNewSession = newSessionBtn.contains(e.target) || e.target === newSessionBtn;
555
- const inHistory = document.getElementById('history-btn').contains(e.target);
556
- const inQueue = queueBtn.contains(e.target);
557
- const inStop = stopBtn.contains(e.target);
558
- // Only focus if clicking in the main row area (not the actions row)
559
- const inActionsRow = e.target.closest('.prompt-row-actions');
560
- if (!inSend && !inNewSession && !inHistory && !inQueue && !inStop && !inActionsRow) {
561
- promptInput.focus();
562
- }
563
- });
564
-
565
- // ── Gateway setup ──────────────────────────────────────────────────
566
- const gateway = new SymiGateway();
567
- window.gateway = gateway; // expose for native page viewers (logs, etc.)
568
-
569
- gateway.addEventListener('connect', () => {
570
- setStatus('online');
571
- enableInput();
572
- // History arrives via separate 'history' event pushed by the server
573
- });
574
-
575
- gateway.addEventListener('history', (e) => {
576
- const msgs = Array.isArray(e.detail?.messages) ? e.detail.messages : [];
577
- renderHistory(msgs);
578
- });
579
-
580
- gateway.addEventListener('disconnect', () => {
581
- setStatus('offline');
582
- // If the gateway drops while a run is in progress, surface the failure
583
- // immediately rather than leaving the UI in a permanently locked state.
584
- if (isStreaming) {
585
- handleRunFailure('disconnected');
586
- }
587
- });
588
-
589
- gateway.addEventListener('event', (e) => {
590
- handleGatewayEvent(e.detail);
591
- });
592
-
593
- // Start connecting
594
- disableInput();
595
- gateway.start();