@sema-agent/core 7.33.8 → 7.34.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 (197) hide show
  1. package/CHANGELOG.md +339 -0
  2. package/dist/agents/cross-session-judge.d.ts +16 -7
  3. package/dist/agents/cross-session-judge.js +18 -15
  4. package/dist/agents/peer-session-drain.d.ts +4 -0
  5. package/dist/agents/peer-session-drain.js +5 -2
  6. package/dist/agents/repair-loop.d.ts +1 -1
  7. package/dist/agents/subagent.d.ts +3 -0
  8. package/dist/agents/subagent.js +12 -3
  9. package/dist/brain/anthropic.js +1 -0
  10. package/dist/brain/open-responses.js +1 -0
  11. package/dist/brain/openai.js +1 -0
  12. package/dist/brain/stream-engine.d.ts +3 -0
  13. package/dist/brain/stream-engine.js +2 -1
  14. package/dist/core/a2a.d.ts +3 -1
  15. package/dist/core/a2a.js +1 -1
  16. package/dist/core/ask-origin.d.ts +351 -154
  17. package/dist/core/ask-origin.js +223 -45
  18. package/dist/core/ask-unresolvable-notice.d.ts +5 -2
  19. package/dist/core/ask-unresolvable-notice.js +4 -3
  20. package/dist/core/auto-mode-arming.d.ts +17 -4
  21. package/dist/core/auto-mode-arming.js +31 -6
  22. package/dist/core/auto-mode-defaults.d.ts +16 -7
  23. package/dist/core/auto-mode-defaults.js +2 -1
  24. package/dist/core/auto-mode-directive.d.ts +18 -30
  25. package/dist/core/auto-mode-directive.js +9 -18
  26. package/dist/core/auto-mode-prompt.d.ts +62 -1
  27. package/dist/core/auto-mode-prompt.js +42 -4
  28. package/dist/core/auto-mode-rebuild.d.ts +2 -1
  29. package/dist/core/auto-mode-rebuild.js +1 -0
  30. package/dist/core/auto-mode.d.ts +32 -3
  31. package/dist/core/auto-mode.js +80 -41
  32. package/dist/core/checkpoint-store.d.ts +50 -35
  33. package/dist/core/checkpoint-store.js +58 -3
  34. package/dist/core/child-clamp-seats.js +1 -0
  35. package/dist/core/classifier-unavailable-arm.d.ts +57 -0
  36. package/dist/core/classifier-unavailable-arm.js +17 -0
  37. package/dist/core/effective-path-target.d.ts +12 -0
  38. package/dist/core/effective-path-target.js +18 -7
  39. package/dist/core/engine-notice.d.ts +53 -2
  40. package/dist/core/fs-write-gate-policy.d.ts +5 -1
  41. package/dist/core/fs-write-gate-policy.js +4 -1
  42. package/dist/core/gate-fold.js +17 -1
  43. package/dist/core/gate-lanes.js +111 -46
  44. package/dist/core/gate-outcome.d.ts +40 -7
  45. package/dist/core/gate-outcome.js +26 -4
  46. package/dist/core/governance-codes.d.ts +1 -1
  47. package/dist/core/governance-codes.js +12 -0
  48. package/dist/core/hooks.d.ts +50 -29
  49. package/dist/core/hooks.js +1 -3
  50. package/dist/core/mcp.js +1 -1
  51. package/dist/core/mode-policy.d.ts +182 -0
  52. package/dist/core/mode-policy.js +179 -0
  53. package/dist/core/oracle-isolation.d.ts +3 -3
  54. package/dist/core/permission-rule-model.d.ts +16 -3
  55. package/dist/core/permission-rule-model.js +36 -3
  56. package/dist/core/permission-rule-provider.d.ts +22 -11
  57. package/dist/core/permission-rule-provider.js +17 -7
  58. package/dist/core/permission-rules.d.ts +23 -1
  59. package/dist/core/permission-rules.js +35 -8
  60. package/dist/core/persisted-rule-arms.d.ts +10 -9
  61. package/dist/core/persisted-rule-arms.js +9 -6
  62. package/dist/core/present-plan-tool.d.ts +1 -1
  63. package/dist/core/present-plan-tool.js +3 -3
  64. package/dist/core/read-only-shell.d.ts +19 -19
  65. package/dist/core/read-only-shell.js +38 -12
  66. package/dist/core/retired-keys.d.ts +9 -3
  67. package/dist/core/retired-keys.js +5 -1
  68. package/dist/core/runner/classifier-ladder.d.ts +43 -1
  69. package/dist/core/runner/classifier-ladder.js +29 -0
  70. package/dist/core/runner/contracts.d.ts +37 -35
  71. package/dist/core/runner/denial-limit-arms.d.ts +30 -7
  72. package/dist/core/runner/denial-limit-arms.js +15 -9
  73. package/dist/core/runner/env-capability-census.js +1 -1
  74. package/dist/core/runner/gate-exit.d.ts +30 -4
  75. package/dist/core/runner/gate-exit.js +28 -7
  76. package/dist/core/runner/permission-rule-lanes.d.ts +9 -5
  77. package/dist/core/runner/permission-rule-lanes.js +44 -40
  78. package/dist/core/runner/persisted-path-rows.d.ts +64 -0
  79. package/dist/core/runner/persisted-path-rows.js +89 -0
  80. package/dist/core/runner/prepare-artifact.d.ts +5 -1
  81. package/dist/core/runner/prepare-artifact.js +9 -3
  82. package/dist/core/runner/prepare-ask-lane.d.ts +5 -3
  83. package/dist/core/runner/prepare-ask-lane.js +1 -1
  84. package/dist/core/runner/prepare-caps-and-workflow.d.ts +39 -13
  85. package/dist/core/runner/prepare-caps-and-workflow.js +58 -29
  86. package/dist/core/runner/prepare-gate-stations.d.ts +33 -6
  87. package/dist/core/runner/prepare-gate-stations.js +32 -19
  88. package/dist/core/runner/prepare-hands-readface.d.ts +40 -17
  89. package/dist/core/runner/prepare-hands-readface.js +64 -53
  90. package/dist/core/runner/prepare-inherited-gate.d.ts +22 -22
  91. package/dist/core/runner/prepare-inherited-gate.js +37 -23
  92. package/dist/core/runner/prepare-park-ask.d.ts +2 -2
  93. package/dist/core/runner/prepare-park-ask.js +2 -1
  94. package/dist/core/runner/prepare-policy-chain.d.ts +22 -2
  95. package/dist/core/runner/prepare-policy-chain.js +39 -12
  96. package/dist/core/runner/prepare-protocol-tools.d.ts +28 -0
  97. package/dist/core/runner/prepare-protocol-tools.js +13 -3
  98. package/dist/core/runner/prepare-run-refs.d.ts +6 -6
  99. package/dist/core/runner/prepare-run-refs.js +9 -4
  100. package/dist/core/runner/prepare-safety-scan.d.ts +5 -0
  101. package/dist/core/runner/prepare-safety-scan.js +19 -3
  102. package/dist/core/runner/prepare-suspend-saga.d.ts +5 -5
  103. package/dist/core/runner/prepare-suspend-saga.js +6 -6
  104. package/dist/core/runner/prepare-task.js +51 -22
  105. package/dist/core/runner/prepare-wiring-manifest.d.ts +10 -6
  106. package/dist/core/runner/prepare-wiring-manifest.js +5 -3
  107. package/dist/core/runner/read-root-grant.d.ts +9 -0
  108. package/dist/core/runner/read-root-grant.js +12 -0
  109. package/dist/core/runner/retired-runner-deps.js +1 -0
  110. package/dist/core/runner/run-identity-wiring.js +1 -1
  111. package/dist/core/runner/run-leg.js +24 -15
  112. package/dist/core/runner/run-notification-lane.js +1 -0
  113. package/dist/core/runner/run-telemetry-and-budget-seats.d.ts +2 -2
  114. package/dist/core/runner/run-telemetry-and-budget-seats.js +1 -1
  115. package/dist/core/runner/run-turn-boundary.js +1 -1
  116. package/dist/core/runner/runtask.js +3 -0
  117. package/dist/core/runner/stream-mode-verb.d.ts +27 -0
  118. package/dist/core/runner/stream-mode-verb.js +19 -0
  119. package/dist/core/runner/turn-attachments.d.ts +3 -3
  120. package/dist/core/runner/turn-attachments.js +1 -1
  121. package/dist/core/runner/write-protection-station.d.ts +7 -1
  122. package/dist/core/runner/write-protection-station.js +6 -3
  123. package/dist/core/runner-deps.d.ts +31 -34
  124. package/dist/core/runtime-caps.d.ts +12 -3
  125. package/dist/core/safety-axis-vocab.d.ts +2 -2
  126. package/dist/core/safety-axis-vocab.js +1 -1
  127. package/dist/core/sensitive-path-policy.d.ts +4 -2
  128. package/dist/core/sensitive-path-policy.js +39 -30
  129. package/dist/core/task-event.d.ts +1 -1
  130. package/dist/core/task-result.d.ts +1 -1
  131. package/dist/core/task-spec.d.ts +41 -89
  132. package/dist/core/task-stream.d.ts +16 -0
  133. package/dist/core/terminal-cause.js +1 -0
  134. package/dist/core/tighten-task-spec.d.ts +2 -2
  135. package/dist/core/tighten-task-spec.js +12 -14
  136. package/dist/core/tool-catalog-entries.js +4 -3
  137. package/dist/core/tool-policy.d.ts +54 -25
  138. package/dist/core/tool-policy.js +43 -2
  139. package/dist/core/tool-registry.d.ts +2 -0
  140. package/dist/core/tool-registry.js +3 -0
  141. package/dist/core/tool-spec.d.ts +8 -9
  142. package/dist/core/trace.d.ts +7 -6
  143. package/dist/core/types.d.ts +2 -1
  144. package/dist/core/wiring-manifest.d.ts +31 -5
  145. package/dist/core/wiring-manifest.js +28 -1
  146. package/dist/core/write-protect.d.ts +11 -1
  147. package/dist/core/write-protect.js +26 -15
  148. package/dist/engine/execution-env/node-execution-env.d.ts +3 -0
  149. package/dist/engine/execution-env/node-execution-env.js +11 -1
  150. package/dist/engine/harness/types.d.ts +6 -7
  151. package/dist/engine/llm/types.d.ts +2 -4
  152. package/dist/engine/loop/types.d.ts +7 -0
  153. package/dist/index.d.ts +15 -5
  154. package/dist/index.js +12 -3
  155. package/dist/orchestration/workflow-governance.js +1 -1
  156. package/dist/orchestration/workflow-primitives.d.ts +1 -1
  157. package/dist/orchestration/workflow-size-guideline.js +2 -2
  158. package/dist/tools/artifact/artifact-tool.d.ts +17 -0
  159. package/dist/tools/artifact/artifact-tool.js +16 -1
  160. package/dist/tools/fs/bash-readonly-classifier.d.ts +28 -7
  161. package/dist/tools/fs/bash-readonly-classifier.js +88 -0
  162. package/dist/tools/fs/containment-face.d.ts +9 -3
  163. package/dist/tools/fs/containment-face.js +2 -0
  164. package/dist/tools/fs/file-read-check.d.ts +49 -0
  165. package/dist/tools/fs/file-read-check.js +71 -0
  166. package/dist/tools/fs/fs-bash.d.ts +3 -3
  167. package/dist/tools/fs/fs-read.d.ts +1 -0
  168. package/dist/tools/fs/fs-search-tools.d.ts +2 -2
  169. package/dist/tools/fs/fs-search-tools.js +4 -4
  170. package/dist/tools/fs/fs-shared.js +20 -6
  171. package/dist/tools/fs/fs-write.d.ts +4 -3
  172. package/dist/tools/fs/fs-write.js +9 -9
  173. package/dist/tools/fs/index.d.ts +39 -3
  174. package/dist/tools/fs/index.js +38 -15
  175. package/dist/tools/fs/read-deny-home.d.ts +93 -0
  176. package/dist/tools/fs/read-deny-home.js +225 -0
  177. package/dist/tools/fs/read-deny.d.ts +176 -34
  178. package/dist/tools/fs/read-deny.js +268 -61
  179. package/dist/tools/fs/safety.d.ts +6 -1
  180. package/dist/tools/fs/safety.js +18 -5
  181. package/dist/tools/fs/search.d.ts +3 -0
  182. package/dist/tools/fs/search.js +47 -9
  183. package/dist/tools/fs/shell-read-check.d.ts +42 -11
  184. package/dist/tools/fs/shell-read-check.js +188 -13
  185. package/dist/tools/fs/shell-read-establish.d.ts +7 -3
  186. package/dist/tools/fs/shell-read-establish.js +134 -21
  187. package/dist/tools/fs/shell-read-identity.d.ts +7 -0
  188. package/dist/tools/fs/shell-read-identity.js +21 -0
  189. package/dist/tools/fs/shell-read-judge.d.ts +92 -32
  190. package/dist/tools/fs/shell-read-judge.js +43 -18
  191. package/dist/tools/fs/shell-read-plan.d.ts +4 -0
  192. package/dist/tools/fs/shell-read-plan.js +26 -4
  193. package/dist/tools/fs/shell-read-write-targets.d.ts +73 -0
  194. package/dist/tools/fs/shell-read-write-targets.js +173 -0
  195. package/package.json +1 -1
  196. package/test/export-surface.snapshot.json +103 -11
  197. package/wire-changes/core@7.34.0.json +2621 -0
