@alvin0/ai-agent-sdk-core 0.1.2 → 0.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (63) hide show
  1. package/dist/agent/accounting/ledger.js +1 -1
  2. package/dist/agent/accounting/ledger.js.map +1 -1
  3. package/dist/agent/accounting/report.d.ts +1 -1
  4. package/dist/agent/define/definition.d.ts +26 -5
  5. package/dist/agent/define/definition.d.ts.map +1 -1
  6. package/dist/agent/define/definition.js +1 -1
  7. package/dist/agent/define/definition.js.map +1 -1
  8. package/dist/agent/define/session/accounting.js +1 -1
  9. package/dist/agent/define/session/accounting.js.map +1 -1
  10. package/dist/agent/define/session/model-config.js +1 -1
  11. package/dist/agent/define/session/model-config.js.map +1 -1
  12. package/dist/agent/define/session/types.d.ts +0 -3
  13. package/dist/agent/define/session/types.d.ts.map +1 -1
  14. package/dist/agent/loop/turn/config.js +1 -1
  15. package/dist/agent/loop/turn/config.js.map +1 -1
  16. package/dist/agent/memory/compaction.d.ts.map +1 -1
  17. package/dist/agent/memory/compaction.js +1 -1
  18. package/dist/agent/memory/compaction.js.map +1 -1
  19. package/dist/composition/agent/definition.js +1 -1
  20. package/dist/composition/agent/definition.js.map +1 -1
  21. package/dist/composition/agent/options.js +1 -1
  22. package/dist/composition/agent/options.js.map +1 -1
  23. package/dist/composition/agent/session.js +1 -1
  24. package/dist/composition/agent/session.js.map +1 -1
  25. package/dist/composition/agent/types.d.ts +11 -10
  26. package/dist/composition/agent/types.d.ts.map +1 -1
  27. package/dist/composition/runtime/owner.js +1 -1
  28. package/dist/composition/runtime/owner.js.map +1 -1
  29. package/dist/composition/runtime/types.d.ts +7 -1
  30. package/dist/composition/runtime/types.d.ts.map +1 -1
  31. package/dist/contract/adapter.d.ts +1 -1
  32. package/dist/contract/call-config.d.ts +8 -1
  33. package/dist/contract/call-config.d.ts.map +1 -1
  34. package/dist/contract/call-config.js +1 -1
  35. package/dist/contract/call-config.js.map +1 -1
  36. package/dist/contract/generate-options.d.ts +5 -0
  37. package/dist/contract/generate-options.d.ts.map +1 -1
  38. package/dist/contract/model-info.d.ts +26 -7
  39. package/dist/contract/model-info.d.ts.map +1 -1
  40. package/dist/errors/model-error.d.ts +0 -1
  41. package/dist/errors/model-error.d.ts.map +1 -1
  42. package/dist/errors/model-error.js +1 -1
  43. package/dist/errors/model-error.js.map +1 -1
  44. package/dist/index.d.ts +3 -3
  45. package/dist/observability/bus.js +1 -1
  46. package/dist/observation/report.d.ts +11 -0
  47. package/dist/observation/report.d.ts.map +1 -1
  48. package/dist/observation/report.js.map +1 -1
  49. package/dist/primitives/version.d.ts +1 -1
  50. package/dist/primitives/version.js +1 -1
  51. package/dist/primitives/version.js.map +1 -1
  52. package/dist/provider.d.ts +1 -1
  53. package/dist/runtime/model-call-handle.js +1 -1
  54. package/dist/runtime/model-call-handle.js.map +1 -1
  55. package/dist/runtime/model-metadata.js +1 -1
  56. package/dist/runtime/model-metadata.js.map +1 -1
  57. package/dist/runtime/model-stream.js +1 -1
  58. package/dist/runtime/model-stream.js.map +1 -1
  59. package/dist/runtime/registry.d.ts +7 -1
  60. package/dist/runtime/registry.d.ts.map +1 -1
  61. package/dist/runtime/registry.js +1 -1
  62. package/dist/runtime/registry.js.map +1 -1
  63. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","names":[],"sources":["../../../../src/agent/define/session/types.ts"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;KAsBY,sBAAsB;;UAGjB;WACN;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;;;;;WAKA;;;;;;;;WAQA,qBAAqB;;;;;;;;;;;WAWrB;;;;;WAKA;;WAEA;WACA;WACA;;WAEA;;WAEA;;UAGM;WACN;WACA;;UAGM;WACN,UAAU;;WAEV;;WAEA,UAAU;;WAEV,gBAAgB;;WAEhB,gBAAgB;;WAEhB,QAAQ,uBAAuB;;WAE/B,kBAAkB;;WAElB;WACA,YAAY;WACZ,YAAY;;;;;;;;WAQZ,aAAa;WACb,wBAAwB;;;;;;;;WAQxB,2BAA2B;WAC3B,QAAQ;;WAER,cAAc;;WAEd,sBAAsB;;WAEtB,cAAc;;WAEd,eAAe;;WAEf,oBAAoB;;WAEpB,SAAS,cAAc;;WAEvB,aAAa;WACb;aACE,UAAU;aACV,eAAe;;;WAGjB,OAAO;;UAGD;EACf,OAAO,SAAS,cAAc,UAAU;EACxC,SAAS,gBAAgB,yCAAyC;EAClE,gBAAgB;;UAGD;WACN;WACA;WACA;WACA;;;;;;;;;;WAUA;;;UAIM,+BAA+B;WACrC,MAAM;;;UAIA;WACN;WACA;WACA;WACA,SAAS;WACT,QAAQ;;WAER;;aAEE,oBAAoB;;;UAIhB;WACN;WACA;WACA;WACA;WACA,UAAU;;WAEV,eAAe;;;UAIT,kCACP,KAAK;WACJ,UAAU;;UAGJ;;;;;;;;;;;WAWN;aAAmB;aAA2B;;;WAE9C,kBAbM;;WAeN;WACA,eAHyD;WAIzD,kBAAkB;;WAElB;;WAEA;WACA,SAAS;;WAET,WAAW,OAAO,yBAAyB;;UAGrC;WACN;WACA,SAAS;WACT,QAAQ;WACR,UAAU;;;UAIJ,uBAAuB,cAAc;WAC3C;WACA,QAAQ,QAAQ;WAChB,QAAQ,QAAQ"}
