swarm-orchestrator 16.0.0 → 16.0.1
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/CHANGELOG.md +49 -0
- package/README.md +9 -0
- package/dist/agent/command-step.js +9 -2
- package/dist/agent/command-step.js.map +1 -1
- package/dist/agent/comparable-output.js +28 -0
- package/dist/agent/comparable-output.js.map +1 -0
- package/dist/agent/loop.js +12 -3
- package/dist/agent/loop.js.map +1 -1
- package/dist/agent/requirements-step.js +9 -2
- package/dist/agent/requirements-step.js.map +1 -1
- package/dist/source.json +1 -1
- package/dist/tools/chokepoint.js +18 -6
- package/dist/tools/chokepoint.js.map +1 -1
- package/dist/tools/working-directories.js +90 -0
- package/dist/tools/working-directories.js.map +1 -0
- package/package.json +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,55 @@
|
|
|
3
3
|
The agent. The verifier it consumes, `swarm-verify`, has its own changelog in
|
|
4
4
|
[moonrunnerkc/swarm-verify](https://github.com/moonrunnerkc/swarm-verify/blob/main/CHANGELOG.md).
|
|
5
5
|
|
|
6
|
+
## 16.0.1 - 2026-11-03
|
|
7
|
+
|
|
8
|
+
A patch release: three agent-loop defects and the swarm-verify 2.0.1 pin, from the follow-ups
|
|
9
|
+
of the 16.0.0 acceptance run. No new option, command or format.
|
|
10
|
+
|
|
11
|
+
### Fixed
|
|
12
|
+
|
|
13
|
+
- **A rerun of a passing test command counted as progress.** The no-progress rule compared a
|
|
14
|
+
command's output byte for byte, and vitest prints its start time and duration on every run, so
|
|
15
|
+
one model ran the same passing test file 36 times until the step budget. The comparison now
|
|
16
|
+
takes out colour codes, clock times, timestamps, durations and temporary paths; the model still
|
|
17
|
+
reads the output as printed.
|
|
18
|
+
- **The same requirements block, sent again without the completion marker, kept the run going.**
|
|
19
|
+
A model wrote "The task is complete" in prose 29 times running and never sent the marker. A
|
|
20
|
+
block that leaves the requirement record unchanged, right after another block, now stops the
|
|
21
|
+
loop as no progress, and finalization judges the tree.
|
|
22
|
+
- **A relative path after `cd` was read from the workspace root.** `cd src/pkg && grep x
|
|
23
|
+
../../tests` was refused as outside the workspace, and `cd .git && cat config` was checked as a
|
|
24
|
+
root file named `config` and allowed, though it reads `.git/config`, which the credential
|
|
25
|
+
denylist refuses. Each path is now read from the directory the command would open it in,
|
|
26
|
+
following `cd`, `pushd` and `chdir`; a `cd` the reader cannot name makes the command unreadable.
|
|
27
|
+
- **swarm-verify 2.0.1**, pinned exactly. A refused dependency preparation is recorded as refused
|
|
28
|
+
and its replay meets the same refusal, where 2.0.0 recorded no preparation and the replay
|
|
29
|
+
diverged. A test file moved and edited (one more `.parent` to reach its fixtures) is judged by
|
|
30
|
+
its base version at the new path, where 2.0.0 read it as deleted and ran both copies. A judged
|
|
31
|
+
process ended by a signal no longer reads as tampering, and a worker thread its runner
|
|
32
|
+
terminated is named as unchecked rather than failing the held-out check; a relative `SWARM_HOME` keeps its sealed checks; the mutation pass no longer mutates
|
|
33
|
+
inside multi-line strings and comments. See swarm-verify's changelog.
|
|
34
|
+
|
|
35
|
+
### Corrected
|
|
36
|
+
|
|
37
|
+
- 16.0.0's known limit said the best cross-module refactor attempt (tracemantle) "broke the
|
|
38
|
+
module it moved". It did not: `history_io.py` was a working re-export, and the seven failures
|
|
39
|
+
are the tests that read fixtures, in a test file moved without the path to them. swarm-verify
|
|
40
|
+
2.0.0 also refused the correct move, which edits that path; that was the verifier defect fixed
|
|
41
|
+
in 2.0.1.
|
|
42
|
+
- Rerun once against 2.0.1 with the same local model (gemma4-31b-greedy-128k, isolated, session
|
|
43
|
+
20261103T175257-900062), the task is still incomplete: the model moved both modules with working
|
|
44
|
+
shims and moved the three test files byte for byte, so the same seven fixture tests fail. 2.0.1
|
|
45
|
+
read the three moves and attributed the seven failures to them; the replay agrees. The
|
|
46
|
+
limitation stands, as a limit of the models tried: no local model has completed the task.
|
|
47
|
+
|
|
48
|
+
### Added
|
|
49
|
+
|
|
50
|
+
- docs/acceptance/2026-10-31/: the two isolated fix runs from real bug-fix commits, with the fix
|
|
51
|
+
commit's test sealed as a held-out check (`f-fix-isolated/`; neither completed, so the fix
|
|
52
|
+
category stays host-verified only), the comparison of t6 and h2 done by hand with the local
|
|
53
|
+
runs (`comparison/`), and the t6 rerun against 2.0.1 (`t6-tracemantle/closing-attempt-3/`).
|
|
54
|
+
|
|
6
55
|
## 16.0.0 - 2026-11-01
|
|
7
56
|
|
|
8
57
|
Swarm Orchestrator is the coding product again, and `swarm-verify` 2.0.0 is the verifier it
|
package/README.md
CHANGED
|
@@ -45,6 +45,15 @@ npm install -g swarm-orchestrator
|
|
|
45
45
|
swarm run "<task>"
|
|
46
46
|
```
|
|
47
47
|
|
|
48
|
+
A run prints the directory of its evidence and the attestation of its final verification. The
|
|
49
|
+
verifier is its own package; installed beside Swarm, it reruns that verification from the record
|
|
50
|
+
and says whether it agrees:
|
|
51
|
+
|
|
52
|
+
```sh
|
|
53
|
+
npm install -g swarm-verify
|
|
54
|
+
swarm-verify replay <directory holding the printed attestation> --workspace <repo>
|
|
55
|
+
```
|
|
56
|
+
|
|
48
57
|
With no model named, Swarm asks Ollama what is installed, leaves out cloud entries, embedding
|
|
49
58
|
models and anything that would not fit in memory at the context (weights plus KV cache), probes
|
|
50
59
|
the strongest candidates until one follows its shell protocol, and prints the one it chose and
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { mkdir, stat, writeFile } from "node:fs/promises";
|
|
2
2
|
import { isAbsolute, join, relative, resolve } from "node:path";
|
|
3
3
|
import { readShellCommand } from "../tools/shell-command.js";
|
|
4
|
+
import { comparableOutput } from "./comparable-output.js";
|
|
4
5
|
import { evidenceRef, excerptBytes } from "./exchange.js";
|
|
5
6
|
import { outputCap, truncate } from "./prompt.js";
|
|
6
7
|
/** Files one command can name in a digest line; the rest are left out. */
|
|
@@ -38,10 +39,15 @@ export async function runCommandStep(input) {
|
|
|
38
39
|
await writeFile(path, outcome.output);
|
|
39
40
|
saved = relative(input.outputs.root, path);
|
|
40
41
|
}
|
|
41
|
-
|
|
42
|
+
// A runner that prints its clock never prints the same bytes twice, so the result is compared
|
|
43
|
+
// without clocks, durations and temporary paths.
|
|
44
|
+
const comparable = comparableOutput(outcome.output);
|
|
45
|
+
const same = input.command === input.previous.command && comparable === input.previous.comparable;
|
|
42
46
|
const repeats = same ? input.previous.repeats + 1 : 1;
|
|
43
47
|
// At temperature 0 a repeated command and its unchanged output can repeat forever.
|
|
44
|
-
const again = same
|
|
48
|
+
const again = same
|
|
49
|
+
? "This is the command you ran last turn, and its result is unchanged (times and durations aside).\n"
|
|
50
|
+
: "";
|
|
45
51
|
const exitCode = outcome.decision === "allowed" ? outcome.exitCode : null;
|
|
46
52
|
const status = outcome.decision === "allowed" ? `exit code: ${exitCode}` : outcome.decision;
|
|
47
53
|
const where = saved !== null && bytes > outputCap ? `\n[full output: ${saved}]` : "";
|
|
@@ -60,6 +66,7 @@ export async function runCommandStep(input) {
|
|
|
60
66
|
why: ok || lastLine.length === 0 ? null : lastLine,
|
|
61
67
|
},
|
|
62
68
|
repeats,
|
|
69
|
+
comparable,
|
|
63
70
|
output: outcome.output,
|
|
64
71
|
};
|
|
65
72
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"command-step.js","sourceRoot":"","sources":["../../src/agent/command-step.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEhE,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAC7D,OAAO,EAAoB,WAAW,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC5E,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"command-step.js","sourceRoot":"","sources":["../../src/agent/command-step.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { stripVTControlCharacters } from "node:util";
|
|
2
|
+
/**
|
|
3
|
+
* What of a command's output the no-progress rule compares: the text without the parts that
|
|
4
|
+
* change on every run of the same command against the same tree. Test runners print the clock
|
|
5
|
+
* and how long each stage took (vitest's `Start at` and `Duration`, pytest's `in 0.12s`, jest's
|
|
6
|
+
* `Time:`), and many tools name a fresh temporary directory. Colour codes go too, since whether a
|
|
7
|
+
* tool colours its output can depend on the terminal it finds. The model is shown the output as
|
|
8
|
+
* printed; only the comparison reads this.
|
|
9
|
+
*/
|
|
10
|
+
// 2026-11-02T21:04:05.123Z, 2026-11-02 21:04:05+00:00
|
|
11
|
+
const isoTimestamp = /\b\d{4}-\d{2}-\d{2}[T ]\d{2}:\d{2}(?::\d{2}(?:[.,]\d+)?)?(?:Z|[+-]\d{2}:?\d{2})?\b/g;
|
|
12
|
+
// 14:06:34, 14:06:34.512
|
|
13
|
+
const clockTime = /\b\d{1,2}:\d{2}:\d{2}(?:[.,]\d+)?\b/g;
|
|
14
|
+
// 0m0.123s, as `time` prints it
|
|
15
|
+
const minutesSeconds = /\b\d+m\d+(?:\.\d+)?s\b/g;
|
|
16
|
+
// 134ms, 0.12s, 1.5 sec, 3 seconds, 12µs, 2 min
|
|
17
|
+
const duration = /\b\d+(?:\.\d+)?\s?(?:ms|µs|us|ns|s|secs?|seconds?|mins?|minutes?)(?![\p{L}\p{N}_])/gu;
|
|
18
|
+
// /tmp/x, /private/tmp/x, /var/folders/ab/cd/T/x, /private/var/folders/...
|
|
19
|
+
const temporaryPath = /(?:\/private)?(?:\/tmp|\/var\/folders)\/[^\s'"`:)\]]*/g;
|
|
20
|
+
export function comparableOutput(output) {
|
|
21
|
+
return stripVTControlCharacters(output)
|
|
22
|
+
.replace(temporaryPath, "<temporary path>")
|
|
23
|
+
.replace(isoTimestamp, "<time>")
|
|
24
|
+
.replace(clockTime, "<time>")
|
|
25
|
+
.replace(minutesSeconds, "<duration>")
|
|
26
|
+
.replace(duration, "<duration>");
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=comparable-output.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"comparable-output.js","sourceRoot":"","sources":["../../src/agent/comparable-output.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,WAAW,CAAC;AAErD;;;;;;;GAOG;AAEH,sDAAsD;AACtD,MAAM,YAAY,GAChB,qFAAqF,CAAC;AACxF,yBAAyB;AACzB,MAAM,SAAS,GAAG,sCAAsC,CAAC;AACzD,gCAAgC;AAChC,MAAM,cAAc,GAAG,yBAAyB,CAAC;AACjD,gDAAgD;AAChD,MAAM,QAAQ,GACZ,sFAAsF,CAAC;AACzF,2EAA2E;AAC3E,MAAM,aAAa,GAAG,wDAAwD,CAAC;AAE/E,MAAM,UAAU,gBAAgB,CAAC,MAAc;IAC7C,OAAO,wBAAwB,CAAC,MAAM,CAAC;SACpC,OAAO,CAAC,aAAa,EAAE,kBAAkB,CAAC;SAC1C,OAAO,CAAC,YAAY,EAAE,QAAQ,CAAC;SAC/B,OAAO,CAAC,SAAS,EAAE,QAAQ,CAAC;SAC5B,OAAO,CAAC,cAAc,EAAE,YAAY,CAAC;SACrC,OAAO,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;AACrC,CAAC"}
|
package/dist/agent/loop.js
CHANGED
|
@@ -41,8 +41,10 @@ export async function runLoop(options) {
|
|
|
41
41
|
let turnStarted = null;
|
|
42
42
|
let longestTurnMs = 0;
|
|
43
43
|
let verification = null;
|
|
44
|
-
let previous = { command: "",
|
|
44
|
+
let previous = { command: "", comparable: "", repeats: 0 };
|
|
45
45
|
let malformed = 0;
|
|
46
|
+
// Whether the last turn was a requirements block without the completion marker.
|
|
47
|
+
let proposedLast = false;
|
|
46
48
|
const result = (stop, reason = null) => ({
|
|
47
49
|
stop,
|
|
48
50
|
reason,
|
|
@@ -140,6 +142,8 @@ export async function runLoop(options) {
|
|
|
140
142
|
},
|
|
141
143
|
});
|
|
142
144
|
const parsed = read.parsed;
|
|
145
|
+
const afterProposal = proposedLast;
|
|
146
|
+
proposedLast = false;
|
|
143
147
|
malformed = parsed.kind === "malformed" ? malformed + 1 : 0;
|
|
144
148
|
if (parsed.kind === "malformed") {
|
|
145
149
|
if (malformed >= unusableAfter) {
|
|
@@ -164,9 +168,9 @@ export async function runLoop(options) {
|
|
|
164
168
|
outputs: options.outputs,
|
|
165
169
|
previous,
|
|
166
170
|
});
|
|
167
|
-
previous = { command: parsed.command,
|
|
171
|
+
previous = { command: parsed.command, comparable: ran.comparable, repeats: ran.repeats };
|
|
168
172
|
if (ran.repeats >= repeatLimit) {
|
|
169
|
-
return result("no-progress", `the same command printed the same
|
|
173
|
+
return result("no-progress", `the same command printed the same result ${ran.repeats} turns running`);
|
|
170
174
|
}
|
|
171
175
|
// A command repeated while findings are open is the run circling: point back at them.
|
|
172
176
|
const open = openFindings(findings);
|
|
@@ -194,6 +198,11 @@ export async function runLoop(options) {
|
|
|
194
198
|
options.log(`requirements ${proposed.ids}`);
|
|
195
199
|
proposal = `a requirements block, recorded as ${proposed.ids} [evidence ${proposed.evidence}]`;
|
|
196
200
|
if (!parsed.complete) {
|
|
201
|
+
// The same record twice running with no marker: the model is not going to send it.
|
|
202
|
+
if (afterProposal && proposed.unchanged) {
|
|
203
|
+
return result("no-progress", "the same requirements block arrived twice running without the completion marker, and the record did not change");
|
|
204
|
+
}
|
|
205
|
+
proposedLast = true;
|
|
197
206
|
conversation.add(noteExchange({
|
|
198
207
|
step: steps,
|
|
199
208
|
reply: read.text,
|
package/dist/agent/loop.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loop.js","sourceRoot":"","sources":["../../src/agent/loop.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACtF,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE9D,OAAO,EAAE,UAAU,EAAc,MAAM,YAAY,CAAC;AACpD,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AACvF,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAI7D,sEAAsE;AACtE,MAAM,kBAAkB,GAAG,GAAG,CAAC;AAC/B,4FAA4F;AAC5F,MAAM,WAAW,GAAG,CAAC,CAAC;AACtB,2FAA2F;AAC3F,MAAM,aAAa,GAAG,CAAC,CAAC;AAExB,MAAM,YAAY,GAAG,CAAC,QAAuB,EAAE,EAAE,CAC/C,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AAErE;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,OAAoB;IAChD,MAAM,YAAY,GAAG,kBAAkB,CAAC;QACtC,MAAM,EAAE,CAAC,YAAY,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC;QAC3F,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,QAAQ;KACrC,CAAC,CAAC;IACH,IAAI,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAC5B,IAAI,QAAQ,GAAkB,IAAI,CAAC;IACnC,gEAAgE;IAChE,IAAI,OAAO,GAAkB,IAAI,CAAC;IAClC,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,KAAK,GAAU,OAAO,CAAC;IAC3B,4EAA4E;IAC5E,IAAI,WAAW,GAAG,CAAC,CAAC;IACpB,IAAI,QAAQ,GAAG,IAAI,GAAG,EAAkB,CAAC;IACzC,IAAI,aAAa,GAAG,CAAC,CAAC;IACtB,IAAI,MAAM,GAAG,KAAK,CAAC;IACnB,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,IAAI,WAAW,GAAkB,IAAI,CAAC;IACtC,IAAI,aAAa,GAAG,CAAC,CAAC;IACtB,IAAI,YAAY,GAAwB,IAAI,CAAC;IAC7C,IAAI,QAAQ,GAAG,EAAE,OAAO,EAAE,EAAE,EAAE,
|
|
1
|
+
{"version":3,"file":"loop.js","sourceRoot":"","sources":["../../src/agent/loop.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,13 +4,14 @@ import { applyProposal, recordSha256 } from "./requirement-record.js";
|
|
|
4
4
|
/** Applies a proposed requirements block to the record and keeps the result as evidence. */
|
|
5
5
|
export async function runRequirementsStep(input) {
|
|
6
6
|
const record = applyProposal(input.task, input.record, input.json);
|
|
7
|
+
const sha256 = recordSha256(record);
|
|
7
8
|
const recorded = await input.evidence.record({
|
|
8
9
|
type: "requirements",
|
|
9
10
|
actor: input.actor,
|
|
10
11
|
provenance: ["model"],
|
|
11
12
|
// Through JSON, so the ledger stores the record as plain data.
|
|
12
13
|
payload: JSON.parse(JSON.stringify({
|
|
13
|
-
recordSha256:
|
|
14
|
+
recordSha256: sha256,
|
|
14
15
|
requirements: record.requirements,
|
|
15
16
|
notes: record.notes,
|
|
16
17
|
})),
|
|
@@ -21,6 +22,12 @@ export async function runRequirementsStep(input) {
|
|
|
21
22
|
...record.notes,
|
|
22
23
|
`When the task is done, reply with ${completionMarker} on a line of its own, outside any block.`,
|
|
23
24
|
].join("\n");
|
|
24
|
-
return {
|
|
25
|
+
return {
|
|
26
|
+
record,
|
|
27
|
+
ids,
|
|
28
|
+
note,
|
|
29
|
+
evidence: evidenceRef(recorded.record.payloadDigest),
|
|
30
|
+
unchanged: sha256 === recordSha256(input.record),
|
|
31
|
+
};
|
|
25
32
|
}
|
|
26
33
|
//# sourceMappingURL=requirements-step.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"requirements-step.js","sourceRoot":"","sources":["../../src/agent/requirements-step.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,aAAa,EAA0B,YAAY,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"requirements-step.js","sourceRoot":"","sources":["../../src/agent/requirements-step.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,aAAa,EAA0B,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAc9F,4FAA4F;AAC5F,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,KAMzC;IACC,MAAM,MAAM,GAAG,aAAa,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;IACnE,MAAM,MAAM,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;IACpC,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC;QAC3C,IAAI,EAAE,cAAc;QACpB,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,UAAU,EAAE,CAAC,OAAO,CAAC;QACrB,+DAA+D;QAC/D,OAAO,EAAE,IAAI,CAAC,KAAK,CACjB,IAAI,CAAC,SAAS,CAAC;YACb,YAAY,EAAE,MAAM;YACpB,YAAY,EAAE,MAAM,CAAC,YAAY;YACjC,KAAK,EAAE,MAAM,CAAC,KAAK;SACpB,CAAC,CACH;KACF,CAAC,CAAC;IACH,MAAM,GAAG,GAAG,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAChE,MAAM,IAAI,GAAG;QACX,YAAY,GAAG,GAAG;QAClB,GAAG,MAAM,CAAC,KAAK;QACf,qCAAqC,gBAAgB,2CAA2C;KACjG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACb,OAAO;QACL,MAAM;QACN,GAAG;QACH,IAAI;QACJ,QAAQ,EAAE,WAAW,CAAC,QAAQ,CAAC,MAAM,CAAC,aAAa,CAAC;QACpD,SAAS,EAAE,MAAM,KAAK,YAAY,CAAC,KAAK,CAAC,MAAM,CAAC;KACjD,CAAC;AACJ,CAAC"}
|
package/dist/source.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"describe":"v16.0.
|
|
1
|
+
{"describe":"v16.0.1"}
|
package/dist/tools/chokepoint.js
CHANGED
|
@@ -1,10 +1,13 @@
|
|
|
1
|
+
import { statSync } from "node:fs";
|
|
2
|
+
import { resolve } from "node:path";
|
|
1
3
|
import { runProcessGroup } from "swarm-verify/execution";
|
|
2
4
|
import { refusedAction } from "./refused-actions.js";
|
|
3
|
-
import {
|
|
5
|
+
import { readShellPipeline } from "./shell-command.js";
|
|
6
|
+
import { pathsWhereTheyRun } from "./working-directories.js";
|
|
4
7
|
const maxOutputBytes = 4 * 1024 * 1024;
|
|
5
8
|
const onlyComments = (command) => command.split("\n").every((line) => line.trim() === "" || line.trim().startsWith("#"));
|
|
6
9
|
const nothingToRun = "the command holds only comments, so there is nothing to run. Reply with a command that acts.";
|
|
7
|
-
const unreadable = "this command cannot be read without running a shell (a substitution such as $(...), an expansion, a subshell, a brace group,
|
|
10
|
+
const unreadable = "this command cannot be read without running a shell (a substitution such as $(...), an expansion, a subshell, a brace group, a program handed to a shell, or a cd to somewhere other than one named directory), so the paths it opens cannot be checked. Run the inner command on its own and write its result into the next command literally.";
|
|
8
11
|
/**
|
|
9
12
|
* The single way a command the model wrote runs. The request is on the ledger before anything
|
|
10
13
|
* happens, every path a shell word could open goes through the guard, an off-allowlist program
|
|
@@ -40,18 +43,19 @@ export function createChokepoint(options) {
|
|
|
40
43
|
const refused = pipeline === null ? null : refusedAction(pipeline);
|
|
41
44
|
if (refused !== null)
|
|
42
45
|
return settle("denied", `denied: ${refused}`, null);
|
|
43
|
-
const
|
|
46
|
+
const root = options.guard.workspaceRoot;
|
|
47
|
+
const paths = pathsWhereTheyRun(command, (path) => isDirectory(resolve(root, path)));
|
|
44
48
|
// A string the reader cannot read names paths nothing here checked. A person may still run
|
|
45
49
|
// it; auto approval has nobody to judge it, so it is refused rather than run unchecked.
|
|
46
|
-
if (
|
|
50
|
+
if (paths === null && options.approval === "auto") {
|
|
47
51
|
return settle("denied", `denied: ${onlyComments(command) ? nothingToRun : unreadable}`, null);
|
|
48
52
|
}
|
|
49
|
-
for (const path of
|
|
53
|
+
for (const path of paths ?? []) {
|
|
50
54
|
const verdict = options.guard.checkPath(path);
|
|
51
55
|
if (!verdict.allowed)
|
|
52
56
|
return settle("denied", `denied: ${verdict.reason}`, null);
|
|
53
57
|
}
|
|
54
|
-
if (!options.guard.isCommandAllowed(command)) {
|
|
58
|
+
if (paths === null || !options.guard.isCommandAllowed(command)) {
|
|
55
59
|
const programs = options.guard.disallowedExecutables(command) ?? [];
|
|
56
60
|
const answer = await decide(options, allowance, { command, programs, explanation: "" });
|
|
57
61
|
await options.evidence.record({
|
|
@@ -81,6 +85,14 @@ export function createChokepoint(options) {
|
|
|
81
85
|
},
|
|
82
86
|
};
|
|
83
87
|
}
|
|
88
|
+
function isDirectory(path) {
|
|
89
|
+
try {
|
|
90
|
+
return statSync(path).isDirectory();
|
|
91
|
+
}
|
|
92
|
+
catch {
|
|
93
|
+
return false;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
84
96
|
async function decide(options, allowance, request) {
|
|
85
97
|
if (options.approval === "auto")
|
|
86
98
|
return { outcome: "pre-approved", decidedBy: "approval-mode" };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chokepoint.js","sourceRoot":"","sources":["../../src/tools/chokepoint.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAGzD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"chokepoint.js","sourceRoot":"","sources":["../../src/tools/chokepoint.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAGzD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAwC7D,MAAM,cAAc,GAAG,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC;AAEvC,MAAM,YAAY,GAAG,CAAC,OAAe,EAAE,EAAE,CACvC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;AAEzF,MAAM,YAAY,GAChB,8FAA8F,CAAC;AAEjG,MAAM,UAAU,GACd,iVAAiV,CAAC;AAEpV;;;;;;GAMG;AACH,MAAM,UAAU,gBAAgB,CAAC,OAA0B;IACzD,MAAM,SAAS,GAAG,IAAI,GAAG,EAAU,CAAC;IACpC,IAAI,KAAK,GAAG,CAAC,CAAC;IAEd,OAAO;QACL,KAAK,CAAC,GAAG,CAAC,OAAe;YACvB,KAAK,IAAI,CAAC,CAAC;YACX,MAAM,MAAM,GAAG,QAAQ,KAAK,EAAE,CAAC;YAC/B,MAAM,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC;gBAC5B,IAAI,EAAE,WAAW;gBACjB,KAAK,EAAE,SAAS;gBAChB,UAAU,EAAE,CAAC,OAAO,CAAC;gBACrB,OAAO,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,OAAO,EAAE;aAClE,CAAC,CAAC;YACH,MAAM,MAAM,GAAG,KAAK,EAClB,QAAkC,EAClC,MAAc,EACd,QAAuB,EACvB,MAAM,GAAqD,EAAE,EACtC,EAAE;gBACzB,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC;oBAC7C,IAAI,EAAE,WAAW;oBACjB,KAAK,EAAE,SAAS;oBAChB,UAAU,EAAE,CAAC,OAAO,EAAE,aAAa,CAAC;oBACpC,OAAO,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,EAAE;iBAClF,CAAC,CAAC;gBACH,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC;YAC/E,CAAC,CAAC;YAEF,IAAI,OAAO,CAAC,MAAM,EAAE,OAAO;gBAAE,OAAO,MAAM,CAAC,QAAQ,EAAE,4BAA4B,EAAE,IAAI,CAAC,CAAC;YACzF,MAAM,QAAQ,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC;YAC5C,MAAM,OAAO,GAAG,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;YACnE,IAAI,OAAO,KAAK,IAAI;gBAAE,OAAO,MAAM,CAAC,QAAQ,EAAE,WAAW,OAAO,EAAE,EAAE,IAAI,CAAC,CAAC;YAC1E,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC;YACzC,MAAM,KAAK,GAAG,iBAAiB,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;YACrF,2FAA2F;YAC3F,wFAAwF;YACxF,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,CAAC,QAAQ,KAAK,MAAM,EAAE,CAAC;gBAClD,OAAO,MAAM,CACX,QAAQ,EACR,WAAW,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,UAAU,EAAE,EAC9D,IAAI,CACL,CAAC;YACJ,CAAC;YACD,KAAK,MAAM,IAAI,IAAI,KAAK,IAAI,EAAE,EAAE,CAAC;gBAC/B,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;gBAC9C,IAAI,CAAC,OAAO,CAAC,OAAO;oBAAE,OAAO,MAAM,CAAC,QAAQ,EAAE,WAAW,OAAO,CAAC,MAAM,EAAE,EAAE,IAAI,CAAC,CAAC;YACnF,CAAC;YACD,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,gBAAgB,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC/D,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,qBAAqB,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;gBACpE,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,OAAO,EAAE,SAAS,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC,CAAC;gBACxF,MAAM,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC;oBAC5B,IAAI,EAAE,cAAc;oBACpB,KAAK,EAAE,SAAS;oBAChB,UAAU,EAAE,CAAC,MAAM,CAAC,SAAS,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC;oBAC5D,OAAO,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,GAAG,QAAQ,CAAC,EAAE,GAAG,MAAM,EAAE;iBACjE,CAAC,CAAC;gBACH,IAAI,MAAM,CAAC,OAAO,KAAK,UAAU,EAAE,CAAC;oBAClC,OAAO,MAAM,CACX,QAAQ,EACR,WAAW,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,cAAc,qDAAqD,EAC1H,IAAI,CACL,CAAC;gBACJ,CAAC;YACH,CAAC;YACD,MAAM,GAAG,GAAG,MAAM,eAAe,CAAC,SAAS,EAAE,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE;gBAC5D,GAAG,EAAE,OAAO,CAAC,KAAK,CAAC,aAAa;gBAChC,GAAG,EAAE,OAAO,CAAC,KAAK,CAAC,gBAAgB,CAAC,SAAS;gBAC7C,SAAS,EAAE,OAAO,CAAC,SAAS;gBAC5B,cAAc;gBACd,MAAM,EAAE,OAAO,CAAC,MAAM;aACvB,CAAC,CAAC;YACH,MAAM,MAAM,GAAG,GAAG,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;YAClF,IAAI,GAAG,CAAC,YAAY,KAAK,IAAI;gBAAE,OAAO,MAAM,CAAC,QAAQ,EAAE,GAAG,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;YAC/E,OAAO,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,CAAC,QAAQ,EAAE;gBAC7C,QAAQ,EAAE,GAAG,CAAC,QAAQ;gBACtB,SAAS,EAAE,GAAG,CAAC,SAAS;aACzB,CAAC,CAAC;QACL,CAAC;KACF,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAAC,IAAY;IAC/B,IAAI,CAAC;QACH,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;IACtC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,KAAK,UAAU,MAAM,CACnB,OAA0B,EAC1B,SAAsB,EACtB,OAA4B;IAE5B,IAAI,OAAO,CAAC,QAAQ,KAAK,MAAM;QAAE,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,eAAe,EAAE,CAAC;IAChG,MAAM,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC;IAC7B,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,QAAQ,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;QAC/E,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,eAAe,EAAE,CAAC;IACjE,CAAC;IACD,IAAI,OAAO,CAAC,OAAO,KAAK,IAAI;QAAE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,eAAe,EAAE,CAAC;IACzF,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC;QACnC,GAAG,OAAO;QACV,WAAW,EAAE,IAAI,OAAO,CAAC,OAAO,sDAAsD;KACvF,CAAC,CAAC;IACH,IAAI,MAAM,KAAK,QAAQ;QAAE,KAAK,MAAM,OAAO,IAAI,QAAQ;YAAE,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAChF,OAAO,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC;AACnF,CAAC"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { isAbsolute, join } from "node:path";
|
|
2
|
+
import { pathsACommandCouldOpen } from "./command-operands.js";
|
|
3
|
+
import { readShellStages } from "./shell-command.js";
|
|
4
|
+
/**
|
|
5
|
+
* The paths a command could open, each written from the directory it would be opened in. A `cd`
|
|
6
|
+
* moves the shell, so after `cd src && cat ../package.json` the file is the workspace's own
|
|
7
|
+
* `package.json`, and after `cd .git && cat config` it is `.git/config`. Read from the workspace
|
|
8
|
+
* root instead, the first was refused as outside the workspace and the second allowed as a file
|
|
9
|
+
* called `config`.
|
|
10
|
+
*
|
|
11
|
+
* Where the shell could be in more than one directory, a path is returned from each, so the guard
|
|
12
|
+
* rules on every file it could be. A stage runs in the directory a `cd` moved to only when `&&`
|
|
13
|
+
* alone joins it to that `cd`; after `;` or `||` the `cd` may not have run or may have failed.
|
|
14
|
+
* The one `cd` that cannot fail is the first command, naming a directory that exists now. A `cd`
|
|
15
|
+
* inside a pipe runs in a subshell and moves nothing. Directories are relative to the root, or
|
|
16
|
+
* absolute where the `cd` named an absolute path; the guard rules on each `cd` target as well.
|
|
17
|
+
*
|
|
18
|
+
* Null where the string cannot be read, or a `cd` goes somewhere this cannot name (`cd -`,
|
|
19
|
+
* `popd`, more than one operand).
|
|
20
|
+
*/
|
|
21
|
+
export function pathsWhereTheyRun(command, isDirectory) {
|
|
22
|
+
const stages = readShellStages(command);
|
|
23
|
+
if (stages === null)
|
|
24
|
+
return null;
|
|
25
|
+
const pipelines = [];
|
|
26
|
+
for (const stage of stages) {
|
|
27
|
+
if (stage.after === "|")
|
|
28
|
+
pipelines.at(-1)?.push(stage);
|
|
29
|
+
else
|
|
30
|
+
pipelines.push([stage]);
|
|
31
|
+
}
|
|
32
|
+
const paths = new Set();
|
|
33
|
+
// Every directory the shell may be in now, and, while only `&&` follows a cd, where it is
|
|
34
|
+
// if the commands so far succeeded.
|
|
35
|
+
let shell = ["."];
|
|
36
|
+
let chain = null;
|
|
37
|
+
for (const [index, pipeline] of pipelines.entries()) {
|
|
38
|
+
const after = pipeline[0]?.after ?? null;
|
|
39
|
+
const here = after === "&&" && chain !== null ? chain : shell;
|
|
40
|
+
if (after !== "&&")
|
|
41
|
+
chain = null;
|
|
42
|
+
for (const stage of pipeline) {
|
|
43
|
+
const opened = pathsACommandCouldOpen(stage);
|
|
44
|
+
if (opened === null)
|
|
45
|
+
return null;
|
|
46
|
+
for (const path of opened)
|
|
47
|
+
for (const directory of here)
|
|
48
|
+
paths.add(from(directory, path));
|
|
49
|
+
}
|
|
50
|
+
const [only] = pipeline;
|
|
51
|
+
if (pipeline.length !== 1 || only === undefined || !movesTheShell(only.executable))
|
|
52
|
+
continue;
|
|
53
|
+
const target = destination(only);
|
|
54
|
+
if (target === null)
|
|
55
|
+
return null;
|
|
56
|
+
const moved = [...new Set(here.map((directory) => from(directory, target)))];
|
|
57
|
+
const certain = index === 0 && moved.every((directory) => isDirectory(directory));
|
|
58
|
+
shell = certain ? moved : [...new Set([...shell, ...moved])];
|
|
59
|
+
chain = moved;
|
|
60
|
+
}
|
|
61
|
+
return [...paths];
|
|
62
|
+
}
|
|
63
|
+
const movesTheShell = (executable) => ["cd", "pushd", "popd", "chdir"].includes(executable);
|
|
64
|
+
/** Where a `cd` or `pushd` goes, or null where it is not one directory this can name. */
|
|
65
|
+
function destination(stage) {
|
|
66
|
+
if (stage.executable === "popd")
|
|
67
|
+
return null;
|
|
68
|
+
const operands = [];
|
|
69
|
+
let options = true;
|
|
70
|
+
for (const word of stage.arguments) {
|
|
71
|
+
if (options && word === "--")
|
|
72
|
+
options = false;
|
|
73
|
+
else if (options && /^-[LPe@]+$/.test(word))
|
|
74
|
+
continue;
|
|
75
|
+
else if (options && word.startsWith("-"))
|
|
76
|
+
return null;
|
|
77
|
+
else
|
|
78
|
+
operands.push(word);
|
|
79
|
+
}
|
|
80
|
+
// `cd` alone goes home.
|
|
81
|
+
if (operands.length === 0)
|
|
82
|
+
return "~";
|
|
83
|
+
return operands.length === 1 ? (operands[0] ?? null) : null;
|
|
84
|
+
}
|
|
85
|
+
function from(directory, path) {
|
|
86
|
+
if (isAbsolute(path) || path === "~" || path.startsWith("~/") || directory === ".")
|
|
87
|
+
return path;
|
|
88
|
+
return join(directory, path);
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=working-directories.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"working-directories.js","sourceRoot":"","sources":["../../src/tools/working-directories.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "swarm-orchestrator",
|
|
3
|
-
"version": "16.0.
|
|
3
|
+
"version": "16.0.1",
|
|
4
4
|
"description": "A local coding agent: give it an engineering task and it makes the change, checks each requirement with swarm-verify, repairs supported failures, and returns the patch with evidence of what is complete and what remains uncertain.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"coding-agent",
|
|
@@ -55,7 +55,7 @@
|
|
|
55
55
|
},
|
|
56
56
|
"dependencies": {
|
|
57
57
|
"smol-toml": "^1.8.0",
|
|
58
|
-
"swarm-verify": "2.0.
|
|
58
|
+
"swarm-verify": "2.0.1",
|
|
59
59
|
"zod": "^4.4.3"
|
|
60
60
|
},
|
|
61
61
|
"license": "ISC",
|