@symerian/symi 3.5.5 → 3.5.6

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 (104) hide show
  1. package/dist/{agent-8EuVoCbs.js → agent-BCszhl_7.js} +1 -1
  2. package/dist/{agent-B87OYNFx.js → agent-Cmx-1Tfs.js} +1 -1
  3. package/dist/{agents-CNbjbSD0.js → agents-BkTzJJ83.js} +2 -2
  4. package/dist/{auth-choice-BL4lqaJL.js → auth-choice-CucG4Wor.js} +1 -1
  5. package/dist/{auth-choice-CB0rQByJ.js → auth-choice-D-iIJjJY.js} +1 -1
  6. package/dist/{banner-D-ssxnQN.js → banner-CApT91CY.js} +1 -1
  7. package/dist/build-info.json +3 -3
  8. package/dist/bundled/boot-md/handler.js +2 -2
  9. package/dist/bundled/session-memory/handler.js +2 -2
  10. package/dist/canvas-host/a2ui/.bundle.hash +1 -1
  11. package/dist/{channel-options-_DJXj921.js → channel-options-CdIEyHya.js} +1 -1
  12. package/dist/{channel-options-DLV6zIpW.js → channel-options-DYh8mLMN.js} +1 -1
  13. package/dist/{channels-cli-2OTAQPvZ.js → channels-cli-Bb18aE2b.js} +7 -7
  14. package/dist/{channels-cli-CUsX2v-1.js → channels-cli-sG9Wf2LH.js} +7 -7
  15. package/dist/{cli-Qq7pr2SX.js → cli-DEGt0Tp0.js} +4 -4
  16. package/dist/{cli-D4cMWhob.js → cli-DtdTf-ZQ.js} +4 -4
  17. package/dist/{command-registry-Br9vlIL_.js → command-registry-O155hUhR.js} +10 -10
  18. package/dist/{completion-cli-CKLoZFMQ.js → completion-cli-BaOjuoPX.js} +2 -2
  19. package/dist/{completion-cli-P5zBWNnc.js → completion-cli-DLUKoSIx.js} +1 -1
  20. package/dist/{config-cli-NvqRZAqr.js → config-cli-BuZ-L1Iw.js} +1 -1
  21. package/dist/{config-cli-CcJOubCt.js → config-cli-BxWavRxN.js} +1 -1
  22. package/dist/{configure-C7BfUqKR.js → configure-BSKWgEhS.js} +2 -2
  23. package/dist/{configure-B1RJ6bi3.js → configure-gxAEhC9E.js} +2 -2
  24. package/dist/{doctor-completion-Be3Of_A2.js → doctor-completion-BzfgfpBH.js} +1 -1
  25. package/dist/{doctor-completion-Dco2Lmvy.js → doctor-completion-wlBp8bv7.js} +1 -1
  26. package/dist/entry.js +1 -1
  27. package/dist/extensionAPI.js +2 -2
  28. package/dist/{gateway-cli-XV8T-ix8.js → gateway-cli-Bz5fqsnE.js} +10 -10
  29. package/dist/{gateway-cli-BQAh5DqM.js → gateway-cli-_xNZ2L_e.js} +10 -10
  30. package/dist/{glass-ui-ws-1FOCi0nn.js → glass-ui-ws-CbKVlQRh.js} +8 -8
  31. package/dist/{glass-ui-ws-CqGzDNV7.js → glass-ui-ws-DO8WKPIK.js} +8 -8
  32. package/dist/{hooks-cli-D7iTDry_.js → hooks-cli-CrgD2ZqP.js} +5 -5
  33. package/dist/{hooks-cli-BPa-ssdB.js → hooks-cli-mwiHuRfO.js} +5 -5
  34. package/dist/index.js +8 -8
  35. package/dist/llm-slug-generator.js +2 -2
  36. package/dist/{manager-DghM7T-b.js → manager-BVPXSK-I.js} +1 -1
  37. package/dist/{manager-Bt-1HGg9.js → manager-CnBU0aOR.js} +1 -1
  38. package/dist/{manager-Ck1YSfr6.js → manager-CpBJ1BE6.js} +1 -1
  39. package/dist/{manager-CC13EPO9.js → manager-CvqH_tah.js} +1 -1
  40. package/dist/{memory-CgWOtF4K.js → memory-BsGfHO_F.js} +2 -2
  41. package/dist/{memory-d0YI5Lr0.js → memory-CbwmxmxW.js} +2 -2
  42. package/dist/{memory-cli-DGheAg5i.js → memory-cli-B1dFPZw-.js} +2 -2
  43. package/dist/{memory-cli-vN3fGs79.js → memory-cli-BwQsPEFk.js} +2 -2
  44. package/dist/{models-CBw1pGIq.js → models-Dm6dSSSx.js} +2 -2
  45. package/dist/{models-cli-Bmh1S3iG.js → models-cli-BA6ufqLd.js} +5 -5
  46. package/dist/{models-cli-BBReZHNq.js → models-cli-BPSrz6tf.js} +6 -6
  47. package/dist/{onboard-Csj4sOF5.js → onboard-CjnPughY.js} +1 -1
  48. package/dist/{onboard-LVUmCZhX.js → onboard-Cmz6Rtm-.js} +1 -1
  49. package/dist/{onboard-channels-vDtX0e0w.js → onboard-channels-Cozz3CQv.js} +1 -1
  50. package/dist/{onboard-channels-mrSIlZDB.js → onboard-channels-D00NAtQt.js} +1 -1
  51. package/dist/{onboarding-DojADc8N.js → onboarding-BPZb40BJ.js} +3 -3
  52. package/dist/{onboarding-D2VmoKU1.js → onboarding-BrTMOcPF.js} +3 -3
  53. package/dist/{onboarding.finalize-C4BwVw6u.js → onboarding.finalize-Bd2rGMjo.js} +3 -3
  54. package/dist/{onboarding.finalize-Bi1wSEtw.js → onboarding.finalize-BiL_LXrR.js} +4 -4
  55. package/dist/{pi-embedded-zSv7VKNQ.js → pi-embedded-C9wLrFjj.js} +177 -69
  56. package/dist/{plugin-registry-L1h7mxjX.js → plugin-registry-BLoSesyj.js} +1 -1
  57. package/dist/{plugin-registry-Dq6OJ45H.js → plugin-registry-CZDG8fjK.js} +1 -1
  58. package/dist/plugin-sdk/auto-reply/reply/middleware-context-warning.d.ts +22 -0
  59. package/dist/plugin-sdk/auto-reply/session-boundary-messages.d.ts +16 -3
  60. package/dist/plugin-sdk/index.js +6 -6
  61. package/dist/{plugins-cli-C9ehLXaT.js → plugins-cli-2yraoR6V.js} +5 -5
  62. package/dist/{plugins-cli-BEIKMoVH.js → plugins-cli-CGs9-UtO.js} +5 -5
  63. package/dist/{program-iTd2Dei7.js → program-BnKEJpZF.js} +10 -10
  64. package/dist/{program-context-Bh5wzWdC.js → program-context-BvP9L_1W.js} +18 -18
  65. package/dist/{prompt-select-styled-CNFytCD3.js → prompt-select-styled-BTF5vvv8.js} +4 -4
  66. package/dist/{prompt-select-styled-fXotfbCt.js → prompt-select-styled-Brx330O3.js} +4 -4
  67. package/dist/{provider-auth-helpers-Dho1n21x.js → provider-auth-helpers-CppzYZM9.js} +1 -1
  68. package/dist/{provider-auth-helpers-DBrH-cce.js → provider-auth-helpers-hjy3e-oS.js} +1 -1
  69. package/dist/{push-apns-DpyCFRTu.js → push-apns-BD2iO09c.js} +1 -1
  70. package/dist/{push-apns-DYYY9NOE.js → push-apns-DJ55TFPT.js} +1 -1
  71. package/dist/{register.agent-BYpBNbHe.js → register.agent-DTGvQGla.js} +9 -9
  72. package/dist/{register.agent-DceNHGi_.js → register.agent-Dz_P7PxO.js} +8 -8
  73. package/dist/{register.configure-09lIIUvq.js → register.configure-CrgU3FzU.js} +8 -8
  74. package/dist/{register.configure-UUZqL0Ck.js → register.configure-D9w7Tm9e.js} +8 -8
  75. package/dist/{register.maintenance-DdX8GZpv.js → register.maintenance-CqvrXPF7.js} +9 -9
  76. package/dist/{register.maintenance-CsoEyVyl.js → register.maintenance-d5xHdDgu.js} +8 -8
  77. package/dist/{register.message-RYn7LD6-.js → register.message-C0tqgEor.js} +5 -5
  78. package/dist/{register.message-CAM62MaW.js → register.message-DNMCxaAD.js} +5 -5
  79. package/dist/{register.onboard-CoRtNlNa.js → register.onboard--eJVfJGa.js} +2 -2
  80. package/dist/{register.onboard-DhR5o8KO.js → register.onboard-dkAvGraV.js} +2 -2
  81. package/dist/{register.setup-CI_RT1Wa.js → register.setup-CgufX-6c.js} +2 -2
  82. package/dist/{register.setup-CEjhFwYz.js → register.setup-Dwh0ylCS.js} +2 -2
  83. package/dist/{register.status-health-sessions-DNlsQ-xt.js → register.status-health-sessions-BeAm7HAq.js} +3 -3
  84. package/dist/{register.status-health-sessions-8N1xEKl7.js → register.status-health-sessions-D6BRCFg_.js} +3 -3
  85. package/dist/{register.subclis-D1qkm3UK.js → register.subclis-Hb2xSHBy.js} +9 -9
  86. package/dist/{run-main-hKg6FDt6.js → run-main-B_NTFmz1.js} +17 -17
  87. package/dist/{server-methods-bIWvtXlT.js → server-methods-CFWjtx32.js} +7 -7
  88. package/dist/{server-methods-CXoipzKe.js → server-methods-Cz_-FX5B.js} +7 -7
  89. package/dist/{server-node-events-BD8wnswX.js → server-node-events-BiMD-Sik.js} +6 -6
  90. package/dist/{server-node-events-nQkNuQOx.js → server-node-events-UJ4Hwcsf.js} +6 -6
  91. package/dist/{status-CIZltjd7.js → status-BGUaaSHe.js} +1 -1
  92. package/dist/{status-Dgg3SlRY.js → status-Bp48-ySL.js} +1 -1
  93. package/dist/{status-CWzbgPAZ.js → status-CObdh7-H.js} +1 -1
  94. package/dist/{status-CTDVhXdb.js → status-FX0BMcCb.js} +1 -1
  95. package/dist/{subagent-registry-DQ_BPb-T.js → subagent-registry-ChDWDl_p.js} +177 -69
  96. package/dist/{synthesis-CSsmBmJc.js → synthesis-CmQvOHg6.js} +2 -2
  97. package/dist/{synthesis-XbEFEFK1.js → synthesis-DIkOQnhF.js} +2 -2
  98. package/dist/{synthesis-CDd1xqI3.js → synthesis-DdP6tbyk.js} +4 -4
  99. package/dist/{synthesis-DIqhHKjV.js → synthesis-m6WCyI41.js} +4 -4
  100. package/dist/{unified-runner-DN0asRIR.js → unified-runner-Cu3lGa3A.js} +177 -69
  101. package/dist/{unified-runner-Bm3r8UOg.js → unified-runner-DL-sfvGT.js} +178 -70
  102. package/dist/{update-cli-kysdsvn3.js → update-cli-DAKoU0Wn.js} +8 -8
  103. package/dist/{update-cli-CK7nw0t0.js → update-cli-gEBRNrm2.js} +9 -9
  104. package/package.json +1 -1
