@sema-agent/server 7.141.0 → 7.143.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 (341) hide show
  1. package/MIGRATION.md +657 -0
  2. package/USAGE.md +102 -30
  3. package/dist/adoption/plan.js +22 -0
  4. package/dist/approval-ask-audit-store.d.ts +61 -43
  5. package/dist/approval-ask-audit-store.js +69 -44
  6. package/dist/approval-ask-machine.d.ts +15 -7
  7. package/dist/approval-ask-machine.js +10 -4
  8. package/dist/approval-card.d.ts +126 -27
  9. package/dist/approval-card.js +103 -23
  10. package/dist/approval-crash-convergence.d.ts +17 -7
  11. package/dist/approval-crash-convergence.js +94 -22
  12. package/dist/approval-deny-reasons.d.ts +34 -30
  13. package/dist/approval-deny-reasons.js +21 -6
  14. package/dist/approval-policy-settlement.d.ts +1 -1
  15. package/dist/approval-queue-kind.d.ts +27 -0
  16. package/dist/approval-queue-kind.js +6 -0
  17. package/dist/approval-reconciler.d.ts +41 -9
  18. package/dist/approval-reconciler.js +45 -42
  19. package/dist/audit.js +4 -2
  20. package/dist/auth-bridge.d.ts +9 -6
  21. package/dist/auth-bridge.js +9 -3
  22. package/dist/boot/adoption.js +2 -1
  23. package/dist/boot/budget-tracing.d.ts +17 -1
  24. package/dist/boot/budget-tracing.js +10 -6
  25. package/dist/boot/device-lane.d.ts +1 -1
  26. package/dist/boot/execution-env.d.ts +24 -4
  27. package/dist/boot/execution-env.js +26 -23
  28. package/dist/boot/execution-lane.js +2 -1
  29. package/dist/boot/exit-boundary.js +5 -4
  30. package/dist/boot/governance-seams.d.ts +26 -41
  31. package/dist/boot/governance-seams.js +61 -28
  32. package/dist/boot/late-binds.d.ts +7 -4
  33. package/dist/boot/late-binds.js +3 -1
  34. package/dist/boot/leader.js +2 -4
  35. package/dist/boot/memory-consolidation.d.ts +0 -8
  36. package/dist/boot/memory-consolidation.js +5 -4
  37. package/dist/boot/parked-revive-gate.js +2 -1
  38. package/dist/boot/permission-rules-audit.d.ts +0 -28
  39. package/dist/boot/permission-rules-audit.js +2 -1
  40. package/dist/boot/read-deny-anchor-audit.js +2 -1
  41. package/dist/boot/reapers.js +9 -7
  42. package/dist/boot/resolve-spec.d.ts +1 -1
  43. package/dist/boot/resolve-spec.js +19 -10
  44. package/dist/boot/retention-lane.js +5 -3
  45. package/dist/boot/runner-deps.d.ts +10 -7
  46. package/dist/boot/runner-deps.js +20 -29
  47. package/dist/boot/runtime-caps.js +3 -2
  48. package/dist/boot/session-faces.js +4 -3
  49. package/dist/boot/shutdown.d.ts +9 -0
  50. package/dist/boot/shutdown.js +19 -4
  51. package/dist/boot/stage-02-web-admin-pull.js +3 -0
  52. package/dist/boot/stage-03-store-backend.d.ts +4 -1
  53. package/dist/boot/stage-03-store-backend.js +1 -2
  54. package/dist/boot/stage-04-stores.d.ts +5 -2
  55. package/dist/boot/stage-04-stores.js +6 -7
  56. package/dist/boot/stage-05-execution-env.d.ts +6 -3
  57. package/dist/boot/stage-05-execution-env.js +8 -6
  58. package/dist/boot/stage-06-runners.d.ts +6 -3
  59. package/dist/boot/stage-06-runners.js +3 -4
  60. package/dist/boot/stage-07-capability-layer.d.ts +6 -3
  61. package/dist/boot/stage-07-capability-layer.js +7 -2
  62. package/dist/boot/stage-08-reapers.d.ts +6 -3
  63. package/dist/boot/stage-08-reapers.js +3 -2
  64. package/dist/boot/stage-09-leader.d.ts +6 -3
  65. package/dist/boot/stage-10-http-server.d.ts +6 -3
  66. package/dist/boot/stage-10-http-server.js +14 -5
  67. package/dist/boot/stores.d.ts +5 -2
  68. package/dist/boot/stores.js +10 -9
  69. package/dist/boot/web-admin.d.ts +5 -1
  70. package/dist/boot/web-admin.js +48 -36
  71. package/dist/boot/webfetch-summarize-lane.js +2 -1
  72. package/dist/boot/workflow-orchestration.js +3 -2
  73. package/dist/capabilities/builtin-tools.d.ts +2 -1
  74. package/dist/capabilities/builtin-tools.js +2 -4
  75. package/dist/capabilities/composite-members.d.ts +2 -1
  76. package/dist/capabilities/composite-members.js +2 -1
  77. package/dist/capabilities/hands-lane.d.ts +9 -39
  78. package/dist/capabilities/hands-lane.js +8 -13
  79. package/dist/capabilities/mcp-probe.d.ts +3 -2
  80. package/dist/capabilities/scenarios.d.ts +11 -1
  81. package/dist/capabilities/scenarios.js +1 -0
  82. package/dist/capabilities/skills.d.ts +1 -17
  83. package/dist/capabilities/skills.js +0 -8
  84. package/dist/capability-facts.d.ts +31 -7
  85. package/dist/capability-facts.js +27 -4
  86. package/dist/card-void.d.ts +6 -9
  87. package/dist/config-catalog.js +2 -1
  88. package/dist/config-dir-trust.js +58 -29
  89. package/dist/config-invariants.d.ts +7 -1
  90. package/dist/config-invariants.js +7 -0
  91. package/dist/config-provider.d.ts +10 -0
  92. package/dist/config-provider.js +15 -4
  93. package/dist/config-root-migration.d.ts +13 -0
  94. package/dist/config-root-migration.js +99 -0
  95. package/dist/config-types.d.ts +19 -8
  96. package/dist/config.d.ts +10 -3
  97. package/dist/config.js +18 -4
  98. package/dist/delegated-session-owner.d.ts +5 -3
  99. package/dist/delegated-session-owner.js +1 -1
  100. package/dist/device-ws-protocol.d.ts +1 -0
  101. package/dist/device-ws-protocol.js +2 -1
  102. package/dist/env-model-table-gate.d.ts +53 -0
  103. package/dist/env-model-table-gate.js +53 -0
  104. package/dist/execution-lane-caps.d.ts +2 -1
  105. package/dist/fleet/fleet-bus.d.ts +34 -55
  106. package/dist/fleet/fleet-bus.js +35 -100
  107. package/dist/fleet/fleet-reconciler.d.ts +4 -4
  108. package/dist/fleet/fleet-reconciler.js +1 -1
  109. package/dist/fleet/subagent-tail-bus.d.ts +14 -11
  110. package/dist/fleet/subagent-tail-bus.js +15 -28
  111. package/dist/hooks/hook-runner.d.ts +6 -0
  112. package/dist/hooks/hook-runner.js +58 -8
  113. package/dist/host-decision.d.ts +54 -20
  114. package/dist/host-decision.js +42 -14
  115. package/dist/http/admission.d.ts +1 -1
  116. package/dist/http/admission.js +7 -3
  117. package/dist/http/approval-sweeps.js +11 -8
  118. package/dist/http/caller-trust.d.ts +1 -1
  119. package/dist/http/dispatch.js +4 -2
  120. package/dist/http/durable-run-leg.js +2 -2
  121. package/dist/http/engine-refusal.d.ts +16 -0
  122. package/dist/http/engine-refusal.js +17 -0
  123. package/dist/http/execution-context.d.ts +2 -2
  124. package/dist/http/idempotency.d.ts +1 -1
  125. package/dist/http/memory-compliance-failure-reply.d.ts +1 -3
  126. package/dist/http/memory-compliance-failure-reply.js +4 -6
  127. package/dist/http/owner-access.d.ts +11 -0
  128. package/dist/http/owner-access.js +13 -0
  129. package/dist/http/principal-gate.d.ts +3 -1
  130. package/dist/http/principal-gate.js +17 -8
  131. package/dist/http/resume-legs.d.ts +21 -7
  132. package/dist/http/resume-legs.js +76 -58
  133. package/dist/http/resume-restatement.d.ts +39 -0
  134. package/dist/http/resume-restatement.js +25 -0
  135. package/dist/http/route-ctx.d.ts +35 -10
  136. package/dist/http/route-ctx.js +1 -1
  137. package/dist/http/route-table.js +2 -0
  138. package/dist/http/routes/approvals-assistant.d.ts +9 -1
  139. package/dist/http/routes/approvals-assistant.js +142 -31
  140. package/dist/http/routes/attachments.js +18 -0
  141. package/dist/http/routes/capabilities.js +16 -4
  142. package/dist/http/routes/memory-policy.d.ts +2 -2
  143. package/dist/http/routes/memory-policy.js +27 -7
  144. package/dist/http/routes/notify-wake.js +23 -25
  145. package/dist/http/routes/rules.js +48 -13
  146. package/dist/http/routes/runs.js +12 -11
  147. package/dist/http/routes/session-memory-sync.d.ts +91 -0
  148. package/dist/http/routes/session-memory-sync.js +174 -0
  149. package/dist/http/routes/session-sync.js +13 -20
  150. package/dist/http/routes/sessions-list.d.ts +2 -1
  151. package/dist/http/routes/sessions.d.ts +2 -2
  152. package/dist/http/routes/sessions.js +22 -23
  153. package/dist/http/routes/tasks.js +34 -54
  154. package/dist/http/run-read-face.d.ts +7 -0
  155. package/dist/http/run-read-face.js +9 -3
  156. package/dist/http/send.d.ts +5 -0
  157. package/dist/http/send.js +9 -2
  158. package/dist/http/server.d.ts +27 -15
  159. package/dist/http/server.js +4 -6
  160. package/dist/http/stored-body-replay.js +15 -4
  161. package/dist/http/submit-replay.d.ts +4 -3
  162. package/dist/http/submit-replay.js +2 -2
  163. package/dist/http/sync-submit-body.d.ts +21 -4
  164. package/dist/http/sync-submit-body.js +13 -0
  165. package/dist/http/wire-types.d.ts +17 -7
  166. package/dist/identity-source.d.ts +21 -2
  167. package/dist/identity-source.js +6 -0
  168. package/dist/leader/leader.js +5 -2
  169. package/dist/leader/wire.d.ts +7 -1
  170. package/dist/leader/wire.js +6 -5
  171. package/dist/leg-facts.d.ts +37 -0
  172. package/dist/leg-facts.js +15 -0
  173. package/dist/memory-bundle-engine.d.ts +1 -4
  174. package/dist/memory-bundle-engine.js +2 -2
  175. package/dist/memory-incident-sink.d.ts +19 -6
  176. package/dist/memory-incident-sink.js +8 -4
  177. package/dist/memory-operator-faces.d.ts +30 -66
  178. package/dist/memory-operator-faces.js +17 -88
  179. package/dist/memory-scope-stores.d.ts +38 -40
  180. package/dist/memory-scope-stores.js +51 -36
  181. package/dist/memory-scope.d.ts +0 -9
  182. package/dist/memory-scope.js +0 -9
  183. package/dist/memory-sync-client.d.ts +21 -21
  184. package/dist/memory-sync-client.js +62 -43
  185. package/dist/memory-sync-identity.d.ts +24 -0
  186. package/dist/memory-sync-identity.js +57 -0
  187. package/dist/memory-sync.d.ts +27 -5
  188. package/dist/memory-sync.js +29 -7
  189. package/dist/model-plane-face.d.ts +13 -7
  190. package/dist/model-plane-face.js +2 -1
  191. package/dist/observability/fail-open.d.ts +47 -14
  192. package/dist/observability/fail-open.js +37 -11
  193. package/dist/observability/run-terminal.d.ts +92 -34
  194. package/dist/observability/run-terminal.js +171 -162
  195. package/dist/orchestration/workflow-completion-inbox.d.ts +5 -19
  196. package/dist/orchestration/workflow-completion-inbox.js +0 -12
  197. package/dist/orchestration/workflow-notify-journal.d.ts +3 -2
  198. package/dist/orchestration/workflow-park-decision.d.ts +8 -3
  199. package/dist/orchestration/workflow-park-decision.js +5 -3
  200. package/dist/org-delivery-gate.d.ts +11 -0
  201. package/dist/org-delivery-gate.js +19 -1
  202. package/dist/parked-decide.d.ts +13 -9
  203. package/dist/parked-decide.js +7 -7
  204. package/dist/parked-revive-surface.js +1 -1
  205. package/dist/peer-inbound-face.d.ts +127 -0
  206. package/dist/peer-inbound-face.js +158 -0
  207. package/dist/permission-rule-list.d.ts +13 -9
  208. package/dist/permission-rule-list.js +7 -3
  209. package/dist/plugins/approval-ask-store-file.d.ts +14 -4
  210. package/dist/plugins/approval-ask-store-file.js +64 -11
  211. package/dist/plugins/approval-ask-store-memory.d.ts +2 -1
  212. package/dist/plugins/approval-ask-store-memory.js +17 -14
  213. package/dist/plugins/approval-ask-store-sql.d.ts +70 -23
  214. package/dist/plugins/approval-ask-store-sql.js +79 -30
  215. package/dist/plugins/checkpoint-store-sql.d.ts +4 -4
  216. package/dist/plugins/checkpoint-store-sql.js +9 -7
  217. package/dist/plugins/file-history-store-sql.d.ts +24 -18
  218. package/dist/plugins/file-history-store-sql.js +24 -19
  219. package/dist/plugins/file-run-store.d.ts +35 -1
  220. package/dist/plugins/file-run-store.js +108 -9
  221. package/dist/plugins/imported-layer-root-retirement.d.ts +82 -0
  222. package/dist/plugins/imported-layer-root-retirement.js +96 -0
  223. package/dist/plugins/local-checkpoint-store.d.ts +1 -1
  224. package/dist/plugins/local-checkpoint-store.js +2 -2
  225. package/dist/plugins/local-session-store.d.ts +42 -9
  226. package/dist/plugins/local-session-store.js +83 -33
  227. package/dist/plugins/local-task-attachment-store.d.ts +12 -2
  228. package/dist/plugins/local-task-attachment-store.js +67 -43
  229. package/dist/plugins/mailbox-recipient-lifecycle.d.ts +9 -31
  230. package/dist/plugins/mailbox-recipient-lifecycle.js +4 -0
  231. package/dist/plugins/mailbox-store-sql.d.ts +12 -8
  232. package/dist/plugins/mailbox-store-sql.js +76 -7
  233. package/dist/plugins/memory-key-guards.d.ts +3 -3
  234. package/dist/plugins/memory-run-store.d.ts +6 -1
  235. package/dist/plugins/memory-run-store.js +11 -1
  236. package/dist/plugins/memory-sync-store-pg.d.ts +15 -0
  237. package/dist/plugins/memory-sync-store-pg.js +21 -0
  238. package/dist/plugins/memory-sync-store-tidb.d.ts +2 -0
  239. package/dist/plugins/memory-sync-store-tidb.js +13 -1
  240. package/dist/plugins/one-time-migrations.d.ts +58 -2
  241. package/dist/plugins/one-time-migrations.js +161 -4
  242. package/dist/plugins/org-delivery-quota-store.d.ts +1 -1
  243. package/dist/plugins/org-delivery-quota-store.js +2 -12
  244. package/dist/plugins/park-commit-watch.d.ts +1 -1
  245. package/dist/plugins/permission-rule-store-file.d.ts +10 -1
  246. package/dist/plugins/permission-rule-store-file.js +15 -2
  247. package/dist/plugins/permission-rule-store-sql.d.ts +31 -1
  248. package/dist/plugins/permission-rule-store-sql.js +35 -2
  249. package/dist/plugins/remote-env-device.d.ts +8 -11
  250. package/dist/plugins/remote-env-device.js +6 -3
  251. package/dist/plugins/remote-env-e2b.d.ts +23 -4
  252. package/dist/plugins/remote-env-e2b.js +111 -28
  253. package/dist/plugins/remote-env-k8s.d.ts +61 -22
  254. package/dist/plugins/remote-env-k8s.js +133 -33
  255. package/dist/plugins/remote-env-local-docker.d.ts +15 -3
  256. package/dist/plugins/remote-env-local-docker.js +40 -12
  257. package/dist/plugins/retention-store-sql.d.ts +2 -2
  258. package/dist/plugins/run-store-sql.d.ts +9 -1
  259. package/dist/plugins/run-store-sql.js +9 -1
  260. package/dist/plugins/sandbox-read-floor.d.ts +5 -7
  261. package/dist/plugins/sandbox-read-floor.js +2 -7
  262. package/dist/plugins/sql-errors.d.ts +10 -1
  263. package/dist/plugins/sql-errors.js +13 -0
  264. package/dist/plugins/store-backend.d.ts +33 -35
  265. package/dist/plugins/store-backend.js +10 -1
  266. package/dist/plugins/store-contracts.d.ts +50 -1
  267. package/dist/plugins/store-contracts.js +6 -0
  268. package/dist/plugins/task-attachment-store.d.ts +112 -14
  269. package/dist/plugins/task-attachment-store.js +207 -29
  270. package/dist/plugins/tool-result-store-sql.d.ts +9 -8
  271. package/dist/plugins/tool-result-store-sql.js +23 -2
  272. package/dist/plugins/wiring-section-codec.d.ts +32 -0
  273. package/dist/plugins/wiring-section-codec.js +55 -0
  274. package/dist/plugins/workspace-fill.d.ts +60 -0
  275. package/dist/plugins/workspace-fill.js +106 -0
  276. package/dist/project-bundle.d.ts +38 -0
  277. package/dist/project-bundle.js +609 -0
  278. package/dist/rule-entry-list.d.ts +3 -2
  279. package/dist/rule-entry-list.js +5 -1
  280. package/dist/rules-consent.d.ts +28 -5
  281. package/dist/rules-consent.js +40 -28
  282. package/dist/run-local.js +11 -13
  283. package/dist/runs.d.ts +12 -8
  284. package/dist/runs.js +6 -8
  285. package/dist/runtime-governance.d.ts +1 -1
  286. package/dist/sandbox-egress-policy.d.ts +4 -1
  287. package/dist/sandbox-egress-policy.js +3 -1
  288. package/dist/sandbox-git-plane.d.ts +31 -12
  289. package/dist/sandbox-git-plane.js +24 -4
  290. package/dist/security.d.ts +9 -0
  291. package/dist/security.js +8 -0
  292. package/dist/server-secret-env.d.ts +4 -0
  293. package/dist/session-error-wire.d.ts +36 -0
  294. package/dist/session-error-wire.js +13 -0
  295. package/dist/session-incarnation.d.ts +1 -1
  296. package/dist/session-notify-door.d.ts +106 -0
  297. package/dist/session-notify-door.js +93 -0
  298. package/dist/session-sync.d.ts +9 -14
  299. package/dist/session-sync.js +5 -5
  300. package/dist/session-workspace.d.ts +3 -13
  301. package/dist/session-workspace.js +0 -9
  302. package/dist/standing-answer-grant.d.ts +5 -0
  303. package/dist/standing-answer-grant.js +10 -0
  304. package/dist/stores-sql/session-policy-store-sql.d.ts +4 -2
  305. package/dist/stores-sql/session-policy-store-sql.js +3 -13
  306. package/dist/task-mcp.d.ts +1 -1
  307. package/dist/task-settings.d.ts +21 -10
  308. package/dist/task-settings.js +46 -13
  309. package/dist/terminal.d.ts +39 -19
  310. package/dist/terminal.js +65 -22
  311. package/dist/tool-approval.d.ts +56 -37
  312. package/dist/tool-approval.js +78 -71
  313. package/dist/trace/core-keyset-guard.d.ts +134 -14
  314. package/dist/trace/engine-notice-wire.d.ts +9 -3
  315. package/dist/trace/engine-notice-wire.js +7 -3
  316. package/dist/trace/exit-seat.d.ts +9 -2
  317. package/dist/trace/exit-seat.js +1 -0
  318. package/dist/trace/ledger-sink.d.ts +10 -6
  319. package/dist/trace/ledger-sink.js +2 -2
  320. package/dist/trace/model-segment.d.ts +55 -25
  321. package/dist/trace/model-segment.js +101 -33
  322. package/dist/trace/project.d.ts +25 -5
  323. package/dist/trace/project.js +22 -0
  324. package/dist/trace/redact.d.ts +61 -9
  325. package/dist/trace/redact.js +1490 -468
  326. package/dist/trace/self-minted-wire.d.ts +745 -24
  327. package/dist/trace/self-minted-wire.js +239 -9
  328. package/dist/trace/wire-projection-faces.d.ts +2 -2
  329. package/dist/trace/wire-projection-faces.js +2 -2
  330. package/dist/verifier-pause-card.d.ts +33 -5
  331. package/dist/verifier-pause-card.js +15 -10
  332. package/dist/web-admin-client/apply-effective.d.ts +12 -16
  333. package/dist/web-admin-client/apply-effective.js +109 -9
  334. package/dist/web-admin-client/effective-keys.js +2 -0
  335. package/dist/web-admin-client/types.d.ts +4 -0
  336. package/dist/workspace-space.d.ts +19 -3
  337. package/dist/workspace-space.js +8 -4
  338. package/docs/DEVICE-EXECUTOR-PROTOCOL.md +3 -1
  339. package/package.json +3 -2
  340. package/wire-changes/server@7.142.0.json +639 -0
  341. package/wire-changes/server@7.143.0.json +1167 -0
