@sema-agent/core 7.45.0 → 7.47.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.
Files changed (139) hide show
  1. package/CHANGELOG.md +298 -1
  2. package/dist/agents/extra-tool-names.d.ts +65 -0
  3. package/dist/agents/extra-tool-names.js +124 -0
  4. package/dist/agents/subagent.d.ts +17 -5
  5. package/dist/agents/subagent.js +33 -25
  6. package/dist/agents/tool-filter.d.ts +17 -1
  7. package/dist/agents/tool-filter.js +7 -0
  8. package/dist/core/agent-config-dir.d.ts +20 -0
  9. package/dist/core/agent-config-dir.js +49 -0
  10. package/dist/core/allow-entry.d.ts +6 -4
  11. package/dist/core/allow-entry.js +6 -5
  12. package/dist/core/ask-origin.d.ts +35 -12
  13. package/dist/core/ask-origin.js +24 -7
  14. package/dist/core/checkpoint-store.d.ts +39 -2
  15. package/dist/core/effective-path-target.d.ts +136 -4
  16. package/dist/core/effective-path-target.js +110 -2
  17. package/dist/core/engine-notice.d.ts +12 -4
  18. package/dist/core/gate-fold.js +5 -2
  19. package/dist/core/gate-lanes.js +11 -4
  20. package/dist/core/gate-outcome.d.ts +4 -2
  21. package/dist/core/gate-outcome.js +2 -2
  22. package/dist/core/governance-codes.d.ts +3 -1
  23. package/dist/core/governance-codes.js +3 -0
  24. package/dist/core/hooks.d.ts +3 -0
  25. package/dist/core/path-rule-binding.d.ts +65 -0
  26. package/dist/core/path-rule-binding.js +99 -0
  27. package/dist/core/permission-rule-model.d.ts +59 -24
  28. package/dist/core/permission-rule-model.js +48 -44
  29. package/dist/core/permission-rule-provider.d.ts +7 -0
  30. package/dist/core/permission-rule-provider.js +10 -3
  31. package/dist/core/permission-rule-store.d.ts +8 -0
  32. package/dist/core/permission-rule-store.js +6 -2
  33. package/dist/core/permission-rule-sync.js +2 -2
  34. package/dist/core/permission-rules.d.ts +26 -45
  35. package/dist/core/permission-rules.js +77 -57
  36. package/dist/core/runner/child-tree.d.ts +97 -0
  37. package/dist/core/runner/child-tree.js +104 -0
  38. package/dist/core/runner/construction-doors.d.ts +5 -0
  39. package/dist/core/runner/construction-doors.js +6 -0
  40. package/dist/core/runner/contracts.d.ts +46 -0
  41. package/dist/core/runner/gate-exit.d.ts +4 -1
  42. package/dist/core/runner/gate-exit.js +5 -1
  43. package/dist/core/runner/permission-rule-lanes.d.ts +34 -25
  44. package/dist/core/runner/permission-rule-lanes.js +18 -12
  45. package/dist/core/runner/persisted-path-rows.d.ts +31 -7
  46. package/dist/core/runner/persisted-path-rows.js +31 -12
  47. package/dist/core/runner/prepare-ask-lane.d.ts +4 -0
  48. package/dist/core/runner/prepare-ask-lane.js +4 -2
  49. package/dist/core/runner/prepare-execution-env.d.ts +5 -2
  50. package/dist/core/runner/prepare-execution-env.js +10 -3
  51. package/dist/core/runner/prepare-gate-stations.d.ts +3 -0
  52. package/dist/core/runner/prepare-gate-stations.js +2 -1
  53. package/dist/core/runner/prepare-hands-readface.d.ts +8 -4
  54. package/dist/core/runner/prepare-hands-readface.js +11 -11
  55. package/dist/core/runner/prepare-inherited-gate.d.ts +8 -1
  56. package/dist/core/runner/prepare-inherited-gate.js +8 -2
  57. package/dist/core/runner/prepare-park-ask.d.ts +3 -0
  58. package/dist/core/runner/prepare-park-ask.js +5 -3
  59. package/dist/core/runner/prepare-policy-chain.d.ts +14 -2
  60. package/dist/core/runner/prepare-policy-chain.js +13 -5
  61. package/dist/core/runner/prepare-suspend-saga.d.ts +10 -0
  62. package/dist/core/runner/prepare-suspend-saga.js +7 -1
  63. package/dist/core/runner/prepare-task.js +37 -18
  64. package/dist/core/runner/prepare-turn-wiring.d.ts +2 -0
  65. package/dist/core/runner/prepare-turn-wiring.js +2 -1
  66. package/dist/core/runner/prepare-workspace-restore.d.ts +3 -0
  67. package/dist/core/runner/prepare-workspace-restore.js +1 -0
  68. package/dist/core/runner/resume-apply.js +17 -3
  69. package/dist/core/runner/resume-checkpoint-screen.js +13 -0
  70. package/dist/core/runner/run-leg.js +5 -1
  71. package/dist/core/runner/runtask.js +2 -2
  72. package/dist/core/runner/sub-agent-deny-lists.d.ts +1 -1
  73. package/dist/core/runner/write-protection-station.d.ts +3 -2
  74. package/dist/core/runner/write-protection-station.js +1 -0
  75. package/dist/core/runner-deps.d.ts +14 -0
  76. package/dist/core/sensitive-path-policy.d.ts +8 -0
  77. package/dist/core/sensitive-path-policy.js +18 -2
  78. package/dist/core/shell-wrapper-projection.d.ts +11 -0
  79. package/dist/core/shell-wrapper-projection.js +56 -0
  80. package/dist/core/shell-wrapper-table.d.ts +144 -34
  81. package/dist/core/shell-wrapper-table.js +40 -20
  82. package/dist/core/synthetic-read-verdict.d.ts +3 -0
  83. package/dist/core/synthetic-read-verdict.js +3 -1
  84. package/dist/core/tool-catalog-entries.d.ts +21 -0
  85. package/dist/core/tool-catalog-entries.js +12 -2
  86. package/dist/core/tool-face.d.ts +10 -1
  87. package/dist/core/tool-name-readings.d.ts +8 -0
  88. package/dist/core/tool-name-readings.js +2 -0
  89. package/dist/core/tool-policy.d.ts +40 -17
  90. package/dist/core/tool-policy.js +11 -9
  91. package/dist/core/tool-registry.d.ts +9 -0
  92. package/dist/core/tool-registry.js +10 -0
  93. package/dist/core/tool-spec.d.ts +3 -2
  94. package/dist/core/write-protect.d.ts +14 -3
  95. package/dist/core/write-protect.js +41 -10
  96. package/dist/index.d.ts +6 -4
  97. package/dist/index.js +5 -3
  98. package/dist/orchestration/run-spec.js +8 -7
  99. package/dist/orchestration/workflow.js +1 -1
  100. package/dist/shell/lex.d.ts +22 -0
  101. package/dist/shell/lex.js +75 -13
  102. package/dist/tools/fs/bash-program-position.d.ts +14 -90
  103. package/dist/tools/fs/bash-program-position.js +41 -74
  104. package/dist/tools/fs/bash-readonly-classifier.d.ts +17 -444
  105. package/dist/tools/fs/bash-readonly-classifier.js +169 -1225
  106. package/dist/tools/fs/index.d.ts +3 -2
  107. package/dist/tools/fs/program-read-model.d.ts +711 -0
  108. package/dist/tools/fs/program-read-model.js +1259 -0
  109. package/dist/tools/fs/program-read-model.rows.d.ts +18 -0
  110. package/dist/tools/fs/program-read-model.rows.js +624 -0
  111. package/dist/tools/fs/read-deny-home.d.ts +19 -1
  112. package/dist/tools/fs/read-deny-home.js +62 -24
  113. package/dist/tools/fs/read-deny.d.ts +54 -14
  114. package/dist/tools/fs/read-deny.js +104 -50
  115. package/dist/tools/fs/removal-targets.d.ts +7 -6
  116. package/dist/tools/fs/removal-targets.js +34 -24
  117. package/dist/tools/fs/safety.d.ts +3 -0
  118. package/dist/tools/fs/safety.js +10 -3
  119. package/dist/tools/fs/shell-read-argv.d.ts +86 -0
  120. package/dist/tools/fs/shell-read-argv.js +388 -0
  121. package/dist/tools/fs/shell-read-bindings.d.ts +300 -0
  122. package/dist/tools/fs/shell-read-bindings.js +755 -0
  123. package/dist/tools/fs/shell-read-check.js +23 -15
  124. package/dist/tools/fs/shell-read-establish.js +82 -8
  125. package/dist/tools/fs/shell-read-judge.d.ts +11 -1
  126. package/dist/tools/fs/shell-read-judge.js +9 -1
  127. package/dist/tools/fs/shell-read-plan.d.ts +33 -8
  128. package/dist/tools/fs/shell-read-plan.js +309 -407
  129. package/dist/tools/fs/shell-read-word.d.ts +60 -26
  130. package/dist/tools/fs/shell-read-word.js +47 -37
  131. package/dist/tools/fs/shell-read-write-targets.d.ts +15 -64
  132. package/dist/tools/fs/shell-read-write-targets.js +85 -137
  133. package/dist/tools/fs/shell-reentry-text.d.ts +136 -6
  134. package/dist/tools/fs/shell-reentry-text.js +203 -53
  135. package/dist/tools/monitor.d.ts +3 -3
  136. package/package.json +1 -1
  137. package/test/export-surface.snapshot.json +25 -5
  138. package/wire-changes/core@7.46.0.json +1522 -0
  139. package/wire-changes/core@7.47.0.json +412 -0
