@symerian/symi 3.4.30 → 3.4.31

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 (177) hide show
  1. package/dist/{agent-O3PihJOY.js → agent-ZFfYdexc.js} +10 -10
  2. package/dist/{agents-C2MpIr16.js → agents-C8naPegc.js} +5 -5
  3. package/dist/{audit-yf3H4Y1h.js → audit-DOfexJi4.js} +8 -8
  4. package/dist/{auth-choice-CyBcsQ9T.js → auth-choice-DxH-c3vK.js} +4 -4
  5. package/dist/{banner-D7__HlM-.js → banner-D7zYLyA8.js} +1 -1
  6. package/dist/{browser-cli-B_6WWHm_.js → browser-cli-MYIql1Ic.js} +3 -3
  7. package/dist/build-info.json +1 -1
  8. package/dist/bundled/boot-md/handler.js +4 -4
  9. package/dist/bundled/session-memory/handler.js +4 -4
  10. package/dist/{call-IfleM0ap.js → call-D9U2Sfhp.js} +1 -1
  11. package/dist/{channel-options-B5974x-7.js → channel-options-9PzSNQLG.js} +1 -1
  12. package/dist/{channels-cli-C6Nv9mzy.js → channels-cli-C3XnNkE5.js} +30 -30
  13. package/dist/{chrome-DT1fIVG1.js → chrome-B4P7ycw5.js} +7 -7
  14. package/dist/{chrome-DJCkCRLf.js → chrome-ClVIwINy.js} +1 -1
  15. package/dist/{cli-DZoms4qg.js → cli-DhTdzhjk.js} +26 -26
  16. package/dist/{command-registry--D98SJ6k.js → command-registry-BOwku-e8.js} +11 -11
  17. package/dist/{completion-cli-CHYvpIPw.js → completion-cli-KZYbGY4H.js} +2 -2
  18. package/dist/{config-BTSBEAnk.js → config-Byd2Y9rr.js} +5 -5
  19. package/dist/{config-cli-DstpcB33.js → config-cli-CJ1CRfG8.js} +5 -5
  20. package/dist/{config-guard-CCJrDmON.js → config-guard-zt0zhFHl.js} +2 -2
  21. package/dist/{config-validation-YCrMlM9Z.js → config-validation-CRazk6Kd.js} +1 -1
  22. package/dist/{configure-B-UvSZZ7.js → configure-CFY_XEps.js} +10 -10
  23. package/dist/{control-service-CwRG4M_O.js → control-service-DN6-IdFk.js} +4 -4
  24. package/dist/{cron-cli-DUETe3Of.js → cron-cli-fmiz43Pz.js} +3 -3
  25. package/dist/{daemon-cli-Dy5eY4M7.js → daemon-cli-BilAL40g.js} +6 -6
  26. package/dist/{daemon-runtime-ChztAKDA.js → daemon-runtime-D4KHzQq2.js} +1 -1
  27. package/dist/{deliver-59sRVaYQ.js → deliver-BkCYBlzi.js} +4 -4
  28. package/dist/{deliver-BHmK4isn.js → deliver-CnsfN7km.js} +1 -1
  29. package/dist/{devices-cli-BCZ2HHjT.js → devices-cli-D7HdOwRI.js} +2 -2
  30. package/dist/{directory-cli-BVGd0l0T.js → directory-cli-ed6QacBC.js} +1 -1
  31. package/dist/{dns-cli-DH-ksmiI.js → dns-cli-RPa1dGTQ.js} +1 -1
  32. package/dist/{docs-cli-BuX8FDdh.js → docs-cli-ZTdS_Gak.js} +2 -2
  33. package/dist/{doctor-completion-C4Sf8CFV.js → doctor-completion-DpGX8dau.js} +1 -1
  34. package/dist/{doctor-config-flow-BhmF6EAq.js → doctor-config-flow-CIrG_yW_.js} +4 -4
  35. package/dist/entry.js +3 -3
  36. package/dist/{exec-approvals-cli-CyXTXgft.js → exec-approvals-cli-65pcsa1y.js} +6 -6
  37. package/dist/{frontmatter-BH3ExkUY.js → frontmatter-B4levtVg.js} +2 -2
  38. package/dist/{gateway-cli-fT43bqlv.js → gateway-cli-CTi7Wl2k.js} +50 -50
  39. package/dist/{gateway-rpc-BEqCo2JK.js → gateway-rpc-2VPLhMhx.js} +1 -1
  40. package/dist/{glass-ui-ws-BfMKuf9v.js → glass-ui-ws-Bah_A-jn.js} +38 -38
  41. package/dist/{gmail-setup-utils-Cz9Tb30q.js → gmail-setup-utils-C9WBC6Cd.js} +1 -1
  42. package/dist/{health-DDxrkioj.js → health-B5rRzhyV.js} +3 -3
  43. package/dist/{hooks-cli-Btgk__9z.js → hooks-cli-CSDCGO-W.js} +29 -29
  44. package/dist/{hooks-status-BaV4_YaJ.js → hooks-status-OorbLcc2.js} +2 -2
  45. package/dist/index.js +0 -0
  46. package/dist/{lifecycle-core-B0tG8ERp.js → lifecycle-core-BRc-XqTk.js} +2 -2
  47. package/dist/llm-slug-generator.js +4 -4
  48. package/dist/{logs-cli-CUhZrDw7.js → logs-cli-D5phVUOT.js} +3 -3
  49. package/dist/{manager-BeNnzSJv.js → manager-BfhHvsI9.js} +1 -1
  50. package/dist/{manager-Di9qtuZF.js → manager-DzBH9uQG.js} +1 -1
  51. package/dist/{memory-BDeydRz3.js → memory-BCj0cj5v.js} +3 -3
  52. package/dist/{memory-cli-D4hZiGr5.js → memory-cli-9WUMBHol.js} +3 -3
  53. package/dist/{model-catalog-DPnCNs5N.js → model-catalog-CD2kTz4V.js} +2 -2
  54. package/dist/{model-picker-DuPommMc.js → model-picker-CVd5UuXV.js} +2 -2
  55. package/dist/{models-cli-CL5K06Wu.js → models-cli-rd4eX_6P.js} +30 -30
  56. package/dist/{models-config-CPlvO1b0.js → models-config-oxaGiRUT.js} +1 -1
  57. package/dist/{models-B0wNKA18.js → models-sbKIrJBG.js} +9 -9
  58. package/dist/{node-cli-CWWMajKF.js → node-cli-ClLXSdFL.js} +9 -9
  59. package/dist/{nodes-cli-YmE7S-JB.js → nodes-cli-DY38p5In.js} +3 -3
  60. package/dist/{onboard-HqUZVKyD.js → onboard-BAyp_UFm.js} +7 -7
  61. package/dist/{onboard-channels-BbF5-N3g.js → onboard-channels-CUpkV_IJ.js} +1 -1
  62. package/dist/{onboard-custom-63SI3jrk.js → onboard-custom-BMgLK-vo.js} +2 -2
  63. package/dist/{onboard-helpers-Cb3WFLl9.js → onboard-helpers-DIQjpQ-s.js} +2 -2
  64. package/dist/{onboard-hooks-DXXg3YH9.js → onboard-hooks-KZKmj5Dk.js} +3 -3
  65. package/dist/{onboard-remote-CqtCrqtm.js → onboard-remote-C-_NUgBl.js} +1 -1
  66. package/dist/{onboard-skills-CS3l5fhH.js → onboard-skills-CwvicFTi.js} +3 -3
  67. package/dist/{onboarding-Be_HJIFA.js → onboarding-BxCNNo75.js} +11 -11
  68. package/dist/{onboarding.finalize-dsCUTKCQ.js → onboarding.finalize-DgMPXTtO.js} +18 -18
  69. package/dist/{onboarding.gateway-config-Ctd1_QW4.js → onboarding.gateway-config-BAaWvPSX.js} +4 -4
  70. package/dist/{outbound-send-deps-DPsU_Xdy.js → outbound-send-deps-qhFaNYAY.js} +1 -1
  71. package/dist/{pairing-cli-PtlNv7Gr.js → pairing-cli-CFkiSx8t.js} +1 -1
  72. package/dist/{pi-embedded-helpers-CVKIHnFv.js → pi-embedded-helpers-CRG5LMS7.js} +1 -1
  73. package/dist/{pi-tools.policy-8_wTu7v2.js → pi-tools.policy-De6xHjVL.js} +2 -2
  74. package/dist/{plugin-registry-BG51uZOA.js → plugin-registry-BNe5jtPK.js} +2 -2
  75. package/dist/plugin-sdk/index.js +6 -6
  76. package/dist/{plugins-cli-B-zVOiQN.js → plugins-cli-CWj33_Hj.js} +27 -27
  77. package/dist/{program-BOh0XGsA.js → program-Z2OLlhsB.js} +33 -33
  78. package/dist/{prompt-select-styled-Bj-hrPCx.js → prompt-select-styled-BNwbBBcH.js} +16 -16
  79. package/dist/{provider-auth-helpers-BK6NFk2Q.js → provider-auth-helpers-5qb15Hje.js} +2 -2
  80. package/dist/{push-apns-CMxk3Hxf.js → push-apns-D6qV5P4h.js} +1 -1
  81. package/dist/{pw-ai-C5MJKzUM.js → pw-ai-BsEf8C15.js} +1 -1
  82. package/dist/{pw-ai-CE2TBGif.js → pw-ai-C7mvVllB.js} +2 -2
  83. package/dist/{qr-cli-BeHlC33g.js → qr-cli-oENcXq8d.js} +1 -1
  84. package/dist/{redact-identifier-B1VHIbnd.js → redact-identifier-ZE8OIUof.js} +1 -1
  85. package/dist/{register.agent-COv5OPLQ.js → register.agent-DpiHPMca.js} +36 -36
  86. package/dist/{register.configure-RhKVlfWH.js → register.configure-DRFaroYF.js} +40 -40
  87. package/dist/{register.maintenance-BAK-DiQY.js → register.maintenance-BGNNTt_1.js} +38 -38
  88. package/dist/{register.message-CCBmn5ja.js → register.message-R4AIHhlU.js} +28 -28
  89. package/dist/{register.onboard-B3jO_Goy.js → register.onboard-Cl-_Suyv.js} +13 -13
  90. package/dist/{register.setup-CYSISTDO.js → register.setup-Dt98v2V3.js} +15 -15
  91. package/dist/{register.status-health-sessions-CGbg9k6d.js → register.status-health-sessions-DiX5lVyr.js} +23 -23
  92. package/dist/{register.subclis-loifbhVx.js → register.subclis-DVObuR_P.js} +28 -28
  93. package/dist/{replies-Dj640LxQ.js → replies-VTJu1jUK.js} +1 -1
  94. package/dist/{routes-B5y-oAKp.js → routes-DOFg6X5M.js} +3 -3
  95. package/dist/{rpc-qWm1bRo5.js → rpc-BIHKXdlN.js} +1 -1
  96. package/dist/{run-main-B7Ria3zD.js → run-main-NAgYKzSu.js} +44 -44
  97. package/dist/{sandbox-BJgHc4Vu.js → sandbox-EB7cFSML.js} +6 -6
  98. package/dist/{sandbox-cli-CSudrHYL.js → sandbox-cli-D4dy6sUK.js} +8 -8
  99. package/dist/{security-cli-B2lCR2xX.js → security-cli-DwCKOrFm.js} +11 -11
  100. package/dist/{send-CY9na-Jw.js → send-CkRtuQbr.js} +1 -1
  101. package/dist/{server-context-DdWWaDf6.js → server-context-ww1jytet.js} +5 -5
  102. package/dist/{server-methods-Dk_EnINI.js → server-methods-BDiZyPvS.js} +23 -23
  103. package/dist/{server-node-events-BHegSgG9.js → server-node-events-9cY40B4m.js} +29 -29
  104. package/dist/{session-utils-CAVPV2Hh.js → session-utils-CStjqGE6.js} +3 -3
  105. package/dist/{sessions-BDM9kNY0.js → sessions-BSRHJH8T.js} +3 -3
  106. package/dist/{sessions-CqLQkkWg.js → sessions-CInbrqsF.js} +1 -1
  107. package/dist/{shared-CpwtQRJB.js → shared-DEAo94kI.js} +1 -1
  108. package/dist/{skill-commands-CRQniaHy.js → skill-commands-BkKfrbHt.js} +2 -2
  109. package/dist/{skills-CTcjFd_F.js → skills-CFLijAZ-.js} +1 -1
  110. package/dist/{skills-cli-9Mlb7VRg.js → skills-cli-BbagnO6p.js} +5 -5
  111. package/dist/{skills-install-D5ikt72d.js → skills-install-dLRO1KGp.js} +2 -2
  112. package/dist/{skills-remote-BASG1Doo.js → skills-remote-DQVB-3Pj.js} +1 -1
  113. package/dist/{skills-status-1iVfuVIG.js → skills-status-HWybfj0K.js} +2 -2
  114. package/dist/{status-Bci6O3aA.js → status-BSrVEUoJ.js} +2 -2
  115. package/dist/{status-D5RhVO0A.js → status-FIp7UKru.js} +12 -12
  116. package/dist/{status.update-D5CachQ_.js → status.update-Cm8Fm8QD.js} +1 -1
  117. package/dist/{subagent-registry-CsXaK_sy.js → subagent-registry-DqryocLT.js} +31 -31
  118. package/dist/{synthesis-dplLmFIP.js → synthesis-CS-lrEGy.js} +4 -4
  119. package/dist/{synthesis-BoZf8BeO.js → synthesis-DKhH0YwU.js} +26 -26
  120. package/dist/{system-cli-D5FffFX5.js → system-cli-DYSI6cIB.js} +3 -3
  121. package/dist/{systemd-hints-CufcSfMk.js → systemd-hints-EIfW5y8K.js} +1 -1
  122. package/dist/{tui-DZ8gksSZ.js → tui-C20rHOeB.js} +4 -4
  123. package/dist/{tui-cli-CyBJYh9u.js → tui-cli-JwlzHCza.js} +11 -11
  124. package/dist/{unified-runner-BFLLzEHE.js → unified-runner-AM9tFC5q.js} +10 -10
  125. package/dist/{update-cli-yW6Xl6fs.js → update-cli-BYfA3RPc.js} +41 -41
  126. package/dist/{update-runner-CIgLduhH.js → update-runner-CBG8p9iG.js} +1 -1
  127. package/dist/{webhooks-cli-4bmyKzwb.js → webhooks-cli-MuG_QGLp.js} +4 -4
  128. package/dist/{with-timeout-bWr6yBeX.js → with-timeout-BvxaeAo6.js} +1 -1
  129. package/dist/{workspace-DxscDsm6.js → workspace-D0d7Gi4-.js} +1 -1
  130. package/extensions/memory-core/node_modules/.bin/symi +0 -0
  131. package/extensions/msteams/node_modules/.bin/symi +0 -0
  132. package/extensions/outlook/node_modules/.bin/symi +0 -0
  133. package/extensions/slack/node_modules/.bin/symi +0 -0
  134. package/package.json +108 -79
  135. package/dist/control-ui/css/revert-red-theme.md +0 -141
  136. package/dist/control-ui/css/style.css +0 -5843
  137. package/dist/control-ui/css/style.css.backup-2026-03-03-162525 +0 -3546
  138. package/dist/control-ui/css/style.css.backup-before-red-2026-03-03-162525 +0 -3546
  139. package/dist/control-ui/css/style.css.backup-before-red-theme-2026-03-03-162530 +0 -3546
  140. package/dist/control-ui/css/style.css.pre-2row +0 -2165
  141. package/dist/control-ui/css/style.css.pre-brand +0 -1776
  142. package/dist/control-ui/css/style.css.pre-history +0 -1974
  143. package/dist/control-ui/css/style.css.pre-nav +0 -2264
  144. package/dist/control-ui/css/style.css.pre-newsession +0 -1898
  145. package/dist/control-ui/css/style.css.pre-queue +0 -2195
  146. package/dist/control-ui/css/style.css.pre-red-prompt +0 -2524
  147. package/dist/control-ui/css/style.css.pre-stop +0 -2239
  148. package/dist/control-ui/css/style.css.pre-textarea +0 -2184
  149. package/dist/control-ui/css/style.css.pre-watchdog +0 -1848
  150. package/dist/control-ui/css/style.css.red-theme +0 -2999
  151. package/dist/control-ui/index.html +0 -1042
  152. package/dist/control-ui/js/app.js +0 -1304
  153. package/dist/control-ui/js/app.js.pre-2row +0 -463
  154. package/dist/control-ui/js/app.js.pre-heartbeat-filter +0 -595
  155. package/dist/control-ui/js/app.js.pre-newsession +0 -408
  156. package/dist/control-ui/js/app.js.pre-queue +0 -476
  157. package/dist/control-ui/js/app.js.pre-stop +0 -564
  158. package/dist/control-ui/js/app.js.pre-textarea +0 -467
  159. package/dist/control-ui/js/app.js.pre-watchdog +0 -293
  160. package/dist/control-ui/js/connections.js +0 -438
  161. package/dist/control-ui/js/gateway.js +0 -233
  162. package/dist/control-ui/js/gateway.js.pre-stop +0 -110
  163. package/dist/control-ui/js/history.js +0 -732
  164. package/dist/control-ui/js/logs.js +0 -238
  165. package/dist/control-ui/js/menu.js +0 -230
  166. package/dist/control-ui/js/menu.js.pre-nav +0 -66
  167. package/dist/control-ui/js/metrics.js +0 -53
  168. package/dist/control-ui/js/models.js +0 -138
  169. package/dist/control-ui/js/render.js +0 -882
  170. package/dist/control-ui/js/render.test.js +0 -112
  171. package/dist/control-ui/js/scheduling.js +0 -461
  172. package/dist/control-ui/js/settings.js +0 -909
  173. package/dist/control-ui/js/slash-autocomplete.js +0 -168
  174. package/dist/control-ui/js/subagents.js +0 -560
  175. package/dist/control-ui/js/utils.js +0 -29
  176. package/dist/control-ui/vendor/highlight.min.js +0 -2518
  177. package/dist/control-ui/vendor/marked.min.js +0 -69
