@amodalai/runtime 0.2.0 → 0.2.1

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 (209) hide show
  1. package/dist/src/__fixtures__/README.md +4 -0
  2. package/dist/src/__fixtures__/e2e.test.d.ts +6 -0
  3. package/dist/src/__fixtures__/e2e.test.js +211 -0
  4. package/dist/src/__fixtures__/e2e.test.js.map +1 -0
  5. package/dist/src/__fixtures__/smoke-agent/automations/delivery-callback-test.json +9 -0
  6. package/dist/src/__fixtures__/smoke-agent/connections/mock-mcp/spec.json +1 -1
  7. package/dist/src/__fixtures__/smoke.test.js +715 -29
  8. package/dist/src/__fixtures__/smoke.test.js.map +1 -1
  9. package/dist/src/__fixtures__/test-env.d.ts +27 -0
  10. package/dist/src/__fixtures__/test-env.js +64 -0
  11. package/dist/src/__fixtures__/test-env.js.map +1 -0
  12. package/dist/src/__fixtures__/test-helpers.d.ts +30 -0
  13. package/dist/src/__fixtures__/test-helpers.js +120 -0
  14. package/dist/src/__fixtures__/test-helpers.js.map +1 -0
  15. package/dist/src/agent/agent-types.d.ts +22 -0
  16. package/dist/src/agent/agent-types.js.map +1 -1
  17. package/dist/src/agent/automation-bridge.d.ts +9 -0
  18. package/dist/src/agent/automation-bridge.js +26 -0
  19. package/dist/src/agent/automation-bridge.js.map +1 -1
  20. package/dist/src/agent/automation-bridge.test.js +63 -0
  21. package/dist/src/agent/automation-bridge.test.js.map +1 -1
  22. package/dist/src/agent/local-server.d.ts +0 -7
  23. package/dist/src/agent/local-server.js +230 -86
  24. package/dist/src/agent/local-server.js.map +1 -1
  25. package/dist/src/agent/local-server.test.js +14 -8
  26. package/dist/src/agent/local-server.test.js.map +1 -1
  27. package/dist/src/agent/loop-types.d.ts +81 -2
  28. package/dist/src/agent/loop-types.js +4 -0
  29. package/dist/src/agent/loop-types.js.map +1 -1
  30. package/dist/src/agent/loop.js +16 -3
  31. package/dist/src/agent/loop.js.map +1 -1
  32. package/dist/src/agent/loop.test.js +572 -8
  33. package/dist/src/agent/loop.test.js.map +1 -1
  34. package/dist/src/agent/proactive/delivery-router.d.ts +68 -0
  35. package/dist/src/agent/proactive/delivery-router.js +337 -0
  36. package/dist/src/agent/proactive/delivery-router.js.map +1 -0
  37. package/dist/src/agent/proactive/delivery-router.test.d.ts +6 -0
  38. package/dist/src/agent/proactive/delivery-router.test.js +455 -0
  39. package/dist/src/agent/proactive/delivery-router.test.js.map +1 -0
  40. package/dist/src/agent/proactive/proactive-runner.d.ts +23 -1
  41. package/dist/src/agent/proactive/proactive-runner.js +42 -10
  42. package/dist/src/agent/proactive/proactive-runner.js.map +1 -1
  43. package/dist/src/agent/proactive/proactive-runner.test.js +0 -2
  44. package/dist/src/agent/proactive/proactive-runner.test.js.map +1 -1
  45. package/dist/src/agent/routes/admin-chat-abort.test.d.ts +6 -0
  46. package/dist/src/agent/routes/admin-chat-abort.test.js +206 -0
  47. package/dist/src/agent/routes/admin-chat-abort.test.js.map +1 -0
  48. package/dist/src/agent/routes/admin-chat.js +0 -2
  49. package/dist/src/agent/routes/admin-chat.js.map +1 -1
  50. package/dist/src/agent/routes/task.test.js +0 -2
  51. package/dist/src/agent/routes/task.test.js.map +1 -1
  52. package/dist/src/agent/snapshot-server.js +0 -2
  53. package/dist/src/agent/snapshot-server.js.map +1 -1
  54. package/dist/src/agent/states/compacting.js +5 -3
  55. package/dist/src/agent/states/compacting.js.map +1 -1
  56. package/dist/src/agent/states/confirming.js +3 -0
  57. package/dist/src/agent/states/confirming.js.map +1 -1
  58. package/dist/src/agent/states/dispatching.js +45 -1
  59. package/dist/src/agent/states/dispatching.js.map +1 -1
  60. package/dist/src/agent/states/executing.js +225 -81
  61. package/dist/src/agent/states/executing.js.map +1 -1
  62. package/dist/src/agent/states/streaming.js +14 -0
  63. package/dist/src/agent/states/streaming.js.map +1 -1
  64. package/dist/src/agent/states/thinking.d.ts +1 -1
  65. package/dist/src/agent/states/thinking.js +246 -29
  66. package/dist/src/agent/states/thinking.js.map +1 -1
  67. package/dist/src/agent/token-estimate.d.ts +20 -6
  68. package/dist/src/agent/token-estimate.js +24 -3
  69. package/dist/src/agent/token-estimate.js.map +1 -1
  70. package/dist/src/agent/token-estimate.test.d.ts +6 -0
  71. package/dist/src/agent/token-estimate.test.js +44 -0
  72. package/dist/src/agent/token-estimate.test.js.map +1 -0
  73. package/dist/src/api/create-agent.js +0 -3
  74. package/dist/src/api/create-agent.js.map +1 -1
  75. package/dist/src/api/types.d.ts +0 -2
  76. package/dist/src/env-ref.d.ts +13 -0
  77. package/dist/src/env-ref.js +31 -0
  78. package/dist/src/env-ref.js.map +1 -0
  79. package/dist/src/env-ref.test.d.ts +6 -0
  80. package/dist/src/env-ref.test.js +34 -0
  81. package/dist/src/env-ref.test.js.map +1 -0
  82. package/dist/src/errors.d.ts +15 -0
  83. package/dist/src/errors.js +22 -0
  84. package/dist/src/errors.js.map +1 -1
  85. package/dist/src/errors.test.js +2 -2
  86. package/dist/src/errors.test.js.map +1 -1
  87. package/dist/src/events/event-bus.d.ts +54 -0
  88. package/dist/src/events/event-bus.js +84 -0
  89. package/dist/src/events/event-bus.js.map +1 -0
  90. package/dist/src/events/event-bus.test.d.ts +6 -0
  91. package/dist/src/events/event-bus.test.js +112 -0
  92. package/dist/src/events/event-bus.test.js.map +1 -0
  93. package/dist/src/events/events-route.d.ts +36 -0
  94. package/dist/src/events/events-route.js +80 -0
  95. package/dist/src/events/events-route.js.map +1 -0
  96. package/dist/src/events/events-route.test.d.ts +6 -0
  97. package/dist/src/events/events-route.test.js +134 -0
  98. package/dist/src/events/events-route.test.js.map +1 -0
  99. package/dist/src/events/store-event-wrapper.d.ts +19 -0
  100. package/dist/src/events/store-event-wrapper.js +57 -0
  101. package/dist/src/events/store-event-wrapper.js.map +1 -0
  102. package/dist/src/events/store-event-wrapper.test.d.ts +6 -0
  103. package/dist/src/events/store-event-wrapper.test.js +91 -0
  104. package/dist/src/events/store-event-wrapper.test.js.map +1 -0
  105. package/dist/src/middleware/auth.d.ts +0 -2
  106. package/dist/src/middleware/auth.js.map +1 -1
  107. package/dist/src/providers/search-provider.d.ts +64 -0
  108. package/dist/src/providers/search-provider.js +174 -0
  109. package/dist/src/providers/search-provider.js.map +1 -0
  110. package/dist/src/providers/types.d.ts +8 -0
  111. package/dist/src/routes/ai-stream.d.ts +15 -0
  112. package/dist/src/routes/ai-stream.js +9 -0
  113. package/dist/src/routes/ai-stream.js.map +1 -1
  114. package/dist/src/routes/chat-stream.d.ts +6 -0
  115. package/dist/src/routes/chat-stream.js +2 -0
  116. package/dist/src/routes/chat-stream.js.map +1 -1
  117. package/dist/src/routes/chat.d.ts +6 -0
  118. package/dist/src/routes/chat.js +2 -0
  119. package/dist/src/routes/chat.js.map +1 -1
  120. package/dist/src/routes/session-resolver.d.ts +5 -0
  121. package/dist/src/routes/session-resolver.js +1 -15
  122. package/dist/src/routes/session-resolver.js.map +1 -1
  123. package/dist/src/routes/session-resolver.test.js +7 -6
  124. package/dist/src/routes/session-resolver.test.js.map +1 -1
  125. package/dist/src/server.d.ts +6 -0
  126. package/dist/src/server.js +2 -0
  127. package/dist/src/server.js.map +1 -1
  128. package/dist/src/session/drizzle-session-store.d.ts +56 -0
  129. package/dist/src/session/drizzle-session-store.js +203 -0
  130. package/dist/src/session/drizzle-session-store.js.map +1 -0
  131. package/dist/src/session/manager.d.ts +6 -3
  132. package/dist/src/session/manager.js +46 -16
  133. package/dist/src/session/manager.js.map +1 -1
  134. package/dist/src/session/manager.test.js +12 -18
  135. package/dist/src/session/manager.test.js.map +1 -1
  136. package/dist/src/session/pglite-session-store.d.ts +23 -0
  137. package/dist/src/session/pglite-session-store.js +70 -0
  138. package/dist/src/session/pglite-session-store.js.map +1 -0
  139. package/dist/src/session/postgres-session-store.d.ts +44 -0
  140. package/dist/src/session/postgres-session-store.js +138 -0
  141. package/dist/src/session/postgres-session-store.js.map +1 -0
  142. package/dist/src/session/session-builder.d.ts +0 -2
  143. package/dist/src/session/session-builder.js +22 -2
  144. package/dist/src/session/session-builder.js.map +1 -1
  145. package/dist/src/session/session-builder.test.js +0 -2
  146. package/dist/src/session/session-builder.test.js.map +1 -1
  147. package/dist/src/session/session-store-selector.d.ts +49 -0
  148. package/dist/src/session/session-store-selector.js +60 -0
  149. package/dist/src/session/session-store-selector.js.map +1 -0
  150. package/dist/src/session/session-store-selector.test.d.ts +6 -0
  151. package/dist/src/session/session-store-selector.test.js +79 -0
  152. package/dist/src/session/session-store-selector.test.js.map +1 -0
  153. package/dist/src/session/store.d.ts +146 -32
  154. package/dist/src/session/store.js +126 -138
  155. package/dist/src/session/store.js.map +1 -1
  156. package/dist/src/session/store.test.js +385 -107
  157. package/dist/src/session/store.test.js.map +1 -1
  158. package/dist/src/session/tool-context-factory.d.ts +3 -2
  159. package/dist/src/session/tool-context-factory.js +1 -2
  160. package/dist/src/session/tool-context-factory.js.map +1 -1
  161. package/dist/src/session/tool-context-factory.test.js +1 -4
  162. package/dist/src/session/tool-context-factory.test.js.map +1 -1
  163. package/dist/src/session/types.d.ts +13 -6
  164. package/dist/src/stores/schema.d.ts +0 -34
  165. package/dist/src/stores/schema.js +6 -4
  166. package/dist/src/stores/schema.js.map +1 -1
  167. package/dist/src/tools/admin-file-tools.d.ts +29 -0
  168. package/dist/src/tools/admin-file-tools.js +525 -11
  169. package/dist/src/tools/admin-file-tools.js.map +1 -1
  170. package/dist/src/tools/admin-file-tools.test.js +373 -4
  171. package/dist/src/tools/admin-file-tools.test.js.map +1 -1
  172. package/dist/src/tools/custom-tool-adapter.test.js +0 -1
  173. package/dist/src/tools/custom-tool-adapter.test.js.map +1 -1
  174. package/dist/src/tools/dispatch-tool.d.ts +4 -4
  175. package/dist/src/tools/fetch-url-tool.d.ts +23 -0
  176. package/dist/src/tools/fetch-url-tool.js +333 -0
  177. package/dist/src/tools/fetch-url-tool.js.map +1 -0
  178. package/dist/src/tools/fetch-url-tool.test.d.ts +6 -0
  179. package/dist/src/tools/fetch-url-tool.test.js +228 -0
  180. package/dist/src/tools/fetch-url-tool.test.js.map +1 -0
  181. package/dist/src/tools/mcp-tool-adapter.test.js +0 -1
  182. package/dist/src/tools/mcp-tool-adapter.test.js.map +1 -1
  183. package/dist/src/tools/registry.test.js +0 -1
  184. package/dist/src/tools/registry.test.js.map +1 -1
  185. package/dist/src/tools/request-tool.test.js +0 -1
  186. package/dist/src/tools/request-tool.test.js.map +1 -1
  187. package/dist/src/tools/store-tools.test.js +0 -1
  188. package/dist/src/tools/store-tools.test.js.map +1 -1
  189. package/dist/src/tools/types.d.ts +20 -2
  190. package/dist/src/tools/web-search-tool.d.ts +31 -0
  191. package/dist/src/tools/web-search-tool.js +170 -0
  192. package/dist/src/tools/web-search-tool.js.map +1 -0
  193. package/dist/src/tools/web-search-tool.test.d.ts +6 -0
  194. package/dist/src/tools/web-search-tool.test.js +153 -0
  195. package/dist/src/tools/web-search-tool.test.js.map +1 -0
  196. package/dist/src/tools/web-tools-shared.d.ts +21 -0
  197. package/dist/src/tools/web-tools-shared.js +32 -0
  198. package/dist/src/tools/web-tools-shared.js.map +1 -0
  199. package/dist/src/types.d.ts +20 -0
  200. package/dist/src/types.js +13 -0
  201. package/dist/src/types.js.map +1 -1
  202. package/dist/tsconfig.tsbuildinfo +1 -1
  203. package/package.json +17 -3
  204. package/dist/src/agent/session-store.d.ts +0 -71
  205. package/dist/src/agent/session-store.js +0 -151
  206. package/dist/src/agent/session-store.js.map +0 -1
  207. package/dist/src/session/admin-file-tools.d.ts +0 -136
  208. package/dist/src/session/admin-file-tools.js +0 -240
  209. package/dist/src/session/admin-file-tools.js.map +0 -1