@@ -1,4 +1,5 @@
1
1
  import { SHELL_CONTROL_PREFIXES } from "../../shell/lex.js";
2
+ import { BLOCK_WORD_NAMES, LAUNCHER_NAMES, feedsArgvFromStdin, launcherOptionStep, launcherRunsShell, 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
- export const ARGV_REENTRY_PROGRAM_RE = /^xargs$/;
27
- export const ARGV_REENTRY_DEFAULT_PROGRAM = "echo";
28
- const NO_DECLARED_OPTIONS = { optionArity: new Map() };
29
- const launcherRow = (pairs, extra = {}) => ({ optionArity: new Map(pairs), ...extra });
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 = LAUNCHER_TABLE.get(launcher);
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,25 @@ 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 (!COMMAND_LAUNCHERS.has(basename)) {
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 owedOperands = LAUNCHER_TABLE.get(basename)?.requiredOperands ?? 0;
126
- let lastRow = LAUNCHER_TABLE.get(basename);
82
+ const shellRefusal = (launcher, from) => ({ kind: "control_syntax_at_program_position", owner, word: "sh", runsShell: { launcher, from } });
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
- if (lastRow?.shellText === true)
129
- return chain0(undefined, shellRefusal());
130
- let argvFromStdin = ARGV_REENTRY_PROGRAM_RE.test(basename);
86
+ if (launcherRunsShell(launcherRowOf(basename), folded.slice(i + 1)))
87
+ return chain0(undefined, shellRefusal(i, i + 1));
88
+ let argvFromStdin = feedsArgvFromStdin(basename);
131
89
  let lastReentry = argvFromStdin ? i : -1;
132
- const chain = (program, refusal) => ({ controlWords, written, assignments, launchers, argvFromStdin, runsDefaultProgram: lastReentry === folded.length - 1, program, refusal });
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
+ };
95
+ const selectsShell = (l, end) => selectedOptions(launcherRowOf(l.name), folded.slice(l.index + 1, end)).some((o) => o.mode === "interactive");
133
96
  for (let j = pastLauncherOptions(basename, folded, i + 1); j < folded.length; j++) {
134
97
  const t = folded[j];
135
98
  if (owedOperands > 0 && !t.startsWith("-")) {
@@ -138,51 +101,55 @@ export function readProgramPosition(words) {
138
101
  }
139
102
  if (lastRow?.assignmentOperands === true && !t.startsWith("-") && t.includes("="))
140
103
  continue;
104
+ if (lastRow?.shellCommand !== undefined && !t.startsWith("-") && selectsShell(launchers[launchers.length - 1], j))
105
+ return chain(undefined, shellRefusal(launchers[launchers.length - 1].index, j));
141
106
  const wordBasename = programBasename(t);
142
- if (ARGV_REENTRY_PROGRAM_RE.test(wordBasename)) {
107
+ if (feedsArgvFromStdin(wordBasename)) {
143
108
  argvFromStdin = true;
144
109
  lastReentry = j;
110
+ reentryDefault = streamDefaultProgram(wordBasename);
145
111
  lastRow = undefined;
146
112
  owedOperands = 0;
147
113
  continue;
148
114
  }
149
- if (COMMAND_LAUNCHERS.has(wordBasename)) {
115
+ if (LAUNCHER_NAMES.has(wordBasename)) {
150
116
  launchers.push({ index: j, name: wordBasename });
151
- lastRow = LAUNCHER_TABLE.get(wordBasename);
152
- if (lastRow?.shellText === true)
153
- return chain(undefined, shellRefusal());
117
+ lastRow = launcherRowOf(wordBasename)?.launcher;
118
+ if (launcherRunsShell(launcherRowOf(wordBasename), folded.slice(j + 1)))
119
+ return chain(undefined, shellRefusal(j, j + 1));
154
120
  owedOperands = lastRow?.requiredOperands ?? 0;
155
121
  j = pastLauncherOptions(wordBasename, folded, j + 1) - 1;
156
122
  continue;
157
123
  }
158
124
  if (t.startsWith("-"))
159
125
  return chain(undefined, { kind: "option_at_program_position", owner, option: t });
160
- if (SHELL_CONTROL_PREFIXES.has(wordBasename) || SHELL_BLOCK_WORDS.has(wordBasename)) {
126
+ if (SHELL_CONTROL_PREFIXES.has(wordBasename) || BLOCK_WORD_NAMES.has(wordBasename)) {
161
127
  return chain(undefined, { kind: "control_syntax_at_program_position", owner, word: wordBasename });
162
128
  }
163
129
  return chain({ index: j, name: t, basename: wordBasename });
164
130
  }
165
- if (lastRow?.whenNoProgram === "shell")
166
- return chain(undefined, shellRefusal());
131
+ const last = launchers[launchers.length - 1];
132
+ if (lastRow?.whenNoProgram === "shell" || selectsShell(last, folded.length))
133
+ return chain(undefined, shellRefusal(last.index, folded.length));
167
134
  return chain(undefined);
168
135
  }
169
- export function argvReentryUnjudged(pos, acceptedTargets) {
136
+ export function argvReentryUnjudged(pos, acceptsTarget) {
170
137
  if (!pos.argvFromStdin)
171
138
  return false;
172
- const runs = pos.program?.basename ?? (pos.runsDefaultProgram ? ARGV_REENTRY_DEFAULT_PROGRAM : undefined);
173
- return runs === undefined || !acceptedTargets.has(runs);
139
+ const runs = pos.program?.basename ?? pos.defaultProgram;
140
+ return runs === undefined || !acceptsTarget(runs);
174
141
  }
175
142
  export const SHELL_SCAN_DECLINES = Object.freeze(["unreadable_program_position", "stream_fed_operands"]);
176
- export function programPositionRunsShell(pos, shellProgram) {
143
+ export function programPositionRunsShell(pos, runsShell) {
177
144
  if (pos.refusal !== undefined)
178
- return pos.refusal.kind === "control_syntax_at_program_position" && pos.refusal.runsShell === true;
179
- return pos.program !== undefined && shellProgram.test(pos.program.basename);
145
+ return pos.refusal.kind === "control_syntax_at_program_position" && pos.refusal.runsShell !== undefined;
146
+ return pos.program !== undefined && runsShell(pos.program.basename);
180
147
  }
181
- export function shellScanDeclineOf(pos, acceptedStreamTargets) {
148
+ export function shellScanDeclineOf(pos, acceptsStreamTarget) {
182
149
  if (pos.refusal !== undefined) {
183
- return pos.refusal.kind === "control_syntax_at_program_position" && pos.refusal.runsShell === true ? undefined : "unreadable_program_position";
150
+ return pos.refusal.kind === "control_syntax_at_program_position" && pos.refusal.runsShell !== undefined ? undefined : "unreadable_program_position";
184
151
  }
185
- return argvReentryUnjudged(pos, acceptedStreamTargets) ? "stream_fed_operands" : undefined;
152
+ return argvReentryUnjudged(pos, acceptsStreamTarget) ? "stream_fed_operands" : undefined;
186
153
  }
187
154
  export function programPositionRefusalSentence(refusal) {
188
155
  switch (refusal.kind) {