@symerian/symi 2.6.14 → 2.6.15

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 (109) hide show
  1. package/dist/{agents-CrSpoNsS.js → agents-DbDrceM_.js} +4 -4
  2. package/dist/{agents.config-B3GILTs5.js → agents.config-AMrJVinF.js} +1 -1
  3. package/dist/{agents.config-Co1CO8fA.js → agents.config-phBy3nbc.js} +1 -1
  4. package/dist/{audio-preflight-DHTaS5U1.js → audio-preflight-BVaaZWkg.js} +4 -4
  5. package/dist/{auth-choice-BHWxDJh7.js → auth-choice-CmbfbR4q.js} +1 -1
  6. package/dist/{auth-choice-BBmXnDnK.js → auth-choice-DsGuT4Dk.js} +1 -1
  7. package/dist/{banner-RLiOIu-3.js → banner-Ds_jDSsM.js} +1 -1
  8. package/dist/build-info.json +3 -3
  9. package/dist/bundled/boot-md/handler.js +6 -6
  10. package/dist/bundled/session-memory/handler.js +6 -6
  11. package/dist/canvas-host/a2ui/.bundle.hash +1 -1
  12. package/dist/{channel-options-BCK41AON.js → channel-options-BV6WyWWq.js} +1 -1
  13. package/dist/{channel-options-PDf46S-K.js → channel-options-Del6IGRs.js} +1 -1
  14. package/dist/{channel-web-C3XZ7c2q.js → channel-web-Cuukem2c.js} +1 -1
  15. package/dist/{channels-cli-723vy6L6.js → channels-cli-C3LiJhRT.js} +4 -4
  16. package/dist/{channels-cli-CUWuD7qf.js → channels-cli-D-E-oHnC.js} +4 -4
  17. package/dist/{chrome-DYZwl5Gv.js → chrome-DkaXoP36.js} +7 -7
  18. package/dist/{cli-CAzmrOs0.js → cli-BavIfExj.js} +1 -1
  19. package/dist/{cli-DYdRSi_j.js → cli-C53UJpN3.js} +1 -1
  20. package/dist/{command-registry-B2aO0Q7_.js → command-registry-Dtn5iLgE.js} +9 -9
  21. package/dist/{completion-cli-BsKD_vBb.js → completion-cli-DEFzGiNX.js} +2 -2
  22. package/dist/{completion-cli-BKm12loU.js → completion-cli-DhhIPri-.js} +1 -1
  23. package/dist/{config-cli-D47lU7kU.js → config-cli-CIhqgzOH.js} +1 -1
  24. package/dist/{config-cli-Bynmd81Q.js → config-cli-DW40utS2.js} +1 -1
  25. package/dist/{configure-Df6GmKAR.js → configure-CkSODPmX.js} +3 -3
  26. package/dist/{configure-B3vS2Iz5.js → configure-SVzErXwX.js} +3 -3
  27. package/dist/{deliver-dODxSv3b.js → deliver-C46-vyqg.js} +1 -1
  28. package/dist/{doctor-completion-DyiRkYT4.js → doctor-completion-B-w1_lQk.js} +1 -1
  29. package/dist/{doctor-completion-SEerte2S.js → doctor-completion-BBki2Ufk.js} +1 -1
  30. package/dist/entry.js +1 -1
  31. package/dist/extensionAPI.js +1 -1
  32. package/dist/{gateway-cli-k19iT2vJ.js → gateway-cli-BNYHujRR.js} +9 -9
  33. package/dist/{gateway-cli-PjmG0pFo.js → gateway-cli-BVbhSSqh.js} +9 -9
  34. package/dist/{glass-ui-ws-iCEtluQU.js → glass-ui-ws-B-MkTkAC.js} +7 -7
  35. package/dist/{glass-ui-ws-D0Yv090T.js → glass-ui-ws-DfJEU59m.js} +7 -7
  36. package/dist/{health-CXjAtn1-.js → health-BU6f7W6a.js} +1 -1
  37. package/dist/{health-B32Q-KYM.js → health-wZyomt2k.js} +1 -1
  38. package/dist/{hooks-cli-DA6zOGNz.js → hooks-cli-CdoOvoX9.js} +2 -2
  39. package/dist/{hooks-cli-DfRmFenH.js → hooks-cli-DX4nLKqn.js} +2 -2
  40. package/dist/{image-CXu8W39c.js → image-CuzFLQWC.js} +1 -1
  41. package/dist/index.js +6 -6
  42. package/dist/llm-slug-generator.js +6 -6
  43. package/dist/{models-cli-CbJUD_L1.js → models-cli-Bc2k_maK.js} +3 -3
  44. package/dist/{models-cli-BgCUViRO.js → models-cli-BeOo0gLs.js} +2 -2
  45. package/dist/{models-zowe4LXa.js → models-mS0NbL8c.js} +2 -2
  46. package/dist/{onboard-CYvIpUXQ.js → onboard-B6VpNEvT.js} +2 -2
  47. package/dist/{onboard-DsKgcThj.js → onboard-Cl0aQccB.js} +2 -2
  48. package/dist/{onboard-channels-DxCGWgB0.js → onboard-channels-BlmSvsPS.js} +1 -1
  49. package/dist/{onboard-channels-DLiV4Y0t.js → onboard-channels-BnvM0w8_.js} +1 -1
  50. package/dist/{onboarding-DioGtMFo.js → onboarding-BxBRG2z_.js} +3 -3
  51. package/dist/{onboarding-BA5v1JEG.js → onboarding-DwHp3u6V.js} +3 -3
  52. package/dist/{onboarding.finalize-DMXCA49f.js → onboarding.finalize-BrbMUUi5.js} +6 -6
  53. package/dist/{onboarding.finalize-CAbRXb0h.js → onboarding.finalize-J7oUfYcz.js} +5 -5
  54. package/dist/{pi-embedded-CFFnZEcA.js → pi-embedded-FraxHehk.js} +172 -2
  55. package/dist/{pi-embedded-helpers-pubKo8HQ.js → pi-embedded-helpers-CfqDGQ9J.js} +4 -4
  56. package/dist/{plugin-registry-HFOrv3KN.js → plugin-registry-CMCHyYWB.js} +1 -1
  57. package/dist/{plugin-registry-Bt5YCgFq.js → plugin-registry-thPK5K1z.js} +1 -1
  58. package/dist/plugin-sdk/{channel-web-E56yV1OA.js → channel-web-Cz5hAZTe.js} +1 -1
  59. package/dist/plugin-sdk/index.js +2 -2
  60. package/dist/plugin-sdk/{reply-pPqvSkWb.js → reply-DM8-P0Qq.js} +172 -2
  61. package/dist/plugin-sdk/{web-Msnzya6B.js → web-BQYWq6xE.js} +2 -2
  62. package/dist/{plugins-cli-C7xTf9NV.js → plugins-cli-B87kp0ad.js} +2 -2
  63. package/dist/{plugins-cli-CXz_UApK.js → plugins-cli-DamE7XjD.js} +2 -2
  64. package/dist/{program-context-BBtSJunF.js → program-context-DFKRAsbt.js} +17 -17
  65. package/dist/{program-8hWr4qGZ.js → program-gbhreuEV.js} +7 -7
  66. package/dist/{prompt-select-styled-DUXeA9Zp.js → prompt-select-styled-B5bx2NEB.js} +4 -4
  67. package/dist/{prompt-select-styled-CwfroEHp.js → prompt-select-styled-BICt4IW2.js} +4 -4
  68. package/dist/{provider-auth-helpers-Dc7jBEOA.js → provider-auth-helpers-BEu0e6yr.js} +1 -1
  69. package/dist/{provider-auth-helpers-DhLHWjNU.js → provider-auth-helpers-DmEnyFX5.js} +1 -1
  70. package/dist/{push-apns-CflJh75N.js → push-apns-DVz2SkR5.js} +1 -1
  71. package/dist/{push-apns-CVZe5WVN.js → push-apns-tMnMeZX7.js} +1 -1
  72. package/dist/{pw-ai-B5asscAD.js → pw-ai-m0mj2KWK.js} +1 -1
  73. package/dist/{register.agent-BnuJQ5lg.js → register.agent-BOvqehoy.js} +6 -6
  74. package/dist/{register.agent-DV7IR1rI.js → register.agent-KI2e7rY8.js} +5 -5
  75. package/dist/{register.configure-DaIrJXWo.js → register.configure-BpxsezsB.js} +6 -6
  76. package/dist/{register.configure-BhncI0ij.js → register.configure-D8DGPMv0.js} +6 -6
  77. package/dist/{register.maintenance-BO1XWhVb.js → register.maintenance-BcIwMibz.js} +7 -7
  78. package/dist/{register.maintenance-DK_p-7so.js → register.maintenance-WRAU5DSR.js} +8 -8
  79. package/dist/{register.message-B194ue2R.js → register.message-C0eMmAGL.js} +2 -2
  80. package/dist/{register.message-B4CGCAn_.js → register.message-CX_Dmuke.js} +2 -2
  81. package/dist/{register.onboard-DidMCka8.js → register.onboard-BE87LPDH.js} +4 -4
  82. package/dist/{register.onboard-Dt53qGB5.js → register.onboard-ByB6oGQ-.js} +4 -4
  83. package/dist/{register.setup-DgUxMRZR.js → register.setup-D8DgDNnC.js} +4 -4
  84. package/dist/{register.setup-CLV1kk2-.js → register.setup-DSY9eAV8.js} +4 -4
  85. package/dist/{register.status-health-sessions-TvGuwVoR.js → register.status-health-sessions-CW4DkAa1.js} +3 -3
  86. package/dist/{register.status-health-sessions-CB10JLY6.js → register.status-health-sessions-TMJPmooX.js} +3 -3
  87. package/dist/{register.subclis-elNdyQio.js → register.subclis-BS-WgVMV.js} +9 -9
  88. package/dist/{reply-DUZvOCsG.js → reply-B2Xur-75.js} +172 -2
  89. package/dist/{run-main-gBPGqO8r.js → run-main-jFBqLwBJ.js} +14 -14
  90. package/dist/{runner-WAG0M5s9.js → runner-CU9l0uJh.js} +1 -1
  91. package/dist/{server-methods-dgW-8gC7.js → server-methods-BqQeaixw.js} +7 -7
  92. package/dist/{server-methods-BG0N79yY.js → server-methods-zgqyrRAq.js} +7 -7
  93. package/dist/{server-node-events-B_hsQw_N.js → server-node-events-8pINzbzg.js} +2 -2
  94. package/dist/{server-node-events-ZtQKBPo3.js → server-node-events-Doln-zR2.js} +2 -2
  95. package/dist/{status-D4Lr90yH.js → status-BDABGQ7Y.js} +1 -1
  96. package/dist/{status-Cd9-xWsZ.js → status-Bdqk3JgK.js} +2 -2
  97. package/dist/{status-BqhJ-HsW.js → status-Bwvq4SPL.js} +1 -1
  98. package/dist/{status-D-IvYfjk.js → status-DFml_pIs.js} +2 -2
  99. package/dist/{subagent-registry-J2pIBQF7.js → subagent-registry-CUXuFP-8.js} +172 -2
  100. package/dist/{unified-runner-C8c7J6BS.js → unified-runner-Bojz2_xD.js} +186 -16
  101. package/dist/{update-cli-D8nA6U7C.js → update-cli-C6thJhZU.js} +7 -7
  102. package/dist/{update-cli-B7TLu25J.js → update-cli-Pwrk83u-.js} +8 -8
  103. package/dist/{update-runner-DvZOsoQs.js → update-runner-Bssy0nSl.js} +1 -1
  104. package/dist/{update-runner-D8AFB8Oi.js → update-runner-DgqFpUFr.js} +1 -1
  105. package/dist/{web-DDiOPIdv.js → web-BFY2FcFr.js} +2 -2
  106. package/dist/{web-CAy-xQv2.js → web-BiK5cfMV.js} +1 -1
  107. package/dist/{web-mQInjWbW.js → web-DJgELzDq.js} +1 -1
  108. package/dist/{web--erunODY.js → web-DLkEjSYp.js} +6 -6
  109. package/package.json +1 -1
