@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.
Files changed (127) hide show
  1. package/CHANGELOG.md +246 -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 +5 -3
  11. package/dist/core/allow-entry.js +3 -1
  12. package/dist/core/ask-origin.js +1 -1
  13. package/dist/core/checkpoint-store.d.ts +39 -2
  14. package/dist/core/effective-path-target.d.ts +136 -4
  15. package/dist/core/effective-path-target.js +110 -2
  16. package/dist/core/engine-notice.d.ts +5 -0
  17. package/dist/core/gate-fold.js +3 -0
  18. package/dist/core/gate-lanes.js +9 -3
  19. package/dist/core/governance-codes.d.ts +3 -1
  20. package/dist/core/governance-codes.js +3 -0
  21. package/dist/core/hooks.d.ts +3 -0
  22. package/dist/core/path-rule-binding.d.ts +65 -0
  23. package/dist/core/path-rule-binding.js +99 -0
  24. package/dist/core/permission-rule-model.d.ts +47 -18
  25. package/dist/core/permission-rule-model.js +38 -42
  26. package/dist/core/permission-rule-provider.d.ts +7 -0
  27. package/dist/core/permission-rule-provider.js +10 -3
  28. package/dist/core/permission-rule-store.d.ts +8 -0
  29. package/dist/core/permission-rule-store.js +6 -2
  30. package/dist/core/permission-rule-sync.js +2 -2
  31. package/dist/core/permission-rules.d.ts +22 -40
  32. package/dist/core/permission-rules.js +50 -43
  33. package/dist/core/runner/child-tree.d.ts +97 -0
  34. package/dist/core/runner/child-tree.js +104 -0
  35. package/dist/core/runner/construction-doors.d.ts +5 -0
  36. package/dist/core/runner/construction-doors.js +6 -0
  37. package/dist/core/runner/contracts.d.ts +46 -0
  38. package/dist/core/runner/permission-rule-lanes.d.ts +34 -25
  39. package/dist/core/runner/permission-rule-lanes.js +18 -12
  40. package/dist/core/runner/persisted-path-rows.d.ts +31 -7
  41. package/dist/core/runner/persisted-path-rows.js +31 -12
  42. package/dist/core/runner/prepare-ask-lane.d.ts +4 -0
  43. package/dist/core/runner/prepare-ask-lane.js +4 -2
  44. package/dist/core/runner/prepare-execution-env.d.ts +5 -2
  45. package/dist/core/runner/prepare-execution-env.js +10 -3
  46. package/dist/core/runner/prepare-gate-stations.d.ts +3 -0
  47. package/dist/core/runner/prepare-gate-stations.js +2 -1
  48. package/dist/core/runner/prepare-hands-readface.d.ts +8 -4
  49. package/dist/core/runner/prepare-hands-readface.js +6 -6
  50. package/dist/core/runner/prepare-inherited-gate.d.ts +8 -1
  51. package/dist/core/runner/prepare-inherited-gate.js +8 -2
  52. package/dist/core/runner/prepare-park-ask.d.ts +3 -0
  53. package/dist/core/runner/prepare-park-ask.js +5 -3
  54. package/dist/core/runner/prepare-policy-chain.d.ts +14 -2
  55. package/dist/core/runner/prepare-policy-chain.js +11 -4
  56. package/dist/core/runner/prepare-suspend-saga.d.ts +10 -0
  57. package/dist/core/runner/prepare-suspend-saga.js +7 -1
  58. package/dist/core/runner/prepare-task.js +37 -18
  59. package/dist/core/runner/prepare-turn-wiring.d.ts +2 -0
  60. package/dist/core/runner/prepare-turn-wiring.js +2 -1
  61. package/dist/core/runner/prepare-workspace-restore.d.ts +3 -0
  62. package/dist/core/runner/prepare-workspace-restore.js +1 -0
  63. package/dist/core/runner/resume-apply.js +17 -3
  64. package/dist/core/runner/resume-checkpoint-screen.js +13 -0
  65. package/dist/core/runner/run-leg.js +5 -1
  66. package/dist/core/runner/runtask.js +2 -2
  67. package/dist/core/runner/sub-agent-deny-lists.d.ts +1 -1
  68. package/dist/core/runner/write-protection-station.d.ts +3 -2
  69. package/dist/core/runner/write-protection-station.js +1 -0
  70. package/dist/core/runner-deps.d.ts +14 -0
  71. package/dist/core/sensitive-path-policy.d.ts +8 -0
  72. package/dist/core/sensitive-path-policy.js +18 -2
  73. package/dist/core/shell-wrapper-projection.d.ts +11 -0
  74. package/dist/core/shell-wrapper-projection.js +56 -0
  75. package/dist/core/shell-wrapper-table.d.ts +144 -34
  76. package/dist/core/shell-wrapper-table.js +40 -20
  77. package/dist/core/synthetic-read-verdict.d.ts +3 -0
  78. package/dist/core/synthetic-read-verdict.js +3 -1
  79. package/dist/core/tool-catalog-entries.d.ts +21 -0
  80. package/dist/core/tool-catalog-entries.js +9 -0
  81. package/dist/core/tool-policy.d.ts +30 -8
  82. package/dist/core/tool-policy.js +9 -7
  83. package/dist/core/tool-spec.d.ts +3 -2
  84. package/dist/core/write-protect.d.ts +4 -0
  85. package/dist/core/write-protect.js +30 -9
  86. package/dist/index.d.ts +5 -3
  87. package/dist/index.js +4 -2
  88. package/dist/orchestration/run-spec.js +8 -7
  89. package/dist/orchestration/workflow.js +1 -1
  90. package/dist/shell/lex.d.ts +7 -0
  91. package/dist/shell/lex.js +17 -0
  92. package/dist/tools/fs/bash-program-position.d.ts +8 -87
  93. package/dist/tools/fs/bash-program-position.js +33 -69
  94. package/dist/tools/fs/bash-readonly-classifier.d.ts +17 -444
  95. package/dist/tools/fs/bash-readonly-classifier.js +169 -1225
  96. package/dist/tools/fs/index.d.ts +3 -2
  97. package/dist/tools/fs/program-read-model.d.ts +694 -0
  98. package/dist/tools/fs/program-read-model.js +1252 -0
  99. package/dist/tools/fs/program-read-model.rows.d.ts +18 -0
  100. package/dist/tools/fs/program-read-model.rows.js +613 -0
  101. package/dist/tools/fs/read-deny-home.d.ts +19 -1
  102. package/dist/tools/fs/read-deny-home.js +62 -24
  103. package/dist/tools/fs/read-deny.d.ts +54 -14
  104. package/dist/tools/fs/read-deny.js +104 -50
  105. package/dist/tools/fs/removal-targets.d.ts +7 -6
  106. package/dist/tools/fs/removal-targets.js +22 -22
  107. package/dist/tools/fs/safety.d.ts +3 -0
  108. package/dist/tools/fs/safety.js +10 -3
  109. package/dist/tools/fs/shell-read-argv.d.ts +85 -0
  110. package/dist/tools/fs/shell-read-argv.js +386 -0
  111. package/dist/tools/fs/shell-read-bindings.d.ts +273 -0
  112. package/dist/tools/fs/shell-read-bindings.js +746 -0
  113. package/dist/tools/fs/shell-read-check.js +23 -15
  114. package/dist/tools/fs/shell-read-establish.js +79 -5
  115. package/dist/tools/fs/shell-read-judge.d.ts +11 -1
  116. package/dist/tools/fs/shell-read-judge.js +9 -1
  117. package/dist/tools/fs/shell-read-plan.d.ts +31 -7
  118. package/dist/tools/fs/shell-read-plan.js +299 -393
  119. package/dist/tools/fs/shell-read-word.d.ts +29 -26
  120. package/dist/tools/fs/shell-read-word.js +30 -38
  121. package/dist/tools/fs/shell-read-write-targets.d.ts +15 -64
  122. package/dist/tools/fs/shell-read-write-targets.js +83 -136
  123. package/dist/tools/fs/shell-reentry-text.d.ts +38 -6
  124. package/dist/tools/fs/shell-reentry-text.js +90 -53
  125. package/package.json +1 -1
  126. package/test/export-surface.snapshot.json +17 -3
  127. 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
