@symerian/symi 3.5.5 → 3.5.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 (108) 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/{chrome-3jl2ulOE.js → chrome-DNssqQJs.js} +7 -7
  16. package/dist/{cli-Qq7pr2SX.js → cli-DEGt0Tp0.js} +4 -4
  17. package/dist/{cli-D4cMWhob.js → cli-DtdTf-ZQ.js} +4 -4
  18. package/dist/{command-registry-Br9vlIL_.js → command-registry-O155hUhR.js} +10 -10
  19. package/dist/{completion-cli-CKLoZFMQ.js → completion-cli-BaOjuoPX.js} +2 -2
  20. package/dist/{completion-cli-P5zBWNnc.js → completion-cli-DLUKoSIx.js} +1 -1
  21. package/dist/{config-cli-NvqRZAqr.js → config-cli-BuZ-L1Iw.js} +1 -1
  22. package/dist/{config-cli-CcJOubCt.js → config-cli-BxWavRxN.js} +1 -1
  23. package/dist/{configure-C7BfUqKR.js → configure-BSKWgEhS.js} +2 -2
  24. package/dist/{configure-B1RJ6bi3.js → configure-gxAEhC9E.js} +2 -2
  25. package/dist/control-ui/js/app.js +8 -0
  26. package/dist/{deliver-f3cIWxXT.js → deliver-q23ar_Pm.js} +4 -4
  27. package/dist/{doctor-completion-Be3Of_A2.js → doctor-completion-BzfgfpBH.js} +1 -1
  28. package/dist/{doctor-completion-Dco2Lmvy.js → doctor-completion-wlBp8bv7.js} +1 -1
  29. package/dist/entry.js +1 -1
  30. package/dist/extensionAPI.js +4 -4
  31. package/dist/{gateway-cli-XV8T-ix8.js → gateway-cli-Bz5fqsnE.js} +10 -10
  32. package/dist/{gateway-cli-BQAh5DqM.js → gateway-cli-_xNZ2L_e.js} +10 -10
  33. package/dist/{glass-ui-ws-1FOCi0nn.js → glass-ui-ws-CbKVlQRh.js} +8 -8
  34. package/dist/{glass-ui-ws-CqGzDNV7.js → glass-ui-ws-DO8WKPIK.js} +8 -8
  35. package/dist/{hooks-cli-D7iTDry_.js → hooks-cli-CrgD2ZqP.js} +5 -5
  36. package/dist/{hooks-cli-BPa-ssdB.js → hooks-cli-mwiHuRfO.js} +5 -5
  37. package/dist/index.js +8 -8
  38. package/dist/llm-slug-generator.js +2 -2
  39. package/dist/{manager-DghM7T-b.js → manager-BVPXSK-I.js} +1 -1
  40. package/dist/{manager-Ck1YSfr6.js → manager-CpBJ1BE6.js} +1 -1
  41. package/dist/{manager-CC13EPO9.js → manager-CvqH_tah.js} +1 -1
  42. package/dist/{manager-Bt-1HGg9.js → manager-D9m8F3HR.js} +1 -1
  43. package/dist/{memory-CgWOtF4K.js → memory-BsGfHO_F.js} +2 -2
  44. package/dist/{memory-d0YI5Lr0.js → memory-CbwmxmxW.js} +2 -2
  45. package/dist/{memory-cli-DGheAg5i.js → memory-cli-B1dFPZw-.js} +2 -2
  46. package/dist/{memory-cli-vN3fGs79.js → memory-cli-BwQsPEFk.js} +2 -2
  47. package/dist/{models-CBw1pGIq.js → models-Dm6dSSSx.js} +2 -2
  48. package/dist/{models-cli-Bmh1S3iG.js → models-cli-BA6ufqLd.js} +5 -5
  49. package/dist/{models-cli-BBReZHNq.js → models-cli-BPSrz6tf.js} +6 -6
  50. package/dist/{onboard-Csj4sOF5.js → onboard-CjnPughY.js} +1 -1
  51. package/dist/{onboard-LVUmCZhX.js → onboard-Cmz6Rtm-.js} +1 -1
  52. package/dist/{onboard-channels-vDtX0e0w.js → onboard-channels-Cozz3CQv.js} +1 -1
  53. package/dist/{onboard-channels-mrSIlZDB.js → onboard-channels-D00NAtQt.js} +1 -1
  54. package/dist/{onboarding-DojADc8N.js → onboarding-BPZb40BJ.js} +3 -3
  55. package/dist/{onboarding-D2VmoKU1.js → onboarding-BrTMOcPF.js} +3 -3
  56. package/dist/{onboarding.finalize-C4BwVw6u.js → onboarding.finalize-Bd2rGMjo.js} +3 -3
  57. package/dist/{onboarding.finalize-Bi1wSEtw.js → onboarding.finalize-BiL_LXrR.js} +4 -4
  58. package/dist/{pi-embedded-zSv7VKNQ.js → pi-embedded-C2-v_4OT.js} +184 -76
  59. package/dist/{plugin-registry-L1h7mxjX.js → plugin-registry-BLoSesyj.js} +1 -1
  60. package/dist/{plugin-registry-Dq6OJ45H.js → plugin-registry-CZDG8fjK.js} +1 -1
  61. package/dist/plugin-sdk/auto-reply/reply/middleware-context-warning.d.ts +22 -0
  62. package/dist/plugin-sdk/auto-reply/session-boundary-messages.d.ts +16 -3
  63. package/dist/plugin-sdk/index.js +6 -6
  64. package/dist/{plugins-cli-C9ehLXaT.js → plugins-cli-2yraoR6V.js} +5 -5
  65. package/dist/{plugins-cli-BEIKMoVH.js → plugins-cli-CGs9-UtO.js} +5 -5
  66. package/dist/{program-iTd2Dei7.js → program-BnKEJpZF.js} +10 -10
  67. package/dist/{program-context-Bh5wzWdC.js → program-context-BvP9L_1W.js} +18 -18
  68. package/dist/{prompt-select-styled-CNFytCD3.js → prompt-select-styled-BTF5vvv8.js} +4 -4
  69. package/dist/{prompt-select-styled-fXotfbCt.js → prompt-select-styled-Brx330O3.js} +4 -4
  70. package/dist/{provider-auth-helpers-Dho1n21x.js → provider-auth-helpers-CppzYZM9.js} +1 -1
  71. package/dist/{provider-auth-helpers-DBrH-cce.js → provider-auth-helpers-hjy3e-oS.js} +1 -1
  72. package/dist/{push-apns-DpyCFRTu.js → push-apns-BD2iO09c.js} +1 -1
  73. package/dist/{push-apns-DYYY9NOE.js → push-apns-DJ55TFPT.js} +1 -1
  74. package/dist/{pw-ai-DOAsQ5NX.js → pw-ai-v__CyAlM.js} +1 -1
  75. package/dist/{register.agent-BYpBNbHe.js → register.agent-DTGvQGla.js} +9 -9
  76. package/dist/{register.agent-DceNHGi_.js → register.agent-Dz_P7PxO.js} +8 -8
  77. package/dist/{register.configure-09lIIUvq.js → register.configure-CrgU3FzU.js} +8 -8
  78. package/dist/{register.configure-UUZqL0Ck.js → register.configure-D9w7Tm9e.js} +8 -8
  79. package/dist/{register.maintenance-DdX8GZpv.js → register.maintenance-CqvrXPF7.js} +9 -9
  80. package/dist/{register.maintenance-CsoEyVyl.js → register.maintenance-d5xHdDgu.js} +8 -8
  81. package/dist/{register.message-RYn7LD6-.js → register.message-C0tqgEor.js} +5 -5
  82. package/dist/{register.message-CAM62MaW.js → register.message-DNMCxaAD.js} +5 -5
  83. package/dist/{register.onboard-CoRtNlNa.js → register.onboard--eJVfJGa.js} +2 -2
  84. package/dist/{register.onboard-DhR5o8KO.js → register.onboard-dkAvGraV.js} +2 -2
  85. package/dist/{register.setup-CI_RT1Wa.js → register.setup-CgufX-6c.js} +2 -2
  86. package/dist/{register.setup-CEjhFwYz.js → register.setup-Dwh0ylCS.js} +2 -2
  87. package/dist/{register.status-health-sessions-DNlsQ-xt.js → register.status-health-sessions-BeAm7HAq.js} +3 -3
  88. package/dist/{register.status-health-sessions-8N1xEKl7.js → register.status-health-sessions-D6BRCFg_.js} +3 -3
  89. package/dist/{register.subclis-D1qkm3UK.js → register.subclis-Hb2xSHBy.js} +9 -9
  90. package/dist/{run-main-hKg6FDt6.js → run-main-B_NTFmz1.js} +17 -17
  91. package/dist/{server-methods-bIWvtXlT.js → server-methods-CFWjtx32.js} +7 -7
  92. package/dist/{server-methods-CXoipzKe.js → server-methods-Cz_-FX5B.js} +7 -7
  93. package/dist/{server-node-events-BD8wnswX.js → server-node-events-BiMD-Sik.js} +6 -6
  94. package/dist/{server-node-events-nQkNuQOx.js → server-node-events-UJ4Hwcsf.js} +6 -6
  95. package/dist/{status-CIZltjd7.js → status-BGUaaSHe.js} +1 -1
  96. package/dist/{status-Dgg3SlRY.js → status-Bp48-ySL.js} +1 -1
  97. package/dist/{status-CWzbgPAZ.js → status-CObdh7-H.js} +1 -1
  98. package/dist/{status-CTDVhXdb.js → status-FX0BMcCb.js} +1 -1
  99. package/dist/{subagent-registry-DQ_BPb-T.js → subagent-registry-ChDWDl_p.js} +177 -69
  100. package/dist/{synthesis-CSsmBmJc.js → synthesis-CmQvOHg6.js} +2 -2
  101. package/dist/{synthesis-CDd1xqI3.js → synthesis-DdP6tbyk.js} +4 -4
  102. package/dist/{synthesis-XbEFEFK1.js → synthesis-Dq-zHW08.js} +4 -4
  103. package/dist/{synthesis-DIqhHKjV.js → synthesis-m6WCyI41.js} +4 -4
  104. package/dist/{unified-runner-DN0asRIR.js → unified-runner-Cu3lGa3A.js} +177 -69
  105. package/dist/{unified-runner-Bm3r8UOg.js → unified-runner-DL-sfvGT.js} +178 -70
  106. package/dist/{update-cli-kysdsvn3.js → update-cli-DAKoU0Wn.js} +8 -8
  107. package/dist/{update-cli-CK7nw0t0.js → update-cli-gEBRNrm2.js} +9 -9
  108. package/package.json +1 -1
