@amodalai/runtime 0.3.48 → 0.3.50

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 (161) hide show
  1. package/dist/src/agent/completion-tools.integration.test.d.ts +6 -0
  2. package/dist/src/agent/completion-tools.integration.test.js +263 -0
  3. package/dist/src/agent/completion-tools.integration.test.js.map +1 -0
  4. package/dist/src/agent/load-template-plan.integration.test.d.ts +6 -0
  5. package/dist/src/agent/load-template-plan.integration.test.js +152 -0
  6. package/dist/src/agent/load-template-plan.integration.test.js.map +1 -0
  7. package/dist/src/agent/local-server.js +64 -9
  8. package/dist/src/agent/local-server.js.map +1 -1
  9. package/dist/src/agent/loop-types.d.ts +12 -2
  10. package/dist/src/agent/loop.test.js +5 -2
  11. package/dist/src/agent/loop.test.js.map +1 -1
  12. package/dist/src/agent/propose-plan.integration.test.d.ts +6 -0
  13. package/dist/src/agent/propose-plan.integration.test.js +186 -0
  14. package/dist/src/agent/propose-plan.integration.test.js.map +1 -0
  15. package/dist/src/agent/routes/package-updates.d.ts +42 -0
  16. package/dist/src/agent/routes/package-updates.js +207 -0
  17. package/dist/src/agent/routes/package-updates.js.map +1 -0
  18. package/dist/src/agent/routes/package-updates.test.d.ts +6 -0
  19. package/dist/src/agent/routes/package-updates.test.js +25 -0
  20. package/dist/src/agent/routes/package-updates.test.js.map +1 -0
  21. package/dist/src/agent/setup-state.integration.test.d.ts +6 -0
  22. package/dist/src/agent/setup-state.integration.test.js +182 -0
  23. package/dist/src/agent/setup-state.integration.test.js.map +1 -0
  24. package/dist/src/agent/snapshot-server.js +1 -0
  25. package/dist/src/agent/snapshot-server.js.map +1 -1
  26. package/dist/src/agent/states/executing.d.ts +6 -0
  27. package/dist/src/agent/states/executing.js +63 -27
  28. package/dist/src/agent/states/executing.js.map +1 -1
  29. package/dist/src/agent/states/streaming.js +18 -2
  30. package/dist/src/agent/states/streaming.js.map +1 -1
  31. package/dist/src/agent/tool-executor-local.js +11 -2
  32. package/dist/src/agent/tool-executor-local.js.map +1 -1
  33. package/dist/src/agent/validate-connection.integration.test.d.ts +6 -0
  34. package/dist/src/agent/validate-connection.integration.test.js +160 -0
  35. package/dist/src/agent/validate-connection.integration.test.js.map +1 -0
  36. package/dist/src/api/create-agent.js +1 -0
  37. package/dist/src/api/create-agent.js.map +1 -1
  38. package/dist/src/index.d.ts +2 -0
  39. package/dist/src/index.js +9 -0
  40. package/dist/src/index.js.map +1 -1
  41. package/dist/src/intent/executor.d.ts +48 -0
  42. package/dist/src/intent/executor.js +420 -0
  43. package/dist/src/intent/executor.js.map +1 -0
  44. package/dist/src/intent/executor.test.d.ts +6 -0
  45. package/dist/src/intent/executor.test.js +543 -0
  46. package/dist/src/intent/executor.test.js.map +1 -0
  47. package/dist/src/intent/index.d.ts +10 -0
  48. package/dist/src/intent/index.js +9 -0
  49. package/dist/src/intent/index.js.map +1 -0
  50. package/dist/src/intent/loader.d.ts +16 -0
  51. package/dist/src/intent/loader.js +112 -0
  52. package/dist/src/intent/loader.js.map +1 -0
  53. package/dist/src/intent/loader.test.d.ts +6 -0
  54. package/dist/src/intent/loader.test.js +86 -0
  55. package/dist/src/intent/loader.test.js.map +1 -0
  56. package/dist/src/intent/matcher.d.ts +26 -0
  57. package/dist/src/intent/matcher.js +29 -0
  58. package/dist/src/intent/matcher.js.map +1 -0
  59. package/dist/src/intent/matcher.test.d.ts +6 -0
  60. package/dist/src/intent/matcher.test.js +53 -0
  61. package/dist/src/intent/matcher.test.js.map +1 -0
  62. package/dist/src/intent/onboarding.e2e.test.d.ts +6 -0
  63. package/dist/src/intent/onboarding.e2e.test.js +394 -0
  64. package/dist/src/intent/onboarding.e2e.test.js.map +1 -0
  65. package/dist/src/routes/ai-stream.js +96 -3
  66. package/dist/src/routes/ai-stream.js.map +1 -1
  67. package/dist/src/routes/session-resolver.js +16 -0
  68. package/dist/src/routes/session-resolver.js.map +1 -1
  69. package/dist/src/session/credential-scrubber.d.ts +35 -0
  70. package/dist/src/session/credential-scrubber.js +150 -0
  71. package/dist/src/session/credential-scrubber.js.map +1 -0
  72. package/dist/src/session/credential-scrubber.test.d.ts +6 -0
  73. package/dist/src/session/credential-scrubber.test.js +192 -0
  74. package/dist/src/session/credential-scrubber.test.js.map +1 -0
  75. package/dist/src/session/manager.intent.test.d.ts +6 -0
  76. package/dist/src/session/manager.intent.test.js +197 -0
  77. package/dist/src/session/manager.intent.test.js.map +1 -0
  78. package/dist/src/session/manager.js +114 -0
  79. package/dist/src/session/manager.js.map +1 -1
  80. package/dist/src/session/session-builder.d.ts +16 -1
  81. package/dist/src/session/session-builder.js +209 -40
  82. package/dist/src/session/session-builder.js.map +1 -1
  83. package/dist/src/session/store.js +48 -2
  84. package/dist/src/session/store.js.map +1 -1
  85. package/dist/src/session/tool-context-factory.js +12 -0
  86. package/dist/src/session/tool-context-factory.js.map +1 -1
  87. package/dist/src/session/types.d.ts +12 -1
  88. package/dist/src/setup/commit-setup.d.ts +94 -0
  89. package/dist/src/setup/commit-setup.js +154 -0
  90. package/dist/src/setup/commit-setup.js.map +1 -0
  91. package/dist/src/setup/commit-setup.test.d.ts +6 -0
  92. package/dist/src/setup/commit-setup.test.js +310 -0
  93. package/dist/src/setup/commit-setup.test.js.map +1 -0
  94. package/dist/src/tools/README.md +270 -0
  95. package/dist/src/tools/admin-tools.d.ts +27 -0
  96. package/dist/src/tools/admin-tools.js +734 -0
  97. package/dist/src/tools/admin-tools.js.map +1 -0
  98. package/dist/src/tools/agent-package-discovery.test.d.ts +6 -0
  99. package/dist/src/tools/agent-package-discovery.test.js +90 -0
  100. package/dist/src/tools/agent-package-discovery.test.js.map +1 -0
  101. package/dist/src/tools/builtin/ask-choice.d.ts +8 -0
  102. package/dist/src/tools/builtin/ask-choice.js +54 -0
  103. package/dist/src/tools/builtin/ask-choice.js.map +1 -0
  104. package/dist/src/tools/context.d.ts +154 -0
  105. package/dist/src/tools/context.js +30 -0
  106. package/dist/src/tools/context.js.map +1 -0
  107. package/dist/src/tools/custom-tool-adapter.d.ts +33 -2
  108. package/dist/src/tools/custom-tool-adapter.js +38 -1
  109. package/dist/src/tools/custom-tool-adapter.js.map +1 -1
  110. package/dist/src/tools/custom-tool-adapter.test.js +48 -0
  111. package/dist/src/tools/custom-tool-adapter.test.js.map +1 -1
  112. package/dist/src/tools/fetch-url-tool.js +2 -0
  113. package/dist/src/tools/fetch-url-tool.js.map +1 -1
  114. package/dist/src/tools/file-tools.js +16 -0
  115. package/dist/src/tools/file-tools.js.map +1 -1
  116. package/dist/src/tools/fs/local.test.d.ts +6 -0
  117. package/dist/src/tools/fs/local.test.js +126 -0
  118. package/dist/src/tools/fs/local.test.js.map +1 -0
  119. package/dist/src/tools/index.d.ts +35 -0
  120. package/dist/src/tools/index.js +11 -0
  121. package/dist/src/tools/index.js.map +1 -0
  122. package/dist/src/tools/mcp-tool-adapter.js +2 -0
  123. package/dist/src/tools/mcp-tool-adapter.js.map +1 -1
  124. package/dist/src/tools/memory-tool.js +23 -1
  125. package/dist/src/tools/memory-tool.js.map +1 -1
  126. package/dist/src/tools/permissions.d.ts +36 -0
  127. package/dist/src/tools/permissions.js +97 -0
  128. package/dist/src/tools/permissions.js.map +1 -0
  129. package/dist/src/tools/permissions.test.d.ts +6 -0
  130. package/dist/src/tools/permissions.test.js +62 -0
  131. package/dist/src/tools/permissions.test.js.map +1 -0
  132. package/dist/src/tools/request-tool.js +2 -0
  133. package/dist/src/tools/request-tool.js.map +1 -1
  134. package/dist/src/tools/sdk-context.d.ts +43 -0
  135. package/dist/src/tools/sdk-context.js +94 -0
  136. package/dist/src/tools/sdk-context.js.map +1 -0
  137. package/dist/src/tools/sdk-context.test.d.ts +6 -0
  138. package/dist/src/tools/sdk-context.test.js +134 -0
  139. package/dist/src/tools/sdk-context.test.js.map +1 -0
  140. package/dist/src/tools/store-tools.js +6 -0
  141. package/dist/src/tools/store-tools.js.map +1 -1
  142. package/dist/src/tools/types.d.ts +53 -14
  143. package/dist/src/tools/web-search-tool.js +2 -0
  144. package/dist/src/tools/web-search-tool.js.map +1 -1
  145. package/dist/src/types.d.ts +164 -28
  146. package/dist/src/types.js +9 -3
  147. package/dist/src/types.js.map +1 -1
  148. package/dist/tsconfig.tsbuildinfo +1 -1
  149. package/package.json +16 -4
  150. package/dist/src/tools/agent-config-tool.d.ts +0 -7
  151. package/dist/src/tools/agent-config-tool.js +0 -78
  152. package/dist/src/tools/agent-config-tool.js.map +0 -1
  153. package/dist/src/tools/collect-secret-tool.d.ts +0 -7
  154. package/dist/src/tools/collect-secret-tool.js +0 -47
  155. package/dist/src/tools/collect-secret-tool.js.map +0 -1
  156. package/dist/src/tools/fs/http.d.ts +0 -37
  157. package/dist/src/tools/fs/http.js +0 -88
  158. package/dist/src/tools/fs/http.js.map +0 -1
  159. package/dist/src/tools/http-file-tools.d.ts +0 -13
  160. package/dist/src/tools/http-file-tools.js +0 -146
  161. package/dist/src/tools/http-file-tools.js.map +0 -1
