@symerian/symi 2.0.6 → 2.0.7

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 (105) hide show
  1. package/dist/{agents-CypLQ-TX.js → agents-CNsMe4Dr.js} +4 -4
  2. package/dist/{agents.config-S5g63_Ww.js → agents.config-CdDf19dm.js} +1 -1
  3. package/dist/{agents.config-DWqwPV32.js → agents.config-yx78oSLx.js} +1 -1
  4. package/dist/{auth-choice-1csNxn5J.js → auth-choice-CXMFi9LR.js} +1 -1
  5. package/dist/{auth-choice-DxhF9BuU.js → auth-choice-mw9ndZQO.js} +1 -1
  6. package/dist/{banner-CV_YEEQe.js → banner-B-joBGLz.js} +1 -1
  7. package/dist/build-info.json +3 -3
  8. package/dist/bundled/boot-md/handler.js +1 -1
  9. package/dist/bundled/session-memory/handler.js +1 -1
  10. package/dist/canvas-host/a2ui/.bundle.hash +1 -1
  11. package/dist/{channel-options-NbbM348A.js → channel-options-D74Jofp4.js} +1 -1
  12. package/dist/{channel-options-DN7ZZEMr.js → channel-options-XPRRVrmU.js} +1 -1
  13. package/dist/{channel-web-BUODlmfF.js → channel-web-vRvvtf0S.js} +1 -1
  14. package/dist/{channels-cli-6MNbtk6T.js → channels-cli-D3lj5dXo.js} +4 -4
  15. package/dist/{channels-cli-DOoGJd4k.js → channels-cli-DgxPfJF7.js} +4 -4
  16. package/dist/{cli-DxHEDvD7.js → cli-Bg_5WQFe.js} +1 -1
  17. package/dist/{cli-TVchR8N9.js → cli-DQQAfUbo.js} +1 -1
  18. package/dist/{command-registry-S2yEeoft.js → command-registry-Cde2LqTh.js} +9 -9
  19. package/dist/{completion-cli-BrgaQVPk.js → completion-cli-Cx9htCOm.js} +1 -1
  20. package/dist/{completion-cli-u1z9O4lQ.js → completion-cli-KJUTWJP3.js} +2 -2
  21. package/dist/{config-cli-CUdFNGGC.js → config-cli-C5-P9Nzz.js} +1 -1
  22. package/dist/{config-cli-CipxRDcw.js → config-cli-ozfA6MGF.js} +1 -1
  23. package/dist/{configure-B2DVh1MI.js → configure-DiuQ_aTS.js} +3 -3
  24. package/dist/{configure-D9n_M6Ra.js → configure-ktsZw1bT.js} +3 -3
  25. package/dist/{doctor-completion-94bdxcgy.js → doctor-completion-CrN6Ly8x.js} +1 -1
  26. package/dist/{doctor-completion-Beg_3VG2.js → doctor-completion-Vwi_je1c.js} +1 -1
  27. package/dist/entry.js +1 -1
  28. package/dist/extensionAPI.js +1 -1
  29. package/dist/{gateway-cli-BkfAKxxR.js → gateway-cli-CwO3878F.js} +9 -9
  30. package/dist/{gateway-cli-CKIJn013.js → gateway-cli-DyqK4XZ1.js} +9 -9
  31. package/dist/{glass-ui-ws-BQ6j-PII.js → glass-ui-ws-BmqwQaCf.js} +7 -7
  32. package/dist/{glass-ui-ws-BrvN2A06.js → glass-ui-ws-zVNodseh.js} +7 -7
  33. package/dist/{health-9kUMJPU4.js → health-Q1RP1M2f.js} +1 -1
  34. package/dist/{health-BUaaGug2.js → health-UjXEBnzA.js} +1 -1
  35. package/dist/{hooks-cli-CBkjAKu_.js → hooks-cli-D4qJl6do.js} +2 -2
  36. package/dist/{hooks-cli-CxqrpSnT.js → hooks-cli-DOT9uGZw.js} +2 -2
  37. package/dist/index.js +6 -6
  38. package/dist/llm-slug-generator.js +1 -1
  39. package/dist/{models-CZSMuo5B.js → models-DKsiIvSx.js} +2 -2
  40. package/dist/{models-cli-Ds23awjm.js → models-cli-BS6UJ98e.js} +3 -3
  41. package/dist/{models-cli-MqWvGB7f.js → models-cli-ULbdeSgc.js} +2 -2
  42. package/dist/{onboard-D3oW4O-4.js → onboard-B387frTY.js} +2 -2
  43. package/dist/{onboard-G9IN6QQx.js → onboard-Bt-BwfkR.js} +2 -2
  44. package/dist/{onboard-channels-dfTDyb59.js → onboard-channels-COcxT5Q0.js} +1 -1
  45. package/dist/{onboard-channels-oFTqVfhO.js → onboard-channels-ybPEmcP8.js} +1 -1
  46. package/dist/{onboarding-g2bI9l8x.js → onboarding-BibGEGIS.js} +3 -3
  47. package/dist/{onboarding-Ckpz4QDg.js → onboarding-CdN_NU2d.js} +3 -3
  48. package/dist/{onboarding.finalize-C1lR3Y__.js → onboarding.finalize-CY1NjrGb.js} +6 -6
  49. package/dist/{onboarding.finalize-MWEKi_hL.js → onboarding.finalize-CvahVrDM.js} +5 -5
  50. package/dist/{pi-embedded-Cll2enMR.js → pi-embedded-BvCoZBNg.js} +159 -2
  51. package/dist/{pi-embedded-BJC3CNWN.js → pi-embedded-ZzUH4ioO.js} +159 -2
  52. package/dist/{plugin-registry-KUffgxdX.js → plugin-registry-BAbkdLQ7.js} +1 -1
  53. package/dist/{plugin-registry-C5KPfoPc.js → plugin-registry-CEoSVvL1.js} +1 -1
  54. package/dist/plugin-sdk/agents/plan-mode.d.ts +32 -0
  55. package/dist/plugin-sdk/{channel-web-DTV6QoJV.js → channel-web-xXTpy0N_.js} +1 -1
  56. package/dist/plugin-sdk/index.js +2 -2
  57. package/dist/plugin-sdk/{reply-CzCsghFB.js → reply-EEvLfWgt.js} +159 -2
  58. package/dist/plugin-sdk/{web-BLcsH45O.js → web-COWtpMAH.js} +2 -2
  59. package/dist/{plugins-cli-BIHhue19.js → plugins-cli-BpuQ7Y9l.js} +2 -2
  60. package/dist/{plugins-cli-DRDUAaBR.js → plugins-cli-C_S07pgO.js} +2 -2
  61. package/dist/{program-BCEnYzi8.js → program-cO9YX6wL.js} +7 -7
  62. package/dist/{program-context-CS1wSnZE.js → program-context-QBBvnWFX.js} +17 -17
  63. package/dist/{prompt-select-styled-AZW_g_xe.js → prompt-select-styled-CepuQSKg.js} +4 -4
  64. package/dist/{prompt-select-styled-99u32PPK.js → prompt-select-styled-D3dYbx2P.js} +4 -4
  65. package/dist/{provider-auth-helpers-CeJqzcdK.js → provider-auth-helpers-BMACaaEd.js} +1 -1
  66. package/dist/{provider-auth-helpers-DqJ69hdw.js → provider-auth-helpers-DXqvuBCi.js} +1 -1
  67. package/dist/{push-apns-Dwt-_Kns.js → push-apns-8YIzbTM7.js} +1 -1
  68. package/dist/{push-apns-C5xLtVxl.js → push-apns-DhZgao_r.js} +1 -1
  69. package/dist/{register.agent-Cyq17z22.js → register.agent-CSUoUVKd.js} +6 -6
  70. package/dist/{register.agent-nnrj8tc5.js → register.agent-CiTS9lyx.js} +5 -5
  71. package/dist/{register.configure-DSknC_88.js → register.configure-BbE9MAer.js} +6 -6
  72. package/dist/{register.configure-D1zZ3jgM.js → register.configure-CuCVLOW0.js} +6 -6
  73. package/dist/{register.maintenance-Dt1AUhn3.js → register.maintenance-CJG75LTu.js} +8 -8
  74. package/dist/{register.maintenance-ClQi_hVH.js → register.maintenance-D8bthvou.js} +7 -7
  75. package/dist/{register.message-x7nPJjwN.js → register.message-CyqE4E2O.js} +2 -2
  76. package/dist/{register.message-C0R7nCJf.js → register.message-nUpHGrEE.js} +2 -2
  77. package/dist/{register.onboard-Bry0wxl_.js → register.onboard-BDlne5KX.js} +4 -4
  78. package/dist/{register.onboard-BOXdnoFU.js → register.onboard-Dlw-TCPH.js} +4 -4
  79. package/dist/{register.setup-fPrs1eMy.js → register.setup-B8kiMuah.js} +4 -4
  80. package/dist/{register.setup-C5d8909b.js → register.setup-ByMyofSq.js} +4 -4
  81. package/dist/{register.status-health-sessions-Bg3bAzzg.js → register.status-health-sessions-0odRpA-p.js} +3 -3
  82. package/dist/{register.status-health-sessions-C6FKgGFx.js → register.status-health-sessions-Diirshgb.js} +3 -3
  83. package/dist/{register.subclis-BrOWQICr.js → register.subclis-CqEj9vfW.js} +9 -9
  84. package/dist/{reply-D_FZec1Q.js → reply-B9o45s3E.js} +159 -2
  85. package/dist/{run-main-BNSY40iN.js → run-main-C__lZ7VF.js} +14 -14
  86. package/dist/{server-methods-BBkI0oCw.js → server-methods-B_NSJmhc.js} +7 -7
  87. package/dist/{server-methods-CQo9n7_8.js → server-methods-Df9KsV_-.js} +7 -7
  88. package/dist/{server-node-events-DBIaf_Oj.js → server-node-events-C2mugatX.js} +2 -2
  89. package/dist/{server-node-events-DXVd5rRh.js → server-node-events-ZG0SBDkU.js} +2 -2
  90. package/dist/{status-B77mKduK.js → status-BTF6_aBO.js} +1 -1
  91. package/dist/{status-Be3sgGJN.js → status-BytVj4kU.js} +1 -1
  92. package/dist/{status-CqnXLNV0.js → status-PADx9rG7.js} +2 -2
  93. package/dist/{status-CsoUJxpm.js → status-hgm5EhwS.js} +2 -2
  94. package/dist/{subagent-registry-BH79W7i1.js → subagent-registry-BR2Qhqjf.js} +159 -2
  95. package/dist/{update-cli-Ce9xf_CT.js → update-cli-CHr8rjf-.js} +8 -8
  96. package/dist/{update-cli-BhPzUXNP.js → update-cli-qacplfF4.js} +7 -7
  97. package/dist/{update-runner-DYnn5y5L.js → update-runner-DM8zQvQB.js} +1 -1
  98. package/dist/{update-runner-BpQxWph5.js → update-runner-DNA7FJa2.js} +1 -1
  99. package/dist/{web-D3J3pm9B.js → web-0bP0TLM2.js} +1 -1
  100. package/dist/{web-sN6ARhg2.js → web-DkQc82PT.js} +1 -1
  101. package/dist/{web-07aQbQrq.js → web-G0LUda_q.js} +1 -1
  102. package/dist/{web-uh4O13Iu.js → web-UroM-w6c.js} +2 -2
  103. package/docs/reference/templates/AGENTS.md +18 -0
  104. package/docs/reference/templates/SYMICORE.md +2 -0
  105. package/package.json +1 -1
