@symerian/symi 3.5.9 → 3.5.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (78) hide show
  1. package/dist/{agent-7Xrh1XVG.js → agent-CSOQs4VQ.js} +2 -2
  2. package/dist/{audit-DlO49y-U.js → audit-BPhWpe_6.js} +5 -5
  3. package/dist/{auth-choice-BPN4vEBk.js → auth-choice-9XyVfAyH.js} +2 -2
  4. package/dist/{browser-cli-D_DjThgn.js → browser-cli-BxDx4t2-.js} +3 -3
  5. package/dist/build-info.json +3 -3
  6. package/dist/{call-C386w5E5.js → call-BC1HAVqW.js} +1 -1
  7. package/dist/canvas-host/a2ui/.bundle.hash +1 -1
  8. package/dist/{channel-options-VQMByP4c.js → channel-options-Cy9aQzx9.js} +1 -1
  9. package/dist/{channels-cli-BzwYp-BP.js → channels-cli-R0UMOKTA.js} +17 -17
  10. package/dist/{chrome-suE09Iax.js → chrome-DJChpTwP.js} +7 -7
  11. package/dist/{cli-mZdo-h84.js → cli-BnLVnWOZ.js} +14 -14
  12. package/dist/{client-CJeYdM6G.js → client-BfnNfATE.js} +3 -3
  13. package/dist/{completion-cli-Dz6vTqBm.js → completion-cli-kGAGMr-I.js} +1 -1
  14. package/dist/{config-cli-BdPn_06D.js → config-cli-BAognmPE.js} +1 -1
  15. package/dist/{configure-CxjXughP.js → configure-CJp0NIbm.js} +6 -6
  16. package/dist/{control-service-CCto6i0v.js → control-service-DOGU9T2P.js} +3 -3
  17. package/dist/control-ui/index.html +74 -74
  18. package/dist/{cron-cli-CDUzTSlx.js → cron-cli-DoXlzwQ0.js} +3 -3
  19. package/dist/{daemon-cli-D93uCvD0.js → daemon-cli-CRGNFCN7.js} +2 -2
  20. package/dist/{devices-cli-18molb2z.js → devices-cli-DAG-TaOo.js} +2 -2
  21. package/dist/{doctor-completion-C9sFv9qq.js → doctor-completion-CmKOsLDy.js} +1 -1
  22. package/dist/{exec-approvals-cli-De0WMHXi.js → exec-approvals-cli-BuHNELGd.js} +4 -4
  23. package/dist/{gateway-cli-D-Rztk2z.js → gateway-cli-zh8P3vbG.js} +25 -25
  24. package/dist/{gateway-rpc-Cwi5kJzl.js → gateway-rpc-st8ffJBC.js} +1 -1
  25. package/dist/{glass-ui-ws-gmSoTQpl.js → glass-ui-ws-QqYp-Uof.js} +21 -21
  26. package/dist/{health-ksdFZpDU.js → health-BIwN5H6b.js} +1 -1
  27. package/dist/{hooks-cli-B_eznWUl.js → hooks-cli-CJ0OoLFk.js} +15 -15
  28. package/dist/index.js +18 -18
  29. package/dist/{logs-cli-DVvGi5J7.js → logs-cli-D8A5dpnm.js} +3 -3
  30. package/dist/{manager-5k1CRLn-.js → manager-807ZlqEf.js} +1 -1
  31. package/dist/{memory-DTDeG3u8.js → memory-B2hM774N.js} +2 -2
  32. package/dist/{memory-cli-Bv8Rcg5s.js → memory-cli-CPebu_bx.js} +2 -2
  33. package/dist/{models-cli-BXzUBQYo.js → models-cli-B_U9E8SV.js} +16 -16
  34. package/dist/{node-cli-CtliTCQh.js → node-cli-CFIBFPOd.js} +6 -6
  35. package/dist/{nodes-cli-C92vI9eX.js → nodes-cli-DlkO0Hyw.js} +3 -3
  36. package/dist/{onboard-DeJaaNHV.js → onboard-CWNtW-LS.js} +3 -3
  37. package/dist/{onboard-channels-3AkHwrP_.js → onboard-channels-DPzbq3iB.js} +1 -1
  38. package/dist/{onboard-helpers-mW55B30K.js → onboard-helpers-Bf1LB5fd.js} +1 -1
  39. package/dist/{onboard-remote-BxtpQ74l.js → onboard-remote-B6Ox0wMi.js} +1 -1
  40. package/dist/{onboard-skills-BaRS2GUY.js → onboard-skills-D-ppyTcQ.js} +1 -1
  41. package/dist/{onboarding-Bm0DgGhb.js → onboarding-Cw8abFVd.js} +7 -7
  42. package/dist/{onboarding.finalize-DQmEXf6p.js → onboarding.finalize-C50T8L4e.js} +13 -13
  43. package/dist/{onboarding.gateway-config-DNGUJthU.js → onboarding.gateway-config-DJ1YAlBD.js} +3 -3
  44. package/dist/{pi-embedded-helpers-B0Vz7hRL.js → pi-embedded-helpers-CDzBxa-P.js} +1 -1
  45. package/dist/{pi-tools.policy-CYlUAnkU.js → pi-tools.policy-WaLKhqJQ.js} +1 -1
  46. package/dist/{plugin-registry-CP_RBN-f.js → plugin-registry-BFyeIJdT.js} +1 -1
  47. package/dist/plugin-sdk/index.js +6 -6
  48. package/dist/{plugins-cli-tYEFfttj.js → plugins-cli-BTdd7aE9.js} +15 -15
  49. package/dist/{program-context-BiDn7yCz.js → program-context-CV_ibEw9.js} +30 -30
  50. package/dist/{prompt-select-styled-BhjycLZw.js → prompt-select-styled-G6u6Q8v9.js} +8 -8
  51. package/dist/{provider-auth-helpers-Dhd06_t2.js → provider-auth-helpers-DAtMFGrU.js} +1 -1
  52. package/dist/{push-apns-BZWInkPg.js → push-apns--j8PeFrK.js} +1 -1
  53. package/dist/{pw-ai-DMvtunBE.js → pw-ai-DQZa9DUQ.js} +1 -1
  54. package/dist/{register.agent-D2CwHq-q.js → register.agent-muhvyTMD.js} +19 -19
  55. package/dist/{register.configure-DxT5PQFo.js → register.configure-DUaVY9dt.js} +22 -22
  56. package/dist/{register.maintenance-6vebxogW.js → register.maintenance-BrNuk6hl.js} +20 -20
  57. package/dist/{register.message-DxqvQsSN.js → register.message-DZG9UElS.js} +15 -15
  58. package/dist/{register.onboard-CuHwcxsE.js → register.onboard-C-5RaI3-.js} +6 -6
  59. package/dist/{register.setup-b8h71HJ7.js → register.setup-D87mlpLA.js} +6 -6
  60. package/dist/{register.status-health-sessions-Sn1WS-fC.js → register.status-health-sessions-ZYT6lFhO.js} +13 -13
  61. package/dist/{routes-DmyY3P7a.js → routes-DIyAmLYR.js} +2 -2
  62. package/dist/{rpc-Batd5KYw.js → rpc-DZpJ-mGE.js} +1 -1
  63. package/dist/{sandbox-H5Lewbd2.js → sandbox-61-kshSF.js} +3 -3
  64. package/dist/{sandbox-cli-BUrDdb-H.js → sandbox-cli-D9v0jhBb.js} +4 -4
  65. package/dist/{security-cli-CTTidNLu.js → security-cli-CAdCbDUS.js} +8 -8
  66. package/dist/{server-context-DVX-C1f0.js → server-context-SbbjNkPL.js} +4 -4
  67. package/dist/{server-methods-DKW7md4I.js → server-methods-DMPwNvoz.js} +13 -13
  68. package/dist/{server-node-events-phrERc91.js → server-node-events-k7h7NWLL.js} +16 -16
  69. package/dist/{status-XrKWGanJ.js → status-BU-hn3iH.js} +1 -1
  70. package/dist/{status-B2VahFlJ.js → status-D3h1mSLx.js} +5 -5
  71. package/dist/{synthesis-D9Lu46sl.js → synthesis-DFNyev83.js} +14 -14
  72. package/dist/{system-cli-CPEHtbdA.js → system-cli-BCAd92UF.js} +3 -3
  73. package/dist/{tui-D4Al5sge.js → tui-ROL_b9BF.js} +3 -3
  74. package/dist/{tui-cli-Z50zaJvB.js → tui-cli-C6Q0KKvj.js} +8 -8
  75. package/dist/{unified-runner-DpZ49TWj.js → unified-runner-D9LZYzyF.js} +13 -13
  76. package/dist/{update-cli-DP18R4I_.js → update-cli-Du-NLjgh.js} +21 -21
  77. package/dist/{with-timeout-GyVVFtnd.js → with-timeout-GbJ1Yzsh.js} +1 -1
  78. package/package.json +1 -1