@@ -1,6 +1,6 @@
1
1
  import { u as resolveGatewayPort } from "./paths-Cqn-zk3M.js";
2
2
  import { B as theme, k as info, z as isRich } from "./utils-B-0b9bGM.js";
3
- import { B as summarizeRestartSentinel, Jt as sha256HexPrefix, _t as formatUsageReportLines, a as buildChannelSummary, gt as loadProviderUsageSummary, h as listAgentsForGateway, m as classifySessionKey, o as buildChannelAccountSnapshot, pr as lookupContextTokens, s as formatChannelAllowFrom, wr as peekSystemEvents, x as resolveSessionModelRef, z as readRestartSentinel } from "./reply-DUZvOCsG.js";
3
+ import { B as summarizeRestartSentinel, Jt as sha256HexPrefix, _t as formatUsageReportLines, a as buildChannelSummary, gt as loadProviderUsageSummary, h as listAgentsForGateway, m as classifySessionKey, o as buildChannelAccountSnapshot, pr as lookupContextTokens, s as formatChannelAllowFrom, wr as peekSystemEvents, x as resolveSessionModelRef, z as readRestartSentinel } from "./reply-B2Xur-75.js";
4
4
  import { S as parseAgentSessionKey } from "./session-key-DCt45XZa.js";
5
5
  import { t as resolveSymiPackageRoot } from "./symi-root-CrGJbkzf.js";
6
6
  import { n as runExec } from "./exec-CWkblSrI.js";
@@ -28,7 +28,7 @@ import { t as formatRuntimeStatusWithDetails } from "./runtime-status-CR9445g5.j
28
28
  import { t as readLastGatewayErrorLine } from "./diagnostics-BAMlsVVX.js";
29
29
  import { t as renderTable } from "./table-BTgkRafz.js";
30
30
  import { a as resolveGatewayProbeAuth$1, c as probeGateway, t as runSecurityAudit } from "./audit-CrITRV6w.js";
31
- import { a as resolveHeartbeatSummaryForAgent, t as formatHealthChannelLines } from "./health-B32Q-KYM.js";
31
+ import { a as resolveHeartbeatSummaryForAgent, t as formatHealthChannelLines } from "./health-wZyomt2k.js";
32
32
  import { g as resolveUpdateChannelDisplay, i as formatGitInstallLabel, m as normalizeUpdateChannel, t as checkUpdateStatus } from "./update-check-CtckACbb.js";
33
33
  import { t as resolveNodeService } from "./node-service-Cxz4e-Qd.js";
34
34
  import { n as redactSecrets, t as formatGatewayAuthUsed } from "./format-yQZNwAF2.js";
@@ -1,4 +1,4 @@
1
- import { dt as createPluginLoaderLogger, ft as loadSymiPlugins } from "./reply-DUZvOCsG.js";
1
+ import { dt as createPluginLoaderLogger, ft as loadSymiPlugins } from "./reply-B2Xur-75.js";
2
2
  import { t as createSubsystemLogger } from "./subsystem-D9vIQve0.js";
3
3
  import { D as resolveDefaultAgentWorkspaceDir, c as resolveAgentWorkspaceDir, l as resolveDefaultAgentId } from "./agent-scope-CgUHAtCo.js";
4
4
  import { i as loadConfig } from "./config-CHwyw6l5.js";
@@ -9,7 +9,7 @@ import { c as resolveAgentWorkspaceDir } from "./agent-scope-D-jRCY0d.js";
9
9
  import { t as buildWorkspaceSkillStatus } from "./skills-status-DKXJ-tbi.js";
10
10
  import { H as VERSION, i as loadConfig, o as readConfigFileSnapshot } from "./config-DHBLS1Hl.js";
11
11
  import { n as callGateway, t as buildGatewayConnectionDetails } from "./call-BcE47FtD.js";
12
- import { En as peekSystemEvents, St as summarizeRestartSentinel, cn as buildChannelAccountSnapshot, in as formatUsageReportLines, ln as formatChannelAllowFrom, nt as sha256HexPrefix, rn as loadProviderUsageSummary, sn as buildChannelSummary, xt as readRestartSentinel } from "./subagent-registry-J2pIBQF7.js";
12
+ import { En as peekSystemEvents, St as summarizeRestartSentinel, cn as buildChannelAccountSnapshot, in as formatUsageReportLines, ln as formatChannelAllowFrom, nt as sha256HexPrefix, rn as loadProviderUsageSummary, sn as buildChannelSummary, xt as readRestartSentinel } from "./subagent-registry-CUXuFP-8.js";
13
13
  import { F as resolveMainSessionKey, j as resolveFreshSessionTotalTokens, o as loadSessionStore } from "./sessions-CJXnZVjR.js";