@@ -44,10 +44,10 @@ import "./tool-display-DFOL6UQ9.js";
44
44
  import "./bindings-BAOPW5eK.js";
45
45
  import "./progress-DQTvTiEg.js";
46
46
  import "./runtime-guard-Bgv3O9s4.js";
47
- import "./program-context-Bh5wzWdC.js";
47
+ import "./program-context-BvP9L_1W.js";
48
48
  import "./prompt-style-pphr4yLK.js";
49
49
  import "./note-ytwb4wwn.js";
50
- import { r as installCompletion } from "./completion-cli-P5zBWNnc.js";
50
+ import { r as installCompletion } from "./completion-cli-DLUKoSIx.js";
51
51
  import { a as gatewayInstallErrorHint, i as buildGatewayInstallPlan, n as GATEWAY_DAEMON_RUNTIME_OPTIONS, t as DEFAULT_GATEWAY_DAEMON_RUNTIME } from "./daemon-runtime-7YBz5otm.js";
52
52
  import { b as waitForGatewayReachable, f as openUrl, g as resolveControlUiLinks, i as detectBrowserOpenSupport, m as probeGatewayReachable, o as formatControlUiSshHint } from "./onboard-helpers-BKfeJ1xj.js";
53
53
  import { r as isSystemdUserServiceAvailable } from "./systemd-Dic80Qni.js";