@@ -4,17 +4,27 @@
4
4
  * SPDX-License-Identifier: MIT
5
5
  */
6
6
  import { SSEEventType } from '../../types.js';
7
- /** Sentinel values for cleared tool results. */
8
- const CLEARED_TOOL_CALL_ID = 'cleared';
9
- const CLEARED_TOOL_NAME = 'cleared';
7
+ /** Content markers for cleared tool results. Original toolCallId and
8
+ * toolName are preserved so assistant tool-calls still pair with their
9
+ * results (providers reject orphaned tool_use blocks). */
10
10
  const CLEARED_TOOL_RESULT_TEXT = '[Tool result cleared to save context space]';
11
+ /** Prefix used on every cleared/summarized marker — lets us detect
12
+ * already-cleared messages idempotently. */
13
+ const CLEARED_TEXT_PREFIXES = ['[Tool result cleared', '[Summary of '];
14
+ /**
15
+ * Max length (chars) at which a summary-prefix match counts as
16
+ * "already cleared." A short marker is almost certainly one of ours;
17
+ * a long payload that happens to start with "[Summary of " is more
18
+ * likely legit tool output, so we re-summarize it rather than assume.
19
+ */
20
+ const CLEARED_MARKER_MAX_LEN = 500;
11
21
  /**
12
22
  * Handle the THINKING state.
13
23
  *
14
24
  * Increments turnCount, checks for loops, clears old results,
15
25
  * then initiates a streaming LLM call.
16
26
  */