@@ -1,4 +1,4 @@
1
- import { $t as emitAgentEvent, A as resolveSessionDeliveryTarget, An as resolveFailoverStatus, Dn as runWithModelFallback, It as clearSessionAuthProfileOverride, Kt as resolveAgentTimeoutMs, On as FailoverError, Qt as clearAgentRunContext, Xt as AGENT_LANE_SUBAGENT, Yt as AGENT_LANE_NESTED, _n as resolveRunWorkspaceDir, bt as applyModelOverrideToSessionEntry, ft as getProcessSupervisor, gn as redactRunIdentifier, hn as resolveBootstrapContextForRun, ht as resolveSendPolicy, k as resolveOutboundTarget, mn as makeBootstrapWarn, nn as registerAgentRunContext, pt as detectRuntimeShell, rn as buildAgentSystemPrompt, t as runAgentTurn, un as resolveSymiDocsPath, ut as buildSystemPromptParams, xt as applyVerboseOverride } from "./unified-runner-DpZ49TWj.js";
1
+ import { $t as emitAgentEvent, A as resolveSessionDeliveryTarget, An as resolveFailoverStatus, Dn as runWithModelFallback, It as clearSessionAuthProfileOverride, Kt as resolveAgentTimeoutMs, On as FailoverError, Qt as clearAgentRunContext, Xt as AGENT_LANE_SUBAGENT, Yt as AGENT_LANE_NESTED, _n as resolveRunWorkspaceDir, bt as applyModelOverrideToSessionEntry, ft as getProcessSupervisor, gn as redactRunIdentifier, hn as resolveBootstrapContextForRun, ht as resolveSendPolicy, k as resolveOutboundTarget, mn as makeBootstrapWarn, nn as registerAgentRunContext, pt as detectRuntimeShell, rn as buildAgentSystemPrompt, t as runAgentTurn, un as resolveSymiDocsPath, ut as buildSystemPromptParams, xt as applyVerboseOverride } from "./unified-runner-D9LZYzyF.js";
2
2
  import { D as shouldLogVerbose, r as DEFAULT_CHAT_CHANNEL } from "./registry-Sbac4a4z.js";
3
3
  import { u as isRecord } from "./utils-CTPsqyE_.js";
4
4
  import { f as defaultRuntime, t as createSubsystemLogger } from "./subsystem-CHbO_DkH.js";
@@ -7,7 +7,7 @@ import { t as formatCliCommand } from "./command-format-BzjsXBTi.js";
7
7
  import { c as resolveAgentIdFromSessionKey, o as normalizeAgentId, s as normalizeMainKey } from "./session-key-DUSb7CCb.js";
8
8
  import { C as ensureAgentWorkspace, c as resolveAgentWorkspaceDir, d as resolveSessionAgentId, f as resolveSessionAgentIds, i as resolveAgentDir, n as listAgentIds, o as resolveAgentModelPrimary, s as resolveAgentSkillsFilter, u as resolveEffectiveModelFallbacks } from "./agent-scope-DOrZjOnW.js";
9
9
  import { C as DEFAULT_MODEL, S as DEFAULT_CONTEXT_TOKENS, b as resolveThinkingDefault, c as modelKey, h as resolveDefaultModelForAgent, l as normalizeModelRef, m as resolveConfiguredModelRef, s as isCliProvider, t as buildAllowedModelSet, u as normalizeProviderId, w as DEFAULT_PROVIDER } from "./model-selection-7wdmO-Iw.js";
10
- import { D as isFailoverErrorMessage, g as classifyFailoverReason } from "./pi-embedded-helpers-B0Vz7hRL.js";
10
+ import { D as isFailoverErrorMessage, g as classifyFailoverReason } from "./pi-embedded-helpers-CDzBxa-P.js";
11
11
  import { i as loadConfig } from "./config-B4jkreCN.js";
12
12
  import { t as isTruthyEnvValue } from "./env-BRnPI9sO.js";
13
13
  import { r as buildWorkspaceSkillSnapshot } from "./skills-BwDmcZdt.js";
@@ -6,20 +6,20 @@ import { l as resolveDefaultAgentId } from "./agent-scope-DOrZjOnW.js";
6
6
  import { D as INCLUDE_KEY, O as MAX_INCLUDE_DEPTH, r as createConfigIO } from "./config-B4jkreCN.js";
7
7
  import { u as normalizePluginsConfig } from "./manifest-registry-D1MLZEjS.js";
8
8
  import { i as isPathInside, n as MANIFEST_KEY, r as extensionUsesSkippedScannerPath } from "./legacy-names-BQ9vKISY.js";
9
- import { S as resolveToolProfilePolicy, f as resolveSandboxConfigForAgent, k as SANDBOX_BROWSER_SECURITY_HASH_EPOCH, l as execDockerRaw, m as resolveSandboxToolPolicyForAgent, u as getBlockedBindReason } from "./sandbox-H5Lewbd2.js";
9
+ import { S as resolveToolProfilePolicy, f as resolveSandboxConfigForAgent, k as SANDBOX_BROWSER_SECURITY_HASH_EPOCH, l as execDockerRaw, m as resolveSandboxToolPolicyForAgent, u as getBlockedBindReason } from "./sandbox-61-kshSF.js";
10
10
  import { a as resolveGatewayAuth } from "./auth-Bkx-QuRN.js";
11
- import { a as resolveProfile, i as resolveBrowserConfig, m as resolveBrowserControlAuth } from "./server-context-DVX-C1f0.js";
11
+ import { a as resolveProfile, i as resolveBrowserConfig, m as resolveBrowserControlAuth } from "./server-context-SbbjNkPL.js";
12
12
  import { i as loadWorkspaceSkillEntries } from "./skills-BwDmcZdt.js";
13
13
  import { n as formatErrorMessage } from "./errors-bI7Tdx75.js";
14
14
  import { c as normalizeStringEntries } from "./dock-hF45sewN.js";
15
15
  import { h as GATEWAY_CLIENT_NAMES, m as GATEWAY_CLIENT_MODES } from "./message-channel-DgjXWzf-.js";
16
16
  import { n as listChannelPlugins } from "./plugins-CF5skkHh.js";
17
17
  import { i as resolveNativeSkillsEnabled, r as resolveNativeCommandsEnabled } from "./commands-DUzLGgEZ.js";
18
- import { t as GatewayClient } from "./client-CJeYdM6G.js";
19
- import { c as READ_SCOPE, t as buildGatewayConnectionDetails } from "./call-C386w5E5.js";
18
+ import { t as GatewayClient } from "./client-BfnNfATE.js";
19
+ import { c as READ_SCOPE, t as buildGatewayConnectionDetails } from "./call-BC1HAVqW.js";
20
20
  import { t as listAgentWorkspaceDirs } from "./workspace-dirs-jKFQf7of.js";
21
21
  import { i as readChannelAllowFromStore } from "./pairing-store-BNhJOnWn.js";