@@ -1,4 +1,9 @@
1
- import { reasoningEndEventData } from "./project.js";
1
+ import { recordFailOpen } from "../observability/fail-open.js";
2
+ import { errorKindOf } from "../observability/err-text.js";
3
+ import { OVERSIZED_REDACTION_PLACEHOLDER } from "../observability/run-terminal.js";
4
+ import { liveIdentityFields, reasoningEndEventData, textEndEventData } from "./project.js";
5
+ import { dropProjectedFace } from "./projection-drop.js";
6
+ import { createRedactionStream } from "./redact.js";
2
7
  const BOUNDARY = new Set([
3
8
  "tool_start", "tool_end", "status", "context_usage", "compacted", "diagnostics",
4
9
  "steering_injected", "compaction_outcome", "workspace_changed", "wiring_manifest",
@@ -14,9 +19,8 @@ export function reasoningSegmentEventId(anchor) {
14
19
  export function reasoningDeltaBytes(ev) {
15
20
  return typeof ev.delta === "string" && ev.delta !== "" ? ev.delta : undefined;
16
21
  }
17
- export function reasoningStreamOfTask(...ids) {
18
- const set = new Set(ids.filter((v) => typeof v === "string" && v !== ""));
19
- return (ident) => (ident.sourceTaskId !== undefined && set.has(ident.sourceTaskId)) || (ident.bgAgentId !== undefined && set.has(ident.bgAgentId));
22
+ export function modelStreamOfTask(taskId) {
23
+ return (ident) => ident.sourceTaskId === taskId || ident.bgAgentId === taskId;
20
24
  }
21
25
  function streamKeyOf(ident) {
22
26
  return `${ident.parentToolCallId ?? ""}\u0000${ident.sourceTaskId ?? ""}\u0000${ident.bgAgentId ?? ""}`;
@@ -25,44 +29,108 @@ function identOf(ev) {
25
29
  const s = (v) => (typeof v === "string" ? v : undefined);
26
30
  return { parentToolCallId: s(ev.parentToolCallId), sourceTaskId: s(ev.sourceTaskId), bgAgentId: s(ev.bgAgentId) };
27
31
  }
28
- export function createReasoningSegments() {
29
- const open = new Map();
30
- const cutKey = (key) => {
31
- const seg = open.get(key);
32
- if (seg === undefined)
32
+ function release(s) {
33
+ try {
34
+ return s.text.takeSettled();
35
+ }
36
+ catch (err) {
37
+ recordFailOpen("server.run-terminal.redact-threw", `live-hold len=${s.text.fed.length} err=${errorKindOf(err)}`);
38
+ return "";
39
+ }
40
+ }
41
+ function remainderOf(family, s) {
42
+ try {
43
+ const r = s.text.flush();
44
+ if (r.diverged)
45
+ recordFailOpen("server.live-text.hold-diverged", `family=${family} len=${s.text.fed.length}`);
46
+ return r.rest;
47
+ }
48
+ catch (err) {
49
+ recordFailOpen("server.run-terminal.redact-threw", `live-hold len=${s.text.fed.length} err=${errorKindOf(err)}`);
50
+ return OVERSIZED_REDACTION_PLACEHOLDER;
51
+ }
52
+ }
53
+ export function createLiveModelText() {
54
+ const open = { text: new Map(), reasoning: new Map() };
55
+ const deltaType = (family) => (family === "text" ? "text_delta" : "reasoning_delta");
56
+ const close = (family, key, deliver) => {
57
+ const s = open[family].get(key);
58
+ if (s === undefined)
59
+ return [];
60
+ open[family].delete(key);
61
+ if (!deliver)
33
62
  return [];
34
- open.delete(key);
35
- const data = reasoningEndEventData({ ...seg.ident, eventId: seg.segmentEventId, content: seg.buf });
36
- return data === null ? [] : [{ type: "reasoning_end", ...data }];
63
+ if (!s.delivering)
64
+ s.text.skip();
65
+ const out = [];
66
+ const rest = remainderOf(family, s);
67
+ if (rest !== "")
68
+ out.push({ type: deltaType(family), delta: rest, ...liveIdentityFields(s.ident) });
69
+ if (family === "reasoning") {
70
+ const data = reasoningEndEventData({ ...s.ident, eventId: s.segmentEventId, content: s.text.fed });
71
+ if (data !== null)
72
+ out.push({ type: "reasoning_end", ...data });
73
+ }
74
+ return out;
75
+ };
76
+ const feed = (family, ev, deliver) => {
77
+ if (typeof ev.delta !== "string") {
78
+ if (family === "text")
79
+ dropProjectedFace("text_delta.delta is not a string");
80
+ else
81
+ dropProjectedFace("reasoning_delta.delta is not a string");
82
+ return [];
83
+ }
84
+ const ident = identOf(ev);
85
+ const key = streamKeyOf(ident);
86
+ let s = open[family].get(key);
87
+ if (s === undefined && ev.delta !== "") {
88
+ s = { ident, text: createRedactionStream(), delivering: deliver };
89
+ open[family].set(key, s);
90
+ }
91
+ if (s !== undefined) {
92
+ if (deliver && !s.delivering) {
93
+ s.delivering = true;
94
+ s.text.skip();
95
+ }
96
+ else if (!deliver)
97
+ s.delivering = false;
98
+ s.text.feed(ev.delta);
99
+ if (family === "reasoning" && reasoningDeltaBytes(ev) !== undefined)
100
+ s.segmentEventId ??= reasoningSegmentEventId(ev.eventId);
101
+ }
102
+ if (!deliver)
103
+ return [];
104
+ return [{ type: deltaType(family), delta: s === undefined ? "" : release(s), ...liveIdentityFields(ev) }];
37
105
  };
38
106
  return {
39
- onEvent: (ev) => {
40
- if (ev.type === "reasoning_delta") {
41
- const bytes = reasoningDeltaBytes(ev);
42
- if (bytes === undefined)
43
- return [];
44
- const ident = identOf(ev);
45
- const key = streamKeyOf(ident);
46
- const seg = open.get(key);
47
- if (seg === undefined)
48
- open.set(key, { ident, segmentEventId: reasoningSegmentEventId(ev.eventId), buf: bytes });
49
- else {
50
- seg.buf += bytes;
51
- seg.segmentEventId ??= reasoningSegmentEventId(ev.eventId);
52
- }
53
- return [];
107
+ onEvent: (ev, deliver = true) => {
108
+ if (ev.type === "text_delta")
109
+ return feed("text", ev, deliver);
110
+ if (ev.type === "reasoning_delta")
111
+ return feed("reasoning", ev, deliver);
112
+ const key = streamKeyOf(identOf(ev));
113
+ if (ev.type === "text_end") {
114
+ const out = close("text", key, deliver);
115
+ const end = deliver ? textEndEventData(ev) : null;
116
+ if (end !== null)
117
+ out.push({ type: "text_end", ...end });
118
+ return out;
54
119
  }
55
- return isModelSegmentBoundary(ev.type ?? "") ? cutKey(streamKeyOf(identOf(ev))) : [];
120
+ return isModelSegmentBoundary(ev.type ?? "") ? [...close("text", key, deliver), ...close("reasoning", key, deliver)] : [];
56
121
  },
57
- cut: (match) => {
122
+ cut: (match, deliver = true) => {
58
123
  const out = [];
59
- for (const [key, seg] of [...open]) {
60
- if (match !== undefined && !match(seg.ident))
61
- continue;
62
- out.push(...cutKey(key));
124
+ for (const family of ["text", "reasoning"]) {
125
+ for (const [key, s] of [...open[family]]) {
126
+ if (match !== undefined && !match(s.ident))
127
+ continue;
128
+ out.push(...close(family, key, deliver));
129
+ }
63
130
  }
64
131
  return out;
65
132
  },
133
+ isIdle: () => open.text.size === 0 && open.reasoning.size === 0,
66
134
  };
67
135
  }
68
136
  //# sourceMappingURL=model-segment.js.map
@@ -30,7 +30,7 @@ import type { RunCompanionRecord } from "../observability/prompt-manifest.js";
30
30
  import { type SafeText } from "./exit-seat.js";
31
31
  import { type SemaProvenanceInput } from "./sema-provenance.js";
32
32
  import { type ExtensionRequesterFace, type ToolInputRewriteFace } from "./extension-call-face.js";
33
- import type { LedgerEventType } from "./ledger-events.js";
33
+ import type { LedgerEventType, ParkLedgerEventType } from "./ledger-events.js";
34
34
  import type { InstructionsSegment } from "../instruction-selection.js";
35
35
  import type { RunSkillEntry } from "../capabilities/skills.js";
36
36
  /** 账本写口的统一签名 —— `type` 是**闭集**(`ledger-events.ts`):新型必须先登记,否则调用点编译红
@@ -222,8 +222,8 @@ export declare function screenedStoredEventData(type: string, data: unknown): un
222
222
  /** `text_end` 段末帧的**唯一**铸点(三腿共用:top stream / 转发子代腿 / 子代 tail 面)。content = 段权威全文 ⇒ 与
223
223
  * durable 面(`result` / 账本 `text` 行)同一只 {@link redactModelText}(认出才改写、抛则占位、不设上限)。
224
224
  * 此前三处各自逐字透传 —— 同一份文本毫秒后在 `done.result.result` 上已脱,live 面却在凭据生成瞬间明文([ref])。
225
- * `text_delta` 仍逐字:跨 chunk 的凭据无法就地判;clay [ref] ②(2026-09-18)裁定**维持逐字成文**([ref] U-3 关票),
226
- * 权威段 `text_end.content` 已脱敏、消费端段末整段替换即得脱敏读法。
225
+ * 逐块的 `text_delta` 由 `trace/model-segment.ts` 的登记册铸(7.143.0 起经同一只脱敏器的放行窗,一段的逐块拼接 = 本帧 content);
226
+ * 本函数由登记册在段末调,三腿不再各自调。
227
227
  * 坏形(content 非串/空串)⇒ null(丢帧,不铸「权威空段」:core 契约明言空段不发本帧,消费端收到空段会清掉已攒 delta)。
228
228
  * 身份**四键**随行(live 现状带全四键,消费端可能已依赖);值经 {@link identityKey} —— 非空 string 才上 wire
229
229
  * ([ref] 起不再逐字透传:坏形身份键会在 live 写口上铸出假游标)。 */
@@ -419,6 +419,23 @@ export interface ParkEventData {
419
419
  * 门身份读法与三处 durable 读面同一只(`durableRowIdentity`,face `run-events-park`):没有暂停因由的行不问身份(没有门可认);有因由而读不出 ⇒ 键缺席 + 计一次。
420
420
  */
421
421
  export declare function parkEventData(result: unknown, reopened?: string | null): ParkEventData;
422
+ /** 一腿的计量席:E8 累加器 + 这条腿在累加器里的归因键。`modelUsage` 缺席 ⇒ 这条腿没接累加器,没有用量可结。 */
423
+ export interface ModelUsageSeat {
424
+ readonly modelUsage: ModelUsageTracker | undefined;
425
+ readonly taskId: string;
426
+ }
427
+ /**
428
+ * park 账本行的**唯一写口** —— {@link parkEventData} 是行的唯一构造器,本函数是它的唯一落账处:后台腿与同步 detach 腿(`LedgerSink.appendParked`)、
429
+ * 续跑腿的再停两臂、重开臂与续跑 verify 臂(`resume-legs.ts`)都经这一只。
430
+ *
431
+ * **状态帧最后**:一腿账本的状态帧(终局 `done` / `failed`、停驻 `suspended` / `needs_review`)是这一腿主线写下的最后一帧(晚到的子代转发帧、完成后的 suggestions 是旁路写,不在此列),计量帧先于它写出 ——
432
+ * 终局由 {@link attachModelUsage} 先结清最后一拍再落 `done`,停驻由本函数先 drain 再落停驻行。顺序属于写口、不属于调用点:
433
+ * 只回结果的 verify 腿没有逐 turn 落账的流(无 `turn_end` 帧),挂起前的用量只有停驻这一拍才落账;若各调用点各自记得「先结清」,
434
+ * 这条腿的账本尾帧就会是 `model_usage`,与不带 `verify` 的停驻(用量在 `turn_end` 就结清了)两形不同序(`GET /v1/runs/:id/events` 的尾帧)。
435
+ * 用量行落不下 ⇒ 停驻行**照落**,然后把用量行的失败抛给调用方(失败语义与此前逐字同:账本里有停驻帧、调用方按「停驻没落定」收场 —— bg 腿以 `failed` 收、手里的卡作废;
436
+ * 尽力而为的调用点(detach 腿的兜底停驻、续跑腿的重开臂)照旧吞掉它,停驻帧不因为一笔用量行的失败而缺席)。顺序变了,谁来写、写不下谁抛没有变。
437
+ */
438
+ export declare function appendParkRow(append: AppendFn, usage: ModelUsageSeat | undefined, word: ParkLedgerEventType, result: unknown, reopened?: string | null): Promise<void>;
422
439
  /**
423
440
  * The `task_started` payload(core 7.50.0):一只委派子代**起跑**的那一帧 —— 每周期一只(首派 / 复活;耐久续跑腿不铸),
424
441
  * 序在子代的 `wiring_manifest` 之后、它的首个 `task_progress` 与首次模型请求之前。
@@ -620,6 +637,7 @@ export declare function compactionOutcomeEventData(ev: {
620
637
  trigger?: unknown;
621
638
  reason?: unknown;
622
639
  pass?: unknown;
640
+ requestedBy?: unknown;
623
641
  eventId?: unknown;
624
642
  parentToolCallId?: unknown;
625
643
  }): FrameData<{
@@ -870,8 +888,8 @@ export declare function toolRosterDeltaEventData(ev: {
870
888
  * (值可以是 `undefined`)—— 漏递的腿当场 tsc 红,而不是静默投出一个「缺席」(缺席在 wire 上是一句话:「这条腿对这件事没有陈述」)。
871
889
  * · `instructions`([ref],7.111.0)—— 这条腿的 project-memory loader 选中的指令文件链成员 `{ selected: string[] }`;值来自腿的
872
890
  * `InstructionSelectionLeg.segment()`。`undefined` ⇒ 段缺席;`{ selected: [] }` ⇒ 显式空(走了链、没选中)。
873
- * · `skills`(7.137.0)—— 这条 run 交给引擎的技能名册(`{ name, description, source }[]`,与场景卡技能清单同一张形);值来自 spec 字段 `runSkillsOf(spec)`
874
- * (唯一铸点 = resolveSpec 出口的 `buildRunSkills`)。**run 级** ⇒ 只投根腿 / 续跑腿的帧,委派子代的帧(`parentToolCallId` 在场)不投(子代的技能由它自己的定义决定);
891
+ * · `skills`(7.137.0)—— 这条 run 交给引擎的技能名册(`{ name, description, source }[]`,与场景卡技能清单同一张形);值来自这条腿的部署事实 `LegFacts.skills`
892
+ * (`leg-facts.ts`;名册由 `buildRunSkills` 合并、resolveSpec 出口登记,漏斗在复制之前读出)。**run 级** ⇒ 只投根腿 / 续跑腿的帧,委派子代的帧(`parentToolCallId` 在场)不投(子代的技能由它自己的定义决定);
875
893
  * `[]` = 零技能(含 `disableSkills`);`undefined` ⇒ 段缺席(这条腿的 spec 不是本仓装配的)。`description` 过上 wire 的自由文本出口 {@link sanitizeWireText}。
876
894
  */
877
895
  export interface LegWiringSections {
@@ -1059,6 +1077,8 @@ export declare function compactedEventData(ev: {
1059
1077
  };
1060
1078
  /** [ref](core 7.53.0 [ref]):这次落地的压缩 pass 的 id —— 与它的 `compaction_started` 帧同一个值(引擎在每次落地上都设;型上可选)。逐字。 */
1061
1079
  pass?: string;
1080
+ /** core 7.61.0:扩展经 `$.session.compact` 提的手动请求落地的那一 pass —— 谁要的(同 {@link compactionOutcomeEventData} 那一位)。 */
1081
+ requestedBy?: unknown;
1062
1082
  }): FrameData<{
1063
1083
  attachedFiles?: Array<{
1064
1084
  path: SafeText;
@@ -317,6 +317,22 @@ export function parkEventData(result, reopened) {
317
317
  ...(reopened !== undefined ? { reopened } : {}),
318
318
  };
319
319
  }
320
+ export async function appendParkRow(append, usage, word, result, reopened) {
321
+ let drainFailed = false;
322
+ let drainFailure;
323
+ if (usage !== undefined) {
324
+ try {
325
+ await appendModelUsageDelta(append, usage.modelUsage, usage.taskId);
326
+ }
327
+ catch (e) {
328
+ drainFailed = true;
329
+ drainFailure = e;
330
+ }
331
+ }
332
+ await append(word, parkEventData(result, reopened));
333
+ if (drainFailed)
334
+ throw drainFailure;
335
+ }
320
336
  export function taskStartedEventData(ev) {
321
337
  return {
322
338
  taskId: ev.taskId,
@@ -418,9 +434,14 @@ export function compactionOutcomeEventData(ev) {
418
434
  ...(s(ev.trigger) !== undefined ? { trigger: s(ev.trigger) } : {}),
419
435
  ...(ev.reason !== undefined ? { reason: seatText("trace-frame-text", String(ev.reason)) } : {}),
420
436
  ...(s(ev.pass) !== undefined ? { pass: s(ev.pass) } : {}),
437
+ ...requestedByField(ev.requestedBy, "compaction_outcome"),
421
438
  ...identityFields(ev),
422
439
  };
423
440
  }
441
+ function requestedByField(v, where) {
442
+ const requester = extensionRequesterOf(v, where);
443
+ return requester !== undefined ? { requestedBy: requester } : {};
444
+ }
424
445
  export function compactionStartedEventData(ev) {
425
446
  const s = (v) => (typeof v === "string" ? v : undefined);
426
447
  return {
@@ -877,6 +898,7 @@ export function compactedEventData(ev) {
877
898
  ...(num(ev.durationMs) !== undefined ? { durationMs: num(ev.durationMs) } : {}),
878
899
  ...(phaseDurations !== undefined ? { phaseDurations } : {}),
879
900
  ...(typeof ev.pass === "string" ? { pass: ev.pass } : {}),
901
+ ...requestedByField(ev.requestedBy, "compacted"),
880
902
  };
881
903
  }
882
904
  export function contextUsageEventData(ev) {
@@ -36,6 +36,8 @@ export declare function armPoolBudgetForTest(): {
36
36
  ssh2ScanBytes: number;
37
37
  mappedUnits: number;
38
38
  readings: number;
39
+ coverageVisits: number;
40
+ rowVisits: number;
39
41
  };
40
42
  export declare function resetArmPoolBudgetForTest(): void;
41
43
  /**
@@ -54,11 +56,9 @@ export declare function resetArmPoolBudgetForTest(): void;
54
56
  * 闭集:加一个档而不在 {@link armPool} 的档表里处置 ⇒ **编译**红。
55
57
  */
56
58
  type RedactionScope = "free-text" | "bounded-unit";
57
- /** 测试座:{@link unitCountWithin} 的数组形(`table` 须是合法的已并表:升序、两两不交不相接)。 */
58
- export declare function unitCountWithinForTest(table: ReadonlyArray<readonly [number, number]>, from: number, to: number, max: number): boolean;
59
59
  /** 本模块会写进文本的全部替换 token(`«…»` 字面),从三张表现算 —— 表改这里自动跟,不另抄一份。
60
60
  * 🔴 **[ref] v2 修复轮起它只剩一个语义:闭形闭集的加载期校验**。运行期「这一段是不是一枚记号」已经由
61
- * {@link credentialSpans} 的闭**形**那一支一处答完({@link opaqueUnitEnd}),按闭**集**再认一遍的
61
+ * 记号行的闭**形**一处答完({@link tokenUnits} / {@link tokenEnd}),按闭**集**再认一遍的
62
62
  * `redactionTokenEndAt` 与它同义而更窄,已删 —— 两只「什么算记号」的判别器就是两个定义。 */
63
63
  /** {@link buildDisplaySafeUrl} 解析不动一个配置型 URL 时的**占位**([ref] 件B)——fail-closed:输出**不含原串的
64
64
  * 任何字节**(连 host 都不留),不许回落成原值。它不是任何一条臂的产物,所以要在这里**显式**进闭集
@@ -70,17 +70,22 @@ export { DISPLAY_SAFE_URL_TOKEN };
70
70
  /**
71
71
  * 🔴 **取证相的重扫模式(测试座,[ref])** —— 生产恒 `"incremental"`;`"full"` 是**参照语义** = 「没有可复用的上一次执行」:
72
72
  * 每级全部取证臂整段重跑、URL 臂每段重扫,既不读足迹也不回放(池把每一级的脏区间当作「未知」交下去,与级 0 同一个读法)。
73
- * 证据表的建法(级 0 记号档 + 逐级折入)与收敛判据(脏区间为空)两种模式是同一条,所以两种模式只差「复用与否」这一位 ——
74
- * 增量重扫的全部正确性主张只有一句:**任何输入上两种模式输出逐字相同**(`test/forensic-incremental-rescan.test.ts` 并跑比对;
75
- * 折入本身与整表重建的对拍是那个测试文件里的一份测试本地参照)。
73
+ * 证据表的建法(级 0 记号 + 逐级折入)与收敛判据(脏区间为空)两种模式是同一条,所以两种模式只差「复用与否」这一位 ——
74
+ * 增量重扫的全部正确性主张只有一句:**任何输入上两种模式输出逐字相同**(`test/forensic-incremental-rescan.test.ts` 并跑比对)。
76
75
  */
77
76
  export type ForensicRescanMode = "incremental" | "full";
78
77
  export declare function setForensicRescanModeForTest(mode: ForensicRescanMode): void;
79
- /** 测试座:折入函数的数组形(`prev` 须是合法的已并表:升序、两两不交不相接)。 */
80
- export declare function credentialSpansFoldForTest(prev: ReadonlyArray<readonly [number, number]>, add: ReadonlyArray<readonly [number, number]>): {
81
- next: Array<[number, number]>;
78
+ /** 测试座:折入函数的数组形(行 = `[起点, 终点, 族码, 锚位, 收尾位]`)。 */
79
+ export declare function evidenceRowsFoldForTest(prev: ReadonlyArray<readonly [number, number, number, number, number]>, add: ReadonlyArray<readonly [number, number, number, number, number]>): {
80
+ next: Array<[number, number, number, number, number]>;
82
81
  dirty: Array<[number, number]>;
83
82
  };
83
+ /** 测试座:{@link measureWithin} 的数组形(`table` 的每一项是一行 `[起点, 终点]` 或 `[起点, 终点, 键]`:不给键 ⇒ 键 = 起点;同一 (起点, 键) 至多一行;
84
+ * `self` 给出 ⇒ 读者 = 键为它的那些行,否则不排除任何读数)。 */
85
+ export declare function unitCountWithinForTest(table: ReadonlyArray<readonly [number, number] | readonly [number, number, number]>, from: number, to: number, max: number, self?: number): boolean;
86
+ /** 测试座:同一张表上依次问一串量问(`[from, to, max, self?]`;读法同 {@link unitCountWithinForTest})—— 终点有界的闭包链缓存在问与问之间共用,
87
+ * 生产里同一级、同一张表上各臂各读者的量问就是这样串起来的。 */
88
+ export declare function unitCountsWithinForTest(table: ReadonlyArray<readonly [number, number] | readonly [number, number, number]>, queries: ReadonlyArray<readonly [number, number, number, number | undefined]>): boolean[];
84
89
  /** 🧪 结构读数(与 {@link ppkScanBytesForTest} 同一条技法):本扫描器读过的单元数,线性钉用。 */
85
90
  export declare function anchoredScanUnitsForTest(): number;
86
91
  export declare function resetAnchoredScanUnitsForTest(): void;
@@ -226,6 +231,53 @@ export type RedactionSpan = {
226
231
  };
227
232
  export type { RedactionScope };
228
233
  export declare function proposeRedactionSpans(text: string, scope: RedactionScope, layout: RedactionLayout, extent: RedactionExtent): readonly RedactionSpan[];
234
+ /**
235
+ * 🔴 **未决尾的长度上界**(读法单元):一段还在长的文本,末尾这么多个读法单元里起头的候选,本脱敏器**还判不了**(判定要读到文本之外)。
236
+ * 它不是另立的常数,是候选池成员表的同一份读数 —— 每条臂的**判定距离**取最大({@link MemberIdentity.reach} 的意义见那里):正则臂从正则源读出
237
+ * (前缀 + 前瞻判据 + 值 run 的最少重复;熵谓词 {@link ENTROPY_SCAN_MAX} 两窗由此进来),手写扫描器陈述它起头要读全的字面锚。
238
+ * 判定在**无界**远处的结构(没收尾的 JSON 串值 / URL userinfo / 栅栏 / 带引号的值、起头不设长度上界的栅栏行 / 版本头 / 关键字分隔段)不靠它:
239
+ * head 读法把它们读成未决尾、从起点遮到文本末尾({@link RedactionExtent}),流式口在它的起点前停下,直到它判定或冲刷。
240
+ * 加一条判定距离更远的臂,这个数随之变大(钉 `test/live-model-text-hold-law.test.ts` 读每条成员的读数与最大值)。
241
+ */
242
+ export declare const PENDING_TAIL_UNITS: number;
243
+ /** 测试可见:正则臂判定距离的读法本身(读得出的几形与加载期抛的几形)。 */
244
+ export declare function regexDecisionReachForTest(re: RegExp, lexical: boolean): number;
245
+ /** 测试可见:候选池每条成员的判定距离(成员的替换串、池序、读数)。 */
246
+ export declare function pendingTailReachForTest(): ReadonlyArray<{
247
+ readonly token: string;
248
+ readonly order: number;
249
+ readonly reach: number;
250
+ }>;
251
+ /**
252
+ * 🔴 **流式口 —— 同一只脱敏器的三口**(live 面逐块到达的模型文本 `text_delta` / `reasoning_delta` 的唯一放行器;登记册在 `trace/model-segment.ts`)。
253
+ * 同一只 {@link runRedaction}、同一张表,只多一件事:知道文本还在长。
254
+ * · **喂入**({@link RedactionStream.feed}):原文追加进本段;
255
+ * · **取已判定前缀**({@link RedactionStream.takeSettled}):从上次取到的位置起,已判定的那一截的脱敏读法 —— head 读法,出门区终点 = 末尾 {@link PENDING_TAIL_UNITS}
256
+ * 个读法单元之前;切点再退到横跨它的那一条跨度的起点(一枚可能还在长、或判定在更远处的凭据整条不出)与码点边界。按重扫节律({@link streamRescanStep})才真扫;
257
+ * · **收尾冲刷**({@link RedactionStream.flush}):整段读法交出其余字节,并核对已取出的字节在整段读法下是不是同一份。
258
+ * 律:各次取出依次拼接 + 冲刷 = 整段读法(`redactSecrets(全段)`)逐字节 —— 只喂一次再冲刷就是整段口本身。前提是 {@link PENDING_TAIL_UNITS} 读对了每条臂的判定距离;
259
+ * 读错的那一形在冲刷时现形(`diverged`),调用方响亮留痕。
260
+ * 延迟上界:一个字节在它之后又到 {@link PENDING_TAIL_UNITS} 个读法单元之后的下一次重扫时交出;盖住它的跨度判定之前(或冲刷之前)不交出。
261
+ * 不喂观察者(`observe:false`,与影子重扫同口):命中只在段末那一次整段脱敏里计(段末帧的铸点),逐块重扫不重复计数。扫描器抛 ⇒ 原样抛(放行位不动)。
262
+ */
263
+ export interface RedactionStream {
264
+ /** 喂入下一块原文。 */
265
+ feed(chunk: string): void;
266
+ /** 取已判定前缀(可为 `""`)。 */
267
+ takeSettled(): string;
268
+ /** 收尾冲刷:其余字节的整段读法 + 已取出的字节与整段读法对不对得上。冲刷之后本流不再用。 */
269
+ flush(): {
270
+ readonly rest: string;
271
+ readonly diverged: boolean;
272
+ };
273
+ /** 跳过:已喂入的字节不再交出(没有收件人;tail 面没人在听时),之后的判定仍按整段上下文。 */
274
+ skip(): void;
275
+ /** 已喂入的整段原文。 */
276
+ readonly fed: string;
277
+ }
278
+ export declare function createRedactionStream(): RedactionStream;
279
+ /** 测试可见:同一只流式口,未决尾按调用方给的数(比 {@link PENDING_TAIL_UNITS} 小 ⇒ 律被打破的那一形,冲刷时 `diverged` 现形 —— 响亮臂的触发器;生产调用方只有上面那一只)。 */
280
+ export declare function createRedactionStreamWithTailForTest(units: number): RedactionStream;
229
281
  /**
230
282
  * 🔴 环 + 深度预算(2026-07-25 补)。原实现是纯递归、**既不记已访问节点也不限深度**,而它的调用位置是
231
283
  * **最不可信的边界**:`toolStart`/`toolEnd` 把工具的 `args`/`output`/`structured` 直接喂进来。后果两条: