@sema-agent/core 7.45.0 → 7.46.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/CHANGELOG.md +246 -1
- package/dist/agents/extra-tool-names.d.ts +65 -0
- package/dist/agents/extra-tool-names.js +124 -0
- package/dist/agents/subagent.d.ts +17 -5
- package/dist/agents/subagent.js +33 -25
- package/dist/agents/tool-filter.d.ts +17 -1
- package/dist/agents/tool-filter.js +7 -0
- package/dist/core/agent-config-dir.d.ts +20 -0
- package/dist/core/agent-config-dir.js +49 -0
- package/dist/core/allow-entry.d.ts +5 -3
- package/dist/core/allow-entry.js +3 -1
- package/dist/core/ask-origin.js +1 -1
- package/dist/core/checkpoint-store.d.ts +39 -2
- package/dist/core/effective-path-target.d.ts +136 -4
- package/dist/core/effective-path-target.js +110 -2
- package/dist/core/engine-notice.d.ts +5 -0
- package/dist/core/gate-fold.js +3 -0
- package/dist/core/gate-lanes.js +9 -3
- package/dist/core/governance-codes.d.ts +3 -1
- package/dist/core/governance-codes.js +3 -0
- package/dist/core/hooks.d.ts +3 -0
- package/dist/core/path-rule-binding.d.ts +65 -0
- package/dist/core/path-rule-binding.js +99 -0
- package/dist/core/permission-rule-model.d.ts +47 -18
- package/dist/core/permission-rule-model.js +38 -42
- package/dist/core/permission-rule-provider.d.ts +7 -0
- package/dist/core/permission-rule-provider.js +10 -3
- package/dist/core/permission-rule-store.d.ts +8 -0
- package/dist/core/permission-rule-store.js +6 -2
- package/dist/core/permission-rule-sync.js +2 -2
- package/dist/core/permission-rules.d.ts +22 -40
- package/dist/core/permission-rules.js +50 -43
- package/dist/core/runner/child-tree.d.ts +97 -0
- package/dist/core/runner/child-tree.js +104 -0
- package/dist/core/runner/construction-doors.d.ts +5 -0
- package/dist/core/runner/construction-doors.js +6 -0
- package/dist/core/runner/contracts.d.ts +46 -0
- package/dist/core/runner/permission-rule-lanes.d.ts +34 -25
- package/dist/core/runner/permission-rule-lanes.js +18 -12
- package/dist/core/runner/persisted-path-rows.d.ts +31 -7
- package/dist/core/runner/persisted-path-rows.js +31 -12
- package/dist/core/runner/prepare-ask-lane.d.ts +4 -0
- package/dist/core/runner/prepare-ask-lane.js +4 -2
- package/dist/core/runner/prepare-execution-env.d.ts +5 -2
- package/dist/core/runner/prepare-execution-env.js +10 -3
- package/dist/core/runner/prepare-gate-stations.d.ts +3 -0
- package/dist/core/runner/prepare-gate-stations.js +2 -1
- package/dist/core/runner/prepare-hands-readface.d.ts +8 -4
- package/dist/core/runner/prepare-hands-readface.js +6 -6
- package/dist/core/runner/prepare-inherited-gate.d.ts +8 -1
- package/dist/core/runner/prepare-inherited-gate.js +8 -2
- package/dist/core/runner/prepare-park-ask.d.ts +3 -0
- package/dist/core/runner/prepare-park-ask.js +5 -3
- package/dist/core/runner/prepare-policy-chain.d.ts +14 -2
- package/dist/core/runner/prepare-policy-chain.js +11 -4
- package/dist/core/runner/prepare-suspend-saga.d.ts +10 -0
- package/dist/core/runner/prepare-suspend-saga.js +7 -1
- package/dist/core/runner/prepare-task.js +37 -18
- package/dist/core/runner/prepare-turn-wiring.d.ts +2 -0
- package/dist/core/runner/prepare-turn-wiring.js +2 -1
- package/dist/core/runner/prepare-workspace-restore.d.ts +3 -0
- package/dist/core/runner/prepare-workspace-restore.js +1 -0
- package/dist/core/runner/resume-apply.js +17 -3
- package/dist/core/runner/resume-checkpoint-screen.js +13 -0
- package/dist/core/runner/run-leg.js +5 -1
- package/dist/core/runner/runtask.js +2 -2
- package/dist/core/runner/sub-agent-deny-lists.d.ts +1 -1
- package/dist/core/runner/write-protection-station.d.ts +3 -2
- package/dist/core/runner/write-protection-station.js +1 -0
- package/dist/core/runner-deps.d.ts +14 -0
- package/dist/core/sensitive-path-policy.d.ts +8 -0
- package/dist/core/sensitive-path-policy.js +18 -2
- package/dist/core/shell-wrapper-projection.d.ts +11 -0
- package/dist/core/shell-wrapper-projection.js +56 -0
- package/dist/core/shell-wrapper-table.d.ts +144 -34
- package/dist/core/shell-wrapper-table.js +40 -20
- package/dist/core/synthetic-read-verdict.d.ts +3 -0
- package/dist/core/synthetic-read-verdict.js +3 -1
- package/dist/core/tool-catalog-entries.d.ts +21 -0
- package/dist/core/tool-catalog-entries.js +9 -0
- package/dist/core/tool-policy.d.ts +30 -8
- package/dist/core/tool-policy.js +9 -7
- package/dist/core/tool-spec.d.ts +3 -2
- package/dist/core/write-protect.d.ts +4 -0
- package/dist/core/write-protect.js +30 -9
- package/dist/index.d.ts +5 -3
- package/dist/index.js +4 -2
- package/dist/orchestration/run-spec.js +8 -7
- package/dist/orchestration/workflow.js +1 -1
- package/dist/shell/lex.d.ts +7 -0
- package/dist/shell/lex.js +17 -0
- package/dist/tools/fs/bash-program-position.d.ts +8 -87
- package/dist/tools/fs/bash-program-position.js +33 -69
- package/dist/tools/fs/bash-readonly-classifier.d.ts +17 -444
- package/dist/tools/fs/bash-readonly-classifier.js +169 -1225
- package/dist/tools/fs/index.d.ts +3 -2
- package/dist/tools/fs/program-read-model.d.ts +694 -0
- package/dist/tools/fs/program-read-model.js +1252 -0
- package/dist/tools/fs/program-read-model.rows.d.ts +18 -0
- package/dist/tools/fs/program-read-model.rows.js +613 -0
- package/dist/tools/fs/read-deny-home.d.ts +19 -1
- package/dist/tools/fs/read-deny-home.js +62 -24
- package/dist/tools/fs/read-deny.d.ts +54 -14
- package/dist/tools/fs/read-deny.js +104 -50
- package/dist/tools/fs/removal-targets.d.ts +7 -6
- package/dist/tools/fs/removal-targets.js +22 -22
- package/dist/tools/fs/safety.d.ts +3 -0
- package/dist/tools/fs/safety.js +10 -3
- package/dist/tools/fs/shell-read-argv.d.ts +85 -0
- package/dist/tools/fs/shell-read-argv.js +386 -0
- package/dist/tools/fs/shell-read-bindings.d.ts +273 -0
- package/dist/tools/fs/shell-read-bindings.js +746 -0
- package/dist/tools/fs/shell-read-check.js +23 -15
- package/dist/tools/fs/shell-read-establish.js +79 -5
- package/dist/tools/fs/shell-read-judge.d.ts +11 -1
- package/dist/tools/fs/shell-read-judge.js +9 -1
- package/dist/tools/fs/shell-read-plan.d.ts +31 -7
- package/dist/tools/fs/shell-read-plan.js +299 -393
- package/dist/tools/fs/shell-read-word.d.ts +29 -26
- package/dist/tools/fs/shell-read-word.js +30 -38
- package/dist/tools/fs/shell-read-write-targets.d.ts +15 -64
- package/dist/tools/fs/shell-read-write-targets.js +83 -136
- package/dist/tools/fs/shell-reentry-text.d.ts +38 -6
- package/dist/tools/fs/shell-reentry-text.js +90 -53
- package/package.json +1 -1
- package/test/export-surface.snapshot.json +17 -3
- package/wire-changes/core@7.46.0.json +1522 -0
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { SHELL_CONTROL_PREFIXES } from "../../shell/lex.js";
|
|
2
|
+
import { BLOCK_WORD_NAMES, LAUNCHER_NAMES, feedsArgvFromStdin, launcherOptionStep, programRow, selectedOptions, streamDefaultProgram } from "./program-read-model.js";
|
|
2
3
|
export const NOT_AUTO_ALLOWED = "— not auto-allowed";
|
|
3
4
|
export function programBasename(word) {
|
|
4
5
|
return word.includes("/") ? (word.split("/").pop() ?? word) : word;
|
|
@@ -14,7 +15,6 @@ export function writtenAssignmentPrefix(token) {
|
|
|
14
15
|
return { prefix, name: bracket < 0 ? written : written.slice(0, bracket), appends, settlesWholeName: !appends && bracket < 0 };
|
|
15
16
|
}
|
|
16
17
|
export { SHELL_CONTROL_PREFIXES };
|
|
17
|
-
export const SHELL_BLOCK_WORDS = new Set(["for", "select", "case", "esac", "fi", "done", "function", "coproc", "[[", "]]", "in"]);
|
|
18
18
|
export function isBareControlWord(words, i, set) {
|
|
19
19
|
const w = words[i];
|
|
20
20
|
return w !== undefined && w.raw === w.folded && set.has(w.folded);
|
|
@@ -23,48 +23,19 @@ export function isLeadingAssignmentWord(words, i) {
|
|
|
23
23
|
const w = words[i];
|
|
24
24
|
return w !== undefined && w.assignment !== undefined && w.assignment.bare && w.atCommandPosition;
|
|
25
25
|
}
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
export const LAUNCHER_TABLE = new Map([
|
|
31
|
-
["env", launcherRow([["-i", 0], ["-0", 0], ["-v", 0], ["--ignore-environment", 0], ["--null", 0], ["--debug", 0], ["-u", 1], ["--unset", 1]], { assignmentOperands: true, commandString: ["-S", "--split-string"] })],
|
|
32
|
-
["command", launcherRow([["-p", 0]])],
|
|
33
|
-
["builtin", NO_DECLARED_OPTIONS], ["exec", NO_DECLARED_OPTIONS],
|
|
34
|
-
["noglob", NO_DECLARED_OPTIONS], ["xargs", NO_DECLARED_OPTIONS], ["busybox", NO_DECLARED_OPTIONS],
|
|
35
|
-
["sudo", { optionArity: new Map(), assignmentOperands: true }], ["doas", NO_DECLARED_OPTIONS], ["pkexec", { optionArity: new Map(), whenNoProgram: "shell" }],
|
|
36
|
-
["su", { optionArity: new Map(), shellText: true }], ["runuser", { optionArity: new Map(), shellText: true }],
|
|
37
|
-
["chroot", { optionArity: new Map(), requiredOperands: 1, whenNoProgram: "shell" }], ["setpriv", NO_DECLARED_OPTIONS],
|
|
38
|
-
["nohup", NO_DECLARED_OPTIONS],
|
|
39
|
-
["nice", launcherRow([["-n", 1], ["--adjustment", 1]], { negativeIntegerIsOwnArgument: true })],
|
|
40
|
-
["ionice", NO_DECLARED_OPTIONS], ["chrt", { optionArity: new Map(), requiredOperands: 1 }], ["taskset", { optionArity: new Map(), requiredOperands: 1 }],
|
|
41
|
-
["stdbuf", launcherRow([["-i", 1], ["-o", 1], ["-e", 1], ["--input", 1], ["--output", 1], ["--error", 1]])],
|
|
42
|
-
["timeout", launcherRow([
|
|
43
|
-
["--foreground", 0], ["--preserve-status", 0], ["--verbose", 0], ["-v", 0],
|
|
44
|
-
["-k", 1], ["-s", 1], ["--kill-after", 1], ["--signal", 1],
|
|
45
|
-
], { requiredOperands: 1 })],
|
|
46
|
-
["time", {
|
|
47
|
-
optionArity: new Map([
|
|
48
|
-
["-p", 0], ["-a", 0], ["-v", 0], ["-q", 0], ["--portability", 0], ["--append", 0], ["--verbose", 0], ["--quiet", 0], ["--help", 0], ["--version", 0], ["--", 0],
|
|
49
|
-
["-f", 1], ["-o", 1], ["--format", 1], ["--output", 1],
|
|
50
|
-
]),
|
|
51
|
-
}],
|
|
52
|
-
["watch", { optionArity: new Map(), shellText: true }], ["setsid", NO_DECLARED_OPTIONS], ["flock", { optionArity: new Map(), requiredOperands: 1 }], ["unshare", { optionArity: new Map(), whenNoProgram: "shell" }],
|
|
53
|
-
["nsenter", { optionArity: new Map(), whenNoProgram: "shell" }], ["script", { optionArity: new Map(), shellText: true }], ["numactl", NO_DECLARED_OPTIONS], ["prlimit", NO_DECLARED_OPTIONS],
|
|
54
|
-
["systemd-run", NO_DECLARED_OPTIONS],
|
|
55
|
-
["strace", NO_DECLARED_OPTIONS], ["ltrace", NO_DECLARED_OPTIONS], ["valgrind", NO_DECLARED_OPTIONS], ["firejail", { optionArity: new Map(), whenNoProgram: "shell" }],
|
|
56
|
-
["bwrap", NO_DECLARED_OPTIONS],
|
|
57
|
-
]);
|
|
58
|
-
export const COMMAND_LAUNCHERS = new Set(LAUNCHER_TABLE.keys());
|
|
26
|
+
function launcherRowOf(name) {
|
|
27
|
+
const row = programRow(name);
|
|
28
|
+
return row?.launcher !== undefined ? row : undefined;
|
|
29
|
+
}
|
|
59
30
|
function pastLauncherOptions(launcher, folded, i) {
|
|
60
|
-
const row =
|
|
31
|
+
const row = launcherRowOf(launcher);
|
|
61
32
|
if (row === undefined)
|
|
62
33
|
return i;
|
|
63
34
|
for (;;) {
|
|
64
35
|
const tok = folded[i];
|
|
65
36
|
if (tok === undefined)
|
|
66
37
|
return i;
|
|
67
|
-
if (row.negativeIntegerIsOwnArgument === true && /^-\d+$/.test(tok)) {
|
|
38
|
+
if (row.launcher?.negativeIntegerIsOwnArgument === true && /^-\d+$/.test(tok)) {
|
|
68
39
|
i += 1;
|
|
69
40
|
continue;
|
|
70
41
|
}
|
|
@@ -76,19 +47,6 @@ function pastLauncherOptions(launcher, folded, i) {
|
|
|
76
47
|
i += step;
|
|
77
48
|
}
|
|
78
49
|
}
|
|
79
|
-
function launcherOptionStep(row, tok) {
|
|
80
|
-
const exact = row.optionArity.get(tok);
|
|
81
|
-
if (exact !== undefined)
|
|
82
|
-
return exact === 1 ? 2 : 1;
|
|
83
|
-
const eq = tok.startsWith("--") ? tok.indexOf("=") : -1;
|
|
84
|
-
if (eq > 2 && row.optionArity.get(tok.slice(0, eq)) === 1)
|
|
85
|
-
return 1;
|
|
86
|
-
if (/^-[A-Za-z]./.test(tok) && row.optionArity.get(tok.slice(0, 2)) === 1)
|
|
87
|
-
return 1;
|
|
88
|
-
if (/^-[A-Za-z]+$/.test(tok) && [...tok.slice(1)].every((ch) => row.optionArity.get(`-${ch}`) === 0))
|
|
89
|
-
return 1;
|
|
90
|
-
return undefined;
|
|
91
|
-
}
|
|
92
50
|
export const PROGRAM_POSITION_REFUSAL_KINDS = Object.freeze(["option_at_program_position", "control_syntax_at_program_position"]);
|
|
93
51
|
export function readProgramPosition(words) {
|
|
94
52
|
const folded = words.map((w) => w.folded);
|
|
@@ -116,20 +74,24 @@ export function readProgramPosition(words) {
|
|
|
116
74
|
const owner = controlWords.length > 0 ? folded[controlWords[controlWords.length - 1]] : head;
|
|
117
75
|
return none(written, assignments, { kind: "option_at_program_position", owner, option: head });
|
|
118
76
|
}
|
|
119
|
-
if (!
|
|
77
|
+
if (!LAUNCHER_NAMES.has(basename)) {
|
|
120
78
|
return { controlWords, written, assignments, launchers: [], argvFromStdin: false, runsDefaultProgram: false, program: { index: i, name: head, basename }, refusal: undefined };
|
|
121
79
|
}
|
|
122
80
|
const launchers = [{ index: i, name: basename }];
|
|
123
81
|
const owner = head;
|
|
124
|
-
const shellRefusal = () => ({ kind: "control_syntax_at_program_position", owner, word: "sh", runsShell: true });
|
|
125
|
-
let
|
|
126
|
-
let
|
|
82
|
+
const shellRefusal = (handsText) => ({ kind: "control_syntax_at_program_position", owner, word: "sh", runsShell: true, ...(handsText !== undefined ? { handsText } : {}) });
|
|
83
|
+
let lastRow = launcherRowOf(basename)?.launcher;
|
|
84
|
+
let owedOperands = lastRow?.requiredOperands ?? 0;
|
|
127
85
|
const chain0 = (program, refusal) => ({ controlWords, written, assignments, launchers, argvFromStdin: false, runsDefaultProgram: false, program, refusal });
|
|
128
86
|
if (lastRow?.shellText === true)
|
|
129
|
-
return chain0(undefined, shellRefusal());
|
|
130
|
-
let argvFromStdin =
|
|
87
|
+
return chain0(undefined, shellRefusal(true));
|
|
88
|
+
let argvFromStdin = feedsArgvFromStdin(basename);
|
|
131
89
|
let lastReentry = argvFromStdin ? i : -1;
|
|
132
|
-
|
|
90
|
+
let reentryDefault = argvFromStdin ? streamDefaultProgram(basename) : undefined;
|
|
91
|
+
const chain = (program, refusal) => {
|
|
92
|
+
const runsDefaultProgram = lastReentry === folded.length - 1;
|
|
93
|
+
return { controlWords, written, assignments, launchers, argvFromStdin, runsDefaultProgram, ...(runsDefaultProgram && reentryDefault !== undefined ? { defaultProgram: reentryDefault } : {}), program, refusal };
|
|
94
|
+
};
|
|
133
95
|
for (let j = pastLauncherOptions(basename, folded, i + 1); j < folded.length; j++) {
|
|
134
96
|
const t = folded[j];
|
|
135
97
|
if (owedOperands > 0 && !t.startsWith("-")) {
|
|
@@ -139,50 +101,52 @@ export function readProgramPosition(words) {
|
|
|
139
101
|
if (lastRow?.assignmentOperands === true && !t.startsWith("-") && t.includes("="))
|
|
140
102
|
continue;
|
|
141
103
|
const wordBasename = programBasename(t);
|
|
142
|
-
if (
|
|
104
|
+
if (feedsArgvFromStdin(wordBasename)) {
|
|
143
105
|
argvFromStdin = true;
|
|
144
106
|
lastReentry = j;
|
|
107
|
+
reentryDefault = streamDefaultProgram(wordBasename);
|
|
145
108
|
lastRow = undefined;
|
|
146
109
|
owedOperands = 0;
|
|
147
110
|
continue;
|
|
148
111
|
}
|
|
149
|
-
if (
|
|
112
|
+
if (LAUNCHER_NAMES.has(wordBasename)) {
|
|
150
113
|
launchers.push({ index: j, name: wordBasename });
|
|
151
|
-
lastRow =
|
|
114
|
+
lastRow = launcherRowOf(wordBasename)?.launcher;
|
|
152
115
|
if (lastRow?.shellText === true)
|
|
153
|
-
return chain(undefined, shellRefusal());
|
|
116
|
+
return chain(undefined, shellRefusal(true));
|
|
154
117
|
owedOperands = lastRow?.requiredOperands ?? 0;
|
|
155
118
|
j = pastLauncherOptions(wordBasename, folded, j + 1) - 1;
|
|
156
119
|
continue;
|
|
157
120
|
}
|
|
158
121
|
if (t.startsWith("-"))
|
|
159
122
|
return chain(undefined, { kind: "option_at_program_position", owner, option: t });
|
|
160
|
-
if (SHELL_CONTROL_PREFIXES.has(wordBasename) ||
|
|
123
|
+
if (SHELL_CONTROL_PREFIXES.has(wordBasename) || BLOCK_WORD_NAMES.has(wordBasename)) {
|
|
161
124
|
return chain(undefined, { kind: "control_syntax_at_program_position", owner, word: wordBasename });
|
|
162
125
|
}
|
|
163
126
|
return chain({ index: j, name: t, basename: wordBasename });
|
|
164
127
|
}
|
|
165
|
-
|
|
128
|
+
const last = launchers[launchers.length - 1];
|
|
129
|
+
if (lastRow?.whenNoProgram === "shell" || selectedOptions(launcherRowOf(last.name), folded.slice(last.index + 1)).some((o) => o.mode === "interactive"))
|
|
166
130
|
return chain(undefined, shellRefusal());
|
|
167
131
|
return chain(undefined);
|
|
168
132
|
}
|
|
169
|
-
export function argvReentryUnjudged(pos,
|
|
133
|
+
export function argvReentryUnjudged(pos, acceptsTarget) {
|
|
170
134
|
if (!pos.argvFromStdin)
|
|
171
135
|
return false;
|
|
172
|
-
const runs = pos.program?.basename ??
|
|
173
|
-
return runs === undefined || !
|
|
136
|
+
const runs = pos.program?.basename ?? pos.defaultProgram;
|
|
137
|
+
return runs === undefined || !acceptsTarget(runs);
|
|
174
138
|
}
|
|
175
139
|
export const SHELL_SCAN_DECLINES = Object.freeze(["unreadable_program_position", "stream_fed_operands"]);
|
|
176
|
-
export function programPositionRunsShell(pos,
|
|
140
|
+
export function programPositionRunsShell(pos, runsShell) {
|
|
177
141
|
if (pos.refusal !== undefined)
|
|
178
142
|
return pos.refusal.kind === "control_syntax_at_program_position" && pos.refusal.runsShell === true;
|
|
179
|
-
return pos.program !== undefined &&
|
|
143
|
+
return pos.program !== undefined && runsShell(pos.program.basename);
|
|
180
144
|
}
|
|
181
|
-
export function shellScanDeclineOf(pos,
|
|
145
|
+
export function shellScanDeclineOf(pos, acceptsStreamTarget) {
|
|
182
146
|
if (pos.refusal !== undefined) {
|
|
183
147
|
return pos.refusal.kind === "control_syntax_at_program_position" && pos.refusal.runsShell === true ? undefined : "unreadable_program_position";
|
|
184
148
|
}
|
|
185
|
-
return argvReentryUnjudged(pos,
|
|
149
|
+
return argvReentryUnjudged(pos, acceptsStreamTarget) ? "stream_fed_operands" : undefined;
|
|
186
150
|
}
|
|
187
151
|
export function programPositionRefusalSentence(refusal) {
|
|
188
152
|
switch (refusal.kind) {
|