22
- import { n as isToolAllowedByPolicies, o as pickSandboxToolPolicy } from "./pi-tools.policy-CYlUAnkU.js";
22
+ import { n as isToolAllowedByPolicies, o as pickSandboxToolPolicy } from "./pi-tools.policy-WaLKhqJQ.js";
23
23
  import { t as resolveChannelDefaultAccountId } from "./helpers-BnXDQL2q.js";
24
24
  import { t as scanDirectoryWithSummary } from "./skill-scanner-D5p8L-xO.js";
25
25
  import { t as resolveDmAllowState } from "./dm-policy-shared-BUwZ6Ajx.js";
@@ -8,9 +8,9 @@ import { n as getCustomProviderApiKey, o as resolveEnvApiKey } from "./model-aut
8
8
  import { D as CLOUDFLARE_AI_GATEWAY_DEFAULT_MODEL_REF, E as isHuggingfacePolicyLocked, T as discoverHuggingfaceModels, _ as SYNTHETIC_DEFAULT_MODEL_REF, u as VENICE_DEFAULT_MODEL_REF } from "./models-config-B5Xxy-c-.js";
9
9
  import { n as loadModelCatalog } from "./model-catalog-IWi6-nY9.js";
10
10
  import { t as enablePluginInConfig } from "./enable-BI6rQ1Fb.js";
11
- import { f as openUrl } from "./onboard-helpers-mW55B30K.js";
11
+ import { f as openUrl } from "./onboard-helpers-Bf1LB5fd.js";
12
12
  import { $ as setHuggingfaceApiKey, A as applyXaiConfig, B as applyVercelAiGatewayConfig, C as applyQianfanProviderConfig, D as applyTogetherProviderConfig, E as applyTogetherConfig, F as applyZaiProviderConfig, G as OPENROUTER_DEFAULT_MODEL_REF, H as applyAgentDefaultModelPrimary, I as applyLitellmConfig, J as XIAOMI_DEFAULT_MODEL_REF, K as TOGETHER_DEFAULT_MODEL_REF, L as applyLitellmProviderConfig, M as applyXiaomiConfig, N as applyXiaomiProviderConfig, O as applyVeniceConfig, P as applyZaiConfig, Q as setGeminiApiKey, R as applyCloudflareAiGatewayConfig, S as applyQianfanConfig, T as applySyntheticProviderConfig, U as HUGGINGFACE_DEFAULT_MODEL_REF, V as applyVercelAiGatewayProviderConfig, W as LITELLM_DEFAULT_MODEL_REF, X as setAnthropicApiKey, Y as ZAI_DEFAULT_MODEL_REF, Z as setCloudflareAiGatewayConfig, _ as applyMoonshotConfigCn, _t as QIANFAN_DEFAULT_MODEL_REF, a as applyMinimaxApiConfig, at as setOpenrouterApiKey, b as applyOpenrouterConfig, c as applyMinimaxApiProviderConfigCn, ct as setTogetherApiKey, d as applyAuthProfileConfig, dt as setXaiApiKey, et as setKimiCodingApiKey, ft as setXiaomiApiKey, g as applyMoonshotConfig, gt as MOONSHOT_DEFAULT_MODEL_REF, h as applyKimiCodeProviderConfig, ht as KIMI_CODING_MODEL_REF, i as applyOpencodeZenProviderConfig, it as setOpencodeZenApiKey, j as applyXaiProviderConfig, k as applyVeniceProviderConfig, l as applyMinimaxConfig, lt as setVeniceApiKey, m as applyKimiCodeConfig, mt as writeOAuthCredentials, n as validateAnthropicSetupToken, nt as setMinimaxApiKey, o as applyMinimaxApiConfigCn, ot as setQianfanApiKey, p as applyHuggingfaceProviderConfig, pt as setZaiApiKey, q as VERCEL_AI_GATEWAY_DEFAULT_MODEL_REF, r as applyOpencodeZenConfig, rt as setMoonshotApiKey, s as applyMinimaxApiProviderConfig, st as setSyntheticApiKey, t as buildTokenProfileId, tt as setLitellmApiKey, u as applyMinimaxProviderConfig, ut as setVercelAiGatewayApiKey, v as applyMoonshotProviderConfig, vt as XAI_DEFAULT_MODEL_REF, w as applySyntheticConfig, x as applyOpenrouterProviderConfig, y as applyMoonshotProviderConfigCn, z as applyCloudflareAiGatewayProviderConfig } from "./auth-token-DyhvQgv4.js";
13
- import { a as createVpsAwareOAuthHandlers, c as githubCopilotLoginCommand, i as resolveProviderMatch, n as mergeConfigPatch, o as isRemoteEnvironment, r as pickAuthMethod, s as resolvePluginProviders, t as applyDefaultModel } from "./provider-auth-helpers-Dhd06_t2.js";
13
+ import { a as createVpsAwareOAuthHandlers, c as githubCopilotLoginCommand, i as resolveProviderMatch, n as mergeConfigPatch, o as isRemoteEnvironment, r as pickAuthMethod, s as resolvePluginProviders, t as applyDefaultModel } from "./provider-auth-helpers-DAtMFGrU.js";
14
14
  import { a as detectZaiEndpoint, c as ensureModelAllowlistEntry, i as upsertSharedEnvVar, n as applyOpenAIConfig, o as GOOGLE_GEMINI_DEFAULT_MODEL, r as applyOpenAIProviderConfig, s as applyGoogleGeminiModelDefault, t as OPENAI_DEFAULT_MODEL } from "./openai-model-default-CKfNKTZD.js";
15
15
  import { c as OPENAI_CODEX_DEFAULT_MODEL, l as applyOpenAICodexModelDefault, r as applyPrimaryModel, s as promptAndConfigureVllm } from "./model-picker-DN-co6Oy.js";
16
16
  import { randomBytes } from "node:crypto";
@@ -17,14 +17,14 @@ import "./fs-safe-BdejYjW8.js";
17
17
  import { i as resolveExistingPathsWithinRoot, r as DEFAULT_UPLOAD_DIR } from "./paths-DObzwe08.js";
18
18
  import { t as movePathToTrash } from "./trash-_YhavPQI.js";
19
19
  import "./message-channel-DgjXWzf-.js";
20
- import "./client-CJeYdM6G.js";
21
- import "./call-C386w5E5.js";
20
+ import "./client-BfnNfATE.js";
21
+ import "./call-BC1HAVqW.js";
22
22
  import "./pairing-token-Dcy37-4s.js";
23
23
  import { t as formatDocsLink } from "./links-CQZxjjCO.js";
24
24
  import { n as runCommandWithRuntime } from "./cli-utils-CbnnSB38.js";
25
25
  import { t as formatHelpExamples } from "./help-format-8IYCRvx1.js";
26
26
  import "./progress-DQTvTiEg.js";
27
- import { n as callGatewayFromCli, t as addGatewayClientOptions } from "./gateway-rpc-Cwi5kJzl.js";
27
+ import { n as callGatewayFromCli, t as addGatewayClientOptions } from "./gateway-rpc-st8ffJBC.js";
28
28
  import { t as copyToClipboard } from "./clipboard-BSTxQ2tO.js";
29
29
  import { n as inheritOptionFromParent } from "./command-options-DgcCGXMQ.js";
30
30
  import { fileURLToPath } from "node:url";
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "3.5.9",
3
- "commit": "c4e5e3b74088a4342bf4dbe3fcf1336f4a6f43f1",
4
- "builtAt": "2026-05-06T01:44:27.883Z"
2
+ "version": "3.5.10",
3
+ "commit": "1021ecffaafbb24825e33ca00c735975047fda27",
4
+ "builtAt": "2026-05-06T02:18:56.575Z"
5
5
  }
