@myagentroam/agent 0.9.140 → 0.9.142

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 (230) hide show
  1. package/dist/agent-core/host/contracts.d.ts +64 -0
  2. package/dist/{host → agent-core/host}/local-agent-host.d.ts +6 -5
  3. package/dist/{host → agent-core/host}/local-agent-host.js +4 -4
  4. package/dist/{model → agent-core/model}/anthropic-messages.js +24 -7
  5. package/dist/{model → agent-core/model}/contracts.d.ts +6 -16
  6. package/dist/{model → agent-core/model}/openai-responses.js +28 -10
  7. package/dist/agent-core/model/recovery.d.ts +4 -0
  8. package/dist/agent-core/model/recovery.js +71 -0
  9. package/dist/{model → agent-core/model}/sse.d.ts +2 -0
  10. package/dist/{model → agent-core/model}/sse.js +11 -1
  11. package/dist/{prompts → agent-core/prompts}/core.d.ts +3 -13
  12. package/dist/{prompts → agent-core/prompts}/index.d.ts +1 -1
  13. package/dist/{prompts → agent-core/prompts}/modes.d.ts +1 -1
  14. package/dist/{prompts → agent-core/prompts}/resources.d.ts +1 -1
  15. package/dist/{runtime/compact.d.ts → agent-core/runtime/compaction/history.d.ts} +2 -23
  16. package/dist/{runtime/compact.js → agent-core/runtime/compaction/history.js} +2 -92
  17. package/dist/agent-core/runtime/compaction/operation.d.ts +22 -0
  18. package/dist/agent-core/runtime/compaction/operation.js +91 -0
  19. package/dist/agent-core/runtime/context/contracts.d.ts +12 -0
  20. package/dist/{runtime/environment-context.d.ts → agent-core/runtime/context/environment.d.ts} +2 -2
  21. package/dist/{runtime/environment-context.js → agent-core/runtime/context/environment.js} +1 -1
  22. package/dist/{runtime/context-gc-runtime.d.ts → agent-core/runtime/context/gc-runtime.d.ts} +4 -4
  23. package/dist/{runtime/context-gc-runtime.js → agent-core/runtime/context/gc-runtime.js} +3 -3
  24. package/dist/{runtime/context-gc-tokens.d.ts → agent-core/runtime/context/gc-tokens.d.ts} +2 -2
  25. package/dist/{runtime/context-gc-tokens.js → agent-core/runtime/context/gc-tokens.js} +3 -3
  26. package/dist/{runtime/context-gc.d.ts → agent-core/runtime/context/gc.d.ts} +3 -3
  27. package/dist/{runtime/context-gc.js → agent-core/runtime/context/gc.js} +6 -6
  28. package/dist/{runtime → agent-core/runtime/context}/instructions.d.ts +1 -1
  29. package/dist/{runtime → agent-core/runtime/context}/instructions.js +1 -1
  30. package/dist/{runtime → agent-core/runtime/context}/normalize.d.ts +1 -1
  31. package/dist/{runtime/context-projection.d.ts → agent-core/runtime/context/projection.d.ts} +3 -3
  32. package/dist/{runtime/context-projection.js → agent-core/runtime/context/projection.js} +4 -4
  33. package/dist/agent-core/runtime/context/request-budget.d.ts +6 -0
  34. package/dist/agent-core/runtime/context/request-budget.js +22 -0
  35. package/dist/agent-core/runtime/context/restore.d.ts +15 -0
  36. package/dist/agent-core/runtime/context/restore.js +85 -0
  37. package/dist/agent-core/runtime/context/usage.d.ts +18 -0
  38. package/dist/agent-core/runtime/context/usage.js +138 -0
  39. package/dist/agent-core/runtime/context/world-state.d.ts +35 -0
  40. package/dist/agent-core/runtime/context/world-state.js +133 -0
  41. package/dist/agent-core/runtime/contracts.d.ts +37 -0
  42. package/dist/agent-core/runtime/event-projection.d.ts +5 -0
  43. package/dist/agent-core/runtime/event-projection.js +17 -0
  44. package/dist/agent-core/runtime/events.d.ts +142 -0
  45. package/dist/agent-core/runtime/execution.d.ts +50 -0
  46. package/dist/agent-core/runtime/execution.js +393 -0
  47. package/dist/{runtime → agent-core/runtime}/rollout-budget.d.ts +1 -1
  48. package/dist/agent-core/sdk/agent.js +209 -0
  49. package/dist/agent-core/sdk/model-runtime.d.ts +13 -0
  50. package/dist/agent-core/sdk/model-runtime.js +63 -0
  51. package/dist/agent-core/sdk/session-title.d.ts +3 -0
  52. package/dist/agent-core/sdk/session-title.js +42 -0
  53. package/dist/agent-core/sdk/session.d.ts +62 -0
  54. package/dist/agent-core/sdk/session.js +1147 -0
  55. package/dist/agent-core/sdk/subagent-backend.d.ts +3 -0
  56. package/dist/agent-core/sdk/subagent-backend.js +46 -0
  57. package/dist/agent-core/sdk/types.d.ts +56 -0
  58. package/dist/{session → agent-core/session}/catalog.d.ts +2 -1
  59. package/dist/{session → agent-core/session}/context-gc-checkpoint.js +1 -1
  60. package/dist/{session → agent-core/session}/jsonl-store.d.ts +2 -2
  61. package/dist/{session → agent-core/session}/jsonl-store.js +1 -1
  62. package/dist/agent-core/subagent/contracts.d.ts +91 -0
  63. package/dist/agent-core/subagent/contracts.js +1 -0
  64. package/dist/agent-core/subagent/scheduler.d.ts +117 -0
  65. package/dist/{subagent → agent-core/subagent}/session-controller.d.ts +3 -2
  66. package/dist/agent-core/tools/agent/agent-cancel.d.ts +7 -0
  67. package/dist/{tools → agent-core/tools/agent}/agent-cancel.js +1 -1
  68. package/dist/agent-core/tools/agent/agent-message.d.ts +7 -0
  69. package/dist/{tools → agent-core/tools/agent}/agent-message.js +2 -2
  70. package/dist/{tools → agent-core/tools/agent}/agent-start.d.ts +3 -3
  71. package/dist/{tools → agent-core/tools/agent}/agent-start.js +3 -3
  72. package/dist/agent-core/tools/agent/agent-wait.d.ts +7 -0
  73. package/dist/{tools → agent-core/tools/agent}/agent-wait.js +2 -2
  74. package/dist/{tools → agent-core/tools/agent}/question.d.ts +2 -2
  75. package/dist/{tools → agent-core/tools/agent}/question.js +2 -2
  76. package/dist/{tools → agent-core/tools/agent}/skill.d.ts +2 -2
  77. package/dist/{tools → agent-core/tools/agent}/skill.js +2 -2
  78. package/dist/{tools → agent-core/tools/agent}/todo-read.d.ts +2 -2
  79. package/dist/{tools → agent-core/tools/agent}/todo-write.d.ts +2 -2
  80. package/dist/{tools → agent-core/tools/agent}/todo-write.js +2 -2
  81. package/dist/{tools → agent-core/tools/agent}/todo.d.ts +2 -9
  82. package/dist/{tools → agent-core/tools/agent}/todo.js +1 -1
  83. package/dist/{tools → agent-core/tools}/code-mode/cells.d.ts +1 -1
  84. package/dist/{tools → agent-core/tools}/code-mode/dispatch.d.ts +2 -4
  85. package/dist/{tools → agent-core/tools}/code-mode/dispatch.js +5 -4
  86. package/dist/{tools → agent-core/tools}/code-mode/engine.d.ts +1 -1
  87. package/dist/agent-core/tools/code-mode/engine.js +1 -0
  88. package/dist/{tools/code-mode.d.ts → agent-core/tools/code-mode/index.d.ts} +7 -7
  89. package/dist/{tools/code-mode.js → agent-core/tools/code-mode/index.js} +15 -16
  90. package/dist/{tools → agent-core/tools}/code-mode/quickjs-engine.js +12 -2
  91. package/dist/{tools → agent-core/tools}/code-mode/state.d.ts +2 -13
  92. package/dist/agent-core/tools/code-mode/worker.d.ts +1 -0
  93. package/dist/agent-core/tools/contracts.d.ts +168 -0
  94. package/dist/agent-core/tools/contracts.js +1 -0
  95. package/dist/agent-core/tools/execution.d.ts +34 -0
  96. package/dist/agent-core/tools/execution.js +102 -0
  97. package/dist/agent-core/tools/local/apply-patch.d.ts +19 -0
  98. package/dist/{tools → agent-core/tools/local}/apply-patch.js +8 -2
  99. package/dist/{tools → agent-core/tools/local}/exec.d.ts +5 -17
  100. package/dist/{tools → agent-core/tools/local}/exec.js +4 -4
  101. package/dist/{tools → agent-core/tools/local}/read.d.ts +7 -15
  102. package/dist/{tools → agent-core/tools/local}/read.js +185 -2
  103. package/dist/{tools/local-registry.d.ts → agent-core/tools/local/registry.d.ts} +5 -5
  104. package/dist/agent-core/tools/local/registry.js +101 -0
  105. package/dist/{tools → agent-core/tools/local}/view-image.d.ts +4 -9
  106. package/dist/{tools → agent-core/tools/local}/view-image.js +2 -2
  107. package/dist/agent-core/tools/local/web-fetch.d.ts +4 -0
  108. package/dist/agent-core/tools/local/web-fetch.js +85 -0
  109. package/dist/agent-core/tools/local/web-search.d.ts +7 -0
  110. package/dist/agent-core/tools/local/web-search.js +34 -0
  111. package/dist/{tools/local-workspace-tools.js → agent-core/tools/local/workspace-tools.js} +1 -1
  112. package/dist/{sdk/mcp-catalog.d.ts → agent-core/tools/mcp/catalog.d.ts} +1 -2
  113. package/dist/{sdk/mcp-catalog.js → agent-core/tools/mcp/catalog.js} +1 -1
  114. package/dist/agent-core/tools/mcp/history.d.ts +4 -0
  115. package/dist/agent-core/tools/mcp/history.js +33 -0
  116. package/dist/{tools → agent-core/tools/mcp}/tool-search.d.ts +3 -3
  117. package/dist/{tools → agent-core/tools/mcp}/tool-search.js +4 -4
  118. package/dist/agent-core/tools/output-projection.d.ts +14 -0
  119. package/dist/agent-core/tools/output-projection.js +189 -0
  120. package/dist/{tools → agent-core/tools}/registry.d.ts +1 -1
  121. package/dist/agent-core/tools/registry.js +47 -0
  122. package/dist/{tools → agent-core/tools}/runtime-context.d.ts +8 -7
  123. package/dist/agent-core/tools/runtime-context.js +1 -0
  124. package/dist/{tools → agent-core/tools}/runtime.d.ts +1 -1
  125. package/dist/cli/codex-auth-file.d.ts +1 -1
  126. package/dist/cli/codex-auth-file.js +2 -2
  127. package/dist/cli/main.js +9 -9
  128. package/dist/index.d.ts +17 -15
  129. package/dist/index.js +8 -8
  130. package/dist/sandbox/linux/bubblewrap-sandbox-executor.d.ts +1 -1
  131. package/dist/sandbox/linux/bubblewrap-sandbox-executor.js +1 -1
  132. package/package.json +3 -3
  133. package/dist/host/contracts.d.ts +0 -21
  134. package/dist/sdk/agent.js +0 -2524
  135. package/dist/sdk/types.d.ts +0 -349
  136. package/dist/subagent/scheduler.d.ts +0 -206
  137. package/dist/tools/agent-cancel.d.ts +0 -7
  138. package/dist/tools/agent-message.d.ts +0 -7
  139. package/dist/tools/agent-wait.d.ts +0 -7
  140. package/dist/tools/apply-patch.d.ts +0 -32
  141. package/dist/tools/local-registry.js +0 -373
  142. package/dist/tools/registry.js +0 -47
  143. package/dist/tools/web-fetch.d.ts +0 -2
  144. package/dist/tools/web-fetch.js +0 -12
  145. package/dist/tools/web-search.d.ts +0 -2
  146. package/dist/tools/web-search.js +0 -15
  147. package/dist/{error.d.ts → agent-core/error.d.ts} +0 -0
  148. package/dist/{error.js → agent-core/error.js} +0 -0
  149. package/dist/{host → agent-core/host}/contracts.js +0 -0
  150. package/dist/{host → agent-core/host}/local-process-executor.d.ts +0 -0
  151. package/dist/{host → agent-core/host}/local-process-executor.js +0 -0
  152. package/dist/{host → agent-core/host}/network.d.ts +0 -0
  153. package/dist/{host → agent-core/host}/network.js +0 -0
  154. package/dist/{model → agent-core/model}/anthropic-messages.d.ts +0 -0
  155. package/dist/{model → agent-core/model}/anthropic-thinking.d.ts +0 -0
  156. package/dist/{model → agent-core/model}/anthropic-thinking.js +0 -0
  157. package/dist/{model → agent-core/model}/catalog-file.d.ts +0 -0
  158. package/dist/{model → agent-core/model}/catalog-file.js +0 -0
  159. package/dist/{model → agent-core/model}/configuration.d.ts +0 -0
  160. package/dist/{model → agent-core/model}/configuration.js +0 -0
  161. package/dist/{model → agent-core/model}/contracts.js +0 -0
  162. package/dist/{model → agent-core/model}/http.d.ts +0 -0
  163. package/dist/{model → agent-core/model}/http.js +0 -0
  164. package/dist/{model → agent-core/model}/openai-responses.d.ts +0 -0
  165. package/dist/{model → agent-core/model}/runtime-credential.d.ts +0 -0
  166. package/dist/{model → agent-core/model}/runtime-credential.js +0 -0
  167. package/dist/{model → agent-core/model}/transport-test.d.ts +0 -0
  168. package/dist/{model → agent-core/model}/transport-test.js +0 -0
  169. package/dist/{prompts → agent-core/prompts}/compact.d.ts +0 -0
  170. package/dist/{prompts → agent-core/prompts}/compact.js +0 -0
  171. package/dist/{prompts → agent-core/prompts}/core.js +0 -0
  172. package/dist/{prompts → agent-core/prompts}/execution-budget.d.ts +0 -0
  173. package/dist/{prompts → agent-core/prompts}/execution-budget.js +0 -0
  174. package/dist/{prompts → agent-core/prompts}/index.js +0 -0
  175. package/dist/{prompts → agent-core/prompts}/modes.js +0 -0
  176. package/dist/{prompts → agent-core/prompts}/output.d.ts +0 -0
  177. package/dist/{prompts → agent-core/prompts}/output.js +0 -0
  178. package/dist/{prompts → agent-core/prompts}/resources.js +0 -0
  179. package/dist/{prompts → agent-core/prompts}/subagent.d.ts +0 -0
  180. package/dist/{prompts → agent-core/prompts}/subagent.js +0 -0
  181. package/dist/{prompts → agent-core/prompts}/title.d.ts +0 -0
  182. package/dist/{prompts → agent-core/prompts}/title.js +0 -0
  183. package/dist/{prompts → agent-core/prompts}/workflow.d.ts +0 -0
  184. package/dist/{prompts → agent-core/prompts}/workflow.js +0 -0
  185. package/dist/{runtime → agent-core/runtime}/async-queue.d.ts +0 -0
  186. package/dist/{runtime → agent-core/runtime}/async-queue.js +0 -0
  187. package/dist/{sdk/types.js → agent-core/runtime/context/contracts.js} +0 -0
  188. package/dist/{runtime → agent-core/runtime/context}/normalize.js +0 -0
  189. package/dist/{session/types.js → agent-core/runtime/contracts.js} +0 -0
  190. package/dist/{tools/code-mode/engine.js → agent-core/runtime/events.js} +0 -0
  191. package/dist/{runtime → agent-core/runtime}/execution-policy.d.ts +0 -0
  192. package/dist/{runtime → agent-core/runtime}/execution-policy.js +0 -0
  193. package/dist/{runtime → agent-core/runtime}/plan-output.d.ts +0 -0
  194. package/dist/{runtime → agent-core/runtime}/plan-output.js +0 -0
  195. package/dist/{runtime → agent-core/runtime}/rollout-budget.js +0 -0
  196. package/dist/{runtime → agent-core/runtime}/token-budget.d.ts +0 -0
  197. package/dist/{runtime → agent-core/runtime}/token-budget.js +0 -0
  198. package/dist/{sdk → agent-core/sdk}/agent.d.ts +0 -0
  199. package/dist/{tools/code-mode/worker.d.ts → agent-core/sdk/types.js} +0 -0
  200. package/dist/{session → agent-core/session}/catalog.js +0 -0
  201. package/dist/{session → agent-core/session}/context-gc-checkpoint.d.ts +0 -0
  202. package/dist/{session → agent-core/session}/context-gc-replacements.d.ts +0 -0
  203. package/dist/{session → agent-core/session}/context-gc-replacements.js +0 -0
  204. package/dist/{session → agent-core/session}/context-gc-subagent.d.ts +0 -0
  205. package/dist/{session → agent-core/session}/context-gc-subagent.js +0 -0
  206. package/dist/{session → agent-core/session}/transaction-recovery.d.ts +0 -0
  207. package/dist/{session → agent-core/session}/transaction-recovery.js +0 -0
  208. package/dist/{session → agent-core/session}/types.d.ts +0 -0
  209. package/dist/{tools/runtime-context.js → agent-core/session/types.js} +0 -0
  210. package/dist/{subagent → agent-core/subagent}/scheduler.js +0 -0
  211. package/dist/{subagent → agent-core/subagent}/session-controller.js +0 -0
  212. package/dist/{tools → agent-core/tools/agent}/todo-read.js +0 -0
  213. package/dist/{tools → agent-core/tools}/callers.d.ts +0 -0
  214. package/dist/{tools → agent-core/tools}/callers.js +0 -0
  215. package/dist/{tools → agent-core/tools}/code-mode/cells.js +1 -1
  216. /package/dist/{tools → agent-core/tools}/code-mode/quickjs-engine.d.ts +0 -0
  217. /package/dist/{tools → agent-core/tools}/code-mode/state.js +0 -0
  218. /package/dist/{tools → agent-core/tools}/code-mode/text-output.d.ts +0 -0
  219. /package/dist/{tools → agent-core/tools}/code-mode/text-output.js +0 -0
  220. /package/dist/{tools → agent-core/tools}/code-mode/worker.js +0 -0
  221. /package/dist/{tools → agent-core/tools}/execution-limits.d.ts +0 -0
  222. /package/dist/{tools → agent-core/tools}/execution-limits.js +0 -0
  223. /package/dist/{tools → agent-core/tools/local}/read-context.d.ts +0 -0
  224. /package/dist/{tools → agent-core/tools/local}/read-context.js +0 -0
  225. /package/dist/{tools/local-workspace-tools.d.ts → agent-core/tools/local/workspace-tools.d.ts} +0 -0
  226. /package/dist/{tools → agent-core/tools}/runtime.js +0 -0
  227. /package/dist/{tools → agent-core/tools}/scheduler.d.ts +0 -0
  228. /package/dist/{tools → agent-core/tools}/scheduler.js +0 -0
  229. /package/dist/{tools → agent-core/tools}/shared/path-resolver.d.ts +0 -0
  230. /package/dist/{tools → agent-core/tools}/shared/path-resolver.js +0 -0