14
14
  import { n as listChannelPlugins } from "./plugins-CwSlLxM8.js";
15
15
  import { o as getTailnetHostname, s as readTailscaleStatusJson } from "./tailscale-CbbvYNVw.js";
@@ -29,7 +29,7 @@ import { t as formatRuntimeStatusWithDetails } from "./runtime-status-hFVEC3wO.j
29
29
  import { t as readLastGatewayErrorLine } from "./diagnostics-CS1ov_hH.js";
30
30
  import { t as renderTable } from "./table-D01d2GuY.js";
31
31
  import { a as resolveGatewayProbeAuth$1, c as probeGateway, t as runSecurityAudit } from "./audit-Byo5jCLN.js";
32
- import { o as resolveHeartbeatSummaryForAgent, t as formatHealthChannelLines } from "./health-CXjAtn1-.js";
32
+ import { o as resolveHeartbeatSummaryForAgent, t as formatHealthChannelLines } from "./health-BU6f7W6a.js";
33
33
  import { g as resolveUpdateChannelDisplay, i as formatGitInstallLabel, m as normalizeUpdateChannel, t as checkUpdateStatus } from "./update-check-ZdimP1aU.js";
34
34
  import { t as resolveNodeService } from "./node-service-fcZExd22.js";
35
35
  import { n as redactSecrets, t as formatGatewayAuthUsed } from "./format-DVLB9DNB.js";
