@myagentroam/agent 0.9.141 → 0.9.143

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 (234) 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 -13
  5. package/dist/{model → agent-core/model}/contracts.d.ts +6 -16
  6. package/dist/{model → agent-core/model}/openai-responses.js +16 -9
  7. package/dist/agent-core/model/recovery.d.ts +4 -0
  8. package/dist/agent-core/model/recovery.js +71 -0
  9. package/dist/{prompts → agent-core/prompts}/core.d.ts +3 -13
  10. package/dist/{prompts → agent-core/prompts}/index.d.ts +1 -1
  11. package/dist/{prompts → agent-core/prompts}/modes.d.ts +1 -1
  12. package/dist/{prompts → agent-core/prompts}/resources.d.ts +1 -1
  13. package/dist/{runtime/compact.d.ts → agent-core/runtime/compaction/history.d.ts} +2 -23
  14. package/dist/{runtime/compact.js → agent-core/runtime/compaction/history.js} +2 -92
  15. package/dist/agent-core/runtime/compaction/operation.d.ts +22 -0
  16. package/dist/agent-core/runtime/compaction/operation.js +91 -0
  17. package/dist/agent-core/runtime/context/contracts.d.ts +12 -0
  18. package/dist/{runtime/environment-context.d.ts → agent-core/runtime/context/environment.d.ts} +2 -2
  19. package/dist/{runtime/environment-context.js → agent-core/runtime/context/environment.js} +1 -1
  20. package/dist/{runtime/context-gc-runtime.d.ts → agent-core/runtime/context/gc-runtime.d.ts} +4 -4
  21. package/dist/{runtime/context-gc-runtime.js → agent-core/runtime/context/gc-runtime.js} +3 -3
  22. package/dist/{runtime/context-gc-tokens.d.ts → agent-core/runtime/context/gc-tokens.d.ts} +2 -2
  23. package/dist/{runtime/context-gc-tokens.js → agent-core/runtime/context/gc-tokens.js} +7 -5
  24. package/dist/{runtime/context-gc.d.ts → agent-core/runtime/context/gc.d.ts} +3 -3
  25. package/dist/{runtime/context-gc.js → agent-core/runtime/context/gc.js} +152 -19
  26. package/dist/{runtime → agent-core/runtime/context}/instructions.d.ts +1 -1
  27. package/dist/{runtime → agent-core/runtime/context}/instructions.js +1 -1
  28. package/dist/{runtime → agent-core/runtime/context}/normalize.d.ts +1 -1
  29. package/dist/{runtime/context-projection.d.ts → agent-core/runtime/context/projection.d.ts} +3 -3
  30. package/dist/{runtime/context-projection.js → agent-core/runtime/context/projection.js} +35 -4
  31. package/dist/agent-core/runtime/context/request-budget.d.ts +6 -0
  32. package/dist/agent-core/runtime/context/request-budget.js +22 -0
  33. package/dist/agent-core/runtime/context/restore.d.ts +15 -0
  34. package/dist/agent-core/runtime/context/restore.js +85 -0
  35. package/dist/agent-core/runtime/context/usage.d.ts +18 -0
  36. package/dist/agent-core/runtime/context/usage.js +138 -0
  37. package/dist/agent-core/runtime/context/world-state.d.ts +35 -0
  38. package/dist/agent-core/runtime/context/world-state.js +133 -0
  39. package/dist/agent-core/runtime/contracts.d.ts +37 -0
  40. package/dist/agent-core/runtime/event-projection.d.ts +5 -0
  41. package/dist/agent-core/runtime/event-projection.js +17 -0
  42. package/dist/agent-core/runtime/events.d.ts +143 -0
  43. package/dist/agent-core/runtime/execution.d.ts +50 -0
  44. package/dist/agent-core/runtime/execution.js +397 -0
  45. package/dist/{runtime → agent-core/runtime}/rollout-budget.d.ts +1 -1
  46. package/dist/agent-core/sdk/agent.js +209 -0
  47. package/dist/agent-core/sdk/model-runtime.d.ts +13 -0
  48. package/dist/agent-core/sdk/model-runtime.js +63 -0
  49. package/dist/agent-core/sdk/session-title.d.ts +3 -0
  50. package/dist/agent-core/sdk/session-title.js +42 -0
  51. package/dist/agent-core/sdk/session.d.ts +62 -0
  52. package/dist/agent-core/sdk/session.js +1147 -0
  53. package/dist/agent-core/sdk/subagent-backend.d.ts +3 -0
  54. package/dist/agent-core/sdk/subagent-backend.js +46 -0
  55. package/dist/agent-core/sdk/types.d.ts +56 -0
  56. package/dist/{session → agent-core/session}/catalog.d.ts +2 -1
  57. package/dist/{session → agent-core/session}/context-gc-checkpoint.d.ts +3 -0
  58. package/dist/{session → agent-core/session}/context-gc-checkpoint.js +122 -23
  59. package/dist/agent-core/session/context-gc-observations.d.ts +38 -0
  60. package/dist/agent-core/session/context-gc-observations.js +150 -0
  61. package/dist/{session → agent-core/session}/context-gc-replacements.d.ts +1 -1
  62. package/dist/{session → agent-core/session}/context-gc-replacements.js +6 -2
  63. package/dist/{session → agent-core/session}/jsonl-store.d.ts +2 -2
  64. package/dist/{session → agent-core/session}/jsonl-store.js +1 -1
  65. package/dist/agent-core/subagent/contracts.d.ts +91 -0
  66. package/dist/agent-core/subagent/contracts.js +1 -0
  67. package/dist/agent-core/subagent/scheduler.d.ts +117 -0
  68. package/dist/{subagent → agent-core/subagent}/session-controller.d.ts +3 -2
  69. package/dist/agent-core/tools/agent/agent-cancel.d.ts +7 -0
  70. package/dist/{tools → agent-core/tools/agent}/agent-cancel.js +1 -1
  71. package/dist/agent-core/tools/agent/agent-message.d.ts +7 -0
  72. package/dist/{tools → agent-core/tools/agent}/agent-message.js +2 -2
  73. package/dist/{tools → agent-core/tools/agent}/agent-start.d.ts +3 -3
  74. package/dist/{tools → agent-core/tools/agent}/agent-start.js +3 -3
  75. package/dist/agent-core/tools/agent/agent-wait.d.ts +7 -0
  76. package/dist/{tools → agent-core/tools/agent}/agent-wait.js +2 -2
  77. package/dist/{tools → agent-core/tools/agent}/question.d.ts +2 -2
  78. package/dist/{tools → agent-core/tools/agent}/question.js +2 -2
  79. package/dist/{tools → agent-core/tools/agent}/skill.d.ts +2 -2
  80. package/dist/{tools → agent-core/tools/agent}/skill.js +2 -2
  81. package/dist/{tools → agent-core/tools/agent}/todo-read.d.ts +2 -2
  82. package/dist/{tools → agent-core/tools/agent}/todo-write.d.ts +2 -2
  83. package/dist/{tools → agent-core/tools/agent}/todo-write.js +2 -2
  84. package/dist/{tools → agent-core/tools/agent}/todo.d.ts +2 -9
  85. package/dist/{tools → agent-core/tools/agent}/todo.js +1 -1
  86. package/dist/{tools → agent-core/tools}/code-mode/cells.d.ts +4 -1
  87. package/dist/{tools → agent-core/tools}/code-mode/cells.js +60 -6
  88. package/dist/{tools → agent-core/tools}/code-mode/dispatch.d.ts +2 -4
  89. package/dist/{tools → agent-core/tools}/code-mode/dispatch.js +10 -6
  90. package/dist/{tools → agent-core/tools}/code-mode/engine.d.ts +13 -1
  91. package/dist/agent-core/tools/code-mode/engine.js +1 -0
  92. package/dist/{tools/code-mode.d.ts → agent-core/tools/code-mode/index.d.ts} +7 -7
  93. package/dist/{tools/code-mode.js → agent-core/tools/code-mode/index.js} +190 -28
  94. package/dist/agent-core/tools/code-mode/observations.d.ts +103 -0
  95. package/dist/agent-core/tools/code-mode/observations.js +195 -0
  96. package/dist/{tools → agent-core/tools}/code-mode/quickjs-engine.js +91 -17
  97. package/dist/{tools → agent-core/tools}/code-mode/state.d.ts +2 -13
  98. package/dist/agent-core/tools/code-mode/worker.d.ts +1 -0
  99. package/dist/{tools → agent-core/tools}/code-mode/worker.js +8 -1
  100. package/dist/agent-core/tools/contracts.d.ts +172 -0
  101. package/dist/agent-core/tools/contracts.js +1 -0
  102. package/dist/agent-core/tools/execution.d.ts +36 -0
  103. package/dist/agent-core/tools/execution.js +111 -0
  104. package/dist/agent-core/tools/local/apply-patch.d.ts +19 -0
  105. package/dist/{tools → agent-core/tools/local}/apply-patch.js +8 -2
  106. package/dist/{tools → agent-core/tools/local}/exec.d.ts +5 -17
  107. package/dist/{tools → agent-core/tools/local}/exec.js +4 -4
  108. package/dist/{tools → agent-core/tools/local}/read.d.ts +7 -15
  109. package/dist/{tools → agent-core/tools/local}/read.js +185 -2
  110. package/dist/{tools/local-registry.d.ts → agent-core/tools/local/registry.d.ts} +5 -5
  111. package/dist/agent-core/tools/local/registry.js +101 -0
  112. package/dist/{tools → agent-core/tools/local}/view-image.d.ts +4 -9
  113. package/dist/{tools → agent-core/tools/local}/view-image.js +2 -2
  114. package/dist/agent-core/tools/local/web-fetch.d.ts +4 -0
  115. package/dist/agent-core/tools/local/web-fetch.js +85 -0
  116. package/dist/agent-core/tools/local/web-search.d.ts +7 -0
  117. package/dist/agent-core/tools/local/web-search.js +34 -0
  118. package/dist/{tools/local-workspace-tools.js → agent-core/tools/local/workspace-tools.js} +1 -1
  119. package/dist/{sdk/mcp-catalog.d.ts → agent-core/tools/mcp/catalog.d.ts} +1 -2
  120. package/dist/{sdk/mcp-catalog.js → agent-core/tools/mcp/catalog.js} +1 -1
  121. package/dist/agent-core/tools/mcp/history.d.ts +4 -0
  122. package/dist/agent-core/tools/mcp/history.js +33 -0
  123. package/dist/{tools → agent-core/tools/mcp}/tool-search.d.ts +3 -3
  124. package/dist/{tools → agent-core/tools/mcp}/tool-search.js +4 -4
  125. package/dist/agent-core/tools/output-projection.d.ts +14 -0
  126. package/dist/agent-core/tools/output-projection.js +223 -0
  127. package/dist/{tools → agent-core/tools}/registry.d.ts +1 -1
  128. package/dist/agent-core/tools/registry.js +47 -0
  129. package/dist/{tools → agent-core/tools}/runtime-context.d.ts +8 -7
  130. package/dist/agent-core/tools/runtime-context.js +1 -0
  131. package/dist/{tools → agent-core/tools}/runtime.d.ts +1 -1
  132. package/dist/cli/codex-auth-file.d.ts +1 -1
  133. package/dist/cli/codex-auth-file.js +2 -2
  134. package/dist/cli/main.js +9 -9
  135. package/dist/index.d.ts +17 -15
  136. package/dist/index.js +8 -8
  137. package/dist/sandbox/linux/bubblewrap-sandbox-executor.d.ts +1 -1
  138. package/dist/sandbox/linux/bubblewrap-sandbox-executor.js +1 -1
  139. package/package.json +3 -3
  140. package/dist/host/contracts.d.ts +0 -21
  141. package/dist/sdk/agent.js +0 -2548
  142. package/dist/sdk/types.d.ts +0 -349
  143. package/dist/subagent/scheduler.d.ts +0 -206
  144. package/dist/tools/agent-cancel.d.ts +0 -7
  145. package/dist/tools/agent-message.d.ts +0 -7
  146. package/dist/tools/agent-wait.d.ts +0 -7
  147. package/dist/tools/apply-patch.d.ts +0 -32
  148. package/dist/tools/local-registry.js +0 -373
  149. package/dist/tools/registry.js +0 -47
  150. package/dist/tools/web-fetch.d.ts +0 -2
  151. package/dist/tools/web-fetch.js +0 -12
  152. package/dist/tools/web-search.d.ts +0 -2
  153. package/dist/tools/web-search.js +0 -15
  154. /package/dist/{error.d.ts → agent-core/error.d.ts} +0 -0
  155. /package/dist/{error.js → agent-core/error.js} +0 -0
  156. /package/dist/{host → agent-core/host}/contracts.js +0 -0
  157. /package/dist/{host → agent-core/host}/local-process-executor.d.ts +0 -0
  158. /package/dist/{host → agent-core/host}/local-process-executor.js +0 -0
  159. /package/dist/{host → agent-core/host}/network.d.ts +0 -0
  160. /package/dist/{host → agent-core/host}/network.js +0 -0
  161. /package/dist/{model → agent-core/model}/anthropic-messages.d.ts +0 -0
  162. /package/dist/{model → agent-core/model}/anthropic-thinking.d.ts +0 -0
  163. /package/dist/{model → agent-core/model}/anthropic-thinking.js +0 -0
  164. /package/dist/{model → agent-core/model}/catalog-file.d.ts +0 -0
  165. /package/dist/{model → agent-core/model}/catalog-file.js +0 -0
  166. /package/dist/{model → agent-core/model}/configuration.d.ts +0 -0
  167. /package/dist/{model → agent-core/model}/configuration.js +0 -0
  168. /package/dist/{model → agent-core/model}/contracts.js +0 -0
  169. /package/dist/{model → agent-core/model}/http.d.ts +0 -0
  170. /package/dist/{model → agent-core/model}/http.js +0 -0
  171. /package/dist/{model → agent-core/model}/openai-responses.d.ts +0 -0
  172. /package/dist/{model → agent-core/model}/runtime-credential.d.ts +0 -0
  173. /package/dist/{model → agent-core/model}/runtime-credential.js +0 -0
  174. /package/dist/{model → agent-core/model}/sse.d.ts +0 -0
  175. /package/dist/{model → agent-core/model}/sse.js +0 -0
  176. /package/dist/{model → agent-core/model}/transport-test.d.ts +0 -0
  177. /package/dist/{model → agent-core/model}/transport-test.js +0 -0
  178. /package/dist/{prompts → agent-core/prompts}/compact.d.ts +0 -0
  179. /package/dist/{prompts → agent-core/prompts}/compact.js +0 -0
  180. /package/dist/{prompts → agent-core/prompts}/core.js +0 -0
  181. /package/dist/{prompts → agent-core/prompts}/execution-budget.d.ts +0 -0
  182. /package/dist/{prompts → agent-core/prompts}/execution-budget.js +0 -0
  183. /package/dist/{prompts → agent-core/prompts}/index.js +0 -0
  184. /package/dist/{prompts → agent-core/prompts}/modes.js +0 -0
  185. /package/dist/{prompts → agent-core/prompts}/output.d.ts +0 -0
  186. /package/dist/{prompts → agent-core/prompts}/output.js +0 -0
  187. /package/dist/{prompts → agent-core/prompts}/resources.js +0 -0
  188. /package/dist/{prompts → agent-core/prompts}/subagent.d.ts +0 -0
  189. /package/dist/{prompts → agent-core/prompts}/subagent.js +0 -0
  190. /package/dist/{prompts → agent-core/prompts}/title.d.ts +0 -0
  191. /package/dist/{prompts → agent-core/prompts}/title.js +0 -0
  192. /package/dist/{prompts → agent-core/prompts}/workflow.d.ts +0 -0
  193. /package/dist/{prompts → agent-core/prompts}/workflow.js +0 -0
  194. /package/dist/{runtime → agent-core/runtime}/async-queue.d.ts +0 -0
  195. /package/dist/{runtime → agent-core/runtime}/async-queue.js +0 -0
  196. /package/dist/{sdk/types.js → agent-core/runtime/context/contracts.js} +0 -0
  197. /package/dist/{runtime → agent-core/runtime/context}/normalize.js +0 -0
  198. /package/dist/{session/types.js → agent-core/runtime/contracts.js} +0 -0
  199. /package/dist/{tools/code-mode/engine.js → agent-core/runtime/events.js} +0 -0
  200. /package/dist/{runtime → agent-core/runtime}/execution-policy.d.ts +0 -0
  201. /package/dist/{runtime → agent-core/runtime}/execution-policy.js +0 -0
  202. /package/dist/{runtime → agent-core/runtime}/plan-output.d.ts +0 -0
  203. /package/dist/{runtime → agent-core/runtime}/plan-output.js +0 -0
  204. /package/dist/{runtime → agent-core/runtime}/rollout-budget.js +0 -0
  205. /package/dist/{runtime → agent-core/runtime}/token-budget.d.ts +0 -0
  206. /package/dist/{runtime → agent-core/runtime}/token-budget.js +0 -0
  207. /package/dist/{sdk → agent-core/sdk}/agent.d.ts +0 -0
  208. /package/dist/{tools/code-mode/worker.d.ts → agent-core/sdk/types.js} +0 -0
  209. /package/dist/{session → agent-core/session}/catalog.js +0 -0
  210. /package/dist/{session → agent-core/session}/context-gc-subagent.d.ts +0 -0
  211. /package/dist/{session → agent-core/session}/context-gc-subagent.js +0 -0
  212. /package/dist/{session → agent-core/session}/transaction-recovery.d.ts +0 -0
  213. /package/dist/{session → agent-core/session}/transaction-recovery.js +0 -0
  214. /package/dist/{session → agent-core/session}/types.d.ts +0 -0
  215. /package/dist/{tools/runtime-context.js → agent-core/session/types.js} +0 -0
  216. /package/dist/{subagent → agent-core/subagent}/scheduler.js +0 -0
  217. /package/dist/{subagent → agent-core/subagent}/session-controller.js +0 -0
  218. /package/dist/{tools → agent-core/tools/agent}/todo-read.js +0 -0
  219. /package/dist/{tools → agent-core/tools}/callers.d.ts +0 -0
  220. /package/dist/{tools → agent-core/tools}/callers.js +0 -0
  221. /package/dist/{tools → agent-core/tools}/code-mode/quickjs-engine.d.ts +0 -0
  222. /package/dist/{tools → agent-core/tools}/code-mode/state.js +0 -0
  223. /package/dist/{tools → agent-core/tools}/code-mode/text-output.d.ts +0 -0
  224. /package/dist/{tools → agent-core/tools}/code-mode/text-output.js +0 -0
  225. /package/dist/{tools → agent-core/tools}/execution-limits.d.ts +0 -0
  226. /package/dist/{tools → agent-core/tools}/execution-limits.js +0 -0
  227. /package/dist/{tools → agent-core/tools/local}/read-context.d.ts +0 -0
  228. /package/dist/{tools → agent-core/tools/local}/read-context.js +0 -0
  229. /package/dist/{tools/local-workspace-tools.d.ts → agent-core/tools/local/workspace-tools.d.ts} +0 -0
  230. /package/dist/{tools → agent-core/tools}/runtime.js +0 -0
  231. /package/dist/{tools → agent-core/tools}/scheduler.d.ts +0 -0
  232. /package/dist/{tools → agent-core/tools}/scheduler.js +0 -0
  233. /package/dist/{tools → agent-core/tools}/shared/path-resolver.d.ts +0 -0
  234. /package/dist/{tools → agent-core/tools}/shared/path-resolver.js +0 -0