@@ -51483,7 +51483,7 @@ function isVoiceChannelType(type) {
51483
51483
  function createDefaultDeps() {
51484
51484
  return {
51485
51485
  sendMessageWhatsApp: async (...args) => {
51486
- const { sendMessageWhatsApp } = await import("./web-D3J3pm9B.js");
51486
+ const { sendMessageWhatsApp } = await import("./web-0bP0TLM2.js");
51487
51487
  return await sendMessageWhatsApp(...args);
51488
51488
  },
51489
51489
  sendMessageTelegram: async (...args) => {
@@ -66762,7 +66762,7 @@ function loadWebLoginQr() {
66762
66762
  return webLoginQrPromise;
66763
66763
  }
66764
66764
  function loadWebChannel() {
66765
- webChannelPromise ??= import("./web-D3J3pm9B.js");
66765
+ webChannelPromise ??= import("./web-0bP0TLM2.js");
66766
66766
  return webChannelPromise;
66767
66767
  }
66768
66768
  function loadWhatsAppActions() {
@@ -74589,6 +74589,152 @@ function subscribeEmbeddedPiSession(params) {
74589
74589
  };
74590
74590
  }
74591
74591
 
74592
+ //#endregion
74593
+ //#region src/agents/plan-mode.ts
74594
+ /**
74595
+ * Plan Mode — automatic complexity detection and structured planning.
74596
+ *
74597
+ * When a user message is complex (multi-step, multi-file, refactoring, etc.),
74598
+ * Symi auto-enters plan mode: read-only investigation → structured plan →
74599
+ * user approval → context-cleared execution.
74600
+ */
74601
+ const PLAN_KEYWORDS = new Set([
74602
+ "investigate",
74603
+ "refactor",
74604
+ "migrate",
74605
+ "redesign",
74606
+ "set up",
74607
+ "setup",
74608
+ "build",
74609
+ "implement",
74610
+ "architect",
74611
+ "overhaul",
74612
+ "restructure",
74613
+ "rewrite"
74614
+ ]);
74615
+ const ANALYSIS_KEYWORDS = new Set([
74616
+ "analyze",
74617
+ "analyse",
74618
+ "compare",
74619
+ "audit",
74620
+ "review",
74621
+ "evaluate",
74622
+ "assess"
74623
+ ]);
74624
+ const SEQUENTIAL_MARKERS = [
74625
+ /\bthen\b/i,
74626
+ /\bafter that\b/i,
74627
+ /\bonce .+ is done\b/i,
74628
+ /\bnext,?\s/i,
74629
+ /\bfollowed by\b/i,
74630
+ /\bfinally\b/i
74631
+ ];
74632
+ const NUMBERED_LIST_RE = /^\s*\d+[.)]\s/gm;
74633
+ const FILE_PATH_RE = /(?:\/[\w.-]+){2,}|[\w.-]+\.[a-z]{1,4}/g;
74634
+ /**
74635
+ * Score a user message for complexity.
74636
+ * Returns a numeric score; >= PLAN_MODE_THRESHOLD triggers plan mode.
74637
+ */
74638
+ function scorePlanComplexity(prompt) {
74639
+ let score = 0;
74640
+ const lower = prompt.toLowerCase();
74641
+ if (prompt.length > 500) {
74642
+ if ([...PLAN_KEYWORDS, ...ANALYSIS_KEYWORDS].some((kw) => lower.includes(kw)) || FILE_PATH_RE.test(prompt)) score += 3;
74643
+ }
74644
+ const numberedItems = prompt.match(NUMBERED_LIST_RE);
74645
+ if (numberedItems && numberedItems.length >= 3) score += 2;
74646
+ for (const kw of PLAN_KEYWORDS) if (lower.includes(kw)) {
74647
+ score += 2;
74648
+ break;
74649
+ }
74650
+ for (const re of SEQUENTIAL_MARKERS) if (re.test(prompt)) {
74651
+ score += 2;
74652
+ break;
74653
+ }
74654
+ const filePaths = prompt.match(FILE_PATH_RE);
74655
+ if (filePaths && new Set(filePaths).size >= 2) score += 1;
74656
+ for (const kw of ANALYSIS_KEYWORDS) if (lower.includes(kw)) {
74657
+ score += 1;
74658
+ break;
74659
+ }
74660
+ return score;
74661
+ }
74662
+ const PLAN_MODE_THRESHOLD = 5;
74663
+ /**
74664
+ * Determine whether a prompt should trigger plan mode.
74665
+ *
74666
+ * Priority:
74667
+ * 1. /plan prefix → always
74668
+ * 2. /noplan prefix → never
74669
+ * 3. Subagent/cron sessions → never
74670
+ * 4. Heuristic scoring
74671
+ */
74672
+ function shouldEnterPlanMode(prompt, opts = {}) {
74673
+ const trimmed = prompt.trim();
74674
+ if (/^\/plan\b/i.test(trimmed)) return {
74675
+ enter: true,
74676
+ reason: "explicit /plan directive",
74677
+ score: 99,
74678
+ stripped: trimmed.replace(/^\/plan\s*/i, "").trim()
74679
+ };
74680
+ if (/^\/noplan\b/i.test(trimmed)) return {
74681
+ enter: false,
74682
+ reason: "explicit /noplan directive",
74683
+ score: 0,
74684
+ stripped: trimmed.replace(/^\/noplan\s*/i, "").trim()
74685
+ };
74686
+ if (opts.isSubagent) return {
74687
+ enter: false,
74688
+ reason: "subagent session",
74689
+ score: 0
74690
+ };
74691
+ if (opts.isCron) return {
74692
+ enter: false,
74693
+ reason: "cron session",
74694
+ score: 0
74695
+ };
74696
+ const score = scorePlanComplexity(trimmed);
74697
+ if (score >= PLAN_MODE_THRESHOLD) return {
74698
+ enter: true,
74699
+ reason: `complexity score ${score} >= ${PLAN_MODE_THRESHOLD}`,
74700
+ score
74701
+ };
74702
+ return {
74703
+ enter: false,
74704
+ reason: `complexity score ${score} < ${PLAN_MODE_THRESHOLD}`,
74705
+ score
74706
+ };
74707
+ }
74708
+ const PLAN_MODE_SYSTEM_PROMPT = `<plan_mode>
74709
+ You have entered PLAN MODE because this task is complex.
74710
+
74711
+ RULES:
74712
+ - DO NOT write, edit, or create any files yet
74713
+ - DO NOT execute destructive commands (rm, mv, git reset, etc.)
74714
+ - DO read files, search code, check runtime state
74715
+ - DO use memory_search, web_search, exec (read-only commands like ls, cat, git status, git log)
74716
+ - Produce a detailed step-by-step implementation plan
74717
+
74718
+ OUTPUT FORMAT:
74719
+ 1. **Summary** — what needs to be done and why
74720
+ 2. **Investigation** — files read, code searched, state checked
74721
+ 3. **Files to modify** — list every file that will be created, edited, or deleted
74722
+ 4. **Implementation phases** — numbered steps with:
74723
+ - What changes in each phase
74724
+ - Which files are touched
74725
+ - Dependencies on prior phases
74726
+ 5. **Risks & considerations** — things that could go wrong, edge cases, rollback strategy
74727
+
74728
+ After presenting the plan, ask the user to choose one of these options.
74729
+ Present these as inline buttons if the channel supports them:
74730
+ - **Proceed** — clear context and execute the plan
74731
+ - **Modify** — adjust the plan based on feedback
74732
+ - **Cancel** — abandon the plan
74733
+
74734
+ Use the message tool with buttons:
74735
+ [{"label": "✅ Proceed", "data": "/plan-proceed"}, {"label": "✏️ Modify", "data": "/plan-modify"}, {"label": "❌ Cancel", "data": "/plan-cancel"}]
74736
+ </plan_mode>`;
74737
+
74592
74738
  //#endregion
74593
74739
  //#region src/agents/pi-embedded-runner/abort.ts
74594
74740
  /**
@@ -75842,6 +75988,17 @@ async function runEmbeddedAttempt(params) {
75842
75988
  log$2.debug(`auto-recall: skipped (${String(recallErr)})`);
75843
75989
  }
75844
75990
  }
75991
+ {
75992
+ const planResult = shouldEnterPlanMode(effectivePrompt, {
75993
+ isSubagent: isSubagentSessionKey(params.sessionKey),
75994
+ isCron: isCronSessionKey(params.sessionKey)
75995
+ });
75996
+ if (planResult.enter) {
75997
+ if (planResult.stripped != null) effectivePrompt = planResult.stripped;
75998
+ effectivePrompt = `${PLAN_MODE_SYSTEM_PROMPT}\n\n${effectivePrompt}`;
75999
+ log$2.info(`plan-mode: activated (${planResult.reason}) for runId=${params.runId}`);
76000
+ } else if (planResult.stripped != null) effectivePrompt = planResult.stripped;
76001
+ }
75845
76002
  log$2.debug(`embedded run prompt start: runId=${params.runId} sessionId=${params.sessionId}`);
75846
76003
  cacheTrace?.recordStage("prompt:before", {
75847
76004
  prompt: effectivePrompt,
@@ -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-amjzHiWZ.js";
5
- import { _ as loadSymiPlugins } from "./subagent-registry-BH79W7i1.js";
5
+ import { _ as loadSymiPlugins } from "./subagent-registry-BR2Qhqjf.js";
6
6
 
7
7
  //#region src/cli/plugin-registry.ts
8
8
  var plugin_registry_exports = /* @__PURE__ */ __exportAll({ ensurePluginRegistryLoaded: () => ensurePluginRegistryLoaded });
@@ -1,5 +1,5 @@
1
1
  import { t as __exportAll } from "./rolldown-runtime-Cbj13DAv.js";
2
- import { gt as loadSymiPlugins } from "./reply-D_FZec1Q.js";
2
+ import { gt as loadSymiPlugins } from "./reply-B9o45s3E.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";
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Plan Mode — automatic complexity detection and structured planning.
3
+ *
4
+ * When a user message is complex (multi-step, multi-file, refactoring, etc.),
5
+ * Symi auto-enters plan mode: read-only investigation → structured plan →
6
+ * user approval → context-cleared execution.
7
+ */
8
+ /**
9
+ * Score a user message for complexity.
10
+ * Returns a numeric score; >= PLAN_MODE_THRESHOLD triggers plan mode.
11
+ */
12
+ export declare function scorePlanComplexity(prompt: string): number;
13
+ export declare const PLAN_MODE_THRESHOLD = 5;
14
+ /**
15
+ * Determine whether a prompt should trigger plan mode.
16
+ *
17
+ * Priority:
18
+ * 1. /plan prefix → always
19
+ * 2. /noplan prefix → never
20
+ * 3. Subagent/cron sessions → never
21
+ * 4. Heuristic scoring
22
+ */
23
+ export declare function shouldEnterPlanMode(prompt: string, opts?: {
24
+ isSubagent?: boolean;
25
+ isCron?: boolean;
26
+ }): {
27
+ enter: boolean;
28
+ reason: string;
29
+ score: number;
30
+ stripped?: string;
31
+ };
32
+ export declare const PLAN_MODE_SYSTEM_PROMPT = "<plan_mode>\nYou have entered PLAN MODE because this task is complex.\n\nRULES:\n- DO NOT write, edit, or create any files yet\n- DO NOT execute destructive commands (rm, mv, git reset, etc.)\n- DO read files, search code, check runtime state\n- DO use memory_search, web_search, exec (read-only commands like ls, cat, git status, git log)\n- Produce a detailed step-by-step implementation plan\n\nOUTPUT FORMAT:\n1. **Summary** \u2014 what needs to be done and why\n2. **Investigation** \u2014 files read, code searched, state checked\n3. **Files to modify** \u2014 list every file that will be created, edited, or deleted\n4. **Implementation phases** \u2014 numbered steps with:\n - What changes in each phase\n - Which files are touched\n - Dependencies on prior phases\n5. **Risks & considerations** \u2014 things that could go wrong, edge cases, rollback strategy\n\nAfter presenting the plan, ask the user to choose one of these options.\nPresent these as inline buttons if the channel supports them:\n- **Proceed** \u2014 clear context and execute the plan\n- **Modify** \u2014 adjust the plan based on feedback\n- **Cancel** \u2014 abandon the plan\n\nUse the message tool with buttons:\n[{\"label\": \"\u2705 Proceed\", \"data\": \"/plan-proceed\"}, {\"label\": \"\u270F\uFE0F Modify\", \"data\": \"/plan-modify\"}, {\"label\": \"\u274C Cancel\", \"data\": \"/plan-cancel\"}]\n</plan_mode>";
@@ -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-D9zGZU5t.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-CzCsghFB.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-EEvLfWgt.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--_pGht6S.js";
5
5
  import { n as loadConfig } from "./config-Do1-fcaS.js";
6
6
  import { i as defaultRuntime, t as createSubsystemLogger } from "./subsystem-Coz2AgU8.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-D9zGZU5t.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-CzCsghFB.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-EEvLfWgt.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-BbAvhC25.js";
@@ -47,7 +47,7 @@ import "./paths-A0xdf3yk.js";
47
47
  import { h as onDiagnosticEvent, m as isDiagnosticsEnabled, p as emitDiagnosticEvent } from "./diagnostic-mFf4i4G9.js";
48
48
  import { n as extractOriginalFilename } from "./store-Do3t33-c.js";
49
49
  import { t as resolveWhatsAppOutboundTarget } from "./resolve-outbound-target-BkCUbYGV.js";
50
- import { r as resolveWhatsAppHeartbeatRecipients } from "./channel-web-DTV6QoJV.js";
50
+ import { r as resolveWhatsAppHeartbeatRecipients } from "./channel-web-xXTpy0N_.js";
51
51
  import "./image-k_W1USVr.js";
52
52
  import "./pi-model-discovery-LbcEa65a.js";
53
53
  import "./api-key-rotation-Qy7QGV8_.js";
@@ -26834,7 +26834,7 @@ async function runWithImageModelFallback(params) {
26834
26834
  function createDefaultDeps() {
26835
26835
  return {
26836
26836
  sendMessageWhatsApp: async (...args) => {
26837
- const { sendMessageWhatsApp } = await import("./web-BLcsH45O.js");
26837
+ const { sendMessageWhatsApp } = await import("./web-COWtpMAH.js");
26838
26838
  return await sendMessageWhatsApp(...args);
26839
26839
  },
26840
26840
  sendMessageTelegram: async (...args) => {
@@ -44457,7 +44457,7 @@ function loadWebLoginQr() {
44457
44457
  return webLoginQrPromise;
44458
44458
  }
44459
44459
  function loadWebChannel() {
44460
- webChannelPromise ??= import("./web-BLcsH45O.js");
44460
+ webChannelPromise ??= import("./web-COWtpMAH.js");
44461
44461
  return webChannelPromise;
44462
44462
  }
44463
44463
  function loadWhatsAppActions() {
@@ -66219,6 +66219,152 @@ function subscribeEmbeddedPiSession(params) {
66219
66219
  };
66220
66220
  }
66221
66221
 
66222
+ //#endregion
66223
+ //#region src/agents/plan-mode.ts
66224
+ /**
66225
+ * Plan Mode — automatic complexity detection and structured planning.
66226
+ *
66227
+ * When a user message is complex (multi-step, multi-file, refactoring, etc.),
66228
+ * Symi auto-enters plan mode: read-only investigation → structured plan →
66229
+ * user approval → context-cleared execution.
66230
+ */
66231
+ const PLAN_KEYWORDS = new Set([
66232
+ "investigate",
66233
+ "refactor",
66234
+ "migrate",
66235
+ "redesign",
66236
+ "set up",
66237
+ "setup",
66238
+ "build",
66239
+ "implement",
66240
+ "architect",
66241
+ "overhaul",
66242
+ "restructure",
66243
+ "rewrite"
66244
+ ]);
66245
+ const ANALYSIS_KEYWORDS = new Set([
66246
+ "analyze",
66247
+ "analyse",
66248
+ "compare",
66249
+ "audit",
66250
+ "review",
66251
+ "evaluate",
66252
+ "assess"
66253
+ ]);
66254
+ const SEQUENTIAL_MARKERS = [
66255
+ /\bthen\b/i,
66256
+ /\bafter that\b/i,
66257
+ /\bonce .+ is done\b/i,
66258
+ /\bnext,?\s/i,
66259
+ /\bfollowed by\b/i,
66260
+ /\bfinally\b/i
66261
+ ];
66262
+ const NUMBERED_LIST_RE = /^\s*\d+[.)]\s/gm;
66263
+ const FILE_PATH_RE = /(?:\/[\w.-]+){2,}|[\w.-]+\.[a-z]{1,4}/g;
66264
+ /**
66265
+ * Score a user message for complexity.
66266
+ * Returns a numeric score; >= PLAN_MODE_THRESHOLD triggers plan mode.
66267
+ */
66268
+ function scorePlanComplexity(prompt) {
66269
+ let score = 0;
66270
+ const lower = prompt.toLowerCase();
66271
+ if (prompt.length > 500) {
66272
+ if ([...PLAN_KEYWORDS, ...ANALYSIS_KEYWORDS].some((kw) => lower.includes(kw)) || FILE_PATH_RE.test(prompt)) score += 3;
66273
+ }
66274
+ const numberedItems = prompt.match(NUMBERED_LIST_RE);
66275
+ if (numberedItems && numberedItems.length >= 3) score += 2;
66276
+ for (const kw of PLAN_KEYWORDS) if (lower.includes(kw)) {
66277
+ score += 2;
66278
+ break;
66279
+ }
66280
+ for (const re of SEQUENTIAL_MARKERS) if (re.test(prompt)) {
66281
+ score += 2;
66282
+ break;
66283
+ }
66284
+ const filePaths = prompt.match(FILE_PATH_RE);
66285
+ if (filePaths && new Set(filePaths).size >= 2) score += 1;
66286
+ for (const kw of ANALYSIS_KEYWORDS) if (lower.includes(kw)) {
66287
+ score += 1;
66288
+ break;
66289
+ }
66290
+ return score;
66291
+ }
66292
+ const PLAN_MODE_THRESHOLD = 5;
66293
+ /**
66294
+ * Determine whether a prompt should trigger plan mode.
66295
+ *
66296
+ * Priority:
66297
+ * 1. /plan prefix → always
66298
+ * 2. /noplan prefix → never
66299
+ * 3. Subagent/cron sessions → never
66300
+ * 4. Heuristic scoring
66301
+ */
66302
+ function shouldEnterPlanMode(prompt, opts = {}) {
66303
+ const trimmed = prompt.trim();
66304
+ if (/^\/plan\b/i.test(trimmed)) return {
66305
+ enter: true,
66306
+ reason: "explicit /plan directive",
66307
+ score: 99,
66308
+ stripped: trimmed.replace(/^\/plan\s*/i, "").trim()
66309
+ };
66310
+ if (/^\/noplan\b/i.test(trimmed)) return {
66311
+ enter: false,
66312
+ reason: "explicit /noplan directive",
66313
+ score: 0,
66314
+ stripped: trimmed.replace(/^\/noplan\s*/i, "").trim()
66315
+ };
66316
+ if (opts.isSubagent) return {
66317
+ enter: false,
66318
+ reason: "subagent session",
66319
+ score: 0
66320
+ };
66321
+ if (opts.isCron) return {
66322
+ enter: false,
66323
+ reason: "cron session",
66324
+ score: 0
66325
+ };
66326
+ const score = scorePlanComplexity(trimmed);
66327
+ if (score >= PLAN_MODE_THRESHOLD) return {
66328
+ enter: true,
66329
+ reason: `complexity score ${score} >= ${PLAN_MODE_THRESHOLD}`,
66330
+ score
66331
+ };
66332
+ return {
66333
+ enter: false,
66334
+ reason: `complexity score ${score} < ${PLAN_MODE_THRESHOLD}`,
66335
+ score
66336
+ };
66337
+ }
66338
+ const PLAN_MODE_SYSTEM_PROMPT = `<plan_mode>
66339
+ You have entered PLAN MODE because this task is complex.
66340
+
66341
+ RULES:
66342
+ - DO NOT write, edit, or create any files yet
66343
+ - DO NOT execute destructive commands (rm, mv, git reset, etc.)
66344
+ - DO read files, search code, check runtime state
66345
+ - DO use memory_search, web_search, exec (read-only commands like ls, cat, git status, git log)
66346
+ - Produce a detailed step-by-step implementation plan
66347
+
66348
+ OUTPUT FORMAT:
66349
+ 1. **Summary** — what needs to be done and why
66350
+ 2. **Investigation** — files read, code searched, state checked
66351
+ 3. **Files to modify** — list every file that will be created, edited, or deleted
66352
+ 4. **Implementation phases** — numbered steps with:
66353
+ - What changes in each phase
66354
+ - Which files are touched
66355
+ - Dependencies on prior phases
66356
+ 5. **Risks & considerations** — things that could go wrong, edge cases, rollback strategy
66357
+
66358
+ After presenting the plan, ask the user to choose one of these options.
66359
+ Present these as inline buttons if the channel supports them:
66360
+ - **Proceed** — clear context and execute the plan
66361
+ - **Modify** — adjust the plan based on feedback
66362
+ - **Cancel** — abandon the plan
66363
+
66364
+ Use the message tool with buttons:
66365
+ [{"label": "✅ Proceed", "data": "/plan-proceed"}, {"label": "✏️ Modify", "data": "/plan-modify"}, {"label": "❌ Cancel", "data": "/plan-cancel"}]
66366
+ </plan_mode>`;
66367
+
66222
66368
  //#endregion
66223
66369
  //#region src/agents/pi-embedded-runner/abort.ts
66224
66370
  /**
@@ -67472,6 +67618,17 @@ async function runEmbeddedAttempt(params) {
67472
67618
  log$2.debug(`auto-recall: skipped (${String(recallErr)})`);
67473
67619
  }
67474
67620
  }
67621
+ {
67622
+ const planResult = shouldEnterPlanMode(effectivePrompt, {
67623
+ isSubagent: isSubagentSessionKey(params.sessionKey),
67624
+ isCron: isCronSessionKey(params.sessionKey)
67625
+ });
67626
+ if (planResult.enter) {
67627
+ if (planResult.stripped != null) effectivePrompt = planResult.stripped;
67628
+ effectivePrompt = `${PLAN_MODE_SYSTEM_PROMPT}\n\n${effectivePrompt}`;
67629
+ log$2.info(`plan-mode: activated (${planResult.reason}) for runId=${params.runId}`);
67630
+ } else if (planResult.stripped != null) effectivePrompt = planResult.stripped;
67631
+ }
67475
67632
  log$2.debug(`embedded run prompt start: runId=${params.runId} sessionId=${params.sessionId}`);
67476
67633
  cacheTrace?.recordStage("prompt:before", {
67477
67634
  prompt: effectivePrompt,
@@ -1,5 +1,5 @@
1
1
  import { a as WA_WEB_AUTH_DIR, g as webAuthExists, s as logWebSelfId, u as pickWebChannel } from "./accounts-D9zGZU5t.js";
2
- import "./reply-CzCsghFB.js";
2
+ import "./reply-EEvLfWgt.js";
3
3
  import "./paths-DR2yt_mP.js";
4
4
  import "./github-copilot-token-D9X2phUj.js";
5
5
  import "./plugins-BbAvhC25.js";
@@ -45,7 +45,7 @@ import "./pi-embedded-helpers-Cs2-_EpL.js";
45
45
  import "./paths-A0xdf3yk.js";
46
46
  import "./diagnostic-mFf4i4G9.js";
47
47
  import "./store-Do3t33-c.js";
48
- import { n as monitorWebInbox, t as monitorWebChannel } from "./channel-web-DTV6QoJV.js";
48
+ import { n as monitorWebInbox, t as monitorWebChannel } from "./channel-web-xXTpy0N_.js";
49
49
  import "./image-k_W1USVr.js";
50
50
  import "./pi-model-discovery-LbcEa65a.js";
51
51
  import "./api-key-rotation-Qy7QGV8_.js";
@@ -13,7 +13,7 @@ import "./client-LeVQns9-.js";
13
13
  import "./call-BQiCOxB6.js";
14
14
  import "./message-channel-C9dERklz.js";
15
15
  import "./pairing-token-Byh6drgn.js";
16
- import "./subagent-registry-BH79W7i1.js";
16
+ import "./subagent-registry-BR2Qhqjf.js";
17
17
  import "./sessions-DJAxaVI7.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-B77mKduK.js";
105
+ import { t as buildPluginStatusReport } from "./status-BTF6_aBO.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-D_FZec1Q.js";
4
+ import "./reply-B9o45s3E.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-Be3sgGJN.js";
109
+ import { t as buildPluginStatusReport } from "./status-BytVj4kU.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";
@@ -14,7 +14,7 @@ import "./client-LeVQns9-.js";
14
14
  import "./call-BQiCOxB6.js";
15
15
  import "./message-channel-C9dERklz.js";
16
16
  import "./pairing-token-Byh6drgn.js";
17
- import "./subagent-registry-BH79W7i1.js";
17
+ import "./subagent-registry-BR2Qhqjf.js";
18
18
  import "./sessions-DJAxaVI7.js";
19
19
  import "./tokens-Csntmwwn.js";
20
20
  import "./plugins-CwSlLxM8.js";
@@ -99,13 +99,13 @@ import "./prompt-style-DwCXob2h.js";
99
99
  import "./pairing-labels-sIj1ZLt-.js";
100
100
  import "./pi-tools.policy-T6Z5F-_n.js";
101
101
  import "./catalog-DLQFKucJ.js";
102
- import "./plugin-registry-KUffgxdX.js";
103
- import { n as resolveCliChannelOptions } from "./channel-options-NbbM348A.js";
104
- import { t as getSubCliCommandsWithSubcommands } from "./register.subclis-BrOWQICr.js";
105
- import { a as registerProgramCommands, r as getCoreCliCommandsWithSubcommands } from "./command-registry-S2yEeoft.js";
102
+ import "./plugin-registry-BAbkdLQ7.js";
103
+ import { n as resolveCliChannelOptions } from "./channel-options-D74Jofp4.js";
104
+ import { t as getSubCliCommandsWithSubcommands } from "./register.subclis-CqEj9vfW.js";
105
+ import { a as registerProgramCommands, r as getCoreCliCommandsWithSubcommands } from "./command-registry-Cde2LqTh.js";
106
106
  import { r as setProgramContext } from "./program-context-CqzR_m-7.js";
107
107
  import { t as forceFreePort } from "./ports-Dn122MUd.js";
108
- import { n as formatCliBannerLine, r as hasEmittedCliBanner, t as emitCliBanner } from "./banner-CV_YEEQe.js";
108
+ import { n as formatCliBannerLine, r as hasEmittedCliBanner, t as emitCliBanner } from "./banner-B-joBGLz.js";
109
109
  import { Command } from "commander";
110
110
 
111
111
  //#region src/cli/program/context.ts
@@ -213,7 +213,7 @@ function registerPreActionHooks(program, programVersion) {
213
213
  commandPath
214
214
  });
215
215
  if (PLUGIN_REQUIRED_COMMANDS.has(commandPath[0])) {
216
- const { ensurePluginRegistryLoaded } = await import("./plugin-registry-KUffgxdX.js").then((n) => n.n);
216
+ const { ensurePluginRegistryLoaded } = await import("./plugin-registry-BAbkdLQ7.js").then((n) => n.n);
217
217
  ensurePluginRegistryLoaded();
218
218
  }
219
219
  });