@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,909 +0,0 @@
1
- // ── Native Settings Panels ────────────────────────────────────────────
2
- // Renders Config, Debug, and Logs natively inside the page overlay.
3
- // No iframe, no SPA proxy — uses gateway RPC over WebSocket.
4
-
5
- // ── Shared helpers ────────────────────────────────────────────────────
6
-
7
- function escapeSettingsHtml(s) {
8
- if (!s) {
9
- return "";
10
- }
11
- return String(s).replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
12
- }
13
-
14
- /** Create or get the native content container inside the page overlay. */
15
- function getSettingsContainer() {
16
- let el = document.getElementById("native-settings-container");
17
- if (!el) {
18
- const overlay = document.querySelector("body > .page-overlay");
19
- if (!overlay) {
20
- return null;
21
- }
22
- el = document.createElement("div");
23
- el.id = "native-settings-container";
24
- overlay.appendChild(el);
25
- }
26
- return el;
27
- }
28
-
29
- /** Show native container, hide iframe. */
30
- function showSettingsContainer() {
31
- const container = getSettingsContainer();
32
- const frame = document.getElementById("page-overlay-frame");
33
- if (frame) {
34
- frame.style.display = "none";
35
- }
36
- if (container) {
37
- container.style.display = "flex";
38
- }
39
- return container;
40
- }
41
-
42
- /** Hide native container, restore iframe. */
43
- function hideSettingsContainer() {
44
- const container = document.getElementById("native-settings-container");
45
- if (container) {
46
- container.style.display = "none";
47
- container.innerHTML = "";
48
- }
49
- const frame = document.getElementById("page-overlay-frame");
50
- if (frame) {
51
- frame.style.display = "";
52
- }
53
- }
54
-
55
- // ══════════════════════════════════════════════════════════════════════
56
- // CONFIG PANEL
57
- // ══════════════════════════════════════════════════════════════════════
58
-
59
- let configData = null;
60
- let configBaseHash = null;
61
- let configEditMode = false;
62
-
63
- async function fetchConfig() {
64
- if (!window.gateway?.connected) {
65
- return null;
66
- }
67
- try {
68
- const result = await window.gateway.rpc("config.get", {});
69
- return result;
70
- } catch (err) {
71
- console.error("[settings:config] fetch error:", err);
72
- return null;
73
- }
74
- }
75
-
76
- function renderConfigValue(key, value, depth) {
77
- const indent = depth * 1;
78
- if (value === null || value === undefined) {
79
- return `<span class="cfg-null">null</span>`;
80
- }
81
- if (typeof value === "boolean") {
82
- return `<span class="cfg-bool">${value}</span>`;
83
- }
84
- if (typeof value === "number") {
85
- return `<span class="cfg-num">${value}</span>`;
86
- }
87
- if (typeof value === "string") {
88
- if (value.length > 120) {
89
- return `<span class="cfg-str">"${escapeSettingsHtml(value.slice(0, 120))}..."</span>`;
90
- }
91
- return `<span class="cfg-str">"${escapeSettingsHtml(value)}"</span>`;
92
- }
93
- if (Array.isArray(value)) {
94
- if (value.length === 0) {
95
- return `<span class="cfg-bracket">[]</span>`;
96
- }
97
- const items = value
98
- .map(
99
- (v, i) =>
100
- `<div class="cfg-row" style="padding-left:${indent + 1}em">${renderConfigValue(i, v, depth + 1)}</div>`,
101
- )
102
- .join("");
103
- return `<span class="cfg-bracket">[</span>${items}<div style="padding-left:${indent}em"><span class="cfg-bracket">]</span></div>`;
104
- }
105
- if (typeof value === "object") {
106
- const entries = Object.entries(value);
107
- if (entries.length === 0) {
108
- return `<span class="cfg-bracket">{}</span>`;
109
- }
110
- const rows = entries
111
- .map(
112
- ([k, v]) =>
113
- `<div class="cfg-row" style="padding-left:${indent + 1}em"><span class="cfg-key">${escapeSettingsHtml(k)}</span><span class="cfg-colon">: </span>${renderConfigValue(k, v, depth + 1)}</div>`,
114
- )
115
- .join("");
116
- return `<span class="cfg-bracket">{</span>${rows}<div style="padding-left:${indent}em"><span class="cfg-bracket">}</span></div>`;
117
- }
118
- return escapeSettingsHtml(String(value));
119
- }
120
-
121
- function renderConfigSection(key, value, isRedacted) {
122
- const isExpanded = typeof value === "object" && value !== null;
123
- const icon = isExpanded ? "&#9662;" : "&#9656;";
124
- const redactedBadge = isRedacted ? '<span class="cfg-redacted">REDACTED</span>' : "";
125
-
126
- return `
127
- <div class="settings-section" data-key="${escapeSettingsHtml(key)}">
128
- <div class="settings-section-header" onclick="this.parentElement.classList.toggle('collapsed')">
129
- <span class="settings-section-arrow">${icon}</span>
130
- <span class="settings-section-key">${escapeSettingsHtml(key)}</span>
131
- ${redactedBadge}
132
- </div>
133
- <div class="settings-section-body">
134
- ${renderConfigValue(key, value, 0)}
135
- </div>
136
- </div>
137
- `;
138
- }
139
-
140
- async function openConfigPanel() {
141
- const container = showSettingsContainer();
142
- if (!container) {
143
- return;
144
- }
145
-
146
- container.innerHTML = `
147
- <div class="settings-panel">
148
- <div class="settings-toolbar">
149
- <div class="settings-toolbar-left">
150
- <span class="settings-toolbar-label">SYSTEM CONFIGURATION</span>
151
- </div>
152
- <div class="settings-toolbar-right">
153
- <button class="settings-btn" id="config-refresh-btn" title="Refresh">Refresh</button>
154
- <button class="settings-btn settings-btn--primary" id="config-edit-btn" title="Edit raw JSON">Edit</button>
155
- </div>
156
- </div>
157
- <div class="settings-content" id="config-content">
158
- <div class="settings-loading">Loading configuration...</div>
159
- </div>
160
- </div>
161
- `;
162
-
163
- // Wire refresh
164
- document
165
- .getElementById("config-refresh-btn")
166
- .addEventListener("click", () => void loadConfigView());
167
- document.getElementById("config-edit-btn").addEventListener("click", () => toggleConfigEditor());
168
-
169
- await loadConfigView();
170
- }
171
-
172
- async function loadConfigView() {
173
- const content = document.getElementById("config-content");
174
- if (!content) {
175
- return;
176
- }
177
-
178
- content.innerHTML = '<div class="settings-loading">Loading...</div>';
179
- const result = await fetchConfig();
180
-
181
- if (!result || !result.config) {
182
- content.innerHTML =
183
- '<div class="settings-empty">Unable to load configuration. Gateway may not be connected.</div>';
184
- return;
185
- }
186
-
187
- configData = result.config;
188
- configBaseHash = result.hash;
189
- configEditMode = false;
190
-
191
- // Render tree view
192
- const redacted = new Set(result.redactedPaths || []);
193
- const sections = Object.entries(configData);
194
-
195
- if (sections.length === 0) {
196
- content.innerHTML = '<div class="settings-empty">Configuration is empty.</div>';
197
- return;
198
- }
199
-
200
- content.innerHTML = sections
201
- .map(([key, value]) => {
202
- const isRedacted = redacted.has(key);
203
- return renderConfigSection(key, value, isRedacted);
204
- })
205
- .join("");
206
- }
207
-
208
- function toggleConfigEditor() {
209
- const content = document.getElementById("config-content");
210
- const editBtn = document.getElementById("config-edit-btn");
211
- if (!content) {
212
- return;
213
- }
214
-
215
- if (configEditMode) {
216
- // Switch back to tree view
217
- configEditMode = false;
218
- editBtn.textContent = "Edit";
219
- editBtn.classList.remove("settings-btn--active");
220
- void loadConfigView();
221
- return;
222
- }
223
-
224
- // Switch to editor
225
- configEditMode = true;
226
- editBtn.textContent = "View";
227
- editBtn.classList.add("settings-btn--active");
228
-
229
- const json = JSON.stringify(configData, null, 2);
230
- content.innerHTML = `
231
- <div class="config-editor-wrap">
232
- <textarea class="config-editor" id="config-editor-textarea" spellcheck="false">${escapeSettingsHtml(json)}</textarea>
233
- <div class="config-editor-actions">
234
- <span class="config-editor-hint">Edit the JSON above, then save to apply changes.</span>
235
- <button class="settings-btn settings-btn--danger" id="config-save-btn">Save & Apply</button>
236
- </div>
237
- </div>
238
- `;
239
-
240
- document.getElementById("config-save-btn").addEventListener("click", saveConfig);
241
- }
242
-
243
- async function saveConfig() {
244
- const textarea = document.getElementById("config-editor-textarea");
245
- const saveBtn = document.getElementById("config-save-btn");
246
- if (!textarea || !saveBtn) {
247
- return;
248
- }
249
-
250
- let parsed;
251
- try {
252
- parsed = JSON.parse(textarea.value);
253
- } catch (err) {
254
- alert("Invalid JSON: " + err.message);
255
- return;
256
- }
257
-
258
- saveBtn.textContent = "Saving...";
259
- saveBtn.disabled = true;
260
-
261
- try {
262
- await window.gateway.rpc("config.apply", {
263
- raw: parsed,
264
- baseHash: configBaseHash,
265
- });
266
- saveBtn.textContent = "Saved!";
267
- setTimeout(() => {
268
- configEditMode = false;
269
- const editBtn = document.getElementById("config-edit-btn");
270
- if (editBtn) {
271
- editBtn.textContent = "Edit";
272
- editBtn.classList.remove("settings-btn--active");
273
- }
274
- void loadConfigView();
275
- }, 800);
276
- } catch (err) {
277
- saveBtn.textContent = "Save & Apply";
278
- saveBtn.disabled = false;
279
- alert("Save failed: " + err.message);
280
- }
281
- }
282
-
283
- // ══════════════════════════════════════════════════════════════════════
284
- // DEBUG PANEL
285
- // ══════════════════════════════════════════════════════════════════════
286
-
287
- let debugEntries = [];
288
- let debugPaused = false;
289
- const DEBUG_MAX = 500;
290
-
291
- function openDebugPanel() {
292
- const container = showSettingsContainer();
293
- if (!container) {
294
- return;
295
- }
296
-
297
- container.innerHTML = `
298
- <div class="settings-panel">
299
- <div class="settings-toolbar">
300
- <div class="settings-toolbar-left">
301
- <span class="settings-toolbar-label">DEBUG CONSOLE</span>
302
- <span class="settings-toolbar-count" id="debug-count">0 events</span>
303
- </div>
304
- <div class="settings-toolbar-right">
305
- <button class="settings-btn" id="debug-pause-btn">Pause</button>
306
- <button class="settings-btn" id="debug-clear-btn">Clear</button>
307
- <button class="settings-btn" id="debug-export-btn">Export</button>
308
- </div>
309
- </div>
310
- <div class="settings-content debug-scroll" id="debug-content">
311
- <div class="settings-empty">Listening for events...</div>
312
- </div>
313
- </div>
314
- `;
315
-
316
- debugEntries = [];
317
- debugPaused = false;
318
-
319
- document.getElementById("debug-pause-btn").addEventListener("click", () => {
320
- debugPaused = !debugPaused;
321
- document.getElementById("debug-pause-btn").textContent = debugPaused ? "Resume" : "Pause";
322
- });
323
-
324
- document.getElementById("debug-clear-btn").addEventListener("click", () => {
325
- debugEntries = [];
326
- renderDebugEntries();
327
- });
328
-
329
- document.getElementById("debug-export-btn").addEventListener("click", () => {
330
- const text = debugEntries.map((e) => `${e.time} [${e.type}] ${e.summary}`).join("\n");
331
- const blob = new Blob([text], { type: "text/plain" });
332
- const a = document.createElement("a");
333
- a.href = URL.createObjectURL(blob);
334
- a.download = `symi-debug-${new Date().toISOString().slice(0, 19)}.txt`;
335
- a.click();
336
- });
337
-
338
- // Start capturing events. If a previous capture closure is still attached
339
- // (rapid re-open race), mark it cancelled so its body no-ops before we
340
- // swap in the new one. Without this, the previous closure keeps reading
341
- // the old panel's DOM even after it's gone and throws silently.
342
- if (window.__debugPanelCapture && typeof window.__debugPanelCapture === "function") {
343
- try {
344
- window.__debugPanelCapture.__cancelled = true;
345
- } catch {
346
- /* non-extensible function — ignore */
347
- }
348
- }
349
- const capture = function (type, payload) {
350
- if (capture.__cancelled) {
351
- return;
352
- }
353
- if (debugPaused) {
354
- return;
355
- }
356
- const time = new Date().toLocaleTimeString("en-US", { hour12: false });
357
- let summary = "";
358
- try {
359
- summary =
360
- typeof payload === "object"
361
- ? JSON.stringify(payload).slice(0, 200)
362
- : String(payload).slice(0, 200);
363
- } catch {
364
- summary = "[unserializable]";
365
- }
366
- debugEntries.unshift({ time, type, summary, payload });
367
- if (debugEntries.length > DEBUG_MAX) {
368
- debugEntries.length = DEBUG_MAX;
369
- }
370
- renderDebugEntries();
371
- };
372
- capture.__cancelled = false;
373
- window.__debugPanelCapture = capture;
374
- }
375
-
376
- function renderDebugEntries() {
377
- const content = document.getElementById("debug-content");
378
- const count = document.getElementById("debug-count");
379
- if (!content) {
380
- return;
381
- }
382
- if (count) {
383
- count.textContent = `${debugEntries.length} events`;
384
- }
385
-
386
- if (debugEntries.length === 0) {
387
- content.innerHTML = '<div class="settings-empty">Listening for events...</div>';
388
- return;
389
- }
390
-
391
- const html = debugEntries
392
- .map((e) => {
393
- const typeClass =
394
- e.type === "error"
395
- ? "debug-type--error"
396
- : e.type === "chat"
397
- ? "debug-type--chat"
398
- : e.type === "agent"
399
- ? "debug-type--agent"
400
- : "debug-type--other";
401
- return `<div class="debug-entry-row">
402
- <span class="debug-time">${e.time}</span>
403
- <span class="debug-type ${typeClass}">${escapeSettingsHtml(e.type)}</span>
404
- <span class="debug-summary">${escapeSettingsHtml(e.summary)}</span>
405
- </div>`;
406
- })
407
- .join("");
408
-
409
- content.innerHTML = html;
410
- }
411
-
412
- function closeDebugPanel() {
413
- // Cancel any pending capture closure before dropping the reference so
414
- // in-flight capture() calls short-circuit if they were already scheduled.
415
- const existing = window.__debugPanelCapture;
416
- if (existing && typeof existing === "function") {
417
- try {
418
- existing.__cancelled = true;
419
- } catch {
420
- /* non-extensible — ignore */
421
- }
422
- }
423
- window.__debugPanelCapture = null;
424
- }
425
-
426
- // ══════════════════════════════════════════════════════════════════════
427
- // LOGS PANEL (replaces the dead-code logs.js)
428
- // ══════════════════════════════════════════════════════════════════════
429
-
430
- const LOGS_POLL_MS = 3000;
431
- const LOGS_LIMIT = 500;
432
- const LOGS_MAX_BYTES = 250000;
433
-
434
- const LEVEL_COLORS = {
435
- TRACE: "#6b7280",
436
- DEBUG: "#8b5cf6",
437
- INFO: "#60a5fa",
438
- WARN: "#f59e0b",
439
- ERROR: "#ef4444",
440
- FATAL: "#dc2626",
441
- };
442
-
443
- const LEVEL_ORDER = ["TRACE", "DEBUG", "INFO", "WARN", "ERROR", "FATAL"];
444
-
445
- let logsEntries = [];
446
- let logsCursor = null;
447
- let logsTimer = null;
448
- let logsAutoFollow = true;
449
- let logsLevelFilters = new Set(LEVEL_ORDER);
450
- let logsFilterText = "";
451
-
452
- function parseLogLine(line) {
453
- try {
454
- const obj = JSON.parse(line);
455
- const level = obj._meta?.logLevelName || "INFO";
456
- const time = obj.time || obj._meta?.date || "";
457
- const msg = obj["1"] || obj.msg || obj.message || "";
458
- const sub = obj["0"] || "";
459
- return { level, time, msg, sub, raw: line, parsed: obj };
460
- } catch {
461
- return { level: "INFO", time: "", msg: line, sub: "", raw: line, parsed: null };
462
- }
463
- }
464
-
465
- function getVisibleLogEntries() {
466
- return logsEntries.filter((e) => {
467
- if (!logsLevelFilters.has(e.level)) {
468
- return false;
469
- }
470
- if (logsFilterText && !e.raw.toLowerCase().includes(logsFilterText)) {
471
- return false;
472
- }
473
- return true;
474
- });
475
- }
476
-
477
- function renderLogEntries() {
478
- const el = document.getElementById("logs-entries");
479
- if (!el) {
480
- return;
481
- }
482
-
483
- const visible = getVisibleLogEntries();
484
- const html = visible
485
- .map((e) => {
486
- const color = LEVEL_COLORS[e.level] || "#999";
487
- const timeStr = e.time ? new Date(e.time).toLocaleTimeString("en-US", { hour12: false }) : "";
488
- const escapedMsg = escapeSettingsHtml(e.msg).substring(0, 500);
489
- const escapedSub = escapeSettingsHtml(e.sub);
490
- return `<div class="log-row">
491
- <span class="log-time">${timeStr}</span>
492
- <span class="log-level" style="color:${color}">${e.level.padEnd(5)}</span>
493
- ${escapedSub ? `<span class="log-sub">${escapedSub}</span>` : ""}
494
- <span class="log-msg">${escapedMsg}</span>
495
- </div>`;
496
- })
497
- .join("");
498
-
499
- el.innerHTML = html || '<div class="settings-empty">No log entries.</div>';
500
-
501
- if (logsAutoFollow) {
502
- const scroll = document.getElementById("logs-scroll-area");
503
- if (scroll) {
504
- scroll.scrollTop = scroll.scrollHeight;
505
- }
506
- }
507
- }
508
-
509
- async function fetchLogs() {
510
- if (!window.gateway?.connected) {
511
- return;
512
- }
513
- try {
514
- const params = { limit: LOGS_LIMIT, maxBytes: LOGS_MAX_BYTES };
515
- if (logsCursor != null) {
516
- params.cursor = logsCursor;
517
- }
518
- const result = await window.gateway.rpc("logs.tail", params);
519
- if (!result) {
520
- return;
521
- }
522
-
523
- if (result.reset) {
524
- logsEntries = [];
525
- logsCursor = null;
526
- }
527
-
528
- if (result.lines && result.lines.length > 0) {
529
- const newEntries = result.lines.map(parseLogLine);
530
- logsEntries.push(...newEntries);
531
- if (logsEntries.length > 2000) {
532
- logsEntries = logsEntries.slice(logsEntries.length - 2000);
533
- }
534
- renderLogEntries();
535
- }
536
-
537
- if (typeof result.cursor === "number") {
538
- logsCursor = result.cursor;
539
- }
540
- } catch (err) {
541
- console.error("[settings:logs] fetch error:", err);
542
- }
543
- }
544
-
545
- function startLogsPolling() {
546
- logsCursor = null;
547
- logsEntries = [];
548
-
549
- if (!window.gateway?.connected) {
550
- const waitIv = setInterval(() => {
551
- if (window.gateway?.connected) {
552
- clearInterval(waitIv);
553
- void fetchLogs();
554
- if (logsTimer) {
555
- clearInterval(logsTimer);
556
- }
557
- logsTimer = setInterval(fetchLogs, LOGS_POLL_MS);
558
- }
559
- }, 500);
560
- setTimeout(() => clearInterval(waitIv), 30000);
561
- return;
562
- }
563
-
564
- void fetchLogs();
565
- if (logsTimer) {
566
- clearInterval(logsTimer);
567
- }
568
- logsTimer = setInterval(fetchLogs, LOGS_POLL_MS);
569
- }
570
-
571
- function stopLogsPolling() {
572
- if (logsTimer) {
573
- clearInterval(logsTimer);
574
- logsTimer = null;
575
- }
576
- }
577
-
578
- function openLogsPanel() {
579
- const container = showSettingsContainer();
580
- if (!container) {
581
- return;
582
- }
583
-
584
- container.innerHTML = `
585
- <div class="settings-panel">
586
- <div class="settings-toolbar">
587
- <div class="settings-toolbar-left">
588
- <span class="settings-toolbar-label">SYSTEM LOGS</span>
589
- <span class="settings-toolbar-count" id="logs-count">0 entries</span>
590
- </div>
591
- <div class="settings-toolbar-right">
592
- <div class="logs-level-filters">
593
- ${LEVEL_ORDER.map(
594
- (l) => `
595
- <label class="logs-level-chip" data-level="${l}">
596
- <input type="checkbox" checked data-level="${l}">
597
- <span style="color:${LEVEL_COLORS[l]}">${l}</span>
598
- </label>
599
- `,
600
- ).join("")}
601
- </div>
602
- <input type="text" class="settings-search" id="logs-filter-input" placeholder="Filter..." />
603
- <label class="settings-checkbox-label">
604
- <input type="checkbox" id="logs-follow-cb" checked> Follow
605
- </label>
606
- <button class="settings-btn" id="logs-export-btn">Export</button>
607
- </div>
608
- </div>
609
- <div class="settings-content logs-scroll" id="logs-scroll-area">
610
- <div id="logs-entries">
611
- <div class="settings-loading">Connecting to log stream...</div>
612
- </div>
613
- </div>
614
- </div>
615
- `;
616
-
617
- // Wire level filters
618
- container.querySelectorAll(".logs-level-chip input").forEach((cb) => {
619
- cb.addEventListener("change", () => {
620
- const level = cb.dataset.level;
621
- if (cb.checked) {
622
- logsLevelFilters.add(level);
623
- } else {
624
- logsLevelFilters.delete(level);
625
- }
626
- renderLogEntries();
627
- });
628
- });
629
-
630
- // Wire filter text
631
- document.getElementById("logs-filter-input").addEventListener("input", (e) => {
632
- logsFilterText = e.target.value.toLowerCase();
633
- renderLogEntries();
634
- });
635
-
636
- // Wire auto-follow
637
- document.getElementById("logs-follow-cb").addEventListener("change", (e) => {
638
- logsAutoFollow = e.target.checked;
639
- if (logsAutoFollow) {
640
- const scroll = document.getElementById("logs-scroll-area");
641
- if (scroll) {
642
- scroll.scrollTop = scroll.scrollHeight;
643
- }
644
- }
645
- });
646
-
647
- // Wire export
648
- document.getElementById("logs-export-btn").addEventListener("click", () => {
649
- const visible = getVisibleLogEntries();
650
- const text = visible.map((e) => e.raw).join("\n");
651
- const blob = new Blob([text], { type: "text/plain" });
652
- const a = document.createElement("a");
653
- a.href = URL.createObjectURL(blob);
654
- a.download = `symi-logs-${new Date().toISOString().slice(0, 19)}.txt`;
655
- a.click();
656
- });
657
-
658
- startLogsPolling();
659
- }
660
-
661
- function closeLogsPanel() {
662
- stopLogsPolling();
663
- }
664
-
665
- // ══════════════════════════════════════════════════════════════════════
666
- // GENERIC RPC LIST PANEL — used by Overview, Channels, Sessions, etc.
667
- // ══════════════════════════════════════════════════════════════════════
668
-
669
- const PAGE_RPC = {
670
- overview: { method: "system.status", label: "SYSTEM OVERVIEW", type: "object" },
671
- channels: {
672
- method: "channels.status",
673
- label: "MESSAGING CHANNELS",
674
- type: "list",
675
- key: "channels",
676
- },
677
- instances: { method: "system.status", label: "AI INSTANCES", type: "object" },
678
- sessions: { method: "sessions.list", label: "ACTIVE SESSIONS", type: "list", key: "sessions" },
679
- usage: { method: "usage.status", label: "USAGE & TOKENS", type: "object" },
680
- cron: { method: "cron.list", label: "SCHEDULED TASKS", type: "list", key: "jobs" },
681
- tasks: { method: "tasks.list", label: "BACKGROUND TASKS", type: "list", key: "tasks" },
682
- agents: { method: "agents.list", label: "AGENT MANAGEMENT", type: "list", key: "agents" },
683
- skills: { method: "skills.status", label: "AGENT SKILLS", type: "object" },
684
- nodes: { method: "node.list", label: "CONNECTED DEVICES", type: "list", key: "nodes" },
685
- };
686
-
687
- function renderDataCard(key, value) {
688
- if (typeof value === "object" && value !== null && !Array.isArray(value)) {
689
- const rows = Object.entries(value)
690
- .map(([k, v]) => {
691
- const display = v == null ? "—" : JSON.stringify(v);
692
- return `<div class="data-card-row">
693
- <span class="data-card-label">${escapeSettingsHtml(k)}</span>
694
- <span class="data-card-value">${escapeSettingsHtml(display.slice(0, 200))}</span>
695
- </div>`;
696
- })
697
- .join("");
698
- return `<div class="data-card">
699
- <div class="data-card-header">${escapeSettingsHtml(String(key))}</div>
700
- ${rows}
701
- </div>`;
702
- }
703
- return `<div class="data-card">
704
- <div class="data-card-header">${escapeSettingsHtml(String(key))}</div>
705
- <div class="data-card-row"><span class="data-card-value">${escapeSettingsHtml(value != null ? JSON.stringify(value) : "—")}</span></div>
706
- </div>`;
707
- }
708
-
709
- // Pagination state per generic panel — keyed by the page identifier.
710
- // Resets when the panel is opened; survives across refresh within one session.
711
- const GENERIC_PAGE_SIZE = 50;
712
- const genericShownCount = new Map();
713
-
714
- function resetGenericPagination(page) {
715
- genericShownCount.set(page, GENERIC_PAGE_SIZE);
716
- }
717
-
718
- function bumpGenericPagination(page) {
719
- const cur = genericShownCount.get(page) ?? GENERIC_PAGE_SIZE;
720
- genericShownCount.set(page, cur + GENERIC_PAGE_SIZE);
721
- }
722
-
723
- function renderListData(items, page) {
724
- if (!items || items.length === 0) {
725
- return '<div class="settings-empty">No items found.</div>';
726
- }
727
- const shown = page ? (genericShownCount.get(page) ?? GENERIC_PAGE_SIZE) : items.length;
728
- const slice = items.slice(0, shown);
729
- const html = slice
730
- .map((item, i) => {
731
- const title = item.name || item.id || item.sessionKey || item.label || `Item ${i + 1}`;
732
- return renderDataCard(title, item);
733
- })
734
- .join("");
735
- if (!page || items.length <= shown) {
736
- return html;
737
- }
738
- const remaining = items.length - shown;
739
- const nextBatch = Math.min(GENERIC_PAGE_SIZE, remaining);
740
- return `${html}
741
- <div class="settings-pagination">
742
- <span class="settings-pagination-info">Showing ${shown} of ${items.length}</span>
743
- <button class="settings-btn" id="generic-show-more-btn" data-page="${escapeSettingsHtml(page)}">Show ${nextBatch} more</button>
744
- </div>`;
745
- }
746
-
747
- function renderObjectData(data) {
748
- if (!data || Object.keys(data).length === 0) {
749
- return '<div class="settings-empty">No data available.</div>';
750
- }
751
- return Object.entries(data)
752
- .map(([key, value]) => {
753
- if (Array.isArray(value)) {
754
- return `<div class="data-card">
755
- <div class="data-card-header">${escapeSettingsHtml(key)} <span class="data-card-badge">${value.length}</span></div>
756
- ${
757
- value.length === 0
758
- ? '<div class="data-card-row"><span class="data-card-value">Empty</span></div>'
759
- : value
760
- .slice(0, 20)
761
- .map((item, i) => {
762
- const label =
763
- typeof item === "object" ? item.name || item.id || `#${i + 1}` : String(item);
764
- const detail = typeof item === "object" ? JSON.stringify(item).slice(0, 150) : "";
765
- return `<div class="data-card-row">
766
- <span class="data-card-label">${escapeSettingsHtml(String(label))}</span>
767
- ${detail ? `<span class="data-card-value">${escapeSettingsHtml(detail)}</span>` : ""}
768
- </div>`;
769
- })
770
- .join("") +
771
- (value.length > 20
772
- ? `<div class="data-card-row"><span class="data-card-value">... and ${value.length - 20} more</span></div>`
773
- : "")
774
- }
775
- </div>`;
776
- }
777
- if (typeof value === "object" && value !== null) {
778
- return renderDataCard(key, value);
779
- }
780
- return `<div class="data-card-inline">
781
- <span class="data-card-label">${escapeSettingsHtml(key)}</span>
782
- <span class="data-card-value">${escapeSettingsHtml(value != null ? JSON.stringify(value) : "—")}</span>
783
- </div>`;
784
- })
785
- .join("");
786
- }
787
-
788
- async function openGenericPanel(page) {
789
- const spec = PAGE_RPC[page];
790
- if (!spec) {
791
- return;
792
- }
793
-
794
- const container = showSettingsContainer();
795
- if (!container) {
796
- return;
797
- }
798
-
799
- container.innerHTML = `
800
- <div class="settings-panel">
801
- <div class="settings-toolbar">
802
- <div class="settings-toolbar-left">
803
- <span class="settings-toolbar-label">${spec.label}</span>
804
- </div>
805
- <div class="settings-toolbar-right">
806
- <button class="settings-btn" id="generic-refresh-btn">Refresh</button>
807
- </div>
808
- </div>
809
- <div class="settings-content" id="generic-content">
810
- <div class="settings-loading">Loading...</div>
811
- </div>
812
- </div>
813
- `;
814
-
815
- document.getElementById("generic-refresh-btn").addEventListener("click", () => {
816
- resetGenericPagination(page);
817
- void loadGenericData(page);
818
- });
819
- // Delegated click handler for the "Show more" button rendered inside
820
- // generic-content. We attach on the container so it survives innerHTML
821
- // re-renders driven by loadGenericData.
822
- container.addEventListener("click", (e) => {
823
- const target = e.target;
824
- if (target && target.id === "generic-show-more-btn") {
825
- bumpGenericPagination(page);
826
- void loadGenericData(page);
827
- }
828
- });
829
- resetGenericPagination(page);
830
- await loadGenericData(page);
831
- }
832
-
833
- async function loadGenericData(page) {
834
- const spec = PAGE_RPC[page];
835
- const content = document.getElementById("generic-content");
836
- if (!spec || !content) {
837
- return;
838
- }
839
-
840
- content.innerHTML = '<div class="settings-loading">Loading...</div>';
841
-
842
- if (!window.gateway?.connected) {
843
- content.innerHTML = '<div class="settings-empty">Gateway not connected.</div>';
844
- return;
845
- }
846
-
847
- try {
848
- const result = await window.gateway.rpc(spec.method, {});
849
- if (!result) {
850
- content.innerHTML = '<div class="settings-empty">No data returned.</div>';
851
- return;
852
- }
853
- if (spec.type === "list") {
854
- const items = spec.key ? result[spec.key] : Array.isArray(result) ? result : [];
855
- content.innerHTML = renderListData(items, page);
856
- } else {
857
- content.innerHTML = renderObjectData(result);
858
- }
859
- } catch (err) {
860
- content.innerHTML = `<div class="settings-empty">Error: ${escapeSettingsHtml(err.message)}</div>`;
861
- }
862
- }
863
-
864
- // ══════════════════════════════════════════════════════════════════════
865
- // PUBLIC API — called by menu.js
866
- // ══════════════════════════════════════════════════════════════════════
867
-
868
- let activeSettingsPanel = null;
869
-
870
- window.openNativeSettings = function (page) {
871
- // Close previous panel cleanup
872
- closeActiveSettingsPanel();
873
-
874
- activeSettingsPanel = page;
875
-
876
- switch (page) {
877
- case "config":
878
- void openConfigPanel();
879
- break;
880
- case "debug":
881
- openDebugPanel();
882
- break;
883
- case "logs":
884
- openLogsPanel();
885
- break;
886
- default:
887
- if (PAGE_RPC[page]) {
888
- void openGenericPanel(page);
889
- } else {
890
- console.warn("[settings] unknown page:", page);
891
- }
892
- break;
893
- }
894
- };
895
-
896
- window.closeNativeSettings = function () {
897
- closeActiveSettingsPanel();
898
- hideSettingsContainer();
899
- activeSettingsPanel = null;
900
- };
901
-
902
- function closeActiveSettingsPanel() {
903
- if (activeSettingsPanel === "debug") {
904
- closeDebugPanel();
905
- }
906
- if (activeSettingsPanel === "logs") {
907
- closeLogsPanel();
908
- }
909
- }