@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.
- package/dist/{agent-8EuVoCbs.js → agent-BCszhl_7.js} +1 -1
- package/dist/{agent-B87OYNFx.js → agent-Cmx-1Tfs.js} +1 -1
- package/dist/{agents-CNbjbSD0.js → agents-BkTzJJ83.js} +2 -2
- package/dist/{auth-choice-BL4lqaJL.js → auth-choice-CucG4Wor.js} +1 -1
- package/dist/{auth-choice-CB0rQByJ.js → auth-choice-D-iIJjJY.js} +1 -1
- package/dist/{banner-D-ssxnQN.js → banner-CApT91CY.js} +1 -1
- package/dist/build-info.json +3 -3
- package/dist/bundled/boot-md/handler.js +2 -2
- package/dist/bundled/session-memory/handler.js +2 -2
- package/dist/canvas-host/a2ui/.bundle.hash +1 -1
- package/dist/{channel-options-_DJXj921.js → channel-options-CdIEyHya.js} +1 -1
- package/dist/{channel-options-DLV6zIpW.js → channel-options-DYh8mLMN.js} +1 -1
- package/dist/{channels-cli-2OTAQPvZ.js → channels-cli-Bb18aE2b.js} +7 -7
- package/dist/{channels-cli-CUsX2v-1.js → channels-cli-sG9Wf2LH.js} +7 -7
- package/dist/{chrome-3jl2ulOE.js → chrome-DNssqQJs.js} +7 -7
- package/dist/{cli-Qq7pr2SX.js → cli-DEGt0Tp0.js} +4 -4
- package/dist/{cli-D4cMWhob.js → cli-DtdTf-ZQ.js} +4 -4
- package/dist/{command-registry-Br9vlIL_.js → command-registry-O155hUhR.js} +10 -10
- package/dist/{completion-cli-CKLoZFMQ.js → completion-cli-BaOjuoPX.js} +2 -2
- package/dist/{completion-cli-P5zBWNnc.js → completion-cli-DLUKoSIx.js} +1 -1
- package/dist/{config-cli-NvqRZAqr.js → config-cli-BuZ-L1Iw.js} +1 -1
- package/dist/{config-cli-CcJOubCt.js → config-cli-BxWavRxN.js} +1 -1
- package/dist/{configure-C7BfUqKR.js → configure-BSKWgEhS.js} +2 -2
- package/dist/{configure-B1RJ6bi3.js → configure-gxAEhC9E.js} +2 -2
- package/dist/control-ui/js/app.js +8 -0
- package/dist/{deliver-f3cIWxXT.js → deliver-q23ar_Pm.js} +4 -4
- package/dist/{doctor-completion-Be3Of_A2.js → doctor-completion-BzfgfpBH.js} +1 -1
- package/dist/{doctor-completion-Dco2Lmvy.js → doctor-completion-wlBp8bv7.js} +1 -1
- package/dist/entry.js +1 -1
- package/dist/extensionAPI.js +4 -4
- package/dist/{gateway-cli-XV8T-ix8.js → gateway-cli-Bz5fqsnE.js} +10 -10
- package/dist/{gateway-cli-BQAh5DqM.js → gateway-cli-_xNZ2L_e.js} +10 -10
- package/dist/{glass-ui-ws-1FOCi0nn.js → glass-ui-ws-CbKVlQRh.js} +8 -8
- package/dist/{glass-ui-ws-CqGzDNV7.js → glass-ui-ws-DO8WKPIK.js} +8 -8
- package/dist/{hooks-cli-D7iTDry_.js → hooks-cli-CrgD2ZqP.js} +5 -5
- package/dist/{hooks-cli-BPa-ssdB.js → hooks-cli-mwiHuRfO.js} +5 -5
- package/dist/index.js +8 -8
- package/dist/llm-slug-generator.js +2 -2
- package/dist/{manager-DghM7T-b.js → manager-BVPXSK-I.js} +1 -1
- package/dist/{manager-Ck1YSfr6.js → manager-CpBJ1BE6.js} +1 -1
- package/dist/{manager-CC13EPO9.js → manager-CvqH_tah.js} +1 -1
- package/dist/{manager-Bt-1HGg9.js → manager-D9m8F3HR.js} +1 -1
- package/dist/{memory-CgWOtF4K.js → memory-BsGfHO_F.js} +2 -2
- package/dist/{memory-d0YI5Lr0.js → memory-CbwmxmxW.js} +2 -2
- package/dist/{memory-cli-DGheAg5i.js → memory-cli-B1dFPZw-.js} +2 -2
- package/dist/{memory-cli-vN3fGs79.js → memory-cli-BwQsPEFk.js} +2 -2
- package/dist/{models-CBw1pGIq.js → models-Dm6dSSSx.js} +2 -2
- package/dist/{models-cli-Bmh1S3iG.js → models-cli-BA6ufqLd.js} +5 -5
- package/dist/{models-cli-BBReZHNq.js → models-cli-BPSrz6tf.js} +6 -6
- package/dist/{onboard-Csj4sOF5.js → onboard-CjnPughY.js} +1 -1
- package/dist/{onboard-LVUmCZhX.js → onboard-Cmz6Rtm-.js} +1 -1
- package/dist/{onboard-channels-vDtX0e0w.js → onboard-channels-Cozz3CQv.js} +1 -1
- package/dist/{onboard-channels-mrSIlZDB.js → onboard-channels-D00NAtQt.js} +1 -1
- package/dist/{onboarding-DojADc8N.js → onboarding-BPZb40BJ.js} +3 -3
- package/dist/{onboarding-D2VmoKU1.js → onboarding-BrTMOcPF.js} +3 -3
- package/dist/{onboarding.finalize-C4BwVw6u.js → onboarding.finalize-Bd2rGMjo.js} +3 -3
- package/dist/{onboarding.finalize-Bi1wSEtw.js → onboarding.finalize-BiL_LXrR.js} +4 -4
- package/dist/{pi-embedded-zSv7VKNQ.js → pi-embedded-C2-v_4OT.js} +184 -76
- package/dist/{plugin-registry-L1h7mxjX.js → plugin-registry-BLoSesyj.js} +1 -1
- package/dist/{plugin-registry-Dq6OJ45H.js → plugin-registry-CZDG8fjK.js} +1 -1
- package/dist/plugin-sdk/auto-reply/reply/middleware-context-warning.d.ts +22 -0
- package/dist/plugin-sdk/auto-reply/session-boundary-messages.d.ts +16 -3
- package/dist/plugin-sdk/index.js +6 -6
- package/dist/{plugins-cli-C9ehLXaT.js → plugins-cli-2yraoR6V.js} +5 -5
- package/dist/{plugins-cli-BEIKMoVH.js → plugins-cli-CGs9-UtO.js} +5 -5
- package/dist/{program-iTd2Dei7.js → program-BnKEJpZF.js} +10 -10
- package/dist/{program-context-Bh5wzWdC.js → program-context-BvP9L_1W.js} +18 -18
- package/dist/{prompt-select-styled-CNFytCD3.js → prompt-select-styled-BTF5vvv8.js} +4 -4
- package/dist/{prompt-select-styled-fXotfbCt.js → prompt-select-styled-Brx330O3.js} +4 -4
- package/dist/{provider-auth-helpers-Dho1n21x.js → provider-auth-helpers-CppzYZM9.js} +1 -1
- package/dist/{provider-auth-helpers-DBrH-cce.js → provider-auth-helpers-hjy3e-oS.js} +1 -1
- package/dist/{push-apns-DpyCFRTu.js → push-apns-BD2iO09c.js} +1 -1
- package/dist/{push-apns-DYYY9NOE.js → push-apns-DJ55TFPT.js} +1 -1
- package/dist/{pw-ai-DOAsQ5NX.js → pw-ai-v__CyAlM.js} +1 -1
- package/dist/{register.agent-BYpBNbHe.js → register.agent-DTGvQGla.js} +9 -9
- package/dist/{register.agent-DceNHGi_.js → register.agent-Dz_P7PxO.js} +8 -8
- package/dist/{register.configure-09lIIUvq.js → register.configure-CrgU3FzU.js} +8 -8
- package/dist/{register.configure-UUZqL0Ck.js → register.configure-D9w7Tm9e.js} +8 -8
- package/dist/{register.maintenance-DdX8GZpv.js → register.maintenance-CqvrXPF7.js} +9 -9
- package/dist/{register.maintenance-CsoEyVyl.js → register.maintenance-d5xHdDgu.js} +8 -8
- package/dist/{register.message-RYn7LD6-.js → register.message-C0tqgEor.js} +5 -5
- package/dist/{register.message-CAM62MaW.js → register.message-DNMCxaAD.js} +5 -5
- package/dist/{register.onboard-CoRtNlNa.js → register.onboard--eJVfJGa.js} +2 -2
- package/dist/{register.onboard-DhR5o8KO.js → register.onboard-dkAvGraV.js} +2 -2
- package/dist/{register.setup-CI_RT1Wa.js → register.setup-CgufX-6c.js} +2 -2
- package/dist/{register.setup-CEjhFwYz.js → register.setup-Dwh0ylCS.js} +2 -2
- package/dist/{register.status-health-sessions-DNlsQ-xt.js → register.status-health-sessions-BeAm7HAq.js} +3 -3
- package/dist/{register.status-health-sessions-8N1xEKl7.js → register.status-health-sessions-D6BRCFg_.js} +3 -3
- package/dist/{register.subclis-D1qkm3UK.js → register.subclis-Hb2xSHBy.js} +9 -9
- package/dist/{run-main-hKg6FDt6.js → run-main-B_NTFmz1.js} +17 -17
- package/dist/{server-methods-bIWvtXlT.js → server-methods-CFWjtx32.js} +7 -7
- package/dist/{server-methods-CXoipzKe.js → server-methods-Cz_-FX5B.js} +7 -7
- package/dist/{server-node-events-BD8wnswX.js → server-node-events-BiMD-Sik.js} +6 -6
- package/dist/{server-node-events-nQkNuQOx.js → server-node-events-UJ4Hwcsf.js} +6 -6
- package/dist/{status-CIZltjd7.js → status-BGUaaSHe.js} +1 -1
- package/dist/{status-Dgg3SlRY.js → status-Bp48-ySL.js} +1 -1
- package/dist/{status-CWzbgPAZ.js → status-CObdh7-H.js} +1 -1
- package/dist/{status-CTDVhXdb.js → status-FX0BMcCb.js} +1 -1
- package/dist/{subagent-registry-DQ_BPb-T.js → subagent-registry-ChDWDl_p.js} +177 -69
- package/dist/{synthesis-CSsmBmJc.js → synthesis-CmQvOHg6.js} +2 -2
- package/dist/{synthesis-CDd1xqI3.js → synthesis-DdP6tbyk.js} +4 -4
- package/dist/{synthesis-XbEFEFK1.js → synthesis-Dq-zHW08.js} +4 -4
- package/dist/{synthesis-DIqhHKjV.js → synthesis-m6WCyI41.js} +4 -4
- package/dist/{unified-runner-DN0asRIR.js → unified-runner-Cu3lGa3A.js} +177 -69
- package/dist/{unified-runner-Bm3r8UOg.js → unified-runner-DL-sfvGT.js} +178 -70
- package/dist/{update-cli-kysdsvn3.js → update-cli-DAKoU0Wn.js} +8 -8
- package/dist/{update-cli-CK7nw0t0.js → update-cli-gEBRNrm2.js} +9 -9
- package/package.json +1 -1
|
@@ -31,7 +31,7 @@ import { t as emitSessionTranscriptUpdate } from "./transcript-events-ChU6IQwp.j
|
|
|
31
31
|
import { n as isSilentReplyText, t as SILENT_REPLY_TOKEN } from "./tokens-D_vCJSzF.js";
|
|
32
32
|
import { a as logMessageProcessed, i as logLaneEnqueue, o as logMessageQueued, r as logLaneDequeue, s as logSessionStateChange, t as diag } from "./diagnostic-BALvP9wI.js";
|
|
33
33
|
import { n as getDiagnosticSessionState } from "./diagnostic-session-state-BDfanaOY.js";
|
|
34
|
-
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-
|
|
34
|
+
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-CpBJ1BE6.js";
|
|
35
35
|
import { r as resolveCopilotApiToken, t as DEFAULT_COPILOT_API_BASE_URL } from "./github-copilot-token-uhEBNQfj.js";
|
|
36
36
|
import { t as ensurePiAuthJsonFromAuthProfiles } from "./pi-auth-json-DCGR3yfh.js";
|
|
37
37
|
import { a as resolveEffectiveMessagesConfig, i as resolveAckReaction, o as resolveHumanDelayConfig, r as resolveResponsePrefixTemplate, t as createReplyPrefixOptions } from "./reply-prefix-D0NzzC4I.js";
|
|
@@ -4460,7 +4460,7 @@ async function getMemorySearchManager(params) {
|
|
|
4460
4460
|
const wrapper = new FallbackMemoryManager({
|
|
4461
4461
|
primary,
|
|
4462
4462
|
fallbackFactory: async () => {
|
|
4463
|
-
const { MemoryIndexManager } = await import("./manager-
|
|
4463
|
+
const { MemoryIndexManager } = await import("./manager-CpBJ1BE6.js").then((n) => n.t);
|
|
4464
4464
|
return await MemoryIndexManager.get(params);
|
|
4465
4465
|
}
|
|
4466
4466
|
}, () => QMD_MANAGER_CACHE.delete(cacheKey));
|
|
@@ -4473,7 +4473,7 @@ async function getMemorySearchManager(params) {
|
|
|
4473
4473
|
}
|
|
4474
4474
|
}
|
|
4475
4475
|
try {
|
|
4476
|
-
const { MemoryIndexManager } = await import("./manager-
|
|
4476
|
+
const { MemoryIndexManager } = await import("./manager-CpBJ1BE6.js").then((n) => n.t);
|
|
4477
4477
|
return { manager: await MemoryIndexManager.get(params) };
|
|
4478
4478
|
} catch (err) {
|
|
4479
4479
|
return {
|
|
@@ -19778,13 +19778,21 @@ async function applyMediaUnderstanding(params) {
|
|
|
19778
19778
|
* Soft warning appended when context usage crosses the threshold.
|
|
19779
19779
|
* Fires once per session (tracked via `SessionEntry.contextWarningSent`).
|
|
19780
19780
|
*/
|
|
19781
|
-
const SESSION_CONTEXT_WARNING_MESSAGE = "📋 Heads up — this session is approaching the context limit.
|
|
19781
|
+
const SESSION_CONTEXT_WARNING_MESSAGE = "📋 Heads up — this session is approaching the context limit. Symi will compact older context automatically when usage reaches 90%.";
|
|
19782
19782
|
/**
|
|
19783
|
-
*
|
|
19784
|
-
*
|
|
19785
|
-
* turn
|
|
19783
|
+
* Inline status emitted by Symi before running compaction proactively
|
|
19784
|
+
* at the 90% threshold. Followed by the agent's actual response in the
|
|
19785
|
+
* same turn.
|
|
19786
19786
|
*/
|
|
19787
|
-
const
|
|
19787
|
+
const SESSION_COMPACTING_MESSAGE = "📋 Context limit reached for this session. Compacting older context and continuing…";
|
|
19788
|
+
/**
|
|
19789
|
+
* Returned when compaction can't recover enough budget to continue —
|
|
19790
|
+
* either because the proactive compaction at 90% failed, or because a
|
|
19791
|
+
* single user message overshot the window in one turn and the reactive
|
|
19792
|
+
* fallback compaction also failed. Same message also short-circuits
|
|
19793
|
+
* subsequent turns until /reset or /new.
|
|
19794
|
+
*/
|
|
19795
|
+
const SESSION_COMPACTION_FAILED_MESSAGE = "📋 Couldn't compact this session further. Please /reset or /new to continue — your full conversation is saved in history.";
|
|
19788
19796
|
|
|
19789
19797
|
//#endregion
|
|
19790
19798
|
//#region src/sessions/level-overrides.ts
|
|
@@ -44312,6 +44320,86 @@ async function handleInlineActions(params) {
|
|
|
44312
44320
|
};
|
|
44313
44321
|
}
|
|
44314
44322
|
|
|
44323
|
+
//#endregion
|
|
44324
|
+
//#region src/auto-reply/reply/middleware-context-warning.ts
|
|
44325
|
+
/** Threshold (fraction of context window) that triggers the soft warning. */
|
|
44326
|
+
const CONTEXT_WARNING_THRESHOLD = .85;
|
|
44327
|
+
/**
|
|
44328
|
+
* Threshold that triggers proactive compaction in `prepareReplyTurn`.
|
|
44329
|
+
* Higher than the soft warning so the user sees the heads-up first;
|
|
44330
|
+
* compaction runs the next turn the threshold is observed.
|
|
44331
|
+
*/
|
|
44332
|
+
const CONTEXT_PROACTIVE_COMPACT_THRESHOLD = .9;
|
|
44333
|
+
/**
|
|
44334
|
+
* Pure decision for "should `prepareReplyTurn` run proactive compaction
|
|
44335
|
+
* before the next turn?" — extracted so the trigger logic is unit-testable
|
|
44336
|
+
* without mocking the rest of the prep pipeline.
|
|
44337
|
+
*
|
|
44338
|
+
* Returns true ONLY when:
|
|
44339
|
+
* - we have a session id (otherwise compaction has no target),
|
|
44340
|
+
* - we have a positive context window,
|
|
44341
|
+
* - we have a positive cumulative usage from the previous turn,
|
|
44342
|
+
* - usage / window ≥ CONTEXT_PROACTIVE_COMPACT_THRESHOLD.
|
|
44343
|
+
*/
|
|
44344
|
+
function shouldProactivelyCompact(args) {
|
|
44345
|
+
if (!args.sessionId) return false;
|
|
44346
|
+
if (!args.contextTokens || args.contextTokens <= 0) return false;
|
|
44347
|
+
const usage = args.totalTokens ?? 0;
|
|
44348
|
+
if (usage <= 0) return false;
|
|
44349
|
+
return usage / args.contextTokens >= CONTEXT_PROACTIVE_COMPACT_THRESHOLD;
|
|
44350
|
+
}
|
|
44351
|
+
/**
|
|
44352
|
+
* Read the model's context-window size, falling back to the global
|
|
44353
|
+
* default when the model isn't in the registry yet.
|
|
44354
|
+
*/
|
|
44355
|
+
function resolveContextWindow(modelId) {
|
|
44356
|
+
const fromRegistry = lookupContextTokens(modelId);
|
|
44357
|
+
if (fromRegistry && fromRegistry > 0) return fromRegistry;
|
|
44358
|
+
return DEFAULT_CONTEXT_TOKENS;
|
|
44359
|
+
}
|
|
44360
|
+
/**
|
|
44361
|
+
* After-turn hook that surfaces a one-time soft warning when usage
|
|
44362
|
+
* crosses the context threshold. Mutates the result text to append
|
|
44363
|
+
* the warning when triggered, and persists `contextWarningSent: true`
|
|
44364
|
+
* on the session entry so the warning doesn't fire again.
|
|
44365
|
+
*/
|
|
44366
|
+
function withContextUsageWarning() {
|
|
44367
|
+
return (next) => async (params) => {
|
|
44368
|
+
const result = await next(params);
|
|
44369
|
+
if (result.outbound.action === "drop") return result;
|
|
44370
|
+
if (!params.sessionKey) return result;
|
|
44371
|
+
const usage = result.rawResult.meta.agentMeta?.usage?.total ?? 0;
|
|
44372
|
+
if (usage <= 0) return result;
|
|
44373
|
+
if (usage / resolveContextWindow(params.modelId ?? result.modelId) < CONTEXT_WARNING_THRESHOLD) return result;
|
|
44374
|
+
const agentId = resolveAgentIdFromSessionKey(params.sessionKey);
|
|
44375
|
+
const storePath = resolveStorePath(params.config.session?.store, { agentId });
|
|
44376
|
+
let alreadyWarned = false;
|
|
44377
|
+
try {
|
|
44378
|
+
await updateSessionStoreEntry({
|
|
44379
|
+
storePath,
|
|
44380
|
+
sessionKey: params.sessionKey,
|
|
44381
|
+
update: async (entry) => {
|
|
44382
|
+
if (entry.contextWarningSent === true) {
|
|
44383
|
+
alreadyWarned = true;
|
|
44384
|
+
return null;
|
|
44385
|
+
}
|
|
44386
|
+
return { contextWarningSent: true };
|
|
44387
|
+
}
|
|
44388
|
+
});
|
|
44389
|
+
} catch (err) {
|
|
44390
|
+
logVerbose(`context-warning: failed to persist contextWarningSent flag for ${params.sessionKey}: ${String(err)}`);
|
|
44391
|
+
return result;
|
|
44392
|
+
}
|
|
44393
|
+
if (alreadyWarned) return result;
|
|
44394
|
+
const trimmedText = result.text.trimEnd();
|
|
44395
|
+
const separator = trimmedText ? "\n\n" : "";
|
|
44396
|
+
return {
|
|
44397
|
+
...result,
|
|
44398
|
+
text: `${trimmedText}${separator}${SESSION_CONTEXT_WARNING_MESSAGE}`
|
|
44399
|
+
};
|
|
44400
|
+
};
|
|
44401
|
+
}
|
|
44402
|
+
|
|
44315
44403
|
//#endregion
|
|
44316
44404
|
//#region src/auto-reply/reply/session-reset-model.ts
|
|
44317
44405
|
function splitBody(body) {
|
|
@@ -45208,7 +45296,7 @@ async function prepareReplyTurn(ctx, opts, configOverride) {
|
|
|
45208
45296
|
typing.cleanup();
|
|
45209
45297
|
return {
|
|
45210
45298
|
kind: "early-reply",
|
|
45211
|
-
reply: { text:
|
|
45299
|
+
reply: { text: SESSION_COMPACTION_FAILED_MESSAGE }
|
|
45212
45300
|
};
|
|
45213
45301
|
}
|
|
45214
45302
|
await applyResetModelOverride({
|
|
@@ -45321,6 +45409,82 @@ async function prepareReplyTurn(ctx, opts, configOverride) {
|
|
|
45321
45409
|
};
|
|
45322
45410
|
directives = inlineActionResult.directives;
|
|
45323
45411
|
abortedLastRun = inlineActionResult.abortedLastRun ?? abortedLastRun;
|
|
45412
|
+
if (shouldProactivelyCompact({
|
|
45413
|
+
totalTokens: sessionEntry.totalTokens,
|
|
45414
|
+
contextTokens,
|
|
45415
|
+
sessionId: sessionEntry.sessionId
|
|
45416
|
+
})) {
|
|
45417
|
+
if (resolvedOpts?.onBlockReply) try {
|
|
45418
|
+
await resolvedOpts.onBlockReply({ text: SESSION_COMPACTING_MESSAGE });
|
|
45419
|
+
} catch (err) {
|
|
45420
|
+
logVerbose(`proactive-compact: inline status delivery failed: ${String(err)}`);
|
|
45421
|
+
}
|
|
45422
|
+
if (isEmbeddedPiRunActive(sessionEntry.sessionId)) {
|
|
45423
|
+
abortEmbeddedPiRun(sessionEntry.sessionId);
|
|
45424
|
+
await waitForEmbeddedPiRunEnd(sessionEntry.sessionId, 15e3);
|
|
45425
|
+
}
|
|
45426
|
+
let compactResult;
|
|
45427
|
+
try {
|
|
45428
|
+
compactResult = await compactEmbeddedPiSession({
|
|
45429
|
+
sessionId: sessionEntry.sessionId,
|
|
45430
|
+
sessionKey,
|
|
45431
|
+
messageChannel: command.channel,
|
|
45432
|
+
groupId: sessionEntry.groupId,
|
|
45433
|
+
groupChannel: sessionEntry.groupChannel,
|
|
45434
|
+
groupSpace: sessionEntry.space,
|
|
45435
|
+
spawnedBy: sessionEntry.spawnedBy,
|
|
45436
|
+
sessionFile: resolveSessionFilePath(sessionEntry.sessionId, sessionEntry, resolveSessionFilePathOptions({
|
|
45437
|
+
agentId,
|
|
45438
|
+
storePath
|
|
45439
|
+
})),
|
|
45440
|
+
workspaceDir,
|
|
45441
|
+
agentDir,
|
|
45442
|
+
config: cfg,
|
|
45443
|
+
skillsSnapshot: sessionEntry.skillsSnapshot,
|
|
45444
|
+
provider,
|
|
45445
|
+
model,
|
|
45446
|
+
thinkLevel: resolvedThinkLevel,
|
|
45447
|
+
reasoningLevel: resolvedReasoningLevel,
|
|
45448
|
+
trigger: "overflow",
|
|
45449
|
+
senderIsOwner: command.senderIsOwner,
|
|
45450
|
+
ownerNumbers: command.ownerList.length > 0 ? command.ownerList : void 0
|
|
45451
|
+
});
|
|
45452
|
+
} catch (err) {
|
|
45453
|
+
logVerbose(`proactive-compact: compactor threw for ${sessionKey}: ${String(err)}`);
|
|
45454
|
+
compactResult = {
|
|
45455
|
+
ok: false,
|
|
45456
|
+
compacted: false,
|
|
45457
|
+
reason: String(err)
|
|
45458
|
+
};
|
|
45459
|
+
}
|
|
45460
|
+
if (compactResult.ok && compactResult.compacted) await incrementCompactionCount({
|
|
45461
|
+
sessionEntry,
|
|
45462
|
+
sessionStore,
|
|
45463
|
+
sessionKey,
|
|
45464
|
+
storePath,
|
|
45465
|
+
tokensAfter: compactResult.result?.tokensAfter
|
|
45466
|
+
});
|
|
45467
|
+
else {
|
|
45468
|
+
logVerbose(`proactive-compact: failed for ${sessionKey} (${compactResult.reason ?? "unknown"})`);
|
|
45469
|
+
if (storePath) try {
|
|
45470
|
+
await updateSessionStoreEntry({
|
|
45471
|
+
storePath,
|
|
45472
|
+
sessionKey,
|
|
45473
|
+
update: async (entry) => {
|
|
45474
|
+
if (entry.endedReason === "context_overflow") return null;
|
|
45475
|
+
return { endedReason: "context_overflow" };
|
|
45476
|
+
}
|
|
45477
|
+
});
|
|
45478
|
+
} catch (err) {
|
|
45479
|
+
logVerbose(`proactive-compact: failed to mark session sealed: ${String(err)}`);
|
|
45480
|
+
}
|
|
45481
|
+
typing.cleanup();
|
|
45482
|
+
return {
|
|
45483
|
+
kind: "early-reply",
|
|
45484
|
+
reply: { text: SESSION_COMPACTION_FAILED_MESSAGE }
|
|
45485
|
+
};
|
|
45486
|
+
}
|
|
45487
|
+
}
|
|
45324
45488
|
await stageSandboxMedia({
|
|
45325
45489
|
ctx,
|
|
45326
45490
|
sessionCtx,
|
|
@@ -45749,8 +45913,8 @@ function extractErrorMessage(err) {
|
|
|
45749
45913
|
function buildBoundaryResult(params) {
|
|
45750
45914
|
const profile = resolveModelProfile(params.provider && params.modelId ? `${params.provider}/${params.modelId}` : "", params.config.models?.profiles);
|
|
45751
45915
|
return {
|
|
45752
|
-
text:
|
|
45753
|
-
rawText:
|
|
45916
|
+
text: SESSION_COMPACTION_FAILED_MESSAGE,
|
|
45917
|
+
rawText: SESSION_COMPACTION_FAILED_MESSAGE,
|
|
45754
45918
|
outbound: {
|
|
45755
45919
|
action: "deliver",
|
|
45756
45920
|
reason: "deliver"
|
|
@@ -45761,7 +45925,7 @@ function buildBoundaryResult(params) {
|
|
|
45761
45925
|
profile,
|
|
45762
45926
|
didSendViaMessagingTool: false,
|
|
45763
45927
|
rawResult: {
|
|
45764
|
-
payloads: [{ text:
|
|
45928
|
+
payloads: [{ text: SESSION_COMPACTION_FAILED_MESSAGE }],
|
|
45765
45929
|
meta: {
|
|
45766
45930
|
durationMs: Date.now() - params.startTime,
|
|
45767
45931
|
agentMeta: {
|
|
@@ -45820,62 +45984,6 @@ function withContextOverflowRecovery() {
|
|
|
45820
45984
|
};
|
|
45821
45985
|
}
|
|
45822
45986
|
|
|
45823
|
-
//#endregion
|
|
45824
|
-
//#region src/auto-reply/reply/middleware-context-warning.ts
|
|
45825
|
-
/** Threshold (fraction of context window) that triggers the soft warning. */
|
|
45826
|
-
const CONTEXT_WARNING_THRESHOLD = .85;
|
|
45827
|
-
/**
|
|
45828
|
-
* Read the model's context-window size, falling back to the global
|
|
45829
|
-
* default when the model isn't in the registry yet.
|
|
45830
|
-
*/
|
|
45831
|
-
function resolveContextWindow(modelId) {
|
|
45832
|
-
const fromRegistry = lookupContextTokens(modelId);
|
|
45833
|
-
if (fromRegistry && fromRegistry > 0) return fromRegistry;
|
|
45834
|
-
return DEFAULT_CONTEXT_TOKENS;
|
|
45835
|
-
}
|
|
45836
|
-
/**
|
|
45837
|
-
* After-turn hook that surfaces a one-time soft warning when usage
|
|
45838
|
-
* crosses the context threshold. Mutates the result text to append
|
|
45839
|
-
* the warning when triggered, and persists `contextWarningSent: true`
|
|
45840
|
-
* on the session entry so the warning doesn't fire again.
|
|
45841
|
-
*/
|
|
45842
|
-
function withContextUsageWarning() {
|
|
45843
|
-
return (next) => async (params) => {
|
|
45844
|
-
const result = await next(params);
|
|
45845
|
-
if (result.outbound.action === "drop") return result;
|
|
45846
|
-
if (!params.sessionKey) return result;
|
|
45847
|
-
const usage = result.rawResult.meta.agentMeta?.usage?.total ?? 0;
|
|
45848
|
-
if (usage <= 0) return result;
|
|
45849
|
-
if (usage / resolveContextWindow(params.modelId ?? result.modelId) < CONTEXT_WARNING_THRESHOLD) return result;
|
|
45850
|
-
const agentId = resolveAgentIdFromSessionKey(params.sessionKey);
|
|
45851
|
-
const storePath = resolveStorePath(params.config.session?.store, { agentId });
|
|
45852
|
-
let alreadyWarned = false;
|
|
45853
|
-
try {
|
|
45854
|
-
await updateSessionStoreEntry({
|
|
45855
|
-
storePath,
|
|
45856
|
-
sessionKey: params.sessionKey,
|
|
45857
|
-
update: async (entry) => {
|
|
45858
|
-
if (entry.contextWarningSent === true) {
|
|
45859
|
-
alreadyWarned = true;
|
|
45860
|
-
return null;
|
|
45861
|
-
}
|
|
45862
|
-
return { contextWarningSent: true };
|
|
45863
|
-
}
|
|
45864
|
-
});
|
|
45865
|
-
} catch (err) {
|
|
45866
|
-
logVerbose(`context-warning: failed to persist contextWarningSent flag for ${params.sessionKey}: ${String(err)}`);
|
|
45867
|
-
return result;
|
|
45868
|
-
}
|
|
45869
|
-
if (alreadyWarned) return result;
|
|
45870
|
-
const trimmedText = result.text.trimEnd();
|
|
45871
|
-
const separator = trimmedText ? "\n\n" : "";
|
|
45872
|
-
return {
|
|
45873
|
-
...result,
|
|
45874
|
-
text: `${trimmedText}${separator}${SESSION_CONTEXT_WARNING_MESSAGE}`
|
|
45875
|
-
};
|
|
45876
|
-
};
|
|
45877
|
-
}
|
|
45878
|
-
|
|
45879
45987
|
//#endregion
|
|
45880
45988
|
//#region src/auto-reply/reply/middleware-diagnostic-logging.ts
|
|
45881
45989
|
function deriveChannel(ctx) {
|
|
@@ -61721,7 +61829,7 @@ async function runEmbeddedPiAgent(params) {
|
|
|
61721
61829
|
error: err
|
|
61722
61830
|
});
|
|
61723
61831
|
}
|
|
61724
|
-
const MAX_OVERFLOW_COMPACTION_ATTEMPTS =
|
|
61832
|
+
const MAX_OVERFLOW_COMPACTION_ATTEMPTS = 1;
|
|
61725
61833
|
const MAX_RUN_LOOP_ITERATIONS = resolveMaxRunRetryIterations(profileCandidates.length);
|
|
61726
61834
|
let overflowCompactionAttempts = 0;
|
|
61727
61835
|
let toolResultTruncationAttempted = false;
|
|
@@ -52,8 +52,8 @@ import { c as hasNonzeroUsage, l as normalizeUsage, n as loadCostUsageSummary, o
|
|
|
52
52
|
import { C as enqueueSystemEvent, E as buildChannelSummary, S as drainSystemEventEntries, _ as loadProviderUsageSummary, a as loadCombinedSessionStoreForGateway, b as resolveUsageProviderId, d as formatDoctorNonInteractiveHint, g as writeRestartSentinel, k as redactIdentifier, x as lookupContextTokens, y as formatUsageWindowSummary } from "./session-utils-Cs1jlD-q.js";
|
|
53
53
|
import { n as createBrowserRouteDispatcher, r as getMachineDisplayName, t as withTimeout$2 } from "./with-timeout-GbJ1Yzsh.js";
|
|
54
54
|
import { i as resolveAckReaction, o as resolveEffectiveMessagesConfig, r as resolveResponsePrefixTemplate, s as resolveHumanDelayConfig, t as createReplyPrefixOptions } from "./reply-prefix-BFNeXT65.js";
|
|
55
|
-
import { n as resolveMemoryBackendConfig, t as getMemorySearchManager } from "./memory-
|
|
56
|
-
import { a as parseGeminiAuth, c as resolveMemorySearchConfig, n as retryAsync, o as collectProviderApiKeysForExecution, s as executeWithApiKeyRotation } from "./manager-
|
|
55
|
+
import { n as resolveMemoryBackendConfig, t as getMemorySearchManager } from "./memory-BsGfHO_F.js";
|
|
56
|
+
import { a as parseGeminiAuth, c as resolveMemorySearchConfig, n as retryAsync, o as collectProviderApiKeysForExecution, s as executeWithApiKeyRotation } from "./manager-CvqH_tah.js";
|
|
57
57
|
import { f as runTasksWithConcurrency } from "./internal-DVCddhhN.js";
|
|
58
58
|
import { a as chunkText, c as resolveChunkMode, d as isSafeFenceBreak, f as parseFenceSpans, i as chunkMarkdownTextWithMode, l as resolveTextChunkLimit, o as chunkTextWithMode, r as chunkMarkdownText, t as chunkByNewline, u as findFenceSpanAt } from "./chunk-BxfKjCUx.js";
|
|
59
59
|
import { n as resolveMarkdownTableMode } from "./markdown-tables-CS1Tvb3z.js";
|
|
@@ -85,7 +85,7 @@ import { i as parseAbsoluteTimeMs, r as resolveDefaultCronStaggerMs, t as normal
|
|
|
85
85
|
import { n as resolveMessageChannelSelection, t as listConfiguredMessageChannels } from "./channel-selection-DjrS6oiz.js";
|
|
86
86
|
import { n as resolveAgentRoute, t as buildAgentSessionKey } from "./resolve-route-CnTdHVgw.js";
|
|
87
87
|
import { t as parseTimeoutMs } from "./parse-timeout-CuYdP9TL.js";
|
|
88
|
-
import { n as registerMemoryCli } from "./memory-cli-
|
|
88
|
+
import { n as registerMemoryCli } from "./memory-cli-BwQsPEFk.js";
|
|
89
89
|
import { i as resolveSlackThreadTs, n as deliverReplies, t as createSlackReplyDeliveryPlan } from "./replies-C5CBlnFS.js";
|
|
90
90
|
import { a as resolveSubagentToolPolicy, i as resolveGroupToolPolicy, n as isToolAllowedByPolicies, r as resolveEffectiveToolPolicy, t as filterToolsByPolicy } from "./pi-tools.policy-WaLKhqJQ.js";
|
|
91
91
|
import { a as buildModelAliasLines, n as resolveModel$2 } from "./model-BMFj7NXy.js";
|
|
@@ -13184,13 +13184,21 @@ async function applyMediaUnderstanding(params) {
|
|
|
13184
13184
|
* Soft warning appended when context usage crosses the threshold.
|
|
13185
13185
|
* Fires once per session (tracked via `SessionEntry.contextWarningSent`).
|
|
13186
13186
|
*/
|
|
13187
|
-
const SESSION_CONTEXT_WARNING_MESSAGE = "📋 Heads up — this session is approaching the context limit.
|
|
13187
|
+
const SESSION_CONTEXT_WARNING_MESSAGE = "📋 Heads up — this session is approaching the context limit. Symi will compact older context automatically when usage reaches 90%.";
|
|
13188
13188
|
/**
|
|
13189
|
-
*
|
|
13190
|
-
*
|
|
13191
|
-
* turn
|
|
13189
|
+
* Inline status emitted by Symi before running compaction proactively
|
|
13190
|
+
* at the 90% threshold. Followed by the agent's actual response in the
|
|
13191
|
+
* same turn.
|
|
13192
13192
|
*/
|
|
13193
|
-
const
|
|
13193
|
+
const SESSION_COMPACTING_MESSAGE = "📋 Context limit reached for this session. Compacting older context and continuing…";
|
|
13194
|
+
/**
|
|
13195
|
+
* Returned when compaction can't recover enough budget to continue —
|
|
13196
|
+
* either because the proactive compaction at 90% failed, or because a
|
|
13197
|
+
* single user message overshot the window in one turn and the reactive
|
|
13198
|
+
* fallback compaction also failed. Same message also short-circuits
|
|
13199
|
+
* subsequent turns until /reset or /new.
|
|
13200
|
+
*/
|
|
13201
|
+
const SESSION_COMPACTION_FAILED_MESSAGE = "📋 Couldn't compact this session further. Please /reset or /new to continue — your full conversation is saved in history.";
|
|
13194
13202
|
|
|
13195
13203
|
//#endregion
|
|
13196
13204
|
//#region src/sessions/level-overrides.ts
|
|
@@ -33031,6 +33039,86 @@ async function handleInlineActions(params) {
|
|
|
33031
33039
|
};
|
|
33032
33040
|
}
|
|
33033
33041
|
|
|
33042
|
+
//#endregion
|
|
33043
|
+
//#region src/auto-reply/reply/middleware-context-warning.ts
|
|
33044
|
+
/** Threshold (fraction of context window) that triggers the soft warning. */
|
|
33045
|
+
const CONTEXT_WARNING_THRESHOLD = .85;
|
|
33046
|
+
/**
|
|
33047
|
+
* Threshold that triggers proactive compaction in `prepareReplyTurn`.
|
|
33048
|
+
* Higher than the soft warning so the user sees the heads-up first;
|
|
33049
|
+
* compaction runs the next turn the threshold is observed.
|
|
33050
|
+
*/
|
|
33051
|
+
const CONTEXT_PROACTIVE_COMPACT_THRESHOLD = .9;
|
|
33052
|
+
/**
|
|
33053
|
+
* Pure decision for "should `prepareReplyTurn` run proactive compaction
|
|
33054
|
+
* before the next turn?" — extracted so the trigger logic is unit-testable
|
|
33055
|
+
* without mocking the rest of the prep pipeline.
|
|
33056
|
+
*
|
|
33057
|
+
* Returns true ONLY when:
|
|
33058
|
+
* - we have a session id (otherwise compaction has no target),
|
|
33059
|
+
* - we have a positive context window,
|
|
33060
|
+
* - we have a positive cumulative usage from the previous turn,
|
|
33061
|
+
* - usage / window ≥ CONTEXT_PROACTIVE_COMPACT_THRESHOLD.
|
|
33062
|
+
*/
|
|
33063
|
+
function shouldProactivelyCompact(args) {
|
|
33064
|
+
if (!args.sessionId) return false;
|
|
33065
|
+
if (!args.contextTokens || args.contextTokens <= 0) return false;
|
|
33066
|
+
const usage = args.totalTokens ?? 0;
|
|
33067
|
+
if (usage <= 0) return false;
|
|
33068
|
+
return usage / args.contextTokens >= CONTEXT_PROACTIVE_COMPACT_THRESHOLD;
|
|
33069
|
+
}
|
|
33070
|
+
/**
|
|
33071
|
+
* Read the model's context-window size, falling back to the global
|
|
33072
|
+
* default when the model isn't in the registry yet.
|
|
33073
|
+
*/
|
|
33074
|
+
function resolveContextWindow(modelId) {
|
|
33075
|
+
const fromRegistry = lookupContextTokens(modelId);
|
|
33076
|
+
if (fromRegistry && fromRegistry > 0) return fromRegistry;
|
|
33077
|
+
return DEFAULT_CONTEXT_TOKENS;
|
|
33078
|
+
}
|
|
33079
|
+
/**
|
|
33080
|
+
* After-turn hook that surfaces a one-time soft warning when usage
|
|
33081
|
+
* crosses the context threshold. Mutates the result text to append
|
|
33082
|
+
* the warning when triggered, and persists `contextWarningSent: true`
|
|
33083
|
+
* on the session entry so the warning doesn't fire again.
|
|
33084
|
+
*/
|
|
33085
|
+
function withContextUsageWarning() {
|
|
33086
|
+
return (next) => async (params) => {
|
|
33087
|
+
const result = await next(params);
|
|
33088
|
+
if (result.outbound.action === "drop") return result;
|
|
33089
|
+
if (!params.sessionKey) return result;
|
|
33090
|
+
const usage = result.rawResult.meta.agentMeta?.usage?.total ?? 0;
|
|
33091
|
+
if (usage <= 0) return result;
|
|
33092
|
+
if (usage / resolveContextWindow(params.modelId ?? result.modelId) < CONTEXT_WARNING_THRESHOLD) return result;
|
|
33093
|
+
const agentId = resolveAgentIdFromSessionKey(params.sessionKey);
|
|
33094
|
+
const storePath = resolveStorePath(params.config.session?.store, { agentId });
|
|
33095
|
+
let alreadyWarned = false;
|
|
33096
|
+
try {
|
|
33097
|
+
await updateSessionStoreEntry({
|
|
33098
|
+
storePath,
|
|
33099
|
+
sessionKey: params.sessionKey,
|
|
33100
|
+
update: async (entry) => {
|
|
33101
|
+
if (entry.contextWarningSent === true) {
|
|
33102
|
+
alreadyWarned = true;
|
|
33103
|
+
return null;
|
|
33104
|
+
}
|
|
33105
|
+
return { contextWarningSent: true };
|
|
33106
|
+
}
|
|
33107
|
+
});
|
|
33108
|
+
} catch (err) {
|
|
33109
|
+
logVerbose(`context-warning: failed to persist contextWarningSent flag for ${params.sessionKey}: ${String(err)}`);
|
|
33110
|
+
return result;
|
|
33111
|
+
}
|
|
33112
|
+
if (alreadyWarned) return result;
|
|
33113
|
+
const trimmedText = result.text.trimEnd();
|
|
33114
|
+
const separator = trimmedText ? "\n\n" : "";
|
|
33115
|
+
return {
|
|
33116
|
+
...result,
|
|
33117
|
+
text: `${trimmedText}${separator}${SESSION_CONTEXT_WARNING_MESSAGE}`
|
|
33118
|
+
};
|
|
33119
|
+
};
|
|
33120
|
+
}
|
|
33121
|
+
|
|
33034
33122
|
//#endregion
|
|
33035
33123
|
//#region src/auto-reply/reply/session-reset-model.ts
|
|
33036
33124
|
function splitBody(body) {
|
|
@@ -33927,7 +34015,7 @@ async function prepareReplyTurn(ctx, opts, configOverride) {
|
|
|
33927
34015
|
typing.cleanup();
|
|
33928
34016
|
return {
|
|
33929
34017
|
kind: "early-reply",
|
|
33930
|
-
reply: { text:
|
|
34018
|
+
reply: { text: SESSION_COMPACTION_FAILED_MESSAGE }
|
|
33931
34019
|
};
|
|
33932
34020
|
}
|
|
33933
34021
|
await applyResetModelOverride({
|
|
@@ -34040,6 +34128,82 @@ async function prepareReplyTurn(ctx, opts, configOverride) {
|
|
|
34040
34128
|
};
|
|
34041
34129
|
directives = inlineActionResult.directives;
|
|
34042
34130
|
abortedLastRun = inlineActionResult.abortedLastRun ?? abortedLastRun;
|
|
34131
|
+
if (shouldProactivelyCompact({
|
|
34132
|
+
totalTokens: sessionEntry.totalTokens,
|
|
34133
|
+
contextTokens,
|
|
34134
|
+
sessionId: sessionEntry.sessionId
|
|
34135
|
+
})) {
|
|
34136
|
+
if (resolvedOpts?.onBlockReply) try {
|
|
34137
|
+
await resolvedOpts.onBlockReply({ text: SESSION_COMPACTING_MESSAGE });
|
|
34138
|
+
} catch (err) {
|
|
34139
|
+
logVerbose(`proactive-compact: inline status delivery failed: ${String(err)}`);
|
|
34140
|
+
}
|
|
34141
|
+
if (isEmbeddedPiRunActive(sessionEntry.sessionId)) {
|
|
34142
|
+
abortEmbeddedPiRun(sessionEntry.sessionId);
|
|
34143
|
+
await waitForEmbeddedPiRunEnd(sessionEntry.sessionId, 15e3);
|
|
34144
|
+
}
|
|
34145
|
+
let compactResult;
|
|
34146
|
+
try {
|
|
34147
|
+
compactResult = await compactEmbeddedPiSession({
|
|
34148
|
+
sessionId: sessionEntry.sessionId,
|
|
34149
|
+
sessionKey,
|
|
34150
|
+
messageChannel: command.channel,
|
|
34151
|
+
groupId: sessionEntry.groupId,
|
|
34152
|
+
groupChannel: sessionEntry.groupChannel,
|
|
34153
|
+
groupSpace: sessionEntry.space,
|
|
34154
|
+
spawnedBy: sessionEntry.spawnedBy,
|
|
34155
|
+
sessionFile: resolveSessionFilePath(sessionEntry.sessionId, sessionEntry, resolveSessionFilePathOptions({
|
|
34156
|
+
agentId,
|
|
34157
|
+
storePath
|
|
34158
|
+
})),
|
|
34159
|
+
workspaceDir,
|
|
34160
|
+
agentDir,
|
|
34161
|
+
config: cfg,
|
|
34162
|
+
skillsSnapshot: sessionEntry.skillsSnapshot,
|
|
34163
|
+
provider,
|
|
34164
|
+
model,
|
|
34165
|
+
thinkLevel: resolvedThinkLevel,
|
|
34166
|
+
reasoningLevel: resolvedReasoningLevel,
|
|
34167
|
+
trigger: "overflow",
|
|
34168
|
+
senderIsOwner: command.senderIsOwner,
|
|
34169
|
+
ownerNumbers: command.ownerList.length > 0 ? command.ownerList : void 0
|
|
34170
|
+
});
|
|
34171
|
+
} catch (err) {
|
|
34172
|
+
logVerbose(`proactive-compact: compactor threw for ${sessionKey}: ${String(err)}`);
|
|
34173
|
+
compactResult = {
|
|
34174
|
+
ok: false,
|
|
34175
|
+
compacted: false,
|
|
34176
|
+
reason: String(err)
|
|
34177
|
+
};
|
|
34178
|
+
}
|
|
34179
|
+
if (compactResult.ok && compactResult.compacted) await incrementCompactionCount({
|
|
34180
|
+
sessionEntry,
|
|
34181
|
+
sessionStore,
|
|
34182
|
+
sessionKey,
|
|
34183
|
+
storePath,
|
|
34184
|
+
tokensAfter: compactResult.result?.tokensAfter
|
|
34185
|
+
});
|
|
34186
|
+
else {
|
|
34187
|
+
logVerbose(`proactive-compact: failed for ${sessionKey} (${compactResult.reason ?? "unknown"})`);
|
|
34188
|
+
if (storePath) try {
|
|
34189
|
+
await updateSessionStoreEntry({
|
|
34190
|
+
storePath,
|
|
34191
|
+
sessionKey,
|
|
34192
|
+
update: async (entry) => {
|
|
34193
|
+
if (entry.endedReason === "context_overflow") return null;
|
|
34194
|
+
return { endedReason: "context_overflow" };
|
|
34195
|
+
}
|
|
34196
|
+
});
|
|
34197
|
+
} catch (err) {
|
|
34198
|
+
logVerbose(`proactive-compact: failed to mark session sealed: ${String(err)}`);
|
|
34199
|
+
}
|
|
34200
|
+
typing.cleanup();
|
|
34201
|
+
return {
|
|
34202
|
+
kind: "early-reply",
|
|
34203
|
+
reply: { text: SESSION_COMPACTION_FAILED_MESSAGE }
|
|
34204
|
+
};
|
|
34205
|
+
}
|
|
34206
|
+
}
|
|
34043
34207
|
await stageSandboxMedia({
|
|
34044
34208
|
ctx,
|
|
34045
34209
|
sessionCtx,
|
|
@@ -34468,8 +34632,8 @@ function extractErrorMessage(err) {
|
|
|
34468
34632
|
function buildBoundaryResult(params) {
|
|
34469
34633
|
const profile = resolveModelProfile(params.provider && params.modelId ? `${params.provider}/${params.modelId}` : "", params.config.models?.profiles);
|
|
34470
34634
|
return {
|
|
34471
|
-
text:
|
|
34472
|
-
rawText:
|
|
34635
|
+
text: SESSION_COMPACTION_FAILED_MESSAGE,
|
|
34636
|
+
rawText: SESSION_COMPACTION_FAILED_MESSAGE,
|
|
34473
34637
|
outbound: {
|
|
34474
34638
|
action: "deliver",
|
|
34475
34639
|
reason: "deliver"
|
|
@@ -34480,7 +34644,7 @@ function buildBoundaryResult(params) {
|
|
|
34480
34644
|
profile,
|
|
34481
34645
|
didSendViaMessagingTool: false,
|
|
34482
34646
|
rawResult: {
|
|
34483
|
-
payloads: [{ text:
|
|
34647
|
+
payloads: [{ text: SESSION_COMPACTION_FAILED_MESSAGE }],
|
|
34484
34648
|
meta: {
|
|
34485
34649
|
durationMs: Date.now() - params.startTime,
|
|
34486
34650
|
agentMeta: {
|
|
@@ -34539,62 +34703,6 @@ function withContextOverflowRecovery() {
|
|
|
34539
34703
|
};
|
|
34540
34704
|
}
|
|
34541
34705
|
|
|
34542
|
-
//#endregion
|
|
34543
|
-
//#region src/auto-reply/reply/middleware-context-warning.ts
|
|
34544
|
-
/** Threshold (fraction of context window) that triggers the soft warning. */
|
|
34545
|
-
const CONTEXT_WARNING_THRESHOLD = .85;
|
|
34546
|
-
/**
|
|
34547
|
-
* Read the model's context-window size, falling back to the global
|
|
34548
|
-
* default when the model isn't in the registry yet.
|
|
34549
|
-
*/
|
|
34550
|
-
function resolveContextWindow(modelId) {
|
|
34551
|
-
const fromRegistry = lookupContextTokens(modelId);
|
|
34552
|
-
if (fromRegistry && fromRegistry > 0) return fromRegistry;
|
|
34553
|
-
return DEFAULT_CONTEXT_TOKENS;
|
|
34554
|
-
}
|
|
34555
|
-
/**
|
|
34556
|
-
* After-turn hook that surfaces a one-time soft warning when usage
|
|
34557
|
-
* crosses the context threshold. Mutates the result text to append
|
|
34558
|
-
* the warning when triggered, and persists `contextWarningSent: true`
|
|
34559
|
-
* on the session entry so the warning doesn't fire again.
|
|
34560
|
-
*/
|
|
34561
|
-
function withContextUsageWarning() {
|
|
34562
|
-
return (next) => async (params) => {
|
|
34563
|
-
const result = await next(params);
|
|
34564
|
-
if (result.outbound.action === "drop") return result;
|
|
34565
|
-
if (!params.sessionKey) return result;
|
|
34566
|
-
const usage = result.rawResult.meta.agentMeta?.usage?.total ?? 0;
|
|
34567
|
-
if (usage <= 0) return result;
|
|
34568
|
-
if (usage / resolveContextWindow(params.modelId ?? result.modelId) < CONTEXT_WARNING_THRESHOLD) return result;
|
|
34569
|
-
const agentId = resolveAgentIdFromSessionKey(params.sessionKey);
|
|
34570
|
-
const storePath = resolveStorePath(params.config.session?.store, { agentId });
|
|
34571
|
-
let alreadyWarned = false;
|
|
34572
|
-
try {
|
|
34573
|
-
await updateSessionStoreEntry({
|
|
34574
|
-
storePath,
|
|
34575
|
-
sessionKey: params.sessionKey,
|
|
34576
|
-
update: async (entry) => {
|
|
34577
|
-
if (entry.contextWarningSent === true) {
|
|
34578
|
-
alreadyWarned = true;
|
|
34579
|
-
return null;
|
|
34580
|
-
}
|
|
34581
|
-
return { contextWarningSent: true };
|
|
34582
|
-
}
|
|
34583
|
-
});
|
|
34584
|
-
} catch (err) {
|
|
34585
|
-
logVerbose(`context-warning: failed to persist contextWarningSent flag for ${params.sessionKey}: ${String(err)}`);
|
|
34586
|
-
return result;
|
|
34587
|
-
}
|
|
34588
|
-
if (alreadyWarned) return result;
|
|
34589
|
-
const trimmedText = result.text.trimEnd();
|
|
34590
|
-
const separator = trimmedText ? "\n\n" : "";
|
|
34591
|
-
return {
|
|
34592
|
-
...result,
|
|
34593
|
-
text: `${trimmedText}${separator}${SESSION_CONTEXT_WARNING_MESSAGE}`
|
|
34594
|
-
};
|
|
34595
|
-
};
|
|
34596
|
-
}
|
|
34597
|
-
|
|
34598
34706
|
//#endregion
|
|
34599
34707
|
//#region src/auto-reply/reply/middleware-diagnostic-logging.ts
|
|
34600
34708
|
function deriveChannel(ctx) {
|
|
@@ -49114,7 +49222,7 @@ async function runEmbeddedPiAgent(params) {
|
|
|
49114
49222
|
error: err
|
|
49115
49223
|
});
|
|
49116
49224
|
}
|
|
49117
|
-
const MAX_OVERFLOW_COMPACTION_ATTEMPTS =
|
|
49225
|
+
const MAX_OVERFLOW_COMPACTION_ATTEMPTS = 1;
|
|
49118
49226
|
const MAX_RUN_LOOP_ITERATIONS = resolveMaxRunRetryIterations(profileCandidates.length);
|
|
49119
49227
|
let overflowCompactionAttempts = 0;
|
|
49120
49228
|
let toolResultTruncationAttempted = false;
|
|
@@ -49868,4 +49976,4 @@ async function runAgentTurn(params) {
|
|
|
49868
49976
|
}
|
|
49869
49977
|
|
|
49870
49978
|
//#endregion
|
|
49871
|
-
export { isExternalHookSession as $, emitAgentEvent as $t, resolveSessionDeliveryTarget as A, resolveFailoverStatus as An, resolveInputFileLimits as At, normalizeOptionalSessionKey as B, countActiveDescendantRuns as Bt, symi_tools_exports as C, CommandLane as Cn, DEFAULT_INPUT_IMAGE_MAX_BYTES as Ct, ensureOutboundSessionEntry as D, runWithModelFallback as Dn, extractFileContentFromSource as Dt, runMessageAction as E, composeTurnMiddleware as En, DEFAULT_INPUT_TIMEOUT_MS as Et, normalizeHttpWebhookUrl as F, normalizeGroupActivation as Ft, buildDeliveryFromLegacyPayload as G, subagent_registry_exports as Gt, normalizePayloadToSystemText as H, initSubagentRegistry as Ht, normalizeCronJobCreate as I, clearSessionAuthProfileOverride as It, CHANNEL_TARGETS_DESCRIPTION as J, readLatestAssistantReply as Jt, hasLegacyDeliveryHints as K, resolveAgentTimeoutMs as Kt, normalizeCronJobPatch as L, formatZonedTimestamp as Lt, formatTargetDisplay as M, applyTemplate as Mt, resetDirectoryCache as N, prepareAgentRun as Nt, resolveOutboundSessionRoute as O, FailoverError as On, extractImageContentFromSource as Ot, CHANNEL_MESSAGE_ACTION_NAMES as P, BARE_SESSION_RESET_PROMPT as Pt, getHookType as Q, clearAgentRunContext as Qt, inferLegacyName as R, isAbortTrigger as Rt, createSymiTools as S, waitForActiveTasks as Sn, parseVerboseOverride as St, resolveAnnounceTargetFromKey as T, resolveModelProfile as Tn, DEFAULT_INPUT_MAX_REDIRECTS as Tt, normalizeRequiredName as U, listDescendantRunsForRequester as Ut, normalizeOptionalText as V, countActiveRunsForSession as Vt, migrateLegacyCronPayload as W, listSubagentRunsForRequester as Wt, buildSafeExternalPrompt as X, AGENT_LANE_SUBAGENT as Xt, CHANNEL_TARGET_DESCRIPTION as Y, AGENT_LANE_NESTED as Yt, detectSuspiciousPatterns as Z, clearSessionQueues as Zt,
|
|
49979
|
+
export { isExternalHookSession as $, emitAgentEvent as $t, resolveSessionDeliveryTarget as A, resolveFailoverStatus as An, resolveInputFileLimits as At, normalizeOptionalSessionKey as B, countActiveDescendantRuns as Bt, symi_tools_exports as C, CommandLane as Cn, DEFAULT_INPUT_IMAGE_MAX_BYTES as Ct, ensureOutboundSessionEntry as D, runWithModelFallback as Dn, extractFileContentFromSource as Dt, runMessageAction as E, composeTurnMiddleware as En, DEFAULT_INPUT_TIMEOUT_MS as Et, normalizeHttpWebhookUrl as F, normalizeGroupActivation as Ft, buildDeliveryFromLegacyPayload as G, subagent_registry_exports as Gt, normalizePayloadToSystemText as H, initSubagentRegistry as Ht, normalizeCronJobCreate as I, clearSessionAuthProfileOverride as It, CHANNEL_TARGETS_DESCRIPTION as J, readLatestAssistantReply as Jt, hasLegacyDeliveryHints as K, resolveAgentTimeoutMs as Kt, normalizeCronJobPatch as L, formatZonedTimestamp as Lt, formatTargetDisplay as M, applyTemplate as Mt, resetDirectoryCache as N, prepareAgentRun as Nt, resolveOutboundSessionRoute as O, FailoverError as On, extractImageContentFromSource as Ot, CHANNEL_MESSAGE_ACTION_NAMES as P, BARE_SESSION_RESET_PROMPT as Pt, getHookType as Q, clearAgentRunContext as Qt, inferLegacyName as R, isAbortTrigger as Rt, createSymiTools as S, waitForActiveTasks as Sn, parseVerboseOverride as St, resolveAnnounceTargetFromKey as T, resolveModelProfile as Tn, DEFAULT_INPUT_MAX_REDIRECTS as Tt, normalizeRequiredName as U, listDescendantRunsForRequester as Ut, normalizeOptionalText as V, countActiveRunsForSession as Vt, migrateLegacyCronPayload as W, listSubagentRunsForRequester as Wt, buildSafeExternalPrompt as X, AGENT_LANE_SUBAGENT as Xt, CHANNEL_TARGET_DESCRIPTION as Y, AGENT_LANE_NESTED as Yt, detectSuspiciousPatterns as Z, clearSessionQueues as Zt, withContextOverflowRecovery as _, resolveRunWorkspaceDir as _n, DEFAULT_OAUTH_WARN_MS as _t, getPluginToolMeta as a, getActiveEmbeddedRunCount as an, isGatewaySigusr1RestartExternallyAllowed as at, prepareReplyTurn as b, resetAllLanes as bn, applyModelOverrideToSessionEntry as bt, handleSlackHttpRequest as c, registerUnhandledRejectionHandler as cn, setGatewaySigusr1RestartPolicy as ct, buildHistoryContextFromEntries as d, formatUserTime as dn, resolveCommitHash as dt, getAgentRunContext as en, applyBrowserProxyPaths as et, getChannelActivity as f, resolveUserTimeFormat as fn, getProcessSupervisor as ft, buildGlassUiProfile as g, redactRunIdentifier as gn, maskApiKey as gt, getTotalPendingReplies as h, resolveBootstrapContextForRun as hn, resolveSendPolicy as ht, sniffMimeFromBase64 as i, abortEmbeddedPiRun as in, emitGatewayRestart as it, normalizePollInput as j, estimateBase64DecodedBytes as jt, resolveOutboundTarget as k, describeFailoverError as kn, normalizeMimeList as kt, readJsonBodyWithLimit as l, ToolInputError as ln, setPreRestartDeferralCheck as lt, createReplyDispatcher as m, makeBootstrapWarn as mn, normalizeSendPolicy as mt, applyToolPolicyPipeline as n, registerAgentRunContext as nn, consumeGatewaySigusr1RestartAuthorization as nt, createPluginLoaderLogger as o, waitForEmbeddedPiRunEnd as on, markGatewaySigusr1RestartHandled as ot, provider_dispatcher_exports as p, resolveUserTimezone as pn, detectRuntimeShell as pt, stripLegacyDeliveryFields as q, runSubagentAnnounceFlow as qt, buildDefaultToolPolicyPipelineSteps as r, buildAgentSystemPrompt as rn, deferGatewayRestartUntilIdle as rt, loadSymiPlugins as s, installUnhandledRejectionHandler as sn, scheduleGatewaySigusr1Restart as st, runAgentTurn as t, onAgentEvent as tn, persistBrowserProxyFiles as tt, requestBodyErrorToText as u, resolveSymiDocsPath as un, buildSystemPromptParams as ut, runUnifiedTurn as v, getActiveTaskCount as vn, buildAuthHealthSummary as vt, listTasksInWorkdir as w, classifyOutboundMessage as wn, DEFAULT_INPUT_IMAGE_MIMES as wt, withContextUsageWarning as x, setCommandLaneConcurrency as xn, applyVerboseOverride as xt, buildAgentTurnParams as y, getTotalQueueSize as yn, formatRemainingShort as yt, normalizeOptionalAgentId as z, stopSubagentsForRequester as zt };
|