@@ -55,7 +55,7 @@ import { t as resolveGatewayService } from "./service-BF50XyKr.js";
55
55
  import { r as healthCommand } from "./health-B5BrlZ8G.js";
56
56
  import { t as ensureControlUiAssetsBuilt } from "./control-ui-assets-CnX0W3vy.js";
57
57
  import { t as formatHealthCheckFailure } from "./health-format-Dp4xmTKn.js";
58
- import { r as ensureCompletionCacheExists, t as checkShellCompletionStatus } from "./doctor-completion-Be3Of_A2.js";
58
+ import { r as ensureCompletionCacheExists, t as checkShellCompletionStatus } from "./doctor-completion-BzfgfpBH.js";
59
59
  import { t as runTui } from "./tui-CEhOf9fk.js";
60
60
  import path from "node:path";
61
61
  import os from "node:os";
@@ -40,10 +40,10 @@ import "./bindings-c7qLJdIA.js";
40
40
  import "./progress-BOQ0hkeM.js";
41
41
  import "./prompt-style-CzRuIYtp.js";
42
42
  import "./note-Cltpxj6i.js";
43
- import "./register.subclis-D1qkm3UK.js";
44
- import "./command-registry-Br9vlIL_.js";
43
+ import "./register.subclis-Hb2xSHBy.js";
44
+ import "./command-registry-O155hUhR.js";
45
45
  import "./program-context-CGKRxOBU.js";
46
- import { r as installCompletion } from "./completion-cli-CKLoZFMQ.js";
46
+ import { r as installCompletion } from "./completion-cli-BaOjuoPX.js";
47
47
  import { a as gatewayInstallErrorHint, i as buildGatewayInstallPlan, n as GATEWAY_DAEMON_RUNTIME_OPTIONS, t as DEFAULT_GATEWAY_DAEMON_RUNTIME } from "./daemon-runtime-DaJ4Tf2a.js";
48
48
  import "./runtime-guard-ofQGcCUc.js";
49
49
  import { b as waitForGatewayReachable, f as openUrl, g as resolveControlUiLinks, i as detectBrowserOpenSupport, m as probeGatewayReachable, o as formatControlUiSshHint } from "./onboard-helpers-CCI7SimM.js";
@@ -52,7 +52,7 @@ import { t as resolveGatewayService } from "./service-Ccv3Zi5_.js";
52
52
  import { r as healthCommand } from "./health-B7yvi1O9.js";
53
53
  import { t as ensureControlUiAssetsBuilt } from "./control-ui-assets-DfBRXG5y.js";
54
54
  import { t as formatHealthCheckFailure } from "./health-format-Li703vy6.js";
55
- import { r as ensureCompletionCacheExists, t as checkShellCompletionStatus } from "./doctor-completion-Dco2Lmvy.js";
55
+ import { r as ensureCompletionCacheExists, t as checkShellCompletionStatus } from "./doctor-completion-wlBp8bv7.js";
56
56
  import { t as runTui } from "./tui-Dp58oYvX.js";
57
57
  import os from "node:os";
58
58
  import path from "node:path";
@@ -29,7 +29,7 @@ import { n as resolveConversationLabel } from "./conversation-label-DTTqF8gH.js"
29
29
  import { i as resolveSessionTranscriptPath, n as resolveSessionFilePath, o as resolveSessionTranscriptsDirForAgent, r as resolveSessionFilePathOptions, s as resolveStorePath, t as resolveDefaultSessionStorePath } from "./paths-BsT3BvfH.js";
30
30
  import { t as emitSessionTranscriptUpdate } from "./transcript-events-ChU6IQwp.js";
31
31
  import { n as saveJsonFile, t as loadJsonFile } from "./json-file-B7D44OOV.js";
32
- import { a as parseGeminiAuth, c as resolveMemorySearchConfig, d as requireApiKey, f as resolveApiKeyForProvider, h as resolveModelAuthMode, i as resolveOllamaBaseUrl, l as getApiKeyForModel, m as resolveEnvApiKey, n as retryAsync, o as collectProviderApiKeysForExecution, p as resolveAwsSdkEnvVarName, r as probeOllamaEmbeddingModels, s as executeWithApiKeyRotation, u as getCustomProviderApiKey } from "./manager-Bt-1HGg9.js";
32
+ import { a as parseGeminiAuth, c as resolveMemorySearchConfig, d as requireApiKey, f as resolveApiKeyForProvider, h as resolveModelAuthMode, i as resolveOllamaBaseUrl, l as getApiKeyForModel, m as resolveEnvApiKey, n as retryAsync, o as collectProviderApiKeysForExecution, p as resolveAwsSdkEnvVarName, r as probeOllamaEmbeddingModels, s as executeWithApiKeyRotation, u as getCustomProviderApiKey } from "./manager-CnBU0aOR.js";
33
33
  import { r as resolveCopilotApiToken, t as DEFAULT_COPILOT_API_BASE_URL } from "./github-copilot-token-dYUr1mDQ.js";
34
34
  import { c as normalizeExtraMemoryPaths, f as runTasksWithConcurrency, s as listMemoryFiles } from "./internal-Ce-sg7EN.js";
35
35
  import { n as resolveMarkdownTableMode } from "./markdown-tables-jQzXAsf3.js";
@@ -3390,7 +3390,7 @@ async function getMemorySearchManager(params) {
3390
3390
  const wrapper = new FallbackMemoryManager({
3391
3391
  primary,
3392
3392
  fallbackFactory: async () => {
3393
- const { MemoryIndexManager } = await import("./manager-Bt-1HGg9.js").then((n) => n.t);
3393
+ const { MemoryIndexManager } = await import("./manager-CnBU0aOR.js").then((n) => n.t);
3394
3394
  return await MemoryIndexManager.get(params);
3395
3395
  }
3396
3396
  }, () => QMD_MANAGER_CACHE.delete(cacheKey));
@@ -3403,7 +3403,7 @@ async function getMemorySearchManager(params) {
3403
3403
  }
3404
3404
  }