@@ -35579,6 +35579,175 @@ function toClientToolDefinitions(tools, onClientToolCall, hookContext) {
35579
35579
  * @module
35580
35580
  */
35581
35581
  /**
35582
+ * Known shell commands for prefix deduplication.
35583
+ * When token boundary corruption doubles a command prefix (grep → grgrep,
35584
+ * ls → lsls), we check the first token against this set. If stripping
35585
+ * the repeated prefix yields a known command, use it.
35586
+ *
35587
+ * O(1) lookup. Zero false positives — no valid command is its own prefix doubled.
35588
+ */
35589
+ const KNOWN_COMMANDS = new Set([
35590
+ "ls",
35591
+ "cat",
35592
+ "cp",
35593
+ "mv",
35594
+ "rm",
35595
+ "mkdir",
35596
+ "rmdir",
35597
+ "touch",
35598
+ "chmod",
35599
+ "chown",
35600
+ "chgrp",
35601
+ "ln",
35602
+ "pwd",
35603
+ "echo",
35604
+ "printf",
35605
+ "head",
35606
+ "tail",
35607
+ "wc",
35608
+ "sort",
35609
+ "uniq",
35610
+ "cut",
35611
+ "tr",
35612
+ "tee",
35613
+ "xargs",
35614
+ "env",
35615
+ "date",
35616
+ "sleep",
35617
+ "true",
35618
+ "false",
35619
+ "yes",
35620
+ "test",
35621
+ "expr",
35622
+ "basename",
35623
+ "dirname",
35624
+ "readlink",
35625
+ "realpath",
35626
+ "mktemp",
35627
+ "stat",
35628
+ "file",
35629
+ "dd",
35630
+ "df",
35631
+ "du",
35632
+ "id",
35633
+ "whoami",
35634
+ "hostname",
35635
+ "uname",
35636
+ "grep",
35637
+ "egrep",
35638
+ "fgrep",
35639
+ "find",
35640
+ "locate",
35641
+ "sed",
35642
+ "awk",
35643
+ "diff",
35644
+ "patch",
35645
+ "strings",
35646
+ "less",
35647
+ "more",
35648
+ "tar",
35649
+ "gzip",
35650
+ "gunzip",
35651
+ "zip",
35652
+ "unzip",
35653
+ "bzip2",
35654
+ "xz",
35655
+ "curl",
35656
+ "wget",
35657
+ "ssh",
35658
+ "scp",
35659
+ "rsync",
35660
+ "ping",
35661
+ "dig",
35662
+ "nslookup",
35663
+ "netstat",
35664
+ "lsof",
35665
+ "nc",
35666
+ "ifconfig",
35667
+ "ip",
35668
+ "ps",
35669
+ "top",
35670
+ "kill",
35671
+ "killall",
35672
+ "nohup",
35673
+ "nice",
35674
+ "which",
35675
+ "type",
35676
+ "where",
35677
+ "man",
35678
+ "sudo",
35679
+ "su",
35680
+ "mount",
35681
+ "umount",
35682
+ "systemctl",
35683
+ "journalctl",
35684
+ "launchctl",
35685
+ "dmesg",
35686
+ "sysctl",
35687
+ "git",
35688
+ "make",
35689
+ "gcc",
35690
+ "python",
35691
+ "python3",
35692
+ "pip",
35693
+ "pip3",
35694
+ "node",
35695
+ "npm",
35696
+ "npx",
35697
+ "pnpm",
35698
+ "yarn",
35699
+ "cargo",
35700
+ "go",
35701
+ "ruby",
35702
+ "gem",
35703
+ "java",
35704
+ "javac",
35705
+ "docker",
35706
+ "brew",
35707
+ "open",
35708
+ "pbcopy",
35709
+ "pbpaste",
35710
+ "defaults",
35711
+ "diskutil",
35712
+ "sw_vers",
35713
+ "system_profiler",
35714
+ "plutil",
35715
+ "mdfind",
35716
+ "mdls",
35717
+ "softwareupdate",
35718
+ "caffeinate",
35719
+ "say",
35720
+ "osascript",
35721
+ "security",
35722
+ "codesign",
35723
+ "hdiutil",
35724
+ "installer",
35725
+ "lipo",
35726
+ "otool",
35727
+ "dscl",
35728
+ "scutil"
35729
+ ]);
35730
+ /**
35731
+ * Fix command prefix duplication from token boundary splits.
35732
+ * Token corruption can double a multi-char prefix: grep → grgrep, ls → lsls.
35733
+ * Check if the first token starts with a repeated prefix that, when removed,
35734
+ * yields a known command.
35735
+ *
35736
+ * Examples: grgrep → grep, lsls → ls, catcat → cat, curlcurl → curl
35737
+ */
35738
+ function dedupCommandPrefix(command) {
35739
+ const match = command.match(/^([a-zA-Z0-9_-]+)/);
35740
+ if (!match) return command;
35741
+ const firstToken = match[1];
35742
+ if (KNOWN_COMMANDS.has(firstToken)) return command;
35743
+ for (let prefixLen = 2; prefixLen <= Math.min(10, Math.floor(firstToken.length / 2)); prefixLen++) {
35744
+ const prefix = firstToken.slice(0, prefixLen);
35745
+ const candidate = firstToken.slice(prefixLen);
35746
+ if (candidate.startsWith(prefix.slice(0, Math.min(prefix.length, candidate.length))) && KNOWN_COMMANDS.has(candidate)) return candidate + command.slice(firstToken.length);
35747
+ }
35748
+ return command;
35749
+ }
35750
+ /**
35582
35751
  * Validate that a command string contains extractable valid shell syntax.
35583
35752
  * Returns the cleaned command if valid, or an error reason if not.
35584
35753
  *
@@ -35597,6 +35766,7 @@ function validateShellCommand(command) {
35597
35766
  cleaned = cleaned.replace(/<\|[^|>]*(?:\|>)?/g, "").trim();
35598
35767
  cleaned = cleanResidualTokenFragments(cleaned);
35599
35768
  }
35769
+ cleaned = dedupCommandPrefix(cleaned);
35600
35770
  if (!cleaned || !cleaned.trim()) return {
35601
35771
  valid: false,
35602
35772
  cleaned: "",
@@ -53079,7 +53249,7 @@ function isVoiceChannelType(type) {
53079
53249
  function createDefaultDeps() {
53080
53250
  return {
53081
53251
  sendMessageWhatsApp: async (...args) => {
53082
- const { sendMessageWhatsApp } = await import("./web-CAy-xQv2.js");
53252
+ const { sendMessageWhatsApp } = await import("./web-BiK5cfMV.js");
53083
53253
  return await sendMessageWhatsApp(...args);
53084
53254
  },
53085
53255
  sendMessageTelegram: async (...args) => {
@@ -68393,7 +68563,7 @@ function loadWebLoginQr() {
68393
68563
  return webLoginQrPromise;
68394
68564
  }
68395
68565
  function loadWebChannel() {
68396
- webChannelPromise ??= import("./web-CAy-xQv2.js");
68566
+ webChannelPromise ??= import("./web-BiK5cfMV.js");
68397
68567
  return webChannelPromise;
68398
68568
  }
68399
68569
  function loadWhatsAppActions() {
@@ -10,10 +10,10 @@ import { $ as resolveSymiAgentDir, B as resolveApiKeyForProvider, C as normalize
10
10
  import { n as formatCliCommand, r as resolveCliName, t as isTruthyEnvValue } from "./env-BDXYbTKj.js";
11
11
  import { a as saveJsonFile, i as loadJsonFile } from "./github-copilot-token-cCYzSU9h.js";
12
12
  import { t as parseBooleanValue$1 } from "./boolean-CE7i9tBR.js";
13
- import { $ as normalizeDeliveryContext, A as isTransientHttpError, At as DEFAULT_UPLOAD_DIR, Bt as expandToolGroups, C as isContextOverflowError, Ct as resolveGroupSessionKey, D as isRateLimitAssistantError, Dt as registerBrowserRoutes, E as isLikelyContextOverflowError, Et as createBrowserRouteContext, F as resolveSandboxContext, Ft as resolveSandboxConfigForAgent, G as updateLastRoute, Gt as compileGlobPatterns, H as loadSessionStore, Ht as normalizeToolName, I as resolveSandboxRuntimeStatus, It as applyOwnerOnlyToolPolicy, J as isCacheEnabled, Jt as ensureSessionHeader, K as updateSessionStore, Kt as matchesAnyGlobPattern, L as extractDeliveryInfo, Lt as buildPluginToolGroups, M as parseImageSizeError, Mt as getBridgeAuthForPort, N as sanitizeUserFacingText, Nt as ensureBrowserControlAuth, O as isRawApiErrorPayload, Ot as resolveBrowserConfig, P as ensureSandboxWorkspaceForSession, Pt as resolveBrowserControlAuth, Q as mergeDeliveryContext, R as parseSessionThreadInfo, Rt as collectExplicitAllowlist, S as isCompactionFailureError, St as deriveSessionMetaPatch, T as isFailoverErrorMessage, Tt as resolveSessionLockMaxHoldFromTimeout, U as readSessionUpdatedAt, Ut as resolveToolProfilePolicy, V as resolveAndPersistSessionFile, Vt as mergeAlsoAllowPolicy, W as recordSessionMetaFromInbound, Wt as stripPluginOnlyAllowlist, X as deliveryContextFromSession, Xt as resolveBootstrapTotalMaxChars, Y as resolveCacheTtlMs$1, Yt as resolveBootstrapMaxChars, Z as deliveryContextKey, Zt as sanitizeGoogleTurnOrdering, _ as formatRawAssistantErrorForUi, _t as resolveFreshSessionTotalTokens, a as isMessagingToolDuplicateNormalized, at as extractToolCallNames, b as isBillingAssistantError, bt as resolveExplicitAgentSessionKey, c as extractToolCallsFromAssistant, ct as hasInterSessionUserProvenance, d as isAntigravityClaude, dt as evaluateSessionFreshness, et as normalizeSessionDeliveryFields, f as isGoogleModelApi, ft as resolveChannelResetConfig, g as formatBillingErrorMessage, gt as DEFAULT_RESET_TRIGGERS, h as formatAssistantErrorText, ht as resolveThreadFlag, it as countToolResults, j as parseImageDimensionError, jt as resolveExistingPathsWithinRoot, k as isTimeoutErrorMessage, kt as resolveProfile, l as extractToolResultId, lt as normalizeInputProvenance, m as classifyFailoverReason, mt as resolveSessionResetType, n as validateGeminiTurns, nt as archiveSessionTranscripts, o as normalizeTextForComparison, ot as INPUT_PROVENANCE_KIND_VALUES, p as BILLING_ERROR_USER_MESSAGE, pt as resolveSessionResetPolicy, q as updateSessionStoreEntry, qt as buildBootstrapContextFiles, r as pickFallbackThinkingLevel, rt as capArrayByJsonBytes, s as sanitizeSessionMessagesImages, st as applyInputProvenanceToUserMessage, t as validateAnthropicTurns, tt as normalizeAccountId$3, u as downgradeOpenAIReasoningBlocks, ut as resolveSessionKey, v as getApiErrorPayloadFingerprint, vt as canonicalizeMainSessionAlias, w as isFailoverAssistantError, wt as acquireSessionWriteLock, x as isCloudCodeAssistFormatError, xt as resolveMainSessionKey, y as isAuthAssistantError, z as appendAssistantMessageToSessionTranscript, zt as expandPolicyWithPluginGroups } from "./pi-embedded-helpers-pubKo8HQ.js";
13
+ import { $ as normalizeDeliveryContext, A as isTransientHttpError, At as DEFAULT_UPLOAD_DIR, Bt as expandToolGroups, C as isContextOverflowError, Ct as resolveGroupSessionKey, D as isRateLimitAssistantError, Dt as registerBrowserRoutes, E as isLikelyContextOverflowError, Et as createBrowserRouteContext, F as resolveSandboxContext, Ft as resolveSandboxConfigForAgent, G as updateLastRoute, Gt as compileGlobPatterns, H as loadSessionStore, Ht as normalizeToolName, I as resolveSandboxRuntimeStatus, It as applyOwnerOnlyToolPolicy, J as isCacheEnabled, Jt as ensureSessionHeader, K as updateSessionStore, Kt as matchesAnyGlobPattern, L as extractDeliveryInfo, Lt as buildPluginToolGroups, M as parseImageSizeError, Mt as getBridgeAuthForPort, N as sanitizeUserFacingText, Nt as ensureBrowserControlAuth, O as isRawApiErrorPayload, Ot as resolveBrowserConfig, P as ensureSandboxWorkspaceForSession, Pt as resolveBrowserControlAuth, Q as mergeDeliveryContext, R as parseSessionThreadInfo, Rt as collectExplicitAllowlist, S as isCompactionFailureError, St as deriveSessionMetaPatch, T as isFailoverErrorMessage, Tt as resolveSessionLockMaxHoldFromTimeout, U as readSessionUpdatedAt, Ut as resolveToolProfilePolicy, V as resolveAndPersistSessionFile, Vt as mergeAlsoAllowPolicy, W as recordSessionMetaFromInbound, Wt as stripPluginOnlyAllowlist, X as deliveryContextFromSession, Xt as resolveBootstrapTotalMaxChars, Y as resolveCacheTtlMs$1, Yt as resolveBootstrapMaxChars, Z as deliveryContextKey, Zt as sanitizeGoogleTurnOrdering, _ as formatRawAssistantErrorForUi, _t as resolveFreshSessionTotalTokens, a as isMessagingToolDuplicateNormalized, at as extractToolCallNames, b as isBillingAssistantError, bt as resolveExplicitAgentSessionKey, c as extractToolCallsFromAssistant, ct as hasInterSessionUserProvenance, d as isAntigravityClaude, dt as evaluateSessionFreshness, et as normalizeSessionDeliveryFields, f as isGoogleModelApi, ft as resolveChannelResetConfig, g as formatBillingErrorMessage, gt as DEFAULT_RESET_TRIGGERS, h as formatAssistantErrorText, ht as resolveThreadFlag, it as countToolResults, j as parseImageDimensionError, jt as resolveExistingPathsWithinRoot, k as isTimeoutErrorMessage, kt as resolveProfile, l as extractToolResultId, lt as normalizeInputProvenance, m as classifyFailoverReason, mt as resolveSessionResetType, n as validateGeminiTurns, nt as archiveSessionTranscripts, o as normalizeTextForComparison, ot as INPUT_PROVENANCE_KIND_VALUES, p as BILLING_ERROR_USER_MESSAGE, pt as resolveSessionResetPolicy, q as updateSessionStoreEntry, qt as buildBootstrapContextFiles, r as pickFallbackThinkingLevel, rt as capArrayByJsonBytes, s as sanitizeSessionMessagesImages, st as applyInputProvenanceToUserMessage, t as validateAnthropicTurns, tt as normalizeAccountId$3, u as downgradeOpenAIReasoningBlocks, ut as resolveSessionKey, v as getApiErrorPayloadFingerprint, vt as canonicalizeMainSessionAlias, w as isFailoverAssistantError, wt as acquireSessionWriteLock, x as isCloudCodeAssistFormatError, xt as resolveMainSessionKey, y as isAuthAssistantError, z as appendAssistantMessageToSessionTranscript, zt as expandPolicyWithPluginGroups } from "./pi-embedded-helpers-CfqDGQ9J.js";
14
14
  import { A as VERSION, C as getConfigValueAtPath, D as isSafeExecutableValue, E as unsetConfigValueAtPath, O as DEFAULT_SUBAGENT_MAX_SPAWN_DEPTH, S as unsetConfigOverride, T as setConfigValueAtPath, _ as parseDurationMs, a as writeConfigFile, b as resetConfigOverrides, c as TELEGRAM_COMMAND_NAME_PATTERN, f as isInboundPathAllowed, g as normalizeScpRemoteHost, h as resolveIMessageRemoteAttachmentRoots, i as resolveConfigSnapshotHash, k as resolveAgentMaxConcurrent, l as normalizeTelegramCommandName, m as resolveIMessageAttachmentRoots, n as loadConfig, o as validateConfigObjectWithPlugins, r as readConfigFileSnapshot, u as resolveTelegramCustomCommands, v as validateJsonSchemaValue, w as parseConfigPath, x as setConfigOverride, y as getConfigOverrides } from "./config-5SdHIcHU.js";
15
15
  import { a as applyTestPluginDefaults, c as resolveMemorySlotDecision, d as isDangerousHostEnvVarName, i as safeStatSync, n as discoverSymiPlugins, o as normalizePluginsConfig, r as isPathInside, s as resolveEnableState, t as loadPluginManifestRegistry, u as isPathInsideWithRealpath } from "./manifest-registry-yb7sAlu4.js";
16
- import { C as rawDataToString, O as DEFAULT_AI_SNAPSHOT_MAX_CHARS, T as isSecureWebSocketUrl, x as ensureChromeExtensionRelayServer } from "./chrome-DYZwl5Gv.js";
16
+ import { C as rawDataToString, O as DEFAULT_AI_SNAPSHOT_MAX_CHARS, T as isSecureWebSocketUrl, x as ensureChromeExtensionRelayServer } from "./chrome-DkaXoP36.js";
17
17
  import { c as assertSandboxPath, d as resolveSandboxedMediaSource, f as applySkillEnvOverrides, i as resolveSkillsPromptForRun, l as resolveSandboxInputPath, n as buildWorkspaceSkillSnapshot, p as applySkillEnvOverridesFromSnapshot, r as loadWorkspaceSkillEntries, s as assertMediaNotDataUrl } from "./skills-Bs0AW1g3.js";
18
18
  import { n as formatErrorMessage, r as formatUncaughtError } from "./errors-XIsvXeC-.js";
19
19
  import { c as detectMime, d as imageMimeFromFormat, f as isAudioFileName, g as MAX_IMAGE_BYTES, i as getImageMetadata, l as extensionForMime, p as isGifMedia, s as resizeToJpeg, v as mediaKindFromMime } from "./image-ops-C7CauEK8.js";
@@ -31,10 +31,10 @@ import { a as resolveSlackWebClientOptions, c as buildSlackBlocksFallbackText, i
31
31
  import { $ as fetchChannelPermissionsDiscord, A as unpinMessageDiscord, B as listScheduledEventsDiscord, C as editMessageDiscord, Ct as resolveTimestampMs, D as pinMessageDiscord, Dt as normalizeChannelSlug, E as listThreadsDiscord, Et as buildChannelKeyCandidates, F as fetchMemberInfoDiscord, G as uploadStickerDiscord, H as timeoutMemberDiscord, I as fetchRoleInfoDiscord, J as editChannelDiscord, K as createChannelDiscord, L as fetchVoiceStatusDiscord, M as banMemberDiscord, N as createScheduledEventDiscord, O as readMessagesDiscord, Ot as resolveChannelEntryMatchWithFallback, P as fetchChannelInfoDiscord, Q as stripUndefinedFields, R as kickMemberDiscord, S as deleteMessageDiscord, St as resolveDiscordSystemLocation, T as listPinsDiscord, Tt as applyChannelMatchMeta, U as listGuildEmojisDiscord, V as removeRoleDiscord, W as uploadEmojiDiscord, X as removeChannelPermissionDiscord, Y as moveChannelDiscord, Z as setChannelPermissionDiscord, _ as sendPollDiscord, _t as resolveDiscordShouldRequireMention, a as removeReactionDiscord, at as resolveDiscordChannelId, b as sendWebhookMessageDiscord, bt as formatDiscordReactionEmoji, c as formatDiscordComponentEventText, ct as allowListMatches$1, d as parseDiscordModalCustomId, dt as normalizeDiscordSlug, et as hasAnyGuildPermissionDiscord, f as parseDiscordModalCustomIdForCarbon, ft as resolveDiscordAllowListMatch, g as sendMessageDiscord, gt as resolveDiscordOwnerAllowFrom, h as resolveDiscordModalEntry, ht as resolveDiscordMemberAccessState, i as removeOwnReactionsDiscord, it as parseDiscordTarget, j as addRoleDiscord, k as searchMessagesDiscord, l as parseDiscordComponentCustomId, lt as isDiscordGroupAllowedByPolicy, m as resolveDiscordComponentEntry, mt as resolveDiscordGuildEntry, n as fetchReactionsDiscord, nt as createDiscordClient, o as sendDiscordComponentMessage, ot as listDiscordDirectoryGroupsLive, p as readDiscordComponentSpec, pt as resolveDiscordChannelConfigWithFallback, q as deleteChannelDiscord, r as reactMessageDiscord, rt as createDiscordRestClient, s as createDiscordFormModal, st as listDiscordDirectoryPeersLive, tt as chunkDiscordTextWithMode, u as parseDiscordComponentCustomIdForCarbon, ut as normalizeDiscordAllowList, v as sendStickerDiscord, vt as resolveGroupDmAllow, w as fetchMessageDiscord, wt as fetchDiscord, x as createThreadDiscord, xt as formatDiscordUserTag, y as sendVoiceMessageDiscord, yt as shouldEmitDiscordReactionNotification, z as listGuildChannelsDiscord } from "./send-CvhXrdgS.js";
32
32
  import { t as emitSessionTranscriptUpdate } from "./transcript-events-BBh3Gsrx.js";
33
33
  import { i as resolveImageSanitizationLimits, n as sanitizeImageBlocks, r as sanitizeToolResultImages } from "./tool-images-SqqWIT22.js";
34
- import { C as getGlobalHookRunner, S as parseInlineDirectives$1, _ as normalizeTargetForProvider, a as normalizeOutboundPayloadsForJson, b as MEDIA_TOKEN_RE, c as applyReplyThreading, d as isRenderablePayload, f as shouldSuppressMessagingToolReplies, g as normalizeChannelTargetInput, h as buildTargetResolverSignature, i as normalizeOutboundPayloads, l as filterMessagingToolDuplicates, m as resolveReplyToMode, o as normalizeReplyPayloadsForDelivery, p as createReplyToModeFilterForChannel, r as formatOutboundPayloadLog, s as applyReplyTagsToPayload, t as deliverOutboundPayloads, u as filterMessagingToolMediaDuplicates, v as throwIfAborted, w as initializeGlobalHookRunner, x as splitMediaFromOutput, y as parseReplyDirectives } from "./deliver-dODxSv3b.js";
34
+ import { C as getGlobalHookRunner, S as parseInlineDirectives$1, _ as normalizeTargetForProvider, a as normalizeOutboundPayloadsForJson, b as MEDIA_TOKEN_RE, c as applyReplyThreading, d as isRenderablePayload, f as shouldSuppressMessagingToolReplies, g as normalizeChannelTargetInput, h as buildTargetResolverSignature, i as normalizeOutboundPayloads, l as filterMessagingToolDuplicates, m as resolveReplyToMode, o as normalizeReplyPayloadsForDelivery, p as createReplyToModeFilterForChannel, r as formatOutboundPayloadLog, s as applyReplyTagsToPayload, t as deliverOutboundPayloads, u as filterMessagingToolMediaDuplicates, v as throwIfAborted, w as initializeGlobalHookRunner, x as splitMediaFromOutput, y as parseReplyDirectives } from "./deliver-C46-vyqg.js";
35
35
  import { a as logMessageProcessed, c as logWebhookError, d as startDiagnosticHeartbeat, f as stopDiagnosticHeartbeat, i as logLaneEnqueue, l as logWebhookProcessed, m as isDiagnosticsEnabled, o as logMessageQueued, p as emitDiagnosticEvent, r as logLaneDequeue, s as logSessionStateChange, t as diag, u as logWebhookReceived } from "./diagnostic-rPhsBoZz.js";
36
36
  import { r as getDiagnosticSessionState } from "./diagnostic-session-state-Zw87xFym.js";
37
- import { S as ensureSymiModelsJson, _ as stripMinimaxToolCallXml, a as decodeDataUrl, b as stripReasoningTagsFromText, c as extractAssistantText$1, d as extractThinkingFromTaggedText, f as formatReasoningMessage, g as stripDowngradedToolCallText, h as promoteThinkingTagsToBlocks, i as coerceImageModelConfig, l as extractAssistantThinking, m as isAssistantMessage, o as resolveProviderVisionModelFromConfig, p as inferToolMetaFromArgs, r as coerceImageAssistantText, s as minimaxUnderstandImage, u as extractThinkingFromTaggedStream, v as stripThinkingTagsFromText, x as extractTextFromChatContent, y as resolveToolDisplay } from "./image-CXu8W39c.js";
37
+ import { S as ensureSymiModelsJson, _ as stripMinimaxToolCallXml, a as decodeDataUrl, b as stripReasoningTagsFromText, c as extractAssistantText$1, d as extractThinkingFromTaggedText, f as formatReasoningMessage, g as stripDowngradedToolCallText, h as promoteThinkingTagsToBlocks, i as coerceImageModelConfig, l as extractAssistantThinking, m as isAssistantMessage, o as resolveProviderVisionModelFromConfig, p as inferToolMetaFromArgs, r as coerceImageAssistantText, s as minimaxUnderstandImage, u as extractThinkingFromTaggedStream, v as stripThinkingTagsFromText, x as extractTextFromChatContent, y as resolveToolDisplay } from "./image-CuzFLQWC.js";
38
38
  import { a as isSilentReplyText, i as isSilentReplyPrefixText, n as SILENT_REPLY_TOKEN, r as SYMIPULSE_TOKEN, t as HEARTBEAT_TOKEN } from "./tokens-Bux9Y_xD.js";
39
39
  import { $ as isVoiceCompatibleAudio, A as extractTelegramLocation, B as normalizeAllowFromWithStore$1, C as buildTelegramGroupFrom, D as buildTypingThreadParams, E as buildTelegramThreadParams, F as resolveTelegramMediaPlaceholder, G as formatLocationText, H as firstDefined$1, I as resolveTelegramReplyId, J as readChannelAllowFromStore, K as toLocationContext, L as resolveTelegramStreamMode, M as normalizeForwardedContext, N as resolveTelegramForumThreadId, O as describeReplyTarget, P as resolveTelegramGroupAllowFromContext, Q as listPairingChannels, R as resolveTelegramThreadSpec, S as buildSenderName, T as buildTelegramParentPeer, U as isSenderIdAllowed, V as resolveSenderAllowMatch, W as mergeAllowFromSources, X as upsertChannelPairingRequest, Y as removeChannelAllowFromStoreEntry, Z as getPairingAdapter, _ as resolveTelegramFetch, a as reactMessageTelegram, b as buildGroupLabel, c as sendStickerTelegram, d as wasSentByBot, et as parseTelegramTarget, f as isRecoverableTelegramNetworkError, g as wrapFileReferencesInHtml, h as renderTelegramHtmlText, i as editMessageTelegram, j as hasBotMention, k as expandTextLinks, m as markdownToTelegramHtml, n as createForumTopicTelegram, o as sendMessageTelegram, p as markdownToTelegramChunks, q as addChannelAllowFromStoreEntry, r as deleteMessageTelegram, s as sendPollTelegram, t as buildInlineKeyboard, tt as resolveTelegramTargetChatType, u as resolveTelegramVoiceSend, v as splitTelegramCaption, w as buildTelegramGroupPeerId, x as buildSenderLabel, y as withTelegramApiErrorLogging, z as isSenderAllowed$1 } from "./send-DYj_o4_F.js";
40
40
  import { n as discoverModels, t as discoverAuthStorage } from "./pi-model-discovery-Bv5YDJc8.js";
@@ -49,7 +49,7 @@ import { n as fetchWithTimeout, t as bindAbortRelay } from "./fetch-timeout-DL3f
49
49
  import { a as readResponseWithLimit, i as fetchRemoteMedia, n as getDefaultMediaLocalRoots, o as fetchWithSsrFGuard, t as getAgentScopedMediaLocalRoots } from "./local-roots-DhZz0Ybs.js";
50
50
  import { a as loadWebMedia, i as getDefaultLocalRoots } from "./ir-CTiz95Vb.js";
51
51
  import { _ as resolveNativeCommandsEnabled, a as listChatCommandsForConfig, c as normalizeCommandBody, d as resolveCommandArgMenu, f as serializeCommandArgs, g as isRestartEnabled, h as isNativeCommandsExplicitlyDisabled, i as listChatCommands, l as parseCommandArgs, m as isCommandFlagEnabled, o as listNativeCommandSpecs, p as shouldHandleTextCommands, r as findCommandByNativeName, s as listNativeCommandSpecsForConfig, t as buildCommandTextFromArgs, u as resolveCommandArgChoices, v as resolveNativeSkillsEnabled } from "./commands-registry-Bfc7Uz0o.js";
52
- import { _ as CLI_OUTPUT_MAX_BUFFER, a as resolveMediaAttachmentLocalRoots, c as loadModelCatalog, d as resolveAttachmentKind, f as buildRandomTempFilePath, g as resolveMediaUnderstandingScope, h as normalizeMediaUnderstandingChatType, i as resolveAutoImageModel, l as modelSupportsVision, m as resolveTimeoutMs$1, n as createMediaAttachmentCache, o as runCapability, p as resolveConcurrency, r as normalizeMediaAttachments, s as findModelInCatalog, t as buildProviderRegistry, v as applyTemplate, y as registerUnhandledRejectionHandler } from "./runner-WAG0M5s9.js";
52
+ import { _ as CLI_OUTPUT_MAX_BUFFER, a as resolveMediaAttachmentLocalRoots, c as loadModelCatalog, d as resolveAttachmentKind, f as buildRandomTempFilePath, g as resolveMediaUnderstandingScope, h as normalizeMediaUnderstandingChatType, i as resolveAutoImageModel, l as modelSupportsVision, m as resolveTimeoutMs$1, n as createMediaAttachmentCache, o as runCapability, p as resolveConcurrency, r as normalizeMediaAttachments, s as findModelInCatalog, t as buildProviderRegistry, v as applyTemplate, y as registerUnhandledRejectionHandler } from "./runner-CU9l0uJh.js";
53
53
  import { c as getSkillsSnapshotVersion, d as createAsyncLock, f as readJsonFile, i as resolveSkillCommandInvocation, l as pruneExpiredPending, n as listSkillCommandsForAgents, o as getRemoteSkillEligibility, p as writeJsonAtomic, r as listSkillCommandsForWorkspace, s as ensureSkillsWatcher, t as listReservedChatSlashCommandNames, u as resolvePairingPaths } from "./skill-commands-DcVwOafC.js";
54
54
  import { r as normalizeInboundTextNewlines, t as finalizeInboundContext } from "./inbound-context-DSDTl6Kj.js";
55
55
  import { n as wrapFetchWithAbortSignal, t as resolveFetch } from "./fetch-Bso4i15F.js";
@@ -80,7 +80,7 @@ import AjvPkg from "ajv";
80
80
  import { CURRENT_SESSION_VERSION, DefaultResourceLoader, SessionManager, SettingsManager, codingTools, createAgentSession, createEditTool, createReadTool, createWriteTool, estimateTokens, generateSummary, readTool } from "@mariozechner/pi-coding-agent";
81
81
  import { createServer } from "node:http";
82
82
  import { ProxyAgent, fetch as fetch$1 } from "undici";
83
- import WebSocket, { WebSocket as WebSocket$1 } from "ws";
83
+ import WebSocket$1, { WebSocket } from "ws";
84
84
  import { Buffer as Buffer$1 } from "node:buffer";
85
85
  import { EdgeTTS } from "node-edge-tts";
86
86
  import { createJiti } from "jiti";
@@ -8636,7 +8636,7 @@ var GatewayClient = class {
8636
8636
  if (fingerprint !== expected) return /* @__PURE__ */ new Error("gateway tls fingerprint mismatch");
8637
8637
  });