- 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,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 (!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 = (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 = ARGV_REENTRY_PROGRAM_RE.test(basename);
87
+ return chain0(undefined, shellRefusal(true));
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
+ };
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 (ARGV_REENTRY_PROGRAM_RE.test(wordBasename)) {
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 (COMMAND_LAUNCHERS.has(wordBasename)) {
112
+ if (LAUNCHER_NAMES.has(wordBasename)) {
150
113
  launchers.push({ index: j, name: wordBasename });
151
- lastRow = LAUNCHER_TABLE.get(wordBasename);
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) || SHELL_BLOCK_WORDS.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
- if (lastRow?.whenNoProgram === "shell")
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, acceptedTargets) {
133
+ export function argvReentryUnjudged(pos, acceptsTarget) {
170
134
  if (!pos.argvFromStdin)
171
135
  return false;
172
- const runs = pos.program?.basename ?? (pos.runsDefaultProgram ? ARGV_REENTRY_DEFAULT_PROGRAM : undefined);
173
- return runs === undefined || !acceptedTargets.has(runs);
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, shellProgram) {
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 && shellProgram.test(pos.program.basename);
143
+ return pos.program !== undefined && runsShell(pos.program.basename);
180
144
  }
181
- export function shellScanDeclineOf(pos, acceptedStreamTargets) {
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, acceptedStreamTargets) ? "stream_fed_operands" : undefined;
149
+ return argvReentryUnjudged(pos, acceptsStreamTarget) ? "stream_fed_operands" : undefined;
186
150
  }
187
151
  export function programPositionRefusalSentence(refusal) {
188
152
  switch (refusal.kind) {