@@ -3,7 +3,7 @@ import { _ as shortenHomeInString, h as resolveUserPath, s as ensureDir, t as CO
3
3
  import { i as loadConfig } from "./config-B4jkreCN.js";
4
4
  import { i as isSecureWebSocketUrl } from "./ws-C7Ktmt-R.js";
5
5
  import { h as GATEWAY_CLIENT_NAMES, m as GATEWAY_CLIENT_MODES } from "./message-channel-DgjXWzf-.js";
6
- import { Rt as PROTOCOL_VERSION, an as loadOrCreateDeviceIdentity, rn as normalizeFingerprint, t as GatewayClient } from "./client-CJeYdM6G.js";
6
+ import { Rt as PROTOCOL_VERSION, an as loadOrCreateDeviceIdentity, rn as normalizeFingerprint, t as GatewayClient } from "./client-BfnNfATE.js";
7
7
  import { X509Certificate, randomUUID } from "node:crypto";
8
8
  import path from "node:path";
9
9
  import { promisify } from "node:util";
@@ -1 +1 @@
1
- 47bff8a976c20921b6688051cea0fc7238269b210e25ee9f32f35f47d8db5ba4
1
+ c8636ddaabd195ba70ad6583bbcb27af46c55b67388c5f96e72b499ed02e0e61
@@ -2,7 +2,7 @@ import { n as CHAT_CHANNEL_ORDER } from "./registry-Sbac4a4z.js";
2
2
  import { t as isTruthyEnvValue } from "./env-BRnPI9sO.js";
3
3
  import { n as listChannelPlugins } from "./plugins-CF5skkHh.js";
4
4
  import { r as listChannelPluginCatalogEntries } from "./catalog-BnLcGVie.js";
5
- import { t as ensurePluginRegistryLoaded } from "./plugin-registry-CP_RBN-f.js";
5
+ import { t as ensurePluginRegistryLoaded } from "./plugin-registry-BFyeIJdT.js";
6
6
 
7
7
  //#region src/cli/channel-options.ts
8
8
  function dedupe(values) {
@@ -1,4 +1,4 @@
1
- import "./unified-runner-DpZ49TWj.js";
1
+ import "./unified-runner-D9LZYzyF.js";
2
2
  import { E as setVerbose, P as getResolvedLoggerSettings, b as danger, j as theme, r as DEFAULT_CHAT_CHANNEL } from "./registry-Sbac4a4z.js";
3
3
  import "./paths-By0XjHBk.js";
4
4
  import { u as isRecord } from "./utils-CTPsqyE_.js";
@@ -11,20 +11,20 @@ import { c as resolveAgentWorkspaceDir, l as resolveDefaultAgentId } from "./age
11
11
  import "./model-selection-7wdmO-Iw.js";
12
12
  import "./file-lock-BVUYnlQv.js";
13
13
  import "./agent-paths-BbZSGrUA.js";
14
- import "./pi-embedded-helpers-B0Vz7hRL.js";
14
+ import "./pi-embedded-helpers-CDzBxa-P.js";
15
15
  import { i as loadConfig, l as writeConfigFile, o as readConfigFileSnapshot } from "./config-B4jkreCN.js";
16
16
  import "./boolean-CbZoNRMn.js";
17
17
  import "./env-BRnPI9sO.js";
18
18
  import "./shell-env-Dc3iU7HK.js";
19
19
  import "./manifest-registry-D1MLZEjS.js";
20
- import "./sandbox-H5Lewbd2.js";
21
- import "./chrome-suE09Iax.js";
20
+ import "./sandbox-61-kshSF.js";
21
+ import "./chrome-DJChpTwP.js";
22
22
  import "./tailscale-DpKBMIvx.js";
23
23
  import "./auth-Bkx-QuRN.js";
24
- import "./server-context-DVX-C1f0.js";
24
+ import "./server-context-SbbjNkPL.js";
25
25
  import "./frontmatter-B_jqcova.js";
26
26
  import "./skills-BwDmcZdt.js";
27
- import "./routes-DmyY3P7a.js";
27
+ import "./routes-DIyAmLYR.js";
28
28
  import "./redact-B3O-RBO1.js";
29
29
  import "./errors-bI7Tdx75.js";
30
30
  import "./fs-safe-BdejYjW8.js";
@@ -50,10 +50,10 @@ import "./models-config-B5Xxy-c-.js";
50
50
  import "./pi-auth-json-Db8XJVGL.js";
51
51
  import "./session-cost-usage-D3mgssM_.js";
52
52
  import { _ as loadProviderUsageSummary, v as formatUsageReportLines } from "./session-utils-Cs1jlD-q.js";
53
- import "./with-timeout-GyVVFtnd.js";
53
+ import "./with-timeout-GbJ1Yzsh.js";
54
54
  import "./reply-prefix-BFNeXT65.js";
55
- import "./memory-DTDeG3u8.js";
56
- import "./manager-5k1CRLn-.js";
55
+ import "./memory-B2hM774N.js";
56
+ import "./manager-807ZlqEf.js";
57
57
  import "./sqlite-Cod7C5ba.js";
58
58
  import "./chunk-BxfKjCUx.js";
59
59
  import "./markdown-tables-CS1Tvb3z.js";
@@ -61,8 +61,8 @@ import "./fetch-guard-JHxT9355.js";
61
61
  import "./local-roots-CgDCgCuM.js";
62
62
  import "./commands-DUzLGgEZ.js";
63
63
  import "./commands-registry-Ca5hh7nh.js";
64
- import "./client-CJeYdM6G.js";
65
- import { n as callGateway } from "./call-C386w5E5.js";
64
+ import "./client-BfnNfATE.js";
65
+ import { n as callGateway } from "./call-BC1HAVqW.js";
66
66
  import "./pairing-token-Dcy37-4s.js";
67
67
  import "./tool-display-DFOL6UQ9.js";
68
68
  import { n as formatTimeAgo } from "./format-relative-D4GQsWlP.js";
@@ -75,7 +75,7 @@ import "./pairing-store-BNhJOnWn.js";
75
75
  import "./exec-approvals-DioSaIeH.js";
76
76
  import "./nodes-screen-De9ma6e1.js";
77
77
  import "./breakdown-B_Dhhm3K.js";
78
- import "./control-service-CCto6i0v.js";
78
+ import "./control-service-DOGU9T2P.js";
79
79
  import "./stagger-DQs772BN.js";
80
80
  import { n as resolveMessageChannelSelection } from "./channel-selection-DjrS6oiz.js";
81
81
  import "./delivery-queue-duM0RT18.js";
@@ -85,14 +85,14 @@ import { t as formatDocsLink } from "./links-CQZxjjCO.js";
85
85
  import { n as runCommandWithRuntime } from "./cli-utils-CbnnSB38.js";
86
86
  import { t as formatHelpExamples } from "./help-format-8IYCRvx1.js";
87
87
  import { n as withProgress } from "./progress-DQTvTiEg.js";
88
- import "./memory-cli-Bv8Rcg5s.js";
88
+ import "./memory-cli-CPebu_bx.js";
89
89
  import "./logging-CLWZ3KQI.js";
90
90
  import "./replies-C5CBlnFS.js";
91
- import "./pi-tools.policy-CYlUAnkU.js";
91
+ import "./pi-tools.policy-WaLKhqJQ.js";
92
92
  import "./model-BMFj7NXy.js";
93
93
  import { r as listChannelPluginCatalogEntries } from "./catalog-BnLcGVie.js";
94
- import "./plugin-registry-CP_RBN-f.js";
95
- import { t as formatCliChannelOptions } from "./channel-options-VQMByP4c.js";
94
+ import "./plugin-registry-BFyeIJdT.js";
95
+ import { t as formatCliChannelOptions } from "./channel-options-Cy9aQzx9.js";
96
96
  import { t as hasExplicitOptions } from "./command-options-DgcCGXMQ.js";
97
97
  import "./prompt-style-pphr4yLK.js";
98
98
  import "./note-ytwb4wwn.js";
@@ -103,7 +103,7 @@ import "./install-safe-path-BBe6qFNr.js";
103
103
  import "./npm-registry-spec-DPqOMFd9.js";
104
104
  import "./skill-scanner-D5p8L-xO.js";
105
105
  import "./installs-Bb1phV9x.js";
106
- import { a as reloadOnboardingPluginRegistry, i as ensureOnboardingPluginInstalled, r as setupChannels } from "./onboard-channels-3AkHwrP_.js";
106
+ import { a as reloadOnboardingPluginRegistry, i as ensureOnboardingPluginInstalled, r as setupChannels } from "./onboard-channels-DPzbq3iB.js";
107
107
  import { t as requireValidConfigSnapshot } from "./config-validation-DQ-lm2Qx.js";
108
108
  import { t as buildChannelAccountSnapshot } from "./status-dOhj12u0.js";
109
109
  import { t as parseLogLine } from "./parse-log-line-Cg7e_EO6.js";
@@ -9,7 +9,7 @@ import fs from "node:fs";
9
9
  import os from "node:os";
10
10
  import { execFileSync, spawn } from "node:child_process";
11
11
  import { createServer } from "node:http";
12
- import WebSocket$1, { WebSocketServer } from "ws";
12
+ import WebSocket, { WebSocketServer } from "ws";
13
13
 
14
14
  //#region src/browser/constants.ts
15
15
  const DEFAULT_SYMI_BROWSER_ENABLED = true;
@@ -123,7 +123,7 @@ async function ensureChromeExtensionRelayServer(opts) {
123
123
  let nextExtensionId = 1;
124
124
  const sendToExtension = async (payload) => {
125
125
  const ws = extensionWs;
126
- if (!ws || ws.readyState !== WebSocket$1.OPEN) throw new Error("Chrome extension not connected");
126
+ if (!ws || ws.readyState !== WebSocket.OPEN) throw new Error("Chrome extension not connected");
127
127
  ws.send(JSON.stringify(payload));
128
128
  return await new Promise((resolve, reject) => {
129
129
  const timer = setTimeout(() => {
@@ -140,12 +140,12 @@ async function ensureChromeExtensionRelayServer(opts) {
140
140
  const broadcastToCdpClients = (evt) => {
141
141
  const msg = JSON.stringify(evt);
142
142
  for (const ws of cdpClients) {
143
- if (ws.readyState !== WebSocket$1.OPEN) continue;
143
+ if (ws.readyState !== WebSocket.OPEN) continue;
144
144
  ws.send(msg);
145
145
  }
146
146
  };
147
147
  const sendResponseToCdp = (ws, res) => {
148
- if (ws.readyState !== WebSocket$1.OPEN) return;
148
+ if (ws.readyState !== WebSocket.OPEN) return;
149
149
  ws.send(JSON.stringify(res));
150
150
  };
151
151
  const ensureTargetEventsForClient = (ws, mode) => {
@@ -370,7 +370,7 @@ async function ensureChromeExtensionRelayServer(opts) {
370
370
  wssExtension.on("connection", (ws) => {
371
371
  extensionWs = ws;
372
372
  const ping = setInterval(() => {
373
- if (ws.readyState !== WebSocket$1.OPEN) return;
373
+ if (ws.readyState !== WebSocket.OPEN) return;
374
374
  ws.send(JSON.stringify({ method: "ping" }));
375
375
  }, 5e3);
376
376
  ws.on("message", (data) => {
@@ -688,7 +688,7 @@ async function fetchOk(url, timeoutMs = 1500, init) {
688
688
  }
689
689
  async function withCdpSocket(wsUrl, fn, opts) {
690
690
  const headers = getHeadersWithAuth(wsUrl, opts?.headers ?? {});
691
- const ws = new WebSocket$1(wsUrl, {
691
+ const ws = new WebSocket(wsUrl, {
692
692
  handshakeTimeout: typeof opts?.handshakeTimeoutMs === "number" && Number.isFinite(opts.handshakeTimeoutMs) ? Math.max(1, Math.floor(opts.handshakeTimeoutMs)) : 5e3,
693
693
  ...Object.keys(headers).length ? { headers } : {}
694
694
  });
@@ -1555,7 +1555,7 @@ async function getChromeWebSocketUrl(cdpUrl, timeoutMs = 500) {
1555
1555
  async function canOpenWebSocket(wsUrl, timeoutMs = 800) {
1556
1556
  return await new Promise((resolve) => {
1557
1557
  const headers = getHeadersWithAuth(wsUrl);
1558
- const ws = new WebSocket$1(wsUrl, {
1558
+ const ws = new WebSocket(wsUrl, {
1559
1559
  handshakeTimeout: timeoutMs,
1560
1560
  ...Object.keys(headers).length ? { headers } : {}
1561
1561
  });
@@ -1,4 +1,4 @@
1
- import { s as loadSymiPlugins } from "./unified-runner-DpZ49TWj.js";
1
+ import { s as loadSymiPlugins } from "./unified-runner-D9LZYzyF.js";
2
2
  import "./registry-Sbac4a4z.js";
3
3
  import "./paths-By0XjHBk.js";
4
4
  import "./utils-CTPsqyE_.js";
@@ -9,20 +9,20 @@ import { c as resolveAgentWorkspaceDir, l as resolveDefaultAgentId } from "./age
9
9
  import "./model-selection-7wdmO-Iw.js";
10
10
  import "./file-lock-BVUYnlQv.js";
11
11
  import "./agent-paths-BbZSGrUA.js";
12
- import "./pi-embedded-helpers-B0Vz7hRL.js";
12
+ import "./pi-embedded-helpers-CDzBxa-P.js";
13
13
  import { i as loadConfig } from "./config-B4jkreCN.js";
14
14
  import "./boolean-CbZoNRMn.js";
15
15
  import "./env-BRnPI9sO.js";
16
16
  import "./shell-env-Dc3iU7HK.js";
17
17
  import "./manifest-registry-D1MLZEjS.js";
18
- import "./sandbox-H5Lewbd2.js";
19
- import "./chrome-suE09Iax.js";
18
+ import "./sandbox-61-kshSF.js";
19
+ import "./chrome-DJChpTwP.js";
20
20
  import "./tailscale-DpKBMIvx.js";
21
21
  import "./auth-Bkx-QuRN.js";
22
- import "./server-context-DVX-C1f0.js";
22
+ import "./server-context-SbbjNkPL.js";
23
23
  import "./frontmatter-B_jqcova.js";
24
24
  import "./skills-BwDmcZdt.js";
25
- import "./routes-DmyY3P7a.js";
25
+ import "./routes-DIyAmLYR.js";
26
26
  import "./redact-B3O-RBO1.js";
27
27
  import "./errors-bI7Tdx75.js";
28
28
  import "./fs-safe-BdejYjW8.js";
@@ -48,10 +48,10 @@ import "./models-config-B5Xxy-c-.js";
48
48
  import "./pi-auth-json-Db8XJVGL.js";
49
49
  import "./session-cost-usage-D3mgssM_.js";
50
50
  import "./session-utils-Cs1jlD-q.js";
51
- import "./with-timeout-GyVVFtnd.js";
51
+ import "./with-timeout-GbJ1Yzsh.js";
52
52
  import "./reply-prefix-BFNeXT65.js";
53
- import "./memory-DTDeG3u8.js";
54
- import "./manager-5k1CRLn-.js";
53
+ import "./memory-B2hM774N.js";
54
+ import "./manager-807ZlqEf.js";
55
55
  import "./sqlite-Cod7C5ba.js";
56
56
  import "./chunk-BxfKjCUx.js";
57
57
  import "./markdown-tables-CS1Tvb3z.js";
@@ -59,8 +59,8 @@ import "./fetch-guard-JHxT9355.js";
59
59
  import "./local-roots-CgDCgCuM.js";
60
60
  import "./commands-DUzLGgEZ.js";
61
61
  import "./commands-registry-Ca5hh7nh.js";
62
- import "./client-CJeYdM6G.js";
63
- import "./call-C386w5E5.js";
62
+ import "./client-BfnNfATE.js";
63
+ import "./call-BC1HAVqW.js";
64
64
  import "./pairing-token-Dcy37-4s.js";
65
65
  import "./tool-display-DFOL6UQ9.js";
66
66
  import "./skills-remote-bz71Bstn.js";
@@ -72,7 +72,7 @@ import "./pairing-store-BNhJOnWn.js";
72
72
  import "./exec-approvals-DioSaIeH.js";
73
73
  import "./nodes-screen-De9ma6e1.js";
74
74
  import "./breakdown-B_Dhhm3K.js";
75
- import "./control-service-CCto6i0v.js";
75
+ import "./control-service-DOGU9T2P.js";
76
76
  import "./stagger-DQs772BN.js";
77
77
  import "./channel-selection-DjrS6oiz.js";
78
78
  import "./delivery-queue-duM0RT18.js";
@@ -82,10 +82,10 @@ import "./links-CQZxjjCO.js";
82
82
  import "./cli-utils-CbnnSB38.js";
83
83
  import "./help-format-8IYCRvx1.js";
84
84
  import "./progress-DQTvTiEg.js";
85
- import "./memory-cli-Bv8Rcg5s.js";
85
+ import "./memory-cli-CPebu_bx.js";
86
86
  import "./logging-CLWZ3KQI.js";
87
87
  import "./replies-C5CBlnFS.js";
88
- import "./pi-tools.policy-CYlUAnkU.js";
88
+ import "./pi-tools.policy-WaLKhqJQ.js";
89
89
  import "./model-BMFj7NXy.js";
90
90
 
91
91
  //#region src/plugins/cli.ts
@@ -8,7 +8,7 @@ import crypto, { randomUUID } from "node:crypto";
8
8
  import path from "node:path";
9
9
  import fs from "node:fs";
10
10
  import AjvPkg from "ajv";
11
- import { WebSocket } from "ws";
11
+ import { WebSocket as WebSocket$1 } from "ws";
12
12
  import { Type } from "@sinclair/typebox";
13
13
 
14
14
  //#region src/infra/device-identity.ts
@@ -2049,7 +2049,7 @@ var GatewayClient = class {
2049
2049
  if (fingerprint !== expected) return /* @__PURE__ */ new Error("gateway tls fingerprint mismatch");
2050
2050
  });
2051
2051
  }
2052
- this.ws = new WebSocket(url, wsOptions);
2052
+ this.ws = new WebSocket$1(url, wsOptions);
2053
2053
  this.ws.on("open", () => {
2054
2054
  if (url.startsWith("wss://") && this.opts.tlsFingerprint) {
2055
2055
  const tlsError = this.validateTlsFingerprint();
@@ -2268,7 +2268,7 @@ var GatewayClient = class {
2268
2268
  return null;
2269
2269
  }
2270
2270
  async request(method, params, opts) {
2271
- if (!this.ws || this.ws.readyState !== WebSocket.OPEN) throw new Error("gateway not connected");
2271
+ if (!this.ws || this.ws.readyState !== WebSocket$1.OPEN) throw new Error("gateway not connected");
2272
2272
  const id = randomUUID();
2273
2273
  const frame = {
2274
2274
  type: "req",
@@ -2,7 +2,7 @@ import { t as __exportAll } from "./rolldown-runtime-Cbj13DAv.js";
2
2
  import { _ as resolveStateDir } from "./paths-By0XjHBk.js";
3
3
  import { f as pathExists } from "./utils-CTPsqyE_.js";
4
4
  import { i as routeLogsToStderr } from "./subsystem-CHbO_DkH.js";
5
- import { a as registerCoreCliByName, c as getSubCliEntries, l as registerSubCliByName, r as getCoreCliCommandNames, t as getProgramContext } from "./program-context-BiDn7yCz.js";
5
+ import { a as registerCoreCliByName, c as getSubCliEntries, l as registerSubCliByName, r as getCoreCliCommandNames, t as getProgramContext } from "./program-context-CV_ibEw9.js";
6
6
  import path from "node:path";
7
7
  import os from "node:os";
8
8
  import fs from "node:fs/promises";
@@ -206,7 +206,7 @@ async function runConfigUnset(opts) {
206
206
  }
207
207
  function registerConfigCli(program) {
208
208
  const cmd = program.command("config").description("Non-interactive config helpers (get/set/unset). Run without subcommand for the setup wizard.").addHelpText("after", () => `\n${theme.muted("Docs:")} ${formatDocsLink("/cli/config", "docs.symi.ai/cli/config")}\n`).option("--section <section>", "Configure wizard sections (repeatable). Use with no subcommand.", (value, previous) => [...previous, value], []).action(async (opts) => {
209
- const { configureCommandFromSectionsArg } = await import("./configure-CxjXughP.js").then((n) => n.t);
209
+ const { configureCommandFromSectionsArg } = await import("./configure-CJp0NIbm.js").then((n) => n.t);
210
210
  await configureCommandFromSectionsArg(opts.section, defaultRuntime);
211
211
  });
212
212
  cmd.command("get").description("Get a config value by dot path").argument("<path>", "Config path (dot or bracket notation)").option("--json", "Output JSON", false).action(async (path, opts) => {
@@ -12,22 +12,22 @@ import { n as stylePromptMessage, r as stylePromptTitle, t as stylePromptHint }
12
12
  import { t as note$1 } from "./note-ytwb4wwn.js";
13
13
  import { t as WizardCancelledError } from "./prompts-B98rp78m.js";
14
14
  import { t as createClackPrompter } from "./clack-prompter-v9MYo-5u.js";
15
- import { r as setupChannels, t as noteChannelStatus } from "./onboard-channels-3AkHwrP_.js";
15
+ import { r as setupChannels, t as noteChannelStatus } from "./onboard-channels-DPzbq3iB.js";
16
16
  import { a as gatewayInstallErrorHint, i as buildGatewayInstallPlan, n as GATEWAY_DAEMON_RUNTIME_OPTIONS, t as DEFAULT_GATEWAY_DAEMON_RUNTIME } from "./daemon-runtime-7YBz5otm.js";
17
- import { a as ensureWorkspaceAndSessions, b as waitForGatewayReachable, g as resolveControlUiLinks, h as randomToken, m as probeGatewayReachable, n as applyWizardMetadata, p as printWizardHeader, s as guardCancel, t as DEFAULT_WORKSPACE, u as normalizeGatewayTokenInput, v as summarizeExistingConfig, y as validateGatewayPasswordInput } from "./onboard-helpers-mW55B30K.js";
17
+ import { a as ensureWorkspaceAndSessions, b as waitForGatewayReachable, g as resolveControlUiLinks, h as randomToken, m as probeGatewayReachable, n as applyWizardMetadata, p as printWizardHeader, s as guardCancel, t as DEFAULT_WORKSPACE, u as normalizeGatewayTokenInput, v as summarizeExistingConfig, y as validateGatewayPasswordInput } from "./onboard-helpers-Bf1LB5fd.js";
18
18
  import { t as resolveGatewayService } from "./service-BF50XyKr.js";
19
- import { r as healthCommand } from "./health-ksdFZpDU.js";
19
+ import { r as healthCommand } from "./health-BIwN5H6b.js";
20
20
  import { t as ensureControlUiAssetsBuilt } from "./control-ui-assets-CnX0W3vy.js";
21
21
  import { n as logConfigUpdated } from "./logging-BmJ5ky59.js";
22
22
  import { n as promptAuthChoiceGrouped } from "./auth-choice-prompt-BnvC700A.js";
23
- import { i as applyAuthChoice, n as resolvePreferredProviderForAuthChoice } from "./auth-choice-BPN4vEBk.js";
23
+ import { i as applyAuthChoice, n as resolvePreferredProviderForAuthChoice } from "./auth-choice-9XyVfAyH.js";
24
24
  import { a as promptDefaultModel, n as applyModelFallbacksFromSelection, o as promptModelAllowlist, r as applyPrimaryModel, t as applyModelAllowlist } from "./model-picker-DN-co6Oy.js";
25
25
  import { t as ensureSystemdUserLingerInteractive } from "./systemd-linger-BBxRNFXz.js";
26
26
  import { a as promptCustomApiConfig } from "./onboard-custom-BCcuL4Uq.js";
27
27
  import { i as TAILSCALE_MISSING_BIN_NOTE_LINES, n as TAILSCALE_DOCS_LINES, r as TAILSCALE_EXPOSURE_OPTIONS, t as validateIPv4AddressInput } from "./ipv4-CCdAVmwu.js";
28
28
  import { t as formatHealthCheckFailure } from "./health-format-Dp4xmTKn.js";
29
- import { n as promptRemoteGatewayConfig } from "./onboard-remote-BxtpQ74l.js";
30
- import { n as setupSkills } from "./onboard-skills-BaRS2GUY.js";
29
+ import { n as promptRemoteGatewayConfig } from "./onboard-remote-B6Ox0wMi.js";
30
+ import { n as setupSkills } from "./onboard-skills-D-ppyTcQ.js";
31
31
  import { confirm, intro, outro, select, text } from "@clack/prompts";
32
32
 
33
33
  //#region src/commands/configure.shared.ts
@@ -1,8 +1,8 @@
1
1
  import { t as __exportAll } from "./rolldown-runtime-Cbj13DAv.js";
2
2
  import { t as createSubsystemLogger } from "./subsystem-CHbO_DkH.js";
3
3
  import { i as loadConfig } from "./config-B4jkreCN.js";
4
- import { x as ensureChromeExtensionRelayServer } from "./chrome-suE09Iax.js";
5
- import { a as resolveProfile, i as resolveBrowserConfig, n as listKnownProfileNames, p as ensureBrowserControlAuth, t as createBrowserRouteContext } from "./server-context-DVX-C1f0.js";
4
+ import { x as ensureChromeExtensionRelayServer } from "./chrome-DJChpTwP.js";
5
+ import { a as resolveProfile, i as resolveBrowserConfig, n as listKnownProfileNames, p as ensureBrowserControlAuth, t as createBrowserRouteContext } from "./server-context-SbbjNkPL.js";
6
6
 
7
7
  //#region src/browser/server-lifecycle.ts
8
8
  async function ensureExtensionRelayForProfiles(params) {
@@ -80,7 +80,7 @@ async function stopBrowserControlService() {
80
80
  });
81
81
  state = null;
82
82
  try {
83
- await (await import("./pw-ai-DMvtunBE.js")).closePlaywrightBrowserConnection();
83
+ await (await import("./pw-ai-DQZa9DUQ.js")).closePlaywrightBrowserConnection();
84
84
  } catch {}
85
85
  }
86
86
 
@@ -97,6 +97,80 @@
97
97
  </div>
98
98
  </div>
99
99
 
100
+ <div class="glass-panel gateway-panel">
101
+ <div class="panel-label">SYMI GATEWAY</div>
102
+ <div class="net-row">
103
+ <div class="status-dot dot-green pulse"></div>
104
+ <span class="net-name">Gateway</span>
105
+ <span class="badge badge-green">ONLINE</span>
106
+ </div>
107
+ <div class="net-row">
108
+ <span class="net-name muted">Port</span>
109
+ <span class="net-ip">18789</span>
110
+ </div>
111
+ <div class="net-row">
112
+ <span class="net-name muted">Auth</span>
113
+ <span class="badge badge-blue">TOKEN</span>
114
+ </div>
115
+ <div class="net-row">
116
+ <span class="net-name muted">Browser CDP</span>
117
+ <span class="net-ip">18800</span>
118
+ </div>
119
+ </div>
120
+
121
+ <!-- Connections Panel -->
122
+ <div class="glass-panel connections-panel" id="connections-panel">
123
+ <div class="panel-label">CONNECTIONS</div>
124
+ <button class="conn-btn" id="conn-slack" data-channel="slack">
125
+ <div class="conn-icon conn-icon-slack">
126
+ <svg viewBox="0 0 24 24" fill="currentColor">
127
+ <path
128
+ d="M5.042 15.165a2.528 2.528 0 0 1-2.52 2.523A2.528 2.528 0 0 1 0 15.165a2.527 2.527 0 0 1 2.522-2.52h2.52v2.52zm1.271 0a2.527 2.527 0 0 1 2.521-2.52 2.527 2.527 0 0 1 2.521 2.52v6.313A2.528 2.528 0 0 1 8.834 24a2.528 2.528 0 0 1-2.521-2.522v-6.313zM8.834 5.042a2.528 2.528 0 0 1-2.521-2.52A2.528 2.528 0 0 1 8.834 0a2.528 2.528 0 0 1 2.521 2.522v2.52H8.834zm0 1.271a2.528 2.528 0 0 1 2.521 2.521 2.528 2.528 0 0 1-2.521 2.521H2.522A2.528 2.528 0 0 1 0 8.834a2.528 2.528 0 0 1 2.522-2.521h6.312zm10.124 2.521a2.528 2.528 0 0 1 2.52-2.521A2.528 2.528 0 0 1 24 8.834a2.528 2.528 0 0 1-2.522 2.521h-2.52V8.834zm-1.271 0a2.528 2.528 0 0 1-2.521 2.521 2.528 2.528 0 0 1-2.521-2.521V2.522A2.528 2.528 0 0 1 15.166 0a2.528 2.528 0 0 1 2.521 2.522v6.312zm-2.521 10.124a2.528 2.528 0 0 1 2.521 2.52A2.528 2.528 0 0 1 15.166 24a2.528 2.528 0 0 1-2.521-2.522v-2.52h2.521zm0-1.271a2.528 2.528 0 0 1-2.521-2.521 2.528 2.528 0 0 1 2.521-2.521h6.312A2.528 2.528 0 0 1 24 15.166a2.528 2.528 0 0 1-2.522 2.521h-6.312z"
129
+ />
130
+ </svg>
131
+ </div>
132
+ <div class="conn-info">
133
+ <span class="conn-name">Slack</span>
134
+ <span class="conn-btn-status" id="conn-slack-status">Checking...</span>
135
+ </div>
136
+ <div class="conn-state" id="conn-slack-state"><div class="conn-dot"></div></div>
137
+ <span class="conn-notif" id="conn-slack-notif"></span>
138
+ </button>
139
+ <button class="conn-btn" id="conn-email" data-channel="email">
140
+ <div class="conn-icon conn-icon-email">
141
+ <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
142
+ <rect x="2" y="4" width="20" height="16" rx="2" />
143
+ <path d="M22 6l-10 7L2 6" />
144
+ </svg>
145
+ </div>
146
+ <div class="conn-info">
147
+ <span class="conn-name">Email</span>
148
+ <span class="conn-btn-status" id="conn-email-status">Checking...</span>
149
+ </div>
150
+ <div class="conn-state" id="conn-email-state"><div class="conn-dot"></div></div>
151
+ <span class="conn-notif" id="conn-email-notif"></span>
152
+ </button>
153
+ <button class="conn-btn" id="conn-teams" data-channel="msteams">
154
+ <div class="conn-icon conn-icon-teams">
155
+ <svg viewBox="0 0 24 24" fill="currentColor">
156
+ <path
157
+ d="M19.19 8.77c-.73 0-1.39.29-1.88.76V8.5a2.5 2.5 0 0 0-2.5-2.5h-1.62c.18-.46.28-.96.28-1.48a4.04 4.04 0 0 0-4.04-4.04c-2.23 0-4.04 1.81-4.04 4.04 0 .52.1 1.02.28 1.48H4.5A2.5 2.5 0 0 0 2 8.5v9a2.5 2.5 0 0 0 2.5 2.5h9a2.5 2.5 0 0 0 2.5-2.5v-.97c.49.47 1.15.76 1.88.76a2.69 2.69 0 0 0 2.69-2.69v-3.14a2.69 2.69 0 0 0-2.69-2.69h.31zM9.43 2.98a2.04 2.04 0 1 1 0 4.08 2.04 2.04 0 0 1 0-4.08zm4.57 14.52a.5.5 0 0 1-.5.5h-9a.5.5 0 0 1-.5-.5v-9a.5.5 0 0 1 .5-.5h9a.5.5 0 0 1 .5.5v9zm5.88-4.17a.69.69 0 0 1-.69.69.69.69 0 0 1-.69-.69v-3.14c0-.38.31-.69.69-.69.38 0 .69.31.69.69v3.14z"
158
+ />
159
+ <circle cx="17.5" cy="5.5" r="2.5" />
160
+ </svg>
161
+ </div>
162
+ <div class="conn-info">
163
+ <span class="conn-name">Teams</span>
164
+ <span class="conn-btn-status" id="conn-teams-status">Checking...</span>
165
+ </div>
166
+ <div class="conn-state" id="conn-teams-state"><div class="conn-dot"></div></div>
167
+ <span class="conn-notif" id="conn-teams-notif"></span>
168
+ </button>
169
+ </div>
170
+ </aside>
171
+
172
+ <!-- Metrics — Right column -->
173
+ <aside class="metrics-col metrics-right">
100
174
  <!-- Subagents Panel -->
101
175
  <div class="glass-panel subagents-panel" id="subagents-panel">
102
176
  <div class="panel-label">
@@ -199,80 +273,6 @@
199
273
  </div>
200
274
  </div>
201
275
  </div>
202
- </aside>
203
-
204
- <!-- Metrics — Right column -->
205
- <aside class="metrics-col metrics-right">
206
- <!-- Connections Panel -->
207
- <div class="glass-panel connections-panel" id="connections-panel">
208
- <div class="panel-label">CONNECTIONS</div>
209
- <button class="conn-btn" id="conn-slack" data-channel="slack">
210
- <div class="conn-icon conn-icon-slack">
211
- <svg viewBox="0 0 24 24" fill="currentColor">
212
- <path
213
- d="M5.042 15.165a2.528 2.528 0 0 1-2.52 2.523A2.528 2.528 0 0 1 0 15.165a2.527 2.527 0 0 1 2.522-2.52h2.52v2.52zm1.271 0a2.527 2.527 0 0 1 2.521-2.52 2.527 2.527 0 0 1 2.521 2.52v6.313A2.528 2.528 0 0 1 8.834 24a2.528 2.528 0 0 1-2.521-2.522v-6.313zM8.834 5.042a2.528 2.528 0 0 1-2.521-2.52A2.528 2.528 0 0 1 8.834 0a2.528 2.528 0 0 1 2.521 2.522v2.52H8.834zm0 1.271a2.528 2.528 0 0 1 2.521 2.521 2.528 2.528 0 0 1-2.521 2.521H2.522A2.528 2.528 0 0 1 0 8.834a2.528 2.528 0 0 1 2.522-2.521h6.312zm10.124 2.521a2.528 2.528 0 0 1 2.52-2.521A2.528 2.528 0 0 1 24 8.834a2.528 2.528 0 0 1-2.522 2.521h-2.52V8.834zm-1.271 0a2.528 2.528 0 0 1-2.521 2.521 2.528 2.528 0 0 1-2.521-2.521V2.522A2.528 2.528 0 0 1 15.166 0a2.528 2.528 0 0 1 2.521 2.522v6.312zm-2.521 10.124a2.528 2.528 0 0 1 2.521 2.52A2.528 2.528 0 0 1 15.166 24a2.528 2.528 0 0 1-2.521-2.522v-2.52h2.521zm0-1.271a2.528 2.528 0 0 1-2.521-2.521 2.528 2.528 0 0 1 2.521-2.521h6.312A2.528 2.528 0 0 1 24 15.166a2.528 2.528 0 0 1-2.522 2.521h-6.312z"
214
- />
215
- </svg>
216
- </div>
217
- <div class="conn-info">
218
- <span class="conn-name">Slack</span>
219
- <span class="conn-btn-status" id="conn-slack-status">Checking...</span>
220
- </div>
221
- <div class="conn-state" id="conn-slack-state"><div class="conn-dot"></div></div>
222
- <span class="conn-notif" id="conn-slack-notif"></span>
223
- </button>
224
- <button class="conn-btn" id="conn-email" data-channel="email">
225
- <div class="conn-icon conn-icon-email">
226
- <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
227
- <rect x="2" y="4" width="20" height="16" rx="2" />
228
- <path d="M22 6l-10 7L2 6" />
229
- </svg>
230
- </div>
231
- <div class="conn-info">
232
- <span class="conn-name">Email</span>
233
- <span class="conn-btn-status" id="conn-email-status">Checking...</span>
234
- </div>
235
- <div class="conn-state" id="conn-email-state"><div class="conn-dot"></div></div>
236
- <span class="conn-notif" id="conn-email-notif"></span>
237
- </button>
238
- <button class="conn-btn" id="conn-teams" data-channel="msteams">
239
- <div class="conn-icon conn-icon-teams">
240
- <svg viewBox="0 0 24 24" fill="currentColor">
241
- <path
242
- d="M19.19 8.77c-.73 0-1.39.29-1.88.76V8.5a2.5 2.5 0 0 0-2.5-2.5h-1.62c.18-.46.28-.96.28-1.48a4.04 4.04 0 0 0-4.04-4.04c-2.23 0-4.04 1.81-4.04 4.04 0 .52.1 1.02.28 1.48H4.5A2.5 2.5 0 0 0 2 8.5v9a2.5 2.5 0 0 0 2.5 2.5h9a2.5 2.5 0 0 0 2.5-2.5v-.97c.49.47 1.15.76 1.88.76a2.69 2.69 0 0 0 2.69-2.69v-3.14a2.69 2.69 0 0 0-2.69-2.69h.31zM9.43 2.98a2.04 2.04 0 1 1 0 4.08 2.04 2.04 0 0 1 0-4.08zm4.57 14.52a.5.5 0 0 1-.5.5h-9a.5.5 0 0 1-.5-.5v-9a.5.5 0 0 1 .5-.5h9a.5.5 0 0 1 .5.5v9zm5.88-4.17a.69.69 0 0 1-.69.69.69.69 0 0 1-.69-.69v-3.14c0-.38.31-.69.69-.69.38 0 .69.31.69.69v3.14z"
243
- />
244
- <circle cx="17.5" cy="5.5" r="2.5" />
245
- </svg>
246
- </div>
247
- <div class="conn-info">
248
- <span class="conn-name">Teams</span>
249
- <span class="conn-btn-status" id="conn-teams-status">Checking...</span>
250
- </div>
251
- <div class="conn-state" id="conn-teams-state"><div class="conn-dot"></div></div>
252
- <span class="conn-notif" id="conn-teams-notif"></span>
253
- </button>
254
- </div>
255
-
256
- <div class="glass-panel gateway-panel">
257
- <div class="panel-label">SYMI GATEWAY</div>
258
- <div class="net-row">
259
- <div class="status-dot dot-green pulse"></div>
260
- <span class="net-name">Gateway</span>
261
- <span class="badge badge-green">ONLINE</span>
262
- </div>
263
- <div class="net-row">
264
- <span class="net-name muted">Port</span>
265
- <span class="net-ip">18789</span>
266
- </div>
267
- <div class="net-row">
268
- <span class="net-name muted">Auth</span>
269
- <span class="badge badge-blue">TOKEN</span>
270
- </div>
271
- <div class="net-row">
272
- <span class="net-name muted">Browser CDP</span>
273
- <span class="net-ip">18800</span>
274
- </div>
275
- </div>
276
276
 
277
277
  <div class="glass-panel" id="model-routing-panel">
278
278
  <div class="panel-label">MODEL ROUTING</div>