mindweave 2.5.0 → 3.0.0
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 +81 -145
- package/dist/cli/App.js +579 -304
- package/dist/cli/App.js.map +1 -1
- package/dist/cli/analytics.js +27 -18
- package/dist/cli/analytics.js.map +1 -1
- package/dist/cli/attachments.js +34 -0
- package/dist/cli/attachments.js.map +1 -1
- package/dist/cli/bannerFit.js +70 -0
- package/dist/cli/bannerFit.js.map +1 -0
- package/dist/cli/bootstrap.js +41 -3
- package/dist/cli/bootstrap.js.map +1 -1
- package/dist/cli/commands.js +4 -1
- package/dist/cli/commands.js.map +1 -1
- package/dist/cli/components/ApprovalBox.js +3 -2
- package/dist/cli/components/ApprovalBox.js.map +1 -1
- package/dist/cli/components/BlockView.js +27 -6
- package/dist/cli/components/BlockView.js.map +1 -1
- package/dist/cli/components/FirstRunFrame.js +2 -1
- package/dist/cli/components/FirstRunFrame.js.map +1 -1
- package/dist/cli/components/KeyManager.js +5 -4
- package/dist/cli/components/KeyManager.js.map +1 -1
- package/dist/cli/components/KeySetup.js +29 -13
- package/dist/cli/components/KeySetup.js.map +1 -1
- package/dist/cli/components/MarathonBox.js +64 -0
- package/dist/cli/components/MarathonBox.js.map +1 -0
- package/dist/cli/components/McpMinitabs.js +8 -7
- package/dist/cli/components/McpMinitabs.js.map +1 -1
- package/dist/cli/components/Picker.js +4 -3
- package/dist/cli/components/Picker.js.map +1 -1
- package/dist/cli/components/PromptInput.js +47 -8
- package/dist/cli/components/PromptInput.js.map +1 -1
- package/dist/cli/components/PulseDot.js +42 -0
- package/dist/cli/components/PulseDot.js.map +1 -0
- package/dist/cli/components/SubagentView.js +9 -6
- package/dist/cli/components/SubagentView.js.map +1 -1
- package/dist/cli/components/TipLine.js +2 -1
- package/dist/cli/components/TipLine.js.map +1 -1
- package/dist/cli/components/ToolGroup.js +65 -49
- package/dist/cli/components/ToolGroup.js.map +1 -1
- package/dist/cli/components/ToolLine.js +20 -19
- package/dist/cli/components/ToolLine.js.map +1 -1
- package/dist/cli/components/TrustGate.js +2 -1
- package/dist/cli/components/TrustGate.js.map +1 -1
- package/dist/cli/components/minitabs.js +3 -2
- package/dist/cli/components/minitabs.js.map +1 -1
- package/dist/cli/desktopApp.js +45 -0
- package/dist/cli/desktopApp.js.map +1 -0
- package/dist/cli/help.js +1 -0
- package/dist/cli/help.js.map +1 -1
- package/dist/cli/inkOutputPatch.js +285 -0
- package/dist/cli/inkOutputPatch.js.map +1 -0
- package/dist/cli/inkSpeed.js +29 -0
- package/dist/cli/inkSpeed.js.map +1 -0
- package/dist/cli/inkSpeedLoader.js +47 -0
- package/dist/cli/inkSpeedLoader.js.map +1 -0
- package/dist/cli/inputText.js +30 -0
- package/dist/cli/inputText.js.map +1 -0
- package/dist/cli/keyManager.js +2 -1
- package/dist/cli/keyManager.js.map +1 -1
- package/dist/cli/keyPrefs.js +90 -0
- package/dist/cli/keyPrefs.js.map +1 -0
- package/dist/cli/keySetup.js +5 -2
- package/dist/cli/keySetup.js.map +1 -1
- package/dist/cli/marathonUi.js +113 -0
- package/dist/cli/marathonUi.js.map +1 -0
- package/dist/cli/markdown.js +63 -11
- package/dist/cli/markdown.js.map +1 -1
- package/dist/cli/modes.js +3 -3
- package/dist/cli/modes.js.map +1 -1
- package/dist/cli/prodEnv.js +43 -0
- package/dist/cli/prodEnv.js.map +1 -0
- package/dist/cli/revealPace.js +5 -5
- package/dist/cli/revealPace.js.map +1 -1
- package/dist/cli/revealQueue.js +120 -0
- package/dist/cli/revealQueue.js.map +1 -0
- package/dist/cli/theme.js +47 -0
- package/dist/cli/theme.js.map +1 -0
- package/dist/cli/toolDisplay.js +112 -18
- package/dist/cli/toolDisplay.js.map +1 -1
- package/dist/cli/transcript.js +1 -1
- package/dist/cli/transcript.js.map +1 -1
- package/dist/cli/virtualWindow.js +14 -2
- package/dist/cli/virtualWindow.js.map +1 -1
- package/dist/cli/wheelAccel.js +73 -0
- package/dist/cli/wheelAccel.js.map +1 -0
- package/dist/cli/widestLinePatch.js +48 -0
- package/dist/cli/widestLinePatch.js.map +1 -0
- package/dist/cli/workingVerb.js +88 -28
- package/dist/cli/workingVerb.js.map +1 -1
- package/dist/cli/wrap.js +1 -1
- package/dist/cli/wrap.js.map +1 -1
- package/dist/core/contextSettings.js +84 -0
- package/dist/core/contextSettings.js.map +1 -0
- package/dist/core/limitsView.js +40 -0
- package/dist/core/limitsView.js.map +1 -0
- package/dist/core/mcpServers.js +164 -0
- package/dist/core/mcpServers.js.map +1 -0
- package/dist/core/permissions.js +209 -0
- package/dist/core/permissions.js.map +1 -0
- package/dist/core/providerKeys.js +187 -0
- package/dist/core/providerKeys.js.map +1 -0
- package/dist/core/rulesSkills.js +142 -0
- package/dist/core/rulesSkills.js.map +1 -0
- package/dist/core/spendView.js +90 -0
- package/dist/core/spendView.js.map +1 -0
- package/dist/core/turnRunner.js +759 -0
- package/dist/core/turnRunner.js.map +1 -0
- package/dist/drivers/anthropic/client.js +101 -26
- package/dist/drivers/anthropic/client.js.map +1 -1
- package/dist/drivers/anthropic/manifest.js +43 -13
- package/dist/drivers/anthropic/manifest.js.map +1 -1
- package/dist/drivers/cerebras/manifest.js +13 -3
- package/dist/drivers/cerebras/manifest.js.map +1 -1
- package/dist/drivers/deepseek/manifest.js +24 -34
- package/dist/drivers/deepseek/manifest.js.map +1 -1
- package/dist/drivers/glm/manifest.js +21 -6
- package/dist/drivers/glm/manifest.js.map +1 -1
- package/dist/drivers/groq/manifest.js +5 -2
- package/dist/drivers/groq/manifest.js.map +1 -1
- package/dist/drivers/kimi/manifest.js +13 -10
- package/dist/drivers/kimi/manifest.js.map +1 -1
- package/dist/drivers/meta/manifest.js +21 -16
- package/dist/drivers/meta/manifest.js.map +1 -1
- package/dist/drivers/minimax/manifest.js +15 -12
- package/dist/drivers/minimax/manifest.js.map +1 -1
- package/dist/drivers/ollama/catalog.js +71 -0
- package/dist/drivers/ollama/catalog.js.map +1 -0
- package/dist/drivers/ollama/client.js +164 -0
- package/dist/drivers/ollama/client.js.map +1 -0
- package/dist/drivers/ollama/endpoint.js +42 -0
- package/dist/drivers/ollama/endpoint.js.map +1 -0
- package/dist/drivers/ollama/index.js +5 -0
- package/dist/drivers/ollama/index.js.map +1 -0
- package/dist/drivers/ollama/manifest.js +64 -0
- package/dist/drivers/ollama/manifest.js.map +1 -0
- package/dist/drivers/openai/client.js +10 -4
- package/dist/drivers/openai/client.js.map +1 -1
- package/dist/drivers/openai/manifest.js +69 -18
- package/dist/drivers/openai/manifest.js.map +1 -1
- package/dist/drivers/qwen/manifest.js +19 -6
- package/dist/drivers/qwen/manifest.js.map +1 -1
- package/dist/drivers/registry.js +11 -0
- package/dist/drivers/registry.js.map +1 -1
- package/dist/drivers/retryPolicy.js +26 -1
- package/dist/drivers/retryPolicy.js.map +1 -1
- package/dist/drivers/xai/client.js +12 -10
- package/dist/drivers/xai/client.js.map +1 -1
- package/dist/drivers/xai/manifest.js +62 -25
- package/dist/drivers/xai/manifest.js.map +1 -1
- package/dist/dynamo/auxModel.js +54 -0
- package/dist/dynamo/auxModel.js.map +1 -0
- package/dist/dynamo/engine.js +407 -99
- package/dist/dynamo/engine.js.map +1 -1
- package/dist/dynamo/guard.js +10 -0
- package/dist/dynamo/guard.js.map +1 -1
- package/dist/dynamo/liveMeter.js +25 -6
- package/dist/dynamo/liveMeter.js.map +1 -1
- package/dist/dynamo/marathon.js +409 -0
- package/dist/dynamo/marathon.js.map +1 -0
- package/dist/dynamo/marathonPrompt.js +45 -0
- package/dist/dynamo/marathonPrompt.js.map +1 -0
- package/dist/dynamo/model.js +6 -2
- package/dist/dynamo/model.js.map +1 -1
- package/dist/dynamo/toolBatches.js +58 -0
- package/dist/dynamo/toolBatches.js.map +1 -0
- package/dist/dynamo/usageLimits.js +446 -0
- package/dist/dynamo/usageLimits.js.map +1 -0
- package/dist/governor/freshness.js +10 -7
- package/dist/governor/freshness.js.map +1 -1
- package/dist/governor/index.js +76 -9
- package/dist/governor/index.js.map +1 -1
- package/dist/governor/write.js +43 -14
- package/dist/governor/write.js.map +1 -1
- package/dist/index.js +18 -151
- package/dist/index.js.map +1 -1
- package/dist/main.js +162 -0
- package/dist/main.js.map +1 -0
- package/dist/mcp/manager.js +18 -0
- package/dist/mcp/manager.js.map +1 -1
- package/dist/memory/allMetas.js +69 -0
- package/dist/memory/allMetas.js.map +1 -0
- package/dist/memory/compaction.js +70 -15
- package/dist/memory/compaction.js.map +1 -1
- package/dist/memory/earlier.js +15 -0
- package/dist/memory/earlier.js.map +1 -0
- package/dist/memory/profile.js +93 -0
- package/dist/memory/profile.js.map +1 -0
- package/dist/memory/rewind.js +262 -0
- package/dist/memory/rewind.js.map +1 -0
- package/dist/memory/session.js +42 -10
- package/dist/memory/session.js.map +1 -1
- package/dist/memory/sessionMemory.js +48 -13
- package/dist/memory/sessionMemory.js.map +1 -1
- package/dist/memory/sessionMemoryCompact.js +1 -1
- package/dist/memory/sessionMemoryCompact.js.map +1 -1
- package/dist/memory/sessionTitle.js +50 -0
- package/dist/memory/sessionTitle.js.map +1 -0
- package/dist/memory/store.js +42 -1
- package/dist/memory/store.js.map +1 -1
- package/dist/memory/types.js.map +1 -1
- package/dist/tools/askUser.js +14 -0
- package/dist/tools/askUser.js.map +1 -1
- package/dist/tools/backgroundShells.js +208 -5
- package/dist/tools/backgroundShells.js.map +1 -1
- package/dist/tools/browser.js +176 -0
- package/dist/tools/browser.js.map +1 -0
- package/dist/tools/cdp.js +165 -0
- package/dist/tools/cdp.js.map +1 -0
- package/dist/tools/checkpoints.js +208 -5
- package/dist/tools/checkpoints.js.map +1 -1
- package/dist/tools/deferredNative.js +2 -0
- package/dist/tools/deferredNative.js.map +1 -1
- package/dist/tools/detail.js +9 -6
- package/dist/tools/detail.js.map +1 -1
- package/dist/tools/edit.js +2 -1
- package/dist/tools/edit.js.map +1 -1
- package/dist/tools/exitPlan.js +4 -0
- package/dist/tools/exitPlan.js.map +1 -1
- package/dist/tools/hiddenDesktop.js +273 -0
- package/dist/tools/hiddenDesktop.js.map +1 -0
- package/dist/tools/listeningPorts.js +134 -0
- package/dist/tools/listeningPorts.js.map +1 -0
- package/dist/tools/mcpSearch.js +8 -0
- package/dist/tools/mcpSearch.js.map +1 -1
- package/dist/tools/mindweaveStatus.js +1 -1
- package/dist/tools/mindweaveStatus.js.map +1 -1
- package/dist/tools/registry.js +3 -0
- package/dist/tools/registry.js.map +1 -1
- package/dist/tools/replaceSymbol.js +2 -1
- package/dist/tools/replaceSymbol.js.map +1 -1
- package/dist/tools/runCommand.js +113 -9
- package/dist/tools/runCommand.js.map +1 -1
- package/dist/tools/screenshot.js +4 -6
- package/dist/tools/screenshot.js.map +1 -1
- package/dist/tools/screenshotWin.js +26 -9
- package/dist/tools/screenshotWin.js.map +1 -1
- package/dist/tools/stateCheckpoint.js +128 -0
- package/dist/tools/stateCheckpoint.js.map +1 -0
- package/dist/tools/todo.js +6 -0
- package/dist/tools/todo.js.map +1 -1
- package/dist/tools/ui.js +1295 -0
- package/dist/tools/ui.js.map +1 -0
- package/dist/tools/uiHide.js +356 -0
- package/dist/tools/uiHide.js.map +1 -0
- package/dist/tools/uiPage.js +861 -0
- package/dist/tools/uiPage.js.map +1 -0
- package/dist/tools/uiWin.js +506 -0
- package/dist/tools/uiWin.js.map +1 -0
- package/dist/tools/webFetch.js +32 -25
- package/dist/tools/webFetch.js.map +1 -1
- package/dist/tools/webSearch.js +12 -0
- package/dist/tools/webSearch.js.map +1 -1
- package/dist/tools/writeFile.js +2 -1
- package/dist/tools/writeFile.js.map +1 -1
- package/package.json +78 -75
|
@@ -0,0 +1,409 @@
|
|
|
1
|
+
import { forkSession } from "../memory/session.js";
|
|
2
|
+
import { respond } from "./engine.js";
|
|
3
|
+
import { summarizeTask, taskLimitReason } from "./pricing.js";
|
|
4
|
+
import { VERIFIER_PROMPT, VERDICT_INSTRUCTION, parseVerdict } from "../tools/verifyReport.js";
|
|
5
|
+
/** How many consecutive non-passing verifications before Marathon gives up and
|
|
6
|
+
* hands back to the user, rather than retry the same goal forever. Same shape as
|
|
7
|
+
* `engine.ts`'s own `MAX_COMPACT_FAILURES` circuit breaker — a small, named
|
|
8
|
+
* constant, not a magic number buried in a condition. */
|
|
9
|
+
export const MAX_MARATHON_VERIFY_FAILS = 10;
|
|
10
|
+
/** Tool-round budget for the verification sub-agent. Generous on purpose: proving
|
|
11
|
+
* a goal is really done can mean running a build, a full test suite, AND trying
|
|
12
|
+
* to break the result — the same adversarial bar `verify:true` always sets. */
|
|
13
|
+
const VERIFY_BUDGET = 40;
|
|
14
|
+
/** How many recent transcript entries `runMarathon` hands to `detectStuck` after
|
|
15
|
+
* every turn. Generous enough to contain the longest pattern it looks for (the
|
|
16
|
+
* 6-step ping-pong) with room either side; cheap since it's a slice, not a scan
|
|
17
|
+
* of the whole session. */
|
|
18
|
+
const STUCK_WINDOW = 40;
|
|
19
|
+
/** Default wait before retrying after a `backgroundPoll` pause — nothing changed,
|
|
20
|
+
* so there is no reason to spin immediately; not so long that a quick shell makes
|
|
21
|
+
* the whole run feel stalled. */
|
|
22
|
+
const DEFAULT_BACKGROUND_POLL_WAIT_MS = 5_000;
|
|
23
|
+
/** A fresh Marathon over `goal`, not yet run. */
|
|
24
|
+
export function initMarathon(goal) {
|
|
25
|
+
return { goal, startedAt: Date.now(), turnsSpent: 0, resumes: 0, consecutiveVerifyFails: 0, status: "running" };
|
|
26
|
+
}
|
|
27
|
+
// ---------------------------------------------------------------------------
|
|
28
|
+
// Stuck detection (pure) — fixed numeric thresholds, checked directly against
|
|
29
|
+
// Mindweave's full transcript.
|
|
30
|
+
// ---------------------------------------------------------------------------
|
|
31
|
+
const SAME_RESULT_LIMIT = 4; // identical action -> identical observation, repeated
|
|
32
|
+
const SAME_ERROR_LIMIT = 3; // identical action -> an error, repeated
|
|
33
|
+
const NO_PROGRESS_LIMIT = 3; // consecutive assistant turns with no tool call at all
|
|
34
|
+
const PING_PONG_LIMIT = 6; // A,B,A,B,... alternating between the same two actions
|
|
35
|
+
/** Tools whose repeated, identical answer is what WAITING looks like rather than being
|
|
36
|
+
* stuck: polling a running background command returns the same "still running" until
|
|
37
|
+
* it isn't. Left in, a two-minute build would trip the same-result rule in seconds. */
|
|
38
|
+
const WAIT_TOOLS = new Set(["shells"]);
|
|
39
|
+
/** Pair every tool result with the call that produced it, in transcript order. A
|
|
40
|
+
* result with no matching call (shouldn't happen, but a resumed/edited session
|
|
41
|
+
* is not something to trust blindly) is simply skipped rather than crashing. */
|
|
42
|
+
function toolSteps(entries) {
|
|
43
|
+
const calls = new Map(); // call id -> signature
|
|
44
|
+
const steps = [];
|
|
45
|
+
for (const e of entries) {
|
|
46
|
+
if (e.role === "assistant") {
|
|
47
|
+
for (const call of e.toolCalls ?? []) {
|
|
48
|
+
if (!WAIT_TOOLS.has(call.name))
|
|
49
|
+
calls.set(call.id, `${call.name}:${call.arguments}`);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
else if (e.role === "tool") {
|
|
53
|
+
const sig = calls.get(e.toolCallId);
|
|
54
|
+
if (sig !== undefined)
|
|
55
|
+
steps.push({ sig, result: e.content, isError: e.isError === true });
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
return steps;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Is the tail of this transcript a genuinely stuck loop, not just ordinary work?
|
|
62
|
+
* Pure — takes whatever slice the caller hands it (`runMarathon` passes the most
|
|
63
|
+
* recent `STUCK_WINDOW` entries), so it's fully testable with hand-built fixtures.
|
|
64
|
+
*
|
|
65
|
+
* Checked in this order because they're independent failure shapes, not a
|
|
66
|
+
* priority ranking — the first one that matches is reported, since one honest
|
|
67
|
+
* reason is more useful than a list of everything that happened to also be true.
|
|
68
|
+
*/
|
|
69
|
+
export function detectStuck(recent) {
|
|
70
|
+
const steps = toolSteps(recent);
|
|
71
|
+
const lastSame = steps.slice(-SAME_RESULT_LIMIT);
|
|
72
|
+
if (lastSame.length === SAME_RESULT_LIMIT && lastSame.every((s) => s.sig === lastSame[0].sig && s.result === lastSame[0].result)) {
|
|
73
|
+
return { stuck: true, reason: `the same action produced the exact same result ${SAME_RESULT_LIMIT} times in a row` };
|
|
74
|
+
}
|
|
75
|
+
const lastError = steps.slice(-SAME_ERROR_LIMIT);
|
|
76
|
+
if (lastError.length === SAME_ERROR_LIMIT && lastError.every((s) => s.sig === lastError[0].sig && s.isError)) {
|
|
77
|
+
return { stuck: true, reason: `the same action failed the same way ${SAME_ERROR_LIMIT} times in a row` };
|
|
78
|
+
}
|
|
79
|
+
const assistantEntries = recent.filter((e) => e.role === "assistant");
|
|
80
|
+
const lastAssistant = assistantEntries.slice(-NO_PROGRESS_LIMIT);
|
|
81
|
+
if (lastAssistant.length === NO_PROGRESS_LIMIT &&
|
|
82
|
+
lastAssistant.every((e) => e.role === "assistant" && (!e.toolCalls || e.toolCalls.length === 0))) {
|
|
83
|
+
return { stuck: true, reason: `${NO_PROGRESS_LIMIT} messages in a row with no action taken` };
|
|
84
|
+
}
|
|
85
|
+
const lastPingPong = steps.slice(-PING_PONG_LIMIT);
|
|
86
|
+
if (lastPingPong.length === PING_PONG_LIMIT) {
|
|
87
|
+
const [a, b] = [lastPingPong[0].sig, lastPingPong[1].sig];
|
|
88
|
+
if (a !== b && lastPingPong.every((s, i) => s.sig === (i % 2 === 0 ? a : b))) {
|
|
89
|
+
return { stuck: true, reason: `alternating between the same two actions with no progress` };
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
return { stuck: false };
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* The whole state machine, in one place. Order matters: budget and stuck are
|
|
96
|
+
* checked FIRST and unconditionally, because both mean "stop no matter what the
|
|
97
|
+
* turn itself claimed" — a turn that happens to also look done while the goal is
|
|
98
|
+
* over budget is still over budget.
|
|
99
|
+
*/
|
|
100
|
+
export function decide(inputs) {
|
|
101
|
+
if (inputs.budgetExceeded)
|
|
102
|
+
return { action: "stop", status: "budgetExceeded", reason: inputs.budgetExceeded };
|
|
103
|
+
if (inputs.stuck.stuck)
|
|
104
|
+
return { action: "stop", status: "stuck", reason: inputs.stuck.reason };
|
|
105
|
+
switch (inputs.pauseReason) {
|
|
106
|
+
// The user's own usage limit held the run: handled by the loop before it ever asks here
|
|
107
|
+
// (the run stays resumable), and listed so this switch stays exhaustive.
|
|
108
|
+
case "limit":
|
|
109
|
+
return { action: "wait" };
|
|
110
|
+
// The engine's OWN repeated-failure breaker already gave up on this exact
|
|
111
|
+
// approach — nothing left for Marathon to try alone.
|
|
112
|
+
case "repeatedFailure":
|
|
113
|
+
return { action: "stop", status: "stuck", reason: "the same step failed repeatedly and the engine's own breaker stopped retrying it" };
|
|
114
|
+
// A provider safety refusal is a decision, not a glitch — no amount of
|
|
115
|
+
// auto-resuming changes a "no".
|
|
116
|
+
case "refused":
|
|
117
|
+
return { action: "stop", status: "blocked", reason: "the model's provider declined the request" };
|
|
118
|
+
// The engine's automatic overflow-and-retry already ran once and the
|
|
119
|
+
// conversation still didn't fit — a second blind attempt is likely to repeat it.
|
|
120
|
+
case "overflow":
|
|
121
|
+
return { action: "stop", status: "stuck", reason: "the conversation stopped fitting the model's context window even after the engine's own automatic recovery" };
|
|
122
|
+
// A hard, admin-set ceiling (env-configured, not Marathon's own) fired —
|
|
123
|
+
// treat it exactly like Marathon's own budget running out.
|
|
124
|
+
case "costTimeLimit":
|
|
125
|
+
return { action: "stop", status: "budgetExceeded", reason: "hit the engine's own cost/time ceiling" };
|
|
126
|
+
// Transient: an output cutoff or a provider infra hiccup. Nothing is wrong
|
|
127
|
+
// with the goal — just pick the turn back up.
|
|
128
|
+
case "truncated":
|
|
129
|
+
case "overloaded":
|
|
130
|
+
case "stepBudget":
|
|
131
|
+
return { action: "resume" };
|
|
132
|
+
// Nothing to do but wait for a shell that's already running.
|
|
133
|
+
case "backgroundPoll":
|
|
134
|
+
return { action: "wait" };
|
|
135
|
+
// The model itself signalled it thinks the stated scope is done (re-scope
|
|
136
|
+
// guard), or it just stopped talking with no pause at all — both are "looks
|
|
137
|
+
// done" claims, and per this whole design's first principle, a claim is not
|
|
138
|
+
// a fact until something independent checks it.
|
|
139
|
+
case "reScope":
|
|
140
|
+
case null:
|
|
141
|
+
return { action: "verify" };
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
// ---------------------------------------------------------------------------
|
|
145
|
+
// Verification — the ONLY "is it really done" check. Reuses `spawn_subagent`'s
|
|
146
|
+
// own verifier primitive (`forkSession` + the VERIFIER_PROMPT/VERDICT contract
|
|
147
|
+
// from tools/verifyReport.ts) directly, exactly as the model itself would if it
|
|
148
|
+
// called spawn_subagent with verify:true — no second verification mechanism.
|
|
149
|
+
// ---------------------------------------------------------------------------
|
|
150
|
+
export async function verifyGoal(session, goal, options = {}) {
|
|
151
|
+
const task = `Verify whether this goal has actually been achieved:\n\n${goal}\n\n${VERDICT_INSTRUCTION}`;
|
|
152
|
+
const child = forkSession(session, task, { readOnly: true, agentPrompt: VERIFIER_PROMPT });
|
|
153
|
+
const reply = await respond(child, { signal: options.signal, maxSteps: VERIFY_BUDGET, ...(options.onEvent ? { onEvent: options.onEvent } : {}) });
|
|
154
|
+
return parseVerdict(reply);
|
|
155
|
+
}
|
|
156
|
+
const PAUSE_WORDS = {
|
|
157
|
+
stepBudget: "step limit reached",
|
|
158
|
+
truncated: "reply was cut off",
|
|
159
|
+
overloaded: "provider was busy",
|
|
160
|
+
};
|
|
161
|
+
/** One line for a progress event, the same wording everywhere. */
|
|
162
|
+
export function describeMarathonEvent(e) {
|
|
163
|
+
switch (e.type) {
|
|
164
|
+
case "started":
|
|
165
|
+
return "Marathon started";
|
|
166
|
+
case "resumed":
|
|
167
|
+
return `Marathon resumed at turn ${e.turnsSpent + 1}`;
|
|
168
|
+
case "turn":
|
|
169
|
+
return e.phase === "plan" ? "Understanding the goal (questions open)" : `Working, turn ${e.n}`;
|
|
170
|
+
case "planned":
|
|
171
|
+
return "Questions closed, running on its own";
|
|
172
|
+
case "continuing":
|
|
173
|
+
return `Continuing (${PAUSE_WORDS[e.reason] ?? "paused"})`;
|
|
174
|
+
case "waiting":
|
|
175
|
+
return "Waiting on a background command";
|
|
176
|
+
case "verifying":
|
|
177
|
+
return "Checking the goal is really done";
|
|
178
|
+
case "verifyStep":
|
|
179
|
+
return `Checking: ${e.line}`;
|
|
180
|
+
case "verified":
|
|
181
|
+
return e.passed ? "Verified" : `Not done yet (${e.failsInARow} of ${MAX_MARATHON_VERIFY_FAILS} checks)`;
|
|
182
|
+
case "finished":
|
|
183
|
+
return e.status === "done"
|
|
184
|
+
? "Goal verified done"
|
|
185
|
+
: e.status === "blocked"
|
|
186
|
+
? `Needs you: ${e.outcome}`
|
|
187
|
+
: e.status === "stuck"
|
|
188
|
+
? `Stopped, stuck: ${e.outcome}`
|
|
189
|
+
: `Stopped, over budget: ${e.outcome}`;
|
|
190
|
+
case "paused":
|
|
191
|
+
return e.reason === "limit" ? "Paused: your usage limit is reached" : "Paused";
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
const defaultDeps = {
|
|
195
|
+
respond,
|
|
196
|
+
verify: verifyGoal,
|
|
197
|
+
sleep: (ms) => new Promise((resolve) => setTimeout(resolve, ms)),
|
|
198
|
+
};
|
|
199
|
+
/** The tools a run leans on are deferred (their schemas are not advertised until the
|
|
200
|
+
* model searches for them). A Marathon needs them from the first request. */
|
|
201
|
+
const MARATHON_TOOLS = ["todo_write"];
|
|
202
|
+
/** Pauses that end a run even from its opening turn: nothing about the goal is worth
|
|
203
|
+
* carrying on past them. Every other way the opening turn can end just means "planned". */
|
|
204
|
+
const HARD_STOPS = new Set(["refused", "repeatedFailure", "overflow", "costTimeLimit"]);
|
|
205
|
+
/** What the model is told when a stopped run is carried on: pick up, do not start over. */
|
|
206
|
+
const RESUME_NOTE = "Carry on from where you stopped. Take the next task on your list that is not finished yet. Do not redo work that is already done, and do not stop to ask whether to continue.";
|
|
207
|
+
/** What the model is told when the opening turn hands over to the run. */
|
|
208
|
+
const BEGIN_WORK = "Questions are closed. Begin the work now, following your plan, and keep going until the goal is done.";
|
|
209
|
+
/**
|
|
210
|
+
* Run (or resume) a goal to one of its stop conditions.
|
|
211
|
+
*
|
|
212
|
+
* Reentrant by construction: if `session.marathon` already exists and is still
|
|
213
|
+
* "running" (e.g. the process restarted mid-goal), this picks up exactly where it
|
|
214
|
+
* left off — same counters, same goal — rather than starting over. If it already
|
|
215
|
+
* left "running" (a prior run finished, blocked, got stuck, or ran out of budget),
|
|
216
|
+
* this returns that state immediately and does nothing. A NEW goal goes through
|
|
217
|
+
* `startMarathon`, which replaces whatever is there.
|
|
218
|
+
*/
|
|
219
|
+
export async function runMarathon(session, goal, options = {}, deps = defaultDeps) {
|
|
220
|
+
try {
|
|
221
|
+
return await runLoop(session, goal, options, deps);
|
|
222
|
+
}
|
|
223
|
+
finally {
|
|
224
|
+
// Whichever way the run ended (outcome, stop, error), a normal chat afterwards can ask again.
|
|
225
|
+
session.toolContext.noQuestions = false;
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
async function runLoop(session, goal, options, deps) {
|
|
229
|
+
const resumed = session.marathon !== undefined;
|
|
230
|
+
const state = session.marathon ?? initMarathon(goal);
|
|
231
|
+
session.marathon = state;
|
|
232
|
+
const emit = options.onMarathon;
|
|
233
|
+
if (state.status === "running") {
|
|
234
|
+
for (const tool of MARATHON_TOOLS)
|
|
235
|
+
session.toolContext.activatedTools?.add(tool);
|
|
236
|
+
emit?.(resumed && state.turnsSpent > 0
|
|
237
|
+
? { type: "resumed", goal: state.goal, turnsSpent: state.turnsSpent }
|
|
238
|
+
: { type: "started", goal: state.goal });
|
|
239
|
+
}
|
|
240
|
+
const usages = [];
|
|
241
|
+
// Feedback from a non-passing verification, queued for the NEXT turn rather than
|
|
242
|
+
// pushed immediately — the turn that just ran already recorded its own pause
|
|
243
|
+
// message; this is what the model reads when it's asked to continue.
|
|
244
|
+
let pendingFeedback = null;
|
|
245
|
+
if (state.status === "running") {
|
|
246
|
+
if (state.turnsSpent === 0 && state.goalSent) {
|
|
247
|
+
// Stopped while it was still understanding the goal. Questions are closed for a resumed run,
|
|
248
|
+
// so the plan is finished by working, not by asking again.
|
|
249
|
+
state.turnsSpent = 1;
|
|
250
|
+
pendingFeedback = BEGIN_WORK;
|
|
251
|
+
}
|
|
252
|
+
else if (state.turnsSpent > 0) {
|
|
253
|
+
pendingFeedback = RESUME_NOTE;
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
while (state.status === "running") {
|
|
257
|
+
if (options.signal?.aborted)
|
|
258
|
+
break; // a real stop, not a Marathon decision — leave "running" so a later call can resume it
|
|
259
|
+
const message = state.turnsSpent === 0 ? state.goal : pendingFeedback ?? "continue";
|
|
260
|
+
session.transcript.push({
|
|
261
|
+
role: "user",
|
|
262
|
+
content: message,
|
|
263
|
+
...(state.turnsSpent > 0 ? { synthetic: true } : {}), // the goal itself is the user's own ask; every nudge after it is Marathon's
|
|
264
|
+
...(state.turnsSpent === 0 && options.goalImages?.length ? { images: options.goalImages } : {}),
|
|
265
|
+
});
|
|
266
|
+
if (state.turnsSpent === 0)
|
|
267
|
+
state.goalSent = true;
|
|
268
|
+
await options.persist?.(); // the goal, or the nudge, is on disk before the model is asked anything
|
|
269
|
+
pendingFeedback = null;
|
|
270
|
+
// The opening turn is the only one where the model may ask anything: enforced by the
|
|
271
|
+
// tool itself (noQuestions) and by not advertising it, not just by what the model is told.
|
|
272
|
+
const planning = state.turnsSpent === 0;
|
|
273
|
+
session.toolContext.noQuestions = !planning;
|
|
274
|
+
if (planning)
|
|
275
|
+
session.toolContext.activatedTools?.add("ask_user");
|
|
276
|
+
else
|
|
277
|
+
session.toolContext.activatedTools?.delete("ask_user");
|
|
278
|
+
emit?.({ type: "turn", n: state.turnsSpent + 1, phase: planning ? "plan" : "work" });
|
|
279
|
+
let pauseReason = null;
|
|
280
|
+
await deps.respond(session, {
|
|
281
|
+
signal: options.signal,
|
|
282
|
+
persist: options.persist,
|
|
283
|
+
onActivity: options.onActivity,
|
|
284
|
+
onCompaction: options.onCompaction,
|
|
285
|
+
onCompactionStart: options.onCompactionStart,
|
|
286
|
+
onCompactionEnd: options.onCompactionEnd,
|
|
287
|
+
...(options.steer ? { steer: options.steer } : {}),
|
|
288
|
+
onEvent: (e) => {
|
|
289
|
+
if (e.type === "usage")
|
|
290
|
+
usages.push(e);
|
|
291
|
+
else if (e.type === "todos")
|
|
292
|
+
state.todos = e.items;
|
|
293
|
+
options.onEvent?.(e);
|
|
294
|
+
},
|
|
295
|
+
onPause: (reason) => {
|
|
296
|
+
pauseReason = reason;
|
|
297
|
+
},
|
|
298
|
+
});
|
|
299
|
+
// Esc mid-turn ends respond() with no pause and no finished answer, which the
|
|
300
|
+
// decision below would read as "looks done" and spend a verification on. A stop
|
|
301
|
+
// the user asked for is not an outcome: leave the run resumable and say so.
|
|
302
|
+
if (options.signal?.aborted) {
|
|
303
|
+
await options.persist?.();
|
|
304
|
+
emit?.({ type: "paused" });
|
|
305
|
+
return state;
|
|
306
|
+
}
|
|
307
|
+
// The user's usage limit closed a window: not an outcome and not a fault. The run stays
|
|
308
|
+
// "running" and resumable, exactly as after a stop, and says why it stopped.
|
|
309
|
+
if (pauseReason === "limit") {
|
|
310
|
+
await options.persist?.();
|
|
311
|
+
emit?.({ type: "paused", reason: "limit" });
|
|
312
|
+
return state;
|
|
313
|
+
}
|
|
314
|
+
state.turnsSpent++;
|
|
315
|
+
// The opening turn understood the goal and wrote a plan; nothing has been attempted yet,
|
|
316
|
+
// so there is nothing to verify and nothing a "looks done" signal could mean.
|
|
317
|
+
if (planning && !(pauseReason && HARD_STOPS.has(pauseReason))) {
|
|
318
|
+
emit?.({ type: "planned" });
|
|
319
|
+
pendingFeedback = BEGIN_WORK;
|
|
320
|
+
await options.persist?.();
|
|
321
|
+
continue;
|
|
322
|
+
}
|
|
323
|
+
const stuck = detectStuck(session.transcript.slice(-STUCK_WINDOW));
|
|
324
|
+
const usage = summarizeTask(usages, session.modelConfig.model);
|
|
325
|
+
const budgetExceeded = options.limits ? taskLimitReason(usage, Date.now() - state.startedAt, options.limits) : null;
|
|
326
|
+
const decision = decide({ pauseReason, stuck, budgetExceeded });
|
|
327
|
+
switch (decision.action) {
|
|
328
|
+
case "resume":
|
|
329
|
+
state.resumes++;
|
|
330
|
+
if (pauseReason)
|
|
331
|
+
emit?.({ type: "continuing", reason: pauseReason });
|
|
332
|
+
break;
|
|
333
|
+
case "wait":
|
|
334
|
+
emit?.({ type: "waiting" });
|
|
335
|
+
await deps.sleep(options.backgroundPollWaitMs ?? DEFAULT_BACKGROUND_POLL_WAIT_MS);
|
|
336
|
+
break;
|
|
337
|
+
case "verify": {
|
|
338
|
+
emit?.({ type: "verifying" });
|
|
339
|
+
const report = await deps.verify(session, state.goal, {
|
|
340
|
+
signal: options.signal,
|
|
341
|
+
onEvent: (e) => {
|
|
342
|
+
if (e.type !== "tool" || e.phase !== "start")
|
|
343
|
+
return;
|
|
344
|
+
const arg = ["path", "command", "cmd", "pattern", "query", "url"].map((k) => e.args[k]).find((v) => typeof v === "string");
|
|
345
|
+
emit?.({ type: "verifyStep", line: `${e.name}${arg ? ` ${String(arg).slice(0, 80)}` : ""}` });
|
|
346
|
+
},
|
|
347
|
+
});
|
|
348
|
+
if (options.signal?.aborted) {
|
|
349
|
+
await options.persist?.();
|
|
350
|
+
emit?.({ type: "paused" });
|
|
351
|
+
return state;
|
|
352
|
+
}
|
|
353
|
+
state.lastVerification = { at: Date.now(), verdict: report.verdict, note: report.body.slice(0, 2000) };
|
|
354
|
+
if (report.verdict === "pass") {
|
|
355
|
+
state.consecutiveVerifyFails = 0;
|
|
356
|
+
state.status = "done";
|
|
357
|
+
state.outcome = "goal verified done";
|
|
358
|
+
}
|
|
359
|
+
else {
|
|
360
|
+
state.consecutiveVerifyFails++;
|
|
361
|
+
if (state.consecutiveVerifyFails >= MAX_MARATHON_VERIFY_FAILS) {
|
|
362
|
+
state.status = "blocked";
|
|
363
|
+
state.outcome = `verification did not pass after ${state.consecutiveVerifyFails} attempts (${report.verdict}): ${report.body.slice(0, 500)}`;
|
|
364
|
+
}
|
|
365
|
+
else {
|
|
366
|
+
pendingFeedback =
|
|
367
|
+
`A verification pass on your work came back "${report.verdict}", not done. What it found:\n\n${report.body}\n\n` +
|
|
368
|
+
`Address this, then continue toward the original goal:\n${state.goal}`;
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
emit?.({ type: "verified", passed: report.verdict === "pass", verdict: report.verdict, failsInARow: state.consecutiveVerifyFails });
|
|
372
|
+
break;
|
|
373
|
+
}
|
|
374
|
+
case "stop":
|
|
375
|
+
state.status = decision.status;
|
|
376
|
+
state.outcome = decision.reason;
|
|
377
|
+
break;
|
|
378
|
+
}
|
|
379
|
+
if (state.status !== "running")
|
|
380
|
+
emit?.({ type: "finished", status: state.status, outcome: state.outcome ?? "" });
|
|
381
|
+
await options.persist?.();
|
|
382
|
+
}
|
|
383
|
+
if (state.status === "running")
|
|
384
|
+
emit?.({ type: "paused" }); // left the loop on an abort before the next turn
|
|
385
|
+
return state;
|
|
386
|
+
}
|
|
387
|
+
/**
|
|
388
|
+
* Begin a NEW goal, replacing whatever Marathon the session already holds (a finished
|
|
389
|
+
* one, or one the user is abandoning by starting over). The front ends call this when
|
|
390
|
+
* the user arms Marathon and sends their goal.
|
|
391
|
+
*/
|
|
392
|
+
export function startMarathon(session, goal, options = {}, deps = defaultDeps) {
|
|
393
|
+
session.marathon = initMarathon(goal);
|
|
394
|
+
return runMarathon(session, goal, options, deps);
|
|
395
|
+
}
|
|
396
|
+
/** Carry on a run that stopped while still "running" (stopped by the user, or the
|
|
397
|
+
* process ended). Nothing to resume returns null, so a caller can say so. */
|
|
398
|
+
export function resumeMarathon(session, options = {}, deps = defaultDeps) {
|
|
399
|
+
const state = session.marathon;
|
|
400
|
+
if (!state || state.status !== "running")
|
|
401
|
+
return Promise.resolve(null);
|
|
402
|
+
return runMarathon(session, state.goal, options, deps);
|
|
403
|
+
}
|
|
404
|
+
/** Drop the session's Marathon: the way to dismiss a finished, blocked or stuck run
|
|
405
|
+
* (and its checklist) without starting another. */
|
|
406
|
+
export function clearMarathon(session) {
|
|
407
|
+
session.marathon = undefined;
|
|
408
|
+
}
|
|
409
|
+
//# sourceMappingURL=marathon.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"marathon.js","sourceRoot":"","sources":["../../src/dynamo/marathon.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* marathonPrompt.ts — the standing context a running Marathon adds to each turn's
|
|
3
|
+
* volatile tail.
|
|
4
|
+
*
|
|
5
|
+
* Kept in its own module, with no imports, because engine.ts renders it and
|
|
6
|
+
* marathon.ts imports engine.ts: putting it in marathon.ts would make the two
|
|
7
|
+
* modules import each other.
|
|
8
|
+
*
|
|
9
|
+
* Mechanical contract only, per the thin-prompt boundary: what phase the run is in,
|
|
10
|
+
* what the two tools it leans on are for, and the one rule that keeps "done" honest.
|
|
11
|
+
* How to break a goal down and how to work on it are the model's judgment and are not
|
|
12
|
+
* scripted here.
|
|
13
|
+
*
|
|
14
|
+
* Two phases, and the boundary between them is enforced in code, not asked for here
|
|
15
|
+
* (see `noQuestions` on the tool context): questions are asked in the opening turn or
|
|
16
|
+
* not at all.
|
|
17
|
+
*/
|
|
18
|
+
/** The goal is shown to the model verbatim, but a goal is user text and can be
|
|
19
|
+
* arbitrarily long or contain the closing tag; clip it and neutralise the tag. */
|
|
20
|
+
const MAX_GOAL_CHARS = 4_000;
|
|
21
|
+
function goalBlock(goal) {
|
|
22
|
+
const clipped = goal.length > MAX_GOAL_CHARS ? `${goal.slice(0, MAX_GOAL_CHARS)}…` : goal;
|
|
23
|
+
return `<goal>\n${clipped.replace(/<\/goal>/gi, "<\\/goal>")}\n</goal>`;
|
|
24
|
+
}
|
|
25
|
+
export function marathonBlock(goal, phase = "run") {
|
|
26
|
+
if (phase === "plan") {
|
|
27
|
+
return ("A Marathon is starting. After this turn it runs on its own, for as long as it takes, and you " +
|
|
28
|
+
"will NOT be able to ask the user anything. So this opening turn is the only chance to ask: " +
|
|
29
|
+
"read what you need to understand the goal, and if anything is unclear or hinges on a decision only " +
|
|
30
|
+
"the user can make, ask now with ask_user (several questions in a row is fine). " +
|
|
31
|
+
"Then write your plan as a task list with todo_write and reply with a short summary of what you " +
|
|
32
|
+
"will do. Do not change anything yet.\n" +
|
|
33
|
+
goalBlock(goal));
|
|
34
|
+
}
|
|
35
|
+
return ("A Marathon is running. You are working toward one goal across as many turns as it takes, on your own. " +
|
|
36
|
+
"Questions are closed: nobody will answer, so where something is ambiguous choose the most reasonable " +
|
|
37
|
+
"option, note the assumption in your task list or your reply, and keep going. " +
|
|
38
|
+
"The run pauses and resumes by itself, so do not stop to ask whether to continue.\n" +
|
|
39
|
+
goalBlock(goal) +
|
|
40
|
+
"\nKeep the task list from your plan up to date with todo_write: one task in_progress at a time, and mark " +
|
|
41
|
+
"each completed the moment it is really done. " +
|
|
42
|
+
"Do not declare the goal finished on your own word: when you believe it is done, say so plainly, " +
|
|
43
|
+
"and it will be checked independently.");
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=marathonPrompt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"marathonPrompt.js","sourceRoot":"","sources":["../../src/dynamo/marathonPrompt.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAIH;mFACmF;AACnF,MAAM,cAAc,GAAG,KAAK,CAAC;AAE7B,SAAS,SAAS,CAAC,IAAY;IAC7B,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,GAAG,cAAc,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;IAC1F,OAAO,WAAW,OAAO,CAAC,OAAO,CAAC,YAAY,EAAE,WAAW,CAAC,WAAW,CAAC;AAC1E,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,IAAY,EAAE,QAAuB,KAAK;IACtE,IAAI,KAAK,KAAK,MAAM,EAAE,CAAC;QACrB,OAAO,CACL,+FAA+F;YAC/F,6FAA6F;YAC7F,qGAAqG;YACrG,iFAAiF;YACjF,iGAAiG;YACjG,wCAAwC;YACxC,SAAS,CAAC,IAAI,CAAC,CAChB,CAAC;IACJ,CAAC;IACD,OAAO,CACL,wGAAwG;QACxG,uGAAuG;QACvG,+EAA+E;QAC/E,oFAAoF;QACpF,SAAS,CAAC,IAAI,CAAC;QACf,2GAA2G;QAC3G,+CAA+C;QAC/C,kGAAkG;QAClG,uCAAuC,CACxC,CAAC;AACJ,CAAC"}
|
package/dist/dynamo/model.js
CHANGED
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
import { promises as fs } from "node:fs";
|
|
16
16
|
import { join } from "node:path";
|
|
17
17
|
import { projectDir, stateRoot } from "../memory/store.js";
|
|
18
|
-
import { allModels, allProviders, discoveredList, discoveredProviderIds, ensureDriver, manifestForModel, modelsOf, normalizeConfig, refreshModels as refreshDiscovered, seedDiscovered, } from "../drivers/registry.js";
|
|
18
|
+
import { allModels, allProviders, discoveredList, discoveredProviderIds, ensureDriver, localProviderIds, manifestForModel, modelsOf, normalizeConfig, refreshModels as refreshDiscovered, seedDiscovered, } from "../drivers/registry.js";
|
|
19
19
|
/**
|
|
20
20
|
* How long a discovered model list is trusted before it is fetched again.
|
|
21
21
|
*
|
|
@@ -200,7 +200,11 @@ export async function loadModelConfig(projectCwd) {
|
|
|
200
200
|
// saved config against nothing is the bug the comment above describes.
|
|
201
201
|
await loadDiscoveryCache();
|
|
202
202
|
const refresh = refreshModels({ maxAgeMs: DISCOVERY_TTL_MS });
|
|
203
|
-
|
|
203
|
+
// A local server is waited on every launch, saved list or not: whether it is running IS whether
|
|
204
|
+
// that provider counts as connected, and the first-run key screen is decided from that before the
|
|
205
|
+
// first frame. With a saved list this used to be skipped, so every launch after the first showed
|
|
206
|
+
// "add a key" to anyone whose only provider was a local model.
|
|
207
|
+
if (discoveredProviderIds().some((id) => !discoveredList(id)) || localProviderIds().length > 0)
|
|
204
208
|
await refresh;
|
|
205
209
|
let config;
|
|
206
210
|
try {
|
package/dist/dynamo/model.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model.js","sourceRoot":"","sources":["../../src/dynamo/model.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EACL,SAAS,EACT,YAAY,EACZ,cAAc,EACd,qBAAqB,EACrB,YAAY,EACZ,gBAAgB,EAChB,QAAQ,EACR,eAAe,EACf,aAAa,IAAI,iBAAiB,EAClC,cAAc,GACf,MAAM,wBAAwB,CAAC;AAKhC;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAEnD,SAAS,kBAAkB,CAAC,EAAU;IACpC,OAAO,IAAI,CAAC,SAAS,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;AACzD,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,UAAiC,EAAE;IACrE,MAAM,SAAS,GAAG,MAAM,iBAAiB,CAAC,OAAO,CAAC,CAAC;IACnD,MAAM,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAChE,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,KAAK,UAAU,iBAAiB,CAAC,EAAU;IACzC,MAAM,KAAK,GAAG,cAAc,CAAC,EAAE,CAAC,CAAC;IACjC,IAAI,CAAC,KAAK;QAAE,OAAO;IACnB,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,kBAAkB,CAAC,EAAE,CAAC,CAAC;QACpC,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAChE,mFAAmF;QACnF,oEAAoE;QACpE,MAAM,GAAG,GAAG,GAAG,IAAI,IAAI,OAAO,CAAC,GAAG,MAAM,CAAC;QACzC,MAAM,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;QACtG,MAAM,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAC7B,CAAC;IAAC,MAAM,CAAC;QACP,8CAA8C;IAChD,CAAC;AACH,CAAC;AAED,sEAAsE;AACtE,MAAM,CAAC,MAAM,gBAAgB,GAAG,iBAAiB,CAAC;AAElD,oFAAoF;AACpF,MAAM,CAAC,KAAK,UAAU,kBAAkB;IACtC,MAAM,OAAO,CAAC,GAAG,CACf,qBAAqB,EAAE,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE;QACvC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAG1E,CAAC;YACF,IAAI,OAAO,MAAM,CAAC,SAAS,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC;gBAAE,OAAO;YAClF,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CACjC,CAAC,CAAC,EAAoB,EAAE,CACtB,CAAC,CAAC,CAAC,IAAI,OAAQ,CAAiB,CAAC,EAAE,KAAK,QAAQ,IAAI,OAAQ,CAAiB,CAAC,KAAK,KAAK,QAAQ,CACnG,CAAC;YACF,cAAc,CAAC,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,WAAW,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;QACxG,CAAC;QAAC,MAAM,CAAC;YACP,yDAAyD;QAC3D,CAAC;IACH,CAAC,CAAC,CACH,CAAC;AACJ,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,MAAM;IACpB,OAAO,SAAS,EAAE,CAAC;AACrB,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAgB,eAAe,CAAC;IAC/D,iFAAiF;IACjF,mFAAmF;IACnF,4EAA4E;IAC5E,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC,CAAE,CAAC,EAAE;IACzB,QAAQ,EAAE,KAAK;IACf,MAAM,EAAE,MAAM;CACf,CAAC,CAAC;AAEH;;;;GAIG;AACH,MAAM,UAAU,UAAU,CAAC,KAAc;IACvC,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;IAC9C,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC;AACvB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,KAAc;IAC7C,OAAO,QAAQ,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,CAAC;AAC3C,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,cAAc,CAAC,KAAc,EAAE,MAAmC;IAChF,IAAI,MAAM,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC;QAAE,OAAO,IAAI,CAAC;IAC3D,KAAK,MAAM,QAAQ,IAAI,YAAY,EAAE,EAAE,CAAC;QACtC,MAAM,KAAK,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;QACpC,IAAI,KAAK,IAAI,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC;YAAE,OAAO,KAAK,CAAC,EAAE,CAAC;IAC3D,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,aAAa,CAAC,KAAc,EAAE,MAAmC;IAC/E,IAAI,MAAM,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC;QAAE,OAAO,KAAK,CAAC;IAC5D,OAAO,cAAc,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,CAAC;AAChD,CAAC;AAED,4DAA4D;AAC5D,MAAM,UAAU,WAAW,CAAC,KAAc;IACxC,OAAO,gBAAgB,CAAC,KAAK,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;AACpD,CAAC;AAED,sEAAsE;AACtE,MAAM,UAAU,UAAU,CAAC,GAAgB;IACzC,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,IAAI,CACvC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,GAAG,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,MAAM,KAAK,GAAG,CAAC,MAAM,CAAC,CAC/E,CAAC;IACF,OAAO,KAAK,EAAE,KAAK,IAAI,UAAU,CAAC;AACpC,CAAC;AAED;;8CAE8C;AAC9C,MAAM,UAAU,UAAU,CAAC,KAAc;IACvC,OAAO,SAAS,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,KAAK,CAAC,EAAE,KAAK,IAAI,KAAK,CAAC;AACjE,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,SAAS,CAAC,GAAgB,EAAE,KAAc;IACxD,OAAO,eAAe,CAAC,EAAE,GAAG,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC;AAC5C,CAAC;AAED,SAAS,UAAU,CAAC,UAAkB;IACpC,OAAO,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,YAAY,CAAC,CAAC;AACpD,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,UAAkB;IACtD,mFAAmF;IACnF,iFAAiF;IACjF,uEAAuE;IACvE,MAAM,kBAAkB,EAAE,CAAC;IAC3B,MAAM,OAAO,GAAG,aAAa,CAAC,EAAE,QAAQ,EAAE,gBAAgB,EAAE,CAAC,CAAC;IAC9D,IAAI,qBAAqB,EAAE,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;QAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"model.js","sourceRoot":"","sources":["../../src/dynamo/model.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* toolBatches.ts — how the tool calls of ONE model step are scheduled.
|
|
3
|
+
*
|
|
4
|
+
* A model can ask for several calls in a single step, and the order it wrote them in is part
|
|
5
|
+
* of what it asked for: "write the file, then read it back" means the read sees the write.
|
|
6
|
+
* Read-only calls can safely overlap each other, so running them together is a real saving,
|
|
7
|
+
* but only with the calls NEXT to them. Running every read-only call of the step first and the
|
|
8
|
+
* rest afterwards (which is what this did before) hands the model the old content of a file
|
|
9
|
+
* it has just changed, and it carries on believing it.
|
|
10
|
+
*
|
|
11
|
+
* So a step is split into batches that keep the model's order: a run of consecutive
|
|
12
|
+
* concurrency-safe calls is one parallel batch, and every other call is a batch of its own.
|
|
13
|
+
* Results are returned in call order whichever way each batch ran.
|
|
14
|
+
*
|
|
15
|
+
* A cap on how many run at once keeps a model that fans out thirty sub-agents or fifty reads
|
|
16
|
+
* from starting all of them in the same instant: file handles, child processes and the
|
|
17
|
+
* provider's own rate limits are shared.
|
|
18
|
+
*/
|
|
19
|
+
/** Calls started at the same time within a parallel batch. */
|
|
20
|
+
export const MAX_PARALLEL_CALLS = 10;
|
|
21
|
+
/** Split a step's calls into batches that keep their order (pure). */
|
|
22
|
+
export function partitionCalls(calls, isSafe) {
|
|
23
|
+
const batches = [];
|
|
24
|
+
for (const call of calls) {
|
|
25
|
+
const last = batches[batches.length - 1];
|
|
26
|
+
if (isSafe(call) && last?.parallel)
|
|
27
|
+
last.calls.push(call);
|
|
28
|
+
else
|
|
29
|
+
batches.push({ parallel: isSafe(call), calls: [call] });
|
|
30
|
+
}
|
|
31
|
+
return batches;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Run `fn` over `items`, at most `limit` at a time, returning results in the order of `items`
|
|
35
|
+
* (not the order they finished). A rejection stops new starts and rejects, like Promise.all.
|
|
36
|
+
*/
|
|
37
|
+
export async function runLimited(items, limit, fn) {
|
|
38
|
+
const out = new Array(items.length);
|
|
39
|
+
let next = 0;
|
|
40
|
+
let failed = false;
|
|
41
|
+
const worker = async () => {
|
|
42
|
+
while (!failed) {
|
|
43
|
+
const i = next++;
|
|
44
|
+
if (i >= items.length)
|
|
45
|
+
return;
|
|
46
|
+
try {
|
|
47
|
+
out[i] = await fn(items[i]);
|
|
48
|
+
}
|
|
49
|
+
catch (error) {
|
|
50
|
+
failed = true;
|
|
51
|
+
throw error;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
};
|
|
55
|
+
await Promise.all(Array.from({ length: Math.max(1, Math.min(limit, items.length)) }, worker));
|
|
56
|
+
return out;
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=toolBatches.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toolBatches.js","sourceRoot":"","sources":["../../src/dynamo/toolBatches.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,8DAA8D;AAC9D,MAAM,CAAC,MAAM,kBAAkB,GAAG,EAAE,CAAC;AAQrC,sEAAsE;AACtE,MAAM,UAAU,cAAc,CAAI,KAAmB,EAAE,MAA4B;IACjF,MAAM,OAAO,GAAe,EAAE,CAAC;IAC/B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACzC,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,QAAQ;YAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;;YACrD,OAAO,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC/D,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAO,KAAmB,EAAE,KAAa,EAAE,EAA2B;IACpG,MAAM,GAAG,GAAQ,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACzC,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,IAAI,MAAM,GAAG,KAAK,CAAC;IACnB,MAAM,MAAM,GAAG,KAAK,IAAmB,EAAE;QACvC,OAAO,CAAC,MAAM,EAAE,CAAC;YACf,MAAM,CAAC,GAAG,IAAI,EAAE,CAAC;YACjB,IAAI,CAAC,IAAI,KAAK,CAAC,MAAM;gBAAE,OAAO;YAC9B,IAAI,CAAC;gBACH,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,CAAC;YAC/B,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,GAAG,IAAI,CAAC;gBACd,MAAM,KAAK,CAAC;YACd,CAAC;QACH,CAAC;IACH,CAAC,CAAC;IACF,MAAM,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC;IAC9F,OAAO,GAAG,CAAC;AACb,CAAC"}
|