@@ -1,238 +0,0 @@
1
- // ── Native Logs Viewer ────────────────────────────────────────────────
2
- // Fetches logs via the Glass UI's gateway RPC and renders them natively.
3
- // No iframe, no SPA proxy — direct gateway connection.
4
-
5
- const LOGS_POLL_MS = 3000;
6
- const LOGS_LIMIT = 500;
7
- const LOGS_MAX_BYTES = 250000;
8
-
9
- const LEVEL_COLORS = {
10
- TRACE: '#6b7280',
11
- DEBUG: '#8b5cf6',
12
- INFO: '#60a5fa',
13
- WARN: '#f59e0b',
14
- ERROR: '#ef4444',
15
- FATAL: '#dc2626',
16
- };
17
-
18
- const LEVEL_ORDER = ['TRACE', 'DEBUG', 'INFO', 'WARN', 'ERROR', 'FATAL'];
19
-
20
- let logsContainer = null;
21
- let logsCursor = null;
22
- let logsTimer = null;
23
- let logsAutoFollow = true;
24
- let logsLevelFilters = new Set(LEVEL_ORDER);
25
- let logsFilterText = '';
26
- let logsEntries = [];
27
-
28
- function createLogsUI() {
29
- const overlay = document.querySelector('body > .page-overlay');
30
- const frame = document.getElementById('page-overlay-frame');
31
-
32
- // Hide the iframe
33
- if (frame) frame.style.display = 'none';
34
-
35
- // Create or get native logs container
36
- let container = document.getElementById('native-logs-container');
37
- if (!container) {
38
- container = document.createElement('div');
39
- container.id = 'native-logs-container';
40
- container.innerHTML = `
41
- <div class="logs-toolbar">
42
- <div class="logs-filters">
43
- ${LEVEL_ORDER.map(l => `
44
- <label class="logs-level-toggle" data-level="${l}">
45
- <input type="checkbox" checked data-level="${l}">
46
- <span class="logs-level-badge" style="color:${LEVEL_COLORS[l]}">${l}</span>
47
- </label>
48
- `).join('')}
49
- </div>
50
- <div class="logs-search">
51
- <input type="text" id="logs-search-input" placeholder="Filter logs..." />
52
- </div>
53
- <div class="logs-actions">
54
- <label class="logs-auto-follow">
55
- <input type="checkbox" id="logs-auto-follow-cb" checked> Auto-follow
56
- </label>
57
- <button id="logs-export-btn" title="Export visible">Export</button>
58
- </div>
59
- </div>
60
- <div class="logs-scroll" id="logs-scroll">
61
- <div class="logs-entries" id="logs-entries"></div>
62
- </div>
63
- `;
64
- overlay.appendChild(container);
65
-
66
- // Wire up level filters
67
- container.querySelectorAll('.logs-level-toggle input').forEach(cb => {
68
- cb.addEventListener('change', () => {
69
- const level = cb.dataset.level;
70
- if (cb.checked) logsLevelFilters.add(level);
71
- else logsLevelFilters.delete(level);
72
- renderLogs();
73
- });
74
- });
75
-
76
- // Wire up search
77
- document.getElementById('logs-search-input').addEventListener('input', e => {
78
- logsFilterText = e.target.value.toLowerCase();
79
- renderLogs();
80
- });
81
-
82
- // Wire up auto-follow
83
- document.getElementById('logs-auto-follow-cb').addEventListener('change', e => {
84
- logsAutoFollow = e.target.checked;
85
- if (logsAutoFollow) scrollToBottom();
86
- });
87
-
88
- // Wire up export
89
- document.getElementById('logs-export-btn').addEventListener('click', () => {
90
- const visible = getVisibleEntries();
91
- const text = visible.map(e => e.raw).join('\n');
92
- const blob = new Blob([text], { type: 'text/plain' });
93
- const a = document.createElement('a');
94
- a.href = URL.createObjectURL(blob);
95
- a.download = `symi-logs-${new Date().toISOString().slice(0,19)}.txt`;
96
- a.click();
97
- });
98
- }
99
-
100
- logsContainer = container;
101
- container.style.display = 'flex';
102
- return container;
103
- }
104
-
105
- function destroyLogsUI() {
106
- if (logsTimer) { clearInterval(logsTimer); logsTimer = null; }
107
- const container = document.getElementById('native-logs-container');
108
- if (container) container.style.display = 'none';
109
- const frame = document.getElementById('page-overlay-frame');
110
- if (frame) frame.style.display = '';
111
- }
112
-
113
- function parseLogLine(line) {
114
- try {
115
- const obj = JSON.parse(line);
116
- const level = obj._meta?.logLevelName || 'INFO';
117
- const time = obj.time || obj._meta?.date || '';
118
- const msg = obj['1'] || obj.msg || obj.message || '';
119
- const sub = obj['0'] || '';
120
- return { level, time, msg, sub, raw: line, parsed: obj };
121
- } catch {
122
- // Plain text line
123
- return { level: 'INFO', time: '', msg: line, sub: '', raw: line, parsed: null };
124
- }
125
- }
126
-
127
- function getVisibleEntries() {
128
- return logsEntries.filter(e => {
129
- if (!logsLevelFilters.has(e.level)) return false;
130
- if (logsFilterText && !e.raw.toLowerCase().includes(logsFilterText)) return false;
131
- return true;
132
- });
133
- }
134
-
135
- function renderLogs() {
136
- const el = document.getElementById('logs-entries');
137
- if (!el) return;
138
-
139
- const visible = getVisibleEntries();
140
- const html = visible.map(e => {
141
- const color = LEVEL_COLORS[e.level] || '#999';
142
- const timeStr = e.time ? new Date(e.time).toLocaleTimeString() : '';
143
- const escapedMsg = escapeHtml(e.msg).substring(0, 500);
144
- const escapedSub = escapeHtml(e.sub);
145
- return `<div class="log-line">
146
- <span class="log-time">${timeStr}</span>
147
- <span class="log-level" style="color:${color}">${e.level.padEnd(5)}</span>
148
- ${escapedSub ? `<span class="log-sub">${escapedSub}</span>` : ''}
149
- <span class="log-msg">${escapedMsg}</span>
150
- </div>`;
151
- }).join('');
152
-
153
- el.innerHTML = html || '<div class="log-empty">No log entries.</div>';
154
-
155
- if (logsAutoFollow) scrollToBottom();
156
- }
157
-
158
- function scrollToBottom() {
159
- const scroll = document.getElementById('logs-scroll');
160
- if (scroll) scroll.scrollTop = scroll.scrollHeight;
161
- }
162
-
163
- function escapeHtml(s) {
164
- return s.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
165
- }
166
-
167
- async function fetchLogs() {
168
- console.log('[logs] fetchLogs called, gateway exists:', !!window.gateway, 'connected:', window.gateway?.connected);
169
- if (!window.gateway?.connected) return;
170
- try {
171
- const params = { limit: LOGS_LIMIT, maxBytes: LOGS_MAX_BYTES };
172
- if (logsCursor != null) params.cursor = logsCursor;
173
- console.log('[logs] calling rpc logs.tail...');
174
- const result = await window.gateway.rpc('logs.tail', params);
175
- console.log('[logs] rpc result:', result ? 'ok, lines=' + (result.lines?.length || 0) : 'null');
176
- if (!result) return;
177
-
178
- if (result.reset) {
179
- logsEntries = [];
180
- logsCursor = null;
181
- }
182
-
183
- if (result.lines && result.lines.length > 0) {
184
- const newEntries = result.lines.map(parseLogLine);
185
- logsEntries.push(...newEntries);
186
- // Cap at 2000 entries
187
- if (logsEntries.length > 2000) {
188
- logsEntries = logsEntries.slice(logsEntries.length - 2000);
189
- }
190
- renderLogs();
191
- }
192
-
193
- if (typeof result.cursor === 'number') {
194
- logsCursor = result.cursor;
195
- }
196
- } catch (err) {
197
- console.error('[logs] fetch error:', err);
198
- }
199
- }
200
-
201
- function startLogsPolling() {
202
- console.log('[logs] startLogsPolling, gateway:', !!window.gateway, 'connected:', window.gateway?.connected);
203
- // Initial fetch
204
- logsCursor = null;
205
- logsEntries = [];
206
-
207
- // If gateway isn't connected yet, wait for it
208
- if (!window.gateway?.connected) {
209
- console.log('[logs] gateway not connected, waiting...');
210
- const waitIv = setInterval(() => {
211
- console.log('[logs] waiting for gateway... connected:', window.gateway?.connected);
212
- if (window.gateway?.connected) {
213
- clearInterval(waitIv);
214
- console.log('[logs] gateway connected! starting fetch...');
215
- fetchLogs();
216
- if (logsTimer) clearInterval(logsTimer);
217
- logsTimer = setInterval(fetchLogs, LOGS_POLL_MS);
218
- }
219
- }, 500);
220
- setTimeout(() => clearInterval(waitIv), 30000);
221
- return;
222
- }
223
-
224
- fetchLogs();
225
- // Poll every few seconds
226
- if (logsTimer) clearInterval(logsTimer);
227
- logsTimer = setInterval(fetchLogs, LOGS_POLL_MS);
228
- }
229
-
230
- // Public API
231
- window.openNativeLogs = function() {
232
- createLogsUI();
233
- startLogsPolling();
234
- };
235
-
236
- window.closeNativeLogs = function() {
237
- destroyLogsUI();
238
- };
@@ -1,230 +0,0 @@
1
- // ── Command Menu ──────────────────────────────────────────────────────────────
2
-
3
- const menuOverlay = document.getElementById("cmd-overlay");
4
- const menuTrigger = document.getElementById("menu-trigger");
5
- const menuBackdrop = document.getElementById("cmd-backdrop");
6
-
7
- let menuIsOpen = false;
8
-
9
- function openMenu() {
10
- menuIsOpen = true;
11
- menuOverlay.classList.add("open");
12
- menuOverlay.removeAttribute("aria-hidden");
13
- menuTrigger.classList.add("menu-open");
14
- menuTrigger.setAttribute("aria-expanded", "true");
15
- document.addEventListener("keydown", onMenuKey);
16
- }
17
-
18
- function closeMenu() {
19
- menuIsOpen = false;
20
- menuOverlay.classList.remove("open");
21
- menuOverlay.setAttribute("aria-hidden", "true");
22
- menuTrigger.classList.remove("menu-open");
23
- menuTrigger.setAttribute("aria-expanded", "false");
24
- document.removeEventListener("keydown", onMenuKey);
25
- }
26
-
27
- function toggleMenu() {
28
- if (menuIsOpen) {
29
- closeMenu();
30
- } else {
31
- openMenu();
32
- }
33
- }
34
-
35
- function onMenuKey(e) {
36
- if (e.key === "Escape") {
37
- closeMenu();
38
- }
39
- }
40
-
41
- // ── Trigger & backdrop ────────────────────────────────────────────────────────
42
- menuTrigger.addEventListener("click", toggleMenu);
43
- menuBackdrop.addEventListener("click", closeMenu);
44
-
45
- // Keyboard shortcut: press M to open (when not focused on input)
46
- document.addEventListener("keydown", (e) => {
47
- if (menuIsOpen) {
48
- return;
49
- }
50
- if (e.key === "m" || e.key === "M") {
51
- if (
52
- document.activeElement.tagName === "INPUT" ||
53
- document.activeElement.tagName === "TEXTAREA"
54
- ) {
55
- return;
56
- }
57
- e.preventDefault();
58
- openMenu();
59
- }
60
- });
61
-
62
- // ── Page Overlay (native in-app navigation) ───────────────────────────────────
63
- // Use direct-child selectors to avoid matching duplicates inside chat messages
64
- function getPageOverlay() {
65
- return document.querySelector("body > .page-overlay");
66
- }
67
- function _getPageBackBtn() {
68
- return document.querySelector("body > .page-overlay #page-back-btn");
69
- }
70
- function getPageTitle() {
71
- return document.querySelector("body > .page-overlay #page-overlay-title");
72
- }
73
- function getPagePopoutBtn() {
74
- return document.querySelector("body > .page-overlay #page-popout-btn");
75
- }
76
- function getPageFrame() {
77
- return document.querySelector("body > .page-overlay #page-overlay-frame");
78
- }
79
-
80
- let overlayIsOpen = false;
81
-
82
- function openPageOverlay(name, standardUrl) {
83
- // Derive the proxy URL: strip 18789 origin, prefix with /standard, add ?embed=1
84
- // Also pass token + gatewayUrl via hash so the SPA auto-connects
85
- let proxyUrl;
86
- try {
87
- const parsed = new URL(standardUrl);
88
- proxyUrl = `/standard${parsed.pathname}${parsed.search ? parsed.search + "&embed=1" : "?embed=1"}`;
89
- } catch {
90
- proxyUrl = `/standard/?embed=1`;
91
- }
92
- // The SPA reads token and gatewayUrl from hash params → triggers auto-connect
93
- proxyUrl +=
94
- "#token=" +
95
- encodeURIComponent(window.__SYMI_EMBED_TOKEN || "") +
96
- "&gatewayUrl=" +
97
- encodeURIComponent("ws://127.0.0.1:3333");
98
-
99
- getPageTitle().textContent = name.toUpperCase();
100
- getPagePopoutBtn().href = standardUrl;
101
- getPageFrame().src = proxyUrl;
102
-
103
- overlayIsOpen = true;
104
- getPageOverlay().classList.add("open");
105
- getPageOverlay().setAttribute("aria-hidden", "false");
106
- document.addEventListener("keydown", onOverlayKey);
107
- }
108
-
109
- function closePageOverlay() {
110
- overlayIsOpen = false;
111
- // Clean up native settings panel if open
112
- if (window.closeNativeSettings) {
113
- window.closeNativeSettings();
114
- }
115
- getPageOverlay().classList.remove("open");
116
- getPageOverlay().setAttribute("aria-hidden", "true");
117
- // Restore iframe + popout button for next use
118
- getPageFrame().style.display = "";
119
- getPagePopoutBtn().style.display = "";
120
- // Delay clearing src so the close animation plays cleanly
121
- setTimeout(() => {
122
- if (!overlayIsOpen) {
123
- getPageFrame().src = "";
124
- }
125
- }, 300);
126
- document.removeEventListener("keydown", onOverlayKey);
127
- }
128
-
129
- function onOverlayKey(e) {
130
- if (e.key === "Escape") {
131
- closePageOverlay();
132
- }
133
- }
134
-
135
- document.querySelector("body > .page-overlay #page-back-btn")?.addEventListener("click", () => {
136
- // Go back to the menu instead of closing everything
137
- closePageOverlay();
138
- openMenu();
139
- });
140
-
141
- // ── Item routing ──────────────────────────────────────────────────────────────
142
- // Page display names (mapped from the menu item text)
143
- const PAGE_NAMES = {
144
- "/overview": "Overview",
145
- "/channels": "Channels",
146
- "/instances": "Instances",
147
- "/sessions": "Sessions",
148
- "/usage": "Usage",
149
- "/cron": "Cron Jobs",
150
- "/tasks": "Background Tasks",
151
- "/agents": "Agents",
152
- "/skills": "Skills",
153
- "/nodes": "Nodes",
154
- "/config": "Config",
155
- "/debug": "Debug",
156
- "/logs": "Logs",
157
- };
158
-
159
- // All internal pages rendered natively (no iframe)
160
- const NATIVE_PAGES = {
161
- "/overview": "overview",
162
- "/channels": "channels",
163
- "/instances": "instances",
164
- "/sessions": "sessions",
165
- "/usage": "usage",
166
- "/cron": "cron",
167
- "/tasks": "tasks",
168
- "/agents": "agents",
169
- "/skills": "skills",
170
- "/nodes": "nodes",
171
- "/config": "config",
172
- "/debug": "debug",
173
- "/logs": "logs",
174
- };
175
-
176
- function openNativePage(pageName, pageKey) {
177
- if (window.closeNativeSettings) {
178
- window.closeNativeSettings();
179
- }
180
- getPageTitle().textContent = pageName.toUpperCase();
181
- getPagePopoutBtn().style.display = "none";
182
- getPageFrame().style.display = "none";
183
- overlayIsOpen = true;
184
- getPageOverlay().classList.add("open");
185
- getPageOverlay().setAttribute("aria-hidden", "false");
186
- document.addEventListener("keydown", onOverlayKey);
187
- if (window.openNativeSettings) {
188
- window.openNativeSettings(pageKey);
189
- }
190
- }
191
-
192
- document.querySelectorAll(".cmd-item[data-href]").forEach((item) => {
193
- item.addEventListener("click", (e) => {
194
- e.preventDefault();
195
- const href = item.dataset.href;
196
-
197
- if (href === "#chat") {
198
- closeMenu();
199
- if (window.closeNativeSettings) {
200
- window.closeNativeSettings();
201
- }
202
- closePageOverlay();
203
- return;
204
- }
205
-
206
- // Internal pages rendered natively
207
- if (href.includes("127.0.0.1:18789")) {
208
- let pathname = "/";
209
- try {
210
- pathname = new URL(href).pathname;
211
- } catch {}
212
-
213
- const pageKey = NATIVE_PAGES[pathname];
214
- if (pageKey) {
215
- const pageName = PAGE_NAMES[pathname] ?? "Page";
216
- closeMenu();
217
- openNativePage(pageName, pageKey);
218
- return;
219
- }
220
- }
221
-
222
- // External links open in new tab
223
- window.open(href, "_blank", "noopener");
224
- closeMenu();
225
- });
226
- });
227
-
228
- // Expose for external use (e.g., if other modules need to close the overlay)
229
- window.openPageOverlay = openPageOverlay;
230
- window.closePageOverlay = closePageOverlay;
@@ -1,66 +0,0 @@
1
- // ── Command Menu ──────────────────────────────────────────────────────────────
2
-
3
- const menuOverlay = document.getElementById('cmd-overlay');
4
- const menuTrigger = document.getElementById('menu-trigger');
5
- const menuBackdrop = document.getElementById('cmd-backdrop');
6
-
7
- let menuIsOpen = false;
8
-
9
- function openMenu() {
10
- menuIsOpen = true;
11
- menuOverlay.classList.add('open');
12
- menuOverlay.removeAttribute('aria-hidden');
13
- menuTrigger.classList.add('menu-open');
14
- menuTrigger.setAttribute('aria-expanded', 'true');
15
- document.addEventListener('keydown', onMenuKey);
16
- }
17
-
18
- function closeMenu() {
19
- menuIsOpen = false;
20
- menuOverlay.classList.remove('open');
21
- menuOverlay.setAttribute('aria-hidden', 'true');
22
- menuTrigger.classList.remove('menu-open');
23
- menuTrigger.setAttribute('aria-expanded', 'false');
24
- document.removeEventListener('keydown', onMenuKey);
25
- }
26
-
27
- function toggleMenu() {
28
- menuIsOpen ? closeMenu() : openMenu();
29
- }
30
-
31
- function onMenuKey(e) {
32
- if (e.key === 'Escape') closeMenu();
33
- }
34
-
35
- // ── Trigger & backdrop ────────────────────────────────────────────────────────
36
- menuTrigger.addEventListener('click', toggleMenu);
37
- menuBackdrop.addEventListener('click', closeMenu);
38
-
39
- // Keyboard shortcut: press M to open (when not focused on input)
40
- document.addEventListener('keydown', e => {
41
- if (menuIsOpen) return;
42
- if (e.key === 'm' || e.key === 'M') {
43
- if (document.activeElement.tagName === 'INPUT' ||
44
- document.activeElement.tagName === 'TEXTAREA') return;
45
- e.preventDefault();
46
- openMenu();
47
- }
48
- });
49
-
50
- // ── Item routing ──────────────────────────────────────────────────────────────
51
- document.querySelectorAll('.cmd-item[data-href]').forEach(item => {
52
- item.addEventListener('click', e => {
53
- e.preventDefault();
54
- const href = item.dataset.href;
55
-
56
- if (href === '#chat') {
57
- // Already on the chat — just close the menu
58
- closeMenu();
59
- return;
60
- }
61
-
62
- // All other items: open in new tab (preserves new UI in current tab)
63
- window.open(href, '_blank', 'noopener');
64
- closeMenu();
65
- });
66
- });
@@ -1,53 +0,0 @@
1
- // ── Live metrics via /api/metrics (served by Node.js app layer) ───────
2
-
3
- function setBar(barId, valId, pct, label) {
4
- const bar = document.getElementById(barId);
5
- const val = document.getElementById(valId);
6
- if (bar) {
7
- bar.style.width = Math.min(pct, 100) + "%";
8
- }
9
- if (val && label !== undefined) {
10
- val.textContent = label;
11
- }
12
- }
13
-
14
- async function updateMetrics() {
15
- try {
16
- const res = await fetch("/api/metrics");
17
- const data = await res.json();
18
-
19
- setBar("cpu-bar", "cpu-val", data.cpu, data.cpu + "%");
20
- setBar("ram-bar", "ram-val", data.memPct, data.memUsedGB + "G");
21
- setBar("gpu-bar", "gpu-val", 5, "5%"); // GPU live data future enhancement
22
- setBar("disk-bar", "disk-val", 5, "5%");
23
-
24
- const uptimeEl = document.getElementById("uptime");
25
- if (uptimeEl) {
26
- uptimeEl.textContent = data.uptime;
27
- }
28
- } catch {
29
- // Server not ready yet — no-op
30
- }
31
- }
32
-
33
- function updateUptime() {
34
- // Static uptime from system — weeks:days:hours
35
- const el = document.getElementById("uptime");
36
- if (el) {
37
- el.textContent = "2w 3d 21h";
38
- }
39
- }
40
-
41
- function updateSubagents() {
42
- const el = document.getElementById("subagent-count");
43
- if (el) {
44
- el.textContent = "0 active";
45
- }
46
- }
47
-
48
- // Initial + interval updates
49
- void updateMetrics();
50
- updateUptime();
51
- updateSubagents();
52
-
53
- setInterval(updateMetrics, 2000);