@@ -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;
@@ -0,0 +1,133 @@
1
+ import { retainedSessionResourcesUpdate } from '../../prompts/resources.js';
2
+ import { compactSummaryFromCheckpoint } from '../../session/jsonl-store.js';
3
+ export function insertContextualWorldState(messages, entries) {
4
+ const result = [...messages];
5
+ let offset = 0;
6
+ for (const entry of entries) {
7
+ const insertionIndex = Math.max(0, Math.min(entry.index + offset, result.length));
8
+ result.splice(insertionIndex, 0, { role: 'user', content: entry.content });
9
+ offset++;
10
+ }
11
+ return result;
12
+ }
13
+ export function latestContextualWorldStateGeneration(records) {
14
+ let generation;
15
+ for (const record of records)
16
+ if (record.type === 'context.gc.completed' ||
17
+ compactSummaryFromCheckpoint(record) !== undefined)
18
+ generation = record.recordId;
19
+ return generation;
20
+ }
21
+ const MAX_CONTEXTUAL_WORLD_STATE_ENTRIES = 1_024;
22
+ const MAX_CONTEXTUAL_WORLD_STATE_CONTENT_BYTES = 8 * 1024 * 1024;
23
+ export function parsePersistedContextualWorldState(payload) {
24
+ if (payload === null || typeof payload !== 'object' || Array.isArray(payload))
25
+ return undefined;
26
+ const record = payload;
27
+ if (record.version !== 1)
28
+ return undefined;
29
+ const generation = record.generation === null
30
+ ? undefined
31
+ : typeof record.generation === 'string' && record.generation.length <= 128
32
+ ? record.generation
33
+ : null;
34
+ if (generation === null)
35
+ return undefined;
36
+ const instructionSnapshot = nullableWorldStateString(record.instructionSnapshot);
37
+ const resourceSnapshot = nullableWorldStateString(record.resourceSnapshot);
38
+ if (instructionSnapshot === null || resourceSnapshot === null || !Array.isArray(record.entries))
39
+ return undefined;
40
+ if (record.entries.length > MAX_CONTEXTUAL_WORLD_STATE_ENTRIES)
41
+ return undefined;
42
+ const entries = [];
43
+ let contentBytes = 0;
44
+ for (const value of record.entries) {
45
+ if (value === null || typeof value !== 'object' || Array.isArray(value))
46
+ return undefined;
47
+ const entry = value;
48
+ if (!Number.isSafeInteger(entry.index) ||
49
+ entry.index < 0 ||
50
+ (entry.kind !== 'instructions' && entry.kind !== 'resources' && entry.kind !== 'mcp') ||
51
+ typeof entry.content !== 'string' ||
52
+ entry.content.length === 0)
53
+ return undefined;
54
+ contentBytes += Buffer.byteLength(entry.content);
55
+ if (contentBytes > MAX_CONTEXTUAL_WORLD_STATE_CONTENT_BYTES)
56
+ return undefined;
57
+ entries.push({
58
+ index: entry.index,
59
+ kind: entry.kind,
60
+ content: entry.content
61
+ });
62
+ }
63
+ return {
64
+ generation,
65
+ initialized: true,
66
+ instructionSnapshot,
67
+ resourceSnapshot,
68
+ mcpSnapshot: typeof record.mcpSnapshot === 'string' ? record.mcpSnapshot : undefined,
69
+ entries
70
+ };
71
+ }
72
+ function nullableWorldStateString(value) {
73
+ if (value === null)
74
+ return undefined;
75
+ return typeof value === 'string' &&
76
+ Buffer.byteLength(value) <= MAX_CONTEXTUAL_WORLD_STATE_CONTENT_BYTES
77
+ ? value
78
+ : null;
79
+ }
80
+ export async function persistContextualWorldState(store, sessionId, state) {
81
+ await store.writeContextualWorldState(sessionId, {
82
+ version: 1,
83
+ generation: state.generation ?? null,
84
+ instructionSnapshot: state.instructionSnapshot ?? null,
85
+ resourceSnapshot: state.resourceSnapshot ?? null,
86
+ mcpSnapshot: state.mcpSnapshot ?? null,
87
+ entries: state.entries
88
+ });
89
+ }
90
+ export function compactHistoryMayContainRetainedResources(records) {
91
+ return records.some((record) => compactSummaryFromCheckpoint(record)?.includes('# Retained Session resources'));
92
+ }
93
+ export function updateContextualWorldState(state, index, current) {
94
+ const entries = [...state.entries];
95
+ if (!state.initialized || state.instructionSnapshot !== current.instructionSnapshot) {
96
+ if (current.instructionContent !== undefined)
97
+ entries.push({ index, kind: 'instructions', content: current.instructionContent });
98
+ }
99
+ const resourceContent = retainedSessionResourcesUpdate(current.resourceSnapshot, state.initialized ? state.resourceSnapshot : undefined, current.previousMayContainResources);
100
+ if (resourceContent !== undefined)
101
+ entries.push({ index, kind: 'resources', content: resourceContent });
102
+ return {
103
+ generation: state.generation,
104
+ mcpSnapshot: state.mcpSnapshot,
105
+ initialized: true,
106
+ instructionSnapshot: current.instructionSnapshot,
107
+ resourceSnapshot: current.resourceSnapshot,
108
+ entries
109
+ };
110
+ }
111
+ export function resetContextualWorldState(generation, index, current) {
112
+ const entries = [];
113
+ if (current.instructionContent !== undefined)
114
+ entries.push({ index, kind: 'instructions', content: current.instructionContent });
115
+ const resourceContent = retainedSessionResourcesUpdate(current.resourceSnapshot, undefined, current.previousMayContainResources);
116
+ if (resourceContent !== undefined)
117
+ entries.push({ index, kind: 'resources', content: resourceContent });
118
+ return {
119
+ generation,
120
+ initialized: true,
121
+ instructionSnapshot: current.instructionSnapshot,
122
+ resourceSnapshot: current.resourceSnapshot,
123
+ entries
124
+ };
125
+ }
126
+ export function contextualInstructionInsertIndex(messages) {
127
+ let index = messages.findLastIndex((message) => message.role === 'user' && message.contextKind !== 'environment');
128
+ if (index < 0)
129
+ return 0;
130
+ if (index > 0 && messages[index - 1]?.contextKind === 'environment')
131
+ index--;
132
+ return index;
133
+ }
@@ -0,0 +1,37 @@
1
+ import type { MarAgentReasoningEffort } from '../model/configuration.js';
2
+ /** @deprecated MAR Agent always executes tools directly through the Host. */
3
+ export type AccessMode = 'full-access';
4
+ export type ExecutionMode = 'run' | 'plan' | 'compact';
5
+ export interface RunInputImage {
6
+ name: string;
7
+ mimeType: string;
8
+ dataBase64: string;
9
+ }
10
+ export interface MarAgentImageMetadata {
11
+ name: string;
12
+ mimeType: string;
13
+ byteSize: number;
14
+ }
15
+ export interface RunInput {
16
+ prompt: string;
17
+ clientMessageId?: string;
18
+ modelId?: string;
19
+ reasoningEffort?: MarAgentReasoningEffort;
20
+ /** @deprecated Accepted for source compatibility and otherwise ignored. */
21
+ access?: AccessMode;
22
+ images?: readonly RunInputImage[];
23
+ }
24
+ export interface ExecutionResult {
25
+ executionId: string;
26
+ status: 'completed' | 'failed' | 'cancelled';
27
+ finalAnswer: string;
28
+ errorCode?: string;
29
+ errorMessage?: string;
30
+ }
31
+ export interface RolloutBudgetOptions {
32
+ limitTokens?: number;
33
+ conserveAtRemainingTokens?: number;
34
+ finalizeAtRemainingTokens?: number;
35
+ samplingTokenWeight?: number;
36
+ prefillTokenWeight?: number;
37
+ }
@@ -0,0 +1,5 @@
1
+ import type { ModelUsage } from '../model/contracts.js';
2
+ import type { MarAgentEvent } from './events.js';
3
+ /** Keep streaming deltas live-only; exec output has one durable copy in model context records. */
4
+ export declare function eventForPersistence(event: MarAgentEvent): MarAgentEvent | undefined;
5
+ export declare function publicModelUsage(usage: ModelUsage): Omit<ModelUsage, 'rolloutBudgetUnits'>;
@@ -0,0 +1,17 @@
1
+ /** Keep streaming deltas live-only; exec output has one durable copy in model context records. */
2
+ export function eventForPersistence(event) {
3
+ if (event.type === 'message.delta' ||
4
+ event.type === 'context.compacting' ||
5
+ event.type === 'model.performance' ||
6
+ event.type === 'message.performance')
7
+ return undefined;
8
+ if (event.type !== 'tool.completed' || event.toolName !== 'exec' || !event.data)
9
+ return event;
10
+ const metadata = Object.fromEntries(Object.entries(event.data).filter(([key]) => key !== 'stdout' && key !== 'stderr'));
11
+ return { ...event, data: metadata };
12
+ }
13
+ export function publicModelUsage(usage) {
14
+ const { rolloutBudgetUnits, ...publicUsage } = usage;
15
+ void rolloutBudgetUnits;
16
+ return publicUsage;
17
+ }
@@ -0,0 +1,143 @@
1
+ import type { MarAgentReasoningEffort } from '../model/configuration.js';
2
+ import type { CodeCellEventData, MarAgentToolArtifact } from '../tools/contracts.js';
3
+ import type { ExecutionMode } from './contracts.js';
4
+ export interface MarAgentEventBase {
5
+ eventId: string;
6
+ sequence: number;
7
+ timestamp: string;
8
+ sessionId: string;
9
+ executionId: string;
10
+ turnId?: string;
11
+ }
12
+ export type MarAgentEvent = MarAgentEventBase & ({
13
+ type: 'execution.started';
14
+ mode: ExecutionMode;
15
+ } | {
16
+ type: 'message.delta';
17
+ itemId: string;
18
+ phase: 'commentary' | 'final_answer';
19
+ delta: string;
20
+ } | {
21
+ type: 'message.completed';
22
+ itemId: string;
23
+ phase: 'commentary' | 'final_answer';
24
+ text: string;
25
+ modelId: string;
26
+ modelName: string;
27
+ } | {
28
+ type: 'model.performance';
29
+ latencyMs: number;
30
+ outputTokens?: number | undefined;
31
+ outputDurationMs?: number | undefined;
32
+ tokensPerSecond?: number | undefined;
33
+ } | {
34
+ /** Legacy history event; new executions publish model.performance instead. */
35
+ type: 'message.performance';
36
+ itemId: string;
37
+ ttftMs: number;
38
+ outputTokens?: number | undefined;
39
+ outputDurationMs?: number | undefined;
40
+ tokensPerSecond?: number | undefined;
41
+ } | {
42
+ type: 'plan.completed';
43
+ itemId: string;
44
+ text: string;
45
+ } | {
46
+ type: 'reasoning.summary';
47
+ text: string;
48
+ } | {
49
+ type: 'hosted_tool.updated';
50
+ itemId: string;
51
+ kind: 'WEB_SEARCH' | 'WEB_FETCH';
52
+ status: 'RUNNING' | 'COMPLETED' | 'FAILED';
53
+ summary: {
54
+ query?: string | undefined;
55
+ url?: string | undefined;
56
+ title?: string | undefined;
57
+ sources?: readonly {
58
+ url: string;
59
+ title?: string | undefined;
60
+ }[] | undefined;
61
+ sourcesTruncated?: boolean | undefined;
62
+ };
63
+ } | {
64
+ type: 'citation.added';
65
+ id: string;
66
+ url: string;
67
+ title?: string;
68
+ } | {
69
+ type: 'tool.started';
70
+ toolName: string;
71
+ callId: string;
72
+ parentCallId?: string;
73
+ input?: unknown;
74
+ } | {
75
+ type: 'tool.completed';
76
+ toolName: string;
77
+ callId: string;
78
+ parentCallId?: string;
79
+ summary: string;
80
+ truncated?: boolean;
81
+ artifacts?: readonly MarAgentToolArtifact[];
82
+ data?: CodeCellEventData | import('../tools/contracts.js').ExecResult | Omit<import('../tools/contracts.js').ExecResult, 'stdout' | 'stderr'> | import('../tools/contracts.js').ApplyPatchResult | import('../tools/contracts.js').ReadEventData | import('../tools/contracts.js').ViewImageResult | import('../subagent/contracts.js').SubagentTaskSnapshot;
83
+ } | {
84
+ type: 'tool.failed';
85
+ data?: import('../tools/contracts.js').CodeCellEventData;
86
+ toolName: string;
87
+ callId: string;
88
+ parentCallId?: string;
89
+ code: string;
90
+ message?: string;
91
+ } | {
92
+ type: 'usage.updated';
93
+ inputTokens?: number | undefined;
94
+ contextInputTokens?: number | undefined;
95
+ outputTokens?: number | undefined;
96
+ cacheReadTokens?: number | undefined;
97
+ cacheWriteTokens?: number | undefined;
98
+ } | {
99
+ type: 'todo.updated';
100
+ revision: number;
101
+ items: readonly import('../tools/contracts.js').TodoItem[];
102
+ } | {
103
+ type: 'user_input.requested';
104
+ requestId: string;
105
+ questions: unknown[];
106
+ } | {
107
+ type: 'user_input.resolved';
108
+ requestId: string;
109
+ } | {
110
+ type: 'subagent.started';
111
+ agentId: string;
112
+ description: string;
113
+ modelId?: string;
114
+ modelName?: string;
115
+ reasoningEffort?: MarAgentReasoningEffort;
116
+ } | {
117
+ type: 'subagent.completed';
118
+ agentId: string;
119
+ description?: string;
120
+ status: string;
121
+ modelId?: string;
122
+ modelName?: string;
123
+ reasoningEffort?: MarAgentReasoningEffort;
124
+ latestMessage?: import('../subagent/contracts.js').SubagentLatestMessage;
125
+ latestActivity?: import('../subagent/contracts.js').SubagentLatestActivity;
126
+ errorCode?: string;
127
+ errorMessage?: string;
128
+ } | {
129
+ type: 'execution.completed';
130
+ } | {
131
+ type: 'execution.failed';
132
+ code: string;
133
+ message?: string;
134
+ } | {
135
+ type: 'execution.cancelled';
136
+ } | {
137
+ type: 'context.compacting';
138
+ compactionId: string;
139
+ } | {
140
+ type: 'context.compacted';
141
+ compactionId: string;
142
+ });
143
+ export type EventPayload<T = MarAgentEvent> = T extends MarAgentEvent ? Omit<T, 'eventId' | 'sequence' | 'timestamp' | 'sessionId' | 'executionId' | 'turnId'> : never;
@@ -0,0 +1,50 @@
1
+ import type { MarAgentModelConfiguration } from '../model/configuration.js';
2
+ import type { ModelEvent, ModelMessage, ModelRequest, ModelUsage } from '../model/contracts.js';
3
+ import { type RoundToolScope } from '../tools/execution.js';
4
+ import type { ToolRuntimeImage } from '../tools/runtime-context.js';
5
+ import type { AuthoritativeModelUsage } from './context/usage.js';
6
+ import type { ExecutionMode } from './contracts.js';
7
+ import type { EventPayload } from './events.js';
8
+ import type { RolloutBudget } from './rollout-budget.js';
9
+ export interface PreparedExecutionRound {
10
+ readonly request: ModelRequest;
11
+ readonly toolScope: RoundToolScope;
12
+ }
13
+ /** Internal execution-local ports. No Session/Agent object, OS handles or terminal publisher. */
14
+ export interface ExecutionLoopInput {
15
+ readonly mode: ExecutionMode;
16
+ readonly sourceType: 'user' | 'subagent';
17
+ readonly signal: AbortSignal;
18
+ readonly model: Pick<MarAgentModelConfiguration, 'id' | 'name'>;
19
+ readonly messages: ModelMessage[];
20
+ readonly toolImages: ToolRuntimeImage[];
21
+ readonly rolloutBudget: RolloutBudget | undefined;
22
+ readonly publish: (event: EventPayload) => Promise<void>;
23
+ readonly appendContext: (message: ModelMessage) => Promise<void>;
24
+ readonly prepareRound: (continuation: ModelMessage | undefined) => Promise<PreparedExecutionRound>;
25
+ readonly startModel: (request: ModelRequest) => AsyncIterable<ModelEvent>;
26
+ readonly recoverySignal: () => AbortSignal;
27
+ readonly compactContext: () => Promise<boolean>;
28
+ readonly compactionFallback?: (() => boolean) | undefined;
29
+ readonly observeUsage: (usage: Omit<AuthoritativeModelUsage, 'historyMessages'> | undefined) => void;
30
+ readonly observeContextTokens: (tokens: number) => void;
31
+ readonly checkpoint: (round: PreparedExecutionRound, usage: ModelUsage | undefined) => Promise<void>;
32
+ readonly mailbox: {
33
+ hasPending(): boolean;
34
+ append(): Promise<boolean>;
35
+ close(): void;
36
+ };
37
+ }
38
+ /** Own the single model/tool loop; the SDK owns its handle, terminal events and cleanup. */
39
+ export declare class ExecutionLoop {
40
+ #private;
41
+ private readonly input;
42
+ private readonly planOutputPrefixes;
43
+ get finalAnswer(): string;
44
+ private set finalAnswer(value);
45
+ constructor(input: ExecutionLoopInput);
46
+ run(): Promise<{
47
+ finalAnswer: string;
48
+ usage?: ModelUsage;
49
+ }>;
50
+ }