@multiplayer-app/agent 0.1.19 → 0.1.21
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/README.md +14 -7
- package/dist/agent/definition.d.ts +13 -0
- package/dist/agent/definition.d.ts.map +1 -1
- package/dist/agent/definition.test.js +8 -3
- package/dist/agent/definition.test.js.map +1 -1
- package/dist/agent/profiles/coding.d.ts +1 -1
- package/dist/agent/profiles/coding.d.ts.map +1 -1
- package/dist/agent/profiles/coding.js +21 -4
- package/dist/agent/profiles/coding.js.map +1 -1
- package/dist/agent/profiles/index.js +1 -1
- package/dist/agent/profiles/index.js.map +1 -1
- package/dist/agent/profiles/research.d.ts.map +1 -1
- package/dist/agent/profiles/research.js +23 -1
- package/dist/agent/profiles/research.js.map +1 -1
- package/dist/agent/turn-history.d.ts +40 -0
- package/dist/agent/turn-history.d.ts.map +1 -0
- package/dist/agent/turn-history.js +167 -0
- package/dist/agent/turn-history.js.map +1 -0
- package/dist/agent/turn-runner.d.ts +22 -1
- package/dist/agent/turn-runner.d.ts.map +1 -1
- package/dist/agent/turn-runner.js +162 -79
- package/dist/agent/turn-runner.js.map +1 -1
- package/dist/app/app-host.d.ts +57 -0
- package/dist/app/app-host.d.ts.map +1 -0
- package/dist/app/app-host.js +252 -0
- package/dist/app/app-host.js.map +1 -0
- package/dist/app/app-host.test.d.ts +2 -0
- package/dist/app/app-host.test.d.ts.map +1 -0
- package/dist/app/app-host.test.js +639 -0
- package/dist/app/app-host.test.js.map +1 -0
- package/dist/app/config.d.ts +196 -0
- package/dist/app/config.d.ts.map +1 -0
- package/dist/app/config.js +362 -0
- package/dist/app/config.js.map +1 -0
- package/dist/app/config.test.d.ts +2 -0
- package/dist/app/config.test.d.ts.map +1 -0
- package/dist/app/config.test.js +224 -0
- package/dist/app/config.test.js.map +1 -0
- package/dist/app/detect.d.ts +68 -0
- package/dist/app/detect.d.ts.map +1 -0
- package/dist/app/detect.js +449 -0
- package/dist/app/detect.js.map +1 -0
- package/dist/app/detect.test.d.ts +2 -0
- package/dist/app/detect.test.d.ts.map +1 -0
- package/dist/app/detect.test.js +267 -0
- package/dist/app/detect.test.js.map +1 -0
- package/dist/app/env.d.ts +5 -0
- package/dist/app/env.d.ts.map +1 -0
- package/dist/app/env.js +22 -0
- package/dist/app/env.js.map +1 -0
- package/dist/app/functions-cli.d.ts +3 -0
- package/dist/app/functions-cli.d.ts.map +1 -0
- package/dist/app/functions-cli.js +27 -0
- package/dist/app/functions-cli.js.map +1 -0
- package/dist/app/functions-host.d.ts +15 -0
- package/dist/app/functions-host.d.ts.map +1 -0
- package/dist/app/functions-host.js +276 -0
- package/dist/app/functions-host.js.map +1 -0
- package/dist/app/functions-host.test.d.ts +2 -0
- package/dist/app/functions-host.test.d.ts.map +1 -0
- package/dist/app/functions-host.test.js +117 -0
- package/dist/app/functions-host.test.js.map +1 -0
- package/dist/app/functions-routes.d.ts +23 -0
- package/dist/app/functions-routes.d.ts.map +1 -0
- package/dist/app/functions-routes.js +85 -0
- package/dist/app/functions-routes.js.map +1 -0
- package/dist/app/functions-routes.test.d.ts +2 -0
- package/dist/app/functions-routes.test.d.ts.map +1 -0
- package/dist/app/functions-routes.test.js +40 -0
- package/dist/app/functions-routes.test.js.map +1 -0
- package/dist/app/manifest.d.ts +17 -0
- package/dist/app/manifest.d.ts.map +1 -0
- package/dist/app/manifest.js +64 -0
- package/dist/app/manifest.js.map +1 -0
- package/dist/app/manifest.test.d.ts +2 -0
- package/dist/app/manifest.test.d.ts.map +1 -0
- package/dist/app/manifest.test.js +173 -0
- package/dist/app/manifest.test.js.map +1 -0
- package/dist/app/release-artifacts.d.ts +39 -0
- package/dist/app/release-artifacts.d.ts.map +1 -0
- package/dist/app/release-artifacts.js +229 -0
- package/dist/app/release-artifacts.js.map +1 -0
- package/dist/app/release-artifacts.test.d.ts +2 -0
- package/dist/app/release-artifacts.test.d.ts.map +1 -0
- package/dist/app/release-artifacts.test.js +295 -0
- package/dist/app/release-artifacts.test.js.map +1 -0
- package/dist/app/route-pattern.d.ts +23 -0
- package/dist/app/route-pattern.d.ts.map +1 -0
- package/dist/app/route-pattern.js +339 -0
- package/dist/app/route-pattern.js.map +1 -0
- package/dist/app/route-pattern.test.d.ts +2 -0
- package/dist/app/route-pattern.test.d.ts.map +1 -0
- package/dist/app/route-pattern.test.js +187 -0
- package/dist/app/route-pattern.test.js.map +1 -0
- package/dist/app/rules.d.ts +61 -0
- package/dist/app/rules.d.ts.map +1 -0
- package/dist/app/rules.js +90 -0
- package/dist/app/rules.js.map +1 -0
- package/dist/app/rules.test.d.ts +2 -0
- package/dist/app/rules.test.d.ts.map +1 -0
- package/dist/app/rules.test.js +69 -0
- package/dist/app/rules.test.js.map +1 -0
- package/dist/app/runner.d.ts +109 -0
- package/dist/app/runner.d.ts.map +1 -0
- package/dist/app/runner.js +429 -0
- package/dist/app/runner.js.map +1 -0
- package/dist/app/site.d.ts +73 -0
- package/dist/app/site.d.ts.map +1 -0
- package/dist/app/site.js +161 -0
- package/dist/app/site.js.map +1 -0
- package/dist/app/site.test.d.ts +2 -0
- package/dist/app/site.test.d.ts.map +1 -0
- package/dist/app/site.test.js +291 -0
- package/dist/app/site.test.js.map +1 -0
- package/dist/app/static-server.d.ts +20 -0
- package/dist/app/static-server.d.ts.map +1 -0
- package/dist/app/static-server.js +145 -0
- package/dist/app/static-server.js.map +1 -0
- package/dist/context-pruning.d.ts +2 -0
- package/dist/context-pruning.d.ts.map +1 -1
- package/dist/context-pruning.js +3 -2
- package/dist/context-pruning.js.map +1 -1
- package/dist/models/usage.d.ts +6 -0
- package/dist/models/usage.d.ts.map +1 -1
- package/dist/models/usage.js +13 -0
- package/dist/models/usage.js.map +1 -1
- package/dist/persistence/conversation-store.d.ts +21 -0
- package/dist/persistence/conversation-store.d.ts.map +1 -0
- package/dist/persistence/conversation-store.js +59 -0
- package/dist/persistence/conversation-store.js.map +1 -0
- package/dist/persistence/conversation-store.test.d.ts +2 -0
- package/dist/persistence/conversation-store.test.d.ts.map +1 -0
- package/dist/persistence/conversation-store.test.js +98 -0
- package/dist/persistence/conversation-store.test.js.map +1 -0
- package/dist/persistence/git-sync.d.ts +14 -1
- package/dist/persistence/git-sync.d.ts.map +1 -1
- package/dist/persistence/git-sync.js +73 -17
- package/dist/persistence/git-sync.js.map +1 -1
- package/dist/persistence/git-sync.test.js +155 -6
- package/dist/persistence/git-sync.test.js.map +1 -1
- package/dist/persistence/snapshot-sync.d.ts +19 -2
- package/dist/persistence/snapshot-sync.d.ts.map +1 -1
- package/dist/persistence/snapshot-sync.js +194 -83
- package/dist/persistence/snapshot-sync.js.map +1 -1
- package/dist/persistence/snapshot-sync.test.js +145 -27
- package/dist/persistence/snapshot-sync.test.js.map +1 -1
- package/dist/persistence/workspace.d.ts +3 -0
- package/dist/persistence/workspace.d.ts.map +1 -1
- package/dist/persistence/workspace.js +1 -0
- package/dist/persistence/workspace.js.map +1 -1
- package/dist/research/extract-texts.d.ts.map +1 -1
- package/dist/research/extract-texts.js +34 -16
- package/dist/research/extract-texts.js.map +1 -1
- package/dist/research/filingramp/attachment-tools.d.ts.map +1 -1
- package/dist/research/filingramp/attachment-tools.js +7 -4
- package/dist/research/filingramp/attachment-tools.js.map +1 -1
- package/dist/research/filingramp/shared.d.ts.map +1 -1
- package/dist/research/filingramp/shared.js +5 -5
- package/dist/research/filingramp/shared.js.map +1 -1
- package/dist/research/prompt.d.ts.map +1 -1
- package/dist/research/prompt.js +2 -1
- package/dist/research/prompt.js.map +1 -1
- package/dist/runtime/app-mode.d.ts +10 -0
- package/dist/runtime/app-mode.d.ts.map +1 -0
- package/dist/runtime/app-mode.js +172 -0
- package/dist/runtime/app-mode.js.map +1 -0
- package/dist/runtime/app-mode.test.d.ts +2 -0
- package/dist/runtime/app-mode.test.d.ts.map +1 -0
- package/dist/runtime/app-mode.test.js +130 -0
- package/dist/runtime/app-mode.test.js.map +1 -0
- package/dist/runtime/app-rehearsal.d.ts +2 -0
- package/dist/runtime/app-rehearsal.d.ts.map +1 -0
- package/dist/runtime/app-rehearsal.js +56 -0
- package/dist/runtime/app-rehearsal.js.map +1 -0
- package/dist/runtime/build-mode.d.ts +12 -0
- package/dist/runtime/build-mode.d.ts.map +1 -0
- package/dist/runtime/build-mode.js +116 -0
- package/dist/runtime/build-mode.js.map +1 -0
- package/dist/runtime/build-mode.test.d.ts +2 -0
- package/dist/runtime/build-mode.test.d.ts.map +1 -0
- package/dist/runtime/build-mode.test.js +121 -0
- package/dist/runtime/build-mode.test.js.map +1 -0
- package/dist/runtime/cli.js +7 -2
- package/dist/runtime/cli.js.map +1 -1
- package/dist/runtime/config.d.ts +4 -0
- package/dist/runtime/config.d.ts.map +1 -1
- package/dist/runtime/config.js +13 -2
- package/dist/runtime/config.js.map +1 -1
- package/dist/runtime/guest-server.d.ts +3 -0
- package/dist/runtime/guest-server.d.ts.map +1 -0
- package/dist/runtime/{lambda-microvm.js → guest-server.js} +49 -18
- package/dist/runtime/guest-server.js.map +1 -0
- package/dist/runtime/image-hooks.d.ts +5 -0
- package/dist/runtime/image-hooks.d.ts.map +1 -0
- package/dist/runtime/image-hooks.js +68 -0
- package/dist/runtime/image-hooks.js.map +1 -0
- package/dist/runtime/image-hooks.test.d.ts +2 -0
- package/dist/runtime/image-hooks.test.d.ts.map +1 -0
- package/dist/runtime/image-hooks.test.js +74 -0
- package/dist/runtime/image-hooks.test.js.map +1 -0
- package/dist/runtime/index.d.ts +8 -3
- package/dist/runtime/index.d.ts.map +1 -1
- package/dist/runtime/index.js +53 -35
- package/dist/runtime/index.js.map +1 -1
- package/dist/runtime/listening-ports.d.ts +13 -0
- package/dist/runtime/listening-ports.d.ts.map +1 -0
- package/dist/runtime/listening-ports.js +78 -0
- package/dist/runtime/listening-ports.js.map +1 -0
- package/dist/runtime/listening-ports.test.d.ts +2 -0
- package/dist/runtime/listening-ports.test.d.ts.map +1 -0
- package/dist/runtime/listening-ports.test.js +39 -0
- package/dist/runtime/listening-ports.test.js.map +1 -0
- package/dist/runtime/preview-proxy.d.ts +56 -0
- package/dist/runtime/preview-proxy.d.ts.map +1 -0
- package/dist/runtime/preview-proxy.js +302 -0
- package/dist/runtime/preview-proxy.js.map +1 -0
- package/dist/runtime/preview-proxy.test.d.ts +2 -0
- package/dist/runtime/preview-proxy.test.d.ts.map +1 -0
- package/dist/runtime/preview-proxy.test.js +122 -0
- package/dist/runtime/preview-proxy.test.js.map +1 -0
- package/dist/runtime/session-mode.d.ts +3 -0
- package/dist/runtime/session-mode.d.ts.map +1 -0
- package/dist/runtime/session-mode.js +60 -0
- package/dist/runtime/session-mode.js.map +1 -0
- package/dist/runtime/workload.d.ts +44 -0
- package/dist/runtime/workload.d.ts.map +1 -0
- package/dist/runtime/workload.js +222 -0
- package/dist/runtime/workload.js.map +1 -0
- package/dist/runtime/workload.test.d.ts +2 -0
- package/dist/runtime/workload.test.d.ts.map +1 -0
- package/dist/runtime/workload.test.js +235 -0
- package/dist/runtime/workload.test.js.map +1 -0
- package/dist/session/conversation.d.ts +10 -2
- package/dist/session/conversation.d.ts.map +1 -1
- package/dist/session/conversation.js +40 -12
- package/dist/session/conversation.js.map +1 -1
- package/dist/session/conversation.test.js +2 -3
- package/dist/session/conversation.test.js.map +1 -1
- package/dist/session/index.d.ts +1 -1
- package/dist/session/index.d.ts.map +1 -1
- package/dist/session/index.js +2 -1
- package/dist/session/index.js.map +1 -1
- package/dist/session/runtime.d.ts +20 -3
- package/dist/session/runtime.d.ts.map +1 -1
- package/dist/session/runtime.js +97 -16
- package/dist/session/runtime.js.map +1 -1
- package/dist/session/runtime.test.js +18 -7
- package/dist/session/runtime.test.js.map +1 -1
- package/dist/session/tools.d.ts.map +1 -1
- package/dist/session/tools.js +5 -4
- package/dist/session/tools.js.map +1 -1
- package/dist/task/loop.d.ts.map +1 -1
- package/dist/task/loop.js +6 -4
- package/dist/task/loop.js.map +1 -1
- package/dist/tools/exec-tools.d.ts +12 -0
- package/dist/tools/exec-tools.d.ts.map +1 -1
- package/dist/tools/exec-tools.js +46 -3
- package/dist/tools/exec-tools.js.map +1 -1
- package/dist/tools/exec-tools.test.d.ts +2 -0
- package/dist/tools/exec-tools.test.d.ts.map +1 -0
- package/dist/tools/exec-tools.test.js +48 -0
- package/dist/tools/exec-tools.test.js.map +1 -0
- package/dist/tools/fs-tools.d.ts.map +1 -1
- package/dist/tools/fs-tools.js +5 -5
- package/dist/tools/fs-tools.js.map +1 -1
- package/dist/transport/link.d.ts.map +1 -1
- package/dist/transport/link.js +16 -5
- package/dist/transport/link.js.map +1 -1
- package/dist/transport/link.test.js +24 -0
- package/dist/transport/link.test.js.map +1 -1
- package/dist/transport/protocol.d.ts +190 -3
- package/dist/transport/protocol.d.ts.map +1 -1
- package/dist/transport/protocol.js +147 -7
- package/dist/transport/protocol.js.map +1 -1
- package/dist/transport/protocol.test.js +41 -0
- package/dist/transport/protocol.test.js.map +1 -1
- package/dist/workspace-sync/eligibility.d.ts +14 -0
- package/dist/workspace-sync/eligibility.d.ts.map +1 -0
- package/dist/workspace-sync/eligibility.js +53 -0
- package/dist/workspace-sync/eligibility.js.map +1 -0
- package/dist/workspace-sync/merge.d.ts +15 -0
- package/dist/workspace-sync/merge.d.ts.map +1 -0
- package/dist/workspace-sync/merge.js +66 -0
- package/dist/workspace-sync/merge.js.map +1 -0
- package/dist/workspace-sync/merge.test.d.ts +2 -0
- package/dist/workspace-sync/merge.test.d.ts.map +1 -0
- package/dist/workspace-sync/merge.test.js +28 -0
- package/dist/workspace-sync/merge.test.js.map +1 -0
- package/dist/workspace-sync/workspace-sync.d.ts +48 -0
- package/dist/workspace-sync/workspace-sync.d.ts.map +1 -0
- package/dist/workspace-sync/workspace-sync.js +308 -0
- package/dist/workspace-sync/workspace-sync.js.map +1 -0
- package/dist/workspace-sync/workspace-sync.test.d.ts +2 -0
- package/dist/workspace-sync/workspace-sync.test.d.ts.map +1 -0
- package/dist/workspace-sync/workspace-sync.test.js +111 -0
- package/dist/workspace-sync/workspace-sync.test.js.map +1 -0
- package/dist/workspace-sync/write-drafts.d.ts +24 -0
- package/dist/workspace-sync/write-drafts.d.ts.map +1 -0
- package/dist/workspace-sync/write-drafts.js +87 -0
- package/dist/workspace-sync/write-drafts.js.map +1 -0
- package/dist/workspace-sync/write-drafts.test.d.ts +2 -0
- package/dist/workspace-sync/write-drafts.test.d.ts.map +1 -0
- package/dist/workspace-sync/write-drafts.test.js +36 -0
- package/dist/workspace-sync/write-drafts.test.js.map +1 -0
- package/package.json +12 -2
- package/dist/runtime/lambda-microvm.d.ts +0 -3
- package/dist/runtime/lambda-microvm.d.ts.map +0 -1
- package/dist/runtime/lambda-microvm.js.map +0 -1
|
@@ -8,6 +8,8 @@ const usage_1 = require("../models/usage");
|
|
|
8
8
|
const context_pruning_1 = require("../context-pruning");
|
|
9
9
|
const tool_call_repair_1 = require("../tool-call-repair");
|
|
10
10
|
const model_failure_1 = require("./model-failure");
|
|
11
|
+
const turn_history_1 = require("./turn-history");
|
|
12
|
+
const write_drafts_1 = require("../workspace-sync/write-drafts");
|
|
11
13
|
/** Steps the budget wrap-up may take (write notes and findings, publish, summarize) before the turn stops. */
|
|
12
14
|
const WRAP_UP_STEPS = 4;
|
|
13
15
|
const WRAP_UP_TOOLS = ['write_files', 'read_file', 'run_command', 'publish_results'];
|
|
@@ -26,7 +28,15 @@ function stepsSinceProgress(steps) {
|
|
|
26
28
|
}
|
|
27
29
|
return steps.length;
|
|
28
30
|
}
|
|
29
|
-
/**
|
|
31
|
+
/**
|
|
32
|
+
* Executes one turn. It neither mutates conversation history nor checkpoints or schedules work.
|
|
33
|
+
*
|
|
34
|
+
* A turn runs as one or more model loops ("segments") of up to `maxSteps` steps each. A profile with
|
|
35
|
+
* `maxTurnSteps` keeps going in a new segment when a loop ends at the step cap while the model still
|
|
36
|
+
* wants to call tools, until the model stops on its own, asks the user, wraps up for the budget, or
|
|
37
|
+
* reaches `maxTurnSteps`. Across segments the turn is one conversation: long turns are compacted (the
|
|
38
|
+
* oldest steps replaced by a note and the agent's notes file) and bulky old results pruned.
|
|
39
|
+
*/
|
|
30
40
|
class TurnRunner {
|
|
31
41
|
constructor(definition) {
|
|
32
42
|
this.definition = definition;
|
|
@@ -36,9 +46,13 @@ class TurnRunner {
|
|
|
36
46
|
const { messageId, abortSignal, emit } = input;
|
|
37
47
|
let partialText = '';
|
|
38
48
|
let askedUser = false;
|
|
39
|
-
let wrapUpFrom;
|
|
40
49
|
let saved = false;
|
|
41
|
-
let
|
|
50
|
+
let wrappedUp = false;
|
|
51
|
+
/** Response messages of the segments that finished. */
|
|
52
|
+
const turn = [];
|
|
53
|
+
/** Finished steps of the running segment, as of its last prepareStep. */
|
|
54
|
+
let segmentSteps = [];
|
|
55
|
+
let compaction = { droppedSteps: 0 };
|
|
42
56
|
const recordUsage = (usage, model) => {
|
|
43
57
|
input.recordUsage(usage);
|
|
44
58
|
emit({ type: 'usage', messageId, usage: { ...usage, model } });
|
|
@@ -48,99 +62,168 @@ class TurnRunner {
|
|
|
48
62
|
abortSignal,
|
|
49
63
|
recordUsage,
|
|
50
64
|
reportProgress: (steps, toolCallId) => emit({ type: 'progress', messageId, toolCallId, steps }),
|
|
51
|
-
|
|
65
|
+
// With live sync every workspace file is already in the session; publishing makes these current now.
|
|
66
|
+
publishFiles: (files) => {
|
|
67
|
+
if (input.files)
|
|
68
|
+
void input.files.flush(files.map((file) => file.path));
|
|
69
|
+
else
|
|
70
|
+
emit({ type: 'files', messageId, files });
|
|
71
|
+
},
|
|
52
72
|
requestClarification: (question, toolCallId) => {
|
|
53
73
|
askedUser = true;
|
|
54
74
|
emit({ type: 'question', messageId, toolCallId, question });
|
|
55
75
|
},
|
|
56
76
|
};
|
|
77
|
+
const history = input.messages;
|
|
78
|
+
const { model, maxSteps, profile } = this.definition;
|
|
79
|
+
const maxTurnSteps = (_a = this.definition.maxTurnSteps) !== null && _a !== void 0 ? _a : maxSteps;
|
|
80
|
+
// The wrap-up needs a research workspace to save into; the coding profile just stops at the budget.
|
|
81
|
+
const research = profile === 'research';
|
|
82
|
+
/** The turn so far as the model should see it: compacted when long, bulky old results pruned. */
|
|
83
|
+
const promptFor = async (turnMessages) => {
|
|
84
|
+
var _a, _b, _c;
|
|
85
|
+
const steps = (0, turn_history_1.splitSteps)(turnMessages);
|
|
86
|
+
const drop = (0, turn_history_1.stepsToDrop)(steps, compaction, turn_history_1.DEFAULT_COMPACTION);
|
|
87
|
+
if (drop !== undefined) {
|
|
88
|
+
const notes = await ((_b = (_a = this.definition).workingNotes) === null || _b === void 0 ? void 0 : _b.call(_a, input.workspaceDir).catch(() => undefined));
|
|
89
|
+
compaction = { droppedSteps: drop, note: (0, turn_history_1.compactionNote)(steps.slice(0, drop), (_c = this.definition.workingNotes) === null || _c === void 0 ? void 0 : _c.path, notes) };
|
|
90
|
+
}
|
|
91
|
+
return (0, context_pruning_1.pruneToolResults)([...history, ...(0, turn_history_1.compactedView)(steps, compaction)]);
|
|
92
|
+
};
|
|
93
|
+
const drafts = input.files ? new write_drafts_1.WriteDraftTracker(input.files) : undefined;
|
|
57
94
|
try {
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
// PROGRESS_REMINDER_STEPS quiet steps, so an agent whose phase has not changed is not nagged.
|
|
81
|
-
const since = stepsSinceProgress(steps);
|
|
82
|
-
const stale = research && 'report_progress' in tools && since > 0 && since % PROGRESS_REMINDER_STEPS === 0;
|
|
83
|
-
return { messages: stale ? [...pruned, { role: 'user', content: PROGRESS_REMINDER }] : pruned };
|
|
84
|
-
}
|
|
85
|
-
// The instructions go last, as a note, rather than into the system prompt: the model acts on
|
|
86
|
-
// the newest message (in one run it ignored a system-only switch and ended on leftover
|
|
87
|
-
// text), and the cached prefix stays intact. A forced tool call (toolChoice "required") is
|
|
88
|
-
// not an option: Anthropic rejects it while extended thinking is on.
|
|
89
|
-
return {
|
|
90
|
-
messages: saved ? pruned : [...pruned, { role: 'user', content: WRAP_UP_INSTRUCTIONS }],
|
|
91
|
-
activeTools: WRAP_UP_TOOLS.filter((name) => name in tools),
|
|
92
|
-
};
|
|
93
|
-
},
|
|
94
|
-
});
|
|
95
|
-
for await (const part of result.fullStream) {
|
|
96
|
-
switch (part.type) {
|
|
97
|
-
case 'text-delta':
|
|
98
|
-
partialText += part.text;
|
|
99
|
-
emit({ type: 'text_delta', messageId, text: part.text });
|
|
100
|
-
break;
|
|
101
|
-
case 'reasoning-delta':
|
|
102
|
-
emit({ type: 'reasoning_delta', messageId, text: part.text });
|
|
103
|
-
break;
|
|
104
|
-
case 'tool-call':
|
|
105
|
-
if (wrapUpFrom !== undefined && (part.toolName === 'publish_results' || part.toolName === 'write_files'))
|
|
106
|
-
saved = true;
|
|
107
|
-
emit({ type: 'tool_call_start', messageId, toolCallId: part.toolCallId, toolName: part.toolName, input: part.input });
|
|
108
|
-
break;
|
|
109
|
-
case 'tool-result':
|
|
110
|
-
emit({ type: 'tool_call_result', messageId, toolCallId: part.toolCallId, output: part.output });
|
|
111
|
-
break;
|
|
112
|
-
case 'tool-error':
|
|
113
|
-
emit({
|
|
114
|
-
type: 'tool_call_result', messageId, toolCallId: part.toolCallId,
|
|
115
|
-
error: part.error instanceof Error ? part.error.message : String(part.error),
|
|
116
|
-
});
|
|
117
|
-
break;
|
|
118
|
-
case 'finish-step': {
|
|
119
|
-
const usage = (0, usage_1.usageOf)(part);
|
|
95
|
+
let totalSteps = 0;
|
|
96
|
+
let text = '';
|
|
97
|
+
for (;;) {
|
|
98
|
+
abortSignal.throwIfAborted();
|
|
99
|
+
const tools = this.definition.createTools(context);
|
|
100
|
+
let wrapUpFrom;
|
|
101
|
+
const wrapUpDone = ({ steps }) => wrapUpFrom !== undefined ? steps.length - wrapUpFrom >= WRAP_UP_STEPS : !research && input.budgetExceeded();
|
|
102
|
+
const segmentBase = [...turn];
|
|
103
|
+
const segmentPrompt = await promptFor(segmentBase);
|
|
104
|
+
segmentSteps = [];
|
|
105
|
+
const result = (0, ai_1.streamText)({
|
|
106
|
+
model: (0, resolve_model_1.resolveLanguageModel)(model.provider, model.id, model.attribution),
|
|
107
|
+
system: input.instructions,
|
|
108
|
+
messages: segmentPrompt,
|
|
109
|
+
tools,
|
|
110
|
+
abortSignal,
|
|
111
|
+
stopWhen: [(0, ai_1.stepCountIs)(maxSteps), () => askedUser, wrapUpDone],
|
|
112
|
+
// Here rather than from the stream below, which runs behind: stopWhen must see this step's
|
|
113
|
+
// tokens, or a turn at its budget pays for one more model call.
|
|
114
|
+
onStepFinish: (step) => {
|
|
115
|
+
var _a, _b;
|
|
116
|
+
const usage = (0, usage_1.usageOf)(step);
|
|
120
117
|
if (usage)
|
|
121
|
-
recordUsage(usage, (_b = (_a =
|
|
122
|
-
|
|
118
|
+
recordUsage(usage, (_b = (_a = step.response) === null || _a === void 0 ? void 0 : _a.modelId) !== null && _b !== void 0 ? _b : model.id);
|
|
119
|
+
},
|
|
120
|
+
experimental_repairToolCall: tool_call_repair_1.repairStringifiedToolInput,
|
|
121
|
+
prepareStep: async ({ stepNumber, steps, messages }) => {
|
|
122
|
+
var _a, _b;
|
|
123
|
+
// `messages` is the segment's prompt plus the steps finished since; the latter are the
|
|
124
|
+
// part of the turn not persisted yet.
|
|
125
|
+
segmentSteps = messages.slice(segmentPrompt.length);
|
|
126
|
+
if (segmentSteps.length)
|
|
127
|
+
(_a = input.onStep) === null || _a === void 0 ? void 0 : _a.call(input, [...segmentBase, ...segmentSteps]);
|
|
128
|
+
const prompt = await promptFor([...segmentBase, ...segmentSteps]);
|
|
129
|
+
if (wrapUpFrom === undefined && research && (input.wrapUpOnly || ((_b = input.nearBudget) === null || _b === void 0 ? void 0 : _b.call(input))))
|
|
130
|
+
wrapUpFrom = stepNumber;
|
|
131
|
+
if (wrapUpFrom === undefined) {
|
|
132
|
+
// The chat pins the checklist; a stale one tells the user nothing is moving. The note is
|
|
133
|
+
// appended for this step only, after the cached prefix, and is never saved. Once every
|
|
134
|
+
// PROGRESS_REMINDER_STEPS quiet steps, so an agent whose phase has not changed is not nagged.
|
|
135
|
+
const since = stepsSinceProgress(steps);
|
|
136
|
+
const stale = research && 'report_progress' in tools && since > 0 && since % PROGRESS_REMINDER_STEPS === 0;
|
|
137
|
+
return { messages: stale ? [...prompt, { role: 'user', content: PROGRESS_REMINDER }] : prompt };
|
|
138
|
+
}
|
|
139
|
+
// The instructions go last, as a note, rather than into the system prompt: the model acts on
|
|
140
|
+
// the newest message (in one run it ignored a system-only switch and ended on leftover
|
|
141
|
+
// text), and the cached prefix stays intact. A forced tool call (toolChoice "required") is
|
|
142
|
+
// not an option: Anthropic rejects it while extended thinking is on.
|
|
143
|
+
return {
|
|
144
|
+
messages: saved ? prompt : [...prompt, { role: 'user', content: WRAP_UP_INSTRUCTIONS }],
|
|
145
|
+
activeTools: WRAP_UP_TOOLS.filter((name) => name in tools),
|
|
146
|
+
};
|
|
147
|
+
},
|
|
148
|
+
});
|
|
149
|
+
for await (const part of result.fullStream) {
|
|
150
|
+
switch (part.type) {
|
|
151
|
+
case 'text-delta':
|
|
152
|
+
partialText += part.text;
|
|
153
|
+
emit({ type: 'text_delta', messageId, text: part.text });
|
|
154
|
+
break;
|
|
155
|
+
case 'reasoning-delta':
|
|
156
|
+
emit({ type: 'reasoning_delta', messageId, text: part.text });
|
|
157
|
+
break;
|
|
158
|
+
case 'tool-input-start':
|
|
159
|
+
drafts === null || drafts === void 0 ? void 0 : drafts.start(part.id, part.toolName);
|
|
160
|
+
break;
|
|
161
|
+
case 'tool-input-delta':
|
|
162
|
+
drafts === null || drafts === void 0 ? void 0 : drafts.delta(part.id, part.delta);
|
|
163
|
+
break;
|
|
164
|
+
case 'tool-input-end':
|
|
165
|
+
await (drafts === null || drafts === void 0 ? void 0 : drafts.end(part.id));
|
|
166
|
+
break;
|
|
167
|
+
case 'tool-call':
|
|
168
|
+
if (wrapUpFrom !== undefined && (part.toolName === 'publish_results' || part.toolName === 'write_files'))
|
|
169
|
+
saved = true;
|
|
170
|
+
emit({ type: 'tool_call_start', messageId, toolCallId: part.toolCallId, toolName: part.toolName, input: part.input });
|
|
171
|
+
break;
|
|
172
|
+
case 'tool-result':
|
|
173
|
+
void (drafts === null || drafts === void 0 ? void 0 : drafts.settle(part.toolCallId));
|
|
174
|
+
emit({ type: 'tool_call_result', messageId, toolCallId: part.toolCallId, output: part.output });
|
|
175
|
+
break;
|
|
176
|
+
case 'tool-error':
|
|
177
|
+
void (drafts === null || drafts === void 0 ? void 0 : drafts.settle(part.toolCallId));
|
|
178
|
+
emit({
|
|
179
|
+
type: 'tool_call_result', messageId, toolCallId: part.toolCallId,
|
|
180
|
+
error: part.error instanceof Error ? part.error.message : String(part.error),
|
|
181
|
+
});
|
|
182
|
+
break;
|
|
183
|
+
case 'error':
|
|
184
|
+
throw part.error;
|
|
123
185
|
}
|
|
124
|
-
case 'error':
|
|
125
|
-
throw part.error;
|
|
126
186
|
}
|
|
187
|
+
abortSignal.throwIfAborted();
|
|
188
|
+
turn.push(...(await result.response).messages);
|
|
189
|
+
segmentSteps = [];
|
|
190
|
+
const steps = await result.steps;
|
|
191
|
+
totalSteps += steps.length;
|
|
192
|
+
text = await result.text;
|
|
193
|
+
wrappedUp || (wrappedUp = wrapUpFrom !== undefined);
|
|
194
|
+
// The loop ended at its step cap with the model mid-work: carry on in a new segment.
|
|
195
|
+
const atCap = steps.length >= maxSteps && (await result.finishReason) === 'tool-calls' && !askedUser && !wrappedUp;
|
|
196
|
+
if (!atCap)
|
|
197
|
+
break;
|
|
198
|
+
if (totalSteps >= maxTurnSteps) {
|
|
199
|
+
const note = `${partialText ? '\n\n' : ''}I have taken ${totalSteps} steps in this turn, the most one turn allows. My notes and files are saved; reply "continue" and I will carry on from here.`;
|
|
200
|
+
partialText += note;
|
|
201
|
+
text += note;
|
|
202
|
+
emit({ type: 'text_delta', messageId, text: note });
|
|
203
|
+
break;
|
|
204
|
+
}
|
|
205
|
+
(_b = input.onStep) === null || _b === void 0 ? void 0 : _b.call(input, turn);
|
|
127
206
|
}
|
|
128
|
-
|
|
129
|
-
responseMessages = (await result.response).messages;
|
|
130
|
-
const text = await result.text;
|
|
131
|
-
return { status: 'completed', messages: responseMessages, text, partialText, askedUser, wrappedUp: wrapUpFrom !== undefined, saved };
|
|
207
|
+
return { status: 'completed', messages: turn, text, partialText, askedUser, wrappedUp, saved };
|
|
132
208
|
}
|
|
133
209
|
catch (error) {
|
|
134
210
|
const aborted = abortSignal.aborted;
|
|
135
|
-
// A partial stream may end between a tool call and its result
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
211
|
+
// A partial stream may end between a tool call and its result, so only the finished steps are
|
|
212
|
+
// kept, followed by the text streamed since (or a marker), so the turn ends on an assistant message.
|
|
213
|
+
const messages = [
|
|
214
|
+
...turn,
|
|
215
|
+
...segmentSteps,
|
|
216
|
+
{ role: 'assistant', content: partialText || (aborted ? '(stopped by the user)' : '(turn failed)') },
|
|
217
|
+
];
|
|
218
|
+
const output = { messages, partialText, askedUser, wrappedUp, saved };
|
|
140
219
|
return aborted
|
|
141
220
|
? { ...output, status: 'aborted' }
|
|
142
221
|
: { ...output, status: 'failed', error: (0, model_failure_1.describeModelFailure)(error), userMessage: (_c = (0, model_failure_1.userFacingModelFailure)(error)) !== null && _c !== void 0 ? _c : (0, model_failure_1.describeModelFailure)(error) };
|
|
143
222
|
}
|
|
223
|
+
finally {
|
|
224
|
+
// A write_files call cut off before it ran must not leave its draft in the session.
|
|
225
|
+
await (drafts === null || drafts === void 0 ? void 0 : drafts.settleAll());
|
|
226
|
+
}
|
|
144
227
|
}
|
|
145
228
|
}
|
|
146
229
|
exports.TurnRunner = TurnRunner;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"turn-runner.js","sourceRoot":"","sources":["../../src/agent/turn-runner.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"turn-runner.js","sourceRoot":"","sources":["../../src/agent/turn-runner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import type http from 'node:http';
|
|
2
|
+
import type { Duplex } from 'node:stream';
|
|
3
|
+
import { type AgentAppStatus } from '../transport/protocol';
|
|
4
|
+
import { type AppRequestHandler } from '../runtime/preview-proxy';
|
|
5
|
+
import { type AppMode } from './config';
|
|
6
|
+
import { type AppRunnerOptions } from './runner';
|
|
7
|
+
export type AppHostOptions = Omit<AppRunnerOptions, 'onStatus'> & {
|
|
8
|
+
/** The `$schema` of the builder.json a session VM writes. */
|
|
9
|
+
schemaUrl?: string;
|
|
10
|
+
};
|
|
11
|
+
export declare class AppHost implements AppRequestHandler {
|
|
12
|
+
private readonly options;
|
|
13
|
+
private runner?;
|
|
14
|
+
private current;
|
|
15
|
+
private loading?;
|
|
16
|
+
/** The running app's framework and where its config came from, stamped on its every status. */
|
|
17
|
+
private identity?;
|
|
18
|
+
/** builder.json's text when the app was last loaded: a change to it restarts the app. */
|
|
19
|
+
private loadedManifest?;
|
|
20
|
+
private readonly listeners;
|
|
21
|
+
constructor(options: AppHostOptions);
|
|
22
|
+
get dir(): string;
|
|
23
|
+
get mode(): AppMode;
|
|
24
|
+
status(): AgentAppStatus | null;
|
|
25
|
+
onStatus(listener: (status: AgentAppStatus | null) => void): () => void;
|
|
26
|
+
private publish;
|
|
27
|
+
/**
|
|
28
|
+
* (Re)loads the app (in a session VM, writing its builder.json first) and runs it, stopping the
|
|
29
|
+
* one before. Resolves once its processes are launched (or it failed); null when there is no app.
|
|
30
|
+
*/
|
|
31
|
+
start(): Promise<AgentAppStatus | null>;
|
|
32
|
+
/**
|
|
33
|
+
* After a turn: brings builder.json in line with what the workspace now holds and starts the
|
|
34
|
+
* app when that changed, or nothing runs (a new app, or one that failed). A running app whose
|
|
35
|
+
* builder.json is unchanged keeps running; its dev servers pick up code changes themselves.
|
|
36
|
+
*/
|
|
37
|
+
refresh(): Promise<AgentAppStatus | null>;
|
|
38
|
+
private queue;
|
|
39
|
+
/** builder.json, written or updated first in a session VM (a deployment runs the release's as it is). */
|
|
40
|
+
private manifest;
|
|
41
|
+
private load;
|
|
42
|
+
/** Reports why the app can't run at all (its release couldn't be fetched, it holds no app). */
|
|
43
|
+
fail(error: string): void;
|
|
44
|
+
/** The current app's status once every service is up or has crashed, or after `timeoutMs`. */
|
|
45
|
+
settled(timeoutMs: number): Promise<AgentAppStatus | null>;
|
|
46
|
+
stop(): Promise<void>;
|
|
47
|
+
handleRequest(req: http.IncomingMessage, res: http.ServerResponse): boolean;
|
|
48
|
+
/** Answers from the first route; a static service without the file passes the request to the next. */
|
|
49
|
+
private answer;
|
|
50
|
+
handleUpgrade(req: http.IncomingMessage, socket: Duplex, head: Buffer): boolean;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* The guest's one app host for `dir` (the session's workspace), serving the session URL. The
|
|
54
|
+
* session runtime starts it at boot and the run_app tool restarts it; both get this instance.
|
|
55
|
+
*/
|
|
56
|
+
export declare function appHostFor(dir: string, create: () => AppHostOptions): AppHost;
|
|
57
|
+
//# sourceMappingURL=app-host.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"app-host.d.ts","sourceRoot":"","sources":["../../src/app/app-host.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,IAAI,MAAM,WAAW,CAAA;AAEjC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACzC,OAAO,EAAsE,KAAK,cAAc,EAAE,MAAM,uBAAuB,CAAA;AAC/H,OAAO,EAA6C,KAAK,iBAAiB,EAAE,MAAM,0BAA0B,CAAA;AAE5G,OAAO,EAA+B,KAAK,OAAO,EAAsB,MAAM,UAAU,CAAA;AAExF,OAAO,EAA4B,KAAK,gBAAgB,EAAE,MAAM,UAAU,CAAA;AAI1E,MAAM,MAAM,cAAc,GAAG,IAAI,CAAC,gBAAgB,EAAE,UAAU,CAAC,GAAG;IAChE,6DAA6D;IAC7D,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB,CAAA;AAqCD,qBAAa,OAAQ,YAAW,iBAAiB;IAUnC,OAAO,CAAC,QAAQ,CAAC,OAAO;IATpC,OAAO,CAAC,MAAM,CAAC,CAAW;IAC1B,OAAO,CAAC,OAAO,CAA8B;IAC7C,OAAO,CAAC,OAAO,CAAC,CAAgC;IAChD,+FAA+F;IAC/F,OAAO,CAAC,QAAQ,CAAC,CAA8C;IAC/D,yFAAyF;IACzF,OAAO,CAAC,cAAc,CAAC,CAAQ;IAC/B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAqD;gBAElD,OAAO,EAAE,cAAc;IAEpD,IAAI,GAAG,IAAI,MAAM,CAEhB;IAED,IAAI,IAAI,IAAI,OAAO,CAElB;IAED,MAAM,IAAI,cAAc,GAAG,IAAI;IAI/B,QAAQ,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,cAAc,GAAG,IAAI,KAAK,IAAI,GAAG,MAAM,IAAI;IAKvE,OAAO,CAAC,OAAO;IAOf;;;OAGG;IACH,KAAK,IAAI,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IAIvC;;;;OAIG;IACH,OAAO,IAAI,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IAQzC,OAAO,CAAC,KAAK;IAMb,yGAAyG;YAC3F,QAAQ;YAMR,IAAI;IA8BlB,+FAA+F;IAC/F,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAIzB,8FAA8F;IACxF,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IAO1D,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAQ3B,aAAa,CAAC,GAAG,EAAE,IAAI,CAAC,eAAe,EAAE,GAAG,EAAE,IAAI,CAAC,cAAc,GAAG,OAAO;IA6B3E,sGAAsG;IACtG,OAAO,CAAC,MAAM;IAqBd,aAAa,CAAC,GAAG,EAAE,IAAI,CAAC,eAAe,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO;CAYhF;AAID;;;GAGG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,cAAc,GAAG,OAAO,CAQ7E"}
|