@@ -0,0 +1,420 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Amodal Labs, Inc.
4
+ * SPDX-License-Identifier: MIT
5
+ */
6
+ /**
7
+ * The bypass executor for matched intents.
8
+ *
9
+ * Drives a handler from start to finish, emitting SSE events as tools
10
+ * fire and assembling the synthetic assistant + tool result messages
11
+ * that get appended to `session.messages` at the end. The shape of
12
+ * those messages mirrors what the agent loop produces for the
13
+ * equivalent LLM-driven turn — same tool-call parts, same tool result
14
+ * messages — so chat rehydration on reload renders the cards
15
+ * identically without any client-side branching.
16
+ *
17
+ * Concurrency model: `runIntent` is an async generator. The handler
18
+ * runs in parallel via a chained promise; each `ctx.callTool(...)`
19
+ * pushes events into a queue, the generator yields them as they
20
+ * arrive, then waits for the handler to settle. This lets the user
21
+ * see tool-call cards stream in one at a time instead of all at the
22
+ * end.
23
+ */
24
+ import { randomUUID } from 'node:crypto';
25
+ import { SSEEventType } from '../types.js';
26
+ import { ToolExecutionError } from '../errors.js';
27
+ // ---------------------------------------------------------------------------
28
+ // Shared queue used by callTool to push events that runIntent yields
29
+ // ---------------------------------------------------------------------------
30
+ /**
31
+ * Single-producer / single-consumer event queue. callTool pushes
32
+ * events as the tool runs; runIntent's outer loop awaits next() and
33
+ * yields each event onto the SSE stream. `finish()` is called when
34
+ * the handler resolves so the consumer can exit the loop.
35
+ *
36
+ * `next()` returns `SSEEvent | null` (null = stream closed) instead
37
+ * of an IteratorResult — this isn't an Iterator itself, just an
38
+ * internal queue, and the simpler signature avoids casting around
39
+ * the IteratorResult value-when-done quirk.
40
+ */
41
+ class IntentEventQueue {
42
+ buffer = [];
43
+ waiters = [];
44
+ done = false;
45
+ push(event) {
46
+ const w = this.waiters.shift();
47
+ if (w) {
48
+ w(event);
49
+ }
50
+ else {
51
+ this.buffer.push(event);
52
+ }
53
+ }
54
+ finish() {
55
+ this.done = true;
56
+ let w = this.waiters.shift();
57
+ while (w !== undefined) {
58
+ w(null);
59
+ w = this.waiters.shift();
60
+ }
61
+ }
62
+ next() {
63
+ const buffered = this.buffer.shift();
64
+ if (buffered !== undefined)
65
+ return Promise.resolve(buffered);
66
+ if (this.done)
67
+ return Promise.resolve(null);
68
+ return new Promise((resolve) => this.waiters.push(resolve));
69
+ }
70
+ }
71
+ // ---------------------------------------------------------------------------
72
+ // Label resolution (mirrors the helper in executing.ts)
73
+ // ---------------------------------------------------------------------------
74
+ /**
75
+ * Resolve `{{paramName}}` placeholders in a label template against the
76
+ * call's params. Same semantics as the executing-state helper —
77
+ * missing/non-string params drop out, adjacent whitespace collapses.
78
+ * Duplicated here rather than imported to keep the executing-state
79
+ * helper internal; if a third caller appears we pull it up to a
80
+ * shared module.
81
+ */
82
+ function resolveLabelTemplate(template, params) {
83
+ const filled = template.replace(/\{\{(\w+)\}\}/g, (_match, key) => {
84
+ const v = params[key];
85
+ return typeof v === 'string' ? v : typeof v === 'number' || typeof v === 'boolean' ? String(v) : '';
86
+ });
87
+ return filled.replace(/\s+/g, ' ').trim();
88
+ }
89
+ /**
90
+ * Mirrors `sanitizeParams` in executing.ts — strips token/secret/etc.
91
+ * fields from tool params before they leave the runtime as SSE
92
+ * events. Synthetic tool calls from intents go through the same wire
93
+ * as agent-loop tool calls; secret keys would leak otherwise.
94
+ */
95
+ function sanitizeParams(params) {
96
+ const sanitized = {};
97
+ for (const [key, value] of Object.entries(params)) {
98
+ if (/token|secret|password|key|auth/i.test(key)) {
99
+ sanitized[key] = '[REDACTED]';
100
+ }
101
+ else {
102
+ sanitized[key] = value;
103
+ }
104
+ }
105
+ return sanitized;
106
+ }
107
+ /**
108
+ * Render a tool's raw output as a JSON-or-text string suitable for
109
+ * the AI SDK's text-typed tool-result content. Mirrors the
110
+ * `buildToolResultMessage` path in executing.ts: strings pass
111
+ * through, everything else gets JSON-stringified. Keeps the
112
+ * synthetic tool result message identical in shape to what the
113
+ * agent loop would have appended.
114
+ */
115
+ function stringifyToolOutput(output) {
116
+ if (typeof output === 'string')
117
+ return output;
118
+ try {
119
+ return JSON.stringify(output);
120
+ }
121
+ catch {
122
+ return String(output);
123
+ }
124
+ }
125
+ /**
126
+ * Drive a matched intent and yield SSE events as the handler runs.
127
+ *
128
+ * Returns (via the generator's return value) one of:
129
+ * - `completed` with the synthetic messages to append to session.messages
130
+ * - `fellThrough` when the handler returned null BEFORE any tool ran
131
+ * (caller falls through to the LLM)
132
+ * - `errored` when the handler threw or a tool throw bubbled
133
+ */
134
+ export async function* runIntent(opts) {
135
+ const startedAt = Date.now();
136
+ const queue = new IntentEventQueue();
137
+ const messageParts = [];
138
+ const toolMessages = [];
139
+ let textContent = '';
140
+ let toolCallsStarted = 0;
141
+ opts.logger.info('intent_matched', {
142
+ intentId: opts.match.intent.id,
143
+ sessionId: opts.sessionId,
144
+ });
145
+ /** Reject reason used internally when an intent should abort BUT not
146
+ * fall through (e.g. a tool gates on confirmation). The runtime
147
+ * catches this and emits an error SSE so the user sees what
148
+ * happened, rather than silently skipping to the LLM after we've
149
+ * potentially emitted other events. */
150
+ class IntentAbortError extends Error {
151
+ constructor(message) {
152
+ super(message);
153
+ this.name = 'IntentAbortError';
154
+ }
155
+ }
156
+ const ctx = {
157
+ match: opts.match.match,
158
+ userMessage: opts.userMessage,
159
+ sessionId: opts.sessionId,
160
+ scopeId: opts.scopeId,
161
+ async callTool(toolName, params) {
162
+ const tool = opts.toolRegistry.get(toolName);
163
+ if (!tool) {
164
+ throw new IntentAbortError(`Intent "${opts.match.intent.id}" tried to call unknown tool "${toolName}".`);
165
+ }
166
+ // Confirmation gate: intents are restricted to the deterministic
167
+ // happy path. Anything that needs user judgment (a tool flagged
168
+ // as `requiresConfirmation` or any connection-tool ACL gate)
169
+ // routes through the agent loop where CONFIRMING handles it.
170
+ if (toolGatesOnConfirmation(tool)) {
171
+ opts.logger.warn('intent_blocked_by_confirmation', {
172
+ intentId: opts.match.intent.id,
173
+ sessionId: opts.sessionId,
174
+ toolName,
175
+ });
176
+ throw new IntentAbortError(`Tool "${toolName}" requires confirmation; intents can't bypass that gate.`);
177
+ }
178
+ // Validate params via the tool's Zod schema (skipped silently
179
+ // for jsonSchema()-defined tools, same as the agent loop).
180
+ if ('safeParse' in tool.parameters) {
181
+ const validation = tool.parameters.safeParse(params);
182
+ if (!validation.success) {
183
+ throw new IntentAbortError(`Intent "${opts.match.intent.id}" emitted invalid params for "${toolName}": ${validation.error.message}`);
184
+ }
185
+ }
186
+ toolCallsStarted++;
187
+ const toolCallId = `intent_${randomUUID()}`;
188
+ const toolContext = opts.buildToolContext(toolCallId);
189
+ const startedAt = Date.now();
190
+ // Sanitized params for the wire — labels resolve from the
191
+ // ORIGINAL params (a redacted token in a label is fine; a label
192
+ // built off `[REDACTED]` looks weird).
193
+ const sanitizedParams = sanitizeParams(params);
194
+ const startEvent = {
195
+ type: SSEEventType.ToolCallStart,
196
+ tool_name: toolName,
197
+ tool_id: toolCallId,
198
+ parameters: sanitizedParams,
199
+ ...(tool.runningLabel
200
+ ? { running_label: resolveLabelTemplate(tool.runningLabel, params) }
201
+ : {}),
202
+ ...(tool.completedLabel
203
+ ? { completed_label: resolveLabelTemplate(tool.completedLabel, params) }
204
+ : {}),
205
+ timestamp: new Date().toISOString(),
206
+ };
207
+ queue.push(startEvent);
208
+ let output;
209
+ try {
210
+ output = await tool.execute(params, toolContext);
211
+ }
212
+ catch (err) {
213
+ const duration_ms = Date.now() - startedAt;
214
+ const message = err instanceof Error ? err.message : String(err);
215
+ // Drain any inline events the tool managed to emit before throwing.
216
+ // ToolInlineEvent is a structural subset of SSEEvent (same SSE
217
+ // discriminated-union members), but they live in different files
218
+ // — go through unknown to satisfy strict variance.
219
+ for (const e of toolContext.inlineEvents ?? []) {
220
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion -- ToolInlineEvent is a structural subset of SSEEvent (same shapes, two declaration sites)
221
+ queue.push(e);
222
+ }
223
+ queue.push({
224
+ type: SSEEventType.ToolCallResult,
225
+ tool_id: toolCallId,
226
+ status: 'error',
227
+ duration_ms,
228
+ error: message,
229
+ timestamp: new Date().toISOString(),
230
+ });
231
+ throw new ToolExecutionError(`Intent "${opts.match.intent.id}" tool "${toolName}" failed: ${message}`, { toolName, callId: toolCallId, cause: err instanceof Error ? err : undefined });
232
+ }
233
+ const duration_ms = Date.now() - startedAt;
234
+ // Drain inline events the tool emitted via ctx.emit (panels,
235
+ // ask_choice, plan_summary, tool_label_update, etc.). Same
236
+ // semantics as the agent loop — these arrive between the tool's
237
+ // start and result so the chat renders them in the right order.
238
+ for (const e of toolContext.inlineEvents ?? []) {
239
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion -- ToolInlineEvent is a structural subset of SSEEvent (same shapes, two declaration sites)
240
+ queue.push(e);
241
+ }
242
+ const resultEvent = buildSuccessResultEvent(toolCallId, output, duration_ms);
243
+ queue.push(resultEvent);
244
+ messageParts.push({
245
+ type: 'tool-call',
246
+ toolCallId,
247
+ toolName,
248
+ input: params,
249
+ });
250
+ // Match the agent loop's `buildToolResultMessage` shape: text-as-string.
251
+ // The AI SDK accepts either {type:'text',value:string} or
252
+ // {type:'json',value:JSON}, but the agent loop always uses text so
253
+ // session.messages stays uniform across intent-driven and LLM-driven
254
+ // turns. Without this, rehydration would render two different shapes
255
+ // depending on which path produced the turn.
256
+ toolMessages.push({
257
+ role: 'tool',
258
+ content: [
259
+ {
260
+ type: 'tool-result',
261
+ toolCallId,
262
+ toolName,
263
+ output: { type: 'text', value: stringifyToolOutput(output) },
264
+ },
265
+ ],
266
+ });
267
+ return output;
268
+ },
269
+ emitText(text) {
270
+ textContent += text;
271
+ queue.push({
272
+ type: SSEEventType.TextDelta,
273
+ content: text,
274
+ timestamp: new Date().toISOString(),
275
+ });
276
+ },
277
+ };
278
+ // Drive the handler in parallel; the `finally` always closes the queue.
279
+ // Wrapped in a state object because TS can't follow assignments to
280
+ // bare `let` variables across the IIFE's closure boundary.
281
+ const handlerState = { error: null, result: undefined };
282
+ const handlerPromise = (async () => {
283
+ try {
284
+ handlerState.result = await opts.match.intent.handle(ctx);
285
+ }
286
+ catch (err) {
287
+ handlerState.error = err instanceof Error ? err : new Error(String(err));
288
+ }
289
+ finally {
290
+ queue.finish();
291
+ }
292
+ })();
293
+ // Yield events as they're produced by callTool / emitText.
294
+ // The loop exits when queue.finish() runs (in the handler's finally).
295
+ let event = await queue.next();
296
+ while (event !== null) {
297
+ yield event;
298
+ event = await queue.next();
299
+ }
300
+ // Make sure the handler promise is fully settled before we read state.
301
+ await handlerPromise;
302
+ // Errors: emit an error SSE for the user and report the outcome to
303
+ // the caller. We don't fall through after errors — the user saw the
304
+ // failure mid-flight and the next user turn can do whatever they
305
+ // want (retry, type something more general → LLM).
306
+ if (handlerState.error !== null) {
307
+ const err = handlerState.error;
308
+ opts.logger.warn('intent_errored', {
309
+ intentId: opts.match.intent.id,
310
+ sessionId: opts.sessionId,
311
+ toolCallsStarted,
312
+ durationMs: Date.now() - startedAt,
313
+ error: err.message,
314
+ });
315
+ yield {
316
+ type: SSEEventType.Error,
317
+ message: err.message,
318
+ timestamp: new Date().toISOString(),
319
+ };
320
+ return { kind: 'errored', error: err };
321
+ }
322
+ // Handler returned null → fall through, but only if no tool calls
323
+ // ran. If callTool was invoked, we've emitted SSE events to the
324
+ // user; falling through to the LLM at this point would double-fire
325
+ // the turn. Treat post-commit nulls as completions and warn.
326
+ if (handlerState.result === null) {
327
+ if (toolCallsStarted === 0) {
328
+ opts.logger.info('intent_fell_through', {
329
+ intentId: opts.match.intent.id,
330
+ sessionId: opts.sessionId,
331
+ durationMs: Date.now() - startedAt,
332
+ });
333
+ return { kind: 'fellThrough' };
334
+ }
335
+ opts.logger.warn('intent_returned_null_after_committing', {
336
+ intentId: opts.match.intent.id,
337
+ sessionId: opts.sessionId,
338
+ toolCallsStarted,
339
+ });
340
+ // Fall through to completion — same as a normal success.
341
+ }
342
+ // Compose the synthetic assistant message. Always emit a Done
343
+ // event so the SSE stream terminates the same way it does for an
344
+ // LLM-driven turn.
345
+ const assistantContent = [
346
+ ...(textContent ? [{ type: 'text', text: textContent }] : []),
347
+ ...messageParts,
348
+ ];
349
+ const assistantMessage = {
350
+ role: 'assistant',
351
+ content: assistantContent.length > 0 ? assistantContent : '',
352
+ };
353
+ // Don't emit Done for completedContinue — the agent loop will emit
354
+ // its own Done after the LLM turn finishes. Emitting two Done
355
+ // events would tear down the SSE stream client-side prematurely.
356
+ const wantsContinue = handlerState.result !== null &&
357
+ handlerState.result !== undefined &&
358
+ 'continue' in handlerState.result &&
359
+ handlerState.result.continue === true;
360
+ if (!wantsContinue) {
361
+ yield { type: SSEEventType.Done, timestamp: new Date().toISOString() };
362
+ }
363
+ opts.logger.info('intent_completed', {
364
+ intentId: opts.match.intent.id,
365
+ sessionId: opts.sessionId,
366
+ toolCount: toolCallsStarted,
367
+ hasText: textContent.length > 0,
368
+ durationMs: Date.now() - startedAt,
369
+ continueToLlm: wantsContinue,
370
+ });
371
+ return {
372
+ kind: wantsContinue ? 'completedContinue' : 'completed',
373
+ assistantMessage,
374
+ toolMessages,
375
+ };
376
+ }
377
+ // ---------------------------------------------------------------------------
378
+ // Helpers
379
+ // ---------------------------------------------------------------------------
380
+ /**
381
+ * True when invoking this tool would normally route through CONFIRMING
382
+ * (tool-level flag or connection ACL gates). Intents can't honor that
383
+ * loop without re-implementing the agent state machine, so we refuse
384
+ * and fall through to the LLM.
385
+ */
386
+ function toolGatesOnConfirmation(tool) {
387
+ if (tool.requiresConfirmation === true)
388
+ return true;
389
+ // Connection tools are ACL-gated; the gate decision lives in the
390
+ // PermissionChecker which we don't run from the intent path.
391
+ // Conservative default: refuse all connection-category tools.
392
+ if (tool.metadata?.category === 'connection')
393
+ return true;
394
+ return false;
395
+ }
396
+ /** Max size for tool result content sent via SSE (mirrors executing.ts). */
397
+ const MAX_SSE_RESULT_SIZE = 50_000;
398
+ function buildSuccessResultEvent(toolCallId, output, duration_ms) {
399
+ const stringified = typeof output === 'string' ? output : safeJsonStringify(output);
400
+ const result = stringified.length > MAX_SSE_RESULT_SIZE
401
+ ? stringified.slice(0, MAX_SSE_RESULT_SIZE) + '\n[... truncated]'
402
+ : stringified;
403
+ return {
404
+ type: SSEEventType.ToolCallResult,
405
+ tool_id: toolCallId,
406
+ status: 'success',
407
+ duration_ms,
408
+ result,
409
+ timestamp: new Date().toISOString(),
410
+ };
411
+ }
412
+ function safeJsonStringify(value) {
413
+ try {
414
+ return JSON.stringify(value);
415
+ }
416
+ catch {
417
+ return String(value);
418
+ }
419
+ }
420
+ //# sourceMappingURL=executor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"executor.js","sourceRoot":"","sources":["../../../src/intent/executor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Amodal Labs, Inc.
4
+ * SPDX-License-Identifier: MIT
5
+ */
6
+ export {};