mindweave 3.4.1 → 3.4.2
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 +26 -3
- package/dist/cli/App.js +52 -8
- package/dist/cli/App.js.map +1 -1
- package/dist/cli/commands.js +1 -0
- package/dist/cli/commands.js.map +1 -1
- package/dist/cli/components/ToolLine.js +5 -3
- package/dist/cli/components/ToolLine.js.map +1 -1
- package/dist/cli/components/WorkGroup.js +82 -64
- package/dist/cli/components/WorkGroup.js.map +1 -1
- package/dist/cli/startupArgs.js +24 -4
- package/dist/cli/startupArgs.js.map +1 -1
- package/dist/cli/transcript.js +14 -0
- package/dist/cli/transcript.js.map +1 -1
- package/dist/cli/workLines.js +40 -0
- package/dist/cli/workLines.js.map +1 -1
- package/dist/core/turnRunner.js +35 -23
- package/dist/core/turnRunner.js.map +1 -1
- package/dist/dynamo/contextWindow.js +28 -36
- package/dist/dynamo/contextWindow.js.map +1 -1
- package/dist/dynamo/engine.js +51 -9
- package/dist/dynamo/engine.js.map +1 -1
- package/dist/dynamo/guard.js +1 -1
- package/dist/dynamo/guard.js.map +1 -1
- package/dist/dynamo/prompt.js +1 -1
- package/dist/headless/args.js +82 -0
- package/dist/headless/args.js.map +1 -0
- package/dist/headless/main.js +87 -0
- package/dist/headless/main.js.map +1 -0
- package/dist/headless/output.js +150 -0
- package/dist/headless/output.js.map +1 -0
- package/dist/headless/run.js +188 -0
- package/dist/headless/run.js.map +1 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -1
- package/dist/main.js +5 -0
- package/dist/main.js.map +1 -1
- package/dist/memory/compaction.js +94 -2
- package/dist/memory/compaction.js.map +1 -1
- package/dist/memory/rewind.js +10 -6
- package/dist/memory/rewind.js.map +1 -1
- package/dist/memory/session.js +2 -2
- package/dist/memory/session.js.map +1 -1
- package/dist/memory/sessionMemory.js +270 -69
- package/dist/memory/sessionMemory.js.map +1 -1
- package/dist/memory/types.js.map +1 -1
- package/dist/project/context.js +34 -6
- package/dist/project/context.js.map +1 -1
- package/dist/tools/coauthor.js +154 -0
- package/dist/tools/coauthor.js.map +1 -0
- package/dist/tools/codeIntel.js +38 -10
- package/dist/tools/codeIntel.js.map +1 -1
- package/dist/tools/docOutline.js +250 -0
- package/dist/tools/docOutline.js.map +1 -0
- package/dist/tools/editRipple.js +29 -2
- package/dist/tools/editRipple.js.map +1 -1
- package/dist/tools/emptyResult.js +24 -0
- package/dist/tools/emptyResult.js.map +1 -0
- package/dist/tools/glob.js +11 -2
- package/dist/tools/glob.js.map +1 -1
- package/dist/tools/grep.js +4 -3
- package/dist/tools/grep.js.map +1 -1
- package/dist/tools/missingPath.js +90 -0
- package/dist/tools/missingPath.js.map +1 -0
- package/dist/tools/readFile.js +3 -1
- package/dist/tools/readFile.js.map +1 -1
- package/dist/tools/rebuildDetail.js +9 -5
- package/dist/tools/rebuildDetail.js.map +1 -1
- package/dist/tools/runCommand.js +5 -1
- package/dist/tools/runCommand.js.map +1 -1
- package/dist/tools/webSearch.js +3 -1
- package/dist/tools/webSearch.js.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* main.ts (headless) — the real process around `runHeadless`.
|
|
3
|
+
*
|
|
4
|
+
* The only file that touches stdin, signals and the exit code. Loaded by index.ts for `-p`
|
|
5
|
+
* INSTEAD of the terminal program, so React, Ink and the framebuffer are never loaded: a script
|
|
6
|
+
* starts faster and cannot be broken by a missing terminal.
|
|
7
|
+
*/
|
|
8
|
+
import { loadConfig } from "../cli/bootstrap.js";
|
|
9
|
+
import { parseHeadlessArgs } from "./args.js";
|
|
10
|
+
import { EXIT_USAGE, EXIT_SIGINT, EXIT_SIGTERM } from "./output.js";
|
|
11
|
+
import { MAX_STDIN_BYTES, runHeadless } from "./run.js";
|
|
12
|
+
/** How long to wait for the first byte of piped input when the task itself was typed as an argument. */
|
|
13
|
+
export const STDIN_GRACE_MS = 1500;
|
|
14
|
+
/**
|
|
15
|
+
* What was piped in, if anything.
|
|
16
|
+
*
|
|
17
|
+
* With a typed task, stdin is optional context, and a CI runner or a parent process can leave stdin
|
|
18
|
+
* open with nothing ever written to it. Waiting for an end that never comes would hang a job forever, so
|
|
19
|
+
* the first byte gets a short grace period; once input starts it is read to the end however long that
|
|
20
|
+
* takes (`git diff` on a big repo is slow). With no typed task, stdin IS the task and is waited for.
|
|
21
|
+
*/
|
|
22
|
+
export async function readPipedInput(stdin, hasTypedTask, graceMs = STDIN_GRACE_MS) {
|
|
23
|
+
// A terminal is not input. Anything else (a pipe, a file, /dev/null, NUL) is read: asking the OS what kind of
|
|
24
|
+
// stream it is gave a different answer for a Windows pipe than for a POSIX one, and missed real input.
|
|
25
|
+
if (stdin.isTTY)
|
|
26
|
+
return { text: null, tooBig: false };
|
|
27
|
+
return new Promise((resolve) => {
|
|
28
|
+
const chunks = [];
|
|
29
|
+
let size = 0;
|
|
30
|
+
let settled = false;
|
|
31
|
+
let timer;
|
|
32
|
+
const done = (tooBig) => {
|
|
33
|
+
if (settled)
|
|
34
|
+
return;
|
|
35
|
+
settled = true;
|
|
36
|
+
if (timer)
|
|
37
|
+
clearTimeout(timer);
|
|
38
|
+
stdin.removeAllListeners("data");
|
|
39
|
+
stdin.removeAllListeners("end");
|
|
40
|
+
stdin.removeAllListeners("error");
|
|
41
|
+
stdin.pause?.();
|
|
42
|
+
resolve({ text: size > 0 ? Buffer.concat(chunks).toString("utf8") : null, tooBig });
|
|
43
|
+
};
|
|
44
|
+
stdin.on("data", (chunk) => {
|
|
45
|
+
if (timer) {
|
|
46
|
+
clearTimeout(timer);
|
|
47
|
+
timer = undefined;
|
|
48
|
+
}
|
|
49
|
+
const buf = typeof chunk === "string" ? Buffer.from(chunk) : chunk;
|
|
50
|
+
size += buf.length;
|
|
51
|
+
if (size > MAX_STDIN_BYTES)
|
|
52
|
+
return done(true);
|
|
53
|
+
chunks.push(buf);
|
|
54
|
+
});
|
|
55
|
+
stdin.on("end", () => done(false));
|
|
56
|
+
stdin.on("error", () => done(false));
|
|
57
|
+
if (hasTypedTask)
|
|
58
|
+
timer = setTimeout(() => done(false), graceMs);
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
export async function runHeadlessMain(argv) {
|
|
62
|
+
const parsed = parseHeadlessArgs(argv);
|
|
63
|
+
if (!parsed.ok) {
|
|
64
|
+
process.stderr.write(`mindweave: ${parsed.error}\nRun mindweave --help for the options.\n`);
|
|
65
|
+
return EXIT_USAGE;
|
|
66
|
+
}
|
|
67
|
+
// Keys from ~/.mindweave/.env and the project's .env, as in an interactive start.
|
|
68
|
+
loadConfig();
|
|
69
|
+
const input = await readPipedInput(process.stdin, Boolean(parsed.options.prompt?.trim()));
|
|
70
|
+
// One signal stops the turn cleanly (the session is saved, background commands are stopped); a second one means
|
|
71
|
+
// the caller is out of patience, and the process goes at once.
|
|
72
|
+
const abort = new AbortController();
|
|
73
|
+
let fired = null;
|
|
74
|
+
const on = (name) => () => {
|
|
75
|
+
if (fired)
|
|
76
|
+
process.exit(name === "SIGTERM" ? EXIT_SIGTERM : EXIT_SIGINT);
|
|
77
|
+
fired = name;
|
|
78
|
+
abort.abort();
|
|
79
|
+
};
|
|
80
|
+
process.on("SIGINT", on("SIGINT"));
|
|
81
|
+
process.on("SIGTERM", on("SIGTERM"));
|
|
82
|
+
const code = await runHeadless(parsed.options, { stdout: process.stdout, stderr: process.stderr, stdin: input.text, stdinTooBig: input.tooBig }, { cwd: process.cwd(), signal: abort.signal, firedSignal: () => fired });
|
|
83
|
+
// A pipe can still hold unwritten bytes when the process exits, which cuts a long answer short.
|
|
84
|
+
await Promise.all([process.stdout, process.stderr].map((s) => new Promise((r) => s.write("", () => r()))));
|
|
85
|
+
return code;
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=main.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"main.js","sourceRoot":"","sources":["../../src/headless/main.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AACpE,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAExD,wGAAwG;AACxG,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,CAAC;AAOnC;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,KAAkD,EAAE,YAAqB,EAAE,OAAO,GAAG,cAAc;IACtI,8GAA8G;IAC9G,uGAAuG;IACvG,IAAI,KAAK,CAAC,KAAK;QAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;IACtD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,IAAI,IAAI,GAAG,CAAC,CAAC;QACb,IAAI,OAAO,GAAG,KAAK,CAAC;QACpB,IAAI,KAAiC,CAAC;QACtC,MAAM,IAAI,GAAG,CAAC,MAAe,EAAE,EAAE;YAC/B,IAAI,OAAO;gBAAE,OAAO;YACpB,OAAO,GAAG,IAAI,CAAC;YACf,IAAI,KAAK;gBAAE,YAAY,CAAC,KAAK,CAAC,CAAC;YAC/B,KAAK,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC;YACjC,KAAK,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;YAChC,KAAK,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC;YACjC,KAA2B,CAAC,KAAK,EAAE,EAAE,CAAC;YACvC,OAAO,CAAC,EAAE,IAAI,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;QACtF,CAAC,CAAC;QACF,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAsB,EAAE,EAAE;YAC1C,IAAI,KAAK,EAAE,CAAC;gBACV,YAAY,CAAC,KAAK,CAAC,CAAC;gBACpB,KAAK,GAAG,SAAS,CAAC;YACpB,CAAC;YACD,MAAM,GAAG,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;YACnE,IAAI,IAAI,GAAG,CAAC,MAAM,CAAC;YACnB,IAAI,IAAI,GAAG,eAAe;gBAAE,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC;YAC9C,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACnB,CAAC,CAAC,CAAC;QACH,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;QACnC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;QACrC,IAAI,YAAY;YAAE,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC,CAAC;IACnE,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,IAAc;IAClD,MAAM,MAAM,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;IACvC,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;QACf,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,cAAc,MAAM,CAAC,KAAK,2CAA2C,CAAC,CAAC;QAC5F,OAAO,UAAU,CAAC;IACpB,CAAC;IACD,kFAAkF;IAClF,UAAU,EAAE,CAAC;IAEb,MAAM,KAAK,GAAG,MAAM,cAAc,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAE1F,gHAAgH;IAChH,+DAA+D;IAC/D,MAAM,KAAK,GAAG,IAAI,eAAe,EAAE,CAAC;IACpC,IAAI,KAAK,GAAgC,IAAI,CAAC;IAC9C,MAAM,EAAE,GAAG,CAAC,IAA0B,EAAE,EAAE,CAAC,GAAG,EAAE;QAC9C,IAAI,KAAK;YAAE,OAAO,CAAC,IAAI,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;QACzE,KAAK,GAAG,IAAI,CAAC;QACb,KAAK,CAAC,KAAK,EAAE,CAAC;IAChB,CAAC,CAAC;IACF,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;IACnC,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;IAErC,MAAM,IAAI,GAAG,MAAM,WAAW,CAC5B,MAAM,CAAC,OAAO,EACd,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,WAAW,EAAE,KAAK,CAAC,MAAM,EAAE,EAChG,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,WAAW,EAAE,GAAG,EAAE,CAAC,KAAK,EAAE,CACvE,CAAC;IACF,gGAAgG;IAChG,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,OAAO,CAAO,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACjH,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
export const EXIT_OK = 0;
|
|
2
|
+
export const EXIT_FAILED = 1;
|
|
3
|
+
export const EXIT_USAGE = 2;
|
|
4
|
+
export const EXIT_NO_KEY = 3;
|
|
5
|
+
export const EXIT_UNFINISHED = 4;
|
|
6
|
+
export const EXIT_SIGINT = 130;
|
|
7
|
+
export const EXIT_SIGTERM = 143;
|
|
8
|
+
export function subtypeOf(f) {
|
|
9
|
+
if (f.signal)
|
|
10
|
+
return "interrupted";
|
|
11
|
+
if (f.errors.length > 0)
|
|
12
|
+
return "error";
|
|
13
|
+
if (f.paused)
|
|
14
|
+
return "paused";
|
|
15
|
+
return "success";
|
|
16
|
+
}
|
|
17
|
+
/** Why a run stopped unfinished, in words for a person reading a log. */
|
|
18
|
+
export function pauseWords(reason) {
|
|
19
|
+
switch (reason) {
|
|
20
|
+
case "limit":
|
|
21
|
+
return "a usage limit you set is used up";
|
|
22
|
+
case "stepBudget":
|
|
23
|
+
return "it used its step budget";
|
|
24
|
+
case "costTimeLimit":
|
|
25
|
+
return "it reached its cost or time ceiling";
|
|
26
|
+
case "repeatedFailure":
|
|
27
|
+
return "the same step kept failing";
|
|
28
|
+
case "backgroundPoll":
|
|
29
|
+
return "it was only waiting on a background command";
|
|
30
|
+
case "reScope":
|
|
31
|
+
return "the task grew past what was asked";
|
|
32
|
+
case "truncated":
|
|
33
|
+
return "the model hit its output limit mid-answer";
|
|
34
|
+
case "refused":
|
|
35
|
+
return "the provider declined the request";
|
|
36
|
+
case "overflow":
|
|
37
|
+
return "the conversation no longer fits the model's context window";
|
|
38
|
+
case "overloaded":
|
|
39
|
+
return "the provider cut the request off";
|
|
40
|
+
default:
|
|
41
|
+
return String(reason);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
export function exitCodeOf(f) {
|
|
45
|
+
switch (subtypeOf(f)) {
|
|
46
|
+
case "interrupted":
|
|
47
|
+
return f.signal === "SIGTERM" ? EXIT_SIGTERM : EXIT_SIGINT;
|
|
48
|
+
case "error":
|
|
49
|
+
return EXIT_FAILED;
|
|
50
|
+
case "paused":
|
|
51
|
+
return EXIT_UNFINISHED;
|
|
52
|
+
default:
|
|
53
|
+
return EXIT_OK;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
export function resultOf(f) {
|
|
57
|
+
const subtype = subtypeOf(f);
|
|
58
|
+
return {
|
|
59
|
+
type: "result",
|
|
60
|
+
subtype,
|
|
61
|
+
is_error: subtype === "error" || subtype === "interrupted",
|
|
62
|
+
result: f.resultText,
|
|
63
|
+
session_id: f.sessionId,
|
|
64
|
+
model: f.model,
|
|
65
|
+
mode: f.mode,
|
|
66
|
+
duration_ms: f.durationMs,
|
|
67
|
+
tool_calls: f.toolCalls,
|
|
68
|
+
usage: f.usage,
|
|
69
|
+
total_cost_usd: roundUsd(f.costUsd),
|
|
70
|
+
cost_estimated: f.costEstimated,
|
|
71
|
+
permission_denials: f.denials,
|
|
72
|
+
...(f.signal ? { stop_reason: f.signal } : f.paused && subtype === "paused" ? { stop_reason: f.paused } : {}),
|
|
73
|
+
errors: f.errors,
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
function roundUsd(n) {
|
|
77
|
+
return Math.round(n * 1e6) / 1e6;
|
|
78
|
+
}
|
|
79
|
+
/** A tool call's label as one short line, the way the progress lines read. */
|
|
80
|
+
function toolLine(name, arg) {
|
|
81
|
+
const one = (arg ?? "").replace(/\s+/g, " ").trim();
|
|
82
|
+
const clipped = one.length > 100 ? `${one.slice(0, 99)}…` : one;
|
|
83
|
+
return `› ${name}${clipped ? ` ${clipped}` : ""}`;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* One engine event as output. `null` for the events that carry nothing a script wants
|
|
87
|
+
* (reasoning text, live task lists, per-tool progress ticks, the done marker).
|
|
88
|
+
*/
|
|
89
|
+
export function linesFor(event, format, quiet) {
|
|
90
|
+
if (format === "stream-json") {
|
|
91
|
+
const record = streamRecord(event);
|
|
92
|
+
return record ? { stdout: JSON.stringify(record) + "\n" } : null;
|
|
93
|
+
}
|
|
94
|
+
// A failure is never hidden by --quiet: a script that asked for silence still has to be told why it stopped.
|
|
95
|
+
if (event.type === "notice")
|
|
96
|
+
return { stderr: `! ${event.title}: ${event.body}\n` };
|
|
97
|
+
if (event.type === "error")
|
|
98
|
+
return { stderr: `! ${event.text}\n` };
|
|
99
|
+
if (quiet)
|
|
100
|
+
return null;
|
|
101
|
+
switch (event.type) {
|
|
102
|
+
case "toolStart":
|
|
103
|
+
return { stderr: toolLine(event.name, event.arg) + "\n" };
|
|
104
|
+
case "toolEnd":
|
|
105
|
+
return event.ok || event.quiet ? null : { stderr: ` ✗ ${event.summary}\n` };
|
|
106
|
+
case "subagentStart":
|
|
107
|
+
return { stderr: `› sub-agent ${event.task.replace(/\s+/g, " ").slice(0, 100)}\n` };
|
|
108
|
+
case "activity":
|
|
109
|
+
return { stderr: `${event.error ? "! " : ""}${event.line}\n` };
|
|
110
|
+
default:
|
|
111
|
+
return null;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
function streamRecord(e) {
|
|
115
|
+
switch (e.type) {
|
|
116
|
+
case "text":
|
|
117
|
+
return { type: "text", delta: e.delta };
|
|
118
|
+
case "replyReset":
|
|
119
|
+
return { type: "reply_reset" };
|
|
120
|
+
case "toolStart":
|
|
121
|
+
return { type: "tool_start", id: e.id, tool: e.tool ?? e.name, label: e.name, ...(e.arg ? { arg: e.arg } : {}), ...(e.args ? { args: e.args } : {}) };
|
|
122
|
+
case "toolEnd":
|
|
123
|
+
return { type: "tool_end", id: e.id, ok: e.ok, summary: e.summary };
|
|
124
|
+
case "subagentStart":
|
|
125
|
+
return { type: "subagent_start", id: e.id, task: e.task };
|
|
126
|
+
case "subagentEnd":
|
|
127
|
+
return { type: "subagent_end", id: e.id, ok: e.ok, summary: e.summary };
|
|
128
|
+
case "compaction":
|
|
129
|
+
return { type: "compaction", before: e.before, after: e.after, window: e.window };
|
|
130
|
+
case "activity":
|
|
131
|
+
return { type: "activity", line: e.line, ...(e.error ? { error: true } : {}) };
|
|
132
|
+
case "notice":
|
|
133
|
+
return { type: "notice", title: e.title, body: e.body };
|
|
134
|
+
case "error":
|
|
135
|
+
return { type: "error", text: e.text };
|
|
136
|
+
default:
|
|
137
|
+
return null;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
/** The line the stream opens with: what is about to run. */
|
|
141
|
+
export function initRecord(f) {
|
|
142
|
+
return { type: "init", session_id: f.sessionId, model: f.model, mode: f.mode, cwd: f.cwd, resumed: f.resumed };
|
|
143
|
+
}
|
|
144
|
+
/** The final bytes for stdout once the run is over. */
|
|
145
|
+
export function finalStdout(format, facts) {
|
|
146
|
+
if (format === "text")
|
|
147
|
+
return facts.resultText ? `${facts.resultText.replace(/\s+$/, "")}\n` : "";
|
|
148
|
+
return JSON.stringify(resultOf(facts)) + "\n";
|
|
149
|
+
}
|
|
150
|
+
//# sourceMappingURL=output.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/headless/output.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* run.ts — one task, no screen (`mindweave -p "task"`).
|
|
3
|
+
*
|
|
4
|
+
* A thin client of the same front door the desktop app uses (core/turnRunner.ts): open a session,
|
|
5
|
+
* run one turn, read what happened. The engine, the tools, the user's hooks, key failover, usage
|
|
6
|
+
* limits, compaction and the saved session are all the ones an interactive run has, so nothing
|
|
7
|
+
* here needs to be kept in step with them. What this file adds is only what a script needs:
|
|
8
|
+
* where the prompt comes from, which stream gets what, and an exit code that means something.
|
|
9
|
+
*
|
|
10
|
+
* Everything that touches the process (stdin, signals, exiting) is injected, so the whole flow
|
|
11
|
+
* runs inside a test against a scripted provider. `main.ts` is the one place that wires the real ones.
|
|
12
|
+
*
|
|
13
|
+
* Nobody is there to answer a question. No approval channel is attached, which is the same state a
|
|
14
|
+
* sub-agent runs in: Sentinel's gate says there is nobody to ask, `ask_user` tells the model to use
|
|
15
|
+
* its best judgment, and writes outside the workspace are refused. That is what makes the mode safe to
|
|
16
|
+
* leave unattended, and it needs no mode of its own.
|
|
17
|
+
*/
|
|
18
|
+
import { applySessionMode, disposeSession, prepareMessage, runTurn, sessionMode } from "../core/turnRunner.js";
|
|
19
|
+
import { defaultModeFor } from "../core/permissions.js";
|
|
20
|
+
import { createSession, resumeSession } from "../memory/session.js";
|
|
21
|
+
import { hasApiKey } from "../cli/bootstrap.js";
|
|
22
|
+
import { DEFAULT_MODE } from "../cli/modes.js";
|
|
23
|
+
import { rootBreadth } from "../cli/trust.js";
|
|
24
|
+
import { allProviders, manifestForModel, modelsOf } from "../drivers/registry.js";
|
|
25
|
+
import { usableFallback, withModel } from "../dynamo/model.js";
|
|
26
|
+
import { EXIT_FAILED, EXIT_NO_KEY, EXIT_USAGE, exitCodeOf, finalStdout, initRecord, linesFor, pauseWords, subtypeOf, } from "./output.js";
|
|
27
|
+
/** Piped context larger than this is refused, not silently cut: a half-read diff gives a confident wrong review. */
|
|
28
|
+
export const MAX_STDIN_BYTES = 2 * 1024 * 1024;
|
|
29
|
+
/** What an unattended run adds to the system prompt. The contract only: nobody answers, so finish, and report in full. */
|
|
30
|
+
export const UNATTENDED_NOTE = "This run is unattended: no one is watching and no one can answer. Never end with a question or an offer such as " +
|
|
31
|
+
'"want me to...?". Where something is ambiguous, choose the most reasonable option, say which you chose, and finish ' +
|
|
32
|
+
"the work. Stop early only for a decision that only the user can make, and then say exactly what you need. Your " +
|
|
33
|
+
"final reply is read later by a script or a person, so make it a complete report of what you did and found.";
|
|
34
|
+
export async function runHeadless(options, io, ctx) {
|
|
35
|
+
const started = Date.now();
|
|
36
|
+
const say = (text) => void io.stderr.write(text.endsWith("\n") ? text : `${text}\n`);
|
|
37
|
+
const usage = (text) => {
|
|
38
|
+
say(`mindweave: ${text}`);
|
|
39
|
+
return EXIT_USAGE;
|
|
40
|
+
};
|
|
41
|
+
// A script gets a folder it named, never a whole machine by accident. The interactive app asks about
|
|
42
|
+
// this once per folder; here there is nobody to ask, so the broad cases are refused.
|
|
43
|
+
const breadth = rootBreadth(ctx.cwd);
|
|
44
|
+
if (breadth !== "ordinary") {
|
|
45
|
+
return usage(`refusing to work in ${breadth === "home" ? "your home folder" : "a drive root"}. Run it from inside a project folder.`);
|
|
46
|
+
}
|
|
47
|
+
if (io.stdinTooBig) {
|
|
48
|
+
return usage(`the piped input is larger than ${MAX_STDIN_BYTES / (1024 * 1024)} MB. Write it to a file in the project and name the file in the task.`);
|
|
49
|
+
}
|
|
50
|
+
const argText = options.prompt?.trim() ?? "";
|
|
51
|
+
const piped = io.stdin && io.stdin.trim() ? io.stdin : "";
|
|
52
|
+
if (!argText && !piped) {
|
|
53
|
+
return usage('nothing to do. Give a task: mindweave -p "what to do", or pipe it in.');
|
|
54
|
+
}
|
|
55
|
+
let session = null;
|
|
56
|
+
try {
|
|
57
|
+
const resumed = options.resumeId !== undefined || options.continueLast;
|
|
58
|
+
session = resumed ? await resumeSession(ctx.cwd, options.resumeId) : await createSession(ctx.cwd);
|
|
59
|
+
if (!session) {
|
|
60
|
+
return usage(options.resumeId ? `no saved session '${options.resumeId}' in this folder.` : "no earlier session in this folder to continue.");
|
|
61
|
+
}
|
|
62
|
+
// The model: what this project already uses, exactly as the interactive app starts. --model changes it
|
|
63
|
+
// for this run only (setSessionModel would save it). Its key being missing is then an error, not a quiet swap.
|
|
64
|
+
if (options.model) {
|
|
65
|
+
if (!isKnownModel(options.model))
|
|
66
|
+
return usage(`unknown model '${options.model}'. /model in a session lists them.`);
|
|
67
|
+
session.modelConfig = withModel(session.modelConfig, options.model);
|
|
68
|
+
}
|
|
69
|
+
const manifest = manifestForModel(session.modelConfig.model);
|
|
70
|
+
if (!manifest.local && !hasApiKey(manifest.apiKeyEnv)) {
|
|
71
|
+
const other = options.model ? null : usableFallback(session.modelConfig.model, hasApiKey);
|
|
72
|
+
if (!other) {
|
|
73
|
+
say(`mindweave: no API key for ${manifest.label}. Set ${manifest.apiKeyEnv} in ~/.mindweave/.env or the environment (keys: ${manifest.keysUrl}).`);
|
|
74
|
+
return EXIT_NO_KEY;
|
|
75
|
+
}
|
|
76
|
+
session.modelConfig = withModel(session.modelConfig, other);
|
|
77
|
+
say(`no ${manifest.label} key, using ${manifestForModel(other).label} instead.`);
|
|
78
|
+
}
|
|
79
|
+
// Lightning by default: the work is done directly, as it is interactively. A project can set its own default.
|
|
80
|
+
const mode = options.mode ?? (await defaultModeFor(ctx.cwd)) ?? DEFAULT_MODE;
|
|
81
|
+
applySessionMode(session, mode);
|
|
82
|
+
// Tells the model what the code already enforces, so it finishes instead of ending on "want me to...?", which
|
|
83
|
+
// in a script is a dead end. Carried at the end of the system prompt: cached, and absent from an interactive run.
|
|
84
|
+
session.toolContext.agentPrompt = UNATTENDED_NOTE;
|
|
85
|
+
const facts = {
|
|
86
|
+
sessionId: session.id,
|
|
87
|
+
model: session.modelConfig.model,
|
|
88
|
+
mode: sessionMode(session),
|
|
89
|
+
durationMs: 0,
|
|
90
|
+
resultText: "",
|
|
91
|
+
toolCalls: 0,
|
|
92
|
+
errors: [],
|
|
93
|
+
denials: [],
|
|
94
|
+
paused: null,
|
|
95
|
+
signal: null,
|
|
96
|
+
usage: { billed_tokens: 0, input_cached: 0, input_fresh: 0, output: 0 },
|
|
97
|
+
costUsd: 0,
|
|
98
|
+
costEstimated: false,
|
|
99
|
+
};
|
|
100
|
+
const format = options.format;
|
|
101
|
+
const calls = new Map();
|
|
102
|
+
const write = (e) => {
|
|
103
|
+
const aborted = ctx.signal?.aborted === true;
|
|
104
|
+
if (e.type === "toolStart") {
|
|
105
|
+
facts.toolCalls++;
|
|
106
|
+
calls.set(e.id, { name: e.tool ?? e.name, ...(e.arg ? { arg: e.arg } : {}) });
|
|
107
|
+
}
|
|
108
|
+
else if (e.type === "toolEnd" && !e.ok && /^declined /.test(e.summary)) {
|
|
109
|
+
const c = calls.get(e.id);
|
|
110
|
+
const denial = { tool: c?.name ?? "unknown", ...(c?.arg ? { arg: c.arg } : {}) };
|
|
111
|
+
facts.denials.push(denial);
|
|
112
|
+
}
|
|
113
|
+
else if (!aborted && (e.type === "error" || e.type === "notice")) {
|
|
114
|
+
// reportFailure speaks in a notice for a refusal or an outage and an error for the rest; both end the run.
|
|
115
|
+
facts.errors.push(e.type === "error" ? e.text : `${e.title}: ${e.body}`);
|
|
116
|
+
}
|
|
117
|
+
const lines = aborted && (e.type === "error" || e.type === "notice") ? null : linesFor(e, format, options.quiet);
|
|
118
|
+
if (lines?.stdout)
|
|
119
|
+
io.stdout.write(lines.stdout);
|
|
120
|
+
if (lines?.stderr)
|
|
121
|
+
io.stderr.write(lines.stderr);
|
|
122
|
+
};
|
|
123
|
+
if (format === "stream-json") {
|
|
124
|
+
io.stdout.write(JSON.stringify(initRecord({ sessionId: session.id, model: facts.model, mode: facts.mode, cwd: session.cwd, resumed })) + "\n");
|
|
125
|
+
}
|
|
126
|
+
// What the model is given. Typed words go through the same attachment rules as the interactive prompt (a path
|
|
127
|
+
// in quotes attaches the file). Piped text never does: it is data, and a path inside it is not the user's request.
|
|
128
|
+
let content;
|
|
129
|
+
let images = [];
|
|
130
|
+
if (argText) {
|
|
131
|
+
const prepared = await prepareMessage(session, { text: argText, ...(piped ? { pastes: [piped] } : {}) }, write);
|
|
132
|
+
content = prepared.content;
|
|
133
|
+
images = prepared.images;
|
|
134
|
+
}
|
|
135
|
+
else {
|
|
136
|
+
content = piped;
|
|
137
|
+
}
|
|
138
|
+
const before = { ...(session.spend ?? { billed: 0, cacheHit: 0, cacheMiss: 0, output: 0, costUsd: 0 }) };
|
|
139
|
+
const startLen = session.transcript.length;
|
|
140
|
+
await runTurn(session, { content, images }, {
|
|
141
|
+
onEvent: write,
|
|
142
|
+
...(ctx.signal ? { signal: ctx.signal } : {}),
|
|
143
|
+
onPause: (reason) => {
|
|
144
|
+
facts.paused = reason;
|
|
145
|
+
},
|
|
146
|
+
});
|
|
147
|
+
facts.signal = ctx.signal?.aborted ? (ctx.firedSignal?.() ?? "SIGINT") : null;
|
|
148
|
+
facts.durationMs = Date.now() - started;
|
|
149
|
+
facts.resultText = lastAnswer(session, startLen);
|
|
150
|
+
const after = session.spend;
|
|
151
|
+
if (after) {
|
|
152
|
+
facts.usage = {
|
|
153
|
+
billed_tokens: after.billed - before.billed,
|
|
154
|
+
input_cached: after.cacheHit - before.cacheHit,
|
|
155
|
+
input_fresh: after.cacheMiss - before.cacheMiss,
|
|
156
|
+
output: after.output - before.output,
|
|
157
|
+
};
|
|
158
|
+
facts.costUsd = after.costUsd - before.costUsd;
|
|
159
|
+
facts.costEstimated = after.estimated;
|
|
160
|
+
}
|
|
161
|
+
if (subtypeOf(facts) === "paused" && format !== "stream-json") {
|
|
162
|
+
say(`! stopped before it was done: ${pauseWords(facts.paused)}. Carry on with --continue.`);
|
|
163
|
+
}
|
|
164
|
+
io.stdout.write(finalStdout(format, facts));
|
|
165
|
+
return exitCodeOf(facts);
|
|
166
|
+
}
|
|
167
|
+
catch (error) {
|
|
168
|
+
say(`mindweave: ${error instanceof Error ? error.message : String(error)}`);
|
|
169
|
+
return EXIT_FAILED;
|
|
170
|
+
}
|
|
171
|
+
finally {
|
|
172
|
+
if (session)
|
|
173
|
+
await disposeSession(session).catch(() => { });
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
/** The assistant's last words this run, which is the answer. */
|
|
177
|
+
function lastAnswer(session, from) {
|
|
178
|
+
for (let i = session.transcript.length - 1; i >= from; i--) {
|
|
179
|
+
const entry = session.transcript[i];
|
|
180
|
+
if (entry.role === "assistant" && typeof entry.content === "string" && entry.content.trim())
|
|
181
|
+
return entry.content.trim();
|
|
182
|
+
}
|
|
183
|
+
return "";
|
|
184
|
+
}
|
|
185
|
+
function isKnownModel(model) {
|
|
186
|
+
return allProviders().some((p) => modelsOf(p).some((m) => m.id === model) || p.ownsModel?.(model) === true);
|
|
187
|
+
}
|
|
188
|
+
//# sourceMappingURL=run.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/headless/run.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -19,6 +19,14 @@
|
|
|
19
19
|
*/
|
|
20
20
|
import { loadWithProductionEnv } from "./cli/prodEnv.js";
|
|
21
21
|
import { registerInkSpeedups } from "./cli/inkSpeed.js";
|
|
22
|
+
import { parseStartupArgs } from "./cli/startupArgs.js";
|
|
23
|
+
// `-p` is one task with no screen. It is decided here, before the UI libraries are loaded or their
|
|
24
|
+
// loader hook is installed, so a script never pays for React and Ink and never needs a terminal.
|
|
25
|
+
const startup = parseStartupArgs(process.argv.slice(2));
|
|
26
|
+
if (startup.kind === "headless") {
|
|
27
|
+
const { runHeadlessMain } = await import("./headless/main.js");
|
|
28
|
+
process.exit(await runHeadlessMain(startup.argv));
|
|
29
|
+
}
|
|
22
30
|
registerInkSpeedups();
|
|
23
31
|
await loadWithProductionEnv();
|
|
24
32
|
await import("./main.js");
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;;;GAiBG;AACH,OAAO,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAExD,mBAAmB,EAAE,CAAC;AACtB,MAAM,qBAAqB,EAAE,CAAC;AAC9B,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;;;GAiBG;AACH,OAAO,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAExD,mGAAmG;AACnG,iGAAiG;AACjG,MAAM,OAAO,GAAG,gBAAgB,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AACxD,IAAI,OAAO,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;IAChC,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;IAC/D,OAAO,CAAC,IAAI,CAAC,MAAM,eAAe,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;AACpD,CAAC;AAED,mBAAmB,EAAE,CAAC;AACtB,MAAM,qBAAqB,EAAE,CAAC;AAC9B,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC"}
|
package/dist/main.js
CHANGED
|
@@ -38,6 +38,11 @@ if (startup.kind === "print") {
|
|
|
38
38
|
process.stdout.write(startup.text + "\n");
|
|
39
39
|
process.exit(0);
|
|
40
40
|
}
|
|
41
|
+
// `-p` is routed by index.ts before this file is loaded; this only narrows the type for what follows.
|
|
42
|
+
if (startup.kind === "headless") {
|
|
43
|
+
process.stderr.write("mindweave: -p must be started through the mindweave command.\n");
|
|
44
|
+
process.exit(2);
|
|
45
|
+
}
|
|
41
46
|
// Nothing below this point can run without a terminal to read from, and the failure
|
|
42
47
|
// without one is a stack trace through React internals on a process that exits 0.
|
|
43
48
|
// --help, --version and --reset-terminal are answered above, so they still work
|
package/dist/main.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"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"}
|