3405
3405
  try {
3406
- const { MemoryIndexManager } = await import("./manager-Bt-1HGg9.js").then((n) => n.t);
3406
+ const { MemoryIndexManager } = await import("./manager-CnBU0aOR.js").then((n) => n.t);
3407
3407
  return { manager: await MemoryIndexManager.get(params) };
3408
3408
  } catch (err) {
3409
3409
  return {
@@ -16084,13 +16084,21 @@ async function applyMediaUnderstanding(params) {
16084
16084
  * Soft warning appended when context usage crosses the threshold.
16085
16085
  * Fires once per session (tracked via `SessionEntry.contextWarningSent`).
16086
16086
  */
16087
- const SESSION_CONTEXT_WARNING_MESSAGE = "📋 Heads up — this session is approaching the context limit. Start a new session for best results. Past sessions stay in history and can be revisited there.";
16087
+ const SESSION_CONTEXT_WARNING_MESSAGE = "📋 Heads up — this session is approaching the context limit. Symi will compact older context automatically when usage reaches 90%.";
16088
16088
  /**
16089
- * Hard limit message returned when the model API rejects the turn for
16090
- * context-too-long or role-ordering reasons, and on every subsequent
16091
- * turn until the user starts a new session.
16089
+ * Inline status emitted by Symi before running compaction proactively
16090
+ * at the 90% threshold. Followed by the agent's actual response in the
16091
+ * same turn.
16092
16092
  */
16093
- const SESSION_OVERFLOW_MESSAGE = "📋 This session has reached the context limit. Please start a new session — your full conversation is saved in history and can be revisited there.";
16093
+ const SESSION_COMPACTING_MESSAGE = "📋 Context limit reached for this session. Compacting older context and continuing…";
16094
+ /**
16095
+ * Returned when compaction can't recover enough budget to continue —
16096
+ * either because the proactive compaction at 90% failed, or because a
16097
+ * single user message overshot the window in one turn and the reactive
16098
+ * fallback compaction also failed. Same message also short-circuits
16099
+ * subsequent turns until /reset or /new.
16100
+ */
16101
+ const SESSION_COMPACTION_FAILED_MESSAGE = "📋 Couldn't compact this session further. Please /reset or /new to continue — your full conversation is saved in history.";
16094
16102
 
16095
16103
  //#endregion
16096
16104
  //#region src/sessions/level-overrides.ts
@@ -41819,6 +41827,86 @@ async function handleInlineActions(params) {
41819
41827
  };
41820
41828
  }
41821
41829
 
41830
+ //#endregion
41831
+ //#region src/auto-reply/reply/middleware-context-warning.ts
41832
+ /** Threshold (fraction of context window) that triggers the soft warning. */
41833
+ const CONTEXT_WARNING_THRESHOLD = .85;
41834
+ /**
41835
+ * Threshold that triggers proactive compaction in `prepareReplyTurn`.
41836
+ * Higher than the soft warning so the user sees the heads-up first;
41837
+ * compaction runs the next turn the threshold is observed.
41838
+ */
41839
+ const CONTEXT_PROACTIVE_COMPACT_THRESHOLD = .9;
41840
+ /**
41841
+ * Pure decision for "should `prepareReplyTurn` run proactive compaction
41842
+ * before the next turn?" — extracted so the trigger logic is unit-testable
41843
+ * without mocking the rest of the prep pipeline.
41844
+ *
41845
+ * Returns true ONLY when:
41846
+ * - we have a session id (otherwise compaction has no target),
41847
+ * - we have a positive context window,
41848
+ * - we have a positive cumulative usage from the previous turn,
41849
+ * - usage / window ≥ CONTEXT_PROACTIVE_COMPACT_THRESHOLD.
41850
+ */
41851
+ function shouldProactivelyCompact(args) {
41852
+ if (!args.sessionId) return false;
41853
+ if (!args.contextTokens || args.contextTokens <= 0) return false;
41854
+ const usage = args.totalTokens ?? 0;
41855
+ if (usage <= 0) return false;
41856
+ return usage / args.contextTokens >= CONTEXT_PROACTIVE_COMPACT_THRESHOLD;
41857
+ }
41858
+ /**
41859
+ * Read the model's context-window size, falling back to the global
41860
+ * default when the model isn't in the registry yet.
41861
+ */
41862
+ function resolveContextWindow(modelId) {
41863
+ const fromRegistry = lookupContextTokens(modelId);
41864
+ if (fromRegistry && fromRegistry > 0) return fromRegistry;
41865
+ return DEFAULT_CONTEXT_TOKENS;
41866
+ }
41867
+ /**
41868
+ * After-turn hook that surfaces a one-time soft warning when usage
41869
+ * crosses the context threshold. Mutates the result text to append
41870
+ * the warning when triggered, and persists `contextWarningSent: true`
41871
+ * on the session entry so the warning doesn't fire again.
41872
+ */
41873
+ function withContextUsageWarning() {
41874
+ return (next) => async (params) => {
41875
+ const result = await next(params);
41876
+ if (result.outbound.action === "drop") return result;
41877
+ if (!params.sessionKey) return result;
41878
+ const usage = result.rawResult.meta.agentMeta?.usage?.total ?? 0;
41879
+ if (usage <= 0) return result;
41880
+ if (usage / resolveContextWindow(params.modelId ?? result.modelId) < CONTEXT_WARNING_THRESHOLD) return result;
41881
+ const agentId = resolveAgentIdFromSessionKey(params.sessionKey);
41882
+ const storePath = resolveStorePath(params.config.session?.store, { agentId });
41883
+ let alreadyWarned = false;
41884
+ try {
41885
+ await updateSessionStoreEntry({
41886
+ storePath,
41887
+ sessionKey: params.sessionKey,
41888
+ update: async (entry) => {
41889
+ if (entry.contextWarningSent === true) {
41890
+ alreadyWarned = true;
41891
+ return null;
41892
+ }
41893
+ return { contextWarningSent: true };
41894
+ }
41895
+ });
41896
+ } catch (err) {
41897
+ logVerbose(`context-warning: failed to persist contextWarningSent flag for ${params.sessionKey}: ${String(err)}`);
41898
+ return result;
41899
+ }
41900
+ if (alreadyWarned) return result;
41901
+ const trimmedText = result.text.trimEnd();
41902
+ const separator = trimmedText ? "\n\n" : "";
41903
+ return {
41904
+ ...result,
41905
+ text: `${trimmedText}${separator}${SESSION_CONTEXT_WARNING_MESSAGE}`
41906
+ };
41907
+ };
41908
+ }
41909
+
41822
41910
  //#endregion
41823
41911
  //#region src/auto-reply/reply/session-reset-model.ts
41824
41912
  function splitBody(body) {
@@ -42715,7 +42803,7 @@ async function prepareReplyTurn(ctx, opts, configOverride) {
42715
42803
  typing.cleanup();
42716
42804
  return {
42717
42805
  kind: "early-reply",
42718
- reply: { text: SESSION_OVERFLOW_MESSAGE }
42806
+ reply: { text: SESSION_COMPACTION_FAILED_MESSAGE }
42719
42807
  };
42720
42808
  }
42721
42809
  await applyResetModelOverride({
@@ -42828,6 +42916,82 @@ async function prepareReplyTurn(ctx, opts, configOverride) {
42828
42916
  };
42829
42917
  directives = inlineActionResult.directives;
42830
42918
  abortedLastRun = inlineActionResult.abortedLastRun ?? abortedLastRun;
42919
+ if (shouldProactivelyCompact({
42920
+ totalTokens: sessionEntry.totalTokens,
42921
+ contextTokens,
42922
+ sessionId: sessionEntry.sessionId
42923
+ })) {
42924
+ if (resolvedOpts?.onBlockReply) try {
42925
+ await resolvedOpts.onBlockReply({ text: SESSION_COMPACTING_MESSAGE });
42926
+ } catch (err) {
42927
+ logVerbose(`proactive-compact: inline status delivery failed: ${String(err)}`);
42928
+ }
42929
+ if (isEmbeddedPiRunActive(sessionEntry.sessionId)) {
42930
+ abortEmbeddedPiRun(sessionEntry.sessionId);
42931
+ await waitForEmbeddedPiRunEnd(sessionEntry.sessionId, 15e3);
42932
+ }
42933
+ let compactResult;
42934
+ try {
42935
+ compactResult = await compactEmbeddedPiSession({
42936
+ sessionId: sessionEntry.sessionId,
42937
+ sessionKey,
42938
+ messageChannel: command.channel,
42939
+ groupId: sessionEntry.groupId,
42940
+ groupChannel: sessionEntry.groupChannel,
42941
+ groupSpace: sessionEntry.space,
42942
+ spawnedBy: sessionEntry.spawnedBy,
42943
+ sessionFile: resolveSessionFilePath(sessionEntry.sessionId, sessionEntry, resolveSessionFilePathOptions({
42944
+ agentId,
42945
+ storePath
42946
+ })),
42947
+ workspaceDir,
42948
+ agentDir,
42949
+ config: cfg,
42950
+ skillsSnapshot: sessionEntry.skillsSnapshot,
42951
+ provider,
42952
+ model,
42953
+ thinkLevel: resolvedThinkLevel,
42954
+ reasoningLevel: resolvedReasoningLevel,
42955
+ trigger: "overflow",
42956
+ senderIsOwner: command.senderIsOwner,
42957
+ ownerNumbers: command.ownerList.length > 0 ? command.ownerList : void 0
42958
+ });
42959
+ } catch (err) {
42960
+ logVerbose(`proactive-compact: compactor threw for ${sessionKey}: ${String(err)}`);
42961
+ compactResult = {
42962
+ ok: false,
42963
+ compacted: false,
42964
+ reason: String(err)
42965
+ };
42966
+ }
42967
+ if (compactResult.ok && compactResult.compacted) await incrementCompactionCount({
42968
+ sessionEntry,
42969
+ sessionStore,
42970
+ sessionKey,
42971
+ storePath,
42972
+ tokensAfter: compactResult.result?.tokensAfter
42973
+ });
42974
+ else {
42975
+ logVerbose(`proactive-compact: failed for ${sessionKey} (${compactResult.reason ?? "unknown"})`);
42976
+ if (storePath) try {
42977
+ await updateSessionStoreEntry({
42978
+ storePath,
42979
+ sessionKey,
42980
+ update: async (entry) => {
42981
+ if (entry.endedReason === "context_overflow") return null;
42982
+ return { endedReason: "context_overflow" };
42983
+ }
42984
+ });
42985
+ } catch (err) {
42986
+ logVerbose(`proactive-compact: failed to mark session sealed: ${String(err)}`);
42987
+ }
42988
+ typing.cleanup();
42989
+ return {
42990
+ kind: "early-reply",
42991
+ reply: { text: SESSION_COMPACTION_FAILED_MESSAGE }
42992
+ };
42993
+ }
42994
+ }
42831
42995
  await stageSandboxMedia({
42832
42996
  ctx,
42833
42997
  sessionCtx,
@@ -52439,7 +52603,7 @@ async function runEmbeddedPiAgent(params) {
52439
52603
  error: err
52440
52604
  });
52441
52605
  }
52442
- const MAX_OVERFLOW_COMPACTION_ATTEMPTS = 3;
52606
+ const MAX_OVERFLOW_COMPACTION_ATTEMPTS = 1;
52443
52607
  const MAX_RUN_LOOP_ITERATIONS = resolveMaxRunRetryIterations(profileCandidates.length);
52444
52608
  let overflowCompactionAttempts = 0;
52445
52609
  let toolResultTruncationAttempted = false;
@@ -53462,8 +53626,8 @@ function extractErrorMessage(err) {
53462
53626
  function buildBoundaryResult(params) {
53463
53627
  const profile = resolveModelProfile(params.provider && params.modelId ? `${params.provider}/${params.modelId}` : "", params.config.models?.profiles);
53464
53628
  return {
53465
- text: SESSION_OVERFLOW_MESSAGE,
53466
- rawText: SESSION_OVERFLOW_MESSAGE,
53629
+ text: SESSION_COMPACTION_FAILED_MESSAGE,
53630
+ rawText: SESSION_COMPACTION_FAILED_MESSAGE,
53467
53631
  outbound: {
53468
53632
  action: "deliver",
53469
53633
  reason: "deliver"
@@ -53474,7 +53638,7 @@ function buildBoundaryResult(params) {
53474
53638
  profile,
53475
53639
  didSendViaMessagingTool: false,
53476
53640
  rawResult: {
53477
- payloads: [{ text: SESSION_OVERFLOW_MESSAGE }],
53641
+ payloads: [{ text: SESSION_COMPACTION_FAILED_MESSAGE }],
53478
53642
  meta: {
53479
53643
  durationMs: Date.now() - params.startTime,
53480
53644
  agentMeta: {
@@ -53533,62 +53697,6 @@ function withContextOverflowRecovery() {
53533
53697
  };
53534
53698
  }
53535
53699
 
53536
- //#endregion
53537
- //#region src/auto-reply/reply/middleware-context-warning.ts
53538
- /** Threshold (fraction of context window) that triggers the soft warning. */
53539
- const CONTEXT_WARNING_THRESHOLD = .85;
53540
- /**
53541
- * Read the model's context-window size, falling back to the global
53542
- * default when the model isn't in the registry yet.
53543
- */
53544
- function resolveContextWindow(modelId) {
53545
- const fromRegistry = lookupContextTokens(modelId);
53546
- if (fromRegistry && fromRegistry > 0) return fromRegistry;
53547
- return DEFAULT_CONTEXT_TOKENS;
53548
- }
53549
- /**
53550
- * After-turn hook that surfaces a one-time soft warning when usage
53551
- * crosses the context threshold. Mutates the result text to append
53552
- * the warning when triggered, and persists `contextWarningSent: true`
53553
- * on the session entry so the warning doesn't fire again.
53554
- */
53555
- function withContextUsageWarning() {
53556
- return (next) => async (params) => {
53557
- const result = await next(params);
53558
- if (result.outbound.action === "drop") return result;
53559
- if (!params.sessionKey) return result;
53560
- const usage = result.rawResult.meta.agentMeta?.usage?.total ?? 0;
53561
- if (usage <= 0) return result;
53562
- if (usage / resolveContextWindow(params.modelId ?? result.modelId) < CONTEXT_WARNING_THRESHOLD) return result;
53563
- const agentId = resolveAgentIdFromSessionKey(params.sessionKey);
53564
- const storePath = resolveStorePath(params.config.session?.store, { agentId });
53565
- let alreadyWarned = false;
53566
- try {
53567
- await updateSessionStoreEntry({
53568
- storePath,
53569
- sessionKey: params.sessionKey,
53570
- update: async (entry) => {
53571
- if (entry.contextWarningSent === true) {
53572
- alreadyWarned = true;
53573
- return null;
53574
- }
53575
- return { contextWarningSent: true };
53576
- }
53577
- });
53578
- } catch (err) {
53579
- logVerbose(`context-warning: failed to persist contextWarningSent flag for ${params.sessionKey}: ${String(err)}`);
53580
- return result;
53581
- }
53582
- if (alreadyWarned) return result;
53583
- const trimmedText = result.text.trimEnd();
53584
- const separator = trimmedText ? "\n\n" : "";
53585
- return {
53586
- ...result,
53587
- text: `${trimmedText}${separator}${SESSION_CONTEXT_WARNING_MESSAGE}`
53588
- };
53589
- };
53590
- }
53591
-
53592
53700
  //#endregion
53593
53701
  //#region src/auto-reply/reply/middleware-diagnostic-logging.ts
53594
53702
  function deriveChannel(ctx) {
@@ -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-C-Jte08L.js";
4
4
  import { i as loadConfig } from "./config-D7TcU4qN.js";
5
- import { m as loadSymiPlugins } from "./subagent-registry-DQ_BPb-T.js";
5
+ import { m as loadSymiPlugins } from "./subagent-registry-ChDWDl_p.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 { s as loadSymiPlugins } from "./unified-runner-Bm3r8UOg.js";
2
+ import { s as loadSymiPlugins } from "./unified-runner-DL-sfvGT.js";
3
3
  import { d as getActivePluginRegistry } from "./registry-Sbac4a4z.js";
4
4
  import { t as createSubsystemLogger } from "./subsystem-CHbO_DkH.js";
5
5
  import { c as resolveAgentWorkspaceDir, l as resolveDefaultAgentId } from "./agent-scope-DOrZjOnW.js";
@@ -1,6 +1,28 @@
1
1
  import type { TurnMiddleware } from "./turn-middleware.js";
2
2
  /** Threshold (fraction of context window) that triggers the soft warning. */
3
3
  export declare const CONTEXT_WARNING_THRESHOLD = 0.85;
4
+ /**
5
+ * Threshold that triggers proactive compaction in `prepareReplyTurn`.
6
+ * Higher than the soft warning so the user sees the heads-up first;
7
+ * compaction runs the next turn the threshold is observed.
8
+ */
9
+ export declare const CONTEXT_PROACTIVE_COMPACT_THRESHOLD = 0.9;
10
+ /**
11
+ * Pure decision for "should `prepareReplyTurn` run proactive compaction
12
+ * before the next turn?" — extracted so the trigger logic is unit-testable
13
+ * without mocking the rest of the prep pipeline.
14
+ *
15
+ * Returns true ONLY when:
16
+ * - we have a session id (otherwise compaction has no target),
17
+ * - we have a positive context window,
18
+ * - we have a positive cumulative usage from the previous turn,
19
+ * - usage / window ≥ CONTEXT_PROACTIVE_COMPACT_THRESHOLD.
20
+ */
21
+ export declare function shouldProactivelyCompact(args: {
22
+ totalTokens: number | undefined;
23
+ contextTokens: number | undefined;
24
+ sessionId: string | undefined;
25
+ }): boolean;
4
26
  /**
5
27
  * After-turn hook that surfaces a one-time soft warning when usage
6
28
  * crosses the context threshold. Mutates the result text to append
@@ -4,8 +4,21 @@
4
4
  */
5
5
  export declare const SESSION_CONTEXT_WARNING_MESSAGE: string;
6
6
  /**
7
- * Hard limit message returned when the model API rejects the turn for
8
- * context-too-long or role-ordering reasons, and on every subsequent
9
- * turn until the user starts a new session.
7
+ * Inline status emitted by Symi before running compaction proactively
8
+ * at the 90% threshold. Followed by the agent's actual response in the
9
+ * same turn.
10
+ */
11
+ export declare const SESSION_COMPACTING_MESSAGE = "\uD83D\uDCCB Context limit reached for this session. Compacting older context and continuing\u2026";
12
+ /**
13
+ * Returned when compaction can't recover enough budget to continue —
14
+ * either because the proactive compaction at 90% failed, or because a
15
+ * single user message overshot the window in one turn and the reactive
16
+ * fallback compaction also failed. Same message also short-circuits
17
+ * subsequent turns until /reset or /new.
18
+ */
19
+ export declare const SESSION_COMPACTION_FAILED_MESSAGE: string;
20
+ /**
21
+ * @deprecated Use SESSION_COMPACTION_FAILED_MESSAGE. Kept as an alias
22
+ * during the 3.5.6 transition; the new code path renders the same text.
10
23
  */
11
24
  export declare const SESSION_OVERFLOW_MESSAGE: string;
@@ -4,7 +4,7 @@ import path from "node:path";
4
4
  import fs, { constants, readFileSync } from "node:fs";
5
5
  import os from "node:os";
6
6
  import { Logger } from "tslog";
7
- import JSON5 from "json5";
7
+ import json5 from "json5";
8
8
  import chalk, { Chalk } from "chalk";
9
9
  import fs$1, { mkdtemp, rm } from "node:fs/promises";
10
10
  import { z } from "zod";
@@ -294,7 +294,7 @@ function readLoggingConfig() {
294
294
  try {
295
295
  if (!fs.existsSync(configPath)) return;
296
296
  const raw = fs.readFileSync(configPath, "utf-8");
297
- const logging = JSON5.parse(raw)?.logging;
297
+ const logging = json5.parse(raw)?.logging;
298
298
  if (!logging || typeof logging !== "object" || Array.isArray(logging)) return;
299
299
  return logging;
300
300
  } catch {
@@ -7392,7 +7392,7 @@ function safeRealpath(target) {
7392
7392
  }
7393
7393
  const defaultResolver = {
7394
7394
  readFile: (p) => fs.readFileSync(p, "utf-8"),
7395
- parseJson: (raw) => JSON5.parse(raw)
7395
+ parseJson: (raw) => json5.parse(raw)
7396
7396
  };
7397
7397
  /**
7398
7398
  * Resolves all $include directives in a parsed config object.
@@ -10623,7 +10623,7 @@ function resolveConfigPathForDeps(deps) {
10623
10623
  function normalizeDeps(overrides = {}) {
10624
10624
  return {
10625
10625
  fs: overrides.fs ?? fs,
10626
- json5: overrides.json5 ?? JSON5,
10626
+ json5: overrides.json5 ?? json5,
10627
10627
  env: overrides.env ?? process.env,
10628
10628
  homedir: overrides.homedir ?? (() => resolveRequiredHomeDir(overrides.env ?? process.env, os.homedir)),
10629
10629
  configPath: overrides.configPath ?? "",
@@ -10634,11 +10634,11 @@ function maybeLoadDotEnvForConfig(env) {
10634
10634
  if (env !== process.env) return;
10635
10635
  loadDotEnv({ quiet: true });
10636
10636
  }
10637
- function parseConfigJson5(raw, json5 = JSON5) {
10637
+ function parseConfigJson5(raw, json5$1 = json5) {
10638
10638
  try {
10639
10639
  return {
10640
10640
  ok: true,
10641
- parsed: json5.parse(raw)
10641
+ parsed: json5$1.parse(raw)
10642
10642
  };
10643
10643
  } catch (err) {
10644
10644
  return {
@@ -1,4 +1,4 @@
1
- import "./unified-runner-Bm3r8UOg.js";
1
+ import "./unified-runner-DL-sfvGT.js";
2
2
  import { j as theme } from "./registry-Sbac4a4z.js";
3
3
  import { _ as resolveStateDir } from "./paths-By0XjHBk.js";
4
4
  import { _ as shortenHomeInString, h as resolveUserPath, p as resolveConfigDir, v as shortenHomePath } from "./utils-CTPsqyE_.js";
@@ -50,8 +50,8 @@ import "./session-cost-usage-D3mgssM_.js";
50
50
  import "./session-utils-Cs1jlD-q.js";
51
51
  import "./with-timeout-GbJ1Yzsh.js";
52
52
  import "./reply-prefix-BFNeXT65.js";
53
- import "./memory-CgWOtF4K.js";
54
- import "./manager-CC13EPO9.js";
53
+ import "./memory-BsGfHO_F.js";
54
+ import "./manager-CvqH_tah.js";
55
55
  import "./sqlite-Cod7C5ba.js";
56
56
  import "./chunk-BxfKjCUx.js";
57
57
  import "./markdown-tables-CS1Tvb3z.js";
@@ -82,7 +82,7 @@ import { t as formatDocsLink } from "./links-CQZxjjCO.js";
82
82
  import "./cli-utils-CbnnSB38.js";
83
83
  import "./help-format-8IYCRvx1.js";
84
84
  import "./progress-DQTvTiEg.js";
85
- import "./memory-cli-vN3fGs79.js";
85
+ import "./memory-cli-BwQsPEFk.js";
86
86
  import "./logging-CLWZ3KQI.js";
87
87
  import "./replies-C5CBlnFS.js";
88
88
  import "./pi-tools.policy-WaLKhqJQ.js";
@@ -92,7 +92,7 @@ import "./npm-registry-spec-DPqOMFd9.js";
92
92
  import "./skill-scanner-D5p8L-xO.js";
93
93
  import { i as resolvePluginInstallDir, n as installPluginFromNpmSpec, r as installPluginFromPath, t as recordPluginInstall } from "./installs-Bb1phV9x.js";
94
94
  import { t as renderTable } from "./table-Ds5CZCyv.js";
95
- import { t as buildPluginStatusReport } from "./status-CWzbgPAZ.js";
95
+ import { t as buildPluginStatusReport } from "./status-CObdh7-H.js";
96
96
  import { n as updateNpmInstalledPlugins } from "./update-CcacbR32.js";
97
97
  import path from "node:path";
98
98
  import fs from "node:fs";
@@ -17,7 +17,7 @@ import "./client-DhdWcgZP.js";
17
17
  import "./call-ogggp9QZ.js";
18
18
  import "./message-channel-DXToSaWK.js";
19
19
  import "./pairing-token-B-OTYROz.js";
20
- import "./subagent-registry-DQ_BPb-T.js";
20
+ import "./subagent-registry-ChDWDl_p.js";
21
21
  import "./sessions-Dn6VXn4p.js";
22
22
  import "./plugins-BsEhWvLn.js";
23
23
  import "./send-Dq252-bi.js";
@@ -47,8 +47,8 @@ import "./model-auth-Byr7Gic_.js";
47
47
  import "./github-copilot-token-B5y4__YM.js";
48
48
  import "./models-config-CiR_RUxw.js";
49
49
  import "./reply-prefix-DV3KhOhL.js";
50
- import "./memory-d0YI5Lr0.js";
51
- import "./manager-DghM7T-b.js";
50
+ import "./memory-CbwmxmxW.js";
51
+ import "./manager-BVPXSK-I.js";
52
52
  import "./sqlite-9jF_eajd.js";
53
53
  import "./chunk-B2lBXhR0.js";
54
54
  import "./markdown-tables-BEdkErjm.js";
@@ -79,7 +79,7 @@ import { t as formatDocsLink } from "./links-B9CbwY46.js";
79
79
  import "./cli-utils-Ca0KE-dW.js";
80
80
  import "./help-format-BTNd5kFC.js";
81
81
  import "./progress-BOQ0hkeM.js";
82
- import "./memory-cli-DGheAg5i.js";
82
+ import "./memory-cli-B1dFPZw-.js";
83
83
  import "./logging-uD67RPtO.js";
84
84
  import "./replies-_DV8VSSj.js";
85
85
  import "./pi-tools.policy-CU8U7--z.js";
@@ -88,7 +88,7 @@ import "./npm-registry-spec-CONWlhd6.js";
88
88
  import "./skill-scanner-EhsZUzzk.js";
89
89
  import { i as resolvePluginInstallDir, n as installPluginFromNpmSpec, r as installPluginFromPath, t as recordPluginInstall } from "./installs-BVJQl3Tj.js";
90
90
  import { t as renderTable } from "./table-Dm8jYqmW.js";
91
- import { t as buildPluginStatusReport } from "./status-CIZltjd7.js";
91
+ import { t as buildPluginStatusReport } from "./status-BGUaaSHe.js";
92
92
  import { n as updateNpmInstalledPlugins } from "./update-BDo7wxMf.js";
93
93
  import os from "node:os";
94
94
  import path from "node:path";
@@ -18,7 +18,7 @@ import "./client-DhdWcgZP.js";
18
18
  import "./call-ogggp9QZ.js";
19
19
  import "./message-channel-DXToSaWK.js";
20
20
  import "./pairing-token-B-OTYROz.js";
21
- import "./subagent-registry-DQ_BPb-T.js";
21
+ import "./subagent-registry-ChDWDl_p.js";
22
22
  import "./sessions-Dn6VXn4p.js";
23
23
  import "./plugins-BsEhWvLn.js";
24
24
  import "./send-Dq252-bi.js";
@@ -48,8 +48,8 @@ import "./model-auth-Byr7Gic_.js";
48
48
  import "./github-copilot-token-B5y4__YM.js";
49
49
  import "./models-config-CiR_RUxw.js";
50
50
  import "./reply-prefix-DV3KhOhL.js";
51
- import "./memory-d0YI5Lr0.js";
52
- import "./manager-DghM7T-b.js";
51
+ import "./memory-CbwmxmxW.js";
52
+ import "./manager-BVPXSK-I.js";
53
53
  import "./sqlite-9jF_eajd.js";
54
54
  import "./chunk-B2lBXhR0.js";
55
55
  import "./markdown-tables-BEdkErjm.js";
@@ -80,18 +80,18 @@ import { t as formatDocsLink } from "./links-B9CbwY46.js";
80
80
  import "./cli-utils-Ca0KE-dW.js";
81
81
  import "./help-format-BTNd5kFC.js";
82
82
  import "./progress-BOQ0hkeM.js";
83
- import "./memory-cli-DGheAg5i.js";
83
+ import "./memory-cli-B1dFPZw-.js";
84
84
  import "./logging-uD67RPtO.js";
85
85
  import "./replies-_DV8VSSj.js";
86
86
  import "./pi-tools.policy-CU8U7--z.js";
87
87
  import "./catalog-BaM8d1-T.js";
88
- import "./plugin-registry-L1h7mxjX.js";
89
- import { n as resolveCliChannelOptions } from "./channel-options-_DJXj921.js";
90
- import { t as getSubCliCommandsWithSubcommands } from "./register.subclis-D1qkm3UK.js";
91
- import { a as registerProgramCommands, r as getCoreCliCommandsWithSubcommands } from "./command-registry-Br9vlIL_.js";
88
+ import "./plugin-registry-BLoSesyj.js";
89
+ import { n as resolveCliChannelOptions } from "./channel-options-CdIEyHya.js";
90
+ import { t as getSubCliCommandsWithSubcommands } from "./register.subclis-Hb2xSHBy.js";
91
+ import { a as registerProgramCommands, r as getCoreCliCommandsWithSubcommands } from "./command-registry-O155hUhR.js";
92
92
  import { r as setProgramContext } from "./program-context-CGKRxOBU.js";
93
93
  import { t as forceFreePort } from "./ports-C2swmreL.js";
94
- import { n as formatCliBannerLine, r as hasEmittedCliBanner, t as emitCliBanner } from "./banner-D-ssxnQN.js";
94
+ import { n as formatCliBannerLine, r as hasEmittedCliBanner, t as emitCliBanner } from "./banner-CApT91CY.js";
95
95
  import { Command } from "commander";
96
96
 
97
97
  //#region src/cli/program/context.ts
@@ -199,7 +199,7 @@ function registerPreActionHooks(program, programVersion) {
199
199
  commandPath
200
200
  });
201
201
  if (PLUGIN_REQUIRED_COMMANDS.has(commandPath[0])) {
202
- const { ensurePluginRegistryLoaded } = await import("./plugin-registry-L1h7mxjX.js").then((n) => n.n);
202
+ const { ensurePluginRegistryLoaded } = await import("./plugin-registry-BLoSesyj.js").then((n) => n.n);
203
203
  ensurePluginRegistryLoaded();
204
204
  }
205
205
  });