@@ -0,0 +1,22 @@
1
+ import type { ModelEvent, ModelRequest, ModelTurnSession } from '../../model/contracts.js';
2
+ export interface CompactionProgress {
3
+ state: 'STARTED' | 'PROGRESS' | 'FINISHED';
4
+ elapsedMs: number;
5
+ inputTokensEstimate: number;
6
+ modelRequests: number;
7
+ eventCounts: Partial<Record<ModelEvent['type'], number>>;
8
+ textDeltaCharacters: number;
9
+ firstOutputAfterMs?: number;
10
+ lastOutputAfterMs?: number;
11
+ timedOut: boolean;
12
+ }
13
+ /** One deadline spans all model attempts and recovery waits for a single compaction. */
14
+ export declare class CompactionOperation {
15
+ #private;
16
+ private readonly record;
17
+ readonly signal: AbortSignal;
18
+ constructor(parent: AbortSignal, record: (progress: CompactionProgress) => void | Promise<void>);
19
+ start(model: Pick<ModelTurnSession, 'start'>, request: ModelRequest): AsyncIterable<ModelEvent>;
20
+ dispose(): Promise<void>;
21
+ private report;
22
+ }
@@ -0,0 +1,91 @@
1
+ import { MarAgentError } from '../../error.js';
2
+ import { countModelTokens } from '../token-budget.js';
3
+ const COMPACTION_TIMEOUT_MS = 600_000;
4
+ const COMPACTION_PROGRESS_INTERVAL_MS = 30_000;
5
+ /** One deadline spans all model attempts and recovery waits for a single compaction. */
6
+ export class CompactionOperation {
7
+ record;
8
+ #controller = new AbortController();
9
+ signal;
10
+ #startedAt = Date.now();
11
+ #deadline;
12
+ #progressTimer;
13
+ #closed = false;
14
+ #tail = Promise.resolve();
15
+ #inputTokensEstimate = 0;
16
+ #modelRequests = 0;
17
+ #eventCounts = {};
18
+ #textDeltaCharacters = 0;
19
+ #firstOutputAfterMs;
20
+ #lastOutputAfterMs;
21
+ constructor(parent, record) {
22
+ this.record = record;
23
+ this.signal = AbortSignal.any([parent, this.#controller.signal]);
24
+ this.#deadline = setTimeout(() => this.#controller.abort(new MarAgentError('MAR_AGENT_MODEL_TIMEOUT', 'Compaction exceeded its total time limit; the previous context was retained.', { details: { reason: 'COMPACTION_DEADLINE_EXCEEDED' } })), COMPACTION_TIMEOUT_MS);
25
+ this.#deadline.unref();
26
+ this.#progressTimer = setInterval(() => {
27
+ void this.report('PROGRESS');
28
+ }, COMPACTION_PROGRESS_INTERVAL_MS);
29
+ this.#progressTimer.unref();
30
+ }
31
+ async *start(model, request) {
32
+ this.signal.throwIfAborted();
33
+ this.#modelRequests++;
34
+ this.#inputTokensEstimate =
35
+ countModelTokens(request.system) +
36
+ request.messages.reduce((sum, message) => sum + countModelTokens(message.content), 0);
37
+ await this.report(this.#modelRequests === 1 ? 'STARTED' : 'PROGRESS');
38
+ let completed = false;
39
+ try {
40
+ for await (const event of model.start(request, this.signal)) {
41
+ this.signal.throwIfAborted();
42
+ this.#eventCounts[event.type] = (this.#eventCounts[event.type] ?? 0) + 1;
43
+ if (event.type === 'completed')
44
+ completed = event.reason === 'completed';
45
+ if (event.type === 'text.delta')
46
+ this.#textDeltaCharacters += event.delta.length;
47
+ if ((event.type === 'text.delta' && event.delta.length > 0) ||
48
+ ((event.type === 'text.completed' || event.type === 'reasoning.summary') &&
49
+ event.text.length > 0)) {
50
+ this.#lastOutputAfterMs = Math.max(0, Date.now() - this.#startedAt);
51
+ this.#firstOutputAfterMs ??= this.#lastOutputAfterMs;
52
+ }
53
+ yield event;
54
+ }
55
+ this.signal.throwIfAborted();
56
+ if (!completed)
57
+ throw new MarAgentError('MAR_AGENT_COMPACT_FAILED', 'Compaction did not return a complete response.');
58
+ }
59
+ catch (error) {
60
+ this.signal.throwIfAborted();
61
+ throw error;
62
+ }
63
+ }
64
+ async dispose() {
65
+ if (this.#closed)
66
+ return;
67
+ this.#closed = true;
68
+ clearTimeout(this.#deadline);
69
+ clearInterval(this.#progressTimer);
70
+ await this.report('FINISHED');
71
+ }
72
+ report(state) {
73
+ const progress = {
74
+ state,
75
+ elapsedMs: Math.max(0, Date.now() - this.#startedAt),
76
+ inputTokensEstimate: this.#inputTokensEstimate,
77
+ modelRequests: this.#modelRequests,
78
+ eventCounts: { ...this.#eventCounts },
79
+ textDeltaCharacters: this.#textDeltaCharacters,
80
+ ...(this.#firstOutputAfterMs === undefined
81
+ ? {}
82
+ : { firstOutputAfterMs: this.#firstOutputAfterMs }),
83
+ ...(this.#lastOutputAfterMs === undefined
84
+ ? {}
85
+ : { lastOutputAfterMs: this.#lastOutputAfterMs }),
86
+ timedOut: this.#controller.signal.aborted
87
+ };
88
+ this.#tail = this.#tail.then(() => this.record(progress)).catch(() => undefined);
89
+ return this.#tail;
90
+ }
91
+ }
@@ -0,0 +1,12 @@
1
+ export interface EnvironmentContextState {
2
+ platform: string;
3
+ architecture?: string;
4
+ shell?: {
5
+ readonly name: string;
6
+ readonly path: string;
7
+ };
8
+ guaranteedCommands?: Readonly<Record<string, string>>;
9
+ workspace: string;
10
+ currentDate?: string;
11
+ timezone?: string;
12
+ }
@@ -1,5 +1,5 @@
1
- import type { ModelMessage } from '../model/contracts.js';
2
- import { type EnvironmentContextState } from '../prompts/core.js';
1
+ import type { ModelMessage } from '../../model/contracts.js';
2
+ import type { EnvironmentContextState } from './contracts.js';
3
3
  export declare function restoreEnvironmentState(payload: unknown): EnvironmentContextState | undefined;
4
4
  export declare function environmentContextUpdate(current: EnvironmentContextState, previous?: EnvironmentContextState, contextualEntries?: readonly string[]): ModelMessage | undefined;
5
5
  export declare function currentLocalTimeContext(instant?: Date, timezone?: string): Pick<EnvironmentContextState, 'currentDate' | 'timezone'>;
@@ -1,5 +1,5 @@
1
1
  import { z } from 'zod';
2
- import { buildEnvironmentContext } from '../prompts/core.js';
2
+ import { buildEnvironmentContext } from '../../prompts/core.js';
3
3
  const environmentStateSchema = z
4
4
  .object({
5
5
  platform: z.string().min(1).max(64),
@@ -1,7 +1,7 @@
1
- import type { ClientToolDefinition, ModelUsage } from '../model/contracts.js';
2
- import { type ContextGcPlatform } from '../session/context-gc-checkpoint.js';
3
- import { JsonlSessionStore, type SessionRecord } from '../session/jsonl-store.js';
4
- import { type ContextProjection } from './context-projection.js';
1
+ import type { ClientToolDefinition, ModelUsage } from '../../model/contracts.js';
2
+ import { type ContextGcPlatform } from '../../session/context-gc-checkpoint.js';
3
+ import { JsonlSessionStore, type SessionRecord } from '../../session/jsonl-store.js';
4
+ import { type ContextProjection } from './projection.js';
5
5
  export interface ContextGcRuntimeInput {
6
6
  readonly store: JsonlSessionStore;
7
7
  readonly sessionId: string;
@@ -1,7 +1,7 @@
1
1
  import { isDeepStrictEqual } from 'node:util';
2
- import { ContextGcCheckpointCache, contextGcMinimumUsageGrowth, contextGcReplacementKey, contextGcSourceProjectionHash } from '../session/context-gc-checkpoint.js';
3
- import { CONTEXT_GC_POLICY, contextGcEligibleUsage, inspectContextGc } from './context-gc.js';
4
- import { buildContextProjection } from './context-projection.js';
2
+ import { ContextGcCheckpointCache, contextGcMinimumUsageGrowth, contextGcReplacementKey, contextGcSourceProjectionHash } from '../../session/context-gc-checkpoint.js';
3
+ import { CONTEXT_GC_POLICY, contextGcEligibleUsage, inspectContextGc } from './gc.js';
4
+ import { buildContextProjection } from './projection.js';
5
5
  /** Only scheduling metadata survives a call; records and validation caches do not. */
6
6
  export class ContextGcRuntime {
7
7
  #scope = '';
@@ -1,5 +1,5 @@
1
- import type { ClientToolDefinition, ModelMessage } from '../model/contracts.js';
2
- export { MODEL_TOKEN_ESTIMATOR as CONTEXT_GC_TOKEN_ESTIMATOR } from './token-budget.js';
1
+ import type { ClientToolDefinition, ModelMessage } from '../../model/contracts.js';
2
+ export { MODEL_TOKEN_ESTIMATOR as CONTEXT_GC_TOKEN_ESTIMATOR } from '../token-budget.js';
3
3
  interface TokenContext {
4
4
  readonly modelId: string;
5
5
  readonly modelProtocol?: string;
@@ -1,6 +1,6 @@
1
- import { openAiInput } from '../model/openai-responses.js';
2
- import { countModelTokens } from './token-budget.js';
3
- export { MODEL_TOKEN_ESTIMATOR as CONTEXT_GC_TOKEN_ESTIMATOR } from './token-budget.js';
1
+ import { openAiInput } from '../../model/openai-responses.js';
2
+ import { countModelTokens } from '../token-budget.js';
3
+ export { MODEL_TOKEN_ESTIMATOR as CONTEXT_GC_TOKEN_ESTIMATOR } from '../token-budget.js';
4
4
  /** Uses Responses lowering, including native alias and cross-model filtering. */
5
5
  export function contextGcTokenEntries(input, messages) {
6
6
  return serializedEntries(input, messages).map((entry) => ({
@@ -1,6 +1,6 @@
1
- import type { ClientToolDefinition, ModelMessage, ModelUsage } from '../model/contracts.js';
2
- import { ContextGcCheckpointCache, type ContextGcCheckpointDraft, type ContextGcEconomicsPolicy, type ContextGcMetrics, type ContextGcPlatform, type ContextGcReplacement } from '../session/context-gc-checkpoint.js';
3
- import type { SessionRecord } from '../session/jsonl-store.js';
1
+ import type { ClientToolDefinition, ModelMessage, ModelUsage } from '../../model/contracts.js';
2
+ import { ContextGcCheckpointCache, type ContextGcCheckpointDraft, type ContextGcEconomicsPolicy, type ContextGcMetrics, type ContextGcPlatform, type ContextGcReplacement } from '../../session/context-gc-checkpoint.js';
3
+ import type { SessionRecord } from '../../session/jsonl-store.js';
4
4
  export declare const CONTEXT_GC_POLICY: ContextGcEconomicsPolicy;
5
5
  interface ContextGcEconomicsInput {
6
6
  readonly contextUsageTokens: number;
@@ -1,9 +1,9 @@
1
- import { ContextGcCheckpointCache, contextGcBaseFromRecords, contextGcLogicalPathKey, contextGcMinimumUsageGrowth, contextGcRecordSourceHash, contextGcTargetKey, normalizeContextGcReplacements } from '../session/context-gc-checkpoint.js';
2
- import { codeCellCompletionSequence, contextGcApplyPatchInputReplacement, contextGcCodeModeInputReplacement, contextGcCodeModeOutputReplacement, contextGcExecInputReplacement, contextGcExecOutputReplacement, contextGcPatchResultFromCompletedPayload, contextGcStaleReadReplacement, contextGcWebOutputReplacement, normalizeContextGcCodeModeInput, normalizeContextGcExecResult } from '../session/context-gc-replacements.js';
3
- import { contextGcSubagentNeedsRetainedPriorFinal, contextGcSubagentOutputReplacement, contextGcSubagentPriorFinalIsRetained, contextGcSubagentSnapshotIsPreciselyCovered, contextGcSubagentSnapshotIsSuperseded, contextGcSubagentSnapshotTurnId, normalizeContextGcSubagentSnapshot } from '../session/context-gc-subagent.js';
4
- import { parseReadContextOutput } from '../tools/read-context.js';
5
- import { CONTEXT_GC_TOKEN_ESTIMATOR, contextGcCacheImpact, contextGcMessageTokens, contextGcPrefixTokens, contextGcReclaimedTokens } from './context-gc-tokens.js';
6
- import { applyContextGcReplacementsToMessages, providerToolCallId, providerToolName } from './context-projection.js';
1
+ import { ContextGcCheckpointCache, contextGcBaseFromRecords, contextGcLogicalPathKey, contextGcMinimumUsageGrowth, contextGcRecordSourceHash, contextGcTargetKey, normalizeContextGcReplacements } from '../../session/context-gc-checkpoint.js';
2
+ import { codeCellCompletionSequence, contextGcApplyPatchInputReplacement, contextGcCodeModeInputReplacement, contextGcCodeModeOutputReplacement, contextGcExecInputReplacement, contextGcExecOutputReplacement, contextGcPatchResultFromCompletedPayload, contextGcStaleReadReplacement, contextGcWebOutputReplacement, normalizeContextGcCodeModeInput, normalizeContextGcExecResult } from '../../session/context-gc-replacements.js';
3
+ import { contextGcSubagentNeedsRetainedPriorFinal, contextGcSubagentOutputReplacement, contextGcSubagentPriorFinalIsRetained, contextGcSubagentSnapshotIsPreciselyCovered, contextGcSubagentSnapshotIsSuperseded, contextGcSubagentSnapshotTurnId, normalizeContextGcSubagentSnapshot } from '../../session/context-gc-subagent.js';
4
+ import { parseReadContextOutput } from '../../tools/local/read-context.js';
5
+ import { CONTEXT_GC_TOKEN_ESTIMATOR, contextGcCacheImpact, contextGcMessageTokens, contextGcPrefixTokens, contextGcReclaimedTokens } from './gc-tokens.js';
6
+ import { applyContextGcReplacementsToMessages, providerToolCallId, providerToolName } from './projection.js';
7
7
  export const CONTEXT_GC_POLICY = {
8
8
  version: 1,
9
9
  immediatePaybackRollouts: 3,
@@ -1,4 +1,4 @@
1
- import type { HostSkill } from '../sdk/types.js';
1
+ import type { HostSkill } from '../../host/contracts.js';
2
2
  export interface AgentInstructionEntry {
3
3
  kind: 'user' | 'project' | 'scoped';
4
4
  label: string;
@@ -1,6 +1,6 @@
1
1
  import { open, readdir, realpath, stat } from 'node:fs/promises';
2
2
  import { dirname, isAbsolute, join, parse, posix, relative, resolve } from 'node:path';
3
- import { MarAgentError } from '../error.js';
3
+ import { MarAgentError } from '../../error.js';
4
4
  const MAX_FILE_BYTES = 64 * 1024;
5
5
  const MAX_PROJECT_BYTES = 32 * 1024;
6
6
  const INSTRUCTION_FILENAMES = ['AGENTS.override.md', 'AGENTS.md'];
@@ -1,4 +1,4 @@
1
- import type { ModelMessage } from '../model/contracts.js';
1
+ import type { ModelMessage } from '../../model/contracts.js';
2
2
  export interface NormalizeModelContextInput {
3
3
  supportsImages: boolean;
4
4
  }
@@ -1,6 +1,6 @@
1
- import type { ModelMessage } from '../model/contracts.js';
2
- import { type ContextGcCheckpointCache, type ContextGcCheckpointPayload, type ContextGcReplacement } from '../session/context-gc-checkpoint.js';
3
- import type { SessionRecord } from '../session/jsonl-store.js';
1
+ import type { ModelMessage } from '../../model/contracts.js';
2
+ import { type ContextGcCheckpointCache, type ContextGcCheckpointPayload, type ContextGcReplacement } from '../../session/context-gc-checkpoint.js';
3
+ import type { SessionRecord } from '../../session/jsonl-store.js';
4
4
  export interface ContextProjectionEntry {
5
5
  readonly record: SessionRecord;
6
6
  readonly message: ModelMessage;
@@ -1,7 +1,7 @@
1
- import { anthropicThinkingBlock } from '../model/anthropic-thinking.js';
2
- import { latestValidContextGcCheckpoint, contextGcRecordSourceHash, contextGcTargetKey } from '../session/context-gc-checkpoint.js';
3
- import { TOOL_EXECUTION_LIMITS } from '../tools/execution-limits.js';
4
- import { replaceReadContextItems } from '../tools/read-context.js';
1
+ import { anthropicThinkingBlock } from '../../model/anthropic-thinking.js';
2
+ import { contextGcRecordSourceHash, contextGcTargetKey, latestValidContextGcCheckpoint } from '../../session/context-gc-checkpoint.js';
3
+ import { TOOL_EXECUTION_LIMITS } from '../../tools/execution-limits.js';
4
+ import { replaceReadContextItems } from '../../tools/local/read-context.js';
5
5
  const MAX_MODEL_CONTEXT_BYTES = 1024 * 1024;
6
6
  export function buildContextProjection(records, workspace, checkpointCache) {
7
7
  let activeModelId;
@@ -0,0 +1,6 @@
1
+ import type { ClientToolDefinition, ModelMessage } from '../../model/contracts.js';
2
+ export declare function estimatedRequestTokens(system: string, messages: readonly ModelMessage[], tools: readonly ClientToolDefinition[], images?: readonly {
3
+ mimeType: string;
4
+ dataBase64: string;
5
+ }[]): number;
6
+ export declare function stableJson(value: unknown): string;
@@ -0,0 +1,22 @@
1
+ import { AGENT_EXECUTION_POLICY } from '../execution-policy.js';
2
+ import { countModelTokens } from '../token-budget.js';
3
+ export function estimatedRequestTokens(system, messages, tools, images) {
4
+ const transientImageCount = messages.reduce((total, message) => total + (message.images?.length ?? 0), images?.length ?? 0);
5
+ const textMessages = messages.map((message) => {
6
+ const textMessage = { ...message };
7
+ delete textMessage.images;
8
+ return textMessage;
9
+ });
10
+ return (countModelTokens(`${system}${stableJson(textMessages)}${stableJson(tools)}`) +
11
+ transientImageCount * AGENT_EXECUTION_POLICY.estimatedTokensPerImage);
12
+ }
13
+ export function stableJson(value) {
14
+ if (Array.isArray(value))
15
+ return `[${value.map(stableJson).join(',')}]`;
16
+ if (value !== null && typeof value === 'object')
17
+ return `{${Object.entries(value)
18
+ .sort(([left], [right]) => left.localeCompare(right))
19
+ .map(([key, entry]) => `${JSON.stringify(key)}:${stableJson(entry)}`)
20
+ .join(',')}}`;
21
+ return JSON.stringify(value) ?? 'undefined';
22
+ }
@@ -0,0 +1,15 @@
1
+ import type { ModelMessage } from '../../model/contracts.js';
2
+ import { type JsonlSessionStore } from '../../session/jsonl-store.js';
3
+ import type { EnvironmentContextState } from './contracts.js';
4
+ import { type ContextProjection } from './projection.js';
5
+ export declare function restoreMessages(store: JsonlSessionStore, sessionId: string, records: readonly import('../../session/jsonl-store.js').SessionRecord[], options: {
6
+ includeImages: boolean;
7
+ currentTurnId?: string;
8
+ projection?: ContextProjection;
9
+ }): Promise<{
10
+ environmentState: EnvironmentContextState | undefined;
11
+ userMessages: string[];
12
+ messages: ModelMessage[];
13
+ ignoredImages: number;
14
+ currentTurnUserIndex: number | undefined;
15
+ }>;
@@ -0,0 +1,85 @@
1
+ import { MarAgentError } from '../../error.js';
2
+ import { compactSummaryFromCheckpoint, replacementHistoryFromCheckpoint } from '../../session/jsonl-store.js';
3
+ import { compactedHistoryMessages, continuationMessage } from '../compaction/history.js';
4
+ import { environmentContextUpdate, restoreEnvironmentState } from './environment.js';
5
+ import { buildContextProjection } from './projection.js';
6
+ export async function restoreMessages(store, sessionId, records, options) {
7
+ const messages = [];
8
+ const modelProjection = new Map((options.projection ??
9
+ buildContextProjection(records, (await store.getSession(sessionId)).workspace)).entries.map((entry) => [entry.record.recordId, entry.message]));
10
+ let userMessages = [];
11
+ let ignoredImages = 0;
12
+ let currentTurnUserIndex;
13
+ let environmentState;
14
+ for (const record of records) {
15
+ const payload = record.payload;
16
+ const compactSummary = compactSummaryFromCheckpoint(record);
17
+ if (record.type === 'turn.user' && typeof payload.prompt === 'string') {
18
+ userMessages.push(payload.prompt);
19
+ let images = [];
20
+ if (options.includeImages)
21
+ try {
22
+ images = await store.readInputImages(sessionId, payload.images);
23
+ }
24
+ catch (error) {
25
+ if (!(error instanceof MarAgentError) || error.code !== 'MAR_AGENT_SESSION_CORRUPT')
26
+ throw error;
27
+ ignoredImages += Array.isArray(payload.images) ? payload.images.length : 1;
28
+ }
29
+ if (record.turnId === options.currentTurnId && currentTurnUserIndex === undefined)
30
+ currentTurnUserIndex = messages.length;
31
+ messages.push({
32
+ role: 'user',
33
+ content: payload.prompt,
34
+ ...(images.length ? { images } : {})
35
+ });
36
+ }
37
+ else if ((record.type === 'message.completed' || record.type === 'plan.completed') &&
38
+ typeof payload.text === 'string')
39
+ messages.push({ role: 'assistant', content: payload.text });
40
+ else if (compactSummary !== undefined) {
41
+ environmentState = restoreEnvironmentState({ version: 1, state: payload.environment });
42
+ if (environmentState)
43
+ messages.push(environmentContextUpdate(environmentState));
44
+ const history = replacementHistoryFromCheckpoint(record);
45
+ userMessages =
46
+ history
47
+ ?.filter((message) => message.kind === 'user_input')
48
+ .map((message) => message.content) ?? [];
49
+ messages.push(...(history
50
+ ? compactedHistoryMessages(history)
51
+ : [{ role: 'user', content: continuationMessage(compactSummary) }]));
52
+ }
53
+ else if (record.type === 'context.environment') {
54
+ const current = restoreEnvironmentState(payload);
55
+ if (current) {
56
+ const message = environmentContextUpdate(current, environmentState);
57
+ if (message)
58
+ messages.push(message);
59
+ environmentState = current;
60
+ }
61
+ }
62
+ else if (record.type === 'model.context') {
63
+ const message = modelProjection.get(record.recordId);
64
+ if (message)
65
+ messages.push(message);
66
+ }
67
+ }
68
+ const completedToolCalls = new Set(messages.filter((message) => message.role === 'tool').map((message) => message.callId));
69
+ return {
70
+ environmentState,
71
+ userMessages,
72
+ messages: messages.filter((message) => {
73
+ if (message.role === 'tool_call')
74
+ return completedToolCalls.has(message.callId);
75
+ if (message.role !== 'provider' || message.provider !== 'OPENAI_RESPONSES')
76
+ return true;
77
+ const item = message.item;
78
+ if (item.type !== 'function_call' && item.type !== 'custom_tool_call')
79
+ return true;
80
+ return typeof item.call_id !== 'string' || completedToolCalls.has(item.call_id);
81
+ }),
82
+ ignoredImages,
83
+ currentTurnUserIndex
84
+ };
85
+ }
@@ -0,0 +1,18 @@
1
+ import { type MarAgentReasoningEffort } from '../../model/configuration.js';
2
+ import type { ModelMessage } from '../../model/contracts.js';
3
+ export interface AuthoritativeModelUsage {
4
+ readonly contextInputTokens: number;
5
+ readonly outputTokens: number | undefined;
6
+ readonly historyMessages?: readonly ModelMessage[];
7
+ readonly appendedMessages?: readonly ModelMessage[];
8
+ }
9
+ export declare function latestModelUsage(records: readonly import('../../session/jsonl-store.js').SessionRecord[], selectedModelId: string): AuthoritativeModelUsage | undefined;
10
+ export declare function reasoningEffortBaseline(records: readonly import('../../session/jsonl-store.js').SessionRecord[], modelId: string): MarAgentReasoningEffort | undefined;
11
+ export declare function lastConfigurationEffort(messages: readonly ModelMessage[], modelId: string): MarAgentReasoningEffort | undefined;
12
+ export declare function shouldUseNativeCompaction(input: {
13
+ readonly estimatedRequestTokens: number;
14
+ readonly contextWindowTokens: number;
15
+ readonly latestUsage: AuthoritativeModelUsage | undefined;
16
+ readonly historyMessages: readonly ModelMessage[];
17
+ readonly appendedMessages: readonly ModelMessage[];
18
+ }): boolean;
@@ -0,0 +1,138 @@
1
+ import { isDeepStrictEqual } from 'node:util';
2
+ import { marAgentReasoningEffortSchema } from '../../model/configuration.js';
3
+ import { compactSummaryFromCheckpoint } from '../../session/jsonl-store.js';
4
+ import { countModelTokens } from '../token-budget.js';
5
+ import { stableJson } from './request-budget.js';
6
+ export function latestModelUsage(records, selectedModelId) {
7
+ let usage;
8
+ const toolCallIds = new Set();
9
+ // readContext starts at compact.completed, whose execution header is before the boundary.
10
+ let activeModelId = selectedModelId;
11
+ for (const record of records) {
12
+ const payload = record.payload;
13
+ if (compactSummaryFromCheckpoint(record) !== undefined) {
14
+ usage = undefined;
15
+ toolCallIds.clear();
16
+ activeModelId = modelIdFromPayload(payload);
17
+ continue;
18
+ }
19
+ if (record.type === 'execution.header') {
20
+ activeModelId = modelIdFromPayload(payload);
21
+ usage = undefined;
22
+ toolCallIds.clear();
23
+ continue;
24
+ }
25
+ if (record.type === 'model.context' && payload.role === 'tool_call') {
26
+ if (typeof payload.callId === 'string' && payload.callId.length > 0)
27
+ toolCallIds.add(payload.callId);
28
+ else
29
+ usage = undefined;
30
+ }
31
+ if (usage !== undefined) {
32
+ if (record.type === 'model.context') {
33
+ const role = payload.role;
34
+ if (role === 'tool') {
35
+ if (typeof payload.callId !== 'string' || !toolCallIds.has(payload.callId))
36
+ usage = undefined;
37
+ else
38
+ usage = {
39
+ ...usage,
40
+ appendedMessages: [
41
+ ...(usage.appendedMessages ?? []),
42
+ payload
43
+ ]
44
+ };
45
+ }
46
+ else if (role !== 'tool_call' && role !== 'assistant' && role !== 'provider')
47
+ usage = undefined;
48
+ }
49
+ else if (invalidatesUsageCalibration(record.type, payload.type))
50
+ usage = undefined;
51
+ }
52
+ if (payload.type === 'usage.updated' && activeModelId === selectedModelId) {
53
+ const value = payload.contextInputTokens ?? payload.inputTokens;
54
+ if (typeof value === 'number' && Number.isSafeInteger(value) && value >= 0)
55
+ usage = {
56
+ contextInputTokens: value,
57
+ outputTokens: typeof payload.outputTokens === 'number' &&
58
+ Number.isSafeInteger(payload.outputTokens) &&
59
+ payload.outputTokens >= 0
60
+ ? payload.outputTokens
61
+ : undefined
62
+ };
63
+ }
64
+ }
65
+ return usage;
66
+ }
67
+ export function reasoningEffortBaseline(records, modelId) {
68
+ let baseline;
69
+ for (let index = records.length - 1; index >= 0; index--) {
70
+ const record = records[index];
71
+ if (compactSummaryFromCheckpoint(record) !== undefined)
72
+ break;
73
+ if (record.type !== 'execution.header')
74
+ continue;
75
+ const payload = record.payload;
76
+ if (payload.modelId !== modelId)
77
+ break;
78
+ const effort = marAgentReasoningEffortSchema.safeParse(payload.reasoningEffort);
79
+ if (effort.success)
80
+ baseline = effort.data;
81
+ }
82
+ return baseline;
83
+ }
84
+ export function lastConfigurationEffort(messages, modelId) {
85
+ for (let index = messages.length - 1; index >= 0; index--) {
86
+ const message = messages[index];
87
+ if (message.role !== 'provider' ||
88
+ message.provider !== 'OPENAI_RESPONSES' ||
89
+ message.providerModelId !== modelId ||
90
+ message.item?.type !== 'configuration_update')
91
+ continue;
92
+ const reasoning = message.item.reasoning;
93
+ const effort = marAgentReasoningEffortSchema.safeParse(reasoning?.effort);
94
+ if (effort.success)
95
+ return effort.data;
96
+ }
97
+ return undefined;
98
+ }
99
+ export function shouldUseNativeCompaction(input) {
100
+ if (input.estimatedRequestTokens <= input.contextWindowTokens)
101
+ return true;
102
+ if (input.latestUsage === undefined || input.latestUsage.outputTokens === undefined)
103
+ return false;
104
+ const historyDelta = appendOnlyUsageDelta(input.latestUsage, input.historyMessages);
105
+ if (historyDelta === undefined)
106
+ return false;
107
+ const appendedTokens = countModelTokens(stableJson([...historyDelta, ...input.appendedMessages]));
108
+ return (input.latestUsage.contextInputTokens + input.latestUsage.outputTokens + appendedTokens <=
109
+ input.contextWindowTokens);
110
+ }
111
+ function appendOnlyUsageDelta(usage, historyMessages) {
112
+ if (usage.historyMessages === undefined)
113
+ return usage.appendedMessages ?? [];
114
+ if (historyMessages.length < usage.historyMessages.length)
115
+ return undefined;
116
+ for (let index = 0; index < usage.historyMessages.length; index++)
117
+ if (!isDeepStrictEqual(usage.historyMessages[index], historyMessages[index]))
118
+ return undefined;
119
+ const appended = historyMessages.slice(usage.historyMessages.length);
120
+ const toolCallIds = new Set(usage.historyMessages
121
+ .filter((message) => message.role === 'tool_call')
122
+ .map((message) => message.callId));
123
+ return appended.every((message) => (message.role === 'tool' && toolCallIds.has(message.callId)) ||
124
+ (message.role === 'user' && message.contextKind === 'environment'))
125
+ ? appended
126
+ : undefined;
127
+ }
128
+ function invalidatesUsageCalibration(recordType, payloadType) {
129
+ if (recordType === 'turn.user' ||
130
+ recordType === 'context.environment' ||
131
+ recordType === 'context.gc.completed')
132
+ return true;
133
+ return payloadType === 'message.completed';
134
+ }
135
+ function modelIdFromPayload(payload, key = 'modelId') {
136
+ const value = payload[key];
137
+ return typeof value === 'string' && value.length > 0 ? value : undefined;
138
+ }
@@ -0,0 +1,35 @@
1
+ import type { ModelMessage } from '../../model/contracts.js';
2
+ export interface ContextualWorldState {
3
+ generation: string | undefined;
4
+ initialized: boolean;
5
+ instructionSnapshot: string | undefined;
6
+ resourceSnapshot: string | undefined;
7
+ mcpSnapshot?: string | undefined;
8
+ entries: Array<{
9
+ index: number;
10
+ kind: 'instructions' | 'resources' | 'mcp';
11
+ content: string;
12
+ }>;
13
+ }
14
+ export declare function insertContextualWorldState(messages: readonly ModelMessage[], entries: readonly {
15
+ index: number;
16
+ kind: 'instructions' | 'resources' | 'mcp';
17
+ content: string;
18
+ }[]): ModelMessage[];
19
+ export declare function latestContextualWorldStateGeneration(records: readonly import('../../session/jsonl-store.js').SessionRecord[]): string | undefined;
20
+ export declare function parsePersistedContextualWorldState(payload: unknown): ContextualWorldState | undefined;
21
+ export declare function persistContextualWorldState(store: import('../../session/jsonl-store.js').JsonlSessionStore, sessionId: string, state: ContextualWorldState): Promise<void>;
22
+ export declare function compactHistoryMayContainRetainedResources(records: readonly import('../../session/jsonl-store.js').SessionRecord[]): boolean;
23
+ export declare function updateContextualWorldState(state: ContextualWorldState, index: number, current: {
24
+ instructionSnapshot: string | undefined;
25
+ instructionContent: string | undefined;
26
+ resourceSnapshot: string | undefined;
27
+ previousMayContainResources?: boolean;
28
+ }): ContextualWorldState;
29
+ export declare function resetContextualWorldState(generation: string | undefined, index: number, current: {
30
+ instructionSnapshot: string | undefined;
31
+ instructionContent: string | undefined;
32
+ resourceSnapshot: string | undefined;
33
+ previousMayContainResources?: boolean;
34
+ }): ContextualWorldState;
35
+ export declare function contextualInstructionInsertIndex(messages: readonly ModelMessage[]): number;