17
- export function handleThinking(state, ctx) {
27
+ export async function handleThinking(state, ctx) {
18
28
  const effects = [];
19
29
  // 1. Increment turn counter
20
30
  ctx.turnCount++;
@@ -35,28 +45,62 @@ export function handleThinking(state, ctx) {
35
45
  }],
36
46
  };
37
47
  }
38
- let messages = state.messages;
39
- if (loop && loop.count >= ctx.config.loopWarningThreshold) {
48
+ // Clear old tool result bodies and persist back to ctx. Without this
49
+ // writeback, every subsequent turn re-calls the summarizer hook for the
50
+ // same messages (expensive). Once a result is cleared, it stays cleared.
51
+ // Must happen before turn-specific warnings are appended, since warnings
52
+ // are local-to-this-turn and should not persist.
53
+ ctx.messages = await clearOldToolResults(state.messages, ctx);
54
+ let messages = ctx.messages;
55
+ // Purge any disabled-tool entries whose cooldown has expired, so a tool
56
+ // re-entering the tool set is available to the model again.
57
+ for (const [name, untilTurn] of ctx.disabledToolsUntilTurn) {
58
+ if (ctx.turnCount >= untilTurn)
59
+ ctx.disabledToolsUntilTurn.delete(name);
60
+ }
61
+ if (loop && loop.count >= ctx.config.loopEscalationThreshold) {
62
+ // Escalation tier: strongly nudge the model AND disable the looping
63
+ // tool for a cooldown window. Without the cooldown, the agent could
64
+ // immediately re-call the tool next turn, drop the loop count below
65
+ // threshold, and keep oscillating.
66
+ const cooldown = ctx.config.loopEscalationCooldownTurns;
67
+ const untilTurn = ctx.turnCount + cooldown;
68
+ ctx.disabledToolsUntilTurn.set(loop.toolName, untilTurn);
69
+ ctx.logger.warn('agent_loop_escalation', {
70
+ session: ctx.sessionId,
71
+ tool: loop.toolName,
72
+ count: loop.count,
73
+ cooldownTurns: cooldown,
74
+ disabledUntilTurn: untilTurn,
75
+ });
76
+ const escalationMessage = {
77
+ role: 'user',
78
+ content: `[System Notice — Escalation] You have called ${loop.toolName} ${loop.count} times with similar parameters and are not making progress. The ${loop.toolName} tool has been temporarily disabled for the next ${cooldown} turns — use a different tool or ask the user for help.`,
79
+ };
80
+ messages = [...messages, escalationMessage];
81
+ }
82
+ else if (loop && loop.count >= ctx.config.loopWarningThreshold) {
40
83
  ctx.logger.info('agent_loop_warning', {
41
84
  session: ctx.sessionId,
42
85
  tool: loop.toolName,
43
86
  count: loop.count,
44
87
  });
45
88
  const warningMessage = {
46
- role: 'system',
47
- content: `[Warning] You have called ${loop.toolName} ${loop.count} times with similar parameters. Try a different approach.`,
89
+ role: 'user',
90
+ content: `[System Notice — Warning] You have called ${loop.toolName} ${loop.count} times with similar parameters. Try a different approach.`,
48
91
  };
49
92
  messages = [...messages, warningMessage];
50
93
  }
51
- // 3. Clear old tool result bodies — keep last N full, replace older with summaries
52
- // Prevents unbounded context growth in tool-heavy sessions.
53
- messages = clearOldToolResults(messages, ctx.config.clearThreshold, ctx.config.keepRecentResults);
54
94
  // 4. Build tool schemas for the AI SDK (strip execute functions — we handle
55
95
  // execution ourselves in EXECUTING state with permission checks, SSE events, etc.)
56
96
  // AI SDK v6 uses `inputSchema`, not `parameters`.
57
97
  const allTools = ctx.toolRegistry.getTools();
58
98
  const tools = {};
59
99
  for (const [name, def] of Object.entries(allTools)) {
100
+ // Skip tools that escalation has disabled for a cooldown window.
101
+ const disabledUntil = ctx.disabledToolsUntilTurn.get(name);
102
+ if (disabledUntil !== undefined && ctx.turnCount < disabledUntil)
103
+ continue;
60
104
  // ToolDefinition.parameters is either a Zod schema or FlexibleSchema —
61
105
  // both are accepted by AI SDK as inputSchema.
62
106
  tools[name] = {
@@ -128,6 +172,24 @@ function detectLoop(messages) {
128
172
  }
129
173
  return null;
130
174
  }
175
+ /**
176
+ * Known pagination / iteration parameter names. Calls that differ ONLY
177
+ * in these keys are legitimate iteration (walking a file in chunks,
178
+ * paging through a result set) and must NOT count toward loop detection.
179
+ */
180
+ const PAGINATION_KEYS = new Set([
181
+ 'offset',
182
+ 'limit',
183
+ 'page',
184
+ 'start_line',
185
+ 'end_line',
186
+ 'cursor',
187
+ 'after',
188
+ 'before',
189
+ 'next_page_token',
190
+ 'page_token',
191
+ 'skip',
192
+ ]);
131
193
  /**
132
194
  * Count the size of the largest group of similar argument sets.
133
195
  *
@@ -135,6 +197,11 @@ function detectLoop(messages) {
135
197
  * half their values are identical. This catches loops where the agent
136
198
  * retries with slightly different parameters (e.g., changing a page number
137
199
  * but keeping everything else the same).
200
+ *
201
+ * Exception: if two calls differ ONLY in pagination-ish keys (offset,
202
+ * limit, cursor, page, etc.), they represent legitimate iteration and
203
+ * are not counted as similar — otherwise read_repo_file pagination trips
204
+ * the detector after 3 offsets.
138
205
  */
139
206
  function countSimilarCalls(argsList) {
140
207
  if (argsList.length <= 2)
@@ -176,13 +243,19 @@ function countSimilarCalls(argsList) {
176
243
  if (group.length < 3)
177
244
  continue;
178
245
  // Within a key group, count pairs with >50% identical values
179
- // Use first element as reference and count how many are similar to it
246
+ // Use first element as reference and count how many are similar to it.
247
+ // Pagination variants (differ only in offset/limit/cursor/etc.) don't
248
+ // count — they represent legitimate iteration.
180
249
  const ref = group[0];
181
250
  const keys = Object.keys(ref);
182
251
  let similarToRef = 1;
183
252
  for (let i = 1; i < group.length; i++) {
184
- const matching = keys.filter((k) => JSON.stringify(ref[k]) === JSON.stringify(group[i][k]));
185
- if (matching.length >= keys.length / 2) {
253
+ const differingKeys = keys.filter((k) => JSON.stringify(ref[k]) !== JSON.stringify(group[i][k]));
254
+ const onlyPaginationDiffers = differingKeys.length > 0 && differingKeys.every((k) => PAGINATION_KEYS.has(k));
255
+ if (onlyPaginationDiffers)
256
+ continue;
257
+ const matchingCount = keys.length - differingKeys.length;
258
+ if (matchingCount >= keys.length / 2) {
186
259
  similarToRef++;
187
260
  }
188
261
  }
@@ -196,12 +269,19 @@ function countSimilarCalls(argsList) {
196
269
  /**
197
270
  * Replace old tool result bodies with one-line summaries.
198
271
  *
199
- * If there are more than `threshold` tool result messages, keep the last
200
- * `keepRecent` full and replace older ones with "[Tool result cleared]".
201
- * TODO: replace the marker with an actual LLM-generated summary of the
202
- * cleared content.
272
+ * If there are more than `ctx.config.clearThreshold` tool result messages,
273
+ * keep the last `ctx.config.keepRecentResults` full and replace older ones
274
+ * with a cleared marker.
275
+ *
276
+ * When `ctx.summarizeToolResult` is provided, each newly-cleared message
277
+ * gets an LLM-generated 1-2 sentence summary of its body (in parallel).
278
+ * Already-cleared messages are skipped (idempotent). Summarization
279
+ * failures degrade to the static marker so context clearing never
280
+ * blocks the main loop.
203
281
  */
204
- function clearOldToolResults(messages, threshold, keepRecent) {
282
+ async function clearOldToolResults(messages, ctx) {
283
+ const threshold = ctx.config.clearThreshold;
284
+ const keepRecent = ctx.config.keepRecentResults;
205
285
  // Count tool result messages
206
286
  const toolResultIndices = [];
207
287
  for (let i = 0; i < messages.length; i++) {
@@ -215,19 +295,156 @@ function clearOldToolResults(messages, threshold, keepRecent) {
215
295
  }
216
296
  // Keep the last `keepRecent` tool results full, clear the rest
217
297
  const indicesToClear = toolResultIndices.slice(0, -keepRecent);
218
- const result = [...messages];
219
- for (const idx of indicesToClear) {
220
- const cleared = {
221
- role: 'tool',
222
- content: [{
223
- type: 'tool-result',
224
- toolCallId: CLEARED_TOOL_CALL_ID,
225
- toolName: CLEARED_TOOL_NAME,
226
- output: { type: 'text', value: CLEARED_TOOL_RESULT_TEXT },
227
- }],
298
+ // Build one task per index — skip already-cleared (idempotent), summarize
299
+ // the rest. Tasks run through a bounded worker pool so we don't fan out
300
+ // 10+ concurrent summarizer calls into provider rate limits.
301
+ const clearOne = async (idx) => {
302
+ const existing = messages[idx];
303
+ // Already-cleared messages: keep the existing marker unchanged
304
+ if (isAlreadyCleared(existing))
305
+ return { idx, cleared: existing };
306
+ const toolCallId = extractToolCallId(existing);
307
+ const toolName = extractToolName(existing);
308
+ const body = extractToolResultText(existing);
309
+ const markerText = await summarizeOrFallback(toolName, body, ctx.summarizeToolResult, ctx.signal, ctx.config.summarizerTimeoutMs, ctx.logger, ctx.sessionId);
310
+ // CRITICAL: preserve the original toolCallId and toolName. Providers
311
+ // (Anthropic especially) require every assistant tool-call to have
312
+ // a matching tool-result with the same toolCallId; rewriting it
313
+ // breaks the conversation with "tool results are missing" errors.
314
+ return {
315
+ idx,
316
+ cleared: {
317
+ role: 'tool',
318
+ content: [{
319
+ type: 'tool-result',
320
+ toolCallId,
321
+ toolName,
322
+ output: { type: 'text', value: markerText },
323
+ }],
324
+ },
228
325
  };
326
+ };
327
+ const resolved = await runWithConcurrency(indicesToClear, clearOne, ctx.config.summarizerConcurrency);
328
+ const result = [...messages];
329
+ for (const { idx, cleared } of resolved) {
229
330
  result[idx] = cleared;
230
331
  }
231
332
  return result;
232
333
  }
334
+ /**
335
+ * Execute `task(item)` for each item with a concurrency cap. Preserves
336
+ * input order in the returned results. Functionally equivalent to
337
+ * `Promise.all(items.map(task))` but bounded so we don't fan out into
338
+ * provider rate limits.
339
+ *
340
+ * `task` MUST NOT throw — a throwing task rejects Promise.all and leaves
341
+ * `undefined` holes in `results` for items after the failure point.
342
+ * Wrap fallible work in try/catch inside the task itself (as
343
+ * `summarizeOrFallback` does).
344
+ */
345
+ async function runWithConcurrency(items, task, concurrency) {
346
+ const max = Math.max(1, concurrency);
347
+ const results = new Array(items.length);
348
+ let nextIndex = 0;
349
+ const worker = async () => {
350
+ while (true) {
351
+ const i = nextIndex++;
352
+ if (i >= items.length)
353
+ return;
354
+ results[i] = await task(items[i]);
355
+ }
356
+ };
357
+ const workers = [];
358
+ for (let w = 0; w < Math.min(max, items.length); w++) {
359
+ workers.push(worker());
360
+ }
361
+ await Promise.all(workers);
362
+ return results;
363
+ }
364
+ /** Extract the assistant-visible text from a tool-result message. */
365
+ function extractToolResultText(msg) {
366
+ if (msg.role !== 'tool')
367
+ return '';
368
+ if (typeof msg.content === 'string')
369
+ return msg.content;
370
+ if (!Array.isArray(msg.content))
371
+ return '';
372
+ const parts = [];
373
+ for (const part of msg.content) {
374
+ if ('output' in part && part.output && typeof part.output === 'object' && 'value' in part.output) {
375
+ const value = part.output.value;
376
+ if (typeof value === 'string')
377
+ parts.push(value);
378
+ else
379
+ parts.push(JSON.stringify(value));
380
+ }
381
+ }
382
+ return parts.join('\n');
383
+ }
384
+ /** Extract the original tool name from a tool-result message, if available. */
385
+ function extractToolName(msg) {
386
+ if (msg.role !== 'tool' || !Array.isArray(msg.content))
387
+ return 'unknown';
388
+ for (const part of msg.content) {
389
+ if ('toolName' in part && typeof part.toolName === 'string')
390
+ return part.toolName;
391
+ }
392
+ return 'unknown';
393
+ }
394
+ /** Extract the original toolCallId from a tool-result message. */
395
+ function extractToolCallId(msg) {
396
+ if (msg.role !== 'tool' || !Array.isArray(msg.content))
397
+ return 'unknown';
398
+ for (const part of msg.content) {
399
+ if ('toolCallId' in part && typeof part.toolCallId === 'string')
400
+ return part.toolCallId;
401
+ }
402
+ return 'unknown';
403
+ }
404
+ /**
405
+ * True if this message has already been replaced with a cleared marker.
406
+ * Detected by content prefix (we no longer overwrite toolCallId) with a
407
+ * length cap so a legit tool result that happens to start with "[Summary
408
+ * of " doesn't get silently skipped from summarization.
409
+ */
410
+ function isAlreadyCleared(msg) {
411
+ if (msg.role !== 'tool' || !Array.isArray(msg.content))
412
+ return false;
413
+ for (const part of msg.content) {
414
+ if ('output' in part && part.output && typeof part.output === 'object' && 'value' in part.output) {
415
+ const value = part.output.value;
416
+ if (typeof value === 'string' && value.length <= CLEARED_MARKER_MAX_LEN) {
417
+ if (CLEARED_TEXT_PREFIXES.some((p) => value.startsWith(p)))
418
+ return true;
419
+ }
420
+ }
421
+ }
422
+ return false;
423
+ }
424
+ /**
425
+ * Produce replacement text for a cleared tool result. Uses the summarizer
426
+ * hook if provided; falls back to the static marker on any failure.
427
+ */
428
+ async function summarizeOrFallback(toolName, content, summarize, signal, timeoutMs, logger, sessionId) {
429
+ if (!summarize || content.length === 0)
430
+ return CLEARED_TOOL_RESULT_TEXT;
431
+ // Bound the callback so a hung summarizer can never block the main loop.
432
+ // The session signal is ANDed in so a parent abort still tears this down.
433
+ const timeoutSignal = AbortSignal.any([signal, AbortSignal.timeout(timeoutMs)]);
434
+ try {
435
+ const summary = await summarize({ toolName, content, signal: timeoutSignal });
436
+ const trimmed = summary.trim();
437
+ if (trimmed.length === 0)
438
+ return CLEARED_TOOL_RESULT_TEXT;
439
+ return `[Summary of ${toolName}: ${trimmed}]`;
440
+ }
441
+ catch (err) {
442
+ logger.warn('tool_result_summarization_failed', {
443
+ session: sessionId,
444
+ tool: toolName,
445
+ error: err instanceof Error ? err.message : String(err),
446
+ });
447
+ return CLEARED_TOOL_RESULT_TEXT;
448
+ }
449
+ }
233
450
  //# sourceMappingURL=thinking.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"thinking.js","sourceRoot":"","sources":["../../../../src/agent/states/thinking.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"thinking.js","sourceRoot":"","sources":["../../../../src/agent/states/thinking.ts"],"names":[],"mappings":"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"}
@@ -4,14 +4,28 @@
4
4
  * SPDX-License-Identifier: MIT
5
5
  */
6
6
  /**
7
- * Rough token estimation from message arrays.
7
+ * Token estimation from message arrays.
8
8
  *
9
- * Uses a ~4 chars per token heuristic (JSON serialized). This is a
10
- * placeholdera future improvement would use the provider's tokenizer
11
- * or a local tiktoken instance for accurate counts.
9
+ * The runtime's default count is a ~4 chars-per-token heuristic over the
10
+ * JSON-serialized messages close enough for compaction decisions but
11
+ * not exact. When a provider implements `countTokens` (e.g. wiring a
12
+ * local `tiktoken` for OpenAI/Anthropic), the runtime delegates to it
13
+ * for higher fidelity.
12
14
  */
13
15
  import type { ModelMessage } from 'ai';
16
+ import type { LLMProvider } from '../providers/types.js';
14
17
  /**
15
- * Rough token estimate from a message array. ~4 chars per token.
18
+ * Estimate tokens for a message array.
19
+ *
20
+ * If `provider.countTokens` is implemented, delegates to it for a
21
+ * provider-native count. Otherwise falls back to the 4-chars-per-token
22
+ * heuristic over the serialized JSON — fine for compaction thresholds,
23
+ * but noticeably off for tool-heavy contexts.
24
+ *
25
+ * Results are memoized by message-array identity (WeakMap). Callers in
26
+ * the agent loop treat `ctx.messages` as immutable — every append creates
27
+ * a new array via spread — so reference equality is a safe cache key.
28
+ * This turns N-per-turn stringify calls into O(1) lookups after the
29
+ * first estimate, which matters on long tool-heavy sessions.
16
30
  */
17
- export declare function estimateTokenCount(messages: ModelMessage[]): number;
31
+ export declare function estimateTokenCount(messages: ModelMessage[], provider?: LLMProvider): number;
@@ -4,10 +4,31 @@
4
4
  * SPDX-License-Identifier: MIT
5
5
  */
6
6
  /**
7
- * Rough token estimate from a message array. ~4 chars per token.
7
+ * Estimate tokens for a message array.
8
+ *
9
+ * If `provider.countTokens` is implemented, delegates to it for a
10
+ * provider-native count. Otherwise falls back to the 4-chars-per-token
11
+ * heuristic over the serialized JSON — fine for compaction thresholds,
12
+ * but noticeably off for tool-heavy contexts.
13
+ *
14
+ * Results are memoized by message-array identity (WeakMap). Callers in
15
+ * the agent loop treat `ctx.messages` as immutable — every append creates
16
+ * a new array via spread — so reference equality is a safe cache key.
17
+ * This turns N-per-turn stringify calls into O(1) lookups after the
18
+ * first estimate, which matters on long tool-heavy sessions.
8
19
  */
9
- export function estimateTokenCount(messages) {
20
+ export function estimateTokenCount(messages, provider) {
21
+ if (provider?.countTokens) {
22
+ return provider.countTokens(messages);
23
+ }
24
+ const cached = heuristicCache.get(messages);
25
+ if (cached !== undefined)
26
+ return cached;
10
27
  const serialized = JSON.stringify(messages);
11
- return Math.ceil(serialized.length / 4);
28
+ const estimate = Math.ceil(serialized.length / 4);
29
+ heuristicCache.set(messages, estimate);
30
+ return estimate;
12
31
  }
32
+ /** Identity-keyed cache for the JSON-length heuristic. */
33
+ const heuristicCache = new WeakMap();
13
34
  //# sourceMappingURL=token-estimate.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"token-estimate.js","sourceRoot":"","sources":["../../../src/agent/token-estimate.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAYH;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,QAAwB;IACzD,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;IAC5C,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AAC1C,CAAC"}
1
+ {"version":3,"file":"token-estimate.js","sourceRoot":"","sources":["../../../src/agent/token-estimate.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAeH;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,kBAAkB,CAChC,QAAwB,EACxB,QAAsB;IAEtB,IAAI,QAAQ,EAAE,WAAW,EAAE,CAAC;QAC1B,OAAO,QAAQ,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;IACxC,CAAC;IACD,MAAM,MAAM,GAAG,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC5C,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,MAAM,CAAC;IACxC,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;IAC5C,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAClD,cAAc,CAAC,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IACvC,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,0DAA0D;AAC1D,MAAM,cAAc,GAAG,IAAI,OAAO,EAA0B,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Amodal Labs, Inc.
4
+ * SPDX-License-Identifier: MIT
5
+ */
6
+ export {};
@@ -0,0 +1,44 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Amodal Labs, Inc.
4
+ * SPDX-License-Identifier: MIT
5
+ */
6
+ import { describe, it, expect, vi } from 'vitest';
7
+ import { estimateTokenCount } from './token-estimate.js';
8
+ describe('estimateTokenCount', () => {
9
+ const messages = [
10
+ { role: 'user', content: 'Hello world' },
11
+ { role: 'assistant', content: 'Hi there!' },
12
+ ];
13
+ it('falls back to 4-chars heuristic when no provider given', () => {
14
+ const count = estimateTokenCount(messages);
15
+ const serialized = JSON.stringify(messages);
16
+ expect(count).toBe(Math.ceil(serialized.length / 4));
17
+ });
18
+ it('falls back to heuristic when provider lacks countTokens', () => {
19
+ const provider = {
20
+ model: 'test',
21
+ provider: 'test',
22
+ languageModel: {},
23
+ streamText: vi.fn(),
24
+ generateText: vi.fn(),
25
+ };
26
+ const count = estimateTokenCount(messages, provider);
27
+ expect(count).toBe(Math.ceil(JSON.stringify(messages).length / 4));
28
+ });
29
+ it('delegates to provider.countTokens when implemented', () => {
30
+ const countTokens = vi.fn().mockReturnValue(42);
31
+ const provider = {
32
+ model: 'test',
33
+ provider: 'test',
34
+ languageModel: {},
35
+ streamText: vi.fn(),
36
+ generateText: vi.fn(),
37
+ countTokens,
38
+ };
39
+ const count = estimateTokenCount(messages, provider);
40
+ expect(count).toBe(42);
41
+ expect(countTokens).toHaveBeenCalledWith(messages);
42
+ });
43
+ });
44
+ //# sourceMappingURL=token-estimate.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-estimate.test.js","sourceRoot":"","sources":["../../../src/agent/token-estimate.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAC,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAC,MAAM,QAAQ,CAAC;AAEhD,OAAO,EAAC,kBAAkB,EAAC,MAAM,qBAAqB,CAAC;AAGvD,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IAClC,MAAM,QAAQ,GAAmB;QAC/B,EAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,EAAC;QACtC,EAAC,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,WAAW,EAAC;KAC1C,CAAC;IAEF,EAAE,CAAC,wDAAwD,EAAE,GAAG,EAAE;QAChE,MAAM,KAAK,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAC;QAC3C,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QAC5C,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yDAAyD,EAAE,GAAG,EAAE;QACjE,MAAM,QAAQ,GAAG;YACf,KAAK,EAAE,MAAM;YACb,QAAQ,EAAE,MAAM;YAChB,aAAa,EAAE,EAAkC;YACjD,UAAU,EAAE,EAAE,CAAC,EAAE,EAAE;YACnB,YAAY,EAAE,EAAE,CAAC,EAAE,EAAE;SACA,CAAC;QAExB,MAAM,KAAK,GAAG,kBAAkB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QACrD,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;IACrE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oDAAoD,EAAE,GAAG,EAAE;QAC5D,MAAM,WAAW,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC;QAChD,MAAM,QAAQ,GAAG;YACf,KAAK,EAAE,MAAM;YACb,QAAQ,EAAE,MAAM;YAChB,aAAa,EAAE,EAAkC;YACjD,UAAU,EAAE,EAAE,CAAC,EAAE,EAAE;YACnB,YAAY,EAAE,EAAE,CAAC,EAAE,EAAE;YACrB,WAAW;SACU,CAAC;QAExB,MAAM,KAAK,GAAG,kBAAkB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QACrD,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACvB,MAAM,CAAC,WAAW,CAAC,CAAC,oBAAoB,CAAC,QAAQ,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -11,7 +11,6 @@ import { buildMcpConfigs } from '../agent/mcp-config.js';
11
11
  import { createPGLiteStoreBackend } from '../stores/pglite-store-backend.js';
12
12
  import { createLogger } from '../logger.js';
13
13
  import { SessionError } from '../errors.js';
14
- import { LOCAL_APP_ID } from '../constants.js';
15
14
  const MCP_STARTUP_TIMEOUT_MS = 30_000;
16
15
  // ---------------------------------------------------------------------------
17
16
  // createAgent
@@ -77,8 +76,6 @@ export async function createAgent(config) {
77
76
  return {
78
77
  createSession(opts) {
79
78
  const session = sessionManager.create({
80
- tenantId: opts?.tenantId ?? LOCAL_APP_ID,
81
- userId: opts?.userId ?? 'api',
82
79
  provider: components.provider,
83
80
  toolRegistry: components.toolRegistry,
84
81
  permissionChecker: components.permissionChecker,
@@ -1 +1 @@
1
- {"version":3,"file":"create-agent.js","sourceRoot":"","sources":["../../../src/api/create-agent.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAoBH,OAAO,EAAC,QAAQ,EAAE,UAAU,EAAC,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAC,wBAAwB,EAAC,MAAM,uBAAuB,CAAC;AAC/D,OAAO,EAAC,sBAAsB,EAAC,MAAM,+BAA+B,CAAC;AAErE,OAAO,EAAC,iBAAiB,EAAC,MAAM,iCAAiC,CAAC;AAClE,OAAO,EAAC,eAAe,EAAC,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAC,wBAAwB,EAAC,MAAM,mCAAmC,CAAC;AAC3E,OAAO,EAAC,YAAY,EAAC,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAC,YAAY,EAAC,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAC,YAAY,EAAC,MAAM,iBAAiB,CAAC;AAI7C,MAAM,sBAAsB,GAAG,MAAM,CAAC;AAEtC,8EAA8E;AAC9E,cAAc;AACd,8EAA8E;AAE9E;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,MAAmB;IACnD,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,YAAY,CAAC,EAAC,SAAS,EAAE,OAAO,EAAC,CAAC,CAAC;IAEnE,cAAc;IACd,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,MAAM,QAAQ,CAAC,EAAC,SAAS,EAAE,MAAM,CAAC,QAAQ,EAAC,CAAC,CAAC;IAE7E,gBAAgB;IAChB,IAAI,YAAY,GAAwB,MAAM,CAAC,YAAY,IAAI,IAAI,CAAC;IACpE,IAAI,CAAC,YAAY,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QACjE,MAAM,OAAO,GAAG,GAAG,MAAM,CAAC,QAAQ,qBAAqB,CAAC;QACxD,YAAY,GAAG,MAAM,wBAAwB,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACxE,CAAC;IAED,gBAAgB;IAChB,MAAM,YAAY,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,iBAAiB,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;IAEnF,8DAA8D;IAC9D,IAAI,UAAU,GAAsB,MAAM,CAAC,UAAU,IAAI,IAAI,CAAC;IAC9D,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,MAAM,UAAU,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;QAC3C,IAAI,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvC,MAAM,OAAO,GAAG,IAAI,UAAU,EAAE,CAAC;YACjC,IAAI,CAAC;gBACH,MAAM,OAAO,CAAC,IAAI,CAAC;oBACjB,OAAO,CAAC,YAAY,CAAC,UAAU,CAAC;oBAChC,IAAI,OAAO,CAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE;wBAC/B,UAAU,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC,EAAE,sBAAsB,CAAC,CAAC;oBACvF,CAAC,CAAC;iBACH,CAAC,CAAC;gBACH,IAAI,OAAO,CAAC,cAAc,GAAG,CAAC,EAAE,CAAC;oBAC/B,UAAU,GAAG,OAAO,CAAC;oBACrB,MAAM,CAAC,IAAI,CAAC,iBAAiB,EAAE,EAAC,OAAO,EAAE,OAAO,CAAC,cAAc,EAAC,CAAC,CAAC;gBACpE,CAAC;YACH,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,CAAC,IAAI,CAAC,oBAAoB,EAAE,EAAC,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAC,CAAC,CAAC;gBAC7F,6DAA6D;YAC/D,CAAC;QACH,CAAC;IACH,CAAC;IAED,kBAAkB;IAClB,MAAM,cAAc,GAAG,IAAI,wBAAwB,CAAC;QAClD,MAAM;QACN,KAAK,EAAE,MAAM,CAAC,YAAY;KAC3B,CAAC,CAAC;IACH,cAAc,CAAC,KAAK,EAAE,CAAC;IAEvB,kDAAkD;IAClD,MAAM,UAAU,GAAG,sBAAsB,CAAC;QACxC,MAAM;QACN,YAAY;QACZ,UAAU;QACV,MAAM;QACN,YAAY;KACb,CAAC,CAAC;IAEH,OAAO;QACL,aAAa,CAAC,IAAI;YAChB,MAAM,OAAO,GAAG,cAAc,CAAC,MAAM,CAAC;gBACpC,QAAQ,EAAE,IAAI,EAAE,QAAQ,IAAI,YAAY;gBACxC,MAAM,EAAE,IAAI,EAAE,MAAM,IAAI,KAAK;gBAC7B,QAAQ,EAAE,UAAU,CAAC,QAAQ;gBAC7B,YAAY,EAAE,UAAU,CAAC,YAAY;gBACrC,iBAAiB,EAAE,UAAU,CAAC,iBAAiB;gBAC/C,YAAY,EAAE,UAAU,CAAC,YAAY;gBACrC,SAAS,EAAE,IAAI,EAAE,SAAS,IAAI,UAAU,CAAC,SAAS;gBAClD,kBAAkB,EAAE,UAAU,CAAC,kBAAkB;aAClD,CAAC,CAAC;YAEH,OAAO,kBAAkB,CAAC,cAAc,EAAE,OAAO,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;QACpE,CAAC;QAED,KAAK,CAAC,aAAa,CAAC,SAAS;YAC3B,MAAM,QAAQ,GAAG,cAAc,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YAC/C,IAAI,QAAQ,EAAE,CAAC;gBACb,OAAO,kBAAkB,CAAC,cAAc,EAAE,QAAQ,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;YACrE,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;QAED,eAAe;YACb,OAAO,UAAU,CAAC,YAAY,CAAC;QACjC,CAAC;QAED,SAAS;YACP,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,KAAK,CAAC,QAAQ;YACZ,MAAM,cAAc,CAAC,QAAQ,EAAE,CAAC;YAChC,IAAI,UAAU,EAAE,CAAC;gBACf,MAAM,UAAU,CAAC,QAAQ,EAAE,CAAC;YAC9B,CAAC;YACD,IAAI,YAAY,EAAE,CAAC;gBACjB,MAAM,YAAY,CAAC,KAAK,EAAE,CAAC;YAC7B,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC;AAED,8EAA8E;AAC9E,uBAAuB;AACvB,8EAA8E;AAE9E,SAAS,kBAAkB,CACzB,cAAwC,EACxC,SAAiB,EACjB,UAA6B;IAE7B,MAAM,OAAO,GAAG,cAAc,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IAC9C,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,YAAY,CAAC,YAAY,SAAS,aAAa,EAAE;YACzD,SAAS;YACT,OAAO,EAAE,EAAC,SAAS,EAAE,oBAAoB,EAAC;SAC3C,CAAC,CAAC;IACL,CAAC;IAED,OAAO;QACL,IAAI,EAAE,KAAK,OAAO,SAAS,CAAC,CAAC,CAAC;QAC9B,IAAI,OAAO,KAAK,OAAO,OAAO,CAAC,CAAC,CAAC;QAEjC,KAAK,CAAC,CAAC,MAAM,CAAC,OAAe,EAAE,IAA6B;YAC1D,KAAK,CAAC,CAAC,cAAc,CAAC,UAAU,CAAC,SAAS,EAAE,OAAO,EAAE;gBACnD,MAAM,EAAE,IAAI,EAAE,MAAM;gBACpB,gBAAgB,EAAE,UAAU,CAAC,kBAAkB;aAChD,CAAC,CAAC;QACL,CAAC;KACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"create-agent.js","sourceRoot":"","sources":["../../../src/api/create-agent.ts"],"names":[],"mappings":"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"}
@@ -42,8 +42,6 @@ export interface AgentConfig {
42
42
  export interface Agent {
43
43
  /** Create a new chat session. */
44
44
  createSession(opts?: {
45
- tenantId?: string;
46
- userId?: string;
47
45
  userRoles?: string[];
48
46
  }): AgentSession;
49
47
  /** Resume an existing session by ID. Returns null if not found. */
@@ -0,0 +1,13 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Amodal Labs, Inc.
4
+ * SPDX-License-Identifier: MIT
5
+ */
6
+ /**
7
+ * Resolve an optional config value that may be an `env:VAR_NAME` reference.
8
+ *
9
+ * - `undefined` / empty → returns `undefined`.
10
+ * - Plain string → returned unchanged.
11
+ * - `env:FOO` → returns `process.env.FOO` (may be `undefined` if unset).
12
+ */
13
+ export declare function resolveEnvRef(value: string | undefined): string | undefined;
@@ -0,0 +1,31 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Amodal Labs, Inc.
4
+ * SPDX-License-Identifier: MIT
5
+ */
6
+ /**
7
+ * Resolver for `env:VAR_NAME` config references.
8
+ *
9
+ * amodal.json values can be written as either a literal string or as
10
+ * `env:VAR_NAME` to pull from the process environment. Centralizing
11
+ * resolution here keeps `process.env` reads out of business logic per
12
+ * CLAUDE.md and avoids drift between callers.
13
+ */
14
+ const ENV_PREFIX = 'env:';
15
+ /**
16
+ * Resolve an optional config value that may be an `env:VAR_NAME` reference.
17
+ *
18
+ * - `undefined` / empty → returns `undefined`.
19
+ * - Plain string → returned unchanged.
20
+ * - `env:FOO` → returns `process.env.FOO` (may be `undefined` if unset).
21
+ */
22
+ export function resolveEnvRef(value) {
23
+ if (!value)
24
+ return undefined;
25
+ if (value.startsWith(ENV_PREFIX)) {
26
+ const varName = value.slice(ENV_PREFIX.length);
27
+ return process.env[varName];
28
+ }
29
+ return value;
30
+ }
31
+ //# sourceMappingURL=env-ref.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env-ref.js","sourceRoot":"","sources":["../../src/env-ref.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;;;;;;GAOG;AAEH,MAAM,UAAU,GAAG,MAAM,CAAC;AAE1B;;;;;;GAMG;AACH,MAAM,UAAU,aAAa,CAAC,KAAyB;IACrD,IAAI,CAAC,KAAK;QAAE,OAAO,SAAS,CAAC;IAC7B,IAAI,KAAK,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QACjC,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QAC/C,OAAO,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAC9B,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Amodal Labs, Inc.
4
+ * SPDX-License-Identifier: MIT
5
+ */
6
+ export {};