@sourcegraph/amp 0.0.1748419293-g63ac77 → 0.0.1748427377-geeb377
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.
- package/dist/amp.js +2 -3
- package/dist/amp.js.map +1 -1
- package/dist/{color-Cj45sRkS.js → color-DGLUYaqf.js} +5462 -5641
- package/dist/color-DGLUYaqf.js.map +1 -0
- package/dist/{create_file.node-0vS2hejR.js → create_file.node-BJ9db1t8.js} +2 -2
- package/dist/{create_file.node-0vS2hejR.js.map → create_file.node-BJ9db1t8.js.map} +1 -1
- package/dist/{edit_file.node-it4wJ5TR.js → edit_file.node-BMxxYIGr.js} +9 -9
- package/dist/{edit_file.node-it4wJ5TR.js.map → edit_file.node-BMxxYIGr.js.map} +1 -1
- package/dist/{executable-9B5WLKFI.js → executable-D-KMMXSM.js} +2 -2
- package/dist/{executable-9B5WLKFI.js.map → executable-D-KMMXSM.js.map} +1 -1
- package/dist/{files-B2BG6wGh.js → files-CfkeQImL.js} +2 -2
- package/dist/{files-B2BG6wGh.js.map → files-CfkeQImL.js.map} +1 -1
- package/dist/{glob.node-CSXwSKG2.js → glob.node-B0mTFFtz.js} +60 -60
- package/dist/{glob.node-CSXwSKG2.js.map → glob.node-B0mTFFtz.js.map} +1 -1
- package/dist/{list_directory.node-BFm1qTEf.js → list_directory.node-DHsYGwWf.js} +2 -2
- package/dist/{list_directory.node-BFm1qTEf.js.map → list_directory.node-DHsYGwWf.js.map} +1 -1
- package/dist/{load-profile-Cj-UxFl1.js → load-profile-OVWYid8R.js} +2 -2
- package/dist/load-profile-OVWYid8R.js.map +1 -0
- package/dist/{main-B3QXAnGP.js → main-C0CMTAuI.js} +10650 -10266
- package/dist/main-C0CMTAuI.js.map +1 -0
- package/dist/{node-goKryvqE.js → node-BXVTFEWU.js} +19 -19
- package/dist/{node-goKryvqE.js.map → node-BXVTFEWU.js.map} +1 -1
- package/dist/{node--F98eUbP.js → node-BZRHbCOQ.js} +2 -2
- package/dist/{node--F98eUbP.js.map → node-BZRHbCOQ.js.map} +1 -1
- package/dist/{node-3f9fJ7aL.js → node-C_IajzJJ.js} +2 -2
- package/dist/{node-3f9fJ7aL.js.map → node-C_IajzJJ.js.map} +1 -1
- package/dist/{node-z_wuLuYG.js → node-DOR8bmJd.js} +5 -5
- package/dist/{node-z_wuLuYG.js.map → node-DOR8bmJd.js.map} +1 -1
- package/dist/{node-COM1O9lA.js → node-KD2UfqlA.js} +8 -8
- package/dist/node-KD2UfqlA.js.map +1 -0
- package/dist/{node-CPx25-dA.js → node-fuc2ayQf.js} +3 -3
- package/dist/{node-CPx25-dA.js.map → node-fuc2ayQf.js.map} +1 -1
- package/dist/{read_file.node-BPyNHNAZ.js → read_file.node-Bju6vvoS.js} +2 -2
- package/dist/{read_file.node-BPyNHNAZ.js.map → read_file.node-Bju6vvoS.js.map} +1 -1
- package/dist/{stdio-BHqN64gs.js → stdio-Cz3SGMSm.js} +3 -3
- package/dist/{stdio-BHqN64gs.js.map → stdio-Cz3SGMSm.js.map} +1 -1
- package/dist/storybook.js +4 -4
- package/dist/{undo_edit.node-BdqjDOxO.js → undo_edit.node-DlNuubCp.js} +4 -4
- package/dist/{undo_edit.node-BdqjDOxO.js.map → undo_edit.node-DlNuubCp.js.map} +1 -1
- package/package.json +1 -1
- package/dist/client-BG3r9aH9.js +0 -35
- package/dist/client-BG3r9aH9.js.map +0 -1
- package/dist/color-Cj45sRkS.js.map +0 -1
- package/dist/load-profile-Cj-UxFl1.js.map +0 -1
- package/dist/main-B3QXAnGP.js.map +0 -1
- package/dist/node-COM1O9lA.js.map +0 -1
@@ -1,11 +1,11 @@
|
|
1
1
|
#!/usr/bin/env node
|
2
|
-
import {
|
3
|
-
import { a as x, o as A, s as g, d as
|
2
|
+
import { $ as Y, a6 as I, a1 as k, at as L, a2 as C, aF as D, f as j, a5 as J, b8 as V, E as Z, O as z, Z as M, ak as W, as as q, n as G } from "./color-DGLUYaqf.js";
|
3
|
+
import { a as x, o as A, s as g, d as H, b as K, l as h, r as F, u as Q, e as X, c as _, p as ee, Z as te, g as se, h as N } from "./main-C0CMTAuI.js";
|
4
4
|
const S = A({
|
5
5
|
context: X(["continue", "none"]).optional().default("continue"),
|
6
6
|
tools: Q([h("all"), x(g())]).optional(),
|
7
7
|
prompt: g(),
|
8
|
-
verify: _(
|
8
|
+
verify: F(_()).optional()
|
9
9
|
}), oe = S.extend({
|
10
10
|
type: h("agent"),
|
11
11
|
model: g().optional(),
|
@@ -25,11 +25,11 @@ const S = A({
|
|
25
25
|
}), ie = A({
|
26
26
|
type: h("tool_call"),
|
27
27
|
tool: g(),
|
28
|
-
parameters: _(
|
28
|
+
parameters: F(_()).optional()
|
29
29
|
}), le = A({
|
30
30
|
type: h("bash"),
|
31
31
|
command: g()
|
32
|
-
}), pe =
|
32
|
+
}), pe = H("type", [
|
33
33
|
oe,
|
34
34
|
re,
|
35
35
|
ne,
|
@@ -125,7 +125,7 @@ async function ge(r, e, t, s, o, a) {
|
|
125
125
|
a.throwIfAborted();
|
126
126
|
let b;
|
127
127
|
try {
|
128
|
-
const n =
|
128
|
+
const n = I.fromNativeThread(i);
|
129
129
|
b = await L(
|
130
130
|
n,
|
131
131
|
u,
|
@@ -148,11 +148,11 @@ async function ge(r, e, t, s, o, a) {
|
|
148
148
|
progress: { type: "message", speaker: "assistant", message: E }
|
149
149
|
}), v.type !== "assistant:message")
|
150
150
|
break;
|
151
|
-
const
|
151
|
+
const B = ye(
|
152
152
|
i,
|
153
153
|
v.message
|
154
154
|
);
|
155
|
-
for (const n of
|
155
|
+
for (const n of B) {
|
156
156
|
s.update({
|
157
157
|
status: "in-progress",
|
158
158
|
progress: {
|
@@ -172,13 +172,13 @@ async function ge(r, e, t, s, o, a) {
|
|
172
172
|
a
|
173
173
|
), a.throwIfAborted(), y.status !== "done")
|
174
174
|
throw new Error(JSON.stringify(y));
|
175
|
-
} catch (
|
175
|
+
} catch ($) {
|
176
176
|
m({
|
177
177
|
type: "tool:data",
|
178
178
|
toolUse: n.id,
|
179
179
|
data: {
|
180
180
|
status: "error",
|
181
|
-
error: { message: `Tool call error: ${
|
181
|
+
error: { message: `Tool call error: ${$}` }
|
182
182
|
}
|
183
183
|
}), s.update({
|
184
184
|
status: "in-progress",
|
@@ -186,7 +186,7 @@ async function ge(r, e, t, s, o, a) {
|
|
186
186
|
id: n.id,
|
187
187
|
type: "toolResult",
|
188
188
|
toolName: n.name,
|
189
|
-
result: `Tool call error: ${
|
189
|
+
result: `Tool call error: ${$}`
|
190
190
|
}
|
191
191
|
});
|
192
192
|
continue;
|
@@ -226,7 +226,7 @@ async function fe(r, e, t, s, o) {
|
|
226
226
|
status: "in-progress",
|
227
227
|
progress: { type: "message", speaker: "user", message: a }
|
228
228
|
});
|
229
|
-
const i =
|
229
|
+
const i = I.fromNativeThread(l), m = r.model || k, u = await L(
|
230
230
|
i,
|
231
231
|
[],
|
232
232
|
// No tools for LLM-only step
|
@@ -246,7 +246,7 @@ async function fe(r, e, t, s, o) {
|
|
246
246
|
}), l;
|
247
247
|
}
|
248
248
|
function ye(r, e) {
|
249
|
-
const t =
|
249
|
+
const t = Z(r);
|
250
250
|
return e.content.filter((s) => s.type === "tool_use").filter((s) => !s.inputPartialJSON).filter(
|
251
251
|
(s) => (
|
252
252
|
// Only include tools that haven't been invoked yet.
|
@@ -259,7 +259,7 @@ async function R(r, e, t, s, o = new AbortController().signal, a) {
|
|
259
259
|
let i = !1;
|
260
260
|
const m = r.invokeTool(e, { args: t, userInput: a }, s).subscribe({
|
261
261
|
next: (u) => {
|
262
|
-
|
262
|
+
Y(u) && (m.unsubscribe(), i || (i = !0, l(u)));
|
263
263
|
},
|
264
264
|
error: (u) => {
|
265
265
|
i || (i = !0, c(u));
|
@@ -272,7 +272,7 @@ async function R(r, e, t, s, o = new AbortController().signal, a) {
|
|
272
272
|
});
|
273
273
|
});
|
274
274
|
}
|
275
|
-
const Te = ({ args: r }, e) => new
|
275
|
+
const Te = ({ args: r }, e) => new z((t) => {
|
276
276
|
const s = new AbortController(), o = new me(t, s.signal);
|
277
277
|
return he(r, e, o, s.signal).catch((a) => {
|
278
278
|
M(a) ? (o.update({
|
@@ -291,7 +291,7 @@ async function he(r, e, t, s) {
|
|
291
291
|
progress: { type: "meta", message: `Loading routine: ${o} from ${l}` }
|
292
292
|
});
|
293
293
|
const c = D();
|
294
|
-
c.registerTool(
|
294
|
+
c.registerTool(W);
|
295
295
|
const i = await R(
|
296
296
|
c,
|
297
297
|
"read_file",
|
@@ -311,7 +311,7 @@ async function he(r, e, t, s) {
|
|
311
311
|
if (!f)
|
312
312
|
throw new Error(`Routine with id "${o}" not found in ${l}`);
|
313
313
|
let d = {
|
314
|
-
id:
|
314
|
+
id: q(),
|
315
315
|
created: Date.now(),
|
316
316
|
v: 0,
|
317
317
|
messages: []
|
@@ -357,7 +357,7 @@ async function he(r, e, t, s) {
|
|
357
357
|
type: "meta",
|
358
358
|
message: "Operation cancelled"
|
359
359
|
}
|
360
|
-
}), t.complete()) : (
|
360
|
+
}), t.complete()) : (G.error("Error in run_routine", {
|
361
361
|
error: o,
|
362
362
|
stack: o instanceof Error ? o.stack : ""
|
363
363
|
}), t.error(o));
|
@@ -366,4 +366,4 @@ async function he(r, e, t, s) {
|
|
366
366
|
export {
|
367
367
|
Te as runRoutine
|
368
368
|
};
|
369
|
-
//# sourceMappingURL=node-
|
369
|
+
//# sourceMappingURL=node-BXVTFEWU.js.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"node-goKryvqE.js","sources":["../../core/src/tools/builtin/run_routine/types.ts","../../core/src/tools/builtin/run_routine/serialization.ts","../../core/src/tools/builtin/run_routine/util.ts","../../core/src/tools/builtin/run_routine/step.ts","../../core/src/tools/builtin/run_routine/node.ts"],"sourcesContent":["import { z } from 'zod'\n\n// Base Step interface\nconst BaseStep = z.object({\n\tcontext: z.enum(['continue', 'none']).optional().default('continue'),\n\ttools: z.union([z.literal('all'), z.array(z.string())]).optional(),\n\tprompt: z.string(),\n\tverify: z.record(z.any()).optional(),\n}) satisfies z.ZodType<{\n\tcontext?: 'continue' | 'none'\n\ttools?: 'all' | string[]\n\tprompt: string\n\tverify?: Record<string, any>\n}>\n\n// Agent Step\nconst AgentStep = BaseStep.extend({\n\ttype: z.literal('agent'),\n\tmodel: z.string().optional(), // Default could be set in implementation\n\tinteractive_confirmation: z.boolean().optional(),\n})\n\n// LLM Step\nconst LLMStep = BaseStep.extend({\n\ttype: z.literal('llm'),\n\tmodel: z.string().optional(),\n})\n\n// Loop Agent Step\nconst LoopAgentStep = BaseStep.extend({\n\ttype: z.literal('loop_agent'),\n\tmodel: z.string().optional(),\n\tinput_file: z.string(),\n})\n\n// Loop LLM Step\nconst LoopLLMStep = BaseStep.extend({\n\ttype: z.literal('loop_llm'),\n\tmodel: z.string().optional(),\n\tinput_file: z.string(),\n})\n\n// Tool Call Step\nconst ToolCallStep = z.object({\n\ttype: z.literal('tool_call'),\n\ttool: z.string(),\n\tparameters: z.record(z.any()).optional(),\n})\n\n// Bash Step\nconst BashStep = z.object({\n\ttype: z.literal('bash'),\n\tcommand: z.string(),\n})\n\n// Union of all step types\nconst Step = z.discriminatedUnion('type', [\n\tAgentStep,\n\tLLMStep,\n\tLoopAgentStep,\n\tLoopLLMStep,\n\tToolCallStep,\n\tBashStep,\n])\n\n// Routine Block\nconst RoutineBlock = z.object({\n\tid: z.string(),\n\tsteps: z.array(Step),\n})\n\n// Routine (array of RoutineBlocks)\nconst Routine = z.array(RoutineBlock)\n\nconst Routines = z.array(Routine)\n\nexport type RoutineSchema = z.infer<typeof Routine>\nexport type RoutinesSchema = z.infer<typeof Routines>\nexport type RoutineBlockSchema = z.infer<typeof RoutineBlock>\nexport type StepSchema = z.infer<typeof Step>\nexport type AgentStepSchema = z.infer<typeof AgentStep>\nexport type LLMStepSchema = z.infer<typeof LLMStep>\nexport type LoopAgentStepSchema = z.infer<typeof LoopAgentStep>\nexport type LoopLLMStepSchema = z.infer<typeof LoopLLMStep>\nexport type ToolCallStepSchema = z.infer<typeof ToolCallStep>\nexport type BashStepSchema = z.infer<typeof BashStep>\n\nexport { Routine, RoutineBlock, Routines, Step }\n","import { parse } from 'yaml'\nimport { z } from 'zod'\nimport type { RoutineSchema } from './types'\nimport { Routine } from './types'\n\n/**\n * Deserialize a YAML string into a Routine\n * @param yamlString The YAML string representation of a Routine\n * @returns The parsed and validated Routine\n * @throws Error if the YAML is invalid or doesn't match the Routine schema\n */\nexport function deserializeRoutineFromYAML(yamlString: string): RoutineSchema {\n\ttry {\n\t\t// Parse the YAML string to a JavaScript object\n\t\tconst parsedYaml = parse(yamlString)\n\n\t\t// Validate and transform the parsed YAML against the Routine schema\n\t\tconst validatedRoutine = Routine.parse(parsedYaml)\n\n\t\treturn validatedRoutine\n\t} catch (error) {\n\t\tif (error instanceof z.ZodError) {\n\t\t\t// Enhance Zod validation errors with better context\n\t\t\tthrow new Error(\n\t\t\t\t`Invalid routine format: ${error.errors\n\t\t\t\t\t.map((err) => `${err.path.join('.')} - ${err.message}`)\n\t\t\t\t\t.join(', ')}`,\n\t\t\t)\n\t\t} else if (error instanceof Error) {\n\t\t\t// Handle YAML parsing errors\n\t\t\tthrow new Error(`Failed to parse YAML: ${error.message}`)\n\t\t} else {\n\t\t\tthrow new Error(`Unknown error during routine deserialization: ${String(error)}`)\n\t\t}\n\t}\n}\n","import type { SubscriptionObserver } from '@sourcegraph/observable'\nimport type { ToolRun } from '../../tool-service'\nimport type { RunRoutineProgressMessage, RunRoutineToolDef } from './common'\n\n/**\n * Class that maintains state for status messages in run_routine implementation.\n * Keeps track of all status messages and reports them through the observer.\n */\nexport class ProgressReporter {\n\tprivate progressMessages: RunRoutineProgressMessage[] = []\n\n\tconstructor(\n\t\tprivate observer: SubscriptionObserver<ToolRun<RunRoutineToolDef>>,\n\t\tprivate signal: AbortSignal,\n\t) {}\n\n\t/**\n\t * Adds the latest message to the list of all status updates and then invokes the observer\n\t * with the updated 'in-progress' status.\n\t */\n\tupdate(update: ToolRun<RunRoutineToolDef>): void {\n\t\tthis.signal.throwIfAborted()\n\t\tif ('progress' in update && update.progress) {\n\t\t\tif (Array.isArray(update.progress)) {\n\t\t\t\tthis.progressMessages.push(...update.progress)\n\t\t\t} else {\n\t\t\t\tthis.progressMessages.push(update.progress)\n\t\t\t}\n\t\t\tthis.observer.next({\n\t\t\t\t...update,\n\t\t\t\tprogress: this.progressMessages,\n\t\t\t})\n\t\t} else {\n\t\t\tthis.observer.next(update)\n\t\t}\n\t}\n\n\terror(error: unknown): void {\n\t\tthis.observer.error(error)\n\t}\n\n\tcomplete(): void {\n\t\tthis.observer.complete()\n\t}\n}\n\n/**\n * Apply variable substitutions to a prompt string\n */\nexport function substitutePromptVars(prompt: string, vars: { userInput?: string }): string {\n\tlet result = prompt\n\n\t// Replace {{userInput}} with the actual user input if provided\n\tif (vars.userInput) {\n\t\tresult = result.replace(/\\{\\{\\s*userInput\\s*\\}\\}/g, vars.userInput)\n\t\tresult = result.replace(/\\{\\{\\s*user_input\\s*\\}\\}/g, vars.userInput)\n\t}\n\n\treturn result\n}\n","import { firstValueFrom } from '@sourcegraph/observable'\nimport {\n\tACTIVE_MODEL,\n\tAnthropicConverters,\n\tfromAnthropicResultToThreadDelta,\n\trunAnthropicSync,\n} from '../../../inference/backends/anthropic'\nimport { buildSystemPrompt, DefaultSystemPromptService } from '../../../threads/system-prompt'\nimport type { ToolUseBlock } from '../../../threads/thread'\nimport {\n\ttoolResultBlocks,\n\ttype Thread,\n\ttype ThreadAssistantMessage,\n\ttype ToolRunUserInput,\n} from '../../../threads/thread'\nimport type { ThreadDelta } from '../../../threads/thread-delta'\nimport { applyThreadDelta } from '../../../threads/thread-delta'\nimport type {\n\tToolDefinition,\n\tToolRun,\n\tToolRunEnvironment,\n\tToolService,\n} from '../../../tools/tool-service'\nimport { createToolService, isToolRunTerminalState } from '../../../tools/tool-service'\nimport { registerBuiltinToolsToToolService } from '../../tools'\nimport type { AgentStepSchema, LLMStepSchema, StepSchema } from './types'\nimport { substitutePromptVars, type ProgressReporter } from './util'\n\n/**\n * Run a step with the given conversation\n */\nexport function runStep(\n\tstep: StepSchema,\n\tconversation: Thread,\n\tenv: ToolRunEnvironment,\n\tprogressReporter: ProgressReporter,\n\tvars: { userInput?: string },\n\tsignal: AbortSignal = new AbortController().signal,\n): Promise<Thread> {\n\tswitch (step.type) {\n\t\tcase 'agent':\n\t\t\treturn runStepAgent(step, conversation, env, progressReporter, vars, signal)\n\t\t\tbreak\n\t\tcase 'llm':\n\t\t\treturn runStepLLM(step, conversation, progressReporter, vars, signal)\n\t\t\tbreak\n\t\tdefault:\n\t\t\tthrow new Error(`Unknown step type: ${(step as any).type}`)\n\t}\n}\n\n/**\n * Run an agent step that implements a full agentic loop\n * Follows the pattern: inference -> tool calls -> tool results -> inference\n * until there are no more tool calls or the process is complete\n */\nasync function runStepAgent(\n\tstep: AgentStepSchema,\n\torigConversation: Thread,\n\tenv: ToolRunEnvironment,\n\tprogressReporter: ProgressReporter,\n\tvars: { userInput?: string },\n\tsignal: AbortSignal,\n): Promise<Thread> {\n\tconst toolService = createToolService()\n\tawait registerBuiltinToolsToToolService(toolService)\n\n\t// Process prompt template with variables if provided\n\tconst promptText = substitutePromptVars(step.prompt, vars)\n\n\t// Clone convo\n\tlet conversation = origConversation\n\tconst recordThreadDelta = (delta: ThreadDelta) => {\n\t\tconversation = applyThreadDelta(conversation, delta)\n\t}\n\n\trecordThreadDelta({\n\t\ttype: 'user:message',\n\t\tmessage: {\n\t\t\tcontent: [{ type: 'text', text: promptText }],\n\t\t\tmeta: {\n\t\t\t\tsentAt: Date.now(),\n\t\t\t},\n\t\t},\n\t})\n\n\t// Update progress with user message added\n\tprogressReporter.update({\n\t\tstatus: 'in-progress',\n\t\tprogress: { type: 'message', speaker: 'user', message: promptText },\n\t})\n\n\t// Get enabled tools from toolService (all tools for now)\n\tconst enabledToolSpecs = (await firstValueFrom(toolService.tools, signal)).map((t) => t.spec)\n\n\t// Set up parameters for the initial API call\n\tconst model = ACTIVE_MODEL\n\n\t// The agent loop will continue until there are no more tool calls needed\n\tlet loopCount = 0\n\tconst maxLoops = 100 // Prevent infinite loops\n\n\twhile (loopCount < maxLoops) {\n\t\tsignal.throwIfAborted()\n\t\tloopCount++\n\n\t\t// Get system prompt blocks from the main system prompt builder\n\t\tconst systemPromptService = new DefaultSystemPromptService()\n\t\t// Get the main system prompt blocks\n\t\tconst systemPromptBlocks = await buildSystemPrompt(\n\t\t\tsystemPromptService,\n\t\t\tenv.threadEnvironment,\n\t\t\tfalse,\n\t\t)\n\n\t\t// Add the subagent-specific instruction as the final block\n\t\tsystemPromptBlocks.push({\n\t\t\ttype: 'text' as const,\n\t\t\ttext: 'You are a helpful AI assistant running as a subagent within a larger system. Your task is to handle this specific step in a routine. You can use tools to complete your task. When you are completely done, do not ask to use more tools.',\n\t\t})\n\n\t\t// Use the combined system prompt\n\t\tconst systemPrompt = systemPromptBlocks\n\n\t\tsignal.throwIfAborted()\n\n\t\t// Use runAnthropicSync to get a response\n\t\tlet result\n\t\ttry {\n\t\t\tconst anthropicMessages = AnthropicConverters.fromNativeThread(conversation)\n\t\t\tresult = await runAnthropicSync(\n\t\t\t\tanthropicMessages,\n\t\t\t\tenabledToolSpecs,\n\t\t\t\tsystemPrompt,\n\t\t\t\tmodel,\n\t\t\t\tsignal,\n\t\t\t)\n\t\t} catch (error) {\n\t\t\tthrow new Error(`Anthropic API error: ${error}`)\n\t\t}\n\n\t\tif (!result.message || !('content' in result.message)) {\n\t\t\tthrow new Error('Unexpected response format from Anthropic')\n\t\t}\n\t\tif (result.message.content.length === 0) {\n\t\t\tbreak\n\t\t}\n\n\t\tconst assistantResponseDelta = fromAnthropicResultToThreadDelta(result.message)\n\t\trecordThreadDelta(assistantResponseDelta)\n\n\t\t// Extract text for progress reporting\n\t\tconst assistantText = result.message.content\n\t\t\t.filter((item) => item.type === 'text')\n\t\t\t.map((item) => ('text' in item ? item.text : ''))\n\t\t\t.join(' ')\n\t\t\t.trim()\n\t\tif (assistantText) {\n\t\t\t// Show assistant message\n\t\t\tprogressReporter.update({\n\t\t\t\tstatus: 'in-progress',\n\t\t\t\tprogress: { type: 'message', speaker: 'assistant', message: assistantText },\n\t\t\t})\n\t\t}\n\n\t\tif (assistantResponseDelta.type !== 'assistant:message') {\n\t\t\t// No tool calls\n\t\t\tbreak\n\t\t}\n\n\t\tconst toolCalls = findToolUsesNeedingInvocation(\n\t\t\tconversation,\n\t\t\tassistantResponseDelta.message,\n\t\t)\n\t\tfor (const toolCall of toolCalls) {\n\t\t\tprogressReporter.update({\n\t\t\t\tstatus: 'in-progress',\n\t\t\t\tprogress: {\n\t\t\t\t\tid: toolCall.id,\n\t\t\t\t\ttype: 'toolCall',\n\t\t\t\t\ttoolName: toolCall.name,\n\t\t\t\t\targs: JSON.stringify(toolCall.input),\n\t\t\t\t},\n\t\t\t})\n\n\t\t\tlet toolResult\n\t\t\ttry {\n\t\t\t\ttoolResult = await invokeToolAndWaitForResult(\n\t\t\t\t\ttoolService,\n\t\t\t\t\ttoolCall.name,\n\t\t\t\t\ttoolCall.input,\n\t\t\t\t\tenv,\n\t\t\t\t\tsignal,\n\t\t\t\t)\n\t\t\t\tsignal.throwIfAborted()\n\t\t\t\tif (toolResult.status !== 'done') {\n\t\t\t\t\tthrow new Error(JSON.stringify(toolResult))\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\trecordThreadDelta({\n\t\t\t\t\ttype: 'tool:data',\n\t\t\t\t\ttoolUse: toolCall.id,\n\t\t\t\t\tdata: {\n\t\t\t\t\t\tstatus: 'error',\n\t\t\t\t\t\terror: { message: `Tool call error: ${error}` },\n\t\t\t\t\t},\n\t\t\t\t})\n\t\t\t\tprogressReporter.update({\n\t\t\t\t\tstatus: 'in-progress',\n\t\t\t\t\tprogress: {\n\t\t\t\t\t\tid: toolCall.id,\n\t\t\t\t\t\ttype: 'toolResult',\n\t\t\t\t\t\ttoolName: toolCall.name,\n\t\t\t\t\t\tresult: `Tool call error: ${error}`,\n\t\t\t\t\t},\n\t\t\t\t})\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\trecordThreadDelta({\n\t\t\t\ttype: 'tool:data',\n\t\t\t\ttoolUse: toolCall.id,\n\t\t\t\tdata: toolResult,\n\t\t\t})\n\t\t\tprogressReporter.update({\n\t\t\t\tstatus: 'in-progress',\n\t\t\t\tprogress: {\n\t\t\t\t\tid: toolCall.id,\n\t\t\t\t\ttype: 'toolResult',\n\t\t\t\t\ttoolName: toolCall.name,\n\t\t\t\t\tresult:\n\t\t\t\t\t\ttypeof toolResult.result === 'string'\n\t\t\t\t\t\t\t? toolResult.result\n\t\t\t\t\t\t\t: JSON.stringify(toolResult.result),\n\t\t\t\t},\n\t\t\t})\n\t\t}\n\t}\n\treturn conversation\n}\n\n/**\n * Mock implementation of tool execution for the subagent\n * In a real implementation, this would connect to the actual tool execution system\n */\n// Removed mock implementation in favor of actual toolService\n\n/**\n * Run an LLM step\n */\nasync function runStepLLM(\n\tstep: LLMStepSchema,\n\torigConversation: Thread,\n\tprogressReporter: ProgressReporter,\n\tvars: { userInput?: string },\n\tsignal: AbortSignal,\n): Promise<Thread> {\n\t// Process prompt template with variables if provided\n\tconst promptText = substitutePromptVars(step.prompt, vars)\n\n\t// Create a copy of the conversation to avoid mutating the original\n\tlet conversation = origConversation\n\tconst recordThreadDelta = (delta: ThreadDelta) => {\n\t\tconversation = applyThreadDelta(conversation, delta)\n\t}\n\n\trecordThreadDelta({\n\t\ttype: 'user:message',\n\t\tmessage: {\n\t\t\tcontent: [{ type: 'text', text: promptText }],\n\t\t\tmeta: {\n\t\t\t\tsentAt: Date.now(),\n\t\t\t},\n\t\t},\n\t})\n\n\t// Update progress with user message added\n\tprogressReporter.update({\n\t\tstatus: 'in-progress',\n\t\tprogress: { type: 'message', speaker: 'user', message: promptText },\n\t})\n\n\t// Use runAnthropicSync to get a response\n\tconst anthropicMessages = AnthropicConverters.fromNativeThread(conversation)\n\tconst model = step.model || ACTIVE_MODEL\n\tconst result = await runAnthropicSync(\n\t\tanthropicMessages,\n\t\t[], // No tools for LLM-only step\n\t\t[], // No system prompt\n\t\tmodel,\n\t\tsignal,\n\t)\n\n\tif (!result.message) {\n\t\tthrow new Error('Failed to get response from Anthropic')\n\t}\n\n\tconst assistantResponseDelta = fromAnthropicResultToThreadDelta(result.message)\n\trecordThreadDelta(assistantResponseDelta)\n\n\t// Display message\n\tconst assistantText = result.message.content\n\t\t.filter((item) => item.type === 'text')\n\t\t.map((item) => (item.type === 'text' ? item.text : ''))\n\t\t.join(' ')\n\t\t.trim()\n\tprogressReporter.update({\n\t\tstatus: 'in-progress',\n\t\tprogress: { type: 'message', speaker: 'assistant', message: assistantText },\n\t})\n\treturn conversation\n}\n\nfunction findToolUsesNeedingInvocation(\n\tthread: Thread,\n\tmessage: ThreadAssistantMessage,\n): ToolUseBlock[] {\n\tconst toolResults = toolResultBlocks(thread)\n\treturn message.content\n\t\t.filter((block): block is ToolUseBlock => block.type === 'tool_use')\n\t\t.filter((block) => !block.inputPartialJSON)\n\t\t.filter(\n\t\t\t(block) =>\n\t\t\t\t// Only include tools that haven't been invoked yet.\n\t\t\t\t!toolResults.has(block.id),\n\t\t)\n}\n\n/**\n * Helper function that invokes a tool and returns a Promise with the final result\n */\nexport async function invokeToolAndWaitForResult<T extends ToolDefinition>(\n\ttoolService: ToolService,\n\ttoolName: string,\n\tinput: unknown,\n\tenv: ToolRunEnvironment,\n\tsignal: AbortSignal = new AbortController().signal,\n\tuserInput?: ToolRunUserInput,\n): Promise<ToolRun<T>> {\n\treturn new Promise((resolve, reject) => {\n\t\tlet settled = false\n\t\tconst sub = toolService\n\t\t\t.invokeTool(toolName, { args: input as any, userInput }, env)\n\t\t\t.subscribe({\n\t\t\t\tnext: (run: ToolRun) => {\n\t\t\t\t\tif (isToolRunTerminalState(run)) {\n\t\t\t\t\t\tsub.unsubscribe()\n\t\t\t\t\t\tif (!settled) {\n\t\t\t\t\t\t\tsettled = true\n\t\t\t\t\t\t\tresolve(run)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\terror: (error) => {\n\t\t\t\t\tif (!settled) {\n\t\t\t\t\t\tsettled = true\n\t\t\t\t\t\treject(error)\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tcomplete: () => {},\n\t\t\t})\n\n\t\t// Handle abort signal\n\t\tsignal.addEventListener('abort', () => {\n\t\t\tsub.unsubscribe()\n\t\t\tif (!settled) {\n\t\t\t\tsettled = true\n\t\t\t\treject(new Error('Tool execution was aborted'))\n\t\t\t}\n\t\t})\n\t})\n}\n","import { Observable } from '@sourcegraph/observable'\nimport { isAbortError } from '../../../common/abort'\nimport logger from '../../../common/logger'\nimport type { Thread } from '../../../threads/thread'\nimport { newThreadID } from '../../../threads/thread'\nimport type { ToolRunEnvironment } from '../../tool-service'\nimport { createToolService } from '../../tool-service'\nimport type { ReadFileToolDef } from '../filesystem/read_file.common'\nimport { readFileToolReg } from '../filesystem/read_file.common'\nimport type { runRoutineToolReg } from './common'\nimport { deserializeRoutineFromYAML } from './serialization'\nimport { invokeToolAndWaitForResult, runStep } from './step'\nimport { ProgressReporter } from './util'\n\nexport const runRoutine: NonNullable<(typeof runRoutineToolReg)['fn']> = ({ args }, env) => {\n\treturn new Observable((observer) => {\n\t\tconst abortController = new AbortController()\n\t\tconst progressReporter = new ProgressReporter(observer, abortController.signal)\n\n\t\trunRoutineImpl(args, env, progressReporter, abortController.signal).catch((error) => {\n\t\t\t// Don't report AbortError as an error - it's expected when cancelling\n\t\t\tif (!isAbortError(error)) {\n\t\t\t\tprogressReporter.error(error)\n\t\t\t} else {\n\t\t\t\tprogressReporter.update({\n\t\t\t\t\tstatus: 'cancelled' as const,\n\t\t\t\t\tprogress: { type: 'meta', message: 'Operation cancelled' },\n\t\t\t\t})\n\t\t\t\tprogressReporter.complete()\n\t\t\t}\n\t\t})\n\n\t\treturn () => {\n\t\t\tabortController.abort()\n\t\t}\n\t})\n}\n\nasync function runRoutineImpl(\n\targs: { id: string; file?: string; userInput?: string },\n\tenv: ToolRunEnvironment,\n\tprogressReporter: ProgressReporter,\n\tsignal: AbortSignal,\n) {\n\ttry {\n\t\tconst { id, file } = args\n\t\tconst routineFile = file || 'routines.amp.yaml'\n\n\t\t// Report initial progress\n\t\tprogressReporter.update({\n\t\t\tstatus: 'in-progress',\n\t\t\tprogress: { type: 'meta', message: `Loading routine: ${id} from ${routineFile}` },\n\t\t})\n\n\t\t// Create a tool service and register the read_file tool\n\t\tconst toolService = createToolService()\n\t\ttoolService.registerTool(readFileToolReg)\n\n\t\t// Read the routine file using the tool service\n\t\tconst readFileResult = await invokeToolAndWaitForResult<ReadFileToolDef>(\n\t\t\ttoolService,\n\t\t\t'read_file',\n\t\t\t{ path: routineFile },\n\t\t\tenv,\n\t\t\tsignal,\n\t\t)\n\n\t\t// Process the file content by removing line numbers that read_file adds\n\t\tif (readFileResult.status !== 'done') {\n\t\t\tthrow new Error(`Failed to read routine file: ${routineFile}`)\n\t\t}\n\t\t// At this point TypeScript knows readFileResult has a 'result' property\n\t\tconst fileContents =\n\t\t\ttypeof readFileResult.result === 'string'\n\t\t\t\t? readFileResult.result\n\t\t\t\t: readFileResult.result.content\n\t\tconst routineContent = String(fileContents)\n\t\t\t.split('\\n')\n\t\t\t.map((line: string) => line.replace(/^\\d+:\\s/, ''))\n\t\t\t.join('\\n')\n\n\t\tsignal.throwIfAborted()\n\n\t\t// Parse the routines\n\t\tconst routines = deserializeRoutineFromYAML(routineContent)\n\t\tsignal.throwIfAborted()\n\n\t\t// Find the requested routine\n\t\tconst routine = routines.find((routine) => routine.id === id)\n\t\tif (!routine) {\n\t\t\tthrow new Error(`Routine with id \"${id}\" not found in ${routineFile}`)\n\t\t}\n\n\t\t// Initialize a Thread for the conversation\n\t\tlet conversation: Thread = {\n\t\t\tid: newThreadID(),\n\t\t\tcreated: Date.now(),\n\t\t\tv: 0,\n\t\t\tmessages: [],\n\t\t}\n\n\t\t// Report progress before executing steps\n\t\tprogressReporter.update({\n\t\t\tstatus: 'in-progress',\n\t\t\tprogress: [\n\t\t\t\t{\n\t\t\t\t\ttype: 'meta',\n\t\t\t\t\tmessage: `Executing routine ${id}`,\n\t\t\t\t},\n\t\t\t],\n\t\t})\n\n\t\t// Execute each step in the routine\n\t\tfor (let i = 0; i < routine.steps.length; i++) {\n\t\t\tconst step = routine.steps[i]\n\t\t\tif (!step) continue // Skip undefined steps\n\n\t\t\tprogressReporter.update({\n\t\t\t\tstatus: 'in-progress',\n\t\t\t\tprogress: [\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: 'meta',\n\t\t\t\t\t\tmessage: `Executing step ${i + 1}/${routine.steps.length}: ${step.type}`,\n\t\t\t\t\t\tvariant: 'header',\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t})\n\n\t\t\tsignal.throwIfAborted()\n\n\t\t\t// Execute the step and update the conversation\n\t\t\tconversation = await runStep(step, conversation, env, progressReporter, {\n\t\t\t\tuserInput: args.userInput,\n\t\t\t})\n\t\t}\n\n\t\tprogressReporter.update({\n\t\t\tstatus: 'done' as const,\n\t\t\tprogress: {\n\t\t\t\ttype: 'meta',\n\t\t\t\tmessage: `Finished executing all ${routine.steps.length} steps of routine: ${id}.`,\n\t\t\t\tvariant: 'header',\n\t\t\t},\n\t\t\tresult: '', // No output for now\n\t\t})\n\n\t\tprogressReporter.complete()\n\t} catch (error) {\n\t\tif (isAbortError(error)) {\n\t\t\tprogressReporter.update({\n\t\t\t\tstatus: 'cancelled' as const,\n\t\t\t\tprogress: {\n\t\t\t\t\ttype: 'meta',\n\t\t\t\t\tmessage: 'Operation cancelled',\n\t\t\t\t},\n\t\t\t})\n\t\t\tprogressReporter.complete()\n\t\t} else {\n\t\t\tlogger.error('Error in run_routine', {\n\t\t\t\terror,\n\t\t\t\tstack: error instanceof Error ? error.stack : '',\n\t\t\t})\n\t\t\tprogressReporter.error(error)\n\t\t}\n\t}\n}\n"],"names":["BaseStep","z.object","z.enum","z.union","z.literal","z.array","z.string","z.record","z.any","AgentStep","z.boolean","LLMStep","LoopAgentStep","LoopLLMStep","ToolCallStep","BashStep","Step","z.discriminatedUnion","RoutineBlock","Routine","deserializeRoutineFromYAML","yamlString","parsedYaml","parse","error","z.ZodError","err","ProgressReporter","observer","signal","update","substitutePromptVars","prompt","vars","result","runStep","step","conversation","env","progressReporter","runStepAgent","runStepLLM","origConversation","toolService","createToolService","registerBuiltinToolsToToolService","promptText","recordThreadDelta","delta","applyThreadDelta","enabledToolSpecs","firstValueFrom","t","model","ACTIVE_MODEL","loopCount","maxLoops","systemPromptService","DefaultSystemPromptService","systemPromptBlocks","buildSystemPrompt","systemPrompt","anthropicMessages","AnthropicConverters","runAnthropicSync","assistantResponseDelta","fromAnthropicResultToThreadDelta","assistantText","item","toolCalls","findToolUsesNeedingInvocation","toolCall","toolResult","invokeToolAndWaitForResult","thread","message","toolResults","toolResultBlocks","block","toolName","input","userInput","resolve","reject","settled","sub","run","isToolRunTerminalState","runRoutine","args","Observable","abortController","runRoutineImpl","isAbortError","id","file","routineFile","readFileToolReg","readFileResult","fileContents","routineContent","line","routines","routine","newThreadID","i","logger"],"mappings":"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"}
|
1
|
+
{"version":3,"file":"node-BXVTFEWU.js","sources":["../../core/src/tools/builtin/run_routine/types.ts","../../core/src/tools/builtin/run_routine/serialization.ts","../../core/src/tools/builtin/run_routine/util.ts","../../core/src/tools/builtin/run_routine/step.ts","../../core/src/tools/builtin/run_routine/node.ts"],"sourcesContent":["import { z } from 'zod'\n\n// Base Step interface\nconst BaseStep = z.object({\n\tcontext: z.enum(['continue', 'none']).optional().default('continue'),\n\ttools: z.union([z.literal('all'), z.array(z.string())]).optional(),\n\tprompt: z.string(),\n\tverify: z.record(z.any()).optional(),\n}) satisfies z.ZodType<{\n\tcontext?: 'continue' | 'none'\n\ttools?: 'all' | string[]\n\tprompt: string\n\tverify?: Record<string, any>\n}>\n\n// Agent Step\nconst AgentStep = BaseStep.extend({\n\ttype: z.literal('agent'),\n\tmodel: z.string().optional(), // Default could be set in implementation\n\tinteractive_confirmation: z.boolean().optional(),\n})\n\n// LLM Step\nconst LLMStep = BaseStep.extend({\n\ttype: z.literal('llm'),\n\tmodel: z.string().optional(),\n})\n\n// Loop Agent Step\nconst LoopAgentStep = BaseStep.extend({\n\ttype: z.literal('loop_agent'),\n\tmodel: z.string().optional(),\n\tinput_file: z.string(),\n})\n\n// Loop LLM Step\nconst LoopLLMStep = BaseStep.extend({\n\ttype: z.literal('loop_llm'),\n\tmodel: z.string().optional(),\n\tinput_file: z.string(),\n})\n\n// Tool Call Step\nconst ToolCallStep = z.object({\n\ttype: z.literal('tool_call'),\n\ttool: z.string(),\n\tparameters: z.record(z.any()).optional(),\n})\n\n// Bash Step\nconst BashStep = z.object({\n\ttype: z.literal('bash'),\n\tcommand: z.string(),\n})\n\n// Union of all step types\nconst Step = z.discriminatedUnion('type', [\n\tAgentStep,\n\tLLMStep,\n\tLoopAgentStep,\n\tLoopLLMStep,\n\tToolCallStep,\n\tBashStep,\n])\n\n// Routine Block\nconst RoutineBlock = z.object({\n\tid: z.string(),\n\tsteps: z.array(Step),\n})\n\n// Routine (array of RoutineBlocks)\nconst Routine = z.array(RoutineBlock)\n\nconst Routines = z.array(Routine)\n\nexport type RoutineSchema = z.infer<typeof Routine>\nexport type RoutinesSchema = z.infer<typeof Routines>\nexport type RoutineBlockSchema = z.infer<typeof RoutineBlock>\nexport type StepSchema = z.infer<typeof Step>\nexport type AgentStepSchema = z.infer<typeof AgentStep>\nexport type LLMStepSchema = z.infer<typeof LLMStep>\nexport type LoopAgentStepSchema = z.infer<typeof LoopAgentStep>\nexport type LoopLLMStepSchema = z.infer<typeof LoopLLMStep>\nexport type ToolCallStepSchema = z.infer<typeof ToolCallStep>\nexport type BashStepSchema = z.infer<typeof BashStep>\n\nexport { Routine, RoutineBlock, Routines, Step }\n","import { parse } from 'yaml'\nimport { z } from 'zod'\nimport type { RoutineSchema } from './types'\nimport { Routine } from './types'\n\n/**\n * Deserialize a YAML string into a Routine\n * @param yamlString The YAML string representation of a Routine\n * @returns The parsed and validated Routine\n * @throws Error if the YAML is invalid or doesn't match the Routine schema\n */\nexport function deserializeRoutineFromYAML(yamlString: string): RoutineSchema {\n\ttry {\n\t\t// Parse the YAML string to a JavaScript object\n\t\tconst parsedYaml = parse(yamlString)\n\n\t\t// Validate and transform the parsed YAML against the Routine schema\n\t\tconst validatedRoutine = Routine.parse(parsedYaml)\n\n\t\treturn validatedRoutine\n\t} catch (error) {\n\t\tif (error instanceof z.ZodError) {\n\t\t\t// Enhance Zod validation errors with better context\n\t\t\tthrow new Error(\n\t\t\t\t`Invalid routine format: ${error.errors\n\t\t\t\t\t.map((err) => `${err.path.join('.')} - ${err.message}`)\n\t\t\t\t\t.join(', ')}`,\n\t\t\t)\n\t\t} else if (error instanceof Error) {\n\t\t\t// Handle YAML parsing errors\n\t\t\tthrow new Error(`Failed to parse YAML: ${error.message}`)\n\t\t} else {\n\t\t\tthrow new Error(`Unknown error during routine deserialization: ${String(error)}`)\n\t\t}\n\t}\n}\n","import type { SubscriptionObserver } from '@sourcegraph/observable'\nimport type { ToolRun } from '../../tool-service'\nimport type { RunRoutineProgressMessage, RunRoutineToolDef } from './common'\n\n/**\n * Class that maintains state for status messages in run_routine implementation.\n * Keeps track of all status messages and reports them through the observer.\n */\nexport class ProgressReporter {\n\tprivate progressMessages: RunRoutineProgressMessage[] = []\n\n\tconstructor(\n\t\tprivate observer: SubscriptionObserver<ToolRun<RunRoutineToolDef>>,\n\t\tprivate signal: AbortSignal,\n\t) {}\n\n\t/**\n\t * Adds the latest message to the list of all status updates and then invokes the observer\n\t * with the updated 'in-progress' status.\n\t */\n\tupdate(update: ToolRun<RunRoutineToolDef>): void {\n\t\tthis.signal.throwIfAborted()\n\t\tif ('progress' in update && update.progress) {\n\t\t\tif (Array.isArray(update.progress)) {\n\t\t\t\tthis.progressMessages.push(...update.progress)\n\t\t\t} else {\n\t\t\t\tthis.progressMessages.push(update.progress)\n\t\t\t}\n\t\t\tthis.observer.next({\n\t\t\t\t...update,\n\t\t\t\tprogress: this.progressMessages,\n\t\t\t})\n\t\t} else {\n\t\t\tthis.observer.next(update)\n\t\t}\n\t}\n\n\terror(error: unknown): void {\n\t\tthis.observer.error(error)\n\t}\n\n\tcomplete(): void {\n\t\tthis.observer.complete()\n\t}\n}\n\n/**\n * Apply variable substitutions to a prompt string\n */\nexport function substitutePromptVars(prompt: string, vars: { userInput?: string }): string {\n\tlet result = prompt\n\n\t// Replace {{userInput}} with the actual user input if provided\n\tif (vars.userInput) {\n\t\tresult = result.replace(/\\{\\{\\s*userInput\\s*\\}\\}/g, vars.userInput)\n\t\tresult = result.replace(/\\{\\{\\s*user_input\\s*\\}\\}/g, vars.userInput)\n\t}\n\n\treturn result\n}\n","import { firstValueFrom } from '@sourcegraph/observable'\nimport {\n\tACTIVE_MODEL,\n\tAnthropicConverters,\n\tfromAnthropicResultToThreadDelta,\n\trunAnthropicSync,\n} from '../../../inference/backends/anthropic'\nimport { buildSystemPrompt, DefaultSystemPromptService } from '../../../threads/system-prompt'\nimport type { ToolUseBlock } from '../../../threads/thread'\nimport {\n\ttoolResultBlocks,\n\ttype Thread,\n\ttype ThreadAssistantMessage,\n\ttype ToolRunUserInput,\n} from '../../../threads/thread'\nimport type { ThreadDelta } from '../../../threads/thread-delta'\nimport { applyThreadDelta } from '../../../threads/thread-delta'\nimport type {\n\tToolDefinition,\n\tToolRun,\n\tToolRunEnvironment,\n\tToolService,\n} from '../../../tools/tool-service'\nimport { createToolService, isToolRunTerminalState } from '../../../tools/tool-service'\nimport { registerBuiltinToolsToToolService } from '../../tools'\nimport type { AgentStepSchema, LLMStepSchema, StepSchema } from './types'\nimport { substitutePromptVars, type ProgressReporter } from './util'\n\n/**\n * Run a step with the given conversation\n */\nexport function runStep(\n\tstep: StepSchema,\n\tconversation: Thread,\n\tenv: ToolRunEnvironment,\n\tprogressReporter: ProgressReporter,\n\tvars: { userInput?: string },\n\tsignal: AbortSignal = new AbortController().signal,\n): Promise<Thread> {\n\tswitch (step.type) {\n\t\tcase 'agent':\n\t\t\treturn runStepAgent(step, conversation, env, progressReporter, vars, signal)\n\t\t\tbreak\n\t\tcase 'llm':\n\t\t\treturn runStepLLM(step, conversation, progressReporter, vars, signal)\n\t\t\tbreak\n\t\tdefault:\n\t\t\tthrow new Error(`Unknown step type: ${(step as any).type}`)\n\t}\n}\n\n/**\n * Run an agent step that implements a full agentic loop\n * Follows the pattern: inference -> tool calls -> tool results -> inference\n * until there are no more tool calls or the process is complete\n */\nasync function runStepAgent(\n\tstep: AgentStepSchema,\n\torigConversation: Thread,\n\tenv: ToolRunEnvironment,\n\tprogressReporter: ProgressReporter,\n\tvars: { userInput?: string },\n\tsignal: AbortSignal,\n): Promise<Thread> {\n\tconst toolService = createToolService()\n\tawait registerBuiltinToolsToToolService(toolService)\n\n\t// Process prompt template with variables if provided\n\tconst promptText = substitutePromptVars(step.prompt, vars)\n\n\t// Clone convo\n\tlet conversation = origConversation\n\tconst recordThreadDelta = (delta: ThreadDelta) => {\n\t\tconversation = applyThreadDelta(conversation, delta)\n\t}\n\n\trecordThreadDelta({\n\t\ttype: 'user:message',\n\t\tmessage: {\n\t\t\tcontent: [{ type: 'text', text: promptText }],\n\t\t\tmeta: {\n\t\t\t\tsentAt: Date.now(),\n\t\t\t},\n\t\t},\n\t})\n\n\t// Update progress with user message added\n\tprogressReporter.update({\n\t\tstatus: 'in-progress',\n\t\tprogress: { type: 'message', speaker: 'user', message: promptText },\n\t})\n\n\t// Get enabled tools from toolService (all tools for now)\n\tconst enabledToolSpecs = (await firstValueFrom(toolService.tools, signal)).map((t) => t.spec)\n\n\t// Set up parameters for the initial API call\n\tconst model = ACTIVE_MODEL\n\n\t// The agent loop will continue until there are no more tool calls needed\n\tlet loopCount = 0\n\tconst maxLoops = 100 // Prevent infinite loops\n\n\twhile (loopCount < maxLoops) {\n\t\tsignal.throwIfAborted()\n\t\tloopCount++\n\n\t\t// Get system prompt blocks from the main system prompt builder\n\t\tconst systemPromptService = new DefaultSystemPromptService()\n\t\t// Get the main system prompt blocks\n\t\tconst systemPromptBlocks = await buildSystemPrompt(\n\t\t\tsystemPromptService,\n\t\t\tenv.threadEnvironment,\n\t\t\tfalse,\n\t\t)\n\n\t\t// Add the subagent-specific instruction as the final block\n\t\tsystemPromptBlocks.push({\n\t\t\ttype: 'text' as const,\n\t\t\ttext: 'You are a helpful AI assistant running as a subagent within a larger system. Your task is to handle this specific step in a routine. You can use tools to complete your task. When you are completely done, do not ask to use more tools.',\n\t\t})\n\n\t\t// Use the combined system prompt\n\t\tconst systemPrompt = systemPromptBlocks\n\n\t\tsignal.throwIfAborted()\n\n\t\t// Use runAnthropicSync to get a response\n\t\tlet result\n\t\ttry {\n\t\t\tconst anthropicMessages = AnthropicConverters.fromNativeThread(conversation)\n\t\t\tresult = await runAnthropicSync(\n\t\t\t\tanthropicMessages,\n\t\t\t\tenabledToolSpecs,\n\t\t\t\tsystemPrompt,\n\t\t\t\tmodel,\n\t\t\t\tsignal,\n\t\t\t)\n\t\t} catch (error) {\n\t\t\tthrow new Error(`Anthropic API error: ${error}`)\n\t\t}\n\n\t\tif (!result.message || !('content' in result.message)) {\n\t\t\tthrow new Error('Unexpected response format from Anthropic')\n\t\t}\n\t\tif (result.message.content.length === 0) {\n\t\t\tbreak\n\t\t}\n\n\t\tconst assistantResponseDelta = fromAnthropicResultToThreadDelta(result.message)\n\t\trecordThreadDelta(assistantResponseDelta)\n\n\t\t// Extract text for progress reporting\n\t\tconst assistantText = result.message.content\n\t\t\t.filter((item) => item.type === 'text')\n\t\t\t.map((item) => ('text' in item ? item.text : ''))\n\t\t\t.join(' ')\n\t\t\t.trim()\n\t\tif (assistantText) {\n\t\t\t// Show assistant message\n\t\t\tprogressReporter.update({\n\t\t\t\tstatus: 'in-progress',\n\t\t\t\tprogress: { type: 'message', speaker: 'assistant', message: assistantText },\n\t\t\t})\n\t\t}\n\n\t\tif (assistantResponseDelta.type !== 'assistant:message') {\n\t\t\t// No tool calls\n\t\t\tbreak\n\t\t}\n\n\t\tconst toolCalls = findToolUsesNeedingInvocation(\n\t\t\tconversation,\n\t\t\tassistantResponseDelta.message,\n\t\t)\n\t\tfor (const toolCall of toolCalls) {\n\t\t\tprogressReporter.update({\n\t\t\t\tstatus: 'in-progress',\n\t\t\t\tprogress: {\n\t\t\t\t\tid: toolCall.id,\n\t\t\t\t\ttype: 'toolCall',\n\t\t\t\t\ttoolName: toolCall.name,\n\t\t\t\t\targs: JSON.stringify(toolCall.input),\n\t\t\t\t},\n\t\t\t})\n\n\t\t\tlet toolResult\n\t\t\ttry {\n\t\t\t\ttoolResult = await invokeToolAndWaitForResult(\n\t\t\t\t\ttoolService,\n\t\t\t\t\ttoolCall.name,\n\t\t\t\t\ttoolCall.input,\n\t\t\t\t\tenv,\n\t\t\t\t\tsignal,\n\t\t\t\t)\n\t\t\t\tsignal.throwIfAborted()\n\t\t\t\tif (toolResult.status !== 'done') {\n\t\t\t\t\tthrow new Error(JSON.stringify(toolResult))\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\trecordThreadDelta({\n\t\t\t\t\ttype: 'tool:data',\n\t\t\t\t\ttoolUse: toolCall.id,\n\t\t\t\t\tdata: {\n\t\t\t\t\t\tstatus: 'error',\n\t\t\t\t\t\terror: { message: `Tool call error: ${error}` },\n\t\t\t\t\t},\n\t\t\t\t})\n\t\t\t\tprogressReporter.update({\n\t\t\t\t\tstatus: 'in-progress',\n\t\t\t\t\tprogress: {\n\t\t\t\t\t\tid: toolCall.id,\n\t\t\t\t\t\ttype: 'toolResult',\n\t\t\t\t\t\ttoolName: toolCall.name,\n\t\t\t\t\t\tresult: `Tool call error: ${error}`,\n\t\t\t\t\t},\n\t\t\t\t})\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\trecordThreadDelta({\n\t\t\t\ttype: 'tool:data',\n\t\t\t\ttoolUse: toolCall.id,\n\t\t\t\tdata: toolResult,\n\t\t\t})\n\t\t\tprogressReporter.update({\n\t\t\t\tstatus: 'in-progress',\n\t\t\t\tprogress: {\n\t\t\t\t\tid: toolCall.id,\n\t\t\t\t\ttype: 'toolResult',\n\t\t\t\t\ttoolName: toolCall.name,\n\t\t\t\t\tresult:\n\t\t\t\t\t\ttypeof toolResult.result === 'string'\n\t\t\t\t\t\t\t? toolResult.result\n\t\t\t\t\t\t\t: JSON.stringify(toolResult.result),\n\t\t\t\t},\n\t\t\t})\n\t\t}\n\t}\n\treturn conversation\n}\n\n/**\n * Mock implementation of tool execution for the subagent\n * In a real implementation, this would connect to the actual tool execution system\n */\n// Removed mock implementation in favor of actual toolService\n\n/**\n * Run an LLM step\n */\nasync function runStepLLM(\n\tstep: LLMStepSchema,\n\torigConversation: Thread,\n\tprogressReporter: ProgressReporter,\n\tvars: { userInput?: string },\n\tsignal: AbortSignal,\n): Promise<Thread> {\n\t// Process prompt template with variables if provided\n\tconst promptText = substitutePromptVars(step.prompt, vars)\n\n\t// Create a copy of the conversation to avoid mutating the original\n\tlet conversation = origConversation\n\tconst recordThreadDelta = (delta: ThreadDelta) => {\n\t\tconversation = applyThreadDelta(conversation, delta)\n\t}\n\n\trecordThreadDelta({\n\t\ttype: 'user:message',\n\t\tmessage: {\n\t\t\tcontent: [{ type: 'text', text: promptText }],\n\t\t\tmeta: {\n\t\t\t\tsentAt: Date.now(),\n\t\t\t},\n\t\t},\n\t})\n\n\t// Update progress with user message added\n\tprogressReporter.update({\n\t\tstatus: 'in-progress',\n\t\tprogress: { type: 'message', speaker: 'user', message: promptText },\n\t})\n\n\t// Use runAnthropicSync to get a response\n\tconst anthropicMessages = AnthropicConverters.fromNativeThread(conversation)\n\tconst model = step.model || ACTIVE_MODEL\n\tconst result = await runAnthropicSync(\n\t\tanthropicMessages,\n\t\t[], // No tools for LLM-only step\n\t\t[], // No system prompt\n\t\tmodel,\n\t\tsignal,\n\t)\n\n\tif (!result.message) {\n\t\tthrow new Error('Failed to get response from Anthropic')\n\t}\n\n\tconst assistantResponseDelta = fromAnthropicResultToThreadDelta(result.message)\n\trecordThreadDelta(assistantResponseDelta)\n\n\t// Display message\n\tconst assistantText = result.message.content\n\t\t.filter((item) => item.type === 'text')\n\t\t.map((item) => (item.type === 'text' ? item.text : ''))\n\t\t.join(' ')\n\t\t.trim()\n\tprogressReporter.update({\n\t\tstatus: 'in-progress',\n\t\tprogress: { type: 'message', speaker: 'assistant', message: assistantText },\n\t})\n\treturn conversation\n}\n\nfunction findToolUsesNeedingInvocation(\n\tthread: Thread,\n\tmessage: ThreadAssistantMessage,\n): ToolUseBlock[] {\n\tconst toolResults = toolResultBlocks(thread)\n\treturn message.content\n\t\t.filter((block): block is ToolUseBlock => block.type === 'tool_use')\n\t\t.filter((block) => !block.inputPartialJSON)\n\t\t.filter(\n\t\t\t(block) =>\n\t\t\t\t// Only include tools that haven't been invoked yet.\n\t\t\t\t!toolResults.has(block.id),\n\t\t)\n}\n\n/**\n * Helper function that invokes a tool and returns a Promise with the final result\n */\nexport async function invokeToolAndWaitForResult<T extends ToolDefinition>(\n\ttoolService: ToolService,\n\ttoolName: string,\n\tinput: unknown,\n\tenv: ToolRunEnvironment,\n\tsignal: AbortSignal = new AbortController().signal,\n\tuserInput?: ToolRunUserInput,\n): Promise<ToolRun<T>> {\n\treturn new Promise((resolve, reject) => {\n\t\tlet settled = false\n\t\tconst sub = toolService\n\t\t\t.invokeTool(toolName, { args: input as any, userInput }, env)\n\t\t\t.subscribe({\n\t\t\t\tnext: (run: ToolRun) => {\n\t\t\t\t\tif (isToolRunTerminalState(run)) {\n\t\t\t\t\t\tsub.unsubscribe()\n\t\t\t\t\t\tif (!settled) {\n\t\t\t\t\t\t\tsettled = true\n\t\t\t\t\t\t\tresolve(run)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\terror: (error) => {\n\t\t\t\t\tif (!settled) {\n\t\t\t\t\t\tsettled = true\n\t\t\t\t\t\treject(error)\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tcomplete: () => {},\n\t\t\t})\n\n\t\t// Handle abort signal\n\t\tsignal.addEventListener('abort', () => {\n\t\t\tsub.unsubscribe()\n\t\t\tif (!settled) {\n\t\t\t\tsettled = true\n\t\t\t\treject(new Error('Tool execution was aborted'))\n\t\t\t}\n\t\t})\n\t})\n}\n","import { Observable } from '@sourcegraph/observable'\nimport { isAbortError } from '../../../common/abort'\nimport logger from '../../../common/logger'\nimport type { Thread } from '../../../threads/thread'\nimport { newThreadID } from '../../../threads/thread'\nimport type { ToolRunEnvironment } from '../../tool-service'\nimport { createToolService } from '../../tool-service'\nimport type { ReadFileToolDef } from '../filesystem/read_file.common'\nimport { readFileToolReg } from '../filesystem/read_file.common'\nimport type { runRoutineToolReg } from './common'\nimport { deserializeRoutineFromYAML } from './serialization'\nimport { invokeToolAndWaitForResult, runStep } from './step'\nimport { ProgressReporter } from './util'\n\nexport const runRoutine: NonNullable<(typeof runRoutineToolReg)['fn']> = ({ args }, env) => {\n\treturn new Observable((observer) => {\n\t\tconst abortController = new AbortController()\n\t\tconst progressReporter = new ProgressReporter(observer, abortController.signal)\n\n\t\trunRoutineImpl(args, env, progressReporter, abortController.signal).catch((error) => {\n\t\t\t// Don't report AbortError as an error - it's expected when cancelling\n\t\t\tif (!isAbortError(error)) {\n\t\t\t\tprogressReporter.error(error)\n\t\t\t} else {\n\t\t\t\tprogressReporter.update({\n\t\t\t\t\tstatus: 'cancelled' as const,\n\t\t\t\t\tprogress: { type: 'meta', message: 'Operation cancelled' },\n\t\t\t\t})\n\t\t\t\tprogressReporter.complete()\n\t\t\t}\n\t\t})\n\n\t\treturn () => {\n\t\t\tabortController.abort()\n\t\t}\n\t})\n}\n\nasync function runRoutineImpl(\n\targs: { id: string; file?: string; userInput?: string },\n\tenv: ToolRunEnvironment,\n\tprogressReporter: ProgressReporter,\n\tsignal: AbortSignal,\n) {\n\ttry {\n\t\tconst { id, file } = args\n\t\tconst routineFile = file || 'routines.amp.yaml'\n\n\t\t// Report initial progress\n\t\tprogressReporter.update({\n\t\t\tstatus: 'in-progress',\n\t\t\tprogress: { type: 'meta', message: `Loading routine: ${id} from ${routineFile}` },\n\t\t})\n\n\t\t// Create a tool service and register the read_file tool\n\t\tconst toolService = createToolService()\n\t\ttoolService.registerTool(readFileToolReg)\n\n\t\t// Read the routine file using the tool service\n\t\tconst readFileResult = await invokeToolAndWaitForResult<ReadFileToolDef>(\n\t\t\ttoolService,\n\t\t\t'read_file',\n\t\t\t{ path: routineFile },\n\t\t\tenv,\n\t\t\tsignal,\n\t\t)\n\n\t\t// Process the file content by removing line numbers that read_file adds\n\t\tif (readFileResult.status !== 'done') {\n\t\t\tthrow new Error(`Failed to read routine file: ${routineFile}`)\n\t\t}\n\t\t// At this point TypeScript knows readFileResult has a 'result' property\n\t\tconst fileContents =\n\t\t\ttypeof readFileResult.result === 'string'\n\t\t\t\t? readFileResult.result\n\t\t\t\t: readFileResult.result.content\n\t\tconst routineContent = String(fileContents)\n\t\t\t.split('\\n')\n\t\t\t.map((line: string) => line.replace(/^\\d+:\\s/, ''))\n\t\t\t.join('\\n')\n\n\t\tsignal.throwIfAborted()\n\n\t\t// Parse the routines\n\t\tconst routines = deserializeRoutineFromYAML(routineContent)\n\t\tsignal.throwIfAborted()\n\n\t\t// Find the requested routine\n\t\tconst routine = routines.find((routine) => routine.id === id)\n\t\tif (!routine) {\n\t\t\tthrow new Error(`Routine with id \"${id}\" not found in ${routineFile}`)\n\t\t}\n\n\t\t// Initialize a Thread for the conversation\n\t\tlet conversation: Thread = {\n\t\t\tid: newThreadID(),\n\t\t\tcreated: Date.now(),\n\t\t\tv: 0,\n\t\t\tmessages: [],\n\t\t}\n\n\t\t// Report progress before executing steps\n\t\tprogressReporter.update({\n\t\t\tstatus: 'in-progress',\n\t\t\tprogress: [\n\t\t\t\t{\n\t\t\t\t\ttype: 'meta',\n\t\t\t\t\tmessage: `Executing routine ${id}`,\n\t\t\t\t},\n\t\t\t],\n\t\t})\n\n\t\t// Execute each step in the routine\n\t\tfor (let i = 0; i < routine.steps.length; i++) {\n\t\t\tconst step = routine.steps[i]\n\t\t\tif (!step) continue // Skip undefined steps\n\n\t\t\tprogressReporter.update({\n\t\t\t\tstatus: 'in-progress',\n\t\t\t\tprogress: [\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: 'meta',\n\t\t\t\t\t\tmessage: `Executing step ${i + 1}/${routine.steps.length}: ${step.type}`,\n\t\t\t\t\t\tvariant: 'header',\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t})\n\n\t\t\tsignal.throwIfAborted()\n\n\t\t\t// Execute the step and update the conversation\n\t\t\tconversation = await runStep(step, conversation, env, progressReporter, {\n\t\t\t\tuserInput: args.userInput,\n\t\t\t})\n\t\t}\n\n\t\tprogressReporter.update({\n\t\t\tstatus: 'done' as const,\n\t\t\tprogress: {\n\t\t\t\ttype: 'meta',\n\t\t\t\tmessage: `Finished executing all ${routine.steps.length} steps of routine: ${id}.`,\n\t\t\t\tvariant: 'header',\n\t\t\t},\n\t\t\tresult: '', // No output for now\n\t\t})\n\n\t\tprogressReporter.complete()\n\t} catch (error) {\n\t\tif (isAbortError(error)) {\n\t\t\tprogressReporter.update({\n\t\t\t\tstatus: 'cancelled' as const,\n\t\t\t\tprogress: {\n\t\t\t\t\ttype: 'meta',\n\t\t\t\t\tmessage: 'Operation cancelled',\n\t\t\t\t},\n\t\t\t})\n\t\t\tprogressReporter.complete()\n\t\t} else {\n\t\t\tlogger.error('Error in run_routine', {\n\t\t\t\terror,\n\t\t\t\tstack: error instanceof Error ? error.stack : '',\n\t\t\t})\n\t\t\tprogressReporter.error(error)\n\t\t}\n\t}\n}\n"],"names":["BaseStep","z.object","z.enum","z.union","z.literal","z.array","z.string","z.record","z.any","AgentStep","z.boolean","LLMStep","LoopAgentStep","LoopLLMStep","ToolCallStep","BashStep","Step","z.discriminatedUnion","RoutineBlock","Routine","deserializeRoutineFromYAML","yamlString","parsedYaml","parse","error","z.ZodError","err","ProgressReporter","observer","signal","update","substitutePromptVars","prompt","vars","result","runStep","step","conversation","env","progressReporter","runStepAgent","runStepLLM","origConversation","toolService","createToolService","registerBuiltinToolsToToolService","promptText","recordThreadDelta","delta","applyThreadDelta","enabledToolSpecs","firstValueFrom","t","model","ACTIVE_MODEL","loopCount","maxLoops","systemPromptService","DefaultSystemPromptService","systemPromptBlocks","buildSystemPrompt","systemPrompt","anthropicMessages","AnthropicConverters","runAnthropicSync","assistantResponseDelta","fromAnthropicResultToThreadDelta","assistantText","item","toolCalls","findToolUsesNeedingInvocation","toolCall","toolResult","invokeToolAndWaitForResult","thread","message","toolResults","toolResultBlocks","block","toolName","input","userInput","resolve","reject","settled","sub","run","isToolRunTerminalState","runRoutine","args","Observable","abortController","runRoutineImpl","isAbortError","id","file","routineFile","readFileToolReg","readFileResult","fileContents","routineContent","line","routines","routine","newThreadID","i","logger"],"mappings":"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"}
|
@@ -1,5 +1,5 @@
|
|
1
1
|
#!/usr/bin/env node
|
2
|
-
import {
|
2
|
+
import { C as Pe, aw as st, p as lt } from "./color-DGLUYaqf.js";
|
3
3
|
var pe = {}, Pu = {}, be = {}, Me;
|
4
4
|
function ne() {
|
5
5
|
return Me || (Me = 1, function(u) {
|
@@ -4850,4 +4850,4 @@ ${a}`
|
|
4850
4850
|
export {
|
4851
4851
|
ea as nodeReadWebPageTool
|
4852
4852
|
};
|
4853
|
-
//# sourceMappingURL=node
|
4853
|
+
//# sourceMappingURL=node-BZRHbCOQ.js.map
|