@code-yeongyu/senpi 2026.8.30-2 → 2026.8.30-3
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/CHANGELOG.md +51 -1
- package/dist/core/agent-session.d.ts +2 -0
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +77 -10
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/extensions/builtin/compaction/context-pipeline.d.ts +1 -0
- package/dist/core/extensions/builtin/compaction/context-pipeline.d.ts.map +1 -1
- package/dist/core/extensions/builtin/compaction/context-pipeline.js +6 -2
- package/dist/core/extensions/builtin/compaction/context-pipeline.js.map +1 -1
- package/dist/core/extensions/builtin/compaction/deterministic-fallback.d.ts.map +1 -1
- package/dist/core/extensions/builtin/compaction/deterministic-fallback.js +3 -2
- package/dist/core/extensions/builtin/compaction/deterministic-fallback.js.map +1 -1
- package/dist/core/extensions/builtin/compaction/idle-retry.d.ts +1 -1
- package/dist/core/extensions/builtin/compaction/idle-retry.d.ts.map +1 -1
- package/dist/core/extensions/builtin/compaction/idle-retry.js +1 -1
- package/dist/core/extensions/builtin/compaction/idle-retry.js.map +1 -1
- package/dist/core/extensions/builtin/compaction/index.d.ts.map +1 -1
- package/dist/core/extensions/builtin/compaction/index.js +34 -10
- package/dist/core/extensions/builtin/compaction/index.js.map +1 -1
- package/dist/core/extensions/builtin/compaction/model-usability-budget.d.ts +30 -0
- package/dist/core/extensions/builtin/compaction/model-usability-budget.d.ts.map +1 -0
- package/dist/core/extensions/builtin/compaction/model-usability-budget.js +74 -0
- package/dist/core/extensions/builtin/compaction/model-usability-budget.js.map +1 -0
- package/dist/core/extensions/builtin/compaction/orchestration.d.ts +3 -13
- package/dist/core/extensions/builtin/compaction/orchestration.d.ts.map +1 -1
- package/dist/core/extensions/builtin/compaction/orchestration.js +50 -83
- package/dist/core/extensions/builtin/compaction/orchestration.js.map +1 -1
- package/dist/core/extensions/builtin/compaction/policy.d.ts +8 -1
- package/dist/core/extensions/builtin/compaction/policy.d.ts.map +1 -1
- package/dist/core/extensions/builtin/compaction/policy.js +12 -3
- package/dist/core/extensions/builtin/compaction/policy.js.map +1 -1
- package/dist/core/extensions/builtin/compaction/token-budget-reminder.d.ts +8 -2
- package/dist/core/extensions/builtin/compaction/token-budget-reminder.d.ts.map +1 -1
- package/dist/core/extensions/builtin/compaction/token-budget-reminder.js +12 -5
- package/dist/core/extensions/builtin/compaction/token-budget-reminder.js.map +1 -1
- package/dist/core/extensions/builtin/compaction/tool-admission.d.ts +12 -21
- package/dist/core/extensions/builtin/compaction/tool-admission.d.ts.map +1 -1
- package/dist/core/extensions/builtin/compaction/tool-admission.js +27 -63
- package/dist/core/extensions/builtin/compaction/tool-admission.js.map +1 -1
- package/dist/core/extensions/builtin/terminal/runtime-session.d.ts +11 -0
- package/dist/core/extensions/builtin/terminal/runtime-session.d.ts.map +1 -1
- package/dist/core/extensions/builtin/terminal/runtime-session.js +18 -2
- package/dist/core/extensions/builtin/terminal/runtime-session.js.map +1 -1
- package/dist/core/sdk.d.ts.map +1 -1
- package/dist/core/sdk.js +5 -0
- package/dist/core/sdk.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/modes/index.d.ts +1 -1
- package/dist/modes/index.d.ts.map +1 -1
- package/dist/modes/index.js +1 -1
- package/dist/modes/index.js.map +1 -1
- package/dist/modes/interactive/interactive-host-runtime.d.ts +13 -2
- package/dist/modes/interactive/interactive-host-runtime.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-host-runtime.js +317 -72
- package/dist/modes/interactive/interactive-host-runtime.js.map +1 -1
- package/dist/modes/rpc/connection-handler.d.ts.map +1 -1
- package/dist/modes/rpc/connection-handler.js +17 -4
- package/dist/modes/rpc/connection-handler.js.map +1 -1
- package/dist/modes/rpc/rpc-client.d.ts +10 -0
- package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-client.js +32 -10
- package/dist/modes/rpc/rpc-client.js.map +1 -1
- package/docs/rpc.md +4 -0
- package/node_modules/@code-yeongyu/senpi-codemode/CHANGELOG.md +12 -0
- package/node_modules/@code-yeongyu/senpi-codemode/package.json +4 -4
- package/node_modules/@earendil-works/pi-agent-core/package.json +3 -3
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/.manifest.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/openrouter.json +1 -1
- package/node_modules/@earendil-works/pi-ai/package.json +2 -2
- package/node_modules/@earendil-works/pi-pty/dist/screen-operations.d.ts +42 -0
- package/node_modules/@earendil-works/pi-pty/dist/screen-operations.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-pty/dist/screen-operations.js +34 -0
- package/node_modules/@earendil-works/pi-pty/dist/screen-operations.js.map +1 -0
- package/node_modules/@earendil-works/pi-pty/dist/screen-text.d.ts +8 -0
- package/node_modules/@earendil-works/pi-pty/dist/screen-text.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-pty/dist/screen-text.js +51 -0
- package/node_modules/@earendil-works/pi-pty/dist/screen-text.js.map +1 -0
- package/node_modules/@earendil-works/pi-pty/dist/screen.d.ts +45 -0
- package/node_modules/@earendil-works/pi-pty/dist/screen.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-pty/dist/screen.js +178 -55
- package/node_modules/@earendil-works/pi-pty/dist/screen.js.map +1 -1
- package/node_modules/@earendil-works/pi-pty/package.json +1 -1
- package/node_modules/@earendil-works/pi-telemetry/package.json +1 -1
- package/node_modules/@earendil-works/pi-tui/package.json +1 -1
- package/package.json +7 -7
|
@@ -13,5 +13,6 @@ export declare function buildCompactionContext(input: {
|
|
|
13
13
|
breakerFallback: boolean;
|
|
14
14
|
laneOwnsCompaction: boolean;
|
|
15
15
|
emergencyPruneLatch: EmergencyPruneLatch;
|
|
16
|
+
reminder?: string;
|
|
16
17
|
}): import("@earendil-works/pi-ai").Message[];
|
|
17
18
|
//# sourceMappingURL=context-pipeline.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context-pipeline.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/compaction/context-pipeline.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAUrE,OAAO,EAAE,KAAK,mBAAmB,EAA2B,MAAM,kBAAkB,CAAC;AAErF,wBAAgB,sBAAsB,CAAC,KAAK,EAAE;IAC7C,KAAK,EAAE,YAAY,CAAC;IACpB,GAAG,EAAE,gBAAgB,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB;;;OAGG;IACH,mBAAmB,EAAE,MAAM,CAAC;IAC5B,oBAAoB,EAAE,OAAO,CAAC;IAC9B,eAAe,EAAE,OAAO,CAAC;IACzB,kBAAkB,EAAE,OAAO,CAAC;IAC5B,mBAAmB,EAAE,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"context-pipeline.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/compaction/context-pipeline.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAUrE,OAAO,EAAE,KAAK,mBAAmB,EAA2B,MAAM,kBAAkB,CAAC;AAErF,wBAAgB,sBAAsB,CAAC,KAAK,EAAE;IAC7C,KAAK,EAAE,YAAY,CAAC;IACpB,GAAG,EAAE,gBAAgB,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB;;;OAGG;IACH,mBAAmB,EAAE,MAAM,CAAC;IAC5B,oBAAoB,EAAE,OAAO,CAAC;IAC9B,eAAe,EAAE,OAAO,CAAC;IACzB,kBAAkB,EAAE,OAAO,CAAC;IAC5B,mBAAmB,EAAE,mBAAmB,CAAC;IACzC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAClB,6CA4BA"}
|
|
@@ -2,10 +2,13 @@ import { convertToLlm } from "../../../messages.js";
|
|
|
2
2
|
import { BUILTIN_CONTEXT_REDUCTION_OPTIONS, reduceContextMessages, shouldApplyContextReduction, } from "./context-reduction.js";
|
|
3
3
|
import { markOpenAiRemoteReplayBoundary } from "./openai-remote.js";
|
|
4
4
|
import { isOpenAiRemoteCompactionModel } from "./openai-remote-model.js";
|
|
5
|
-
import { admitContextToolResults } from "./orchestration.js";
|
|
5
|
+
import { admitContextToolResults, injectTokenBudgetReminder } from "./orchestration.js";
|
|
6
6
|
import { repairOrphanedToolResults } from "./repair-tool-pairs.js";
|
|
7
7
|
import { hardLimitEmergencyPrune } from "./speculative.js";
|
|
8
8
|
export function buildCompactionContext(input) {
|
|
9
|
+
if (input.laneOwnsCompaction) {
|
|
10
|
+
return repairOrphanedToolResults(convertToLlm(input.event.messages));
|
|
11
|
+
}
|
|
9
12
|
const admittedMessages = admitContextToolResults(input.event.messages, input.contextWindow, input.toolAdmissionEnabled);
|
|
10
13
|
const sourceMessages = !input.laneOwnsCompaction &&
|
|
11
14
|
(input.breakerFallback ||
|
|
@@ -23,6 +26,7 @@ export function buildCompactionContext(input) {
|
|
|
23
26
|
model: input.ctx.model,
|
|
24
27
|
branchEntries: input.ctx.sessionManager.getBranch(),
|
|
25
28
|
});
|
|
26
|
-
|
|
29
|
+
const reminded = injectTokenBudgetReminder(marked, input.reminder);
|
|
30
|
+
return repairOrphanedToolResults(convertToLlm(reminded));
|
|
27
31
|
}
|
|
28
32
|
//# sourceMappingURL=context-pipeline.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context-pipeline.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/compaction/context-pipeline.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEpD,OAAO,EACN,iCAAiC,EACjC,qBAAqB,EACrB,2BAA2B,GAC3B,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,8BAA8B,EAAE,MAAM,oBAAoB,CAAC;AACpE,OAAO,EAAE,6BAA6B,EAAE,MAAM,0BAA0B,CAAC;AACzE,OAAO,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"context-pipeline.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/compaction/context-pipeline.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEpD,OAAO,EACN,iCAAiC,EACjC,qBAAqB,EACrB,2BAA2B,GAC3B,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,8BAA8B,EAAE,MAAM,oBAAoB,CAAC;AACpE,OAAO,EAAE,6BAA6B,EAAE,MAAM,0BAA0B,CAAC;AACzE,OAAO,EAAE,uBAAuB,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AACxF,OAAO,EAAE,yBAAyB,EAAE,MAAM,wBAAwB,CAAC;AACnE,OAAO,EAA4B,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAErF,MAAM,UAAU,sBAAsB,CAAC,KActC;IACA,IAAI,KAAK,CAAC,kBAAkB,EAAE,CAAC;QAC9B,OAAO,yBAAyB,CAAC,YAAY,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC;IACtE,CAAC;IACD,MAAM,gBAAgB,GAAG,uBAAuB,CAC/C,KAAK,CAAC,KAAK,CAAC,QAAQ,EACpB,KAAK,CAAC,aAAa,EACnB,KAAK,CAAC,oBAAoB,CAC1B,CAAC;IACF,MAAM,cAAc,GACnB,CAAC,KAAK,CAAC,kBAAkB;QACzB,CAAC,KAAK,CAAC,eAAe;YACrB,2BAA2B,CAAC;gBAC3B,WAAW,EAAE,KAAK,CAAC,GAAG,CAAC,eAAe,EAAE,EAAE,MAAM,IAAI,IAAI;gBACxD,aAAa,EAAE,KAAK,CAAC,aAAa;gBAClC,8BAA8B,EAAE,6BAA6B,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,kBAAkB;aAC1G,CAAC,CAAC;QACH,CAAC,CAAC,qBAAqB,CAAC,gBAAgB,EAAE,iCAAiC,CAAC,CAAC,QAAQ;QACrF,CAAC,CAAC,gBAAgB,CAAC;IACrB,MAAM,SAAS,GAAG,KAAK,CAAC,kBAAkB;QACzC,CAAC,CAAC,EAAE,QAAQ,EAAE,cAAc,EAAE,yBAAyB,EAAE,KAAK,EAAE;QAChE,CAAC,CAAC,uBAAuB,CAAC,cAAc,EAAE,KAAK,CAAC,mBAAmB,EAAE,KAAK,CAAC,mBAAmB,CAAC,CAAC;IACjG,MAAM,MAAM,GAAG,8BAA8B,CAAC,SAAS,CAAC,QAAQ,EAAE;QACjE,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK;QACtB,aAAa,EAAE,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,SAAS,EAAE;KACnD,CAAC,CAAC;IACH,MAAM,QAAQ,GAAG,yBAAyB,CAAC,MAAM,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;IACnE,OAAO,yBAAyB,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC;AAC1D,CAAC","sourcesContent":["import { convertToLlm } from \"../../../messages.ts\";\nimport type { ContextEvent, ExtensionContext } from \"../../types.ts\";\nimport {\n\tBUILTIN_CONTEXT_REDUCTION_OPTIONS,\n\treduceContextMessages,\n\tshouldApplyContextReduction,\n} from \"./context-reduction.ts\";\nimport { markOpenAiRemoteReplayBoundary } from \"./openai-remote.ts\";\nimport { isOpenAiRemoteCompactionModel } from \"./openai-remote-model.ts\";\nimport { admitContextToolResults, injectTokenBudgetReminder } from \"./orchestration.ts\";\nimport { repairOrphanedToolResults } from \"./repair-tool-pairs.ts\";\nimport { type EmergencyPruneLatch, hardLimitEmergencyPrune } from \"./speculative.ts\";\n\nexport function buildCompactionContext(input: {\n\tevent: ContextEvent;\n\tctx: ExtensionContext;\n\tcontextWindow: number;\n\t/**\n\t * Context window minus the model's output reserve. The emergency prune budgets against the\n\t * space a request can actually occupy, so it must not see the full window.\n\t */\n\tpromptContextWindow: number;\n\ttoolAdmissionEnabled: boolean;\n\tbreakerFallback: boolean;\n\tlaneOwnsCompaction: boolean;\n\temergencyPruneLatch: EmergencyPruneLatch;\n\treminder?: string;\n}) {\n\tif (input.laneOwnsCompaction) {\n\t\treturn repairOrphanedToolResults(convertToLlm(input.event.messages));\n\t}\n\tconst admittedMessages = admitContextToolResults(\n\t\tinput.event.messages,\n\t\tinput.contextWindow,\n\t\tinput.toolAdmissionEnabled,\n\t);\n\tconst sourceMessages =\n\t\t!input.laneOwnsCompaction &&\n\t\t(input.breakerFallback ||\n\t\t\tshouldApplyContextReduction({\n\t\t\t\tusageTokens: input.ctx.getContextUsage()?.tokens ?? null,\n\t\t\t\tcontextWindow: input.contextWindow,\n\t\t\t\tisProviderNativeCompactionPath: isOpenAiRemoteCompactionModel(input.ctx.model) || input.laneOwnsCompaction,\n\t\t\t}))\n\t\t\t? reduceContextMessages(admittedMessages, BUILTIN_CONTEXT_REDUCTION_OPTIONS).messages\n\t\t\t: admittedMessages;\n\tconst emergency = input.laneOwnsCompaction\n\t\t? { messages: sourceMessages, needsAggressiveCompaction: false }\n\t\t: hardLimitEmergencyPrune(sourceMessages, input.promptContextWindow, input.emergencyPruneLatch);\n\tconst marked = markOpenAiRemoteReplayBoundary(emergency.messages, {\n\t\tmodel: input.ctx.model,\n\t\tbranchEntries: input.ctx.sessionManager.getBranch(),\n\t});\n\tconst reminded = injectTokenBudgetReminder(marked, input.reminder);\n\treturn repairOrphanedToolResults(convertToLlm(reminded));\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deterministic-fallback.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/compaction/deterministic-fallback.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,qBAAqB,EAAE,KAAK,gBAAgB,EAAkB,MAAM,8BAA8B,CAAC;AAGjH,OAAO,EAIN,KAAK,YAAY,EACjB,MAAM,6BAA6B,CAAC;AAOrC,MAAM,MAAM,iCAAiC,GAC1C,uBAAuB,GACvB,2BAA2B,GAC3B,kCAAkC,CAAC;AAEtC,UAAU,gBAAgB;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,UAAU,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,MAAM,oCAAoC,GAC7C,8BAA8B,GAC9B,yBAAyB,GACzB,gCAAgC,GAChC,uBAAuB,GACvB,+BAA+B,CAAC;AAEnC,UAAU,4BAA4B;IACrC,MAAM,EAAE,4CAA4C,CAAC;IACrD,MAAM,EAAE,8BAA8B,CAAC;IACvC,WAAW,EAAE,iCAAiC,CAAC;IAC/C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,UAAU,GAAG,kBAAkB,GAAG,uBAAuB,CAAC;CAC3E;AAED,MAAM,WAAW,+BAA+B;IAC/C,eAAe,CAAC,EAAE,oCAAoC,CAAC;IACvD,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,cAAc,CAAC,EAAE,OAAO,CAAC;CACzB;AA8CD,wBAAgB,yCAAyC,CACxD,KAAK,EAAE,OAAO,GACZ,iCAAiC,GAAG,SAAS,CAW/C;AAED,wBAAgB,gCAAgC,CAC/C,WAAW,EAAE,qBAAqB,EAClC,aAAa,EAAE,MAAM,EACrB,WAAW,EAAE,iCAAiC,EAC9C,QAAQ,EAAE,gBAAgB,EAC1B,aAAa,GAAE,YAAY,EAAO,EAClC,WAAW,CAAC,EAAE,+BAA+B,GAC3C,gBAAgB,CAAC,4BAA4B,CAAC,GAAG,SAAS,
|
|
1
|
+
{"version":3,"file":"deterministic-fallback.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/compaction/deterministic-fallback.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,qBAAqB,EAAE,KAAK,gBAAgB,EAAkB,MAAM,8BAA8B,CAAC;AAGjH,OAAO,EAIN,KAAK,YAAY,EACjB,MAAM,6BAA6B,CAAC;AAOrC,MAAM,MAAM,iCAAiC,GAC1C,uBAAuB,GACvB,2BAA2B,GAC3B,kCAAkC,CAAC;AAEtC,UAAU,gBAAgB;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,UAAU,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,MAAM,oCAAoC,GAC7C,8BAA8B,GAC9B,yBAAyB,GACzB,gCAAgC,GAChC,uBAAuB,GACvB,+BAA+B,CAAC;AAEnC,UAAU,4BAA4B;IACrC,MAAM,EAAE,4CAA4C,CAAC;IACrD,MAAM,EAAE,8BAA8B,CAAC;IACvC,WAAW,EAAE,iCAAiC,CAAC;IAC/C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,UAAU,GAAG,kBAAkB,GAAG,uBAAuB,CAAC;CAC3E;AAED,MAAM,WAAW,+BAA+B;IAC/C,eAAe,CAAC,EAAE,oCAAoC,CAAC;IACvD,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,cAAc,CAAC,EAAE,OAAO,CAAC;CACzB;AA8CD,wBAAgB,yCAAyC,CACxD,KAAK,EAAE,OAAO,GACZ,iCAAiC,GAAG,SAAS,CAW/C;AAED,wBAAgB,gCAAgC,CAC/C,WAAW,EAAE,qBAAqB,EAClC,aAAa,EAAE,MAAM,EACrB,WAAW,EAAE,iCAAiC,EAC9C,QAAQ,EAAE,gBAAgB,EAC1B,aAAa,GAAE,YAAY,EAAO,EAClC,WAAW,CAAC,EAAE,+BAA+B,GAC3C,gBAAgB,CAAC,4BAA4B,CAAC,GAAG,SAAS,CAmN5D"}
|
|
@@ -232,8 +232,9 @@ export function createRequiredCompactionFallback(preparation, contextWindow, fai
|
|
|
232
232
|
diagnostics.rejectionReason = "atomic-tool-chain-cut";
|
|
233
233
|
return undefined;
|
|
234
234
|
}
|
|
235
|
-
|
|
236
|
-
|
|
235
|
+
// The hard-limit valve reserves the scaled budget, so accepting against the raw
|
|
236
|
+
// configured reserve would admit a context that valve immediately compacts again.
|
|
237
|
+
const budget = contextWindow - resolveEffectiveReserveTokens(contextWindow, preparation.settings);
|
|
237
238
|
const summaryTokens = summaryIndex === undefined
|
|
238
239
|
? Number.POSITIVE_INFINITY
|
|
239
240
|
: Math.max(estimateTokens(projectedMessages[summaryIndex]), Buffer.byteLength(JSON.stringify(projectedMessages[summaryIndex])));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deterministic-fallback.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/compaction/deterministic-fallback.ts"],"names":[],"mappings":"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","sourcesContent":["import { type CompactionPreparation, type CompactionResult, estimateTokens } from \"../../../compaction/index.ts\";\nimport { StreamDurationBudgetError, StreamIdleTimeoutError } from \"../../../compaction/stream-watchdog.ts\";\nimport { filterContextExcludedMessages } from \"../../../messages.ts\";\nimport {\n\tbuildSessionContext,\n\ttype CompactionEntry,\n\tgetSessionContextEntryId,\n\ttype SessionEntry,\n} from \"../../../session-manager.ts\";\nimport { SummarizationOverflowExhaustedError } from \"./overflow-retry.ts\";\nimport { resolveEffectiveReserveTokens } from \"./policy.ts\";\nimport { hasUnsafeRetainedContent } from \"./retained-message-safety.ts\";\nimport { SummaryRequestError } from \"./speculative.ts\";\nimport { capUtf8Bytes } from \"./task-intent.ts\";\n\nexport type RequiredCompactionFallbackFailure =\n\t| \"summarization-timeout\"\n\t| \"upstream-stream-truncated\"\n\t| \"summarization-overflow-exhausted\";\n\ninterface RecoveryMetadata {\n\ttaskIntent?: string;\n\ttodoSnapshot?: unknown;\n\tcheckpoint?: unknown;\n}\n\nexport type DeterministicFallbackRejectionReason =\n\t| \"missing-preparation-boundary\"\n\t| \"unsafe-retained-content\"\n\t| \"retained-token-budget-exceeded\"\n\t| \"atomic-tool-chain-cut\"\n\t| \"context-reconstruction-failed\";\n\ninterface DeterministicFallbackDetails {\n\tschema: \"senpi.compaction.deterministic-fallback.v1\";\n\torigin: \"required-compaction-recovery\";\n\tfailureKind: RequiredCompactionFallbackFailure;\n\ttaskIntent?: string;\n\tretainedSuffix?: \"prepared\" | \"latest-user-turn\" | \"earlier-safe-boundary\";\n}\n\nexport interface DeterministicFallbackDiagnostic {\n\trejectionReason?: DeterministicFallbackRejectionReason;\n\tcandidatesChecked?: number;\n\tbudgetExceeded?: boolean;\n}\n\nconst NON_VISIBLE_USER_TEXT = /[\\p{White_Space}\\p{Default_Ignorable_Code_Point}]/gu;\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null;\n}\n\nfunction hasMeaningfulUserText(entry: SessionEntry): boolean {\n\tif (entry.type !== \"message\" || !isRecord(entry.message) || entry.message.role !== \"user\") return false;\n\tconst content = entry.message.content;\n\tconst hasVisibleText = (text: unknown): boolean =>\n\t\ttypeof text === \"string\" && text.normalize(\"NFKC\").replace(NON_VISIBLE_USER_TEXT, \"\").length > 0;\n\tif (typeof content === \"string\") return hasVisibleText(content);\n\tif (!Array.isArray(content)) return false;\n\treturn content.some((block) => isRecord(block) && block.type === \"text\" && hasVisibleText(block.text));\n}\n\n/**\n * Bound a value graph that came from persisted, potentially hostile session data.\n * Returns false when the graph contains anything we must not read (accessors,\n * non-plain prototypes, cycles, functions, symbols) so callers fail closed\n * instead of executing persisted code or walking unbounded structures.\n */\nfunction isSafeBoundedValue(value: unknown, seen = new Set<object>(), depth = 0): boolean {\n\tif (depth > 32) return false;\n\tif (value === null || value === undefined) return true;\n\tconst kind = typeof value;\n\tif (kind === \"string\" || kind === \"number\" || kind === \"boolean\") return true;\n\tif (kind !== \"object\") return false;\n\tif (seen.has(value as object)) return false;\n\tseen.add(value as object);\n\tif (Array.isArray(value)) {\n\t\tfor (const item of value) if (!isSafeBoundedValue(item, seen, depth + 1)) return false;\n\t\treturn true;\n\t}\n\tconst proto = Object.getPrototypeOf(value);\n\tif (proto !== Object.prototype && proto !== null) return false;\n\tfor (const descriptor of Object.values(Object.getOwnPropertyDescriptors(value))) {\n\t\tif (descriptor.get !== undefined || descriptor.set !== undefined) return false;\n\t\tif (typeof descriptor.value === \"function\" || typeof descriptor.value === \"symbol\") return false;\n\t\tif (!isSafeBoundedValue(descriptor.value, seen, depth + 1)) return false;\n\t}\n\treturn true;\n}\n\nexport function classifyRequiredCompactionFallbackFailure(\n\terror: unknown,\n): RequiredCompactionFallbackFailure | undefined {\n\tif (error instanceof StreamDurationBudgetError || error instanceof StreamIdleTimeoutError) {\n\t\treturn \"summarization-timeout\";\n\t}\n\tif (error instanceof SummaryRequestError && error.transient && error.failureKind === \"upstream-stream-truncated\") {\n\t\treturn \"upstream-stream-truncated\";\n\t}\n\tif (error instanceof SummarizationOverflowExhaustedError) {\n\t\treturn \"summarization-overflow-exhausted\";\n\t}\n\treturn undefined;\n}\n\nexport function createRequiredCompactionFallback(\n\tpreparation: CompactionPreparation,\n\tcontextWindow: number,\n\tfailureKind: RequiredCompactionFallbackFailure,\n\tmetadata: RecoveryMetadata,\n\tbranchEntries: SessionEntry[] = [],\n\tdiagnostics?: DeterministicFallbackDiagnostic,\n): CompactionResult<DeterministicFallbackDetails> | undefined {\n\tconst preparedBoundaryIndex = branchEntries.findIndex((entry) => entry.id === preparation.firstKeptEntryId);\n\tif (!preparation.firstKeptEntryId || preparedBoundaryIndex === -1) {\n\t\tif (diagnostics) diagnostics.rejectionReason = \"missing-preparation-boundary\";\n\t\treturn undefined;\n\t}\n\n\tconst marker = [\n\t\t\"[Deterministic compaction recovery checkpoint]\",\n\t\t\"Generated summarization did not complete, so older context was reduced without another provider request.\",\n\t\t\"Continue from the retained messages after this checkpoint. Treat omitted transcript details as unknown.\",\n\t].join(\"\\n\");\n\tconst taskIntent = metadata.taskIntent?.trim();\n\tconst fixedText = taskIntent ? `${marker}\\n\\nTask intent:\\n${taskIntent}` : marker;\n\tconst maxSummaryBytes = Math.max(1_024, Math.floor(contextWindow * 0.4));\n\tconst previousSummary = preparation.previousSummary?.trim();\n\tlet summary = fixedText;\n\tif (previousSummary) {\n\t\tconst availableBytes = Math.max(0, maxSummaryBytes - Buffer.byteLength(`${fixedText}\\n\\nPrevious checkpoint:\\n`));\n\t\tconst truncationMarker = \"\\n[Older checkpoint truncated]\";\n\t\tconst boundedPrevious =\n\t\t\tBuffer.byteLength(previousSummary) <= availableBytes\n\t\t\t\t? previousSummary\n\t\t\t\t: `${capUtf8Bytes(previousSummary, Math.max(0, availableBytes - Buffer.byteLength(truncationMarker)))}${truncationMarker}`;\n\t\tsummary = `${fixedText}\\n\\nPrevious checkpoint:\\n${boundedPrevious}`;\n\t}\n\n\tconst baseDetails: DeterministicFallbackDetails = {\n\t\tschema: \"senpi.compaction.deterministic-fallback.v1\",\n\t\torigin: \"required-compaction-recovery\",\n\t\tfailureKind,\n\t\t...(taskIntent ? { taskIntent } : {}),\n\t};\n\tlet candidateCount = 0;\n\n\tconst syntheticCompaction: CompactionEntry = {\n\t\ttype: \"compaction\",\n\t\tid: \"__senpi_deterministic_fallback_preview__\",\n\t\tparentId: branchEntries.at(-1)?.id ?? null,\n\t\ttimestamp: new Date(0).toISOString(),\n\t\tsummary,\n\t\tfirstKeptEntryId: branchEntries[0]?.id ?? preparation.firstKeptEntryId,\n\t\ttokensBefore: preparation.tokensBefore,\n\t\tdetails: { ...baseDetails, retainedSuffix: \"prepared\" },\n\t\tfromHook: true,\n\t};\n\n\tlet projectedMessages: ReturnType<typeof filterContextExcludedMessages>;\n\ttry {\n\t\tprojectedMessages = filterContextExcludedMessages(\n\t\t\tbuildSessionContext([...branchEntries, syntheticCompaction]).messages,\n\t\t);\n\t} catch {\n\t\tif (diagnostics) diagnostics.rejectionReason = \"context-reconstruction-failed\";\n\t\treturn undefined;\n\t}\n\n\tconst messageIndexesByEntryId = new Map<string, number>();\n\tfor (const [index, message] of projectedMessages.entries()) {\n\t\tconst entryId = getSessionContextEntryId(message);\n\t\tif (entryId !== undefined) messageIndexesByEntryId.set(entryId, index);\n\t}\n\tconst summaryIndex = messageIndexesByEntryId.get(syntheticCompaction.id);\n\tconst unsafeSuffix = new Array(projectedMessages.length + 1).fill(false);\n\tconst tokenSuffix = new Array(projectedMessages.length + 1).fill(0);\n\tconst toolCalls = new Map<string, { indexes: number[]; incomplete: boolean }>();\n\tconst toolResults = new Map<string, number[]>();\n\tfor (let index = projectedMessages.length - 1; index >= 0; index--) {\n\t\tconst message = projectedMessages[index];\n\t\ttokenSuffix[index] = tokenSuffix[index + 1];\n\t\tlet messageUnsafe = false;\n\t\tlet serialized: string | undefined;\n\t\ttry {\n\t\t\tmessageUnsafe = hasUnsafeRetainedContent([message]);\n\t\t\tserialized = isSafeBoundedValue(message) ? JSON.stringify(message) : undefined;\n\t\t\ttokenSuffix[index] +=\n\t\t\t\tserialized === undefined\n\t\t\t\t\t? Number.POSITIVE_INFINITY\n\t\t\t\t\t: Math.max(estimateTokens(message), Buffer.byteLength(serialized));\n\t\t} catch {\n\t\t\tmessageUnsafe = true;\n\t\t\ttokenSuffix[index] = Number.POSITIVE_INFINITY;\n\t\t}\n\t\tunsafeSuffix[index] = unsafeSuffix[index + 1] || messageUnsafe;\n\t\tif (!isRecord(message)) continue;\n\t\tif (message.role === \"toolResult\" && typeof message.toolCallId === \"string\") {\n\t\t\tconst indexes = toolResults.get(message.toolCallId) ?? [];\n\t\t\tindexes.push(index);\n\t\t\ttoolResults.set(message.toolCallId, indexes);\n\t\t} else if (message.role === \"assistant\" && Array.isArray(message.content)) {\n\t\t\tfor (const block of message.content) {\n\t\t\t\tif (!isRecord(block) || block.type !== \"toolCall\" || typeof block.id !== \"string\") continue;\n\t\t\t\tconst call = toolCalls.get(block.id) ?? { indexes: [], incomplete: false };\n\t\t\t\tcall.indexes.push(index);\n\t\t\t\tcall.incomplete ||= block.incomplete === true;\n\t\t\t\ttoolCalls.set(block.id, call);\n\t\t\t}\n\t\t}\n\t}\n\tconst invalidToolChainDiff = new Int32Array(projectedMessages.length + 2);\n\tconst markInvalidRange = (start: number, endExclusive: number) => {\n\t\tconst boundedStart = Math.max(0, start);\n\t\tconst boundedEnd = Math.min(projectedMessages.length + 1, endExclusive);\n\t\tif (boundedStart >= boundedEnd) return;\n\t\tinvalidToolChainDiff[boundedStart]++;\n\t\tinvalidToolChainDiff[boundedEnd]--;\n\t};\n\tfor (const [id, call] of toolCalls) {\n\t\tconst results = toolResults.get(id) ?? [];\n\t\tif (call.indexes.length !== 1 || results.length !== 1) {\n\t\t\tmarkInvalidRange(0, Math.max(call.indexes[0] ?? -1, results[0] ?? -1) + 1);\n\t\t\tcontinue;\n\t\t}\n\t\tconst callIndex = call.indexes[0];\n\t\tconst resultIndex = results[0];\n\t\tif (call.incomplete) markInvalidRange(0, Math.max(callIndex, resultIndex) + 1);\n\t\telse if (callIndex < resultIndex) markInvalidRange(callIndex + 1, resultIndex + 1);\n\t\telse markInvalidRange(0, Math.max(callIndex, resultIndex) + 1);\n\t}\n\tfor (const [id, results] of toolResults) {\n\t\tif (toolCalls.has(id)) continue;\n\t\tmarkInvalidRange(0, results[0] + 1);\n\t}\n\tconst toolChainValidAt = new Array(projectedMessages.length + 1).fill(true);\n\tlet invalidToolChainCount = 0;\n\tfor (let index = 0; index < toolChainValidAt.length; index++) {\n\t\tinvalidToolChainCount += invalidToolChainDiff[index];\n\t\ttoolChainValidAt[index] = invalidToolChainCount === 0;\n\t}\n\n\tconst projectCandidate = (\n\t\tfirstKeptEntryId: string,\n\t\tretainedSuffix: NonNullable<DeterministicFallbackDetails[\"retainedSuffix\"]>,\n\t): CompactionResult<DeterministicFallbackDetails> | undefined => {\n\t\tcandidateCount++;\n\t\tconst details = { ...baseDetails, retainedSuffix };\n\t\tconst result: CompactionResult<DeterministicFallbackDetails> = {\n\t\t\tsummary,\n\t\t\tfirstKeptEntryId,\n\t\t\ttokensBefore: preparation.tokensBefore,\n\t\t\tdetails,\n\t\t};\n\t\tconst startIndex = messageIndexesByEntryId.get(firstKeptEntryId);\n\t\tif (startIndex === undefined) {\n\t\t\tif (diagnostics) diagnostics.rejectionReason = \"context-reconstruction-failed\";\n\t\t\treturn undefined;\n\t\t}\n\t\tconst retainedStart = Math.min(startIndex, projectedMessages.length);\n\t\tif (unsafeSuffix[retainedStart]) {\n\t\t\tif (diagnostics) diagnostics.rejectionReason = \"unsafe-retained-content\";\n\t\t\treturn undefined;\n\t\t}\n\t\tif (!toolChainValidAt[retainedStart]) {\n\t\t\tif (diagnostics) diagnostics.rejectionReason = \"atomic-tool-chain-cut\";\n\t\t\treturn undefined;\n\t\t}\n\t\tconst budget =\n\t\t\tcontextWindow -\n\t\t\tresolveEffectiveReserveTokens(\n\t\t\t\tcontextWindow,\n\t\t\t\tpreparation.settings.reserveTokens,\n\t\t\t\tpreparation.settings.reserveScalingEnabled !== false,\n\t\t\t);\n\t\tconst summaryTokens =\n\t\t\tsummaryIndex === undefined\n\t\t\t\t? Number.POSITIVE_INFINITY\n\t\t\t\t: Math.max(\n\t\t\t\t\t\testimateTokens(projectedMessages[summaryIndex]),\n\t\t\t\t\t\tBuffer.byteLength(JSON.stringify(projectedMessages[summaryIndex])),\n\t\t\t\t\t);\n\t\tconst retainedTokens = (tokenSuffix[retainedStart] ?? Number.POSITIVE_INFINITY) + summaryTokens;\n\t\tif (retainedTokens > budget) {\n\t\t\tif (diagnostics) {\n\t\t\t\tdiagnostics.rejectionReason = \"retained-token-budget-exceeded\";\n\t\t\t\tdiagnostics.budgetExceeded = true;\n\t\t\t}\n\t\t\treturn undefined;\n\t\t}\n\t\treturn { ...result, estimatedTokensAfter: retainedTokens };\n\t};\n\n\t// 1. Try prepared boundary\n\tconst prepared = projectCandidate(preparation.firstKeptEntryId, \"prepared\");\n\tif (prepared) {\n\t\tif (diagnostics) diagnostics.candidatesChecked = candidateCount;\n\t\treturn prepared;\n\t}\n\n\t// 2. If prepared boundary cut an atomic signed chain or was rejected, walk backward\n\t// to the actual chain boundary. The chain length is determined by the session.\n\tfor (let index = preparedBoundaryIndex - 1; index >= 0; index--) {\n\t\tconst entry = branchEntries[index];\n\t\tif (entry.type === \"compaction\") break;\n\t\t// Only consider message turn starts or assistant call starts\n\t\tconst earlier = projectCandidate(entry.id, \"earlier-safe-boundary\");\n\t\tif (earlier) {\n\t\t\tif (diagnostics) diagnostics.candidatesChecked = candidateCount;\n\t\t\treturn earlier;\n\t\t}\n\t}\n\n\t// 3. Try latest meaningful user turn\n\tfor (let index = branchEntries.length - 1; index > preparedBoundaryIndex; index--) {\n\t\tconst entry = branchEntries[index];\n\t\tif (!hasMeaningfulUserText(entry)) continue;\n\t\tconst latestUser = projectCandidate(entry.id, \"latest-user-turn\");\n\t\tif (latestUser) {\n\t\t\tif (diagnostics) diagnostics.candidatesChecked = candidateCount;\n\t\t\treturn latestUser;\n\t\t}\n\t\tbreak;\n\t}\n\n\tif (diagnostics) diagnostics.candidatesChecked = candidateCount;\n\treturn undefined;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"deterministic-fallback.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/compaction/deterministic-fallback.ts"],"names":[],"mappings":"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","sourcesContent":["import { type CompactionPreparation, type CompactionResult, estimateTokens } from \"../../../compaction/index.ts\";\nimport { StreamDurationBudgetError, StreamIdleTimeoutError } from \"../../../compaction/stream-watchdog.ts\";\nimport { filterContextExcludedMessages } from \"../../../messages.ts\";\nimport {\n\tbuildSessionContext,\n\ttype CompactionEntry,\n\tgetSessionContextEntryId,\n\ttype SessionEntry,\n} from \"../../../session-manager.ts\";\nimport { SummarizationOverflowExhaustedError } from \"./overflow-retry.ts\";\nimport { resolveEffectiveReserveTokens } from \"./policy.ts\";\nimport { hasUnsafeRetainedContent } from \"./retained-message-safety.ts\";\nimport { SummaryRequestError } from \"./speculative.ts\";\nimport { capUtf8Bytes } from \"./task-intent.ts\";\n\nexport type RequiredCompactionFallbackFailure =\n\t| \"summarization-timeout\"\n\t| \"upstream-stream-truncated\"\n\t| \"summarization-overflow-exhausted\";\n\ninterface RecoveryMetadata {\n\ttaskIntent?: string;\n\ttodoSnapshot?: unknown;\n\tcheckpoint?: unknown;\n}\n\nexport type DeterministicFallbackRejectionReason =\n\t| \"missing-preparation-boundary\"\n\t| \"unsafe-retained-content\"\n\t| \"retained-token-budget-exceeded\"\n\t| \"atomic-tool-chain-cut\"\n\t| \"context-reconstruction-failed\";\n\ninterface DeterministicFallbackDetails {\n\tschema: \"senpi.compaction.deterministic-fallback.v1\";\n\torigin: \"required-compaction-recovery\";\n\tfailureKind: RequiredCompactionFallbackFailure;\n\ttaskIntent?: string;\n\tretainedSuffix?: \"prepared\" | \"latest-user-turn\" | \"earlier-safe-boundary\";\n}\n\nexport interface DeterministicFallbackDiagnostic {\n\trejectionReason?: DeterministicFallbackRejectionReason;\n\tcandidatesChecked?: number;\n\tbudgetExceeded?: boolean;\n}\n\nconst NON_VISIBLE_USER_TEXT = /[\\p{White_Space}\\p{Default_Ignorable_Code_Point}]/gu;\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null;\n}\n\nfunction hasMeaningfulUserText(entry: SessionEntry): boolean {\n\tif (entry.type !== \"message\" || !isRecord(entry.message) || entry.message.role !== \"user\") return false;\n\tconst content = entry.message.content;\n\tconst hasVisibleText = (text: unknown): boolean =>\n\t\ttypeof text === \"string\" && text.normalize(\"NFKC\").replace(NON_VISIBLE_USER_TEXT, \"\").length > 0;\n\tif (typeof content === \"string\") return hasVisibleText(content);\n\tif (!Array.isArray(content)) return false;\n\treturn content.some((block) => isRecord(block) && block.type === \"text\" && hasVisibleText(block.text));\n}\n\n/**\n * Bound a value graph that came from persisted, potentially hostile session data.\n * Returns false when the graph contains anything we must not read (accessors,\n * non-plain prototypes, cycles, functions, symbols) so callers fail closed\n * instead of executing persisted code or walking unbounded structures.\n */\nfunction isSafeBoundedValue(value: unknown, seen = new Set<object>(), depth = 0): boolean {\n\tif (depth > 32) return false;\n\tif (value === null || value === undefined) return true;\n\tconst kind = typeof value;\n\tif (kind === \"string\" || kind === \"number\" || kind === \"boolean\") return true;\n\tif (kind !== \"object\") return false;\n\tif (seen.has(value as object)) return false;\n\tseen.add(value as object);\n\tif (Array.isArray(value)) {\n\t\tfor (const item of value) if (!isSafeBoundedValue(item, seen, depth + 1)) return false;\n\t\treturn true;\n\t}\n\tconst proto = Object.getPrototypeOf(value);\n\tif (proto !== Object.prototype && proto !== null) return false;\n\tfor (const descriptor of Object.values(Object.getOwnPropertyDescriptors(value))) {\n\t\tif (descriptor.get !== undefined || descriptor.set !== undefined) return false;\n\t\tif (typeof descriptor.value === \"function\" || typeof descriptor.value === \"symbol\") return false;\n\t\tif (!isSafeBoundedValue(descriptor.value, seen, depth + 1)) return false;\n\t}\n\treturn true;\n}\n\nexport function classifyRequiredCompactionFallbackFailure(\n\terror: unknown,\n): RequiredCompactionFallbackFailure | undefined {\n\tif (error instanceof StreamDurationBudgetError || error instanceof StreamIdleTimeoutError) {\n\t\treturn \"summarization-timeout\";\n\t}\n\tif (error instanceof SummaryRequestError && error.transient && error.failureKind === \"upstream-stream-truncated\") {\n\t\treturn \"upstream-stream-truncated\";\n\t}\n\tif (error instanceof SummarizationOverflowExhaustedError) {\n\t\treturn \"summarization-overflow-exhausted\";\n\t}\n\treturn undefined;\n}\n\nexport function createRequiredCompactionFallback(\n\tpreparation: CompactionPreparation,\n\tcontextWindow: number,\n\tfailureKind: RequiredCompactionFallbackFailure,\n\tmetadata: RecoveryMetadata,\n\tbranchEntries: SessionEntry[] = [],\n\tdiagnostics?: DeterministicFallbackDiagnostic,\n): CompactionResult<DeterministicFallbackDetails> | undefined {\n\tconst preparedBoundaryIndex = branchEntries.findIndex((entry) => entry.id === preparation.firstKeptEntryId);\n\tif (!preparation.firstKeptEntryId || preparedBoundaryIndex === -1) {\n\t\tif (diagnostics) diagnostics.rejectionReason = \"missing-preparation-boundary\";\n\t\treturn undefined;\n\t}\n\n\tconst marker = [\n\t\t\"[Deterministic compaction recovery checkpoint]\",\n\t\t\"Generated summarization did not complete, so older context was reduced without another provider request.\",\n\t\t\"Continue from the retained messages after this checkpoint. Treat omitted transcript details as unknown.\",\n\t].join(\"\\n\");\n\tconst taskIntent = metadata.taskIntent?.trim();\n\tconst fixedText = taskIntent ? `${marker}\\n\\nTask intent:\\n${taskIntent}` : marker;\n\tconst maxSummaryBytes = Math.max(1_024, Math.floor(contextWindow * 0.4));\n\tconst previousSummary = preparation.previousSummary?.trim();\n\tlet summary = fixedText;\n\tif (previousSummary) {\n\t\tconst availableBytes = Math.max(0, maxSummaryBytes - Buffer.byteLength(`${fixedText}\\n\\nPrevious checkpoint:\\n`));\n\t\tconst truncationMarker = \"\\n[Older checkpoint truncated]\";\n\t\tconst boundedPrevious =\n\t\t\tBuffer.byteLength(previousSummary) <= availableBytes\n\t\t\t\t? previousSummary\n\t\t\t\t: `${capUtf8Bytes(previousSummary, Math.max(0, availableBytes - Buffer.byteLength(truncationMarker)))}${truncationMarker}`;\n\t\tsummary = `${fixedText}\\n\\nPrevious checkpoint:\\n${boundedPrevious}`;\n\t}\n\n\tconst baseDetails: DeterministicFallbackDetails = {\n\t\tschema: \"senpi.compaction.deterministic-fallback.v1\",\n\t\torigin: \"required-compaction-recovery\",\n\t\tfailureKind,\n\t\t...(taskIntent ? { taskIntent } : {}),\n\t};\n\tlet candidateCount = 0;\n\n\tconst syntheticCompaction: CompactionEntry = {\n\t\ttype: \"compaction\",\n\t\tid: \"__senpi_deterministic_fallback_preview__\",\n\t\tparentId: branchEntries.at(-1)?.id ?? null,\n\t\ttimestamp: new Date(0).toISOString(),\n\t\tsummary,\n\t\tfirstKeptEntryId: branchEntries[0]?.id ?? preparation.firstKeptEntryId,\n\t\ttokensBefore: preparation.tokensBefore,\n\t\tdetails: { ...baseDetails, retainedSuffix: \"prepared\" },\n\t\tfromHook: true,\n\t};\n\n\tlet projectedMessages: ReturnType<typeof filterContextExcludedMessages>;\n\ttry {\n\t\tprojectedMessages = filterContextExcludedMessages(\n\t\t\tbuildSessionContext([...branchEntries, syntheticCompaction]).messages,\n\t\t);\n\t} catch {\n\t\tif (diagnostics) diagnostics.rejectionReason = \"context-reconstruction-failed\";\n\t\treturn undefined;\n\t}\n\n\tconst messageIndexesByEntryId = new Map<string, number>();\n\tfor (const [index, message] of projectedMessages.entries()) {\n\t\tconst entryId = getSessionContextEntryId(message);\n\t\tif (entryId !== undefined) messageIndexesByEntryId.set(entryId, index);\n\t}\n\tconst summaryIndex = messageIndexesByEntryId.get(syntheticCompaction.id);\n\tconst unsafeSuffix = new Array(projectedMessages.length + 1).fill(false);\n\tconst tokenSuffix = new Array(projectedMessages.length + 1).fill(0);\n\tconst toolCalls = new Map<string, { indexes: number[]; incomplete: boolean }>();\n\tconst toolResults = new Map<string, number[]>();\n\tfor (let index = projectedMessages.length - 1; index >= 0; index--) {\n\t\tconst message = projectedMessages[index];\n\t\ttokenSuffix[index] = tokenSuffix[index + 1];\n\t\tlet messageUnsafe = false;\n\t\tlet serialized: string | undefined;\n\t\ttry {\n\t\t\tmessageUnsafe = hasUnsafeRetainedContent([message]);\n\t\t\tserialized = isSafeBoundedValue(message) ? JSON.stringify(message) : undefined;\n\t\t\ttokenSuffix[index] +=\n\t\t\t\tserialized === undefined\n\t\t\t\t\t? Number.POSITIVE_INFINITY\n\t\t\t\t\t: Math.max(estimateTokens(message), Buffer.byteLength(serialized));\n\t\t} catch {\n\t\t\tmessageUnsafe = true;\n\t\t\ttokenSuffix[index] = Number.POSITIVE_INFINITY;\n\t\t}\n\t\tunsafeSuffix[index] = unsafeSuffix[index + 1] || messageUnsafe;\n\t\tif (!isRecord(message)) continue;\n\t\tif (message.role === \"toolResult\" && typeof message.toolCallId === \"string\") {\n\t\t\tconst indexes = toolResults.get(message.toolCallId) ?? [];\n\t\t\tindexes.push(index);\n\t\t\ttoolResults.set(message.toolCallId, indexes);\n\t\t} else if (message.role === \"assistant\" && Array.isArray(message.content)) {\n\t\t\tfor (const block of message.content) {\n\t\t\t\tif (!isRecord(block) || block.type !== \"toolCall\" || typeof block.id !== \"string\") continue;\n\t\t\t\tconst call = toolCalls.get(block.id) ?? { indexes: [], incomplete: false };\n\t\t\t\tcall.indexes.push(index);\n\t\t\t\tcall.incomplete ||= block.incomplete === true;\n\t\t\t\ttoolCalls.set(block.id, call);\n\t\t\t}\n\t\t}\n\t}\n\tconst invalidToolChainDiff = new Int32Array(projectedMessages.length + 2);\n\tconst markInvalidRange = (start: number, endExclusive: number) => {\n\t\tconst boundedStart = Math.max(0, start);\n\t\tconst boundedEnd = Math.min(projectedMessages.length + 1, endExclusive);\n\t\tif (boundedStart >= boundedEnd) return;\n\t\tinvalidToolChainDiff[boundedStart]++;\n\t\tinvalidToolChainDiff[boundedEnd]--;\n\t};\n\tfor (const [id, call] of toolCalls) {\n\t\tconst results = toolResults.get(id) ?? [];\n\t\tif (call.indexes.length !== 1 || results.length !== 1) {\n\t\t\tmarkInvalidRange(0, Math.max(call.indexes[0] ?? -1, results[0] ?? -1) + 1);\n\t\t\tcontinue;\n\t\t}\n\t\tconst callIndex = call.indexes[0];\n\t\tconst resultIndex = results[0];\n\t\tif (call.incomplete) markInvalidRange(0, Math.max(callIndex, resultIndex) + 1);\n\t\telse if (callIndex < resultIndex) markInvalidRange(callIndex + 1, resultIndex + 1);\n\t\telse markInvalidRange(0, Math.max(callIndex, resultIndex) + 1);\n\t}\n\tfor (const [id, results] of toolResults) {\n\t\tif (toolCalls.has(id)) continue;\n\t\tmarkInvalidRange(0, results[0] + 1);\n\t}\n\tconst toolChainValidAt = new Array(projectedMessages.length + 1).fill(true);\n\tlet invalidToolChainCount = 0;\n\tfor (let index = 0; index < toolChainValidAt.length; index++) {\n\t\tinvalidToolChainCount += invalidToolChainDiff[index];\n\t\ttoolChainValidAt[index] = invalidToolChainCount === 0;\n\t}\n\n\tconst projectCandidate = (\n\t\tfirstKeptEntryId: string,\n\t\tretainedSuffix: NonNullable<DeterministicFallbackDetails[\"retainedSuffix\"]>,\n\t): CompactionResult<DeterministicFallbackDetails> | undefined => {\n\t\tcandidateCount++;\n\t\tconst details = { ...baseDetails, retainedSuffix };\n\t\tconst result: CompactionResult<DeterministicFallbackDetails> = {\n\t\t\tsummary,\n\t\t\tfirstKeptEntryId,\n\t\t\ttokensBefore: preparation.tokensBefore,\n\t\t\tdetails,\n\t\t};\n\t\tconst startIndex = messageIndexesByEntryId.get(firstKeptEntryId);\n\t\tif (startIndex === undefined) {\n\t\t\tif (diagnostics) diagnostics.rejectionReason = \"context-reconstruction-failed\";\n\t\t\treturn undefined;\n\t\t}\n\t\tconst retainedStart = Math.min(startIndex, projectedMessages.length);\n\t\tif (unsafeSuffix[retainedStart]) {\n\t\t\tif (diagnostics) diagnostics.rejectionReason = \"unsafe-retained-content\";\n\t\t\treturn undefined;\n\t\t}\n\t\tif (!toolChainValidAt[retainedStart]) {\n\t\t\tif (diagnostics) diagnostics.rejectionReason = \"atomic-tool-chain-cut\";\n\t\t\treturn undefined;\n\t\t}\n\t\t// The hard-limit valve reserves the scaled budget, so accepting against the raw\n\t\t// configured reserve would admit a context that valve immediately compacts again.\n\t\tconst budget = contextWindow - resolveEffectiveReserveTokens(contextWindow, preparation.settings);\n\t\tconst summaryTokens =\n\t\t\tsummaryIndex === undefined\n\t\t\t\t? Number.POSITIVE_INFINITY\n\t\t\t\t: Math.max(\n\t\t\t\t\t\testimateTokens(projectedMessages[summaryIndex]),\n\t\t\t\t\t\tBuffer.byteLength(JSON.stringify(projectedMessages[summaryIndex])),\n\t\t\t\t\t);\n\t\tconst retainedTokens = (tokenSuffix[retainedStart] ?? Number.POSITIVE_INFINITY) + summaryTokens;\n\t\tif (retainedTokens > budget) {\n\t\t\tif (diagnostics) {\n\t\t\t\tdiagnostics.rejectionReason = \"retained-token-budget-exceeded\";\n\t\t\t\tdiagnostics.budgetExceeded = true;\n\t\t\t}\n\t\t\treturn undefined;\n\t\t}\n\t\treturn { ...result, estimatedTokensAfter: retainedTokens };\n\t};\n\n\t// 1. Try prepared boundary\n\tconst prepared = projectCandidate(preparation.firstKeptEntryId, \"prepared\");\n\tif (prepared) {\n\t\tif (diagnostics) diagnostics.candidatesChecked = candidateCount;\n\t\treturn prepared;\n\t}\n\n\t// 2. If prepared boundary cut an atomic signed chain or was rejected, walk backward\n\t// to the actual chain boundary. The chain length is determined by the session.\n\tfor (let index = preparedBoundaryIndex - 1; index >= 0; index--) {\n\t\tconst entry = branchEntries[index];\n\t\tif (entry.type === \"compaction\") break;\n\t\t// Only consider message turn starts or assistant call starts\n\t\tconst earlier = projectCandidate(entry.id, \"earlier-safe-boundary\");\n\t\tif (earlier) {\n\t\t\tif (diagnostics) diagnostics.candidatesChecked = candidateCount;\n\t\t\treturn earlier;\n\t\t}\n\t}\n\n\t// 3. Try latest meaningful user turn\n\tfor (let index = branchEntries.length - 1; index > preparedBoundaryIndex; index--) {\n\t\tconst entry = branchEntries[index];\n\t\tif (!hasMeaningfulUserText(entry)) continue;\n\t\tconst latestUser = projectCandidate(entry.id, \"latest-user-turn\");\n\t\tif (latestUser) {\n\t\t\tif (diagnostics) diagnostics.candidatesChecked = candidateCount;\n\t\t\treturn latestUser;\n\t\t}\n\t\tbreak;\n\t}\n\n\tif (diagnostics) diagnostics.candidatesChecked = candidateCount;\n\treturn undefined;\n}\n"]}
|
|
@@ -15,7 +15,7 @@ export interface IdleWarmupRetryDecision {
|
|
|
15
15
|
readonly transient: boolean;
|
|
16
16
|
readonly isIdle: boolean;
|
|
17
17
|
readonly breakerTripped: boolean;
|
|
18
|
-
readonly
|
|
18
|
+
readonly stillWarmEligible: boolean;
|
|
19
19
|
}
|
|
20
20
|
export declare function shouldRetryIdleWarmup(decision: IdleWarmupRetryDecision): boolean;
|
|
21
21
|
//# sourceMappingURL=idle-retry.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"idle-retry.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/compaction/idle-retry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,eAAO,MAAM,uBAAuB,IAAI,CAAC;AACzC,eAAO,MAAM,0BAA0B,QAAS,CAAC;AAEjD,MAAM,WAAW,uBAAuB;IACvC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAC;IACjC,QAAQ,CAAC,
|
|
1
|
+
{"version":3,"file":"idle-retry.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/compaction/idle-retry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,eAAO,MAAM,uBAAuB,IAAI,CAAC;AACzC,eAAO,MAAM,0BAA0B,QAAS,CAAC;AAEjD,MAAM,WAAW,uBAAuB;IACvC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAC;IACjC,QAAQ,CAAC,iBAAiB,EAAE,OAAO,CAAC;CACpC;AAED,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,uBAAuB,GAAG,OAAO,CAMhF"}
|
|
@@ -17,7 +17,7 @@ export function shouldRetryIdleWarmup(decision) {
|
|
|
17
17
|
return false;
|
|
18
18
|
if (decision.breakerTripped)
|
|
19
19
|
return false;
|
|
20
|
-
if (!decision.
|
|
20
|
+
if (!decision.stillWarmEligible)
|
|
21
21
|
return false;
|
|
22
22
|
return decision.attempt < MAX_IDLE_WARMUP_RETRIES;
|
|
23
23
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"idle-retry.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/compaction/idle-retry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,CAAC;AACzC,MAAM,CAAC,MAAM,0BAA0B,GAAG,MAAM,CAAC;AAUjD,MAAM,UAAU,qBAAqB,CAAC,QAAiC;IACtE,IAAI,CAAC,QAAQ,CAAC,SAAS;QAAE,OAAO,KAAK,CAAC;IACtC,IAAI,CAAC,QAAQ,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IACnC,IAAI,QAAQ,CAAC,cAAc;QAAE,OAAO,KAAK,CAAC;IAC1C,IAAI,CAAC,QAAQ,CAAC,
|
|
1
|
+
{"version":3,"file":"idle-retry.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/compaction/idle-retry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,CAAC;AACzC,MAAM,CAAC,MAAM,0BAA0B,GAAG,MAAM,CAAC;AAUjD,MAAM,UAAU,qBAAqB,CAAC,QAAiC;IACtE,IAAI,CAAC,QAAQ,CAAC,SAAS;QAAE,OAAO,KAAK,CAAC;IACtC,IAAI,CAAC,QAAQ,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IACnC,IAAI,QAAQ,CAAC,cAAc;QAAE,OAAO,KAAK,CAAC;IAC1C,IAAI,CAAC,QAAQ,CAAC,iBAAiB;QAAE,OAAO,KAAK,CAAC;IAC9C,OAAO,QAAQ,CAAC,OAAO,GAAG,uBAAuB,CAAC;AACnD,CAAC","sourcesContent":["/**\n * Retry policy for the idle compaction warm-up.\n *\n * The `agent_end` idle trigger only warms a speculative summary (#561 forbids\n * committing a durable boundary at idle). A transient summarization failure\n * used to leave a dead warm job for the whole idle period, forcing a fresh\n * blocking summarization onto the user's critical path at the next prompt.\n * While the session stays idle, a transient failure is retried a bounded\n * number of times with a fresh snapshot instead.\n */\n\nexport const MAX_IDLE_WARMUP_RETRIES = 2;\nexport const IDLE_WARMUP_RETRY_DELAY_MS = 15_000;\n\nexport interface IdleWarmupRetryDecision {\n\treadonly attempt: number;\n\treadonly transient: boolean;\n\treadonly isIdle: boolean;\n\treadonly breakerTripped: boolean;\n\treadonly stillWarmEligible: boolean;\n}\n\nexport function shouldRetryIdleWarmup(decision: IdleWarmupRetryDecision): boolean {\n\tif (!decision.transient) return false;\n\tif (!decision.isIdle) return false;\n\tif (decision.breakerTripped) return false;\n\tif (!decision.stillWarmEligible) return false;\n\treturn decision.attempt < MAX_IDLE_WARMUP_RETRIES;\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/compaction/index.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAoE,MAAM,gBAAgB,CAAC;AAyBrH,OAAO,EACN,KAAK,kCAAkC,EAIvC,MAAM,oBAAoB,CAAC;AAqC5B,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/compaction/index.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAoE,MAAM,gBAAgB,CAAC;AAyBrH,OAAO,EACN,KAAK,kCAAkC,EAIvC,MAAM,oBAAoB,CAAC;AAqC5B,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AA2B/D,MAAM,CAAC,OAAO,UAAU,mBAAmB,CAC1C,EAAE,EAAE,YAAY,EAChB,4BAA4B,GAAE,kCAAuC,GACnE,IAAI,CAo6BN"}
|
|
@@ -23,7 +23,7 @@ import * as todoBridge from "./todo-bridge.js";
|
|
|
23
23
|
import { computeTokenBudgetReminder, createInitialReminderState, } from "./token-budget-reminder.js";
|
|
24
24
|
import { isTransientSummarizationFailure } from "./transient-failure.js";
|
|
25
25
|
export { getPromptContextWindow } from "./extension-wiring.js";
|
|
26
|
-
import { createBlockingRemoteCompactionEvent, endCompactionFeedback, estimatePendingPromptTokens, isAbortedAssistantMessage, isMonitorableMessageEvent, isRequiredCompactionFallbackReason, linkAbortSignal, recentCheckpoint, withAdditionalTokens, } from "./extension-wiring.js";
|
|
26
|
+
import { createBlockingRemoteCompactionEvent, endCompactionFeedback, estimatePendingPromptTokens, getPromptContextWindow, isAbortedAssistantMessage, isMonitorableMessageEvent, isRequiredCompactionFallbackReason, linkAbortSignal, recentCheckpoint, withAdditionalTokens, } from "./extension-wiring.js";
|
|
27
27
|
import { isIneffectiveCompaction } from "./yield.js";
|
|
28
28
|
const DEFAULT_CONTEXT_WINDOW = 200_000;
|
|
29
29
|
const EMERGENCY_COMPACTION_INSTRUCTIONS = "EMERGENCY: hard context limit reached. Produce an aggressive recovery summary that preserves current goal, constraints, files touched, tool outcomes, and exact next steps. Prefer concise factual state over transcript detail.";
|
|
@@ -111,13 +111,23 @@ export default function compactionExtension(pi, remoteCompactionDependencies = {
|
|
|
111
111
|
}
|
|
112
112
|
const usage = ctx.getContextUsage();
|
|
113
113
|
const contextWindow = usage?.contextWindow ?? ctx.model?.contextWindow ?? DEFAULT_CONTEXT_WINDOW;
|
|
114
|
+
const settings = ctx.getCompactionSettings();
|
|
115
|
+
const breakerTripped = breaker.isTripped(state, Date.now());
|
|
114
116
|
const retryDecision = {
|
|
115
117
|
attempt: idleWarmupAttempt,
|
|
116
118
|
transient: isTransientSummarizationFailure(failure, failure.message),
|
|
117
119
|
isIdle: ctx.isIdle(),
|
|
118
|
-
breakerTripped
|
|
119
|
-
|
|
120
|
-
|
|
120
|
+
breakerTripped,
|
|
121
|
+
stillWarmEligible: idle.shouldWarmAtIdle({
|
|
122
|
+
willRetry: false,
|
|
123
|
+
aborted: false,
|
|
124
|
+
settings,
|
|
125
|
+
usage,
|
|
126
|
+
contextWindow,
|
|
127
|
+
breakerTripped,
|
|
128
|
+
lastYield: state.lastYield ?? undefined,
|
|
129
|
+
mode: ctx.mode,
|
|
130
|
+
}),
|
|
121
131
|
};
|
|
122
132
|
if (!idleRetry.shouldRetryIdleWarmup(retryDecision))
|
|
123
133
|
return;
|
|
@@ -618,9 +628,7 @@ export default function compactionExtension(pi, remoteCompactionDependencies = {
|
|
|
618
628
|
compactionEntryId: compactEvent.compactionEntry.id,
|
|
619
629
|
contextWindow: usage?.contextWindow ?? ctx.model?.contextWindow ?? DEFAULT_CONTEXT_WINDOW,
|
|
620
630
|
usageTokens: usage?.tokens ?? null,
|
|
621
|
-
reserveTokens:
|
|
622
|
-
? settings.reserveTokens
|
|
623
|
-
: policy.resolveReserveTokens(usage?.contextWindow ?? ctx.model?.contextWindow ?? DEFAULT_CONTEXT_WINDOW, settings.reserveTokens),
|
|
631
|
+
reserveTokens: policy.resolveEffectiveReserveTokens(usage?.contextWindow ?? ctx.model?.contextWindow ?? DEFAULT_CONTEXT_WINDOW, settings),
|
|
624
632
|
settings,
|
|
625
633
|
keptMessages: keptEntries.flatMap((entry) => {
|
|
626
634
|
if (entry.type !== "message")
|
|
@@ -631,6 +639,8 @@ export default function compactionExtension(pi, remoteCompactionDependencies = {
|
|
|
631
639
|
}
|
|
632
640
|
return;
|
|
633
641
|
}
|
|
642
|
+
if (compactEvent.rejectionCause === "external-owner")
|
|
643
|
+
return;
|
|
634
644
|
if (!lanePolicy.disablesSenpiCompaction(ctx)) {
|
|
635
645
|
state = breaker.recordFailure(state, Date.now(), { route: compactEvent.reason });
|
|
636
646
|
}
|
|
@@ -690,6 +700,7 @@ export default function compactionExtension(pi, remoteCompactionDependencies = {
|
|
|
690
700
|
}
|
|
691
701
|
}
|
|
692
702
|
else if (!breakerCoolingDown &&
|
|
703
|
+
!isOpenAiRemoteCompactionModel(ctx.model) &&
|
|
693
704
|
usageWithPendingPrompt &&
|
|
694
705
|
policy.shouldStartSpeculativeCompaction(usageWithPendingPrompt, contextWindow, settings, state.lastYield ?? undefined, leadTokens)) {
|
|
695
706
|
getLogger(ctx).debug("emergency_prune", {
|
|
@@ -703,7 +714,7 @@ export default function compactionExtension(pi, remoteCompactionDependencies = {
|
|
|
703
714
|
contextWindow,
|
|
704
715
|
thresholdTokens,
|
|
705
716
|
leadTokens,
|
|
706
|
-
|
|
717
|
+
compactionEpoch: speculativeGeneration,
|
|
707
718
|
state: reminderState,
|
|
708
719
|
});
|
|
709
720
|
reminderState = reminder.nextState;
|
|
@@ -741,7 +752,7 @@ export default function compactionExtension(pi, remoteCompactionDependencies = {
|
|
|
741
752
|
event,
|
|
742
753
|
ctx,
|
|
743
754
|
contextWindow,
|
|
744
|
-
promptContextWindow: contextWindow,
|
|
755
|
+
promptContextWindow: getPromptContextWindow(contextWindow, ctx.model?.maxTokens),
|
|
745
756
|
toolAdmissionEnabled: settings.toolAdmissionEnabled !== false,
|
|
746
757
|
breakerFallback,
|
|
747
758
|
laneOwnsCompaction,
|
|
@@ -809,6 +820,14 @@ export default function compactionExtension(pi, remoteCompactionDependencies = {
|
|
|
809
820
|
armIdleApply(ctx);
|
|
810
821
|
}
|
|
811
822
|
else {
|
|
823
|
+
// A sub-threshold OpenAI warm-up cannot be consumed by the remote
|
|
824
|
+
// compaction route. Once threshold admission succeeds remotely, it would
|
|
825
|
+
// only abort and discard this paid local summary. Above threshold we keep
|
|
826
|
+
// the existing local idle apply, which can finish before the next prompt;
|
|
827
|
+
// if remote compaction later falls back, blocking local generation remains
|
|
828
|
+
// unchanged.
|
|
829
|
+
if (isOpenAiRemoteCompactionModel(ctx.model))
|
|
830
|
+
return;
|
|
812
831
|
const warmAction = resolveIdleWarmAction({
|
|
813
832
|
willRetry: event.willRetry ?? false,
|
|
814
833
|
aborted: event.aborted === true,
|
|
@@ -821,8 +840,13 @@ export default function compactionExtension(pi, remoteCompactionDependencies = {
|
|
|
821
840
|
}, speculativeJob);
|
|
822
841
|
if (warmAction === "replace")
|
|
823
842
|
invalidateSpeculativeCompaction(ctx);
|
|
824
|
-
if (warmAction !== "none")
|
|
843
|
+
if (warmAction !== "none") {
|
|
844
|
+
idleWarmupAttempt = 0;
|
|
845
|
+
sessionIdleSinceAgentEnd = true;
|
|
825
846
|
startSpeculativeCompaction(ctx, idle.IDLE_COMPACTION_INSTRUCTIONS);
|
|
847
|
+
armIdleWarmupRetry(ctx);
|
|
848
|
+
armIdleApply(ctx);
|
|
849
|
+
}
|
|
826
850
|
}
|
|
827
851
|
});
|
|
828
852
|
pi.on("message_end", async (event, ctx) => {
|