8638
8638
  }
8639
- this.ws = new WebSocket$1(url, wsOptions);
8639
+ this.ws = new WebSocket(url, wsOptions);
8640
8640
  this.ws.on("open", () => {
8641
8641
  if (url.startsWith("wss://") && this.opts.tlsFingerprint) {
8642
8642
  const tlsError = this.validateTlsFingerprint();
@@ -8855,7 +8855,7 @@ var GatewayClient = class {
8855
8855
  return null;
8856
8856
  }
8857
8857
  async request(method, params, opts) {
8858
- if (!this.ws || this.ws.readyState !== WebSocket$1.OPEN) throw new Error("gateway not connected");
8858
+ if (!this.ws || this.ws.readyState !== WebSocket.OPEN) throw new Error("gateway not connected");
8859
8859
  const id = randomUUID();
8860
8860
  const frame = {
8861
8861
  type: "req",
@@ -10121,7 +10121,7 @@ async function routeReply(params) {
10121
10121
  const resolvedReplyToId = replyToId ?? (channelId === "slack" && threadId != null && threadId !== "" ? String(threadId) : void 0);
10122
10122
  const resolvedThreadId = channelId === "slack" ? null : threadId ?? null;
10123
10123
  try {
10124
- const { deliverOutboundPayloads } = await import("./deliver-dODxSv3b.js").then((n) => n.n);
10124
+ const { deliverOutboundPayloads } = await import("./deliver-C46-vyqg.js").then((n) => n.n);
10125
10125
  return {
10126
10126
  ok: true,
10127
10127
  messageId: (await deliverOutboundPayloads({
@@ -43560,7 +43560,7 @@ async function deliverSessionMaintenanceWarning(params) {
43560
43560
  return;
43561
43561
  }
43562
43562
  try {
43563
- const { deliverOutboundPayloads } = await import("./deliver-dODxSv3b.js").then((n) => n.n);
43563
+ const { deliverOutboundPayloads } = await import("./deliver-C46-vyqg.js").then((n) => n.n);
43564
43564
  await deliverOutboundPayloads({
43565
43565
  cfg: params.cfg,
43566
43566
  channel,
@@ -47006,7 +47006,7 @@ async function describeStickerImage(params) {
47006
47006
  logVerbose(`telegram: describing sticker with ${provider}/${model}`);
47007
47007
  try {
47008
47008
  const buffer = await fs$1.readFile(imagePath);
47009
- const { describeImageWithModel } = await import("./image-CXu8W39c.js").then((n) => n.n);
47009
+ const { describeImageWithModel } = await import("./image-CuzFLQWC.js").then((n) => n.n);
47010
47010
  return (await describeImageWithModel({
47011
47011
  buffer,
47012
47012
  fileName: "sticker.webp",
@@ -49668,7 +49668,7 @@ async function preflightDiscordMessage(params) {
49668
49668
  let preflightTranscript;
49669
49669
  const hasAudioAttachment = message.attachments?.some((att) => att.contentType?.startsWith("audio/"));
49670
49670
  if (!isDirectMessage && shouldRequireMention && hasAudioAttachment && !baseText && mentionRegexes.length > 0) try {
49671
- const { transcribeFirstAudio } = await import("./audio-preflight-DHTaS5U1.js");
49671
+ const { transcribeFirstAudio } = await import("./audio-preflight-BVaaZWkg.js");
49672
49672
  const audioPaths = message.attachments?.filter((att) => att.contentType?.startsWith("audio/")).map((att) => att.url) ?? [];
49673
49673
  if (audioPaths.length > 0) preflightTranscript = await transcribeFirstAudio({
49674
49674
  ctx: {
@@ -53674,7 +53674,7 @@ function isVoiceChannelType(type) {
53674
53674
  function createDefaultDeps() {
53675
53675
  return {
53676
53676
  sendMessageWhatsApp: async (...args) => {
53677
- const { sendMessageWhatsApp } = await import("./web--erunODY.js");
53677
+ const { sendMessageWhatsApp } = await import("./web-DLkEjSYp.js");
53678
53678
  return await sendMessageWhatsApp(...args);
53679
53679
  },
53680
53680
  sendMessageTelegram: async (...args) => {
@@ -56579,7 +56579,7 @@ function createDiscordGatewayPlugin(params) {
56579
56579
  super(options);
56580
56580
  }
56581
56581
  createWebSocket(url) {
56582
- return new WebSocket(url, { agent });
56582
+ return new WebSocket$1(url, { agent });
56583
56583
  }
56584
56584
  }
56585
56585
  return new ProxyGatewayPlugin();
@@ -66797,7 +66797,7 @@ const buildTelegramMessageContext = async ({ primaryCtx, allMedia, storeAllowFro
66797
66797
  const hasAudio = allMedia.some((media) => media.contentType?.startsWith("audio/"));
66798
66798
  let preflightTranscript;
66799
66799
  if (isGroup && requireMention && hasAudio && !hasUserText && mentionRegexes.length > 0) try {
66800
- const { transcribeFirstAudio } = await import("./audio-preflight-DHTaS5U1.js");
66800
+ const { transcribeFirstAudio } = await import("./audio-preflight-BVaaZWkg.js");
66801
66801
  preflightTranscript = await transcribeFirstAudio({
66802
66802
  ctx: {
66803
66803
  MediaPaths: allMedia.length > 0 ? allMedia.map((m) => m.path) : void 0,
@@ -68954,7 +68954,7 @@ function loadWebLoginQr() {
68954
68954
  return webLoginQrPromise;
68955
68955
  }
68956
68956
  function loadWebChannel() {
68957
- webChannelPromise ??= import("./web--erunODY.js");
68957
+ webChannelPromise ??= import("./web-DLkEjSYp.js");
68958
68958
  return webChannelPromise;
68959
68959
  }
68960
68960
  function loadWhatsAppActions() {
@@ -75497,6 +75497,175 @@ function subscribeEmbeddedPiSession(params) {
75497
75497
  * @module
75498
75498
  */
75499
75499
  /**
75500
+ * Known shell commands for prefix deduplication.
75501
+ * When token boundary corruption doubles a command prefix (grep → grgrep,
75502
+ * ls → lsls), we check the first token against this set. If stripping
75503
+ * the repeated prefix yields a known command, use it.
75504
+ *
75505
+ * O(1) lookup. Zero false positives — no valid command is its own prefix doubled.
75506
+ */
75507
+ const KNOWN_COMMANDS = new Set([
75508
+ "ls",
75509
+ "cat",
75510
+ "cp",
75511
+ "mv",
75512
+ "rm",
75513
+ "mkdir",
75514
+ "rmdir",
75515
+ "touch",
75516
+ "chmod",
75517
+ "chown",
75518
+ "chgrp",
75519
+ "ln",
75520
+ "pwd",
75521
+ "echo",
75522
+ "printf",
75523
+ "head",
75524
+ "tail",
75525
+ "wc",
75526
+ "sort",
75527
+ "uniq",
75528
+ "cut",
75529
+ "tr",
75530
+ "tee",
75531
+ "xargs",
75532
+ "env",
75533
+ "date",
75534
+ "sleep",
75535
+ "true",
75536
+ "false",
75537
+ "yes",
75538
+ "test",
75539
+ "expr",
75540
+ "basename",
75541
+ "dirname",
75542
+ "readlink",
75543
+ "realpath",
75544
+ "mktemp",
75545
+ "stat",
75546
+ "file",
75547
+ "dd",
75548
+ "df",
75549
+ "du",
75550
+ "id",
75551
+ "whoami",
75552
+ "hostname",
75553
+ "uname",
75554
+ "grep",
75555
+ "egrep",
75556
+ "fgrep",
75557
+ "find",
75558
+ "locate",
75559
+ "sed",
75560
+ "awk",
75561
+ "diff",
75562
+ "patch",
75563
+ "strings",
75564
+ "less",
75565
+ "more",
75566
+ "tar",
75567
+ "gzip",
75568
+ "gunzip",
75569
+ "zip",
75570
+ "unzip",
75571
+ "bzip2",
75572
+ "xz",
75573
+ "curl",
75574
+ "wget",
75575
+ "ssh",
75576
+ "scp",
75577
+ "rsync",
75578
+ "ping",
75579
+ "dig",
75580
+ "nslookup",
75581
+ "netstat",
75582
+ "lsof",
75583
+ "nc",
75584
+ "ifconfig",
75585
+ "ip",
75586
+ "ps",
75587
+ "top",
75588
+ "kill",
75589
+ "killall",
75590
+ "nohup",
75591
+ "nice",
75592
+ "which",
75593
+ "type",
75594
+ "where",
75595
+ "man",
75596
+ "sudo",
75597
+ "su",
75598
+ "mount",
75599
+ "umount",
75600
+ "systemctl",
75601
+ "journalctl",
75602
+ "launchctl",
75603
+ "dmesg",
75604
+ "sysctl",
75605
+ "git",
75606
+ "make",
75607
+ "gcc",
75608
+ "python",
75609
+ "python3",
75610
+ "pip",
75611
+ "pip3",
75612
+ "node",
75613
+ "npm",
75614
+ "npx",
75615
+ "pnpm",
75616
+ "yarn",
75617
+ "cargo",
75618
+ "go",
75619
+ "ruby",
75620
+ "gem",
75621
+ "java",
75622
+ "javac",
75623
+ "docker",
75624
+ "brew",
75625
+ "open",
75626
+ "pbcopy",
75627
+ "pbpaste",
75628
+ "defaults",
75629
+ "diskutil",
75630
+ "sw_vers",
75631
+ "system_profiler",
75632
+ "plutil",
75633
+ "mdfind",
75634
+ "mdls",
75635
+ "softwareupdate",
75636
+ "caffeinate",
75637
+ "say",
75638
+ "osascript",
75639
+ "security",
75640
+ "codesign",
75641
+ "hdiutil",
75642
+ "installer",
75643
+ "lipo",
75644
+ "otool",
75645
+ "dscl",
75646
+ "scutil"
75647
+ ]);
75648
+ /**
75649
+ * Fix command prefix duplication from token boundary splits.
75650
+ * Token corruption can double a multi-char prefix: grep → grgrep, ls → lsls.
75651
+ * Check if the first token starts with a repeated prefix that, when removed,
75652
+ * yields a known command.
75653
+ *
75654
+ * Examples: grgrep → grep, lsls → ls, catcat → cat, curlcurl → curl
75655
+ */
75656
+ function dedupCommandPrefix(command) {
75657
+ const match = command.match(/^([a-zA-Z0-9_-]+)/);
75658
+ if (!match) return command;
75659
+ const firstToken = match[1];
75660
+ if (KNOWN_COMMANDS.has(firstToken)) return command;
75661
+ for (let prefixLen = 2; prefixLen <= Math.min(10, Math.floor(firstToken.length / 2)); prefixLen++) {
75662
+ const prefix = firstToken.slice(0, prefixLen);
75663
+ const candidate = firstToken.slice(prefixLen);
75664
+ if (candidate.startsWith(prefix.slice(0, Math.min(prefix.length, candidate.length))) && KNOWN_COMMANDS.has(candidate)) return candidate + command.slice(firstToken.length);
75665
+ }
75666
+ return command;
75667
+ }
75668
+ /**
75500
75669
  * Validate that a command string contains extractable valid shell syntax.
75501
75670
  * Returns the cleaned command if valid, or an error reason if not.
75502
75671
  *
@@ -75515,6 +75684,7 @@ function validateShellCommand(command) {
75515
75684
  cleaned = cleaned.replace(/<\|[^|>]*(?:\|>)?/g, "").trim();
75516
75685
  cleaned = cleanResidualTokenFragments(cleaned);
75517
75686
  }
75687
+ cleaned = dedupCommandPrefix(cleaned);
75518
75688
  if (!cleaned || !cleaned.trim()) return {
75519
75689
  valid: false,
75520
75690
  cleaned: "",
@@ -1,7 +1,7 @@
1
1
  import { g as resolveStateDir } from "./paths-Cqn-zk3M.js";
2
2
  import { B as theme, h as pathExists } from "./utils-B-0b9bGM.js";
3
3
  import "./thinking-EAliFiVK.js";
4
- import { V as trimLogTail } from "./reply-DUZvOCsG.js";
4
+ import { V as trimLogTail } from "./reply-B2Xur-75.js";
5
5
  import { t as resolveSymiPackageRoot } from "./symi-root-CrGJbkzf.js";
6
6
  import "./registry-Cja8eT7G.js";
7
7
  import { f as defaultRuntime } from "./subsystem-D9vIQve0.js";
@@ -106,7 +106,7 @@ import "./stagger-BUClb97_.js";
106
106
  import { c as resolveGatewayLaunchAgentLabel, d as resolveGatewaySystemdServiceName, f as resolveGatewayWindowsTaskName } from "./constants-C8_BLnaW.js";
107
107
  import "./channel-selection-DuWs0Aak.js";
108
108
  import { r as parseSemver } from "./runtime-guard-B37eizu-.js";
109
- import "./program-context-BBtSJunF.js";
109
+ import "./program-context-DFKRAsbt.js";
110
110
  import "./catalog-RiADx7MA.js";
111
111
  import "./skills-status-CURJKnyY.js";
112
112
  import { n as inheritOptionFromParent } from "./command-options-BtDai3oC.js";
@@ -117,7 +117,7 @@ import "./npm-registry-spec-C2JDdSZS.js";
117
117
  import "./skill-scanner-CLs8u6vQ.js";
118
118
  import "./installs-C1Cebk97.js";
119
119
  import "./channels-status-issues-B_kBkl_u.js";
120
- import { r as installCompletion } from "./completion-cli-BKm12loU.js";
120
+ import { r as installCompletion } from "./completion-cli-DhhIPri-.js";
121
121
  import "./daemon-runtime-2mwX-jqj.js";
122
122
  import "./systemd-riq8uNJQ.js";
123
123
  import { t as resolveGatewayService } from "./service-Cl74hx8J.js";
@@ -126,19 +126,19 @@ import "./systemd-hints-BR6gChwm.js";
126
126
  import { i as runDaemonInstall, r as runDaemonRestart } from "./daemon-cli-DscwlsKW.js";
127
127
  import "./diagnostics-BAMlsVVX.js";
128
128
  import { t as renderTable } from "./table-BTgkRafz.js";
129
- import "./health-B32Q-KYM.js";
129
+ import "./health-wZyomt2k.js";
130
130
  import "./control-ui-assets-Z947tKLt.js";
131
131
  import { a as resolveNpmChannelTag, c as DEFAULT_PACKAGE_CHANNEL, d as formatUpdateChannelLabel, g as resolveUpdateChannelDisplay, h as resolveEffectiveUpdateChannel, m as normalizeUpdateChannel, n as compareSemverStrings, r as fetchNpmTagVersion, s as DEFAULT_GIT_CHANNEL, t as checkUpdateStatus, u as channelToNpmTag } from "./update-check-CtckACbb.js";
132
132
  import "./dm-policy-shared-Bh3TbexU.js";
133
133
  import { i as resolveUpdateAvailability, n as formatUpdateOneLiner, t as formatUpdateAvailableHint } from "./status.update-DtwCUTf-.js";
134
- import { a as globalInstallArgs, c as readPackageVersion, i as detectGlobalInstallManagerForRoot, n as cleanupGlobalRenameDirs, o as resolveGlobalPackageRoot, r as detectGlobalInstallManagerByPresence, s as readPackageName, t as runGatewayUpdate } from "./update-runner-DvZOsoQs.js";
134
+ import { a as globalInstallArgs, c as readPackageVersion, i as detectGlobalInstallManagerForRoot, n as cleanupGlobalRenameDirs, o as resolveGlobalPackageRoot, r as detectGlobalInstallManagerByPresence, s as readPackageName, t as runGatewayUpdate } from "./update-runner-Bssy0nSl.js";
135
135
  import "./logging-BzzwiKjv.js";
136
136
  import { n as updateNpmInstalledPlugins, t as syncPluginsForUpdateChannel } from "./update-rw7wJwHd.js";
137
137
  import "./doctor-config-flow-QnaBd8kL.js";
138
138
  import "./systemd-linger-aQ75ZlXY.js";
139
139
  import "./health-format-DSwnXZPU.js";
140
- import { n as doctorCommand, t as selectStyled } from "./prompt-select-styled-DUXeA9Zp.js";
141
- import { r as ensureCompletionCacheExists, t as checkShellCompletionStatus } from "./doctor-completion-SEerte2S.js";
140
+ import { n as doctorCommand, t as selectStyled } from "./prompt-select-styled-B5bx2NEB.js";
141
+ import { r as ensureCompletionCacheExists, t as checkShellCompletionStatus } from "./doctor-completion-BBki2Ufk.js";
142
142
  import os from "node:os";
143
143
  import path from "node:path";
144
144
  import fs from "node:fs/promises";