@@ -0,0 +1,173 @@
1
+ import { denyFloorShadowsOf } from "./shell-read-judge.js";
2
+ export const SHELL_WRITE_COMMANDS = ["mkdir", "touch", "rm", "rmdir", "mv", "cp", "tee", "sed"];
3
+ const WRITE_COMMAND_SET = new Set(SHELL_WRITE_COMMANDS);
4
+ export function spellsOption(word, long, short) {
5
+ if (word.startsWith("--")) {
6
+ const name = word.slice(2).split("=")[0];
7
+ return name.length > 0 && long.startsWith(name);
8
+ }
9
+ return new RegExp(`^-[A-Za-z]*${short}`).test(word);
10
+ }
11
+ export function programArgs(segment) {
12
+ const words = segment.argv.map((w) => ({ raw: w.raw, spelled: w.folded }));
13
+ const at = words.findIndex((w) => w.spelled === segment.verb?.name);
14
+ return at < 0 ? [] : words.slice(at + 1);
15
+ }
16
+ const SED_GRAMMARS = [
17
+ { required: "efl", optional: "i", longRequired: ["expression", "file", "line-length"] },
18
+ { required: "efiI", optional: "" },
19
+ ];
20
+ const COPY_GRAMMARS = [
21
+ { required: "St", optional: "", longRequired: ["target-directory", "suffix", "no-preserve", "sparse"] },
22
+ { required: "", optional: "" },
23
+ ];
24
+ function readArgv(words, grammar) {
25
+ const options = [];
26
+ const operands = [];
27
+ let endOfOptions = false;
28
+ for (let k = 0; k < words.length; k++) {
29
+ const w = words[k];
30
+ const s = w.spelled;
31
+ if (endOfOptions || !s.startsWith("-") || s === "-") {
32
+ operands.push(w);
33
+ continue;
34
+ }
35
+ if (s === "--") {
36
+ endOfOptions = true;
37
+ continue;
38
+ }
39
+ if (s.startsWith("--")) {
40
+ const eq = s.indexOf("=");
41
+ const name = s.slice(2, eq < 0 ? undefined : eq);
42
+ if (grammar.longRequired === undefined || name.length === 0)
43
+ continue;
44
+ const value = eq >= 0 ? { raw: w.raw, spelled: s.slice(eq + 1) } : grammar.longRequired.some((long) => long.startsWith(name)) ? words[++k] : undefined;
45
+ options.push({ name, long: true, ...(value !== undefined ? { value } : {}) });
46
+ continue;
47
+ }
48
+ for (let c = 1; c < s.length; c++) {
49
+ const letter = s[c];
50
+ const rest = s.slice(c + 1);
51
+ if (grammar.required.includes(letter)) {
52
+ const value = rest.length > 0 ? { raw: w.raw, spelled: rest } : words[++k];
53
+ options.push({ name: letter, long: false, ...(value !== undefined ? { value } : {}) });
54
+ break;
55
+ }
56
+ if (grammar.optional.includes(letter)) {
57
+ options.push({ name: letter, long: false, ...(rest.length > 0 ? { value: { raw: w.raw, spelled: rest } } : {}) });
58
+ break;
59
+ }
60
+ options.push({ name: letter, long: false });
61
+ }
62
+ }
63
+ return { options, operands };
64
+ }
65
+ export function sedOptionsOf(segment) {
66
+ const words = programArgs(segment);
67
+ let inPlace = false;
68
+ let followsLinks = false;
69
+ const suffixes = new Set();
70
+ for (const grammar of SED_GRAMMARS) {
71
+ for (const o of readArgv(words, grammar).options) {
72
+ if (o.long ? "in-place".startsWith(o.name) : o.name === "i" || o.name === "I") {
73
+ inPlace = true;
74
+ if (o.value !== undefined && o.value.spelled.length > 0)
75
+ suffixes.add(o.value.spelled);
76
+ }
77
+ if (o.long && "follow-symlinks".startsWith(o.name))
78
+ followsLinks = true;
79
+ }
80
+ }
81
+ return { inPlace, suffixes: [...suffixes], followsLinks };
82
+ }
83
+ export function sedBackupNames(name, suffix) {
84
+ const appended = `${name}${suffix}`;
85
+ return suffix.includes("*") ? [suffix.replace(/\*/g, () => name), appended] : [appended];
86
+ }
87
+ const OPERAND_SEATS = {
88
+ touch: (s) => (programArgs(s).some((w) => w.spelled.startsWith("-") && spellsOption(w.spelled, "no-dereference", "h")) ? ["landing", "entry"] : ["landing"]),
89
+ rm: () => ["entry"],
90
+ rmdir: () => ["entry"],
91
+ sed: (s) => (sedOptionsOf(s).followsLinks ? ["landing"] : ["entry"]),
92
+ mv: () => ["landing", "entry"],
93
+ cp: () => ["landing", "entry"],
94
+ };
95
+ const SOURCE_WRITTEN = { cp: [], mv: ["entry"] };
96
+ function sedBackupTargets(segment) {
97
+ const { suffixes, followsLinks } = sedOptionsOf(segment);
98
+ if (suffixes.length === 0)
99
+ return [];
100
+ const files = segment.reads.filter((c) => c.provenance === "operand" && c.expands === false);
101
+ return files.flatMap((f) => suffixes.flatMap((suffix) => followsLinks
102
+ ? [{ candidate: { ...f, spelled: `${f.spelled}${suffix}`, face: "write" }, seats: ["entry"], followed: { operand: f, suffix } }]
103
+ : sedBackupNames(f.spelled, suffix).map((spelled) => ({ candidate: { ...f, spelled, face: "write" }, seats: ["entry"] }))));
104
+ }
105
+ function copyReadingsOf(segment) {
106
+ const out = [];
107
+ for (const grammar of COPY_GRAMMARS) {
108
+ const { options, operands } = readArgv(programArgs(segment), grammar);
109
+ const sources = [...operands];
110
+ const dest = options.findLast((o) => o.value !== undefined && (o.long ? "target-directory".startsWith(o.name) : o.name === "t"))?.value ?? sources.pop();
111
+ if (dest !== undefined)
112
+ out.push({ dest, sources });
113
+ }
114
+ return out;
115
+ }
116
+ function copySourceWordsOf(segment) {
117
+ const readings = copyReadingsOf(segment);
118
+ if (readings.length < COPY_GRAMMARS.length || programArgs(segment).some((w) => w.spelled.startsWith("-")))
119
+ return new Set();
120
+ const [first, ...rest] = readings.map((r) => new Set(r.sources.map((w) => w.raw)));
121
+ const dests = new Set(readings.map((r) => r.dest.raw));
122
+ return new Set([...first].filter((raw) => !dests.has(raw) && rest.every((s) => s.has(raw))));
123
+ }
124
+ function copyDestinationChildren(segment) {
125
+ const candidateOf = (raw) => segment.reads.find((c) => c.raw === raw && (c.provenance === "unlisted_word" || c.provenance === "operand"));
126
+ const children = new Map();
127
+ for (const { dest, sources } of copyReadingsOf(segment)) {
128
+ const destCandidate = candidateOf(dest.raw);
129
+ if (destCandidate !== undefined && destCandidate.expands !== false)
130
+ continue;
131
+ for (const src of sources) {
132
+ const source = candidateOf(src.raw);
133
+ if (source !== undefined && source.expands !== false)
134
+ continue;
135
+ const child = `${dest.spelled.replace(/\/+$/, "")}/${src.spelled.replace(/\/+$/, "").split("/").pop() ?? ""}`;
136
+ if (child.endsWith("/") || children.has(child))
137
+ continue;
138
+ children.set(child, destCandidate !== undefined && source !== undefined ? { ...destCandidate, spelled: child } : { spelled: child, raw: src.raw, provenance: "unlisted_word", expands: "unresolvable", bases: [] });
139
+ }
140
+ }
141
+ return [...children.values()];
142
+ }
143
+ function writeTargetsOf(segment) {
144
+ const out = [];
145
+ const write = (c, seats, written, child) => void out.push({ candidate: { ...c, face: "write" }, ...(seats !== undefined ? { seats } : {}), ...(written !== undefined ? { written } : {}), ...(child === true ? { child } : {}) });
146
+ for (const r of segment.redirects)
147
+ if (r.direction === "out" && r.target !== undefined)
148
+ write(r.target);
149
+ for (const c of segment.reads)
150
+ if (c.provenance === "write_redirect_target")
151
+ write(c);
152
+ const verb = segment.verb?.basename;
153
+ if (verb !== undefined && WRITE_COMMAND_SET.has(verb) && (verb !== "sed" || sedOptionsOf(segment).inPlace)) {
154
+ const seats = OPERAND_SEATS[verb]?.(segment);
155
+ const sourceWritten = SOURCE_WRITTEN[verb];
156
+ const sources = sourceWritten !== undefined ? copySourceWordsOf(segment) : undefined;
157
+ for (const c of segment.reads)
158
+ if (c.provenance === "operand" || c.provenance === "unlisted_word" || c.provenance === "option_value")
159
+ write(c, seats, sources?.has(c.raw) === true ? sourceWritten : undefined);
160
+ if (verb === "cp" || verb === "mv")
161
+ for (const c of copyDestinationChildren(segment))
162
+ write(c, seats, undefined, true);
163
+ if (verb === "sed")
164
+ out.push(...sedBackupTargets(segment));
165
+ }
166
+ return out;
167
+ }
168
+ export function judgedCandidatesOf(segment) {
169
+ const reads = segment.reads.filter((c) => c.provenance !== "write_redirect_target");
170
+ const writes = writeTargetsOf(segment);
171
+ const plain = (cs) => cs.map((candidate) => ({ candidate }));
172
+ return [...plain(reads), ...plain(denyFloorShadowsOf(reads)), ...writes, ...plain(denyFloorShadowsOf(writes.map((w) => w.candidate)))];
173
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sema-agent/core",
3
- "version": "7.33.8",
3
+ "version": "7.34.0",
4
4
  "description": "Stateless, task-oriented AI agent core",
5
5
  "type": "module",
6
6
  "license": "BUSL-1.1",