1
+ {"version":3,"file":"types.d.ts","names":[],"sources":["../../../../src/agent/define/session/types.ts"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;KAsBY,sBAAsB;;UAGjB;WACN;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;;;;;WAKA;;;;;;;;WAQA,qBAAqB;;;;;;;;;;;WAWrB;;;;;WAKA;;WAEA;WACA;WACA;;WAEA;;WAEA;;UAGM;WACN;WACA;;UAGM;WACN,UAAU;;WAEV;;WAEA,UAAU;;WAEV,gBAAgB;;WAEhB,gBAAgB;;WAEhB,QAAQ,uBAAuB;;WAE/B,kBAAkB;;WAElB;WACA,YAAY;WACZ,YAAY;;;;;;;;WAQZ,aAAa;WACb,wBAAwB;;;;;;;;WAQxB,2BAA2B;WAC3B,QAAQ;;WAER,cAAc;;WAEd,sBAAsB;;WAEtB,cAAc;;WAEd,eAAe;;WAEf,oBAAoB;;WAEpB,SAAS,cAAc;;WAEvB,aAAa;WACb;aACE,UAAU;aACV,eAAe;;;WAGjB,OAAO;;UAGD;EACf,OAAO,SAAS,cAAc,UAAU;EACxC,SAAS,gBAAgB,yCAAyC;EAClE,gBAAgB;;UAGD;WACN;WACA;WACA;WACA;;;;;;;;;;WAUA;;;UAIM,+BAA+B;WACrC,MAAM;;;UAIA;WACN;WACA;WACA;WACA,SAAS;WACT,QAAQ;;WAER;;aAEE,oBAAoB;;;UAIhB;WACN;WACA;WACA;WACA;WACA,UAAU;;WAEV,eAAe;;;UAIT,kCACP,KAAK;WACJ,UAAU;;UAGJ;;;;;;;;;;;WAWN;aAAmB;aAA2B;;;WAE9C;WACA,eAdM;WAeN,kBAAkB;;WAElB;;WAEA;WACA,SAAS;;WAET,WAAW,OAAO,yBAAyB;;UAGrC;WACN;WACA,SAAS;WACT,QAAQ;WACR,UAAU;;;UAIJ,uBAAuB,cAAc;WAC3C;WACA,QAAQ,QAAQ;WAChB,QAAQ,QAAQ"}
@@ -1,2 +1,2 @@
1
- const e=Object.freeze({maxSteps:16,maxToolCalls:64,toolBudgetRemindAt:Object.freeze([32,16,6]),onExhausted:`force-final-answer`,maxConsecutiveToolErrors:8,repeatToolWarningAt:3,repeatToolLimit:6,toolCycleWarningAt:2,toolCycleLimit:3,maxToolCycleLength:4,maxTotalTokens:`auto`,finalReportReserveTokens:0,maxParallel:8,maxToolResultBytes:4194304,maxToolResultTokens:1e4,toolResultOverflow:`auto`,maxToolDurationMs:6e5,toolTeardownTimeoutMs:3e4});function t(t){let n={...e,...t};if(n.maxTotalTokens!==`auto`&&(!Number.isSafeInteger(n.maxTotalTokens)||n.maxTotalTokens<1))throw RangeError(`maxTotalTokens must be a positive safe integer or 'auto'`);if(!Number.isSafeInteger(n.finalReportReserveTokens)||n.finalReportReserveTokens<0||n.maxTotalTokens!==`auto`&&n.finalReportReserveTokens>=n.maxTotalTokens)throw RangeError(`finalReportReserveTokens must be a non-negative safe integer below maxTotalTokens`);if(n.maxSteps!==`auto`&&(!Number.isSafeInteger(n.maxSteps)||n.maxSteps<1))throw RangeError(`maxSteps must be a positive safe integer or 'auto'`);for(let e of[`maxToolCalls`,`maxConsecutiveToolErrors`,`repeatToolWarningAt`,`repeatToolLimit`,`toolCycleWarningAt`,`toolCycleLimit`,`maxToolCycleLength`,`maxParallel`,`maxToolResultBytes`,`maxToolResultTokens`,`maxToolDurationMs`,`toolTeardownTimeoutMs`])if(!Number.isSafeInteger(n[e])||n[e]<1)throw RangeError(`${e} must be a positive safe integer`);if(![`auto`,`truncate`,`spill`].includes(n.toolResultOverflow))throw RangeError(`toolResultOverflow must be 'auto', 'truncate', or 'spill'`);if(![`force-final-answer`,`stop`,`continue`].includes(n.onExhausted))throw RangeError(`onExhausted must be 'force-final-answer', 'stop', or 'continue'`);if(n.repeatToolLimit<n.repeatToolWarningAt)throw RangeError(`repeatToolLimit must be >= repeatToolWarningAt`);if(n.toolCycleLimit<n.toolCycleWarningAt)throw RangeError(`toolCycleLimit must be >= toolCycleWarningAt`);if(!Array.isArray(n.toolBudgetRemindAt)||n.toolBudgetRemindAt.some(e=>!Number.isSafeInteger(e)||e<1))throw RangeError(`toolBudgetRemindAt must contain only positive safe integers`);return Object.freeze(n)}function n(e,t){if(!Number.isFinite(e)||e<=0)throw RangeError(`${t} must be a positive finite number`);return e}function r(e,t){if(!Number.isSafeInteger(e)||e<1)throw RangeError(`${t} must be a positive safe integer`);return e}function i(e){let t=Object.freeze({provider:e.config.provider,model:e.config.model,...e.config.reasoningEffort===void 0?{}:{reasoningEffort:e.config.reasoningEffort},...e.config.temperature===void 0?{}:{temperature:e.config.temperature},...e.config.topP===void 0?{}:{topP:e.config.topP},...e.config.maxTokens===void 0?{}:{maxTokens:e.config.maxTokens},...e.config.stop===void 0?{}:{stop:Object.freeze([...e.config.stop])}});return Object.freeze({...e,config:t,...e.bounds===void 0?{}:{bounds:Object.freeze({...e.bounds})},...e.nativeTools===void 0?{}:{nativeTools:Object.freeze([...e.nativeTools])},...e.interceptors===void 0?{}:{interceptors:Object.freeze([...e.interceptors])},...e.hooks===void 0?{}:{hooks:Object.freeze({...e.hooks})},...e.trace===void 0?{}:{trace:Object.freeze({...e.trace})}})}export{e as DEFAULT_BOUNDS,n as positiveFinite,r as positiveSafeInteger,t as resolveBounds,i as snapshotRunTurnOptions};
1
+ const e=Object.freeze({maxSteps:16,maxToolCalls:64,toolBudgetRemindAt:Object.freeze([32,16,6]),onExhausted:`force-final-answer`,maxConsecutiveToolErrors:8,repeatToolWarningAt:3,repeatToolLimit:6,toolCycleWarningAt:2,toolCycleLimit:3,maxToolCycleLength:4,maxTotalTokens:`auto`,finalReportReserveTokens:0,maxParallel:8,maxToolResultBytes:4194304,maxToolResultTokens:1e4,toolResultOverflow:`auto`,maxToolDurationMs:6e5,toolTeardownTimeoutMs:3e4});function t(t){let n={...e,...t};if(n.maxTotalTokens!==`auto`&&(!Number.isSafeInteger(n.maxTotalTokens)||n.maxTotalTokens<1))throw RangeError(`maxTotalTokens must be a positive safe integer or 'auto'`);if(!Number.isSafeInteger(n.finalReportReserveTokens)||n.finalReportReserveTokens<0||n.maxTotalTokens!==`auto`&&n.finalReportReserveTokens>=n.maxTotalTokens)throw RangeError(`finalReportReserveTokens must be a non-negative safe integer below maxTotalTokens`);if(n.maxSteps!==`auto`&&(!Number.isSafeInteger(n.maxSteps)||n.maxSteps<1))throw RangeError(`maxSteps must be a positive safe integer or 'auto'`);for(let e of[`maxToolCalls`,`maxConsecutiveToolErrors`,`repeatToolWarningAt`,`repeatToolLimit`,`toolCycleWarningAt`,`toolCycleLimit`,`maxToolCycleLength`,`maxParallel`,`maxToolResultBytes`,`maxToolResultTokens`,`maxToolDurationMs`,`toolTeardownTimeoutMs`])if(!Number.isSafeInteger(n[e])||n[e]<1)throw RangeError(`${e} must be a positive safe integer`);if(![`auto`,`truncate`,`spill`].includes(n.toolResultOverflow))throw RangeError(`toolResultOverflow must be 'auto', 'truncate', or 'spill'`);if(![`force-final-answer`,`stop`,`continue`].includes(n.onExhausted))throw RangeError(`onExhausted must be 'force-final-answer', 'stop', or 'continue'`);if(n.repeatToolLimit<n.repeatToolWarningAt)throw RangeError(`repeatToolLimit must be >= repeatToolWarningAt`);if(n.toolCycleLimit<n.toolCycleWarningAt)throw RangeError(`toolCycleLimit must be >= toolCycleWarningAt`);if(!Array.isArray(n.toolBudgetRemindAt)||n.toolBudgetRemindAt.some(e=>!Number.isSafeInteger(e)||e<1))throw RangeError(`toolBudgetRemindAt must contain only positive safe integers`);return Object.freeze(n)}function n(e,t){if(!Number.isFinite(e)||e<=0)throw RangeError(`${t} must be a positive finite number`);return e}function r(e,t){if(!Number.isSafeInteger(e)||e<1)throw RangeError(`${t} must be a positive safe integer`);return e}function i(e){let t=Object.freeze({provider:e.config.provider,model:e.config.model,...e.config.reasoningEffort===void 0?{}:{reasoningEffort:e.config.reasoningEffort},...e.config.temperature===void 0?{}:{temperature:e.config.temperature},...e.config.topP===void 0?{}:{topP:e.config.topP},...e.config.maxTokens===void 0?{}:{maxTokens:e.config.maxTokens},...e.config.contextWindow===void 0?{}:{contextWindow:e.config.contextWindow},...e.config.inputModalities===void 0?{}:{inputModalities:Object.freeze([...e.config.inputModalities])},...e.config.stop===void 0?{}:{stop:Object.freeze([...e.config.stop])}});return Object.freeze({...e,config:t,...e.bounds===void 0?{}:{bounds:Object.freeze({...e.bounds})},...e.nativeTools===void 0?{}:{nativeTools:Object.freeze([...e.nativeTools])},...e.interceptors===void 0?{}:{interceptors:Object.freeze([...e.interceptors])},...e.hooks===void 0?{}:{hooks:Object.freeze({...e.hooks})},...e.trace===void 0?{}:{trace:Object.freeze({...e.trace})}})}export{e as DEFAULT_BOUNDS,n as positiveFinite,r as positiveSafeInteger,t as resolveBounds,i as snapshotRunTurnOptions};
2
2
  //# sourceMappingURL=config.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","names":[],"sources":["../../../../src/agent/loop/turn/config.ts"],"sourcesContent":["import type { TurnBounds } from '../types.ts'\nimport { type RunTurnOptions } from './types.ts'\n\nexport const DEFAULT_BOUNDS: TurnBounds = Object.freeze({\n maxSteps: 16,\n maxToolCalls: 64,\n // Halfway, a quarter left, and nearly gone. Three notices, spaced so the\n // first is still early enough to change the plan and the last is impossible\n // to ignore.\n toolBudgetRemindAt: Object.freeze([32, 16, 6]),\n onExhausted: 'force-final-answer',\n maxConsecutiveToolErrors: 8,\n repeatToolWarningAt: 3,\n repeatToolLimit: 6,\n toolCycleWarningAt: 2,\n toolCycleLimit: 3,\n maxToolCycleLength: 4,\n maxTotalTokens: 'auto',\n finalReportReserveTokens: 0,\n maxParallel: 8,\n maxToolResultBytes: 4 * 1024 * 1024,\n // Codex's own default for a shell call. Large enough for a real build log,\n // small enough that a handful of them cannot spend a context window.\n maxToolResultTokens: 10_000,\n toolResultOverflow: 'auto',\n maxToolDurationMs: 10 * 60_000,\n toolTeardownTimeoutMs: 30_000,\n})\nexport function resolveBounds(input: Partial<TurnBounds> | undefined): TurnBounds {\n const bounds = { ...DEFAULT_BOUNDS, ...input }\n if (bounds.maxTotalTokens !== 'auto' && (!Number.isSafeInteger(bounds.maxTotalTokens) || bounds.maxTotalTokens < 1)) {\n throw new RangeError(\"maxTotalTokens must be a positive safe integer or 'auto'\")\n }\n if (!Number.isSafeInteger(bounds.finalReportReserveTokens) || bounds.finalReportReserveTokens < 0\n || (bounds.maxTotalTokens !== 'auto' && bounds.finalReportReserveTokens >= bounds.maxTotalTokens)) {\n throw new RangeError('finalReportReserveTokens must be a non-negative safe integer below maxTotalTokens')\n }\n if (bounds.maxSteps !== 'auto' && (!Number.isSafeInteger(bounds.maxSteps) || bounds.maxSteps < 1)) {\n throw new RangeError(\"maxSteps must be a positive safe integer or 'auto'\")\n }\n for (const key of [\n 'maxToolCalls', 'maxConsecutiveToolErrors', 'repeatToolWarningAt',\n 'repeatToolLimit', 'toolCycleWarningAt', 'toolCycleLimit', 'maxToolCycleLength',\n 'maxParallel', 'maxToolResultBytes', 'maxToolResultTokens',\n 'maxToolDurationMs',\n 'toolTeardownTimeoutMs',\n ] as const) {\n if (!Number.isSafeInteger(bounds[key]) || bounds[key] < 1) throw new RangeError(`${key} must be a positive safe integer`)\n }\n if (!['auto', 'truncate', 'spill'].includes(bounds.toolResultOverflow)) {\n throw new RangeError(\"toolResultOverflow must be 'auto', 'truncate', or 'spill'\")\n }\n if (!['force-final-answer', 'stop', 'continue'].includes(bounds.onExhausted)) {\n throw new RangeError(\"onExhausted must be 'force-final-answer', 'stop', or 'continue'\")\n }\n if (bounds.repeatToolLimit < bounds.repeatToolWarningAt) throw new RangeError('repeatToolLimit must be >= repeatToolWarningAt')\n if (bounds.toolCycleLimit < bounds.toolCycleWarningAt) {\n throw new RangeError('toolCycleLimit must be >= toolCycleWarningAt')\n }\n if (!Array.isArray(bounds.toolBudgetRemindAt)\n || bounds.toolBudgetRemindAt.some(value => !Number.isSafeInteger(value) || value < 1)) {\n // Out-of-range thresholds are dropped rather than rejected, but a\n // fractional or negative one is a mistake worth naming: silently ignoring\n // `0.25` would leave a host believing it had asked for a reminder.\n throw new RangeError('toolBudgetRemindAt must contain only positive safe integers')\n }\n return Object.freeze(bounds)\n}\nexport function positiveFinite(value: number, name: string): number {\n if (!Number.isFinite(value) || value <= 0) throw new RangeError(`${name} must be a positive finite number`)\n return value\n}\nexport function positiveSafeInteger(value: number, name: string): number {\n if (!Number.isSafeInteger(value) || value < 1) throw new RangeError(`${name} must be a positive safe integer`)\n return value\n}\nexport function snapshotRunTurnOptions(options: RunTurnOptions): RunTurnOptions {\n const config = Object.freeze({\n provider: options.config.provider,\n model: options.config.model,\n ...(options.config.reasoningEffort === undefined ? {} : { reasoningEffort: options.config.reasoningEffort }),\n ...(options.config.temperature === undefined ? {} : { temperature: options.config.temperature }),\n ...(options.config.topP === undefined ? {} : { topP: options.config.topP }),\n ...(options.config.maxTokens === undefined ? {} : { maxTokens: options.config.maxTokens }),\n ...(options.config.stop === undefined ? {} : { stop: Object.freeze([...options.config.stop]) }),\n })\n return Object.freeze({\n ...options,\n config,\n ...(options.bounds === undefined ? {} : { bounds: Object.freeze({ ...options.bounds }) }),\n ...(options.nativeTools === undefined ? {} : { nativeTools: Object.freeze([...options.nativeTools]) }),\n ...(options.interceptors === undefined ? {} : { interceptors: Object.freeze([...options.interceptors]) }),\n ...(options.hooks === undefined ? {} : { hooks: Object.freeze({ ...options.hooks }) }),\n ...(options.trace === undefined ? {} : { trace: Object.freeze({ ...options.trace }) }),\n })\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"config.js","names":[],"sources":["../../../../src/agent/loop/turn/config.ts"],"sourcesContent":["import type { TurnBounds } from '../types.ts'\nimport { type RunTurnOptions } from './types.ts'\n\nexport const DEFAULT_BOUNDS: TurnBounds = Object.freeze({\n maxSteps: 16,\n maxToolCalls: 64,\n // Halfway, a quarter left, and nearly gone. Three notices, spaced so the\n // first is still early enough to change the plan and the last is impossible\n // to ignore.\n toolBudgetRemindAt: Object.freeze([32, 16, 6]),\n onExhausted: 'force-final-answer',\n maxConsecutiveToolErrors: 8,\n repeatToolWarningAt: 3,\n repeatToolLimit: 6,\n toolCycleWarningAt: 2,\n toolCycleLimit: 3,\n maxToolCycleLength: 4,\n maxTotalTokens: 'auto',\n finalReportReserveTokens: 0,\n maxParallel: 8,\n maxToolResultBytes: 4 * 1024 * 1024,\n // Codex's own default for a shell call. Large enough for a real build log,\n // small enough that a handful of them cannot spend a context window.\n maxToolResultTokens: 10_000,\n toolResultOverflow: 'auto',\n maxToolDurationMs: 10 * 60_000,\n toolTeardownTimeoutMs: 30_000,\n})\nexport function resolveBounds(input: Partial<TurnBounds> | undefined): TurnBounds {\n const bounds = { ...DEFAULT_BOUNDS, ...input }\n if (bounds.maxTotalTokens !== 'auto' && (!Number.isSafeInteger(bounds.maxTotalTokens) || bounds.maxTotalTokens < 1)) {\n throw new RangeError(\"maxTotalTokens must be a positive safe integer or 'auto'\")\n }\n if (!Number.isSafeInteger(bounds.finalReportReserveTokens) || bounds.finalReportReserveTokens < 0\n || (bounds.maxTotalTokens !== 'auto' && bounds.finalReportReserveTokens >= bounds.maxTotalTokens)) {\n throw new RangeError('finalReportReserveTokens must be a non-negative safe integer below maxTotalTokens')\n }\n if (bounds.maxSteps !== 'auto' && (!Number.isSafeInteger(bounds.maxSteps) || bounds.maxSteps < 1)) {\n throw new RangeError(\"maxSteps must be a positive safe integer or 'auto'\")\n }\n for (const key of [\n 'maxToolCalls', 'maxConsecutiveToolErrors', 'repeatToolWarningAt',\n 'repeatToolLimit', 'toolCycleWarningAt', 'toolCycleLimit', 'maxToolCycleLength',\n 'maxParallel', 'maxToolResultBytes', 'maxToolResultTokens',\n 'maxToolDurationMs',\n 'toolTeardownTimeoutMs',\n ] as const) {\n if (!Number.isSafeInteger(bounds[key]) || bounds[key] < 1) throw new RangeError(`${key} must be a positive safe integer`)\n }\n if (!['auto', 'truncate', 'spill'].includes(bounds.toolResultOverflow)) {\n throw new RangeError(\"toolResultOverflow must be 'auto', 'truncate', or 'spill'\")\n }\n if (!['force-final-answer', 'stop', 'continue'].includes(bounds.onExhausted)) {\n throw new RangeError(\"onExhausted must be 'force-final-answer', 'stop', or 'continue'\")\n }\n if (bounds.repeatToolLimit < bounds.repeatToolWarningAt) throw new RangeError('repeatToolLimit must be >= repeatToolWarningAt')\n if (bounds.toolCycleLimit < bounds.toolCycleWarningAt) {\n throw new RangeError('toolCycleLimit must be >= toolCycleWarningAt')\n }\n if (!Array.isArray(bounds.toolBudgetRemindAt)\n || bounds.toolBudgetRemindAt.some(value => !Number.isSafeInteger(value) || value < 1)) {\n // Out-of-range thresholds are dropped rather than rejected, but a\n // fractional or negative one is a mistake worth naming: silently ignoring\n // `0.25` would leave a host believing it had asked for a reminder.\n throw new RangeError('toolBudgetRemindAt must contain only positive safe integers')\n }\n return Object.freeze(bounds)\n}\nexport function positiveFinite(value: number, name: string): number {\n if (!Number.isFinite(value) || value <= 0) throw new RangeError(`${name} must be a positive finite number`)\n return value\n}\nexport function positiveSafeInteger(value: number, name: string): number {\n if (!Number.isSafeInteger(value) || value < 1) throw new RangeError(`${name} must be a positive safe integer`)\n return value\n}\nexport function snapshotRunTurnOptions(options: RunTurnOptions): RunTurnOptions {\n const config = Object.freeze({\n provider: options.config.provider,\n model: options.config.model,\n ...(options.config.reasoningEffort === undefined ? {} : { reasoningEffort: options.config.reasoningEffort }),\n ...(options.config.temperature === undefined ? {} : { temperature: options.config.temperature }),\n ...(options.config.topP === undefined ? {} : { topP: options.config.topP }),\n ...(options.config.maxTokens === undefined ? {} : { maxTokens: options.config.maxTokens }),\n ...(options.config.contextWindow === undefined ? {} : { contextWindow: options.config.contextWindow }),\n ...(options.config.inputModalities === undefined ? {} : {\n inputModalities: Object.freeze([...options.config.inputModalities]),\n }),\n ...(options.config.stop === undefined ? {} : { stop: Object.freeze([...options.config.stop]) }),\n })\n return Object.freeze({\n ...options,\n config,\n ...(options.bounds === undefined ? {} : { bounds: Object.freeze({ ...options.bounds }) }),\n ...(options.nativeTools === undefined ? {} : { nativeTools: Object.freeze([...options.nativeTools]) }),\n ...(options.interceptors === undefined ? {} : { interceptors: Object.freeze([...options.interceptors]) }),\n ...(options.hooks === undefined ? {} : { hooks: Object.freeze({ ...options.hooks }) }),\n ...(options.trace === undefined ? {} : { trace: Object.freeze({ ...options.trace }) }),\n })\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"compaction.d.ts","names":[],"sources":["../../../src/agent/memory/compaction.ts"],"mappings":";;;;;;;;;;;UAuBiB;WACN;WACA,SAAS;WACT;WACA;WACA;WACA;WACA;WACA;WACA,gBAAgB;WAChB;WACA;WACA;WACA,QAAQ;;WAER;WACA,SAAS;;UAGH;WACN,UAAU;;;;;;;;;WASV,cAAc;WACd,eAAe;WACf;WACA,gCAAgC;WAChC,sBAAsB;WACtB,QAAQ;;cAiBN;cAyBA;mBACM;UACT;UACA;UACA;UACA;;UAEA;UAIA;EAER,YAAY,OAAO;;EAKb,WAAW,SAAS,oBAAoB;;EA2CxC,eAAe,SAAS,sBAAsB;;EAmB9C,WAAW,SAAS,cAAc,QAAQ;UAOlC;UA8JA;UA8CA;UASA"}
1
+ {"version":3,"file":"compaction.d.ts","names":[],"sources":["../../../src/agent/memory/compaction.ts"],"mappings":";;;;;;;;;;;UAuBiB;WACN;WACA,SAAS;WACT;WACA;WACA;WACA;WACA;WACA;WACA,gBAAgB;WAChB;WACA;WACA;WACA,QAAQ;;WAER;WACA,SAAS;;UAGH;WACN,UAAU;;;;;;;;;WASV,cAAc;WACd,eAAe;WACf;WACA,gCAAgC;WAChC,sBAAsB;WACtB,QAAQ;;cAiBN;cAyBA;mBACM;UACT;UACA;UACA;UACA;;UAEA;UAIA;EAER,YAAY,OAAO;;EAKb,WAAW,SAAS,oBAAoB;;EA2CxC,eAAe,SAAS,sBAAsB;;EAmB9C,WAAW,SAAS,cAAc,QAAQ;UAOlC;UA8JA;UAiDA;UASA"}
@@ -1,5 +1,5 @@
1
1
  import{ReasoningEffortId as e}from"../../primitives/brand.js";import{waitForSettlement as t}from"../../async/settlement.js";import{systemRandomId as n}from"../../platform/adapter.js";import{createMessage as r,createUserMessage as i}from"../../message/message.js";import{BlockAssembler as a}from"../../stream/assembler.js";import{normalizeToolPairing as o}from"../history/normalize.js";import{compactionAccounting as s}from"./accounting-binding.js";import{estimateContextTokens as c,estimateMessageTokens as l}from"./token-estimator.js";import{pruneToolResults as u,selectCompactablePrefix as d}from"./surface-compaction.js";const f=[`You are performing a CONTEXT CHECKPOINT COMPACTION for a long-running AI agent task.`,`Condense the conversation above into a handoff that lets another model continue without forgetting the original purpose.`,``,`Output exactly these Markdown sections, in order, using terse bullets. Write "(none)" for an empty section.`,`## Primary Request and Intent`,`## Progress and Completed Work`,`## Decisions and Rationale`,`## Constraints and User Preferences`,`## Important Files, Symbols, and Evidence`,`## Errors and Failed Approaches`,`## Pending Work`,`## Current Work`,`## Next Step`,`## Critical Context`,``,`Preserve exact paths, identifiers, commands, error strings, numeric limits, and user corrections when they matter.`,`Under Important Files, mark relevant files as inspected or modified and preserve the exact declarations or findings needed next.`,`Under Current Work, record the last successful tool action, the latest verification result, and whether any edit is still partial.`,`Under Next Step, name one direct edit or command. Do not recommend rereading an unchanged file whose relevant contents are already recorded.`,`Do not reveal hidden chain-of-thought. Record only public progress, observed evidence, decisions, and actionable context.`,`If an earlier <compacted-summary> exists, merge still-valid facts with newer information and drop stale facts.`,`Output only the checkpoint. Do not call tools and do not acknowledge the compaction.`].join(`
2
- `);var p=class{input;active=!1;overflowTurn=-1;overflowRetries=0;recoveringOverflow=!1;modelBudget;pressureCooldown=0;constructor(e){this.input=e}async beforeStep(e){if(!(!this.input.policy.auto||e.signal.aborted)){if(this.pressureCooldown>0){this.pressureCooldown--;return}this.overflowTurn===e.turn?this.recoveringOverflow||(this.overflowRetries=0):(this.overflowTurn=e.turn,this.overflowRetries=0),this.recoveringOverflow=!1;try{let t;for(let n=0;n<=this.input.policy.compactionRetries;n++){let n=await this.compactIfNeeded(`pressure`,e.signal,e.emit);if(n===null)break;if(t=n,n.backoffReason!==void 0){this.pressureCooldown=n.cooldownSteps??4;break}}t!==void 0&&t.thresholdTokens!==void 0&&t.estimatedTokensAfter>=t.thresholdTokens&&(this.pressureCooldown=Math.max(this.pressureCooldown,4))}catch{this.pressureCooldown=2}}}async onRequestError(e){if(!(e.failure.code!==`CONTEXT_WINDOW_EXCEEDED`||e.signal.aborted)&&(this.overflowTurn!==e.turn&&(this.overflowTurn=e.turn,this.overflowRetries=0),!(this.overflowRetries>=this.input.policy.maxOverflowRetries)))try{return await this.compactIfNeeded(`context-overflow`,e.signal,e.emit)===null||e.signal.aborted?void 0:(this.overflowRetries++,this.recoveringOverflow=!0,`retry`)}catch{return}}async compactNow(e){let t=e===void 0?new AbortController:void 0,n=e??t?.signal;if(n===void 0)throw Error(`failed to create compaction signal`);return this.compactIfNeeded(`manual`,n)}async compactIfNeeded(e,t,n){if(this.active)return null;let r=AbortSignal.timeout(this.input.policy.summaryTimeoutMs),a=AbortSignal.any([t,r]);a.throwIfAborted(),this.active=!0;try{let o=this.input.history(),s=o.surface();if(s.length<2)return null;let f=this.input.tools(),p=this.input.system(),m=this.input.pinnedMessages?.()??[],h=c({system:p,messages:[...m,...s.map(e=>e.message)],tools:f}),g=await this.resolveBudget(h,a);if(a.throwIfAborted(),e===`pressure`&&(g===null||h<g.thresholdTokens))return null;if(u(o,s,this.input.policy.maxToolResultChars)>0){if(s=o.surface(),h=c({system:p,messages:[...m,...s.map(e=>e.message)],tools:f}),e===`pressure`&&g!==null&&h<g.thresholdTokens)return null;g=await this.resolveBudget(h,a),a.throwIfAborted()}let _=e===`context-overflow`?Math.max(1,l(s.at(-1)?.message)):g?.retainTokens??Math.max(1,Math.floor(h*.25)),v=d(s,_);if(v.length===0)return null;let y=new Set(v.map(e=>e.seq)),C=c({system:p,messages:[...m,...s.filter(e=>!y.has(e.seq)).map(e=>e.message)],tools:f}),w=b(),T=new Date().toISOString();o.append({kind:`compaction-start`,compactionId:w,trigger:e,at:T});try{await this.emitObserver(n,{type:`compaction-start`,compactionId:w,trigger:e,estimatedInputTokens:h});let t=await this.summarize([...m,...v.map(e=>e.message)],p,f,a);a.throwIfAborted();let r=i({source:{kind:`app`,producer:`agent-compaction:${w}`},content:[{type:`text`,text:`This is an automatically generated checkpoint of earlier conversation context. Treat it as established background, preserve the original objective and constraints, and continue directly from the messages that follow.\n\n<compacted-summary>\n${t.summary}\n</compacted-summary>`}]}),s=v.reduce((e,t)=>e+l(t.message),0),c=l(r);if(c>=s)throw Error(`compaction summary did not shrink selected context (${c} >= ${s} estimated tokens)`);let u=Object.freeze(v.map(e=>e.seq)),d=Math.max(0,h-s+c),_=g?.thresholdTokens,y=O({trigger:e,thresholdTokens:_,estimatedTokensBefore:h,estimatedTokensAfter:d,estimatedNonCompactableTokens:C});o.appendBatch([{event:{kind:`compaction-summary`,compactionId:w,summary:t.summary,shadowedSeqs:u,estimatedTokensBefore:h,estimatedTokensAfter:d,provider:t.provider,model:t.model,...t.usage===void 0?{}:{usage:t.usage}}},{event:{kind:`user`,message:r},surfaceOp:{op:`replace`,from:Math.min(...u),to:Math.max(...u),targets:u}},{event:{kind:`compaction-end`,compactionId:w,status:`completed`,at:new Date().toISOString(),..._===void 0?{}:{thresholdTokens:_},estimatedNonCompactableTokens:C,...y===void 0?{}:{backoffReason:y,cooldownSteps:4}}}]);let b=Object.freeze({compactionId:w,trigger:e,summary:t.summary,shadowedSeqs:u,estimatedTokensBefore:h,estimatedTokensAfter:d,..._===void 0?{}:{thresholdTokens:_},estimatedNonCompactableTokens:C,...y===void 0?{}:{backoffReason:y,cooldownSteps:4},provider:t.provider,model:t.model,...t.usage===void 0?{}:{usage:t.usage}});return await this.emitObserver(n,{type:`compaction-end`,compactionId:w,trigger:e,status:`completed`,shadowedSeqs:u,estimatedTokensBefore:h,estimatedTokensAfter:d,summary:t.summary,..._===void 0?{}:{thresholdTokens:_},estimatedNonCompactableTokens:C,...y===void 0?{}:{backoffReason:y,cooldownSteps:4},...t.usage===void 0?{}:{usage:t.usage}}),b}catch(i){let a=r.aborted&&!t.aborted&&S(i)!==`MODEL_TEARDOWN_TIMEOUT`?E(this.input.policy.summaryTimeoutMs,i):i,s=x(a);try{o.append({kind:`compaction-end`,compactionId:w,status:`failed`,at:new Date().toISOString(),error:s})}catch{}throw await this.emitObserver(n,{type:`compaction-end`,compactionId:w,trigger:e,status:`failed`,shadowedSeqs:[],estimatedTokensBefore:h,estimatedTokensAfter:h,error:s}),a}}finally{this.active=!1}}async resolveBudget(e,t){let n=this.input.policy,r=this.input.config(),i=`${r.provider}\u0000${r.model}\u0000${String(r.maxTokens??``)}`;if(this.modelBudget?.key!==i)try{let e=await D(this.input.registry.resolveModelInfo(r.provider,r.model,t),t),n=e.context?.contextWindow;this.modelBudget={key:i,budget:n===void 0?null:{contextWindow:n,outputReserve:r.maxTokens??e.defaultMaxTokens??e.maxOutputTokens??0}}}catch{if(n.maxInputTokens===void 0)return null;this.modelBudget={key:i,budget:null}}let a=this.modelBudget?.budget?.contextWindow,o=a===void 0?void 0:Math.max(1,a-(this.modelBudget?.budget?.outputReserve??0)),s=a===void 0?void 0:Math.floor(a*n.thresholdRatio),c=o===void 0||s===void 0?void 0:Math.min(o,s),l=n.maxInputTokens===void 0?c:o===void 0?n.maxInputTokens:Math.min(n.maxInputTokens,o);if(l===void 0)return null;let u=o??Math.max(e,Math.ceil(l/n.thresholdRatio)),d=n.retainTokens??Math.floor(u*(n.retainRatio??.2));return{thresholdTokens:l,retainTokens:Math.max(1,d)}}async emitObserver(e,n){if(e===void 0)return;let r=Promise.resolve().then(()=>e(n));await t(r,this.input.policy.teardownTimeoutMs)}async summarize(n,r,c,l){let u=this.input.policy,d=this.input.config(),p=u.summarizationProvider??d.provider,h=u.summarizationModel??d.model,g=s(this);w(g);let _=await D(this.input.registry.resolveModelInfo(p,h,l),l),v=Math.min(u.maxSummaryTokens,_.maxOutputTokens??2**53-1,_.context===void 0?2**53-1:Math.max(1,_.context.contextWindow-1)),y=await D(this.input.registry.prepareCall({provider:p,model:h,...u.summarizationEffort===void 0?{}:{reasoningEffort:e(u.summarizationEffort)},maxTokens:v},l,g?.modelInvocation),l),b={remaining:u.maxSummaryRequestChars},x=o(n).map(e=>m(e,u.maxSummaryInputChars,b)),S=i({source:{kind:`app`,producer:`agent-compaction`},content:[{type:`text`,text:f}]}),E=new a,O={...y.config,messages:[...x,S],...r.length===0?{}:{system:r},...c.length===0?{}:{tools:c},toolChoice:`none`,signal:l},{signal:k,...A}=O;if(C(A)>u.maxSummaryRequestBytes)throw T(`compaction summary request exceeds the ${u.maxSummaryRequestBytes}-byte limit`,`MODEL_REQUEST_TOO_LARGE`);w(g);let j=y.stream(O,g?.modelInvocation),M=j[Symbol.asyncIterator](),N=!1,P=0,F=0,I=!1,L;try{for(;;){let e=await D(M.next(),l);if(e.done===!0){N=!0;break}if(P++,F+=C(e.value),P>u.maxSummaryStreamEvents||F>u.maxSummaryResponseBytes)throw T(`compaction summary response exceeded its resource limit`,`MODEL_RESPONSE_TOO_LARGE`);if(I)throw T(`compaction summarizer emitted data after its terminal finish chunk`,`INVALID_MODEL_STREAM`);E.push(e.value),e.value.type===`finish`&&(I=!0)}}catch(e){L=e}finally{if(!N){let e=M.return?.bind(M);if(e!==void 0)try{let n=Promise.resolve().then(async()=>{await e()});await t(n,u.teardownTimeoutMs)||(L=T(`compaction model stream ignored cancellation for more than ${u.teardownTimeoutMs}ms`,`MODEL_TEARDOWN_TIMEOUT`))}catch(e){L??=e}}}try{let e=await j.report,t=await g?.recordModelCall(e,O);t?.usageRequired===!0&&(L??=T(`compaction model usage is required by the configured run policy`,`USAGE_REQUIRED`)),t?.usageUnavailable===!0&&(L??=T(`compaction model usage is unavailable for the configured budget`,`USAGE_UNAVAILABLE`))}catch(e){L??=e}if(L!==void 0)throw L;let R=E.finish;if(R.kind===`error`||R.kind===`aborted`){let e=Error(R.failure.message);throw e.code=R.failure.code,e}if(R.kind===`max-tokens`)throw Error(`compaction summary was truncated at maxSummaryTokens`);if(R.kind===`tool-calls`)throw Error(`compaction summarizer attempted a tool call`);let z=E.blocks().flatMap(e=>e.type===`text`?[e.text]:[]).join(`
2
+ `);var p=class{input;active=!1;overflowTurn=-1;overflowRetries=0;recoveringOverflow=!1;modelBudget;pressureCooldown=0;constructor(e){this.input=e}async beforeStep(e){if(!(!this.input.policy.auto||e.signal.aborted)){if(this.pressureCooldown>0){this.pressureCooldown--;return}this.overflowTurn===e.turn?this.recoveringOverflow||(this.overflowRetries=0):(this.overflowTurn=e.turn,this.overflowRetries=0),this.recoveringOverflow=!1;try{let t;for(let n=0;n<=this.input.policy.compactionRetries;n++){let n=await this.compactIfNeeded(`pressure`,e.signal,e.emit);if(n===null)break;if(t=n,n.backoffReason!==void 0){this.pressureCooldown=n.cooldownSteps??4;break}}t!==void 0&&t.thresholdTokens!==void 0&&t.estimatedTokensAfter>=t.thresholdTokens&&(this.pressureCooldown=Math.max(this.pressureCooldown,4))}catch{this.pressureCooldown=2}}}async onRequestError(e){if(!(e.failure.code!==`CONTEXT_WINDOW_EXCEEDED`||e.signal.aborted)&&(this.overflowTurn!==e.turn&&(this.overflowTurn=e.turn,this.overflowRetries=0),!(this.overflowRetries>=this.input.policy.maxOverflowRetries)))try{return await this.compactIfNeeded(`context-overflow`,e.signal,e.emit)===null||e.signal.aborted?void 0:(this.overflowRetries++,this.recoveringOverflow=!0,`retry`)}catch{return}}async compactNow(e){let t=e===void 0?new AbortController:void 0,n=e??t?.signal;if(n===void 0)throw Error(`failed to create compaction signal`);return this.compactIfNeeded(`manual`,n)}async compactIfNeeded(e,t,n){if(this.active)return null;let r=AbortSignal.timeout(this.input.policy.summaryTimeoutMs),a=AbortSignal.any([t,r]);a.throwIfAborted(),this.active=!0;try{let o=this.input.history(),s=o.surface();if(s.length<2)return null;let f=this.input.tools(),p=this.input.system(),m=this.input.pinnedMessages?.()??[],h=c({system:p,messages:[...m,...s.map(e=>e.message)],tools:f}),g=await this.resolveBudget(h,a);if(a.throwIfAborted(),e===`pressure`&&(g===null||h<g.thresholdTokens))return null;if(u(o,s,this.input.policy.maxToolResultChars)>0){if(s=o.surface(),h=c({system:p,messages:[...m,...s.map(e=>e.message)],tools:f}),e===`pressure`&&g!==null&&h<g.thresholdTokens)return null;g=await this.resolveBudget(h,a),a.throwIfAborted()}let _=e===`context-overflow`?Math.max(1,l(s.at(-1)?.message)):g?.retainTokens??Math.max(1,Math.floor(h*.25)),v=d(s,_);if(v.length===0)return null;let y=new Set(v.map(e=>e.seq)),C=c({system:p,messages:[...m,...s.filter(e=>!y.has(e.seq)).map(e=>e.message)],tools:f}),w=b(),T=new Date().toISOString();o.append({kind:`compaction-start`,compactionId:w,trigger:e,at:T});try{await this.emitObserver(n,{type:`compaction-start`,compactionId:w,trigger:e,estimatedInputTokens:h});let t=await this.summarize([...m,...v.map(e=>e.message)],p,f,a);a.throwIfAborted();let r=i({source:{kind:`app`,producer:`agent-compaction:${w}`},content:[{type:`text`,text:`This is an automatically generated checkpoint of earlier conversation context. Treat it as established background, preserve the original objective and constraints, and continue directly from the messages that follow.\n\n<compacted-summary>\n${t.summary}\n</compacted-summary>`}]}),s=v.reduce((e,t)=>e+l(t.message),0),c=l(r);if(c>=s)throw Error(`compaction summary did not shrink selected context (${c} >= ${s} estimated tokens)`);let u=Object.freeze(v.map(e=>e.seq)),d=Math.max(0,h-s+c),_=g?.thresholdTokens,y=O({trigger:e,thresholdTokens:_,estimatedTokensBefore:h,estimatedTokensAfter:d,estimatedNonCompactableTokens:C});o.appendBatch([{event:{kind:`compaction-summary`,compactionId:w,summary:t.summary,shadowedSeqs:u,estimatedTokensBefore:h,estimatedTokensAfter:d,provider:t.provider,model:t.model,...t.usage===void 0?{}:{usage:t.usage}}},{event:{kind:`user`,message:r},surfaceOp:{op:`replace`,from:Math.min(...u),to:Math.max(...u),targets:u}},{event:{kind:`compaction-end`,compactionId:w,status:`completed`,at:new Date().toISOString(),..._===void 0?{}:{thresholdTokens:_},estimatedNonCompactableTokens:C,...y===void 0?{}:{backoffReason:y,cooldownSteps:4}}}]);let b=Object.freeze({compactionId:w,trigger:e,summary:t.summary,shadowedSeqs:u,estimatedTokensBefore:h,estimatedTokensAfter:d,..._===void 0?{}:{thresholdTokens:_},estimatedNonCompactableTokens:C,...y===void 0?{}:{backoffReason:y,cooldownSteps:4},provider:t.provider,model:t.model,...t.usage===void 0?{}:{usage:t.usage}});return await this.emitObserver(n,{type:`compaction-end`,compactionId:w,trigger:e,status:`completed`,shadowedSeqs:u,estimatedTokensBefore:h,estimatedTokensAfter:d,summary:t.summary,..._===void 0?{}:{thresholdTokens:_},estimatedNonCompactableTokens:C,...y===void 0?{}:{backoffReason:y,cooldownSteps:4},...t.usage===void 0?{}:{usage:t.usage}}),b}catch(i){let a=r.aborted&&!t.aborted&&S(i)!==`MODEL_TEARDOWN_TIMEOUT`?E(this.input.policy.summaryTimeoutMs,i):i,s=x(a);try{o.append({kind:`compaction-end`,compactionId:w,status:`failed`,at:new Date().toISOString(),error:s})}catch{}throw await this.emitObserver(n,{type:`compaction-end`,compactionId:w,trigger:e,status:`failed`,shadowedSeqs:[],estimatedTokensBefore:h,estimatedTokensAfter:h,error:s}),a}}finally{this.active=!1}}async resolveBudget(e,t){let n=this.input.policy,r=this.input.config(),i=`${r.provider}\u0000${r.model}\u0000${String(r.maxTokens??``)}`;if(this.modelBudget?.key!==i)try{let e=await D(this.input.registry.resolveModelInfo(r.provider,r.model,t),t),n=r.contextWindow??e.context?.contextWindow;this.modelBudget={key:i,budget:n===void 0?null:{contextWindow:n,outputReserve:r.maxTokens??e.defaultMaxTokens??e.maxOutputTokens??0}}}catch{if(n.maxInputTokens===void 0)return null;this.modelBudget={key:i,budget:null}}let a=this.modelBudget?.budget?.contextWindow,o=a===void 0?void 0:Math.max(1,a-(this.modelBudget?.budget?.outputReserve??0)),s=a===void 0?void 0:Math.floor(a*n.thresholdRatio),c=o===void 0||s===void 0?void 0:Math.min(o,s),l=n.maxInputTokens===void 0?c:o===void 0?n.maxInputTokens:Math.min(n.maxInputTokens,o);if(l===void 0)return null;let u=o??Math.max(e,Math.ceil(l/n.thresholdRatio)),d=n.retainTokens??Math.floor(u*(n.retainRatio??.2));return{thresholdTokens:l,retainTokens:Math.max(1,d)}}async emitObserver(e,n){if(e===void 0)return;let r=Promise.resolve().then(()=>e(n));await t(r,this.input.policy.teardownTimeoutMs)}async summarize(n,r,c,l){let u=this.input.policy,d=this.input.config(),p=u.summarizationProvider??d.provider,h=u.summarizationModel??d.model,g=s(this);w(g);let _=await D(this.input.registry.resolveModelInfo(p,h,l),l),v=Math.min(u.maxSummaryTokens,_.maxOutputTokens??2**53-1,_.context===void 0?2**53-1:Math.max(1,_.context.contextWindow-1)),y=await D(this.input.registry.prepareCall({provider:p,model:h,...u.summarizationEffort===void 0?{}:{reasoningEffort:e(u.summarizationEffort)},maxTokens:v},l,g?.modelInvocation),l),b={remaining:u.maxSummaryRequestChars},x=o(n).map(e=>m(e,u.maxSummaryInputChars,b)),S=i({source:{kind:`app`,producer:`agent-compaction`},content:[{type:`text`,text:f}]}),E=new a,O={...y.config,messages:[...x,S],...r.length===0?{}:{system:r},...c.length===0?{}:{tools:c},toolChoice:`none`,signal:l},{signal:k,...A}=O;if(C(A)>u.maxSummaryRequestBytes)throw T(`compaction summary request exceeds the ${u.maxSummaryRequestBytes}-byte limit`,`MODEL_REQUEST_TOO_LARGE`);w(g);let j=y.stream(O,g?.modelInvocation),M=j[Symbol.asyncIterator](),N=!1,P=0,F=0,I=!1,L;try{for(;;){let e=await D(M.next(),l);if(e.done===!0){N=!0;break}if(P++,F+=C(e.value),P>u.maxSummaryStreamEvents||F>u.maxSummaryResponseBytes)throw T(`compaction summary response exceeded its resource limit`,`MODEL_RESPONSE_TOO_LARGE`);if(I)throw T(`compaction summarizer emitted data after its terminal finish chunk`,`INVALID_MODEL_STREAM`);E.push(e.value),e.value.type===`finish`&&(I=!0)}}catch(e){L=e}finally{if(!N){let e=M.return?.bind(M);if(e!==void 0)try{let n=Promise.resolve().then(async()=>{await e()});await t(n,u.teardownTimeoutMs)||(L=T(`compaction model stream ignored cancellation for more than ${u.teardownTimeoutMs}ms`,`MODEL_TEARDOWN_TIMEOUT`))}catch(e){L??=e}}}try{let e=await j.report,t=await g?.recordModelCall(e,O);t?.usageRequired===!0&&(L??=T(`compaction model usage is required by the configured run policy`,`USAGE_REQUIRED`)),t?.usageUnavailable===!0&&(L??=T(`compaction model usage is unavailable for the configured budget`,`USAGE_UNAVAILABLE`))}catch(e){L??=e}if(L!==void 0)throw L;let R=E.finish;if(R.kind===`error`||R.kind===`aborted`){let e=Error(R.failure.message);throw e.code=R.failure.code,e}if(R.kind===`max-tokens`)throw Error(`compaction summary was truncated at maxSummaryTokens`);if(R.kind===`tool-calls`)throw Error(`compaction summarizer attempted a tool call`);let z=E.blocks().flatMap(e=>e.type===`text`?[e.text]:[]).join(`
3
3
  `).trim();if(z.length===0)throw Error(`compaction summarizer produced no text`);return{summary:z,provider:p,model:h,...E.usage===void 0?{}:{usage:E.usage}}}};function m(e,t,n){let i=e.content.flatMap(e=>h(e,t,n)),a=e.source.kind===`model`?{kind:`model`,provider:e.source.provider,model:e.source.model}:e.source;return r({role:e.role,source:a,content:i})}function h(e,t,n){switch(e.type){case`text`:return[{type:`text`,text:g(e.text,t,n)}];case`reasoning`:return e.text.length===0?[]:[{type:`text`,text:g(`[Reasoning summary] ${e.text}`,t,n)}];case`image`:return[{type:`text`,text:g(`[Image input: ${e.source.kind}]`,t,n)}];case`document`:return[{type:`text`,text:g(`[Document input: ${e.filename??e.source.kind}]`,t,n)}];case`tool-call`:return[{...e,arguments:_(e.arguments,t,n)}];case`tool-result`:return[{...e,content:e.content.flatMap(e=>h(e,t,n))}];case`native-tool-call`:return[{type:`text`,text:g(`[Native tool ${e.name} (${e.status??`unknown`})] ${v(e.arguments??{})}`,t,n)}];default:return[{type:`text`,text:g(`[Unsupported content block: ${v(e)}]`,t,n)}]}}function g(e,t,n){let r=y(e,Math.max(0,Math.min(t,n.remaining)));return n.remaining-=r.length,r}function _(e,t,n){let r=Math.max(0,Math.min(t,n.remaining));return e.length<=r?(n.remaining-=e.length,e):19<=r?(n.remaining-=19,`{"_compacted":true}`):`{}`}function v(e){try{return JSON.stringify(e)??``}catch{return String(e)}}function y(e,t){if(e.length<=t)return e;if(t<=30)return e.slice(0,t);let n=Math.ceil((t-30)/2),r=Math.floor((t-30)/2);return e.slice(0,n)+`
4
4
  …[truncated for compaction]…
5
5
  `+e.slice(e.length-r)}function b(){return n()}function x(e){return e instanceof Error?e.message:String(e)}function S(e){return typeof e==`object`&&e&&`code`in e&&typeof e.code==`string`?e.code:void 0}function C(e){let t=JSON.stringify(e);if(t===void 0)throw TypeError(`compaction model payload is not JSON serializable`);return new TextEncoder().encode(t).byteLength}function w(e){let t=e?.usageStop;if(t!==void 0)throw T(`compaction cannot dispatch after a mandatory usage stop`,t.usageRequired?`USAGE_REQUIRED`:`USAGE_UNAVAILABLE`)}function T(e,t,n){let r=Error(e,n===void 0?void 0:{cause:n});return r.code=t,r}function E(e,t){return T(`compaction model operation exceeded ${e}ms`,`MODEL_TIMEOUT`,t)}async function D(e,t){if(t.aborted)throw e.catch(()=>void 0),t.reason??Error(`operation aborted`);return await new Promise((n,r)=>{let i=()=>{t.removeEventListener(`abort`,i),r(t.reason??Error(`operation aborted`))};t.addEventListener(`abort`,i,{once:!0}),e.then(e=>{t.removeEventListener(`abort`,i),n(e)},e=>{t.removeEventListener(`abort`,i),r(e)})})}function O(e){if(!(e.trigger!==`pressure`||e.thresholdTokens===void 0||e.estimatedTokensAfter<e.thresholdTokens))return e.estimatedNonCompactableTokens>=e.thresholdTokens?`unreachable-threshold`:e.estimatedTokensBefore-e.estimatedTokensAfter<Math.max(256,Math.ceil(e.estimatedTokensBefore*.01))?`low-savings`:void 0}export{f as COMPACTION_INSTRUCTION,p as ContextCompactor};
@@ -1 +1 @@
1
- {"version":3,"file":"compaction.js","names":[],"sources":["../../../src/agent/memory/compaction.ts"],"sourcesContent":["import { systemRandomId } from '../../platform/adapter.ts'\n/** Context-pressure compaction inspired by Codex checkpoints and deepseek-harness surface replacement. */\n\nimport type { CallConfig } from '../../contract/index.ts'\nimport type { ModelToolSchema } from '../../contract/index.ts'\nimport type { ContentBlock, ToolCallBlock, ToolResultBlock } from '../../message/index.ts'\nimport { createMessage, createUserMessage, type Message } from '../../message/index.ts'\nimport { ReasoningEffortId } from '../../primitives/index.ts'\nimport type { ModelRegistry } from '../../runtime/index.ts'\nimport { waitForSettlement } from '../../async/index.ts'\nimport { BlockAssembler } from '../../stream/index.ts'\nimport type { TokenUsage } from '../../stream/index.ts'\nimport type { History } from '../history/history.ts'\nimport { normalizeToolPairing } from '../history/normalize.ts'\nimport type {\n AgentMaintenanceEvent, BeforeStepContext, CompactionBackoffReason, CompactionTrigger, RequestErrorContext,\n} from '../loop/events.ts'\nimport type { AgentCompactionConfig } from './compaction-config.ts'\nimport { compactionAccounting } from './accounting-binding.ts'\nimport type { RunReport } from '../accounting/delivery-types.ts'\nimport { pruneToolResults, selectCompactablePrefix } from './surface-compaction.ts'\nimport { estimateContextTokens, estimateMessageTokens } from './token-estimator.ts'\n\nexport interface CompactionResult {\n readonly compactionId: string\n readonly trigger: CompactionTrigger\n readonly summary: string\n readonly shadowedSeqs: readonly number[]\n readonly estimatedTokensBefore: number\n readonly estimatedTokensAfter: number\n readonly thresholdTokens?: number\n readonly estimatedNonCompactableTokens: number\n readonly backoffReason?: CompactionBackoffReason\n readonly cooldownSteps?: number\n readonly provider: string\n readonly model: string\n readonly usage?: TokenUsage\n /** Additive runtime projection; absent on the preserved low-level compactor path. */\n readonly status?: 'completed'\n readonly report?: RunReport\n}\n\nexport interface ContextCompactorOptions {\n readonly registry: ModelRegistry\n /**\n * The call configuration in force RIGHT NOW, not when the compactor was built.\n *\n * A supplier rather than a value because a run may target a different model\n * than the session it belongs to: the context window a checkpoint is budgeted\n * against, and the model a summary is written by, both have to follow that\n * override or compaction would reason about a window nobody is calling.\n */\n readonly config: () => CallConfig\n readonly history: () => History\n readonly system: () => string\n readonly pinnedMessages?: () => readonly Message[]\n readonly tools: () => readonly ModelToolSchema[]\n readonly policy: AgentCompactionConfig\n}\n\ninterface ResolvedBudget {\n readonly thresholdTokens: number\n readonly retainTokens: number\n}\n\ninterface CharacterBudget { remaining: number }\n\nconst CHECKPOINT_PREAMBLE =\n 'This is an automatically generated checkpoint of earlier conversation context. Treat it as established background, preserve the original objective and constraints, and continue directly from the messages that follow.'\n\nconst MIN_PRESSURE_SAVINGS_TOKENS = 256\nconst MIN_PRESSURE_SAVINGS_RATIO = 0.01\nconst PRESSURE_BACKOFF_STEPS = 4\n\nexport const COMPACTION_INSTRUCTION = [\n 'You are performing a CONTEXT CHECKPOINT COMPACTION for a long-running AI agent task.',\n 'Condense the conversation above into a handoff that lets another model continue without forgetting the original purpose.',\n '',\n 'Output exactly these Markdown sections, in order, using terse bullets. Write \"(none)\" for an empty section.',\n '## Primary Request and Intent',\n '## Progress and Completed Work',\n '## Decisions and Rationale',\n '## Constraints and User Preferences',\n '## Important Files, Symbols, and Evidence',\n '## Errors and Failed Approaches',\n '## Pending Work',\n '## Current Work',\n '## Next Step',\n '## Critical Context',\n '',\n 'Preserve exact paths, identifiers, commands, error strings, numeric limits, and user corrections when they matter.',\n 'Under Important Files, mark relevant files as inspected or modified and preserve the exact declarations or findings needed next.',\n 'Under Current Work, record the last successful tool action, the latest verification result, and whether any edit is still partial.',\n 'Under Next Step, name one direct edit or command. Do not recommend rereading an unchanged file whose relevant contents are already recorded.',\n 'Do not reveal hidden chain-of-thought. Record only public progress, observed evidence, decisions, and actionable context.',\n 'If an earlier <compacted-summary> exists, merge still-valid facts with newer information and drop stale facts.',\n 'Output only the checkpoint. Do not call tools and do not acknowledge the compaction.',\n].join('\\n')\n\nexport class ContextCompactor {\n private readonly input: ContextCompactorOptions\n private active = false\n private overflowTurn = -1\n private overflowRetries = 0\n private recoveringOverflow = false\n /** Keyed by route + model + output reserve: an override changes all three. */\n private modelBudget: {\n readonly key: string\n readonly budget: { readonly contextWindow: number; readonly outputReserve: number } | null\n } | undefined\n private pressureCooldown = 0\n\n constructor(input: ContextCompactorOptions) {\n this.input = input\n }\n\n /** Fail-open pressure maintenance for a pre-step hook. */\n async beforeStep(context: BeforeStepContext): Promise<void> {\n if (!this.input.policy.auto || context.signal.aborted) return\n if (this.pressureCooldown > 0) {\n this.pressureCooldown--\n return\n }\n if (this.overflowTurn !== context.turn) {\n this.overflowTurn = context.turn\n this.overflowRetries = 0\n } else if (!this.recoveringOverflow) {\n this.overflowRetries = 0\n }\n this.recoveringOverflow = false\n try {\n let lastResult: CompactionResult | undefined\n for (let attempt = 0; attempt <= this.input.policy.compactionRetries; attempt++) {\n const result = await this.compactIfNeeded('pressure', context.signal, context.emit)\n if (result === null) break\n lastResult = result\n if (result.backoffReason !== undefined) {\n this.pressureCooldown = result.cooldownSteps ?? PRESSURE_BACKOFF_STEPS\n break\n }\n }\n if (lastResult !== undefined\n && lastResult.thresholdTokens !== undefined\n && lastResult.estimatedTokensAfter >= lastResult.thresholdTokens) {\n this.pressureCooldown = Math.max(\n this.pressureCooldown,\n PRESSURE_BACKOFF_STEPS,\n )\n }\n } catch {\n // Pressure maintenance is fail-open; the provider's canonical overflow\n // error still gets one forced recovery path below. Avoid retrying the same\n // broken maintenance request on every tool step and flooding logs/traces.\n // Mandatory usage decisions stay latched in the owning ledger and are\n // checked by modelRound after this hook, before any main dispatch.\n this.pressureCooldown = 2\n }\n }\n\n /** Compact and retry only when a provider confirmed context overflow. */\n async onRequestError(context: RequestErrorContext): Promise<'retry' | undefined> {\n if (context.failure.code !== 'CONTEXT_WINDOW_EXCEEDED' || context.signal.aborted) return undefined\n if (this.overflowTurn !== context.turn) {\n this.overflowTurn = context.turn\n this.overflowRetries = 0\n }\n if (this.overflowRetries >= this.input.policy.maxOverflowRetries) return undefined\n try {\n const result = await this.compactIfNeeded('context-overflow', context.signal, context.emit)\n if (result === null || context.signal.aborted) return undefined\n this.overflowRetries++\n this.recoveringOverflow = true\n return 'retry'\n } catch {\n return undefined\n }\n }\n\n /** Explicit idle-session checkpoint even below automatic pressure. */\n async compactNow(signal?: AbortSignal): Promise<CompactionResult | null> {\n const controller = signal === undefined ? new AbortController() : undefined\n const effectiveSignal = signal ?? controller?.signal\n if (effectiveSignal === undefined) throw new Error('failed to create compaction signal')\n return this.compactIfNeeded('manual', effectiveSignal)\n }\n\n private async compactIfNeeded(\n trigger: CompactionTrigger,\n signal: AbortSignal,\n emit?: (event: AgentMaintenanceEvent) => Promise<void>,\n ): Promise<CompactionResult | null> {\n if (this.active) return null\n const deadline = AbortSignal.timeout(this.input.policy.summaryTimeoutMs)\n const operationSignal = AbortSignal.any([signal, deadline])\n operationSignal.throwIfAborted()\n this.active = true\n try {\n const history = this.input.history()\n let surface = history.surface()\n if (surface.length < 2) return null\n const tools = this.input.tools()\n const system = this.input.system()\n const pinned = this.input.pinnedMessages?.() ?? []\n let totalBefore = estimateContextTokens({\n system, messages: [...pinned, ...surface.map(node => node.message)], tools,\n })\n let budget = await this.resolveBudget(totalBefore, operationSignal)\n operationSignal.throwIfAborted()\n if (trigger === 'pressure' && (budget === null || totalBefore < budget.thresholdTokens)) return null\n const pruned = pruneToolResults(history, surface, this.input.policy.maxToolResultChars)\n if (pruned > 0) {\n surface = history.surface()\n totalBefore = estimateContextTokens({\n system, messages: [...pinned, ...surface.map(node => node.message)], tools,\n })\n if (trigger === 'pressure' && budget !== null && totalBefore < budget.thresholdTokens) return null\n // With an absolute threshold and no provider context metadata, retainRatio\n // is inferred from the measured request. Pruning can change that request\n // by orders of magnitude, so selection must use the post-prune budget.\n budget = await this.resolveBudget(totalBefore, operationSignal)\n operationSignal.throwIfAborted()\n }\n const retainTokens = trigger === 'context-overflow'\n ? Math.max(1, estimateMessageTokens(surface.at(-1)?.message))\n : budget?.retainTokens ?? Math.max(1, Math.floor(totalBefore * 0.25))\n const selected = selectCompactablePrefix(surface, retainTokens)\n if (selected.length === 0) return null\n const selectedSeqs = new Set(selected.map(node => node.seq))\n const estimatedNonCompactableTokens = estimateContextTokens({\n system,\n messages: [\n ...pinned,\n ...surface.filter(node => !selectedSeqs.has(node.seq)).map(node => node.message),\n ],\n tools,\n })\n const compactionId = newCompactionId()\n const startedAt = new Date().toISOString()\n history.append({ kind: 'compaction-start', compactionId, trigger, at: startedAt })\n try {\n await this.emitObserver(emit, {\n type: 'compaction-start', compactionId, trigger, estimatedInputTokens: totalBefore,\n })\n const summarized = await this.summarize(\n [...pinned, ...selected.map(node => node.message)], system, tools, operationSignal,\n )\n // Adapters are contractually expected to honor cancellation, but the\n // compactor must not commit stale maintenance if one fails to do so.\n operationSignal.throwIfAborted()\n const checkpoint = createUserMessage({\n source: { kind: 'app', producer: `agent-compaction:${compactionId}` },\n content: [{\n type: 'text',\n text: `${CHECKPOINT_PREAMBLE}\\n\\n<compacted-summary>\\n${summarized.summary}\\n</compacted-summary>`,\n }],\n })\n const shadowedTokens = selected.reduce((total, node) => total + estimateMessageTokens(node.message), 0)\n const checkpointTokens = estimateMessageTokens(checkpoint)\n if (checkpointTokens >= shadowedTokens) {\n throw new Error(\n `compaction summary did not shrink selected context (${checkpointTokens} >= ${shadowedTokens} estimated tokens)`,\n )\n }\n const shadowedSeqs = Object.freeze(selected.map(node => node.seq))\n const estimatedTokensAfter = Math.max(0, totalBefore - shadowedTokens + checkpointTokens)\n const thresholdTokens = budget?.thresholdTokens\n const pressureBackoff = pressureBackoffReason({\n trigger,\n thresholdTokens,\n estimatedTokensBefore: totalBefore,\n estimatedTokensAfter,\n estimatedNonCompactableTokens,\n })\n history.appendBatch([\n { event: {\n kind: 'compaction-summary', compactionId, summary: summarized.summary, shadowedSeqs,\n estimatedTokensBefore: totalBefore, estimatedTokensAfter,\n provider: summarized.provider, model: summarized.model,\n ...(summarized.usage === undefined ? {} : { usage: summarized.usage }),\n } },\n { event: { kind: 'user', message: checkpoint }, surfaceOp: {\n op: 'replace',\n from: Math.min(...shadowedSeqs),\n to: Math.max(...shadowedSeqs),\n targets: shadowedSeqs,\n } },\n { event: {\n kind: 'compaction-end', compactionId, status: 'completed', at: new Date().toISOString(),\n ...(thresholdTokens === undefined ? {} : { thresholdTokens }),\n estimatedNonCompactableTokens,\n ...(pressureBackoff === undefined ? {} : {\n backoffReason: pressureBackoff,\n cooldownSteps: PRESSURE_BACKOFF_STEPS,\n }),\n } },\n ])\n const result: CompactionResult = Object.freeze({\n compactionId, trigger, summary: summarized.summary, shadowedSeqs,\n estimatedTokensBefore: totalBefore, estimatedTokensAfter,\n ...(thresholdTokens === undefined ? {} : { thresholdTokens }),\n estimatedNonCompactableTokens,\n ...(pressureBackoff === undefined ? {} : {\n backoffReason: pressureBackoff,\n cooldownSteps: PRESSURE_BACKOFF_STEPS,\n }),\n provider: summarized.provider, model: summarized.model,\n ...(summarized.usage === undefined ? {} : { usage: summarized.usage }),\n })\n await this.emitObserver(emit, {\n type: 'compaction-end', compactionId, trigger, status: 'completed', shadowedSeqs,\n estimatedTokensBefore: totalBefore, estimatedTokensAfter, summary: summarized.summary,\n ...(thresholdTokens === undefined ? {} : { thresholdTokens }),\n estimatedNonCompactableTokens,\n ...(pressureBackoff === undefined ? {} : {\n backoffReason: pressureBackoff,\n cooldownSteps: PRESSURE_BACKOFF_STEPS,\n }),\n ...(summarized.usage === undefined ? {} : { usage: summarized.usage }),\n })\n return result\n } catch (error: unknown) {\n const failure = deadline.aborted && !signal.aborted && errorCode(error) !== 'MODEL_TEARDOWN_TIMEOUT'\n ? modelTimeoutError(this.input.policy.summaryTimeoutMs, error)\n : error\n const message = errorMessage(failure)\n try {\n history.append({\n kind: 'compaction-end', compactionId, status: 'failed', at: new Date().toISOString(), error: message,\n })\n } catch {\n // Preserve the original compaction failure when the append-only history\n // has no remaining capacity for the diagnostic end marker.\n }\n await this.emitObserver(emit, {\n type: 'compaction-end', compactionId, trigger, status: 'failed', shadowedSeqs: [],\n estimatedTokensBefore: totalBefore, estimatedTokensAfter: totalBefore, error: message,\n })\n throw failure\n }\n } finally {\n this.active = false\n }\n }\n\n private async resolveBudget(totalTokens: number, signal: AbortSignal): Promise<ResolvedBudget | null> {\n const policy = this.input.policy\n const config = this.input.config()\n const key = `${config.provider}\\u0000${config.model}\\u0000${String(config.maxTokens ?? '')}`\n if (this.modelBudget?.key !== key) {\n try {\n const info = await raceWithSignal(this.input.registry.resolveModelInfo(\n config.provider, config.model, signal,\n ), signal)\n const contextWindow = info.context?.contextWindow\n this.modelBudget = { key, budget: contextWindow === undefined\n ? null\n : {\n contextWindow,\n outputReserve: config.maxTokens\n ?? info.defaultMaxTokens\n ?? info.maxOutputTokens\n ?? 0,\n } }\n } catch {\n if (policy.maxInputTokens === undefined) return null\n this.modelBudget = { key, budget: null }\n }\n }\n const contextWindow = this.modelBudget?.budget?.contextWindow\n const inputWindow = contextWindow === undefined\n ? undefined\n : Math.max(1, contextWindow - (this.modelBudget?.budget?.outputReserve ?? 0))\n const ratioThreshold = contextWindow === undefined\n ? undefined\n : Math.floor(contextWindow * policy.thresholdRatio)\n const safeThreshold = inputWindow === undefined || ratioThreshold === undefined\n ? undefined\n : Math.min(inputWindow, ratioThreshold)\n const thresholdTokens = policy.maxInputTokens === undefined\n ? safeThreshold\n : inputWindow === undefined\n ? policy.maxInputTokens\n : Math.min(policy.maxInputTokens, inputWindow)\n if (thresholdTokens === undefined) return null\n const inferredWindow = inputWindow ?? Math.max(totalTokens, Math.ceil(thresholdTokens / policy.thresholdRatio))\n const retainTokens = policy.retainTokens\n ?? Math.floor(inferredWindow * (policy.retainRatio ?? 0.2))\n return { thresholdTokens, retainTokens: Math.max(1, retainTokens) }\n }\n\n private async emitObserver(\n emit: ((event: AgentMaintenanceEvent) => Promise<void>) | undefined,\n event: AgentMaintenanceEvent,\n ): Promise<void> {\n if (emit === undefined) return\n const pending = Promise.resolve().then(() => emit(event))\n await waitForSettlement(pending, this.input.policy.teardownTimeoutMs)\n }\n\n private async summarize(\n messages: readonly Message[],\n system: string,\n tools: readonly ModelToolSchema[],\n signal: AbortSignal,\n ): Promise<{ summary: string; provider: string; model: string; usage?: TokenUsage }> {\n const policy = this.input.policy\n const active = this.input.config()\n const provider = policy.summarizationProvider ?? active.provider\n const model = policy.summarizationModel ?? active.model\n const accounting = compactionAccounting(this)\n assertUsageAdmission(accounting)\n const summaryInfo = await raceWithSignal(\n this.input.registry.resolveModelInfo(provider, model, signal),\n signal,\n )\n const maxSummaryTokens = Math.min(\n policy.maxSummaryTokens,\n summaryInfo.maxOutputTokens ?? Number.MAX_SAFE_INTEGER,\n summaryInfo.context === undefined\n ? Number.MAX_SAFE_INTEGER\n : Math.max(1, summaryInfo.context.contextWindow - 1),\n )\n const prepared = await raceWithSignal(this.input.registry.prepareCall({\n provider,\n model,\n ...(policy.summarizationEffort === undefined\n ? {}\n : { reasoningEffort: ReasoningEffortId(policy.summarizationEffort) }),\n maxTokens: maxSummaryTokens,\n }, signal, accounting?.modelInvocation), signal)\n // Compaction can encounter history written by an older runtime or a process\n // interrupted between a tool call and its result. Repair the replay just as\n // normal model requests do so a maintenance request cannot be provider-invalid.\n const characterBudget: CharacterBudget = { remaining: policy.maxSummaryRequestChars }\n const replay = normalizeToolPairing(messages)\n .map(message => sanitizeForSummary(message, policy.maxSummaryInputChars, characterBudget))\n const instruction = createUserMessage({\n source: { kind: 'app', producer: 'agent-compaction' },\n content: [{ type: 'text', text: COMPACTION_INSTRUCTION }],\n })\n const assembler = new BlockAssembler()\n const request = {\n ...prepared.config,\n messages: [...replay, instruction],\n ...(system.length === 0 ? {} : { system }),\n ...(tools.length === 0 ? {} : { tools }),\n toolChoice: 'none',\n signal,\n } as const\n const { signal: _signal, ...serializableRequest } = request\n if (serializedBytes(serializableRequest) > policy.maxSummaryRequestBytes) {\n throw codedError(\n `compaction summary request exceeds the ${policy.maxSummaryRequestBytes}-byte limit`,\n 'MODEL_REQUEST_TOO_LARGE',\n )\n }\n assertUsageAdmission(accounting)\n const handle = prepared.stream(request, accounting?.modelInvocation)\n const iterator = handle[Symbol.asyncIterator]()\n let exhausted = false\n let events = 0\n let responseBytes = 0\n let sawFinish = false\n let failure: unknown\n try {\n while (true) {\n const next = await raceWithSignal(iterator.next(), signal)\n if (next.done === true) {\n exhausted = true\n break\n }\n events++\n responseBytes += serializedBytes(next.value)\n if (events > policy.maxSummaryStreamEvents\n || responseBytes > policy.maxSummaryResponseBytes) {\n throw codedError('compaction summary response exceeded its resource limit', 'MODEL_RESPONSE_TOO_LARGE')\n }\n if (sawFinish) {\n throw codedError('compaction summarizer emitted data after its terminal finish chunk', 'INVALID_MODEL_STREAM')\n }\n assembler.push(next.value)\n if (next.value.type === 'finish') sawFinish = true\n }\n } catch (error: unknown) {\n failure = error\n } finally {\n if (!exhausted) {\n const close = iterator.return?.bind(iterator)\n if (close !== undefined) {\n try {\n const closing = Promise.resolve().then(async () => { await close() })\n if (!await waitForSettlement(closing, policy.teardownTimeoutMs)) failure = codedError(\n `compaction model stream ignored cancellation for more than ${policy.teardownTimeoutMs}ms`,\n 'MODEL_TEARDOWN_TIMEOUT',\n )\n } catch (error: unknown) { failure ??= error }\n }\n }\n }\n try {\n const report = await handle.report\n const decision = await accounting?.recordModelCall(report, request)\n if (decision?.usageRequired === true) {\n failure ??= codedError('compaction model usage is required by the configured run policy', 'USAGE_REQUIRED')\n }\n if (decision?.usageUnavailable === true) {\n failure ??= codedError('compaction model usage is unavailable for the configured budget', 'USAGE_UNAVAILABLE')\n }\n } catch (error: unknown) { failure ??= error }\n if (failure !== undefined) throw failure\n const finish = assembler.finish\n if (finish.kind === 'error' || finish.kind === 'aborted') {\n const error = new Error(finish.failure.message) as Error & { code?: string }\n error.code = finish.failure.code\n throw error\n }\n if (finish.kind === 'max-tokens') throw new Error('compaction summary was truncated at maxSummaryTokens')\n if (finish.kind === 'tool-calls') throw new Error('compaction summarizer attempted a tool call')\n const summary = assembler.blocks().flatMap(block => block.type === 'text' ? [block.text] : []).join('\\n').trim()\n if (summary.length === 0) throw new Error('compaction summarizer produced no text')\n return {\n summary, provider, model,\n ...(assembler.usage === undefined ? {} : { usage: assembler.usage }),\n }\n }\n}\n\nfunction sanitizeForSummary(\n message: Message,\n maxChars: number,\n budget: CharacterBudget,\n): Message {\n const content = message.content.flatMap(block => sanitizeBlock(block, maxChars, budget))\n const source = message.source.kind === 'model'\n ? { kind: 'model' as const, provider: message.source.provider, model: message.source.model }\n : message.source\n return createMessage({ role: message.role, source, content })\n}\n\nfunction sanitizeBlock(\n block: ContentBlock,\n maxChars: number,\n budget: CharacterBudget,\n): ContentBlock[] {\n switch (block.type) {\n case 'text': return [{ type: 'text', text: boundedText(block.text, maxChars, budget) }]\n case 'reasoning': return block.text.length === 0 ? [] : [{\n type: 'text', text: boundedText(`[Reasoning summary] ${block.text}`, maxChars, budget),\n }]\n case 'image': return [{ type: 'text', text: boundedText(`[Image input: ${block.source.kind}]`, maxChars, budget) }]\n case 'document': return [{\n type: 'text',\n text: boundedText(`[Document input: ${block.filename ?? block.source.kind}]`, maxChars, budget),\n }]\n case 'tool-call': return [{\n ...block, arguments: boundedToolArguments(block.arguments, maxChars, budget),\n } satisfies ToolCallBlock]\n case 'tool-result': return [{\n ...block,\n content: block.content.flatMap(child => sanitizeBlock(child, maxChars, budget)),\n } satisfies ToolResultBlock]\n case 'native-tool-call': return [{\n type: 'text',\n text: boundedText(\n `[Native tool ${block.name} (${block.status ?? 'unknown'})] ${safeJson(block.arguments ?? {})}`,\n maxChars,\n budget,\n ),\n }]\n default: return [{\n type: 'text', text: boundedText(`[Unsupported content block: ${safeJson(block)}]`, maxChars, budget),\n }]\n }\n}\n\nfunction boundedText(value: string, maxChars: number, budget: CharacterBudget): string {\n const allowed = Math.max(0, Math.min(maxChars, budget.remaining))\n const result = truncateMiddle(value, allowed)\n budget.remaining -= result.length\n return result\n}\n\nfunction boundedToolArguments(value: string, maxChars: number, budget: CharacterBudget): string {\n const allowed = Math.max(0, Math.min(maxChars, budget.remaining))\n if (value.length <= allowed) {\n budget.remaining -= value.length\n return value\n }\n const placeholder = '{\"_compacted\":true}'\n if (placeholder.length <= allowed) {\n budget.remaining -= placeholder.length\n return placeholder\n }\n return '{}'\n}\n\nfunction safeJson(value: unknown): string {\n try { return JSON.stringify(value) ?? '' } catch { return String(value) }\n}\nfunction truncateMiddle(value: string, maxChars: number): string {\n if (value.length <= maxChars) return value\n const marker = '\\n…[truncated for compaction]…\\n'\n if (maxChars <= marker.length) return value.slice(0, maxChars)\n const head = Math.ceil((maxChars - marker.length) / 2)\n const tail = Math.floor((maxChars - marker.length) / 2)\n return value.slice(0, head) + marker + value.slice(value.length - tail)\n}\nfunction newCompactionId(): string {\n return systemRandomId()\n}\nfunction errorMessage(error: unknown): string { return error instanceof Error ? error.message : String(error) }\nfunction errorCode(error: unknown): string | undefined {\n return typeof error === 'object' && error !== null && 'code' in error && typeof error.code === 'string'\n ? error.code\n : undefined\n}\n\nfunction serializedBytes(value: unknown): number {\n const serialized = JSON.stringify(value)\n if (serialized === undefined) throw new TypeError('compaction model payload is not JSON serializable')\n return new TextEncoder().encode(serialized).byteLength\n}\n\nfunction assertUsageAdmission(accounting: ReturnType<typeof compactionAccounting>): void {\n const stop = accounting?.usageStop\n if (stop !== undefined) throw codedError(\n 'compaction cannot dispatch after a mandatory usage stop',\n stop.usageRequired ? 'USAGE_REQUIRED' : 'USAGE_UNAVAILABLE',\n )\n}\n\nfunction codedError(message: string, code: string, cause?: unknown): Error & { code: string } {\n const error = new Error(message, cause === undefined ? undefined : { cause }) as Error & { code: string }\n error.code = code\n return error\n}\n\nfunction modelTimeoutError(timeoutMs: number, cause: unknown): Error & { code: string } {\n return codedError(`compaction model operation exceeded ${timeoutMs}ms`, 'MODEL_TIMEOUT', cause)\n}\n\nasync function raceWithSignal<T>(pending: Promise<T>, signal: AbortSignal): Promise<T> {\n if (signal.aborted) {\n void pending.catch(() => undefined)\n throw signal.reason ?? new Error('operation aborted')\n }\n return await new Promise<T>((resolve, reject) => {\n const onAbort = () => {\n signal.removeEventListener('abort', onAbort)\n reject(signal.reason ?? new Error('operation aborted'))\n }\n signal.addEventListener('abort', onAbort, { once: true })\n void pending.then(\n value => {\n signal.removeEventListener('abort', onAbort)\n resolve(value)\n },\n error => {\n signal.removeEventListener('abort', onAbort)\n reject(error)\n },\n )\n })\n}\n\nfunction pressureBackoffReason(input: {\n readonly trigger: CompactionTrigger\n readonly thresholdTokens: number | undefined\n readonly estimatedTokensBefore: number\n readonly estimatedTokensAfter: number\n readonly estimatedNonCompactableTokens: number\n}): CompactionBackoffReason | undefined {\n if (input.trigger !== 'pressure' || input.thresholdTokens === undefined\n || input.estimatedTokensAfter < input.thresholdTokens) return undefined\n if (input.estimatedNonCompactableTokens >= input.thresholdTokens) {\n return 'unreachable-threshold'\n }\n const savings = input.estimatedTokensBefore - input.estimatedTokensAfter\n const minimum = Math.max(\n MIN_PRESSURE_SAVINGS_TOKENS,\n Math.ceil(input.estimatedTokensBefore * MIN_PRESSURE_SAVINGS_RATIO),\n )\n return savings < minimum ? 'low-savings' : undefined\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"compaction.js","names":[],"sources":["../../../src/agent/memory/compaction.ts"],"sourcesContent":["import { systemRandomId } from '../../platform/adapter.ts'\n/** Context-pressure compaction inspired by Codex checkpoints and deepseek-harness surface replacement. */\n\nimport type { CallConfig } from '../../contract/index.ts'\nimport type { ModelToolSchema } from '../../contract/index.ts'\nimport type { ContentBlock, ToolCallBlock, ToolResultBlock } from '../../message/index.ts'\nimport { createMessage, createUserMessage, type Message } from '../../message/index.ts'\nimport { ReasoningEffortId } from '../../primitives/index.ts'\nimport type { ModelRegistry } from '../../runtime/index.ts'\nimport { waitForSettlement } from '../../async/index.ts'\nimport { BlockAssembler } from '../../stream/index.ts'\nimport type { TokenUsage } from '../../stream/index.ts'\nimport type { History } from '../history/history.ts'\nimport { normalizeToolPairing } from '../history/normalize.ts'\nimport type {\n AgentMaintenanceEvent, BeforeStepContext, CompactionBackoffReason, CompactionTrigger, RequestErrorContext,\n} from '../loop/events.ts'\nimport type { AgentCompactionConfig } from './compaction-config.ts'\nimport { compactionAccounting } from './accounting-binding.ts'\nimport type { RunReport } from '../accounting/delivery-types.ts'\nimport { pruneToolResults, selectCompactablePrefix } from './surface-compaction.ts'\nimport { estimateContextTokens, estimateMessageTokens } from './token-estimator.ts'\n\nexport interface CompactionResult {\n readonly compactionId: string\n readonly trigger: CompactionTrigger\n readonly summary: string\n readonly shadowedSeqs: readonly number[]\n readonly estimatedTokensBefore: number\n readonly estimatedTokensAfter: number\n readonly thresholdTokens?: number\n readonly estimatedNonCompactableTokens: number\n readonly backoffReason?: CompactionBackoffReason\n readonly cooldownSteps?: number\n readonly provider: string\n readonly model: string\n readonly usage?: TokenUsage\n /** Additive runtime projection; absent on the preserved low-level compactor path. */\n readonly status?: 'completed'\n readonly report?: RunReport\n}\n\nexport interface ContextCompactorOptions {\n readonly registry: ModelRegistry\n /**\n * The call configuration in force RIGHT NOW, not when the compactor was built.\n *\n * A supplier rather than a value because a run may target a different model\n * than the session it belongs to: the context window a checkpoint is budgeted\n * against, and the model a summary is written by, both have to follow that\n * override or compaction would reason about a window nobody is calling.\n */\n readonly config: () => CallConfig\n readonly history: () => History\n readonly system: () => string\n readonly pinnedMessages?: () => readonly Message[]\n readonly tools: () => readonly ModelToolSchema[]\n readonly policy: AgentCompactionConfig\n}\n\ninterface ResolvedBudget {\n readonly thresholdTokens: number\n readonly retainTokens: number\n}\n\ninterface CharacterBudget { remaining: number }\n\nconst CHECKPOINT_PREAMBLE =\n 'This is an automatically generated checkpoint of earlier conversation context. Treat it as established background, preserve the original objective and constraints, and continue directly from the messages that follow.'\n\nconst MIN_PRESSURE_SAVINGS_TOKENS = 256\nconst MIN_PRESSURE_SAVINGS_RATIO = 0.01\nconst PRESSURE_BACKOFF_STEPS = 4\n\nexport const COMPACTION_INSTRUCTION = [\n 'You are performing a CONTEXT CHECKPOINT COMPACTION for a long-running AI agent task.',\n 'Condense the conversation above into a handoff that lets another model continue without forgetting the original purpose.',\n '',\n 'Output exactly these Markdown sections, in order, using terse bullets. Write \"(none)\" for an empty section.',\n '## Primary Request and Intent',\n '## Progress and Completed Work',\n '## Decisions and Rationale',\n '## Constraints and User Preferences',\n '## Important Files, Symbols, and Evidence',\n '## Errors and Failed Approaches',\n '## Pending Work',\n '## Current Work',\n '## Next Step',\n '## Critical Context',\n '',\n 'Preserve exact paths, identifiers, commands, error strings, numeric limits, and user corrections when they matter.',\n 'Under Important Files, mark relevant files as inspected or modified and preserve the exact declarations or findings needed next.',\n 'Under Current Work, record the last successful tool action, the latest verification result, and whether any edit is still partial.',\n 'Under Next Step, name one direct edit or command. Do not recommend rereading an unchanged file whose relevant contents are already recorded.',\n 'Do not reveal hidden chain-of-thought. Record only public progress, observed evidence, decisions, and actionable context.',\n 'If an earlier <compacted-summary> exists, merge still-valid facts with newer information and drop stale facts.',\n 'Output only the checkpoint. Do not call tools and do not acknowledge the compaction.',\n].join('\\n')\n\nexport class ContextCompactor {\n private readonly input: ContextCompactorOptions\n private active = false\n private overflowTurn = -1\n private overflowRetries = 0\n private recoveringOverflow = false\n /** Keyed by route + model + output reserve: an override changes all three. */\n private modelBudget: {\n readonly key: string\n readonly budget: { readonly contextWindow: number; readonly outputReserve: number } | null\n } | undefined\n private pressureCooldown = 0\n\n constructor(input: ContextCompactorOptions) {\n this.input = input\n }\n\n /** Fail-open pressure maintenance for a pre-step hook. */\n async beforeStep(context: BeforeStepContext): Promise<void> {\n if (!this.input.policy.auto || context.signal.aborted) return\n if (this.pressureCooldown > 0) {\n this.pressureCooldown--\n return\n }\n if (this.overflowTurn !== context.turn) {\n this.overflowTurn = context.turn\n this.overflowRetries = 0\n } else if (!this.recoveringOverflow) {\n this.overflowRetries = 0\n }\n this.recoveringOverflow = false\n try {\n let lastResult: CompactionResult | undefined\n for (let attempt = 0; attempt <= this.input.policy.compactionRetries; attempt++) {\n const result = await this.compactIfNeeded('pressure', context.signal, context.emit)\n if (result === null) break\n lastResult = result\n if (result.backoffReason !== undefined) {\n this.pressureCooldown = result.cooldownSteps ?? PRESSURE_BACKOFF_STEPS\n break\n }\n }\n if (lastResult !== undefined\n && lastResult.thresholdTokens !== undefined\n && lastResult.estimatedTokensAfter >= lastResult.thresholdTokens) {\n this.pressureCooldown = Math.max(\n this.pressureCooldown,\n PRESSURE_BACKOFF_STEPS,\n )\n }\n } catch {\n // Pressure maintenance is fail-open; the provider's canonical overflow\n // error still gets one forced recovery path below. Avoid retrying the same\n // broken maintenance request on every tool step and flooding logs/traces.\n // Mandatory usage decisions stay latched in the owning ledger and are\n // checked by modelRound after this hook, before any main dispatch.\n this.pressureCooldown = 2\n }\n }\n\n /** Compact and retry only when a provider confirmed context overflow. */\n async onRequestError(context: RequestErrorContext): Promise<'retry' | undefined> {\n if (context.failure.code !== 'CONTEXT_WINDOW_EXCEEDED' || context.signal.aborted) return undefined\n if (this.overflowTurn !== context.turn) {\n this.overflowTurn = context.turn\n this.overflowRetries = 0\n }\n if (this.overflowRetries >= this.input.policy.maxOverflowRetries) return undefined\n try {\n const result = await this.compactIfNeeded('context-overflow', context.signal, context.emit)\n if (result === null || context.signal.aborted) return undefined\n this.overflowRetries++\n this.recoveringOverflow = true\n return 'retry'\n } catch {\n return undefined\n }\n }\n\n /** Explicit idle-session checkpoint even below automatic pressure. */\n async compactNow(signal?: AbortSignal): Promise<CompactionResult | null> {\n const controller = signal === undefined ? new AbortController() : undefined\n const effectiveSignal = signal ?? controller?.signal\n if (effectiveSignal === undefined) throw new Error('failed to create compaction signal')\n return this.compactIfNeeded('manual', effectiveSignal)\n }\n\n private async compactIfNeeded(\n trigger: CompactionTrigger,\n signal: AbortSignal,\n emit?: (event: AgentMaintenanceEvent) => Promise<void>,\n ): Promise<CompactionResult | null> {\n if (this.active) return null\n const deadline = AbortSignal.timeout(this.input.policy.summaryTimeoutMs)\n const operationSignal = AbortSignal.any([signal, deadline])\n operationSignal.throwIfAborted()\n this.active = true\n try {\n const history = this.input.history()\n let surface = history.surface()\n if (surface.length < 2) return null\n const tools = this.input.tools()\n const system = this.input.system()\n const pinned = this.input.pinnedMessages?.() ?? []\n let totalBefore = estimateContextTokens({\n system, messages: [...pinned, ...surface.map(node => node.message)], tools,\n })\n let budget = await this.resolveBudget(totalBefore, operationSignal)\n operationSignal.throwIfAborted()\n if (trigger === 'pressure' && (budget === null || totalBefore < budget.thresholdTokens)) return null\n const pruned = pruneToolResults(history, surface, this.input.policy.maxToolResultChars)\n if (pruned > 0) {\n surface = history.surface()\n totalBefore = estimateContextTokens({\n system, messages: [...pinned, ...surface.map(node => node.message)], tools,\n })\n if (trigger === 'pressure' && budget !== null && totalBefore < budget.thresholdTokens) return null\n // With an absolute threshold and no provider context metadata, retainRatio\n // is inferred from the measured request. Pruning can change that request\n // by orders of magnitude, so selection must use the post-prune budget.\n budget = await this.resolveBudget(totalBefore, operationSignal)\n operationSignal.throwIfAborted()\n }\n const retainTokens = trigger === 'context-overflow'\n ? Math.max(1, estimateMessageTokens(surface.at(-1)?.message))\n : budget?.retainTokens ?? Math.max(1, Math.floor(totalBefore * 0.25))\n const selected = selectCompactablePrefix(surface, retainTokens)\n if (selected.length === 0) return null\n const selectedSeqs = new Set(selected.map(node => node.seq))\n const estimatedNonCompactableTokens = estimateContextTokens({\n system,\n messages: [\n ...pinned,\n ...surface.filter(node => !selectedSeqs.has(node.seq)).map(node => node.message),\n ],\n tools,\n })\n const compactionId = newCompactionId()\n const startedAt = new Date().toISOString()\n history.append({ kind: 'compaction-start', compactionId, trigger, at: startedAt })\n try {\n await this.emitObserver(emit, {\n type: 'compaction-start', compactionId, trigger, estimatedInputTokens: totalBefore,\n })\n const summarized = await this.summarize(\n [...pinned, ...selected.map(node => node.message)], system, tools, operationSignal,\n )\n // Adapters are contractually expected to honor cancellation, but the\n // compactor must not commit stale maintenance if one fails to do so.\n operationSignal.throwIfAborted()\n const checkpoint = createUserMessage({\n source: { kind: 'app', producer: `agent-compaction:${compactionId}` },\n content: [{\n type: 'text',\n text: `${CHECKPOINT_PREAMBLE}\\n\\n<compacted-summary>\\n${summarized.summary}\\n</compacted-summary>`,\n }],\n })\n const shadowedTokens = selected.reduce((total, node) => total + estimateMessageTokens(node.message), 0)\n const checkpointTokens = estimateMessageTokens(checkpoint)\n if (checkpointTokens >= shadowedTokens) {\n throw new Error(\n `compaction summary did not shrink selected context (${checkpointTokens} >= ${shadowedTokens} estimated tokens)`,\n )\n }\n const shadowedSeqs = Object.freeze(selected.map(node => node.seq))\n const estimatedTokensAfter = Math.max(0, totalBefore - shadowedTokens + checkpointTokens)\n const thresholdTokens = budget?.thresholdTokens\n const pressureBackoff = pressureBackoffReason({\n trigger,\n thresholdTokens,\n estimatedTokensBefore: totalBefore,\n estimatedTokensAfter,\n estimatedNonCompactableTokens,\n })\n history.appendBatch([\n { event: {\n kind: 'compaction-summary', compactionId, summary: summarized.summary, shadowedSeqs,\n estimatedTokensBefore: totalBefore, estimatedTokensAfter,\n provider: summarized.provider, model: summarized.model,\n ...(summarized.usage === undefined ? {} : { usage: summarized.usage }),\n } },\n { event: { kind: 'user', message: checkpoint }, surfaceOp: {\n op: 'replace',\n from: Math.min(...shadowedSeqs),\n to: Math.max(...shadowedSeqs),\n targets: shadowedSeqs,\n } },\n { event: {\n kind: 'compaction-end', compactionId, status: 'completed', at: new Date().toISOString(),\n ...(thresholdTokens === undefined ? {} : { thresholdTokens }),\n estimatedNonCompactableTokens,\n ...(pressureBackoff === undefined ? {} : {\n backoffReason: pressureBackoff,\n cooldownSteps: PRESSURE_BACKOFF_STEPS,\n }),\n } },\n ])\n const result: CompactionResult = Object.freeze({\n compactionId, trigger, summary: summarized.summary, shadowedSeqs,\n estimatedTokensBefore: totalBefore, estimatedTokensAfter,\n ...(thresholdTokens === undefined ? {} : { thresholdTokens }),\n estimatedNonCompactableTokens,\n ...(pressureBackoff === undefined ? {} : {\n backoffReason: pressureBackoff,\n cooldownSteps: PRESSURE_BACKOFF_STEPS,\n }),\n provider: summarized.provider, model: summarized.model,\n ...(summarized.usage === undefined ? {} : { usage: summarized.usage }),\n })\n await this.emitObserver(emit, {\n type: 'compaction-end', compactionId, trigger, status: 'completed', shadowedSeqs,\n estimatedTokensBefore: totalBefore, estimatedTokensAfter, summary: summarized.summary,\n ...(thresholdTokens === undefined ? {} : { thresholdTokens }),\n estimatedNonCompactableTokens,\n ...(pressureBackoff === undefined ? {} : {\n backoffReason: pressureBackoff,\n cooldownSteps: PRESSURE_BACKOFF_STEPS,\n }),\n ...(summarized.usage === undefined ? {} : { usage: summarized.usage }),\n })\n return result\n } catch (error: unknown) {\n const failure = deadline.aborted && !signal.aborted && errorCode(error) !== 'MODEL_TEARDOWN_TIMEOUT'\n ? modelTimeoutError(this.input.policy.summaryTimeoutMs, error)\n : error\n const message = errorMessage(failure)\n try {\n history.append({\n kind: 'compaction-end', compactionId, status: 'failed', at: new Date().toISOString(), error: message,\n })\n } catch {\n // Preserve the original compaction failure when the append-only history\n // has no remaining capacity for the diagnostic end marker.\n }\n await this.emitObserver(emit, {\n type: 'compaction-end', compactionId, trigger, status: 'failed', shadowedSeqs: [],\n estimatedTokensBefore: totalBefore, estimatedTokensAfter: totalBefore, error: message,\n })\n throw failure\n }\n } finally {\n this.active = false\n }\n }\n\n private async resolveBudget(totalTokens: number, signal: AbortSignal): Promise<ResolvedBudget | null> {\n const policy = this.input.policy\n const config = this.input.config()\n const key = `${config.provider}\\u0000${config.model}\\u0000${String(config.maxTokens ?? '')}`\n if (this.modelBudget?.key !== key) {\n try {\n const info = await raceWithSignal(this.input.registry.resolveModelInfo(\n config.provider, config.model, signal,\n ), signal)\n // The agent tier (CallConfig.contextWindow) wins over the model's own\n // resolved value, same precedence `resolveCallWithModelInfo` applies\n // at dispatch — this budget must agree with what actually gets sent.\n const contextWindow = config.contextWindow ?? info.context?.contextWindow\n this.modelBudget = { key, budget: contextWindow === undefined\n ? null\n : {\n contextWindow,\n outputReserve: config.maxTokens\n ?? info.defaultMaxTokens\n ?? info.maxOutputTokens\n ?? 0,\n } }\n } catch {\n if (policy.maxInputTokens === undefined) return null\n this.modelBudget = { key, budget: null }\n }\n }\n const contextWindow = this.modelBudget?.budget?.contextWindow\n const inputWindow = contextWindow === undefined\n ? undefined\n : Math.max(1, contextWindow - (this.modelBudget?.budget?.outputReserve ?? 0))\n const ratioThreshold = contextWindow === undefined\n ? undefined\n : Math.floor(contextWindow * policy.thresholdRatio)\n const safeThreshold = inputWindow === undefined || ratioThreshold === undefined\n ? undefined\n : Math.min(inputWindow, ratioThreshold)\n const thresholdTokens = policy.maxInputTokens === undefined\n ? safeThreshold\n : inputWindow === undefined\n ? policy.maxInputTokens\n : Math.min(policy.maxInputTokens, inputWindow)\n if (thresholdTokens === undefined) return null\n const inferredWindow = inputWindow ?? Math.max(totalTokens, Math.ceil(thresholdTokens / policy.thresholdRatio))\n const retainTokens = policy.retainTokens\n ?? Math.floor(inferredWindow * (policy.retainRatio ?? 0.2))\n return { thresholdTokens, retainTokens: Math.max(1, retainTokens) }\n }\n\n private async emitObserver(\n emit: ((event: AgentMaintenanceEvent) => Promise<void>) | undefined,\n event: AgentMaintenanceEvent,\n ): Promise<void> {\n if (emit === undefined) return\n const pending = Promise.resolve().then(() => emit(event))\n await waitForSettlement(pending, this.input.policy.teardownTimeoutMs)\n }\n\n private async summarize(\n messages: readonly Message[],\n system: string,\n tools: readonly ModelToolSchema[],\n signal: AbortSignal,\n ): Promise<{ summary: string; provider: string; model: string; usage?: TokenUsage }> {\n const policy = this.input.policy\n const active = this.input.config()\n const provider = policy.summarizationProvider ?? active.provider\n const model = policy.summarizationModel ?? active.model\n const accounting = compactionAccounting(this)\n assertUsageAdmission(accounting)\n const summaryInfo = await raceWithSignal(\n this.input.registry.resolveModelInfo(provider, model, signal),\n signal,\n )\n const maxSummaryTokens = Math.min(\n policy.maxSummaryTokens,\n summaryInfo.maxOutputTokens ?? Number.MAX_SAFE_INTEGER,\n summaryInfo.context === undefined\n ? Number.MAX_SAFE_INTEGER\n : Math.max(1, summaryInfo.context.contextWindow - 1),\n )\n const prepared = await raceWithSignal(this.input.registry.prepareCall({\n provider,\n model,\n ...(policy.summarizationEffort === undefined\n ? {}\n : { reasoningEffort: ReasoningEffortId(policy.summarizationEffort) }),\n maxTokens: maxSummaryTokens,\n }, signal, accounting?.modelInvocation), signal)\n // Compaction can encounter history written by an older runtime or a process\n // interrupted between a tool call and its result. Repair the replay just as\n // normal model requests do so a maintenance request cannot be provider-invalid.\n const characterBudget: CharacterBudget = { remaining: policy.maxSummaryRequestChars }\n const replay = normalizeToolPairing(messages)\n .map(message => sanitizeForSummary(message, policy.maxSummaryInputChars, characterBudget))\n const instruction = createUserMessage({\n source: { kind: 'app', producer: 'agent-compaction' },\n content: [{ type: 'text', text: COMPACTION_INSTRUCTION }],\n })\n const assembler = new BlockAssembler()\n const request = {\n ...prepared.config,\n messages: [...replay, instruction],\n ...(system.length === 0 ? {} : { system }),\n ...(tools.length === 0 ? {} : { tools }),\n toolChoice: 'none',\n signal,\n } as const\n const { signal: _signal, ...serializableRequest } = request\n if (serializedBytes(serializableRequest) > policy.maxSummaryRequestBytes) {\n throw codedError(\n `compaction summary request exceeds the ${policy.maxSummaryRequestBytes}-byte limit`,\n 'MODEL_REQUEST_TOO_LARGE',\n )\n }\n assertUsageAdmission(accounting)\n const handle = prepared.stream(request, accounting?.modelInvocation)\n const iterator = handle[Symbol.asyncIterator]()\n let exhausted = false\n let events = 0\n let responseBytes = 0\n let sawFinish = false\n let failure: unknown\n try {\n while (true) {\n const next = await raceWithSignal(iterator.next(), signal)\n if (next.done === true) {\n exhausted = true\n break\n }\n events++\n responseBytes += serializedBytes(next.value)\n if (events > policy.maxSummaryStreamEvents\n || responseBytes > policy.maxSummaryResponseBytes) {\n throw codedError('compaction summary response exceeded its resource limit', 'MODEL_RESPONSE_TOO_LARGE')\n }\n if (sawFinish) {\n throw codedError('compaction summarizer emitted data after its terminal finish chunk', 'INVALID_MODEL_STREAM')\n }\n assembler.push(next.value)\n if (next.value.type === 'finish') sawFinish = true\n }\n } catch (error: unknown) {\n failure = error\n } finally {\n if (!exhausted) {\n const close = iterator.return?.bind(iterator)\n if (close !== undefined) {\n try {\n const closing = Promise.resolve().then(async () => { await close() })\n if (!await waitForSettlement(closing, policy.teardownTimeoutMs)) failure = codedError(\n `compaction model stream ignored cancellation for more than ${policy.teardownTimeoutMs}ms`,\n 'MODEL_TEARDOWN_TIMEOUT',\n )\n } catch (error: unknown) { failure ??= error }\n }\n }\n }\n try {\n const report = await handle.report\n const decision = await accounting?.recordModelCall(report, request)\n if (decision?.usageRequired === true) {\n failure ??= codedError('compaction model usage is required by the configured run policy', 'USAGE_REQUIRED')\n }\n if (decision?.usageUnavailable === true) {\n failure ??= codedError('compaction model usage is unavailable for the configured budget', 'USAGE_UNAVAILABLE')\n }\n } catch (error: unknown) { failure ??= error }\n if (failure !== undefined) throw failure\n const finish = assembler.finish\n if (finish.kind === 'error' || finish.kind === 'aborted') {\n const error = new Error(finish.failure.message) as Error & { code?: string }\n error.code = finish.failure.code\n throw error\n }\n if (finish.kind === 'max-tokens') throw new Error('compaction summary was truncated at maxSummaryTokens')\n if (finish.kind === 'tool-calls') throw new Error('compaction summarizer attempted a tool call')\n const summary = assembler.blocks().flatMap(block => block.type === 'text' ? [block.text] : []).join('\\n').trim()\n if (summary.length === 0) throw new Error('compaction summarizer produced no text')\n return {\n summary, provider, model,\n ...(assembler.usage === undefined ? {} : { usage: assembler.usage }),\n }\n }\n}\n\nfunction sanitizeForSummary(\n message: Message,\n maxChars: number,\n budget: CharacterBudget,\n): Message {\n const content = message.content.flatMap(block => sanitizeBlock(block, maxChars, budget))\n const source = message.source.kind === 'model'\n ? { kind: 'model' as const, provider: message.source.provider, model: message.source.model }\n : message.source\n return createMessage({ role: message.role, source, content })\n}\n\nfunction sanitizeBlock(\n block: ContentBlock,\n maxChars: number,\n budget: CharacterBudget,\n): ContentBlock[] {\n switch (block.type) {\n case 'text': return [{ type: 'text', text: boundedText(block.text, maxChars, budget) }]\n case 'reasoning': return block.text.length === 0 ? [] : [{\n type: 'text', text: boundedText(`[Reasoning summary] ${block.text}`, maxChars, budget),\n }]\n case 'image': return [{ type: 'text', text: boundedText(`[Image input: ${block.source.kind}]`, maxChars, budget) }]\n case 'document': return [{\n type: 'text',\n text: boundedText(`[Document input: ${block.filename ?? block.source.kind}]`, maxChars, budget),\n }]\n case 'tool-call': return [{\n ...block, arguments: boundedToolArguments(block.arguments, maxChars, budget),\n } satisfies ToolCallBlock]\n case 'tool-result': return [{\n ...block,\n content: block.content.flatMap(child => sanitizeBlock(child, maxChars, budget)),\n } satisfies ToolResultBlock]\n case 'native-tool-call': return [{\n type: 'text',\n text: boundedText(\n `[Native tool ${block.name} (${block.status ?? 'unknown'})] ${safeJson(block.arguments ?? {})}`,\n maxChars,\n budget,\n ),\n }]\n default: return [{\n type: 'text', text: boundedText(`[Unsupported content block: ${safeJson(block)}]`, maxChars, budget),\n }]\n }\n}\n\nfunction boundedText(value: string, maxChars: number, budget: CharacterBudget): string {\n const allowed = Math.max(0, Math.min(maxChars, budget.remaining))\n const result = truncateMiddle(value, allowed)\n budget.remaining -= result.length\n return result\n}\n\nfunction boundedToolArguments(value: string, maxChars: number, budget: CharacterBudget): string {\n const allowed = Math.max(0, Math.min(maxChars, budget.remaining))\n if (value.length <= allowed) {\n budget.remaining -= value.length\n return value\n }\n const placeholder = '{\"_compacted\":true}'\n if (placeholder.length <= allowed) {\n budget.remaining -= placeholder.length\n return placeholder\n }\n return '{}'\n}\n\nfunction safeJson(value: unknown): string {\n try { return JSON.stringify(value) ?? '' } catch { return String(value) }\n}\nfunction truncateMiddle(value: string, maxChars: number): string {\n if (value.length <= maxChars) return value\n const marker = '\\n…[truncated for compaction]…\\n'\n if (maxChars <= marker.length) return value.slice(0, maxChars)\n const head = Math.ceil((maxChars - marker.length) / 2)\n const tail = Math.floor((maxChars - marker.length) / 2)\n return value.slice(0, head) + marker + value.slice(value.length - tail)\n}\nfunction newCompactionId(): string {\n return systemRandomId()\n}\nfunction errorMessage(error: unknown): string { return error instanceof Error ? error.message : String(error) }\nfunction errorCode(error: unknown): string | undefined {\n return typeof error === 'object' && error !== null && 'code' in error && typeof error.code === 'string'\n ? error.code\n : undefined\n}\n\nfunction serializedBytes(value: unknown): number {\n const serialized = JSON.stringify(value)\n if (serialized === undefined) throw new TypeError('compaction model payload is not JSON serializable')\n return new TextEncoder().encode(serialized).byteLength\n}\n\nfunction assertUsageAdmission(accounting: ReturnType<typeof compactionAccounting>): void {\n const stop = accounting?.usageStop\n if (stop !== undefined) throw codedError(\n 'compaction cannot dispatch after a mandatory usage stop',\n stop.usageRequired ? 'USAGE_REQUIRED' : 'USAGE_UNAVAILABLE',\n )\n}\n\nfunction codedError(message: string, code: string, cause?: unknown): Error & { code: string } {\n const error = new Error(message, cause === undefined ? undefined : { cause }) as Error & { code: string }\n error.code = code\n return error\n}\n\nfunction modelTimeoutError(timeoutMs: number, cause: unknown): Error & { code: string } {\n return codedError(`compaction model operation exceeded ${timeoutMs}ms`, 'MODEL_TIMEOUT', cause)\n}\n\nasync function raceWithSignal<T>(pending: Promise<T>, signal: AbortSignal): Promise<T> {\n if (signal.aborted) {\n void pending.catch(() => undefined)\n throw signal.reason ?? new Error('operation aborted')\n }\n return await new Promise<T>((resolve, reject) => {\n const onAbort = () => {\n signal.removeEventListener('abort', onAbort)\n reject(signal.reason ?? new Error('operation aborted'))\n }\n signal.addEventListener('abort', onAbort, { once: true })\n void pending.then(\n value => {\n signal.removeEventListener('abort', onAbort)\n resolve(value)\n },\n error => {\n signal.removeEventListener('abort', onAbort)\n reject(error)\n },\n )\n })\n}\n\nfunction pressureBackoffReason(input: {\n readonly trigger: CompactionTrigger\n readonly thresholdTokens: number | undefined\n readonly estimatedTokensBefore: number\n readonly estimatedTokensAfter: number\n readonly estimatedNonCompactableTokens: number\n}): CompactionBackoffReason | undefined {\n if (input.trigger !== 'pressure' || input.thresholdTokens === undefined\n || input.estimatedTokensAfter < input.thresholdTokens) return undefined\n if (input.estimatedNonCompactableTokens >= input.thresholdTokens) {\n return 'unreachable-threshold'\n }\n const savings = input.estimatedTokensBefore - input.estimatedTokensAfter\n const minimum = Math.max(\n MIN_PRESSURE_SAVINGS_TOKENS,\n Math.ceil(input.estimatedTokensBefore * MIN_PRESSURE_SAVINGS_RATIO),\n )\n return savings < minimum ? 'low-savings' : undefined\n}\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{ReasoningEffortId as e}from"../../primitives/brand.js";import{objectValue as t,ownData as n}from"../../capability/common/data.js";import{captureMemoryBinding as r}from"../memory/definition.js";import{captureRuntimeSkillSources as i}from"../../agent/skill/provider/definition.js";import{captureToolDefinitions as a}from"../../agent/tool/capture.js";import{captureModelTarget as o,resolveAgentModel as s}from"../provider/model-selection.js";import{defineAgent as c}from"../../agent/define/definition.js";import{captureToolSources as l}from"../tool-source/definition.js";import{captureNativeTools as u,captureToolChoice as d}from"./native-tools.js";import{captureRuntimeContextSections as f}from"./policy.js";import{assertAgentIdentitySnapshot as p}from"../identity/agent.js";const m=new Set([`id`,`name`,`description`,`model`,`instructions`,`effort`,`maxTokens`,`mode`,`tools`,`nativeTools`,`toolChoice`,`outputFormat`,`toolSources`,`skills`,`allowedSkillIds`,`memory`,`contextSections`,`compaction`,`maxTurns`,`maxToolCalls`,`commentary`]);function h(e){let t=v(e),n=_(e,Object.freeze({providers:Object.freeze([Object.freeze({id:`definition-author`,displayName:`Definition author`,family:`definition-author`,routes:Object.freeze([t.provider]),defaultModel:t})])})),r=n.legacy;return Object.freeze({id:r.id,name:r.name,...r.description===void 0?{}:{description:r.description},model:t,instructions:r.instructions,...n.effort===void 0?{}:{effort:n.effort},...n.maxTokens===void 0?{}:{maxTokens:n.maxTokens},mode:r.mode,tools:r.tools,nativeTools:r.nativeTools,...r.toolChoice===void 0?{}:{toolChoice:r.toolChoice},...r.outputFormat===void 0?{}:{outputFormat:r.outputFormat},toolSources:n.toolSources,skills:r.skills,...r.skillIds===void 0?{}:{allowedSkillIds:r.skillIds},...n.memory===void 0?{}:{memory:n.memory},compaction:y(r.compaction),maxTurns:r.maxTurns,maxToolCalls:r.maxToolCalls,commentary:r.commentary})}function g(e,r){let i=t(e),a=t(r);if(Reflect.ownKeys(a).some(e=>typeof e!=`string`||!m.has(e)))throw TypeError(`Runtime agent overrides contain unsupported fields`);let o=Object.create(null);for(let e of m){let t=n(a,e,!1),r=t===void 0?n(i,e,!1):t;r!==void 0&&(o[e]=r)}if(n(a,`id`,!1)===void 0)throw TypeError(`Runtime agent clone requires an id`);return h(o)}function _(o,h){let g=t(o);if(Reflect.ownKeys(g).some(e=>typeof e!=`string`||!m.has(e)))throw TypeError(`Runtime agent definition contains unsupported fields`);let _=Object.fromEntries([...m].map(e=>[e,n(g,e,!1)])),v=s(h,_.model);if(_.effort!==void 0&&typeof _.effort!=`string`)throw TypeError(`Runtime agent effort must be a string`);let y=_.effort===void 0?void 0:e(_.effort),b=_.maxTokens,x=_.tools===void 0?void 0:a(_.tools),S=l(_.toolSources),C=u(_.nativeTools),w=d(_.toolChoice),T=_.memory===void 0?void 0:r(_.memory),E=_.skills===void 0?void 0:i(_.skills),D=f(_.contextSections);p({...x===void 0?{}:{tools:x},nativeTools:C,...E===void 0?{}:{skills:E},..._.allowedSkillIds===void 0?{}:{allowedSkillIds:_.allowedSkillIds}});let O=c({id:_.id,..._.name===void 0?{}:{name:_.name},..._.description===void 0?{}:{description:_.description},provider:v.provider,model:v.id,effort:y??`medium`,...b===void 0?{}:{maxTokens:b},instructions:_.instructions,..._.mode===void 0?{}:{mode:_.mode},...x===void 0?{}:{tools:x},...C.length===0?{}:{nativeTools:C},...E===void 0?{}:{skills:E},..._.allowedSkillIds===void 0?{}:{skillIds:_.allowedSkillIds},...w===void 0?{}:{toolChoice:w},...D===void 0?{}:{contextSections:D},..._.outputFormat===void 0?{}:{outputFormat:_.outputFormat},..._.compaction===void 0?{}:{compaction:_.compaction},..._.maxTurns===void 0?{}:{maxTurns:_.maxTurns},..._.maxToolCalls===void 0?{}:{maxToolCalls:_.maxToolCalls},..._.commentary===void 0?{}:{commentary:_.commentary}});return Object.freeze({model:v,...y===void 0?{}:{effort:y},...b===void 0?{}:{maxTokens:b},legacy:O,toolSources:S,...T===void 0?{}:{memory:T}})}function v(e){let r=t(e);if(Reflect.ownKeys(r).some(e=>typeof e!=`string`||!m.has(e)))throw TypeError(`Runtime agent definition contains unsupported fields`);return o(n(r,`model`),!1)}function y(e){return e!==!1&&Object.freeze({auto:e.auto,...e.maxInputTokens===void 0?{}:{maxInputTokens:e.maxInputTokens},thresholdRatio:e.thresholdRatio,...e.retainRatio===void 0?{}:{retainRatio:e.retainRatio},...e.retainTokens===void 0?{}:{retainTokens:e.retainTokens},...e.summarizationProvider===void 0?{}:{summarizationProvider:e.summarizationProvider},...e.summarizationModel===void 0?{}:{summarizationModel:e.summarizationModel},...e.summarizationEffort===void 0?{}:{summarizationEffort:e.summarizationEffort},maxSummaryTokens:e.maxSummaryTokens,compactionRetries:e.compactionRetries,maxOverflowRetries:e.maxOverflowRetries,maxSummaryInputChars:e.maxSummaryInputChars,maxSummaryRequestChars:e.maxSummaryRequestChars,maxSummaryRequestBytes:e.maxSummaryRequestBytes,maxSummaryResponseBytes:e.maxSummaryResponseBytes,maxSummaryStreamEvents:e.maxSummaryStreamEvents,summaryTimeoutMs:e.summaryTimeoutMs,teardownTimeoutMs:e.teardownTimeoutMs,maxToolResultChars:e.maxToolResultChars})}export{_ as bindRuntimeAgentDefinition,g as cloneRuntimeAgentDefinition,h as defineRuntimeAgentDefinition};
1
+ import{ReasoningEffortId as e}from"../../primitives/brand.js";import{objectValue as t,ownData as n}from"../../capability/common/data.js";import{captureMemoryBinding as r}from"../memory/definition.js";import{captureRuntimeSkillSources as i}from"../../agent/skill/provider/definition.js";import{captureToolDefinitions as a}from"../../agent/tool/capture.js";import{captureModelTarget as o,resolveAgentModel as s}from"../provider/model-selection.js";import{defineAgent as c}from"../../agent/define/definition.js";import{captureToolSources as l}from"../tool-source/definition.js";import{captureNativeTools as u,captureToolChoice as d}from"./native-tools.js";import{captureRuntimeContextSections as f}from"./policy.js";import{assertAgentIdentitySnapshot as p}from"../identity/agent.js";const m=new Set([`id`,`name`,`description`,`model`,`instructions`,`effort`,`maxTokens`,`mode`,`contextWindow`,`inputModalities`,`tools`,`nativeTools`,`toolChoice`,`outputFormat`,`toolSources`,`skills`,`allowedSkillIds`,`memory`,`contextSections`,`compaction`,`maxTurns`,`maxToolCalls`,`commentary`,`providerOptions`]);function h(e){let t=y(e),n=_(e,Object.freeze({providers:Object.freeze([Object.freeze({id:`definition-author`,displayName:`Definition author`,family:`definition-author`,routes:Object.freeze([t.provider]),defaultModel:t})])})),r=n.legacy;return Object.freeze({id:r.id,name:r.name,...r.description===void 0?{}:{description:r.description},model:t,instructions:r.instructions,...n.effort===void 0?{}:{effort:n.effort},...n.maxTokens===void 0?{}:{maxTokens:n.maxTokens},...r.contextWindow===void 0?{}:{contextWindow:r.contextWindow},...r.inputModalities===void 0?{}:{inputModalities:r.inputModalities},mode:r.mode,tools:r.tools,nativeTools:r.nativeTools,...r.toolChoice===void 0?{}:{toolChoice:r.toolChoice},...r.outputFormat===void 0?{}:{outputFormat:r.outputFormat},toolSources:n.toolSources,skills:r.skills,...r.skillIds===void 0?{}:{allowedSkillIds:r.skillIds},...n.memory===void 0?{}:{memory:n.memory},compaction:b(r.compaction),maxTurns:r.maxTurns,maxToolCalls:r.maxToolCalls,commentary:r.commentary})}function g(e,r){let i=t(e),a=t(r);if(Reflect.ownKeys(a).some(e=>typeof e!=`string`||!m.has(e)))throw TypeError(`Runtime agent overrides contain unsupported fields`);let o=Object.create(null);for(let e of m){let t=n(a,e,!1),r=t===void 0?n(i,e,!1):t;r!==void 0&&(o[e]=r)}if(n(a,`id`,!1)===void 0)throw TypeError(`Runtime agent clone requires an id`);return h(o)}function _(o,h){let g=t(o);if(Reflect.ownKeys(g).some(e=>typeof e!=`string`||!m.has(e)))throw TypeError(`Runtime agent definition contains unsupported fields`);let _=Object.fromEntries([...m].map(e=>[e,n(g,e,!1)])),y=s(h,_.model);if(_.effort!==void 0&&typeof _.effort!=`string`)throw TypeError(`Runtime agent effort must be a string`);let b=_.effort===void 0?void 0:e(_.effort),x=_.maxTokens,S=_.contextWindow,C=_.inputModalities,w=_.tools===void 0?void 0:a(_.tools),T=l(_.toolSources),E=u(_.nativeTools),D=d(_.toolChoice),O=_.memory===void 0?void 0:r(_.memory),k=_.skills===void 0?void 0:i(_.skills),A=f(_.contextSections),j=v(_.providerOptions);p({...w===void 0?{}:{tools:w},nativeTools:E,...k===void 0?{}:{skills:k},..._.allowedSkillIds===void 0?{}:{allowedSkillIds:_.allowedSkillIds}});let M=c({id:_.id,..._.name===void 0?{}:{name:_.name},..._.description===void 0?{}:{description:_.description},provider:y.provider,model:y.id,effort:b??`medium`,...x===void 0?{}:{maxTokens:x},...S===void 0?{}:{contextWindow:S},...C===void 0?{}:{inputModalities:C},instructions:_.instructions,..._.mode===void 0?{}:{mode:_.mode},...w===void 0?{}:{tools:w},...E.length===0?{}:{nativeTools:E},...k===void 0?{}:{skills:k},..._.allowedSkillIds===void 0?{}:{skillIds:_.allowedSkillIds},...D===void 0?{}:{toolChoice:D},...A===void 0?{}:{contextSections:A},..._.outputFormat===void 0?{}:{outputFormat:_.outputFormat},..._.compaction===void 0?{}:{compaction:_.compaction},..._.maxTurns===void 0?{}:{maxTurns:_.maxTurns},..._.maxToolCalls===void 0?{}:{maxToolCalls:_.maxToolCalls},..._.commentary===void 0?{}:{commentary:_.commentary},...j===void 0?{}:{providerOptions:j}});return Object.freeze({model:y,...b===void 0?{}:{effort:b},...x===void 0?{}:{maxTokens:x},legacy:M,toolSources:T,...O===void 0?{}:{memory:O}})}function v(e){if(e===void 0)return;let r=t(e),i=n(r,`headers`,!1),a=n(r,`body`,!1);if(i!==void 0){let e=t(i);for(let t of Object.values(e))if(typeof t!=`string`)throw TypeError(`agent providerOptions.headers values must be strings`)}let o={};return i!==void 0&&(o.headers={...i}),a!==void 0&&(o.body={...t(a)}),o}function y(e){let r=t(e);if(Reflect.ownKeys(r).some(e=>typeof e!=`string`||!m.has(e)))throw TypeError(`Runtime agent definition contains unsupported fields`);return o(n(r,`model`),!1)}function b(e){return e!==!1&&Object.freeze({auto:e.auto,...e.maxInputTokens===void 0?{}:{maxInputTokens:e.maxInputTokens},thresholdRatio:e.thresholdRatio,...e.retainRatio===void 0?{}:{retainRatio:e.retainRatio},...e.retainTokens===void 0?{}:{retainTokens:e.retainTokens},...e.summarizationProvider===void 0?{}:{summarizationProvider:e.summarizationProvider},...e.summarizationModel===void 0?{}:{summarizationModel:e.summarizationModel},...e.summarizationEffort===void 0?{}:{summarizationEffort:e.summarizationEffort},maxSummaryTokens:e.maxSummaryTokens,compactionRetries:e.compactionRetries,maxOverflowRetries:e.maxOverflowRetries,maxSummaryInputChars:e.maxSummaryInputChars,maxSummaryRequestChars:e.maxSummaryRequestChars,maxSummaryRequestBytes:e.maxSummaryRequestBytes,maxSummaryResponseBytes:e.maxSummaryResponseBytes,maxSummaryStreamEvents:e.maxSummaryStreamEvents,summaryTimeoutMs:e.summaryTimeoutMs,teardownTimeoutMs:e.teardownTimeoutMs,maxToolResultChars:e.maxToolResultChars})}export{_ as bindRuntimeAgentDefinition,g as cloneRuntimeAgentDefinition,h as defineRuntimeAgentDefinition};
2
2
  //# sourceMappingURL=definition.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"definition.js","names":[],"sources":["../../../src/composition/agent/definition.ts"],"sourcesContent":["import { defineAgent, type DefinedAgent } from '../../agent/define/definition.ts'\nimport { ReasoningEffortId } from '../../primitives/brand.ts'\nimport { objectValue, ownData } from '../common/data.ts'\nimport { captureModelTarget, resolveAgentModel } from '../provider/model-selection.ts'\nimport type { ModelTarget, ProviderSelection } from '../provider/types.ts'\nimport type {\n RuntimeAgentBindingInput, RuntimeAgentDefinition, RuntimeAgentDefinitionInput,\n} from './types.ts'\nimport { captureToolDefinitions } from '../../agent/tool/capture.ts'\nimport { captureToolSources } from '../tool-source/definition.ts'\nimport type { CapturedToolSource } from '../tool-source/types.ts'\nimport { captureNativeTools, captureToolChoice } from './native-tools.ts'\nimport { captureMemoryBinding } from '../memory/definition.ts'\nimport type { CapturedMemoryBinding } from '../memory/types.ts'\nimport { captureRuntimeSkillSources } from '../skill-provider/definition.ts'\nimport { captureRuntimeContextSections } from './policy.ts'\nimport type { AgentCompactionConfig, AgentCompactionOptions } from '../../agent/memory/compaction-config.ts'\nimport { assertAgentIdentitySnapshot } from '../identity/agent.ts'\n\nconst KEYS = new Set(['id', 'name', 'description', 'model', 'instructions', 'effort', 'maxTokens', 'mode',\n 'tools', 'nativeTools', 'toolChoice', 'outputFormat', 'toolSources', 'skills', 'allowedSkillIds', 'memory',\n 'contextSections', 'compaction',\n 'maxTurns', 'maxToolCalls', 'commentary'])\n\nexport interface BoundRuntimeAgentDefinition {\n readonly model: ModelTarget\n readonly effort?: ReturnType<typeof ReasoningEffortId>\n readonly maxTokens?: number\n readonly legacy: DefinedAgent\n readonly toolSources: readonly CapturedToolSource[]\n readonly memory?: CapturedMemoryBinding\n}\n\n/** Validate and detach one reusable runtime definition without resolving a live provider. */\nexport function defineRuntimeAgentDefinition(input: RuntimeAgentDefinitionInput): RuntimeAgentDefinition {\n const target = captureAuthorTarget(input)\n const selection: ProviderSelection = Object.freeze({ providers: Object.freeze([Object.freeze({\n id: 'definition-author', displayName: 'Definition author', family: 'definition-author',\n routes: Object.freeze([target.provider]), defaultModel: target,\n })]) })\n const bound = bindRuntimeAgentDefinition(input, selection)\n const legacy = bound.legacy\n return Object.freeze({ id: legacy.id, name: legacy.name,\n ...(legacy.description === undefined ? {} : { description: legacy.description }),\n model: target, instructions: legacy.instructions,\n ...(bound.effort === undefined ? {} : { effort: bound.effort }),\n ...(bound.maxTokens === undefined ? {} : { maxTokens: bound.maxTokens }),\n mode: legacy.mode, tools: legacy.tools, nativeTools: legacy.nativeTools,\n ...(legacy.toolChoice === undefined ? {} : { toolChoice: legacy.toolChoice }),\n ...(legacy.outputFormat === undefined ? {} : { outputFormat: legacy.outputFormat }),\n toolSources: bound.toolSources, skills: legacy.skills,\n ...(legacy.skillIds === undefined ? {} : { allowedSkillIds: legacy.skillIds }),\n ...(bound.memory === undefined ? {} : { memory: bound.memory }),\n compaction: compactionInput(legacy.compaction), maxTurns: legacy.maxTurns,\n maxToolCalls: legacy.maxToolCalls, commentary: legacy.commentary })\n}\n\nexport function cloneRuntimeAgentDefinition(\n sourceValue: RuntimeAgentDefinition,\n overridesValue: Partial<Omit<RuntimeAgentDefinitionInput, 'id'>> & { readonly id: string },\n): RuntimeAgentDefinition {\n const source = objectValue(sourceValue), overrides = objectValue(overridesValue)\n if (Reflect.ownKeys(overrides).some(key => typeof key !== 'string' || !KEYS.has(key))) {\n throw new TypeError('Runtime agent overrides contain unsupported fields')\n }\n const merged: Record<string, unknown> = Object.create(null) as Record<string, unknown>\n for (const key of KEYS) {\n const override = ownData(overrides, key, false)\n const value = override === undefined ? ownData(source, key, false) : override\n if (value !== undefined) merged[key] = value\n }\n if (ownData(overrides, 'id', false) === undefined) throw new TypeError('Runtime agent clone requires an id')\n return defineRuntimeAgentDefinition(merged as unknown as RuntimeAgentDefinitionInput)\n}\n\n/** Capture one runtime definition and resolve its immutable target before any model operation. */\nexport function bindRuntimeAgentDefinition(\n input: RuntimeAgentBindingInput,\n selection: ProviderSelection,\n): BoundRuntimeAgentDefinition {\n const source = objectValue(input)\n if (Reflect.ownKeys(source).some(key => typeof key !== 'string' || !KEYS.has(key))) {\n throw new TypeError('Runtime agent definition contains unsupported fields')\n }\n const values = Object.fromEntries([...KEYS].map(key => [key, ownData(source, key, false)])) as Record<string, unknown>\n const target = resolveAgentModel(selection, values.model)\n if (values.effort !== undefined && typeof values.effort !== 'string') throw new TypeError('Runtime agent effort must be a string')\n const effort = values.effort === undefined ? undefined : ReasoningEffortId(values.effort)\n const maxTokens = values.maxTokens as number | undefined\n const tools = values.tools === undefined ? undefined : captureToolDefinitions(values.tools)\n const toolSources = captureToolSources(values.toolSources)\n const nativeTools = captureNativeTools(values.nativeTools)\n const toolChoice = captureToolChoice(values.toolChoice)\n const memory = values.memory === undefined ? undefined : captureMemoryBinding(values.memory)\n const skills = values.skills === undefined ? undefined : captureRuntimeSkillSources(values.skills)\n const contextSections = captureRuntimeContextSections(values.contextSections)\n assertAgentIdentitySnapshot({ ...(tools === undefined ? {} : { tools }), nativeTools,\n ...(skills === undefined ? {} : { skills }), ...(values.allowedSkillIds === undefined ? {} : {\n allowedSkillIds: values.allowedSkillIds as readonly string[],\n }) })\n const legacy = defineAgent({\n id: values.id as string,\n ...(values.name === undefined ? {} : { name: values.name as string }),\n ...(values.description === undefined ? {} : { description: values.description as string }),\n provider: target.provider, model: target.id,\n // Legacy definitions require a value; the runtime session override below preserves omission.\n effort: effort ?? 'medium',\n ...(maxTokens === undefined ? {} : { maxTokens }), instructions: values.instructions as string,\n ...(values.mode === undefined ? {} : { mode: values.mode as NonNullable<RuntimeAgentBindingInput['mode']> }),\n ...(tools === undefined ? {} : { tools }),\n ...(nativeTools.length === 0 ? {} : { nativeTools }),\n ...(skills === undefined ? {} : { skills: skills as DefinedAgent['skills'] }),\n ...(values.allowedSkillIds === undefined ? {} : { skillIds: values.allowedSkillIds as readonly string[] }),\n ...(toolChoice === undefined ? {} : { toolChoice }),\n ...(contextSections === undefined ? {} : { contextSections }),\n ...(values.outputFormat === undefined ? {} : {\n outputFormat: values.outputFormat as NonNullable<RuntimeAgentBindingInput['outputFormat']>,\n }),\n ...(values.compaction === undefined ? {} : { compaction: values.compaction as NonNullable<RuntimeAgentBindingInput['compaction']> }),\n ...(values.maxTurns === undefined ? {} : { maxTurns: values.maxTurns as number | 'auto' }),\n ...(values.maxToolCalls === undefined ? {} : { maxToolCalls: values.maxToolCalls as number }),\n ...(values.commentary === undefined ? {} : { commentary: values.commentary as NonNullable<RuntimeAgentBindingInput['commentary']> }),\n })\n return Object.freeze({ model: target, ...(effort === undefined ? {} : { effort }),\n ...(maxTokens === undefined ? {} : { maxTokens }), legacy, toolSources,\n ...(memory === undefined ? {} : { memory }) })\n}\n\nfunction captureAuthorTarget(input: RuntimeAgentDefinitionInput): ModelTarget {\n const source = objectValue(input)\n if (Reflect.ownKeys(source).some(key => typeof key !== 'string' || !KEYS.has(key))) {\n throw new TypeError('Runtime agent definition contains unsupported fields')\n }\n return captureModelTarget(ownData(source, 'model'), false)\n}\n\nfunction compactionInput(value: AgentCompactionConfig | false): AgentCompactionOptions | false {\n if (value === false) return false\n return Object.freeze({ auto: value.auto,\n ...(value.maxInputTokens === undefined ? {} : { maxInputTokens: value.maxInputTokens }),\n thresholdRatio: value.thresholdRatio,\n ...(value.retainRatio === undefined ? {} : { retainRatio: value.retainRatio }),\n ...(value.retainTokens === undefined ? {} : { retainTokens: value.retainTokens }),\n ...(value.summarizationProvider === undefined ? {} : { summarizationProvider: value.summarizationProvider }),\n ...(value.summarizationModel === undefined ? {} : { summarizationModel: value.summarizationModel }),\n ...(value.summarizationEffort === undefined ? {} : { summarizationEffort: value.summarizationEffort }),\n maxSummaryTokens: value.maxSummaryTokens, compactionRetries: value.compactionRetries,\n maxOverflowRetries: value.maxOverflowRetries, maxSummaryInputChars: value.maxSummaryInputChars,\n maxSummaryRequestChars: value.maxSummaryRequestChars, maxSummaryRequestBytes: value.maxSummaryRequestBytes,\n maxSummaryResponseBytes: value.maxSummaryResponseBytes, maxSummaryStreamEvents: value.maxSummaryStreamEvents,\n summaryTimeoutMs: value.summaryTimeoutMs, teardownTimeoutMs: value.teardownTimeoutMs,\n maxToolResultChars: value.maxToolResultChars })\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"definition.js","names":[],"sources":["../../../src/composition/agent/definition.ts"],"sourcesContent":["import { defineAgent, type DefinedAgent } from '../../agent/define/definition.ts'\nimport { ReasoningEffortId } from '../../primitives/brand.ts'\nimport { objectValue, ownData } from '../common/data.ts'\nimport { captureModelTarget, resolveAgentModel } from '../provider/model-selection.ts'\nimport type { ModelTarget, ProviderSelection } from '../provider/types.ts'\nimport type {\n RuntimeAgentBindingInput, RuntimeAgentDefinition, RuntimeAgentDefinitionInput,\n} from './types.ts'\nimport { captureToolDefinitions } from '../../agent/tool/capture.ts'\nimport { captureToolSources } from '../tool-source/definition.ts'\nimport type { CapturedToolSource } from '../tool-source/types.ts'\nimport { captureNativeTools, captureToolChoice } from './native-tools.ts'\nimport { captureMemoryBinding } from '../memory/definition.ts'\nimport type { CapturedMemoryBinding } from '../memory/types.ts'\nimport { captureRuntimeSkillSources } from '../skill-provider/definition.ts'\nimport { captureRuntimeContextSections } from './policy.ts'\nimport type { AgentCompactionConfig, AgentCompactionOptions } from '../../agent/memory/compaction-config.ts'\nimport { assertAgentIdentitySnapshot } from '../identity/agent.ts'\nimport type { ModelModality } from '../../contract/index.ts'\n\nconst KEYS = new Set(['id', 'name', 'description', 'model', 'instructions', 'effort', 'maxTokens', 'mode',\n 'contextWindow', 'inputModalities',\n 'tools', 'nativeTools', 'toolChoice', 'outputFormat', 'toolSources', 'skills', 'allowedSkillIds', 'memory',\n 'contextSections', 'compaction',\n 'maxTurns', 'maxToolCalls', 'commentary', 'providerOptions'])\n\nexport interface BoundRuntimeAgentDefinition {\n readonly model: ModelTarget\n readonly effort?: ReturnType<typeof ReasoningEffortId>\n readonly maxTokens?: number\n readonly legacy: DefinedAgent\n readonly toolSources: readonly CapturedToolSource[]\n readonly memory?: CapturedMemoryBinding\n}\n\n/** Validate and detach one reusable runtime definition without resolving a live provider. */\nexport function defineRuntimeAgentDefinition(input: RuntimeAgentDefinitionInput): RuntimeAgentDefinition {\n const target = captureAuthorTarget(input)\n const selection: ProviderSelection = Object.freeze({ providers: Object.freeze([Object.freeze({\n id: 'definition-author', displayName: 'Definition author', family: 'definition-author',\n routes: Object.freeze([target.provider]), defaultModel: target,\n })]) })\n const bound = bindRuntimeAgentDefinition(input, selection)\n const legacy = bound.legacy\n return Object.freeze({ id: legacy.id, name: legacy.name,\n ...(legacy.description === undefined ? {} : { description: legacy.description }),\n model: target, instructions: legacy.instructions,\n ...(bound.effort === undefined ? {} : { effort: bound.effort }),\n ...(bound.maxTokens === undefined ? {} : { maxTokens: bound.maxTokens }),\n ...(legacy.contextWindow === undefined ? {} : { contextWindow: legacy.contextWindow }),\n ...(legacy.inputModalities === undefined ? {} : { inputModalities: legacy.inputModalities }),\n mode: legacy.mode, tools: legacy.tools, nativeTools: legacy.nativeTools,\n ...(legacy.toolChoice === undefined ? {} : { toolChoice: legacy.toolChoice }),\n ...(legacy.outputFormat === undefined ? {} : { outputFormat: legacy.outputFormat }),\n toolSources: bound.toolSources, skills: legacy.skills,\n ...(legacy.skillIds === undefined ? {} : { allowedSkillIds: legacy.skillIds }),\n ...(bound.memory === undefined ? {} : { memory: bound.memory }),\n compaction: compactionInput(legacy.compaction), maxTurns: legacy.maxTurns,\n maxToolCalls: legacy.maxToolCalls, commentary: legacy.commentary })\n}\n\nexport function cloneRuntimeAgentDefinition(\n sourceValue: RuntimeAgentDefinition,\n overridesValue: Partial<Omit<RuntimeAgentDefinitionInput, 'id'>> & { readonly id: string },\n): RuntimeAgentDefinition {\n const source = objectValue(sourceValue), overrides = objectValue(overridesValue)\n if (Reflect.ownKeys(overrides).some(key => typeof key !== 'string' || !KEYS.has(key))) {\n throw new TypeError('Runtime agent overrides contain unsupported fields')\n }\n const merged: Record<string, unknown> = Object.create(null) as Record<string, unknown>\n for (const key of KEYS) {\n const override = ownData(overrides, key, false)\n const value = override === undefined ? ownData(source, key, false) : override\n if (value !== undefined) merged[key] = value\n }\n if (ownData(overrides, 'id', false) === undefined) throw new TypeError('Runtime agent clone requires an id')\n return defineRuntimeAgentDefinition(merged as unknown as RuntimeAgentDefinitionInput)\n}\n\n/** Capture one runtime definition and resolve its immutable target before any model operation. */\nexport function bindRuntimeAgentDefinition(\n input: RuntimeAgentBindingInput,\n selection: ProviderSelection,\n): BoundRuntimeAgentDefinition {\n const source = objectValue(input)\n if (Reflect.ownKeys(source).some(key => typeof key !== 'string' || !KEYS.has(key))) {\n throw new TypeError('Runtime agent definition contains unsupported fields')\n }\n const values = Object.fromEntries([...KEYS].map(key => [key, ownData(source, key, false)])) as Record<string, unknown>\n const target = resolveAgentModel(selection, values.model)\n if (values.effort !== undefined && typeof values.effort !== 'string') throw new TypeError('Runtime agent effort must be a string')\n const effort = values.effort === undefined ? undefined : ReasoningEffortId(values.effort)\n const maxTokens = values.maxTokens as number | undefined\n const contextWindow = values.contextWindow as number | undefined\n const inputModalities = values.inputModalities as readonly ModelModality[] | undefined\n const tools = values.tools === undefined ? undefined : captureToolDefinitions(values.tools)\n const toolSources = captureToolSources(values.toolSources)\n const nativeTools = captureNativeTools(values.nativeTools)\n const toolChoice = captureToolChoice(values.toolChoice)\n const memory = values.memory === undefined ? undefined : captureMemoryBinding(values.memory)\n const skills = values.skills === undefined ? undefined : captureRuntimeSkillSources(values.skills)\n const contextSections = captureRuntimeContextSections(values.contextSections)\n const providerOptions = captureProviderOptions(values.providerOptions)\n assertAgentIdentitySnapshot({ ...(tools === undefined ? {} : { tools }), nativeTools,\n ...(skills === undefined ? {} : { skills }), ...(values.allowedSkillIds === undefined ? {} : {\n allowedSkillIds: values.allowedSkillIds as readonly string[],\n }) })\n const legacy = defineAgent({\n id: values.id as string,\n ...(values.name === undefined ? {} : { name: values.name as string }),\n ...(values.description === undefined ? {} : { description: values.description as string }),\n provider: target.provider, model: target.id,\n // Legacy definitions require a value; the runtime session override below preserves omission.\n effort: effort ?? 'medium',\n ...(maxTokens === undefined ? {} : { maxTokens }),\n ...(contextWindow === undefined ? {} : { contextWindow }),\n ...(inputModalities === undefined ? {} : { inputModalities }),\n instructions: values.instructions as string,\n ...(values.mode === undefined ? {} : { mode: values.mode as NonNullable<RuntimeAgentBindingInput['mode']> }),\n ...(tools === undefined ? {} : { tools }),\n ...(nativeTools.length === 0 ? {} : { nativeTools }),\n ...(skills === undefined ? {} : { skills: skills as DefinedAgent['skills'] }),\n ...(values.allowedSkillIds === undefined ? {} : { skillIds: values.allowedSkillIds as readonly string[] }),\n ...(toolChoice === undefined ? {} : { toolChoice }),\n ...(contextSections === undefined ? {} : { contextSections }),\n ...(values.outputFormat === undefined ? {} : {\n outputFormat: values.outputFormat as NonNullable<RuntimeAgentBindingInput['outputFormat']>,\n }),\n ...(values.compaction === undefined ? {} : { compaction: values.compaction as NonNullable<RuntimeAgentBindingInput['compaction']> }),\n ...(values.maxTurns === undefined ? {} : { maxTurns: values.maxTurns as number | 'auto' }),\n ...(values.maxToolCalls === undefined ? {} : { maxToolCalls: values.maxToolCalls as number }),\n ...(values.commentary === undefined ? {} : { commentary: values.commentary as NonNullable<RuntimeAgentBindingInput['commentary']> }),\n ...(providerOptions === undefined ? {} : { providerOptions }),\n })\n return Object.freeze({ model: target, ...(effort === undefined ? {} : { effort }),\n ...(maxTokens === undefined ? {} : { maxTokens }), legacy, toolSources,\n ...(memory === undefined ? {} : { memory }) })\n}\n\n/** Capture `providerOptions.headers`/`.body`, rejecting anything not a plain record. */\nfunction captureProviderOptions(value: unknown): { headers?: Record<string, string>; body?: Record<string, unknown> } | undefined {\n if (value === undefined) return undefined\n const source = objectValue(value)\n const headers = ownData(source, 'headers', false)\n const body = ownData(source, 'body', false)\n if (headers !== undefined) {\n const record = objectValue(headers)\n for (const entry of Object.values(record)) {\n if (typeof entry !== 'string') throw new TypeError('agent providerOptions.headers values must be strings')\n }\n }\n const result: { headers?: Record<string, string>; body?: Record<string, unknown> } = {}\n if (headers !== undefined) result.headers = { ...(headers as Record<string, string>) }\n if (body !== undefined) result.body = { ...(objectValue(body) as Record<string, unknown>) }\n return result\n}\n\nfunction captureAuthorTarget(input: RuntimeAgentDefinitionInput): ModelTarget {\n const source = objectValue(input)\n if (Reflect.ownKeys(source).some(key => typeof key !== 'string' || !KEYS.has(key))) {\n throw new TypeError('Runtime agent definition contains unsupported fields')\n }\n return captureModelTarget(ownData(source, 'model'), false)\n}\n\nfunction compactionInput(value: AgentCompactionConfig | false): AgentCompactionOptions | false {\n if (value === false) return false\n return Object.freeze({ auto: value.auto,\n ...(value.maxInputTokens === undefined ? {} : { maxInputTokens: value.maxInputTokens }),\n thresholdRatio: value.thresholdRatio,\n ...(value.retainRatio === undefined ? {} : { retainRatio: value.retainRatio }),\n ...(value.retainTokens === undefined ? {} : { retainTokens: value.retainTokens }),\n ...(value.summarizationProvider === undefined ? {} : { summarizationProvider: value.summarizationProvider }),\n ...(value.summarizationModel === undefined ? {} : { summarizationModel: value.summarizationModel }),\n ...(value.summarizationEffort === undefined ? {} : { summarizationEffort: value.summarizationEffort }),\n maxSummaryTokens: value.maxSummaryTokens, compactionRetries: value.compactionRetries,\n maxOverflowRetries: value.maxOverflowRetries, maxSummaryInputChars: value.maxSummaryInputChars,\n maxSummaryRequestChars: value.maxSummaryRequestChars, maxSummaryRequestBytes: value.maxSummaryRequestBytes,\n maxSummaryResponseBytes: value.maxSummaryResponseBytes, maxSummaryStreamEvents: value.maxSummaryStreamEvents,\n summaryTimeoutMs: value.summaryTimeoutMs, teardownTimeoutMs: value.teardownTimeoutMs,\n maxToolResultChars: value.maxToolResultChars })\n}\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{ReasoningEffortId as e}from"../../primitives/brand.js";import{objectValue as t,optionalAbortSignal as n,ownData as r}from"../../capability/common/data.js";import{captureMemoryBinding as i}from"../memory/definition.js";import{captureRuntimeSkillSources as a}from"../../agent/skill/provider/definition.js";import{captureToolDefinitions as o}from"../../agent/tool/capture.js";import{resolveAgentModel as s}from"../provider/model-selection.js";import{captureAdditionalInstructions as c}from"../../agent/define/instructions.js";import{captureOutputFormat as l}from"../../agent/define/output-format.js";import{captureToolSources as u}from"../tool-source/definition.js";import{captureApprovalBroker as d,captureInterceptors as f,captureRuntimeContextSections as p,captureSpillStore as m,captureTurnHooks as h,captureUsagePolicy as g,captureUserInputBroker as _}from"./policy.js";const v=new Set([`signal`,`additionalInstructions`,`onEvent`,`imagePolicy`,`documentPolicy`,`structuredOutput`,`includeTraceEvents`,`model`,`effort`,`maxTokens`]),y=new Set([`conversationId`,`tools`,`toolSources`,`skills`,`memory`,`skillCwd`,`userInput`,`approvals`,`spillStore`,`interceptors`,`contextSections`,`hooks`,`usagePolicy`,`historyLimits`,`ledgerLimits`,`eventBufferLimits`,`runtimeLimits`,`compaction`]);function b(e){if(e===void 0)return Object.freeze({});let n=t(e);if(Reflect.ownKeys(n).some(e=>typeof e!=`string`||!y.has(e)))throw TypeError(`Runtime session options contain unsupported fields`);let s=Object.fromEntries([...y].map(e=>[e,r(n,e,!1)])),c=s.tools===void 0?void 0:o(s.tools),l=s.toolSources===void 0?void 0:u(s.toolSources),v=d(s.approvals),b=m(s.spillStore),x=_(s.userInput),S=f(s.interceptors),C=p(s.contextSections),w=h(s.hooks),T=g(s.usagePolicy),E=s.memory===!1||s.memory===void 0?s.memory:i(s.memory),D=s.skills===void 0?void 0:a(s.skills);return Object.freeze({...s.conversationId===void 0?{}:{conversationId:s.conversationId},...c===void 0?{}:{tools:c},...l===void 0?{}:{toolSources:l},...D===void 0?{}:{skills:D},...E===void 0?{}:{memory:E},...s.skillCwd===void 0?{}:{skillCwd:s.skillCwd},...x===void 0?{}:{userInput:x},...v===void 0?{}:{approvals:v},...b===void 0?{}:{spillStore:b},...S===void 0?{}:{interceptors:S},...C===void 0?{}:{contextSections:C},...w===void 0?{}:{hooks:w},...T===void 0?{}:{usagePolicy:T},...s.historyLimits===void 0?{}:{historyLimits:s.historyLimits},...s.ledgerLimits===void 0?{}:{ledgerLimits:s.ledgerLimits},...s.eventBufferLimits===void 0?{}:{eventBufferLimits:s.eventBufferLimits},...s.runtimeLimits===void 0?{}:{runtimeLimits:s.runtimeLimits},...s.compaction===void 0?{}:{compaction:s.compaction}})}function x(i,a){if(i===void 0)return Object.freeze({});let o=t(i);if(Reflect.ownKeys(o).some(e=>typeof e!=`string`||!v.has(e)))throw TypeError(`Runtime invocation options contain unsupported fields`);let u=r(o,`structuredOutput`,!1),d;if(u!==void 0){let e=t(u),n=t(r(e,`schema`)),i=r(n,`parse`);if(typeof i!=`function`)throw TypeError(`structuredOutput schema requires a synchronous parser`);let a=l({type:`json_schema`,name:r(e,`name`),schema:r(n,`jsonSchema`)});if(a.type!==`json_schema`)throw TypeError(`structuredOutput requires JSON Schema`);d=Object.freeze({name:a.name,schema:Object.freeze({jsonSchema:a.schema,parse:i.bind(n)})})}let f=r(o,`imagePolicy`,!1);if(f!==void 0&&f!==`strict`&&f!==`project`)throw TypeError(`imagePolicy must be strict or project`);let p=r(o,`documentPolicy`,!1);if(p!==void 0&&p!==`strict`&&p!==`project`)throw TypeError(`documentPolicy must be strict or project`);let m=n(r(o,`signal`,!1)),h=c(r(o,`additionalInstructions`,!1)),g=r(o,`onEvent`,!1);if(g!==void 0&&typeof g!=`function`)throw TypeError(`Runtime event observer must be callable`);let _=r(o,`includeTraceEvents`,!1);if(_!==void 0&&typeof _!=`boolean`)throw TypeError(`includeTraceEvents must be boolean`);let y=r(o,`model`,!1);if(y!==void 0&&a===void 0)throw TypeError(`Runtime invocation model override is unavailable on this session`);let b=y===void 0?void 0:s(a,y),x=r(o,`effort`,!1);if(x!==void 0&&typeof x!=`string`)throw TypeError(`Runtime invocation effort must be a string`);let S=x===void 0?void 0:e(x),C=r(o,`maxTokens`,!1);if(C!==void 0&&(!Number.isSafeInteger(C)||C<1))throw TypeError(`Runtime invocation maxTokens must be a positive safe integer`);return Object.freeze({...b===void 0?{}:{model:b},...S===void 0?{}:{effort:S},...C===void 0?{}:{maxTokens:C},...d===void 0?{}:{structuredOutput:d},...f===void 0?{}:{imagePolicy:f},...p===void 0?{}:{documentPolicy:p},...m===void 0?{}:{signal:m},...h===void 0?{}:{additionalInstructions:h},..._===void 0?{}:{includeTraceEvents:_},...g===void 0?{}:{onEvent:g}})}export{x as captureInvocationOptions,b as captureRuntimeSessionOptions};
1
+ import{objectValue as e,optionalAbortSignal as t,ownData as n}from"../../capability/common/data.js";import{captureMemoryBinding as r}from"../memory/definition.js";import{captureRuntimeSkillSources as i}from"../../agent/skill/provider/definition.js";import{captureToolDefinitions as a}from"../../agent/tool/capture.js";import{resolveAgentModel as o}from"../provider/model-selection.js";import{captureAdditionalInstructions as s}from"../../agent/define/instructions.js";import{captureOutputFormat as c}from"../../agent/define/output-format.js";import{captureToolSources as l}from"../tool-source/definition.js";import{captureApprovalBroker as u,captureInterceptors as d,captureRuntimeContextSections as f,captureSpillStore as p,captureTurnHooks as m,captureUsagePolicy as h,captureUserInputBroker as g}from"./policy.js";const _=new Set([`signal`,`additionalInstructions`,`onEvent`,`imagePolicy`,`documentPolicy`,`structuredOutput`,`includeTraceEvents`,`model`,`maxTokens`]),v=new Set([`conversationId`,`tools`,`toolSources`,`skills`,`memory`,`skillCwd`,`userInput`,`approvals`,`spillStore`,`interceptors`,`contextSections`,`hooks`,`usagePolicy`,`historyLimits`,`ledgerLimits`,`eventBufferLimits`,`runtimeLimits`,`compaction`]);function y(t){if(t===void 0)return Object.freeze({});let o=e(t);if(Reflect.ownKeys(o).some(e=>typeof e!=`string`||!v.has(e)))throw TypeError(`Runtime session options contain unsupported fields`);let s=Object.fromEntries([...v].map(e=>[e,n(o,e,!1)])),c=s.tools===void 0?void 0:a(s.tools),_=s.toolSources===void 0?void 0:l(s.toolSources),y=u(s.approvals),b=p(s.spillStore),x=g(s.userInput),S=d(s.interceptors),C=f(s.contextSections),w=m(s.hooks),T=h(s.usagePolicy),E=s.memory===!1||s.memory===void 0?s.memory:r(s.memory),D=s.skills===void 0?void 0:i(s.skills);return Object.freeze({...s.conversationId===void 0?{}:{conversationId:s.conversationId},...c===void 0?{}:{tools:c},..._===void 0?{}:{toolSources:_},...D===void 0?{}:{skills:D},...E===void 0?{}:{memory:E},...s.skillCwd===void 0?{}:{skillCwd:s.skillCwd},...x===void 0?{}:{userInput:x},...y===void 0?{}:{approvals:y},...b===void 0?{}:{spillStore:b},...S===void 0?{}:{interceptors:S},...C===void 0?{}:{contextSections:C},...w===void 0?{}:{hooks:w},...T===void 0?{}:{usagePolicy:T},...s.historyLimits===void 0?{}:{historyLimits:s.historyLimits},...s.ledgerLimits===void 0?{}:{ledgerLimits:s.ledgerLimits},...s.eventBufferLimits===void 0?{}:{eventBufferLimits:s.eventBufferLimits},...s.runtimeLimits===void 0?{}:{runtimeLimits:s.runtimeLimits},...s.compaction===void 0?{}:{compaction:s.compaction}})}function b(r,i){if(r===void 0)return Object.freeze({});let a=e(r);if(Reflect.ownKeys(a).some(e=>typeof e!=`string`||!_.has(e)))throw TypeError(`Runtime invocation options contain unsupported fields`);let l=n(a,`structuredOutput`,!1),u;if(l!==void 0){let t=e(l),r=e(n(t,`schema`)),i=n(r,`parse`);if(typeof i!=`function`)throw TypeError(`structuredOutput schema requires a synchronous parser`);let a=c({type:`json_schema`,name:n(t,`name`),schema:n(r,`jsonSchema`)});if(a.type!==`json_schema`)throw TypeError(`structuredOutput requires JSON Schema`);u=Object.freeze({name:a.name,schema:Object.freeze({jsonSchema:a.schema,parse:i.bind(r)})})}let d=n(a,`imagePolicy`,!1);if(d!==void 0&&d!==`strict`&&d!==`project`)throw TypeError(`imagePolicy must be strict or project`);let f=n(a,`documentPolicy`,!1);if(f!==void 0&&f!==`strict`&&f!==`project`)throw TypeError(`documentPolicy must be strict or project`);let p=t(n(a,`signal`,!1)),m=s(n(a,`additionalInstructions`,!1)),h=n(a,`onEvent`,!1);if(h!==void 0&&typeof h!=`function`)throw TypeError(`Runtime event observer must be callable`);let g=n(a,`includeTraceEvents`,!1);if(g!==void 0&&typeof g!=`boolean`)throw TypeError(`includeTraceEvents must be boolean`);let v=n(a,`model`,!1);if(v!==void 0&&i===void 0)throw TypeError(`Runtime invocation model override is unavailable on this session`);let y=v===void 0?void 0:o(i,v),b=n(a,`maxTokens`,!1);if(b!==void 0&&(!Number.isSafeInteger(b)||b<1))throw TypeError(`Runtime invocation maxTokens must be a positive safe integer`);return Object.freeze({...y===void 0?{}:{model:y},...b===void 0?{}:{maxTokens:b},...u===void 0?{}:{structuredOutput:u},...d===void 0?{}:{imagePolicy:d},...f===void 0?{}:{documentPolicy:f},...p===void 0?{}:{signal:p},...m===void 0?{}:{additionalInstructions:m},...g===void 0?{}:{includeTraceEvents:g},...h===void 0?{}:{onEvent:h}})}export{b as captureInvocationOptions,y as captureRuntimeSessionOptions};
2
2
  //# sourceMappingURL=options.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"options.js","names":[],"sources":["../../../src/composition/agent/options.ts"],"sourcesContent":["import { captureOutputFormat } from '../../agent/define/output-format.ts'\nimport { objectValue, optionalAbortSignal, ownData } from '../common/data.ts'\nimport { captureAdditionalInstructions } from './instructions.ts'\nimport { captureToolDefinitions } from '../../agent/tool/capture.ts'\nimport {\n captureApprovalBroker, captureInterceptors, captureRuntimeContextSections, captureSpillStore,\n captureTurnHooks, captureUsagePolicy, captureUserInputBroker,\n} from './policy.ts'\nimport type { RuntimeAgentInvocationOptions, RuntimeAgentSessionOptions } from './types.ts'\nimport { ReasoningEffortId } from '../../primitives/brand.ts'\nimport { resolveAgentModel } from '../provider/model-selection.ts'\nimport type { ModelTarget, ProviderSelection } from '../provider/types.ts'\nimport { captureToolSources } from '../tool-source/definition.ts'\nimport { captureMemoryBinding } from '../memory/definition.ts'\nimport { captureRuntimeSkillSources } from '../skill-provider/definition.ts'\n\nconst KEYS = new Set(['signal', 'additionalInstructions', 'onEvent', 'imagePolicy', 'documentPolicy',\n 'structuredOutput', 'includeTraceEvents', 'model', 'effort', 'maxTokens'])\nconst SESSION_KEYS = new Set(['conversationId', 'tools', 'toolSources', 'skills', 'memory', 'skillCwd',\n 'userInput', 'approvals', 'spillStore', 'interceptors', 'contextSections', 'hooks', 'usagePolicy', 'historyLimits',\n 'ledgerLimits',\n 'eventBufferLimits', 'runtimeLimits', 'compaction'])\n\nexport interface CapturedInvocationOptions {\n /** Already resolved against the configured routes; a full target, never route-only. */\n readonly model?: ModelTarget\n readonly effort?: ReturnType<typeof ReasoningEffortId>\n readonly maxTokens?: number\n readonly structuredOutput?: NonNullable<RuntimeAgentInvocationOptions['structuredOutput']>\n readonly imagePolicy?: 'strict' | 'project'\n readonly documentPolicy?: 'strict' | 'project'\n readonly signal?: AbortSignal\n readonly additionalInstructions?: string\n readonly includeTraceEvents?: boolean\n readonly onEvent?: NonNullable<RuntimeAgentInvocationOptions['onEvent']>\n}\n\n/** Capture all session option references before any agent or capability method can run. */\nexport function captureRuntimeSessionOptions(input: unknown): RuntimeAgentSessionOptions {\n if (input === undefined) return Object.freeze({})\n const source = objectValue(input)\n if (Reflect.ownKeys(source).some(key => typeof key !== 'string' || !SESSION_KEYS.has(key))) {\n throw new TypeError('Runtime session options contain unsupported fields')\n }\n const value = Object.fromEntries([...SESSION_KEYS].map(key => [key, ownData(source, key, false)])) as Record<string, unknown>\n const tools = value.tools === undefined ? undefined : captureToolDefinitions(value.tools)\n const toolSources = value.toolSources === undefined ? undefined : captureToolSources(value.toolSources)\n const approvals = captureApprovalBroker(value.approvals)\n const spillStore = captureSpillStore(value.spillStore)\n const userInput = captureUserInputBroker(value.userInput)\n const interceptors = captureInterceptors(value.interceptors)\n const contextSections = captureRuntimeContextSections(value.contextSections)\n const hooks = captureTurnHooks(value.hooks)\n const usagePolicy = captureUsagePolicy(value.usagePolicy)\n const memory = value.memory === false || value.memory === undefined\n ? value.memory\n : captureMemoryBinding(value.memory)\n const skills = value.skills === undefined ? undefined : captureRuntimeSkillSources(value.skills)\n return Object.freeze({\n ...(value.conversationId === undefined ? {} : { conversationId: value.conversationId as string }),\n ...(tools === undefined ? {} : { tools }),\n ...(toolSources === undefined ? {} : { toolSources }),\n ...(skills === undefined ? {} : { skills }),\n ...(memory === undefined ? {} : { memory }),\n ...(value.skillCwd === undefined ? {} : { skillCwd: value.skillCwd as string }),\n ...(userInput === undefined ? {} : { userInput }),\n ...(approvals === undefined ? {} : { approvals }),\n ...(spillStore === undefined ? {} : { spillStore }),\n ...(interceptors === undefined ? {} : { interceptors }),\n ...(contextSections === undefined ? {} : { contextSections }),\n ...(hooks === undefined ? {} : { hooks }),\n ...(usagePolicy === undefined ? {} : { usagePolicy }),\n ...(value.historyLimits === undefined ? {} : {\n historyLimits: value.historyLimits as NonNullable<RuntimeAgentSessionOptions['historyLimits']>,\n }),\n ...(value.ledgerLimits === undefined ? {} : {\n ledgerLimits: value.ledgerLimits as NonNullable<RuntimeAgentSessionOptions['ledgerLimits']>,\n }),\n ...(value.eventBufferLimits === undefined ? {} : {\n eventBufferLimits: value.eventBufferLimits as NonNullable<RuntimeAgentSessionOptions['eventBufferLimits']>,\n }),\n ...(value.runtimeLimits === undefined ? {} : {\n runtimeLimits: value.runtimeLimits as NonNullable<RuntimeAgentSessionOptions['runtimeLimits']>,\n }),\n ...(value.compaction === undefined ? {} : {\n compaction: value.compaction as NonNullable<RuntimeAgentSessionOptions['compaction']>,\n }),\n })\n}\n\n/**\n * Capture one invocation's options, resolving any model override eagerly.\n *\n * The resolution happens HERE, at the entry of `run`/`stream`, so an unknown\n * route or a route with no default fails before an operation lease, a history\n * append, or a single byte of provider traffic — the same guarantee the agent\n * binding gives, on the same error codes.\n * @param input - caller-supplied invocation options.\n * @param selection - configured provider routes to resolve an override against.\n */\nexport function captureInvocationOptions(\n input: unknown,\n selection?: ProviderSelection,\n): CapturedInvocationOptions {\n if (input === undefined) return Object.freeze({})\n const source = objectValue(input)\n if (Reflect.ownKeys(source).some(key => typeof key !== 'string' || !KEYS.has(key))) {\n throw new TypeError('Runtime invocation options contain unsupported fields')\n }\n const structured = ownData(source, 'structuredOutput', false)\n let structuredOutput: RuntimeAgentInvocationOptions['structuredOutput']\n if (structured !== undefined) {\n const output = objectValue(structured), schema = objectValue(ownData(output, 'schema'))\n const parse = ownData(schema, 'parse')\n if (typeof parse !== 'function') throw new TypeError('structuredOutput schema requires a synchronous parser')\n const format = captureOutputFormat({ type: 'json_schema', name: ownData(output, 'name') as string,\n schema: ownData(schema, 'jsonSchema') as import('../../primitives/index.ts').JsonObject })!\n if (format.type !== 'json_schema') throw new TypeError('structuredOutput requires JSON Schema')\n structuredOutput = Object.freeze({ name: format.name, schema: Object.freeze({ jsonSchema: format.schema,\n parse: parse.bind(schema) as (value: unknown) => import('../../primitives/index.ts').JsonValue }) })\n }\n const imagePolicy = ownData(source, 'imagePolicy', false)\n if (imagePolicy !== undefined && imagePolicy !== 'strict' && imagePolicy !== 'project') throw new TypeError('imagePolicy must be strict or project')\n const documentPolicy = ownData(source, 'documentPolicy', false)\n if (documentPolicy !== undefined && documentPolicy !== 'strict' && documentPolicy !== 'project') throw new TypeError('documentPolicy must be strict or project')\n const signal = optionalAbortSignal(ownData(source, 'signal', false))\n const additionalInstructions = captureAdditionalInstructions(ownData(source, 'additionalInstructions', false))\n const onEvent = ownData(source, 'onEvent', false)\n if (onEvent !== undefined && typeof onEvent !== 'function') throw new TypeError('Runtime event observer must be callable')\n const includeTraceEvents = ownData(source, 'includeTraceEvents', false)\n if (includeTraceEvents !== undefined && typeof includeTraceEvents !== 'boolean') throw new TypeError('includeTraceEvents must be boolean')\n const requested = ownData(source, 'model', false)\n if (requested !== undefined && selection === undefined) {\n throw new TypeError('Runtime invocation model override is unavailable on this session')\n }\n const model = requested === undefined ? undefined : resolveAgentModel(selection!, requested)\n const rawEffort = ownData(source, 'effort', false)\n if (rawEffort !== undefined && typeof rawEffort !== 'string') throw new TypeError('Runtime invocation effort must be a string')\n const effort = rawEffort === undefined ? undefined : ReasoningEffortId(rawEffort)\n const maxTokens = ownData(source, 'maxTokens', false)\n if (maxTokens !== undefined && (!Number.isSafeInteger(maxTokens) || (maxTokens as number) < 1)) {\n throw new TypeError('Runtime invocation maxTokens must be a positive safe integer')\n }\n return Object.freeze({ ...(model === undefined ? {} : { model }),\n ...(effort === undefined ? {} : { effort }),\n ...(maxTokens === undefined ? {} : { maxTokens: maxTokens as number }),\n ...(structuredOutput === undefined ? {} : { structuredOutput }), ...(imagePolicy === undefined ? {} : { imagePolicy }),\n ...(documentPolicy === undefined ? {} : { documentPolicy }), ...(signal === undefined ? {} : { signal }),\n ...(additionalInstructions === undefined ? {} : { additionalInstructions }),\n ...(includeTraceEvents === undefined ? {} : { includeTraceEvents }),\n ...(onEvent === undefined ? {} : { onEvent: onEvent as NonNullable<RuntimeAgentInvocationOptions['onEvent']> }) })\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"options.js","names":[],"sources":["../../../src/composition/agent/options.ts"],"sourcesContent":["import { captureOutputFormat } from '../../agent/define/output-format.ts'\nimport { objectValue, optionalAbortSignal, ownData } from '../common/data.ts'\nimport { captureAdditionalInstructions } from './instructions.ts'\nimport { captureToolDefinitions } from '../../agent/tool/capture.ts'\nimport {\n captureApprovalBroker, captureInterceptors, captureRuntimeContextSections, captureSpillStore,\n captureTurnHooks, captureUsagePolicy, captureUserInputBroker,\n} from './policy.ts'\nimport type { RuntimeAgentInvocationOptions, RuntimeAgentSessionOptions } from './types.ts'\nimport { resolveAgentModel } from '../provider/model-selection.ts'\nimport type { ModelTarget, ProviderSelection } from '../provider/types.ts'\nimport { captureToolSources } from '../tool-source/definition.ts'\nimport { captureMemoryBinding } from '../memory/definition.ts'\nimport { captureRuntimeSkillSources } from '../skill-provider/definition.ts'\n\nconst KEYS = new Set(['signal', 'additionalInstructions', 'onEvent', 'imagePolicy', 'documentPolicy',\n 'structuredOutput', 'includeTraceEvents', 'model', 'maxTokens'])\nconst SESSION_KEYS = new Set(['conversationId', 'tools', 'toolSources', 'skills', 'memory', 'skillCwd',\n 'userInput', 'approvals', 'spillStore', 'interceptors', 'contextSections', 'hooks', 'usagePolicy', 'historyLimits',\n 'ledgerLimits',\n 'eventBufferLimits', 'runtimeLimits', 'compaction'])\n\nexport interface CapturedInvocationOptions {\n /** Already resolved against the configured routes; a full target, never route-only. */\n readonly model?: ModelTarget\n readonly maxTokens?: number\n readonly structuredOutput?: NonNullable<RuntimeAgentInvocationOptions['structuredOutput']>\n readonly imagePolicy?: 'strict' | 'project'\n readonly documentPolicy?: 'strict' | 'project'\n readonly signal?: AbortSignal\n readonly additionalInstructions?: string\n readonly includeTraceEvents?: boolean\n readonly onEvent?: NonNullable<RuntimeAgentInvocationOptions['onEvent']>\n}\n\n/** Capture all session option references before any agent or capability method can run. */\nexport function captureRuntimeSessionOptions(input: unknown): RuntimeAgentSessionOptions {\n if (input === undefined) return Object.freeze({})\n const source = objectValue(input)\n if (Reflect.ownKeys(source).some(key => typeof key !== 'string' || !SESSION_KEYS.has(key))) {\n throw new TypeError('Runtime session options contain unsupported fields')\n }\n const value = Object.fromEntries([...SESSION_KEYS].map(key => [key, ownData(source, key, false)])) as Record<string, unknown>\n const tools = value.tools === undefined ? undefined : captureToolDefinitions(value.tools)\n const toolSources = value.toolSources === undefined ? undefined : captureToolSources(value.toolSources)\n const approvals = captureApprovalBroker(value.approvals)\n const spillStore = captureSpillStore(value.spillStore)\n const userInput = captureUserInputBroker(value.userInput)\n const interceptors = captureInterceptors(value.interceptors)\n const contextSections = captureRuntimeContextSections(value.contextSections)\n const hooks = captureTurnHooks(value.hooks)\n const usagePolicy = captureUsagePolicy(value.usagePolicy)\n const memory = value.memory === false || value.memory === undefined\n ? value.memory\n : captureMemoryBinding(value.memory)\n const skills = value.skills === undefined ? undefined : captureRuntimeSkillSources(value.skills)\n return Object.freeze({\n ...(value.conversationId === undefined ? {} : { conversationId: value.conversationId as string }),\n ...(tools === undefined ? {} : { tools }),\n ...(toolSources === undefined ? {} : { toolSources }),\n ...(skills === undefined ? {} : { skills }),\n ...(memory === undefined ? {} : { memory }),\n ...(value.skillCwd === undefined ? {} : { skillCwd: value.skillCwd as string }),\n ...(userInput === undefined ? {} : { userInput }),\n ...(approvals === undefined ? {} : { approvals }),\n ...(spillStore === undefined ? {} : { spillStore }),\n ...(interceptors === undefined ? {} : { interceptors }),\n ...(contextSections === undefined ? {} : { contextSections }),\n ...(hooks === undefined ? {} : { hooks }),\n ...(usagePolicy === undefined ? {} : { usagePolicy }),\n ...(value.historyLimits === undefined ? {} : {\n historyLimits: value.historyLimits as NonNullable<RuntimeAgentSessionOptions['historyLimits']>,\n }),\n ...(value.ledgerLimits === undefined ? {} : {\n ledgerLimits: value.ledgerLimits as NonNullable<RuntimeAgentSessionOptions['ledgerLimits']>,\n }),\n ...(value.eventBufferLimits === undefined ? {} : {\n eventBufferLimits: value.eventBufferLimits as NonNullable<RuntimeAgentSessionOptions['eventBufferLimits']>,\n }),\n ...(value.runtimeLimits === undefined ? {} : {\n runtimeLimits: value.runtimeLimits as NonNullable<RuntimeAgentSessionOptions['runtimeLimits']>,\n }),\n ...(value.compaction === undefined ? {} : {\n compaction: value.compaction as NonNullable<RuntimeAgentSessionOptions['compaction']>,\n }),\n })\n}\n\n/**\n * Capture one invocation's options, resolving any model override eagerly.\n *\n * The resolution happens HERE, at the entry of `run`/`stream`, so an unknown\n * route or a route with no default fails before an operation lease, a history\n * append, or a single byte of provider traffic — the same guarantee the agent\n * binding gives, on the same error codes.\n * @param input - caller-supplied invocation options.\n * @param selection - configured provider routes to resolve an override against.\n */\nexport function captureInvocationOptions(\n input: unknown,\n selection?: ProviderSelection,\n): CapturedInvocationOptions {\n if (input === undefined) return Object.freeze({})\n const source = objectValue(input)\n if (Reflect.ownKeys(source).some(key => typeof key !== 'string' || !KEYS.has(key))) {\n throw new TypeError('Runtime invocation options contain unsupported fields')\n }\n const structured = ownData(source, 'structuredOutput', false)\n let structuredOutput: RuntimeAgentInvocationOptions['structuredOutput']\n if (structured !== undefined) {\n const output = objectValue(structured), schema = objectValue(ownData(output, 'schema'))\n const parse = ownData(schema, 'parse')\n if (typeof parse !== 'function') throw new TypeError('structuredOutput schema requires a synchronous parser')\n const format = captureOutputFormat({ type: 'json_schema', name: ownData(output, 'name') as string,\n schema: ownData(schema, 'jsonSchema') as import('../../primitives/index.ts').JsonObject })!\n if (format.type !== 'json_schema') throw new TypeError('structuredOutput requires JSON Schema')\n structuredOutput = Object.freeze({ name: format.name, schema: Object.freeze({ jsonSchema: format.schema,\n parse: parse.bind(schema) as (value: unknown) => import('../../primitives/index.ts').JsonValue }) })\n }\n const imagePolicy = ownData(source, 'imagePolicy', false)\n if (imagePolicy !== undefined && imagePolicy !== 'strict' && imagePolicy !== 'project') throw new TypeError('imagePolicy must be strict or project')\n const documentPolicy = ownData(source, 'documentPolicy', false)\n if (documentPolicy !== undefined && documentPolicy !== 'strict' && documentPolicy !== 'project') throw new TypeError('documentPolicy must be strict or project')\n const signal = optionalAbortSignal(ownData(source, 'signal', false))\n const additionalInstructions = captureAdditionalInstructions(ownData(source, 'additionalInstructions', false))\n const onEvent = ownData(source, 'onEvent', false)\n if (onEvent !== undefined && typeof onEvent !== 'function') throw new TypeError('Runtime event observer must be callable')\n const includeTraceEvents = ownData(source, 'includeTraceEvents', false)\n if (includeTraceEvents !== undefined && typeof includeTraceEvents !== 'boolean') throw new TypeError('includeTraceEvents must be boolean')\n const requested = ownData(source, 'model', false)\n if (requested !== undefined && selection === undefined) {\n throw new TypeError('Runtime invocation model override is unavailable on this session')\n }\n const model = requested === undefined ? undefined : resolveAgentModel(selection!, requested)\n const maxTokens = ownData(source, 'maxTokens', false)\n if (maxTokens !== undefined && (!Number.isSafeInteger(maxTokens) || (maxTokens as number) < 1)) {\n throw new TypeError('Runtime invocation maxTokens must be a positive safe integer')\n }\n return Object.freeze({ ...(model === undefined ? {} : { model }),\n ...(maxTokens === undefined ? {} : { maxTokens: maxTokens as number }),\n ...(structuredOutput === undefined ? {} : { structuredOutput }), ...(imagePolicy === undefined ? {} : { imagePolicy }),\n ...(documentPolicy === undefined ? {} : { documentPolicy }), ...(signal === undefined ? {} : { signal }),\n ...(additionalInstructions === undefined ? {} : { additionalInstructions }),\n ...(includeTraceEvents === undefined ? {} : { includeTraceEvents }),\n ...(onEvent === undefined ? {} : { onEvent: onEvent as NonNullable<RuntimeAgentInvocationOptions['onEvent']> }) })\n}\n"],"mappings":"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"}