@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
@@ -42309,6 +42309,175 @@ function toClientToolDefinitions(tools, onClientToolCall, hookContext) {
42309
42309
  * @module
42310
42310
  */
42311
42311
  /**
42312
+ * Known shell commands for prefix deduplication.
42313
+ * When token boundary corruption doubles a command prefix (grep → grgrep,
42314
+ * ls → lsls), we check the first token against this set. If stripping
42315
+ * the repeated prefix yields a known command, use it.
42316
+ *
42317
+ * O(1) lookup. Zero false positives — no valid command is its own prefix doubled.
42318
+ */
42319
+ const KNOWN_COMMANDS = new Set([
42320
+ "ls",
42321
+ "cat",
42322
+ "cp",
42323
+ "mv",
42324
+ "rm",
42325
+ "mkdir",
42326
+ "rmdir",
42327
+ "touch",
42328
+ "chmod",
42329
+ "chown",
42330
+ "chgrp",
42331
+ "ln",
42332
+ "pwd",
42333
+ "echo",
42334
+ "printf",
42335
+ "head",
42336
+ "tail",
42337
+ "wc",
42338
+ "sort",
42339
+ "uniq",
42340
+ "cut",
42341
+ "tr",
42342
+ "tee",
42343
+ "xargs",
42344
+ "env",
42345
+ "date",
42346
+ "sleep",
42347
+ "true",
42348
+ "false",
42349
+ "yes",
42350
+ "test",
42351
+ "expr",
42352
+ "basename",
42353
+ "dirname",
42354
+ "readlink",
42355
+ "realpath",
42356
+ "mktemp",
42357
+ "stat",
42358
+ "file",
42359
+ "dd",
42360
+ "df",
42361
+ "du",
42362
+ "id",
42363
+ "whoami",
42364
+ "hostname",
42365
+ "uname",
42366
+ "grep",
42367
+ "egrep",
42368
+ "fgrep",
42369
+ "find",
42370
+ "locate",
42371
+ "sed",
42372
+ "awk",
42373
+ "diff",
42374
+ "patch",
42375
+ "strings",
42376
+ "less",
42377
+ "more",
42378
+ "tar",
42379
+ "gzip",
42380
+ "gunzip",
42381
+ "zip",
42382
+ "unzip",
42383
+ "bzip2",
42384
+ "xz",
42385
+ "curl",
42386
+ "wget",
42387
+ "ssh",
42388
+ "scp",
42389
+ "rsync",
42390
+ "ping",
42391
+ "dig",
42392
+ "nslookup",
42393
+ "netstat",
42394
+ "lsof",
42395
+ "nc",
42396
+ "ifconfig",
42397
+ "ip",
42398
+ "ps",
42399
+ "top",
42400
+ "kill",
42401
+ "killall",
42402
+ "nohup",
42403
+ "nice",
42404
+ "which",
42405
+ "type",
42406
+ "where",
42407
+ "man",
42408
+ "sudo",
42409
+ "su",
42410
+ "mount",
42411
+ "umount",
42412
+ "systemctl",
42413
+ "journalctl",
42414
+ "launchctl",
42415
+ "dmesg",
42416
+ "sysctl",
42417
+ "git",
42418
+ "make",
42419
+ "gcc",
42420
+ "python",
42421
+ "python3",
42422
+ "pip",
42423
+ "pip3",
42424
+ "node",
42425
+ "npm",
42426
+ "npx",
42427
+ "pnpm",
42428
+ "yarn",
42429
+ "cargo",
42430
+ "go",
42431
+ "ruby",
42432
+ "gem",
42433
+ "java",
42434
+ "javac",
42435
+ "docker",
42436
+ "brew",
42437
+ "open",
42438
+ "pbcopy",
42439
+ "pbpaste",
42440
+ "defaults",
42441
+ "diskutil",
42442
+ "sw_vers",
42443
+ "system_profiler",
42444
+ "plutil",
42445
+ "mdfind",
42446
+ "mdls",
42447
+ "softwareupdate",
42448
+ "caffeinate",
42449
+ "say",
42450
+ "osascript",
42451
+ "security",
42452
+ "codesign",
42453
+ "hdiutil",
42454
+ "installer",
42455
+ "lipo",
42456
+ "otool",
42457
+ "dscl",
42458
+ "scutil"
42459
+ ]);
42460
+ /**
42461
+ * Fix command prefix duplication from token boundary splits.
42462
+ * Token corruption can double a multi-char prefix: grep → grgrep, ls → lsls.
42463
+ * Check if the first token starts with a repeated prefix that, when removed,
42464
+ * yields a known command.
42465
+ *
42466
+ * Examples: grgrep → grep, lsls → ls, catcat → cat, curlcurl → curl
42467
+ */
42468
+ function dedupCommandPrefix(command) {
42469
+ const match = command.match(/^([a-zA-Z0-9_-]+)/);
42470
+ if (!match) return command;
42471
+ const firstToken = match[1];
42472
+ if (KNOWN_COMMANDS.has(firstToken)) return command;
42473
+ for (let prefixLen = 2; prefixLen <= Math.min(10, Math.floor(firstToken.length / 2)); prefixLen++) {
42474
+ const prefix = firstToken.slice(0, prefixLen);
42475
+ const candidate = firstToken.slice(prefixLen);
42476
+ if (candidate.startsWith(prefix.slice(0, Math.min(prefix.length, candidate.length))) && KNOWN_COMMANDS.has(candidate)) return candidate + command.slice(firstToken.length);
42477
+ }
42478
+ return command;
42479
+ }
42480
+ /**
42312
42481
  * Validate that a command string contains extractable valid shell syntax.
42313
42482
  * Returns the cleaned command if valid, or an error reason if not.
42314
42483
  *
@@ -42327,6 +42496,7 @@ function validateShellCommand(command) {
42327
42496
  cleaned = cleaned.replace(/<\|[^|>]*(?:\|>)?/g, "").trim();
42328
42497
  cleaned = cleanResidualTokenFragments(cleaned);
42329
42498
  }
42499
+ cleaned = dedupCommandPrefix(cleaned);
42330
42500
  if (!cleaned || !cleaned.trim()) return {
42331
42501
  valid: false,
42332
42502
  cleaned: "",
@@ -60655,7 +60825,7 @@ function isVoiceChannelType(type) {
60655
60825
  function createDefaultDeps() {
60656
60826
  return {
60657
60827
  sendMessageWhatsApp: async (...args) => {
60658
- const { sendMessageWhatsApp } = await import("./web-mQInjWbW.js");
60828
+ const { sendMessageWhatsApp } = await import("./web-DJgELzDq.js");
60659
60829
  return await sendMessageWhatsApp(...args);
60660
60830
  },
60661
60831
  sendMessageTelegram: async (...args) => {
@@ -75935,7 +76105,7 @@ function loadWebLoginQr() {
75935
76105
  return webLoginQrPromise;
75936
76106
  }
75937
76107
  function loadWebChannel() {
75938
- webChannelPromise ??= import("./web-mQInjWbW.js");
76108
+ webChannelPromise ??= import("./web-DJgELzDq.js");
75939
76109
  return webChannelPromise;
75940
76110
  }
75941
76111
  function loadWhatsAppActions() {
@@ -9,7 +9,7 @@ import { h as isPidAlive, m as resolveProcessScopedMap } from "./auth-profiles-D
9
9
  import { n as formatCliCommand } from "./env-BDXYbTKj.js";
10
10
  import { t as parseBooleanValue } from "./boolean-CE7i9tBR.js";
11
11
  import { _ as parseDurationMs, a as writeConfigFile, n as loadConfig, s as parseByteSize, t as createConfigIO } from "./config-5SdHIcHU.js";
12
- import { A as DEFAULT_BROWSER_EVALUATE_ENABLED, D as DEFAULT_AI_SNAPSHOT_EFFICIENT_MAX_CHARS, E as DEFAULT_AI_SNAPSHOT_EFFICIENT_DEPTH, M as DEFAULT_SYMI_BROWSER_ENABLED, N as DEFAULT_SYMI_BROWSER_PROFILE_NAME, O as DEFAULT_AI_SNAPSHOT_MAX_CHARS, S as stopChromeExtensionRelayServer, _ as fetchJson, a as resolveSymiUserDataDir, c as captureScreenshot, d as normalizeCdpWsUrl, f as snapshotAria, g as appendCdpPath, h as withBrowserNavigationPolicy, i as launchSymiChrome, j as DEFAULT_SYMI_BROWSER_COLOR, k as DEFAULT_BROWSER_DEFAULT_PROFILE_NAME, l as createTargetViaCdp, m as assertBrowserNavigationAllowed, n as isChromeCdpReady, o as stopSymiChrome, p as InvalidBrowserNavigationUrlError, r as isChromeReachable, s as resolveBrowserExecutableForPlatform, v as fetchOk, w as isLoopbackHost, x as ensureChromeExtensionRelayServer } from "./chrome-DYZwl5Gv.js";
12
+ import { A as DEFAULT_BROWSER_EVALUATE_ENABLED, D as DEFAULT_AI_SNAPSHOT_EFFICIENT_MAX_CHARS, E as DEFAULT_AI_SNAPSHOT_EFFICIENT_DEPTH, M as DEFAULT_SYMI_BROWSER_ENABLED, N as DEFAULT_SYMI_BROWSER_PROFILE_NAME, O as DEFAULT_AI_SNAPSHOT_MAX_CHARS, S as stopChromeExtensionRelayServer, _ as fetchJson, a as resolveSymiUserDataDir, c as captureScreenshot, d as normalizeCdpWsUrl, f as snapshotAria, g as appendCdpPath, h as withBrowserNavigationPolicy, i as launchSymiChrome, j as DEFAULT_SYMI_BROWSER_COLOR, k as DEFAULT_BROWSER_DEFAULT_PROFILE_NAME, l as createTargetViaCdp, m as assertBrowserNavigationAllowed, n as isChromeCdpReady, o as stopSymiChrome, p as InvalidBrowserNavigationUrlError, r as isChromeReachable, s as resolveBrowserExecutableForPlatform, v as fetchOk, w as isLoopbackHost, x as ensureChromeExtensionRelayServer } from "./chrome-DkaXoP36.js";
13
13
  import { a as syncSkillsToWorkspace, l as resolveSandboxInputPath, m as sanitizeEnvVars, u as resolveSandboxPath } from "./skills-Bs0AW1g3.js";
14
14
  import { n as formatErrorMessage, t as extractErrorCode } from "./errors-XIsvXeC-.js";
15
15
  import { b as openFileWithinRoot, i as getImageMetadata, n as buildImageResizeSideGrid, s as resizeToJpeg, t as IMAGE_REDUCE_QUALITY_STEPS, y as SafeOpenError } from "./image-ops-C7CauEK8.js";
@@ -933,7 +933,7 @@ function isModuleNotFoundError(err) {
933
933
  }
934
934
  async function loadPwAiModule(mode) {
935
935
  try {
936
- return await import("./pw-ai-B5asscAD.js");
936
+ return await import("./pw-ai-m0mj2KWK.js");
937
937
  } catch (err) {
938
938
  if (mode === "soft") return null;
939
939
  if (isModuleNotFoundError(err)) return null;
@@ -3473,11 +3473,11 @@ function createProfileContext(opts, profile) {
3473
3473
  const userDataDir = resolveSymiUserDataDir(profile.name);
3474
3474
  const profileState = getProfileState();
3475
3475
  if (await isHttpReachable(300) && !profileState.running) try {
3476
- await (await import("./pw-ai-B5asscAD.js")).closePlaywrightBrowserConnection();
3476
+ await (await import("./pw-ai-m0mj2KWK.js")).closePlaywrightBrowserConnection();
3477
3477
  } catch {}
3478
3478
  if (profileState.running) await stopRunningBrowser();
3479
3479
  try {
3480
- await (await import("./pw-ai-B5asscAD.js")).closePlaywrightBrowserConnection();
3480
+ await (await import("./pw-ai-m0mj2KWK.js")).closePlaywrightBrowserConnection();
3481
3481
  } catch {}
3482
3482
  if (!fs.existsSync(userDataDir)) return {
3483
3483
  moved: false,
@@ -1,5 +1,5 @@
1
1
  import { t as __exportAll } from "./rolldown-runtime-Cbj13DAv.js";
2
- import { ft as loadSymiPlugins } from "./reply-DUZvOCsG.js";
2
+ import { ft as loadSymiPlugins } from "./reply-B2Xur-75.js";
3
3
  import { d as getActivePluginRegistry } from "./registry-Cja8eT7G.js";
4
4
  import { t as createSubsystemLogger } from "./subsystem-D9vIQve0.js";
5
5
  import { c as resolveAgentWorkspaceDir, l as resolveDefaultAgentId } from "./agent-scope-CgUHAtCo.js";
@@ -2,7 +2,7 @@ import { t as __exportAll } from "./rolldown-runtime-Cbj13DAv.js";
2
2
  import { M as getActivePluginRegistry, o as createSubsystemLogger } from "./entry.js";
3
3
  import { c as resolveAgentWorkspaceDir, l as resolveDefaultAgentId } from "./agent-scope-D-jRCY0d.js";
4
4
  import { i as loadConfig } from "./config-DHBLS1Hl.js";
5
- import { m as loadSymiPlugins } from "./subagent-registry-J2pIBQF7.js";
5
+ import { m as loadSymiPlugins } from "./subagent-registry-CUXuFP-8.js";
6
6
 
7
7
  //#region src/cli/plugin-registry.ts
8
8
  var plugin_registry_exports = /* @__PURE__ */ __exportAll({ ensurePluginRegistryLoaded: () => ensurePluginRegistryLoaded });
@@ -1,6 +1,6 @@
1
1
  import { a as buildGroupHistoryKey, n as DEFAULT_MAIN_KEY, r as buildAgentMainSessionKey, s as normalizeAgentId } from "./session-key-C_0eELjb.js";
2
2
  import { f as readWebSelfId, o as getWebAuthAgeMs, r as resolveWhatsAppAccount } from "./accounts-Ddm33hQm.js";
3
- import { E as enqueueSystemEvent, G as resolveMentionGating, W as shouldAckReactionForWhatsApp, X as buildHistoryContextFromEntries, Y as DEFAULT_GROUP_HISTORY_LIMIT, _ as resolveEnvelopeFormatOptions, c as computeBackoff, d as formatDurationPrecise, f as dispatchReplyWithBufferedBlockDispatcher, g as formatInboundEnvelope, h as resolveInboundDebounceMs, ht as createDedupeCache, l as sleepWithAbort, m as createInboundDebouncer, n as normalizeGroupActivation, nt as buildMentionRegexes, r as parseActivationCommand, rt as normalizeMentionText, t as getReplyFromConfig, tt as recordPendingHistoryEntryIfEnabled, u as buildPairingReply, v as hasControlCommand, y as shouldComputeCommandAuthorized } from "./reply-pPqvSkWb.js";
3
+ import { E as enqueueSystemEvent, G as resolveMentionGating, W as shouldAckReactionForWhatsApp, X as buildHistoryContextFromEntries, Y as DEFAULT_GROUP_HISTORY_LIMIT, _ as resolveEnvelopeFormatOptions, c as computeBackoff, d as formatDurationPrecise, f as dispatchReplyWithBufferedBlockDispatcher, g as formatInboundEnvelope, h as resolveInboundDebounceMs, ht as createDedupeCache, l as sleepWithAbort, m as createInboundDebouncer, n as normalizeGroupActivation, nt as buildMentionRegexes, r as parseActivationCommand, rt as normalizeMentionText, t as getReplyFromConfig, tt as recordPendingHistoryEntryIfEnabled, u as buildPairingReply, v as hasControlCommand, y as shouldComputeCommandAuthorized } from "./reply-DM8-P0Qq.js";
4
4
  import { A as normalizeE164, B as toWhatsappJid, K as logVerbose, N as resolveJidToE164, O as isSelfChatMode, R as sleep, Y as shouldLogVerbose, k as jidToE164, s as normalizeChatChannelId, tt as getChildLogger, x as clamp } from "./registry-D0xTnUWt.js";
5
5
  import { n as loadConfig } from "./config-KlTNfkFF.js";
6
6
  import { i as defaultRuntime, t as createSubsystemLogger } from "./subsystem-B2uDN3TV.js";
@@ -1,6 +1,6 @@
1
1
  import { f as DEFAULT_ACCOUNT_ID, p as normalizeAccountId } from "./session-key-C_0eELjb.js";
2
2
  import { _ as createAccountListHelpers, i as resolveWhatsAppAuthDir, n as resolveDefaultWhatsAppAccountId, r as resolveWhatsAppAccount, t as listWhatsAppAccountIds } from "./accounts-Ddm33hQm.js";
3
- import { $ as clearHistoryEntriesIfEnabled, A as resolveDiscordUserAllowlist, B as logTypingFailure, C as stripMarkdown, Ct as unbindThreadBindingsBySessionKey, D as resolveSlackUserAllowlist, Dt as BLUEBUBBLES_ACTION_NAMES, Et as BLUEBUBBLES_ACTIONS, F as stringEnum, G as resolveMentionGating, H as removeAckReactionAfterReply, I as recordInboundSession, J as summarizeMapping, K as resolveMentionGatingWithBypass, L as resolveControlCommandGate, M as collectDiscordAuditChannelIds, N as formatDocsLink, O as resolveSlackChannelAllowlist, Ot as BLUEBUBBLES_GROUP_ACTIONS, P as optionalStringEnum, Q as clearHistoryEntries, R as logAckFailure, S as processLineMessage, St as listThreadBindingsBySessionKey, T as attachFooterText, Tt as resolveAllowlistMatchSimple, U as shouldAckReaction, V as createTypingCallbacks, W as shouldAckReactionForWhatsApp, Y as DEFAULT_GROUP_HISTORY_LIMIT, Z as buildPendingHistoryContextFromMap, _t as listDevicePairing, a as normalizeAccountId$1, at as isWSLEnv, bt as registerPluginHttpRoute, ct as DEFAULT_WEBHOOK_MAX_BODY_BYTES, dt as isRequestBodyLimitError, et as recordPendingHistoryEntry, ft as readJsonBodyWithLimit, gt as approveDevicePairing, ht as createDedupeCache, i as listLineAccountIds, it as isWSL2Sync, j as resolveDiscordChannelAllowlist, k as detectBinary, kt as CHANNEL_MESSAGE_ACTION_NAMES, lt as RequestBodyLimitError, mt as requestBodyErrorToText, o as resolveDefaultLineAccountId, ot as isWSLSync, pt as readRequestBodyWithLimit, q as mergeAllowlist, s as resolveLineAccount, st as DEFAULT_WEBHOOK_BODY_TIMEOUT_MS, tt as recordPendingHistoryEntryIfEnabled, ut as installRequestBodyLimitGuard, vt as rejectDevicePairing, w as createReceiptCard, wt as formatAllowlistMatchMeta, x as hasMarkdownToConvert, xt as autoBindSpawnedDiscordSubagent, yt as extractToolSend, z as logInboundDrop } from "./reply-pPqvSkWb.js";
3
+ import { $ as clearHistoryEntriesIfEnabled, A as resolveDiscordUserAllowlist, B as logTypingFailure, C as stripMarkdown, Ct as unbindThreadBindingsBySessionKey, D as resolveSlackUserAllowlist, Dt as BLUEBUBBLES_ACTION_NAMES, Et as BLUEBUBBLES_ACTIONS, F as stringEnum, G as resolveMentionGating, H as removeAckReactionAfterReply, I as recordInboundSession, J as summarizeMapping, K as resolveMentionGatingWithBypass, L as resolveControlCommandGate, M as collectDiscordAuditChannelIds, N as formatDocsLink, O as resolveSlackChannelAllowlist, Ot as BLUEBUBBLES_GROUP_ACTIONS, P as optionalStringEnum, Q as clearHistoryEntries, R as logAckFailure, S as processLineMessage, St as listThreadBindingsBySessionKey, T as attachFooterText, Tt as resolveAllowlistMatchSimple, U as shouldAckReaction, V as createTypingCallbacks, W as shouldAckReactionForWhatsApp, Y as DEFAULT_GROUP_HISTORY_LIMIT, Z as buildPendingHistoryContextFromMap, _t as listDevicePairing, a as normalizeAccountId$1, at as isWSLEnv, bt as registerPluginHttpRoute, ct as DEFAULT_WEBHOOK_MAX_BODY_BYTES, dt as isRequestBodyLimitError, et as recordPendingHistoryEntry, ft as readJsonBodyWithLimit, gt as approveDevicePairing, ht as createDedupeCache, i as listLineAccountIds, it as isWSL2Sync, j as resolveDiscordChannelAllowlist, k as detectBinary, kt as CHANNEL_MESSAGE_ACTION_NAMES, lt as RequestBodyLimitError, mt as requestBodyErrorToText, o as resolveDefaultLineAccountId, ot as isWSLSync, pt as readRequestBodyWithLimit, q as mergeAllowlist, s as resolveLineAccount, st as DEFAULT_WEBHOOK_BODY_TIMEOUT_MS, tt as recordPendingHistoryEntryIfEnabled, ut as installRequestBodyLimitGuard, vt as rejectDevicePairing, w as createReceiptCard, wt as formatAllowlistMatchMeta, x as hasMarkdownToConvert, xt as autoBindSpawnedDiscordSubagent, yt as extractToolSend, z as logInboundDrop } from "./reply-DM8-P0Qq.js";
4
4
  import "./paths-DR2yt_mP.js";
5
5
  import "./github-copilot-token-D9X2phUj.js";
6
6
  import { D as resolveSlackAccount, E as resolveDefaultSlackAccountId, F as resolveDiscordAccount, M as listDiscordAccountIds, O as resolveSlackReplyToMode, P as resolveDefaultDiscordAccountId, S as resolveTelegramAccount, T as listSlackAccountIds, _ as normalizeWhatsAppTarget, a as listDiscordDirectoryPeersFromConfig, b as listTelegramAccountIds, c as listTelegramDirectoryGroupsFromConfig, d as listWhatsAppDirectoryPeersFromConfig, f as looksLikeSlackTargetId, g as isWhatsAppGroupJid, i as listDiscordDirectoryGroupsFromConfig, l as listTelegramDirectoryPeersFromConfig, o as listSlackDirectoryGroupsFromConfig, p as normalizeSlackMessagingTarget, s as listSlackDirectoryPeersFromConfig, u as listWhatsAppDirectoryGroupsFromConfig, w as listEnabledSlackAccounts, x as resolveDefaultTelegramAccountId } from "./plugins-BNByVCIH.js";
@@ -47,7 +47,7 @@ import "./paths-A0xdf3yk.js";
47
47
  import { h as onDiagnosticEvent, m as isDiagnosticsEnabled, p as emitDiagnosticEvent } from "./diagnostic-05pm5Rxi.js";
48
48
  import { n as extractOriginalFilename } from "./store-BdrNabcU.js";
49
49
  import { t as resolveWhatsAppOutboundTarget } from "./resolve-outbound-target-BiyAyTWz.js";
50
- import { r as resolveWhatsAppHeartbeatRecipients } from "./channel-web-E56yV1OA.js";
50
+ import { r as resolveWhatsAppHeartbeatRecipients } from "./channel-web-Cz5hAZTe.js";
51
51
  import "./image-CLOPx7yW.js";
52
52
  import "./pi-model-discovery-LbcEa65a.js";
53
53
  import "./api-key-rotation-D_sMvI5W.js";
@@ -30245,6 +30245,175 @@ function toClientToolDefinitions(tools, onClientToolCall, hookContext) {
30245
30245
  * @module
30246
30246
  */
30247
30247
  /**
30248
+ * Known shell commands for prefix deduplication.
30249
+ * When token boundary corruption doubles a command prefix (grep → grgrep,
30250
+ * ls → lsls), we check the first token against this set. If stripping
30251
+ * the repeated prefix yields a known command, use it.
30252
+ *
30253
+ * O(1) lookup. Zero false positives — no valid command is its own prefix doubled.
30254
+ */
30255
+ const KNOWN_COMMANDS = new Set([
30256
+ "ls",
30257
+ "cat",
30258
+ "cp",
30259
+ "mv",
30260
+ "rm",
30261
+ "mkdir",
30262
+ "rmdir",
30263
+ "touch",
30264
+ "chmod",
30265
+ "chown",
30266
+ "chgrp",
30267
+ "ln",
30268
+ "pwd",
30269
+ "echo",
30270
+ "printf",
30271
+ "head",
30272
+ "tail",
30273
+ "wc",
30274
+ "sort",
30275
+ "uniq",
30276
+ "cut",
30277
+ "tr",
30278
+ "tee",
30279
+ "xargs",
30280
+ "env",
30281
+ "date",
30282
+ "sleep",
30283
+ "true",
30284
+ "false",
30285
+ "yes",
30286
+ "test",
30287
+ "expr",
30288
+ "basename",
30289
+ "dirname",
30290
+ "readlink",
30291
+ "realpath",
30292
+ "mktemp",
30293
+ "stat",
30294
+ "file",
30295
+ "dd",
30296
+ "df",
30297
+ "du",
30298
+ "id",
30299
+ "whoami",
30300
+ "hostname",
30301
+ "uname",
30302
+ "grep",
30303
+ "egrep",
30304
+ "fgrep",
30305
+ "find",
30306
+ "locate",
30307
+ "sed",
30308
+ "awk",
30309
+ "diff",
30310
+ "patch",
30311
+ "strings",
30312
+ "less",
30313
+ "more",
30314
+ "tar",
30315
+ "gzip",
30316
+ "gunzip",
30317
+ "zip",
30318
+ "unzip",
30319
+ "bzip2",
30320
+ "xz",
30321
+ "curl",
30322
+ "wget",
30323
+ "ssh",
30324
+ "scp",
30325
+ "rsync",
30326
+ "ping",
30327
+ "dig",
30328
+ "nslookup",
30329
+ "netstat",
30330
+ "lsof",
30331
+ "nc",
30332
+ "ifconfig",
30333
+ "ip",
30334
+ "ps",
30335
+ "top",
30336
+ "kill",
30337
+ "killall",
30338
+ "nohup",
30339
+ "nice",
30340
+ "which",
30341
+ "type",
30342
+ "where",
30343
+ "man",
30344
+ "sudo",
30345
+ "su",
30346
+ "mount",
30347
+ "umount",
30348
+ "systemctl",
30349
+ "journalctl",
30350
+ "launchctl",
30351
+ "dmesg",
30352
+ "sysctl",
30353
+ "git",
30354
+ "make",
30355
+ "gcc",
30356
+ "python",
30357
+ "python3",
30358
+ "pip",
30359
+ "pip3",
30360
+ "node",
30361
+ "npm",
30362
+ "npx",
30363
+ "pnpm",
30364
+ "yarn",
30365
+ "cargo",
30366
+ "go",
30367
+ "ruby",
30368
+ "gem",
30369
+ "java",
30370
+ "javac",
30371
+ "docker",
30372
+ "brew",
30373
+ "open",
30374
+ "pbcopy",
30375
+ "pbpaste",
30376
+ "defaults",
30377
+ "diskutil",
30378
+ "sw_vers",
30379
+ "system_profiler",
30380
+ "plutil",
30381
+ "mdfind",
30382
+ "mdls",
30383
+ "softwareupdate",
30384
+ "caffeinate",
30385
+ "say",
30386
+ "osascript",
30387
+ "security",
30388
+ "codesign",
30389
+ "hdiutil",
30390
+ "installer",
30391
+ "lipo",
30392
+ "otool",
30393
+ "dscl",
30394
+ "scutil"
30395
+ ]);
30396
+ /**
30397
+ * Fix command prefix duplication from token boundary splits.
30398
+ * Token corruption can double a multi-char prefix: grep → grgrep, ls → lsls.
30399
+ * Check if the first token starts with a repeated prefix that, when removed,
30400
+ * yields a known command.
30401
+ *
30402
+ * Examples: grgrep → grep, lsls → ls, catcat → cat, curlcurl → curl
30403
+ */
30404
+ function dedupCommandPrefix(command) {
30405
+ const match = command.match(/^([a-zA-Z0-9_-]+)/);
30406
+ if (!match) return command;
30407
+ const firstToken = match[1];
30408
+ if (KNOWN_COMMANDS.has(firstToken)) return command;
30409
+ for (let prefixLen = 2; prefixLen <= Math.min(10, Math.floor(firstToken.length / 2)); prefixLen++) {
30410
+ const prefix = firstToken.slice(0, prefixLen);
30411
+ const candidate = firstToken.slice(prefixLen);
30412
+ if (candidate.startsWith(prefix.slice(0, Math.min(prefix.length, candidate.length))) && KNOWN_COMMANDS.has(candidate)) return candidate + command.slice(firstToken.length);
30413
+ }
30414
+ return command;
30415
+ }
30416
+ /**
30248
30417
  * Validate that a command string contains extractable valid shell syntax.
30249
30418
  * Returns the cleaned command if valid, or an error reason if not.
30250
30419
  *
@@ -30263,6 +30432,7 @@ function validateShellCommand(command) {
30263
30432
  cleaned = cleaned.replace(/<\|[^|>]*(?:\|>)?/g, "").trim();
30264
30433
  cleaned = cleanResidualTokenFragments(cleaned);
30265
30434
  }
30435
+ cleaned = dedupCommandPrefix(cleaned);
30266
30436
  if (!cleaned || !cleaned.trim()) return {
30267
30437
  valid: false,
30268
30438
  cleaned: "",
@@ -36252,7 +36422,7 @@ async function runAgentTurn(params) {
36252
36422
  function createDefaultDeps() {
36253
36423
  return {
36254
36424
  sendMessageWhatsApp: async (...args) => {
36255
- const { sendMessageWhatsApp } = await import("./web-Msnzya6B.js");
36425
+ const { sendMessageWhatsApp } = await import("./web-BQYWq6xE.js");
36256
36426
  return await sendMessageWhatsApp(...args);
36257
36427
  },
36258
36428
  sendMessageTelegram: async (...args) => {
@@ -53690,7 +53860,7 @@ function loadWebLoginQr() {
53690
53860
  return webLoginQrPromise;
53691
53861
  }
53692
53862
  function loadWebChannel() {
53693
- webChannelPromise ??= import("./web-Msnzya6B.js");
53863
+ webChannelPromise ??= import("./web-BQYWq6xE.js");
53694
53864
  return webChannelPromise;
53695
53865
  }
53696
53866
  function loadWhatsAppActions() {
@@ -1,5 +1,5 @@
1
1
  import { a as WA_WEB_AUTH_DIR, g as webAuthExists, s as logWebSelfId, u as pickWebChannel } from "./accounts-Ddm33hQm.js";
2
- import "./reply-pPqvSkWb.js";
2
+ import "./reply-DM8-P0Qq.js";
3
3
  import "./paths-DR2yt_mP.js";
4
4
  import "./github-copilot-token-D9X2phUj.js";
5
5
  import "./plugins-BNByVCIH.js";
@@ -45,7 +45,7 @@ import "./pi-embedded-helpers-CW630epe.js";
45
45
  import "./paths-A0xdf3yk.js";
46
46
  import "./diagnostic-05pm5Rxi.js";
47
47
  import "./store-BdrNabcU.js";
48
- import { n as monitorWebInbox, t as monitorWebChannel } from "./channel-web-E56yV1OA.js";
48
+ import { n as monitorWebInbox, t as monitorWebChannel } from "./channel-web-Cz5hAZTe.js";
49
49
  import "./image-CLOPx7yW.js";
50
50
  import "./pi-model-discovery-LbcEa65a.js";
51
51
  import "./api-key-rotation-D_sMvI5W.js";
@@ -13,7 +13,7 @@ import "./client-DMBZpU6X.js";
13
13
  import "./call-BcE47FtD.js";
14
14
  import "./message-channel-C9dERklz.js";
15
15
  import "./pairing-token-Byh6drgn.js";
16
- import "./subagent-registry-J2pIBQF7.js";
16
+ import "./subagent-registry-CUXuFP-8.js";
17
17
  import "./sessions-CJXnZVjR.js";
18
18
  import "./tokens-Csntmwwn.js";
19
19
  import "./plugins-CwSlLxM8.js";
@@ -102,7 +102,7 @@ import "./npm-registry-spec-DkaZNHAW.js";
102
102
  import "./skill-scanner-BGWOBqLY.js";
103
103
  import { i as resolvePluginInstallDir, n as installPluginFromNpmSpec, r as installPluginFromPath, t as recordPluginInstall } from "./installs-CgQpVncj.js";
104
104
  import { t as renderTable } from "./table-D01d2GuY.js";
105
- import { t as buildPluginStatusReport } from "./status-D4Lr90yH.js";
105
+ import { t as buildPluginStatusReport } from "./status-BDABGQ7Y.js";
106
106
  import { n as updateNpmInstalledPlugins } from "./update-DEMKx4eC.js";
107
107
  import os from "node:os";
108
108
  import path from "node:path";
@@ -1,7 +1,7 @@
1
1
  import { g as resolveStateDir } from "./paths-Cqn-zk3M.js";
2
2
  import { B as theme, S as shortenHomePath, g as resolveConfigDir, x as shortenHomeInString, y as resolveUserPath } from "./utils-B-0b9bGM.js";
3
3
  import "./thinking-EAliFiVK.js";
4
- import "./reply-DUZvOCsG.js";
4
+ import "./reply-B2Xur-75.js";
5
5
  import "./registry-Cja8eT7G.js";
6
6
  import { f as defaultRuntime } from "./subsystem-D9vIQve0.js";
7
7
  import "./exec-CWkblSrI.js";
@@ -106,7 +106,7 @@ import "./npm-registry-spec-C2JDdSZS.js";
106
106
  import "./skill-scanner-CLs8u6vQ.js";
107
107
  import { i as resolvePluginInstallDir, n as installPluginFromNpmSpec, r as installPluginFromPath, t as recordPluginInstall } from "./installs-C1Cebk97.js";
108
108
  import { t as renderTable } from "./table-BTgkRafz.js";
109
- import { t as buildPluginStatusReport } from "./status-BqhJ-HsW.js";
109
+ import { t as buildPluginStatusReport } from "./status-Bwvq4SPL.js";
110
110
  import { n as updateNpmInstalledPlugins } from "./update-rw7wJwHd.js";
111
111
  import fs from "node:fs";
112
112
  import os from "node:os";