@@ -13,7 +13,7 @@ import { a as ensureWorkspaceAndSessions, b as waitForGatewayReachable, c as han
13
13
  import { r as isSystemdUserServiceAvailable } from "./systemd-Dtydk5-z.js";
14
14
  import { t as resolveGatewayService } from "./service-Ccv3Zi5_.js";
15
15
  import { r as healthCommand } from "./health-B7yvi1O9.js";
16
- import { t as runOnboardingWizard } from "./onboarding-D2VmoKU1.js";
16
+ import { t as runOnboardingWizard } from "./onboarding-BrTMOcPF.js";
17
17
  import { $ as setHuggingfaceApiKey, A as applyXaiConfig, B as applyVercelAiGatewayConfig, E as applyTogetherConfig, I as applyLitellmConfig, M as applyXiaomiConfig, O as applyVeniceConfig, P as applyZaiConfig, Q as setGeminiApiKey, R as applyCloudflareAiGatewayConfig, S as applyQianfanConfig, X as setAnthropicApiKey, Z as setCloudflareAiGatewayConfig, _ as applyMoonshotConfigCn, a as applyMinimaxApiConfig, at as setOpenrouterApiKey, b as applyOpenrouterConfig, ct as setTogetherApiKey, d as applyAuthProfileConfig, dt as setXaiApiKey, et as setKimiCodingApiKey, f as applyHuggingfaceConfig, ft as setXiaomiApiKey, g as applyMoonshotConfig, it as setOpencodeZenApiKey, l as applyMinimaxConfig, lt as setVeniceApiKey, m as applyKimiCodeConfig, n as validateAnthropicSetupToken, nt as setMinimaxApiKey, o as applyMinimaxApiConfigCn, ot as setQianfanApiKey, pt as setZaiApiKey, r as applyOpencodeZenConfig, rt as setMoonshotApiKey, st as setSyntheticApiKey, t as buildTokenProfileId, tt as setLitellmApiKey, ut as setVercelAiGatewayApiKey, w as applySyntheticConfig } from "./auth-token-lPWiklDD.js";
18
18
  import { n as logConfigUpdated } from "./logging-BRejMykf.js";
19
19
  import { n as isDeprecatedAuthChoice, r as normalizeLegacyOnboardAuthChoice } from "./auth-choice-legacy-iEyARXI2.js";
@@ -15,7 +15,7 @@ import { a as ensureWorkspaceAndSessions, b as waitForGatewayReachable, c as han
15
15
  import { r as isSystemdUserServiceAvailable } from "./systemd-Dic80Qni.js";
16
16
  import { t as resolveGatewayService } from "./service-BF50XyKr.js";
17
17
  import { r as healthCommand } from "./health-B5BrlZ8G.js";
18
- import { t as runOnboardingWizard } from "./onboarding-DojADc8N.js";
18
+ import { t as runOnboardingWizard } from "./onboarding-BPZb40BJ.js";
19
19
  import { $ as setHuggingfaceApiKey, A as applyXaiConfig, B as applyVercelAiGatewayConfig, E as applyTogetherConfig, I as applyLitellmConfig, M as applyXiaomiConfig, O as applyVeniceConfig, P as applyZaiConfig, Q as setGeminiApiKey, R as applyCloudflareAiGatewayConfig, S as applyQianfanConfig, X as setAnthropicApiKey, Z as setCloudflareAiGatewayConfig, _ as applyMoonshotConfigCn, a as applyMinimaxApiConfig, at as setOpenrouterApiKey, b as applyOpenrouterConfig, ct as setTogetherApiKey, d as applyAuthProfileConfig, dt as setXaiApiKey, et as setKimiCodingApiKey, f as applyHuggingfaceConfig, ft as setXiaomiApiKey, g as applyMoonshotConfig, it as setOpencodeZenApiKey, l as applyMinimaxConfig, lt as setVeniceApiKey, m as applyKimiCodeConfig, n as validateAnthropicSetupToken, nt as setMinimaxApiKey, o as applyMinimaxApiConfigCn, ot as setQianfanApiKey, pt as setZaiApiKey, r as applyOpencodeZenConfig, rt as setMoonshotApiKey, st as setSyntheticApiKey, t as buildTokenProfileId, tt as setLitellmApiKey, ut as setVercelAiGatewayApiKey, w as applySyntheticConfig } from "./auth-token-DyhvQgv4.js";
20
20
  import { n as logConfigUpdated } from "./logging-BmJ5ky59.js";
21
21
  import { n as isDeprecatedAuthChoice, r as normalizeLegacyOnboardAuthChoice } from "./auth-choice-legacy-BZWIpO92.js";
@@ -3,7 +3,7 @@ import { E as formatChannelSelectionLine, O as listChatChannels, T as formatChan
3
3
  import { t as formatCliCommand } from "./command-format-B3nkKRhC.js";
4
4
  import { m as normalizeAccountId, p as DEFAULT_ACCOUNT_ID } from "./session-key-CFxFgYxM.js";
5
5
  import { c as resolveAgentWorkspaceDir, l as resolveDefaultAgentId } from "./agent-scope-C-Jte08L.js";
6
- import { m as loadSymiPlugins, p as createPluginLoaderLogger } from "./subagent-registry-DQ_BPb-T.js";
6
+ import { m as loadSymiPlugins, p as createPluginLoaderLogger } from "./subagent-registry-ChDWDl_p.js";
7
7
  import { n as listChannelPlugins, t as getChannelPlugin } from "./plugins-BsEhWvLn.js";
8
8
  import { t as formatDocsLink } from "./links-B9CbwY46.js";
9
9
  import { r as listChannelPluginCatalogEntries } from "./catalog-BaM8d1-T.js";
@@ -1,5 +1,5 @@
1
1
  import { t as __exportAll } from "./rolldown-runtime-Cbj13DAv.js";
2
- import { o as createPluginLoaderLogger, s as loadSymiPlugins } from "./unified-runner-Bm3r8UOg.js";
2
+ import { o as createPluginLoaderLogger, s as loadSymiPlugins } from "./unified-runner-DL-sfvGT.js";
3
3
  import { a as formatChannelSelectionLine, i as formatChannelPrimerLine, s as listChatChannels } from "./registry-Sbac4a4z.js";
4
4
  import { t as createSubsystemLogger } from "./subsystem-CHbO_DkH.js";
5
5
  import { t as formatCliCommand } from "./command-format-BzjsXBTi.js";
@@ -225,7 +225,7 @@ async function runOnboardingWizard(opts, runtime = defaultRuntime, prompter) {
225
225
  const { ensureAuthProfileStore } = await import("./auth-profiles-Ce7R_25e.js").then((n) => n.t);
226
226
  const { promptAuthChoiceGrouped } = await import("./auth-choice-prompt-BnvC700A.js").then((n) => n.t);
227
227
  const { promptCustomApiConfig } = await import("./onboard-custom-BCcuL4Uq.js").then((n) => n.r);
228
- const { applyAuthChoice, resolvePreferredProviderForAuthChoice, warnIfModelConfigLooksOff } = await import("./auth-choice-CB0rQByJ.js").then((n) => n.t);
228
+ const { applyAuthChoice, resolvePreferredProviderForAuthChoice, warnIfModelConfigLooksOff } = await import("./auth-choice-D-iIJjJY.js").then((n) => n.t);
229
229
  const { applyPrimaryModel, promptDefaultModel } = await import("./model-picker-DN-co6Oy.js").then((n) => n.i);
230
230
  const authStore = ensureAuthProfileStore(void 0, { allowKeychainPrompt: false });
231
231
  const authChoiceFromPrompt = opts.authChoice === void 0;
@@ -278,7 +278,7 @@ async function runOnboardingWizard(opts, runtime = defaultRuntime, prompter) {
278
278
  if (opts.skipChannels ?? opts.skipProviders) await prompter.note("Skipping channel setup.", "Channels");
279
279
  else {
280
280
  const { listChannelPlugins } = await import("./plugins-CF5skkHh.js").then((n) => n.i);
281
- const { setupChannels } = await import("./onboard-channels-mrSIlZDB.js").then((n) => n.n);
281
+ const { setupChannels } = await import("./onboard-channels-D00NAtQt.js").then((n) => n.n);
282
282
  const quickstartAllowFromChannels = flow === "quickstart" ? listChannelPlugins().filter((plugin) => plugin.meta.quickstartAllowFrom).map((plugin) => plugin.id) : [];
283
283
  nextConfig = await setupChannels(nextConfig, runtime, prompter, {
284
284
  allowSignalInstall: true,
@@ -304,7 +304,7 @@ async function runOnboardingWizard(opts, runtime = defaultRuntime, prompter) {
304
304
  mode
305
305
  });
306
306
  await writeConfigFile(nextConfig);
307
- const { finalizeOnboardingWizard } = await import("./onboarding.finalize-C4BwVw6u.js");
307
+ const { finalizeOnboardingWizard } = await import("./onboarding.finalize-Bd2rGMjo.js");
308
308
  const { launchedTui } = await finalizeOnboardingWizard({
309
309
  flow,
310
310
  opts,
@@ -223,7 +223,7 @@ async function runOnboardingWizard(opts, runtime = defaultRuntime, prompter) {
223
223
  const { ensureAuthProfileStore } = await import("./auth-profiles-D11Xw15i.js").then((n) => n.t);
224
224
  const { promptAuthChoiceGrouped } = await import("./auth-choice-prompt-kt2FcieM.js").then((n) => n.t);
225
225
  const { promptCustomApiConfig } = await import("./onboard-custom-C-wfNtOM.js").then((n) => n.r);
226
- const { applyAuthChoice, resolvePreferredProviderForAuthChoice, warnIfModelConfigLooksOff } = await import("./auth-choice-BL4lqaJL.js").then((n) => n.t);
226
+ const { applyAuthChoice, resolvePreferredProviderForAuthChoice, warnIfModelConfigLooksOff } = await import("./auth-choice-CucG4Wor.js").then((n) => n.t);
227
227
  const { applyPrimaryModel, promptDefaultModel } = await import("./model-picker-CS_h9RHv.js").then((n) => n.i);
228
228
  const authStore = ensureAuthProfileStore(void 0, { allowKeychainPrompt: false });
229
229
  const authChoiceFromPrompt = opts.authChoice === void 0;
@@ -276,7 +276,7 @@ async function runOnboardingWizard(opts, runtime = defaultRuntime, prompter) {
276
276
  if (opts.skipChannels ?? opts.skipProviders) await prompter.note("Skipping channel setup.", "Channels");
277
277
  else {
278
278
  const { listChannelPlugins } = await import("./plugins-BsEhWvLn.js").then((n) => n.i);
279
- const { setupChannels } = await import("./onboard-channels-vDtX0e0w.js").then((n) => n.n);
279
+ const { setupChannels } = await import("./onboard-channels-Cozz3CQv.js").then((n) => n.n);
280
280
  const quickstartAllowFromChannels = flow === "quickstart" ? listChannelPlugins().filter((plugin) => plugin.meta.quickstartAllowFrom).map((plugin) => plugin.id) : [];
281
281
  nextConfig = await setupChannels(nextConfig, runtime, prompter, {
282
282
  allowSignalInstall: true,
@@ -302,7 +302,7 @@ async function runOnboardingWizard(opts, runtime = defaultRuntime, prompter) {
302
302
  mode
303
303
  });
304
304
  await writeConfigFile(nextConfig);
305
- const { finalizeOnboardingWizard } = await import("./onboarding.finalize-Bi1wSEtw.js");
305
+ const { finalizeOnboardingWizard } = await import("./onboarding.finalize-BiL_LXrR.js");
306
306
  const { launchedTui } = await finalizeOnboardingWizard({
307
307
  flow,
308
308
  opts,
@@ -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";
@@ -9,7 +9,7 @@ import { i as resolveAckReaction, o as resolveEffectiveMessagesConfig, r as reso
9
9
  import { t as normalizeChatType } from "./chat-type-Acj2OK2p.js";
10
10
  import { i as resolveSlackAccount, n as listChannelPlugins, o as resolveSlackAppToken, r as normalizeChannelId$1, s as resolveSlackBotToken, t as getChannelPlugin } from "./plugins-CZ_mYwXq.js";
11
11
  import { S as resolveSlackChannelId, _ as resolveSlackWebClientOptions, a as sendMessageSlack, b as buildSlackBlocksFallbackText, c as getDefaultLocalRoots, d as fetchRemoteMedia, f as readResponseWithLimit, g as createSlackWebClient, h as fetchWithTimeout, i as resolveSlackThreadTs, l as loadWebMedia, m as bindAbortRelay, n as deliverReplies, o as renderMarkdownWithMarkers, p as fetchWithSsrFGuard, s as markdownToIRWithMeta, t as createSlackReplyDeliveryPlan, u as MediaFetchError, v as parseSlackBlocksInput, x as parseSlackTarget, y as validateSlackBlocksArray } from "./replies-0nzkXt6o.js";
12
- import { $ as loadSessionStore, $t as resolveToolProfilePolicy, A as formatRawAssistantErrorForUi, At as resolveMainSessionKey, B as isRateLimitAssistantError, Bt as saveMediaBuffer, C as downgradeOpenAIReasoningBlocks, Ct as resolveChannelResetConfig, D as classifyFailoverReason, Dt as DEFAULT_RESET_TRIGGERS, E as BILLING_ERROR_USER_MESSAGE, Et as resolveThreadFlag, F as isCompactionFailureError, Ft as createBrowserRouteContext, G as parseImageSizeError, Gt as resolveBrowserControlAuth, H as isTimeoutErrorMessage, Ht as resolveExistingPathsWithinRoot, I as isContextOverflowError, It as registerBrowserRoutes, J as resolveSandboxContext, Jt as collectExplicitAllowlist, K as sanitizeUserFacingText, Kt as applyOwnerOnlyToolPolicy, L as isFailoverAssistantError, Lt as resolveBrowserConfig, M as isAuthAssistantError, Mt as resolveGroupSessionKey, N as isBillingAssistantError, Nt as acquireSessionWriteLock, O as formatAssistantErrorText, Ot as resolveFreshSessionTotalTokens, P as isCloudCodeAssistFormatError, Pt as resolveSessionLockMaxHoldFromTimeout, Q as resolveAndPersistSessionFile, Qt as normalizeToolName$1, R as isFailoverErrorMessage, Rt as resolveProfile, S as extractToolResultId, St as evaluateSessionFreshness, T as isGoogleModelApi, Tt as resolveSessionResetType, U as isTransientHttpError, Ut as getBridgeAuthForPort, V as isRawApiErrorPayload, Vt as DEFAULT_UPLOAD_DIR, W as parseImageDimensionError, Wt as ensureBrowserControlAuth, X as extractDeliveryInfo, Xt as expandToolGroups, Y as resolveSandboxRuntimeStatus, Yt as expandPolicyWithPluginGroups, Z as appendAssistantMessageToSessionTranscript, Zt as mergeAlsoAllowPolicy, _ as sanitizeSessionMessagesImages, _t as INPUT_PROVENANCE_KIND_VALUES, a as normalizeChannelTargetInput, an as resolveBootstrapMaxChars, at as updateSessionStoreEntry, b as resolveImageSanitizationLimits, bt as normalizeInputProvenance, c as parseReplyDirectives, cn as getGlobalHookRunner, ct as deliveryContextFromSession, d as parseInlineDirectives$1, dt as normalizeDeliveryContext, en as stripPluginOnlyAllowlist, et as readSessionUpdatedAt, f as validateAnthropicTurns, ft as normalizeSessionDeliveryFields, g as normalizeTextForComparison, gt as extractToolCallNames, h as isMessagingToolDuplicateNormalized, ht as countToolResults, i as buildTargetResolverSignature, in as ensureSessionHeader, it as updateSessionStore, j as getApiErrorPayloadFingerprint, jt as deriveSessionMetaPatch, k as formatBillingErrorMessage, kt as canonicalizeMainSessionAlias, l as MEDIA_TOKEN_RE, ln as initializeGlobalHookRunner, lt as deliveryContextKey, m as pickFallbackThinkingLevel, mt as capArrayByJsonBytes, nn as matchesAnyGlobPattern, o as normalizeTargetForProvider, on as resolveBootstrapTotalMaxChars, ot as isCacheEnabled, p as validateGeminiTurns, pt as archiveSessionTranscripts, q as ensureSandboxWorkspaceForSession, qt as buildPluginToolGroups, r as normalizeReplyPayloadsForDelivery, rn as buildBootstrapContextFiles, rt as updateLastRoute, s as throwIfAborted, sn as sanitizeGoogleTurnOrdering, st as resolveCacheTtlMs$1, t as deliverOutboundPayloads, tn as compileGlobPatterns, tt as recordSessionMetaFromInbound, u as splitMediaFromOutput, ut as mergeDeliveryContext, v as sanitizeImageBlocks, vt as applyInputProvenanceToUserMessage, w as isAntigravityClaude, wt as resolveSessionResetPolicy, x as extractToolCallsFromAssistant, xt as resolveSessionKey, y as sanitizeToolResultImages, yt as hasInterSessionUserProvenance, z as isLikelyContextOverflowError, zt as getMediaDir } from "./deliver-f3cIWxXT.js";
12
+ import { $ as loadSessionStore, $t as resolveToolProfilePolicy, A as formatRawAssistantErrorForUi, At as resolveMainSessionKey, B as isRateLimitAssistantError, Bt as saveMediaBuffer, C as downgradeOpenAIReasoningBlocks, Ct as resolveChannelResetConfig, D as classifyFailoverReason, Dt as DEFAULT_RESET_TRIGGERS, E as BILLING_ERROR_USER_MESSAGE, Et as resolveThreadFlag, F as isCompactionFailureError, Ft as createBrowserRouteContext, G as parseImageSizeError, Gt as resolveBrowserControlAuth, H as isTimeoutErrorMessage, Ht as resolveExistingPathsWithinRoot, I as isContextOverflowError, It as registerBrowserRoutes, J as resolveSandboxContext, Jt as collectExplicitAllowlist, K as sanitizeUserFacingText, Kt as applyOwnerOnlyToolPolicy, L as isFailoverAssistantError, Lt as resolveBrowserConfig, M as isAuthAssistantError, Mt as resolveGroupSessionKey, N as isBillingAssistantError, Nt as acquireSessionWriteLock, O as formatAssistantErrorText, Ot as resolveFreshSessionTotalTokens, P as isCloudCodeAssistFormatError, Pt as resolveSessionLockMaxHoldFromTimeout, Q as resolveAndPersistSessionFile, Qt as normalizeToolName$1, R as isFailoverErrorMessage, Rt as resolveProfile, S as extractToolResultId, St as evaluateSessionFreshness, T as isGoogleModelApi, Tt as resolveSessionResetType, U as isTransientHttpError, Ut as getBridgeAuthForPort, V as isRawApiErrorPayload, Vt as DEFAULT_UPLOAD_DIR, W as parseImageDimensionError, Wt as ensureBrowserControlAuth, X as extractDeliveryInfo, Xt as expandToolGroups, Y as resolveSandboxRuntimeStatus, Yt as expandPolicyWithPluginGroups, Z as appendAssistantMessageToSessionTranscript, Zt as mergeAlsoAllowPolicy, _ as sanitizeSessionMessagesImages, _t as INPUT_PROVENANCE_KIND_VALUES, a as normalizeChannelTargetInput, an as resolveBootstrapMaxChars, at as updateSessionStoreEntry, b as resolveImageSanitizationLimits, bt as normalizeInputProvenance, c as parseReplyDirectives, cn as getGlobalHookRunner, ct as deliveryContextFromSession, d as parseInlineDirectives$1, dt as normalizeDeliveryContext, en as stripPluginOnlyAllowlist, et as readSessionUpdatedAt, f as validateAnthropicTurns, ft as normalizeSessionDeliveryFields, g as normalizeTextForComparison, gt as extractToolCallNames, h as isMessagingToolDuplicateNormalized, ht as countToolResults, i as buildTargetResolverSignature, in as ensureSessionHeader, it as updateSessionStore, j as getApiErrorPayloadFingerprint, jt as deriveSessionMetaPatch, k as formatBillingErrorMessage, kt as canonicalizeMainSessionAlias, l as MEDIA_TOKEN_RE, ln as initializeGlobalHookRunner, lt as deliveryContextKey, m as pickFallbackThinkingLevel, mt as capArrayByJsonBytes, nn as matchesAnyGlobPattern, o as normalizeTargetForProvider, on as resolveBootstrapTotalMaxChars, ot as isCacheEnabled, p as validateGeminiTurns, pt as archiveSessionTranscripts, q as ensureSandboxWorkspaceForSession, qt as buildPluginToolGroups, r as normalizeReplyPayloadsForDelivery, rn as buildBootstrapContextFiles, rt as updateLastRoute, s as throwIfAborted, sn as sanitizeGoogleTurnOrdering, st as resolveCacheTtlMs$1, t as deliverOutboundPayloads, tn as compileGlobPatterns, tt as recordSessionMetaFromInbound, u as splitMediaFromOutput, ut as mergeDeliveryContext, v as sanitizeImageBlocks, vt as applyInputProvenanceToUserMessage, w as isAntigravityClaude, wt as resolveSessionResetPolicy, x as extractToolCallsFromAssistant, xt as resolveSessionKey, y as sanitizeToolResultImages, yt as hasInterSessionUserProvenance, z as isLikelyContextOverflowError, zt as getMediaDir } from "./deliver-q23ar_Pm.js";
13
13
  import { a as logMessageProcessed, i as logLaneEnqueue, o as logMessageQueued, r as logLaneDequeue, s as logSessionStateChange, t as diag } from "./diagnostic-BdRnGknC.js";
14
14
  import { n as getDiagnosticSessionState } from "./diagnostic-session-state-DpxCUzoM.js";
15
15
  import { S as GATEWAY_CLIENT_NAMES, _ as listDeliverableMessageChannels, a as chunkText, b as GATEWAY_CLIENT_IDS, c as resolveChunkMode, d as isSafeFenceBreak, f as parseFenceSpans, g as isMarkdownCapableMessageChannel, h as isInternalMessageChannel, i as chunkMarkdownTextWithMode, l as resolveTextChunkLimit, m as isDeliverableMessageChannel, o as chunkTextWithMode, p as INTERNAL_MESSAGE_CHANNEL, r as chunkMarkdownText, t as chunkByNewline, u as findFenceSpanAt, v as normalizeMessageChannel, x as GATEWAY_CLIENT_MODES, y as resolveGatewayMessageChannel } from "./chunk-CAZujdOi.js";
@@ -18,7 +18,7 @@ import { C as unsetConfigValueAtPath, S as setConfigValueAtPath, T as VERSION, _
18
18
  import { t as parseBooleanValue } from "./boolean-BW6OTjPi.js";
19
19
  import { i as resolveShellEnvFallbackTimeoutMs, n as getShellPathFromLoginShell, s as isTruthyEnvValue } from "./shell-env-DgjeObDZ.js";
20
20
  import { c as normalizePluginsConfig, f as isPathInsideWithRealpath, i as safeStatSync, l as resolveEnableState, n as discoverSymiPlugins, p as isDangerousHostEnvVarName, r as isPathInside, s as applyTestPluginDefaults, t as loadPluginManifestRegistry, u as resolveMemorySlotDecision } from "./manifest-registry-CAWGTwb5.js";
21
- import { C as rawDataToString, O as DEFAULT_AI_SNAPSHOT_MAX_CHARS, T as isSecureWebSocketUrl, x as ensureChromeExtensionRelayServer } from "./chrome-3jl2ulOE.js";
21
+ import { C as rawDataToString, O as DEFAULT_AI_SNAPSHOT_MAX_CHARS, T as isSecureWebSocketUrl, x as ensureChromeExtensionRelayServer } from "./chrome-DNssqQJs.js";
22
22
  import { n as resolveCliName, t as formatCliCommand } from "./command-format-DPd9RN2g.js";
23
23
  import { c as assertSandboxPath, d as resolveSandboxedMediaSource, f as applySkillEnvOverrides, h as parseFrontmatterBlock, i as resolveSkillsPromptForRun, l as resolveSandboxInputPath, n as buildWorkspaceSkillSnapshot, p as applySkillEnvOverridesFromSnapshot, r as loadWorkspaceSkillEntries, s as assertMediaNotDataUrl } from "./skills-DO7WNsVJ.js";
24
24
  import { n as redactToolDetail } from "./redact-DSOAcWMe.js";
@@ -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-D9m8F3HR.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";
@@ -53,7 +53,7 @@ import { fileURLToPath } from "node:url";
53
53
  import { CURRENT_SESSION_VERSION, DefaultResourceLoader, SessionManager, SettingsManager, codingTools, createAgentSession, createEditTool, createReadTool, createWriteTool, estimateTokens, generateSummary, readTool } from "@mariozechner/pi-coding-agent";
54
54
  import crypto, { X509Certificate, createHash, createHmac, randomBytes, randomUUID } from "node:crypto";
55
55
  import AjvPkg from "ajv";
56
- import { WebSocket as WebSocket$1 } from "ws";
56
+ import { WebSocket } from "ws";
57
57
  import { Buffer as Buffer$1 } from "node:buffer";
58
58
  import { complete, createAssistantMessageEventStream, streamSimple } from "@mariozechner/pi-ai";
59
59
  import { BedrockClient, ListFoundationModelsCommand } from "@aws-sdk/client-bedrock";
@@ -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-D9m8F3HR.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-D9m8F3HR.js").then((n) => n.t);
3407
3407
  return { manager: await MemoryIndexManager.get(params) };
3408
3408
  } catch (err) {
3409
3409
  return {
@@ -5920,7 +5920,7 @@ var GatewayClient = class {
5920
5920
  if (fingerprint !== expected) return /* @__PURE__ */ new Error("gateway tls fingerprint mismatch");
5921
5921
  });
5922
5922
  }
5923
- this.ws = new WebSocket$1(url, wsOptions);
5923
+ this.ws = new WebSocket(url, wsOptions);
5924
5924
  this.ws.on("open", () => {
5925
5925
  if (url.startsWith("wss://") && this.opts.tlsFingerprint) {
5926
5926
  const tlsError = this.validateTlsFingerprint();
@@ -6139,7 +6139,7 @@ var GatewayClient = class {
6139
6139
  return null;
6140
6140
  }
6141
6141
  async request(method, params, opts) {
6142
- if (!this.ws || this.ws.readyState !== WebSocket$1.OPEN) throw new Error("gateway not connected");
6142
+ if (!this.ws || this.ws.readyState !== WebSocket.OPEN) throw new Error("gateway not connected");
6143
6143
  const id = randomUUID();
6144
6144
  const frame = {
6145
6145
  type: "req",
@@ -7087,7 +7087,7 @@ async function routeReply(params) {
7087
7087
  const resolvedReplyToId = replyToId ?? (channelId === "slack" && threadId != null && threadId !== "" ? String(threadId) : void 0);
7088
7088
  const resolvedThreadId = channelId === "slack" ? null : threadId ?? null;
7089
7089
  try {
7090
- const { deliverOutboundPayloads } = await import("./deliver-f3cIWxXT.js").then((n) => n.n);
7090
+ const { deliverOutboundPayloads } = await import("./deliver-q23ar_Pm.js").then((n) => n.n);
7091
7091
  return {
7092
7092
  ok: true,
7093
7093
  messageId: (await deliverOutboundPayloads({
@@ -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) {
@@ -41988,7 +42076,7 @@ async function deliverSessionMaintenanceWarning(params) {
41988
42076
  return;
41989
42077
  }
41990
42078
  try {
41991
- const { deliverOutboundPayloads } = await import("./deliver-f3cIWxXT.js").then((n) => n.n);
42079
+ const { deliverOutboundPayloads } = await import("./deliver-q23ar_Pm.js").then((n) => n.n);
41992
42080
  await deliverOutboundPayloads({
41993
42081
  cfg: params.cfg,
41994
42082
  channel,
@@ -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;