@sema-agent/server 7.142.0 → 7.144.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 (301) hide show
  1. package/MIGRATION.md +608 -0
  2. package/USAGE.md +63 -36
  3. package/dist/adoption/plan.js +22 -0
  4. package/dist/approval-ask-audit-store.d.ts +7 -5
  5. package/dist/approval-ask-audit-store.js +12 -6
  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 +155 -39
  9. package/dist/approval-card.js +111 -31
  10. package/dist/approval-queue-kind.d.ts +27 -0
  11. package/dist/approval-queue-kind.js +6 -0
  12. package/dist/approval-reconciler.d.ts +8 -8
  13. package/dist/approval-reconciler.js +3 -3
  14. package/dist/audit.js +4 -2
  15. package/dist/boot/budget-tracing.d.ts +1 -1
  16. package/dist/boot/execution-env.js +1 -1
  17. package/dist/boot/governance-seams.d.ts +26 -41
  18. package/dist/boot/governance-seams.js +61 -28
  19. package/dist/boot/late-binds.d.ts +7 -4
  20. package/dist/boot/late-binds.js +3 -1
  21. package/dist/boot/leader.js +2 -4
  22. package/dist/boot/memory-consolidation.d.ts +0 -8
  23. package/dist/boot/memory-consolidation.js +3 -3
  24. package/dist/boot/reapers.js +5 -4
  25. package/dist/boot/resolve-spec.d.ts +1 -1
  26. package/dist/boot/resolve-spec.js +8 -8
  27. package/dist/boot/runner-deps.d.ts +14 -6
  28. package/dist/boot/runner-deps.js +6 -17
  29. package/dist/boot/shutdown.d.ts +9 -0
  30. package/dist/boot/shutdown.js +18 -2
  31. package/dist/boot/stage-01-config.js +2 -0
  32. package/dist/boot/stage-02-web-admin-pull.js +3 -0
  33. package/dist/boot/stage-03-store-backend.d.ts +4 -1
  34. package/dist/boot/stage-03-store-backend.js +1 -2
  35. package/dist/boot/stage-04-stores.d.ts +5 -2
  36. package/dist/boot/stage-04-stores.js +3 -5
  37. package/dist/boot/stage-05-execution-env.d.ts +5 -2
  38. package/dist/boot/stage-06-runners.d.ts +5 -2
  39. package/dist/boot/stage-06-runners.js +1 -3
  40. package/dist/boot/stage-07-capability-layer.d.ts +5 -2
  41. package/dist/boot/stage-07-capability-layer.js +6 -2
  42. package/dist/boot/stage-08-reapers.d.ts +5 -2
  43. package/dist/boot/stage-09-leader.d.ts +5 -2
  44. package/dist/boot/stage-10-http-server.d.ts +5 -2
  45. package/dist/boot/stage-10-http-server.js +4 -1
  46. package/dist/boot/stores.d.ts +5 -2
  47. package/dist/boot/stores.js +7 -7
  48. package/dist/boot/web-admin.d.ts +5 -1
  49. package/dist/boot/web-admin.js +31 -19
  50. package/dist/capabilities/hands-lane.d.ts +9 -39
  51. package/dist/capabilities/hands-lane.js +8 -13
  52. package/dist/capabilities/mcp-probe.d.ts +3 -2
  53. package/dist/capabilities/scenarios.d.ts +23 -17
  54. package/dist/capabilities/scenarios.js +2 -2
  55. package/dist/capabilities/skills.d.ts +1 -17
  56. package/dist/capabilities/skills.js +0 -8
  57. package/dist/capability-facts.d.ts +8 -8
  58. package/dist/capability-facts.js +4 -4
  59. package/dist/card-void.d.ts +6 -9
  60. package/dist/config-catalog.js +1 -1
  61. package/dist/config-d-migration.d.ts +2 -0
  62. package/dist/config-dir-trust.js +58 -29
  63. package/dist/config-invariants.d.ts +7 -1
  64. package/dist/config-invariants.js +7 -0
  65. package/dist/config-provider.d.ts +10 -0
  66. package/dist/config-provider.js +15 -4
  67. package/dist/config-root-migration.d.ts +13 -0
  68. package/dist/config-root-migration.js +99 -0
  69. package/dist/config-types.d.ts +5 -5
  70. package/dist/config.d.ts +4 -3
  71. package/dist/config.js +1 -1
  72. package/dist/delegated-session-owner.d.ts +35 -151
  73. package/dist/delegated-session-owner.js +1 -83
  74. package/dist/device-ws-protocol.d.ts +1 -0
  75. package/dist/device-ws-protocol.js +2 -1
  76. package/dist/entry-mode-clamp-notice.d.ts +1 -1
  77. package/dist/env-model-table-gate.d.ts +53 -0
  78. package/dist/env-model-table-gate.js +53 -0
  79. package/dist/execution-placement.d.ts +7 -4
  80. package/dist/fleet/fleet-bus.d.ts +28 -52
  81. package/dist/fleet/fleet-bus.js +35 -100
  82. package/dist/fleet/fleet-reconciler.d.ts +4 -4
  83. package/dist/fleet/fleet-reconciler.js +1 -1
  84. package/dist/fleet/subagent-tail-bus.d.ts +14 -11
  85. package/dist/fleet/subagent-tail-bus.js +15 -28
  86. package/dist/hooks/classic-stations.d.ts +3 -1
  87. package/dist/hooks/classic-stations.js +2 -0
  88. package/dist/hooks/hook-runner.js +28 -7
  89. package/dist/host-decision.d.ts +54 -20
  90. package/dist/host-decision.js +42 -14
  91. package/dist/http/admission.d.ts +1 -1
  92. package/dist/http/admission.js +7 -3
  93. package/dist/http/approval-sweeps.js +11 -8
  94. package/dist/http/caller-trust.d.ts +1 -1
  95. package/dist/http/durable-run-leg.js +2 -2
  96. package/dist/http/engine-refusal.d.ts +16 -0
  97. package/dist/http/engine-refusal.js +17 -0
  98. package/dist/http/memory-compliance-failure-reply.d.ts +1 -3
  99. package/dist/http/memory-compliance-failure-reply.js +4 -6
  100. package/dist/http/owner-access.d.ts +11 -0
  101. package/dist/http/owner-access.js +13 -0
  102. package/dist/http/principal-gate.d.ts +1 -1
  103. package/dist/http/refusal-body.d.ts +7 -3
  104. package/dist/http/refusal-body.js +1 -0
  105. package/dist/http/resume-legs.d.ts +21 -7
  106. package/dist/http/resume-legs.js +82 -53
  107. package/dist/http/resume-restatement.d.ts +39 -0
  108. package/dist/http/resume-restatement.js +25 -0
  109. package/dist/http/route-ctx.d.ts +35 -10
  110. package/dist/http/route-ctx.js +1 -1
  111. package/dist/http/routes/approvals-assistant.d.ts +9 -1
  112. package/dist/http/routes/approvals-assistant.js +143 -31
  113. package/dist/http/routes/capabilities.js +11 -2
  114. package/dist/http/routes/memory-policy.d.ts +2 -2
  115. package/dist/http/routes/memory-policy.js +1 -1
  116. package/dist/http/routes/notify-wake.js +23 -25
  117. package/dist/http/routes/rules.js +48 -13
  118. package/dist/http/routes/runs.js +9 -8
  119. package/dist/http/routes/session-memory-sync.d.ts +34 -6
  120. package/dist/http/routes/session-memory-sync.js +27 -10
  121. package/dist/http/routes/session-sync.js +13 -20
  122. package/dist/http/routes/sessions.d.ts +2 -2
  123. package/dist/http/routes/sessions.js +22 -23
  124. package/dist/http/routes/tasks.js +27 -49
  125. package/dist/http/server.d.ts +13 -7
  126. package/dist/http/server.js +2 -2
  127. package/dist/http/stored-body-replay.js +15 -4
  128. package/dist/http/wire-types.d.ts +17 -7
  129. package/dist/index.d.ts +1 -0
  130. package/dist/index.js +1 -0
  131. package/dist/lane-home-probe.d.ts +15 -0
  132. package/dist/lane-home-probe.js +4 -0
  133. package/dist/leader/leader.js +5 -2
  134. package/dist/leader/wire.d.ts +7 -1
  135. package/dist/leader/wire.js +6 -5
  136. package/dist/leg-facts.d.ts +37 -0
  137. package/dist/leg-facts.js +15 -0
  138. package/dist/memory-bundle-engine.d.ts +1 -4
  139. package/dist/memory-bundle-engine.js +2 -2
  140. package/dist/memory-operator-faces.d.ts +30 -66
  141. package/dist/memory-operator-faces.js +17 -88
  142. package/dist/memory-scope-stores.d.ts +38 -40
  143. package/dist/memory-scope-stores.js +51 -36
  144. package/dist/memory-scope.d.ts +0 -9
  145. package/dist/memory-scope.js +0 -9
  146. package/dist/memory-sync-client.js +14 -3
  147. package/dist/memory-sync.d.ts +20 -4
  148. package/dist/memory-sync.js +23 -4
  149. package/dist/model-plane-face.d.ts +13 -7
  150. package/dist/model-plane-face.js +2 -1
  151. package/dist/observability/corrupt-read-seat.d.ts +5 -9
  152. package/dist/observability/corrupt-read-seat.js +1 -2
  153. package/dist/observability/fail-open.d.ts +30 -10
  154. package/dist/observability/fail-open.js +27 -10
  155. package/dist/observability/run-terminal.d.ts +1 -1
  156. package/dist/observability/run-terminal.js +6 -2
  157. package/dist/orchestration/workflow-completion-inbox.d.ts +5 -19
  158. package/dist/orchestration/workflow-completion-inbox.js +0 -12
  159. package/dist/orchestration/workflow-notify-journal.d.ts +3 -2
  160. package/dist/orchestration/workflow-park-decision.d.ts +8 -3
  161. package/dist/orchestration/workflow-park-decision.js +5 -3
  162. package/dist/org-delivery-gate.d.ts +11 -0
  163. package/dist/org-delivery-gate.js +19 -1
  164. package/dist/parked-decide.d.ts +13 -9
  165. package/dist/parked-decide.js +7 -7
  166. package/dist/parked-revive-surface.d.ts +6 -7
  167. package/dist/parked-revive-surface.js +1 -1
  168. package/dist/peer-inbound-face.d.ts +122 -0
  169. package/dist/peer-inbound-face.js +123 -0
  170. package/dist/permission-rule-list.d.ts +13 -9
  171. package/dist/permission-rule-list.js +7 -3
  172. package/dist/plugins/approval-ask-store-file.js +18 -6
  173. package/dist/plugins/approval-ask-store-memory.js +8 -6
  174. package/dist/plugins/approval-ask-store-sql.d.ts +28 -13
  175. package/dist/plugins/approval-ask-store-sql.js +30 -11
  176. package/dist/plugins/caching-session-store.d.ts +0 -3
  177. package/dist/plugins/caching-session-store.js +0 -3
  178. package/dist/plugins/checkpoint-store-sql.d.ts +45 -38
  179. package/dist/plugins/checkpoint-store-sql.js +108 -45
  180. package/dist/plugins/file-history-store-sql.d.ts +24 -18
  181. package/dist/plugins/file-history-store-sql.js +24 -19
  182. package/dist/plugins/file-run-store.d.ts +29 -0
  183. package/dist/plugins/file-run-store.js +97 -8
  184. package/dist/plugins/fork-routing-session-store.d.ts +8 -1
  185. package/dist/plugins/fork-routing-session-store.js +6 -0
  186. package/dist/plugins/imported-layer-root-retirement.d.ts +82 -0
  187. package/dist/plugins/imported-layer-root-retirement.js +96 -0
  188. package/dist/plugins/local-checkpoint-store.d.ts +6 -8
  189. package/dist/plugins/local-checkpoint-store.js +5 -4
  190. package/dist/plugins/local-session-store.d.ts +69 -30
  191. package/dist/plugins/local-session-store.js +133 -57
  192. package/dist/plugins/local-session-window.d.ts +4 -2
  193. package/dist/plugins/mailbox-recipient-lifecycle.d.ts +9 -31
  194. package/dist/plugins/mailbox-recipient-lifecycle.js +4 -0
  195. package/dist/plugins/mailbox-store-sql.d.ts +12 -8
  196. package/dist/plugins/mailbox-store-sql.js +76 -7
  197. package/dist/plugins/memory-sync-store-pg.d.ts +15 -0
  198. package/dist/plugins/memory-sync-store-pg.js +21 -0
  199. package/dist/plugins/memory-sync-store-tidb.d.ts +2 -0
  200. package/dist/plugins/memory-sync-store-tidb.js +13 -1
  201. package/dist/plugins/one-time-migrations.d.ts +44 -14
  202. package/dist/plugins/one-time-migrations.js +118 -15
  203. package/dist/plugins/org-delivery-quota-store.d.ts +1 -1
  204. package/dist/plugins/org-delivery-quota-store.js +2 -12
  205. package/dist/plugins/park-commit-watch.d.ts +1 -1
  206. package/dist/plugins/permission-rule-store-file.d.ts +10 -1
  207. package/dist/plugins/permission-rule-store-file.js +15 -2
  208. package/dist/plugins/permission-rule-store-sql.d.ts +31 -1
  209. package/dist/plugins/permission-rule-store-sql.js +35 -2
  210. package/dist/plugins/pg-session-storage.d.ts +1 -9
  211. package/dist/plugins/pg-session-storage.js +2 -19
  212. package/dist/plugins/remote-env-device.d.ts +8 -11
  213. package/dist/plugins/remote-env-device.js +6 -3
  214. package/dist/plugins/remote-env-host.d.ts +8 -4
  215. package/dist/plugins/remote-env-host.js +7 -9
  216. package/dist/plugins/remote-env-k8s.d.ts +37 -24
  217. package/dist/plugins/remote-env-k8s.js +50 -17
  218. package/dist/plugins/remote-shell.js +12 -2
  219. package/dist/plugins/retention-store-sql.d.ts +2 -2
  220. package/dist/plugins/sandbox-read-floor.d.ts +5 -7
  221. package/dist/plugins/sandbox-read-floor.js +2 -7
  222. package/dist/plugins/schema-consistency.d.ts +5 -1
  223. package/dist/plugins/session-fork.d.ts +1 -1
  224. package/dist/plugins/session-ownership.d.ts +9 -0
  225. package/dist/plugins/session-ownership.js +6 -0
  226. package/dist/plugins/session-store.d.ts +13 -16
  227. package/dist/plugins/session-store.js +9 -10
  228. package/dist/plugins/sql-errors.d.ts +10 -1
  229. package/dist/plugins/sql-errors.js +13 -0
  230. package/dist/plugins/sql-json-column.d.ts +24 -2
  231. package/dist/plugins/sql-json-column.js +38 -3
  232. package/dist/plugins/store-backend.d.ts +23 -28
  233. package/dist/plugins/store-backend.js +12 -3
  234. package/dist/plugins/store-contracts.d.ts +29 -5
  235. package/dist/plugins/store-contracts.js +4 -1
  236. package/dist/plugins/task-attachment-store.d.ts +2 -2
  237. package/dist/plugins/task-attachment-store.js +37 -52
  238. package/dist/plugins/tidb-session-store.d.ts +2 -14
  239. package/dist/plugins/tidb-session-store.js +2 -20
  240. package/dist/plugins/tool-result-store-sql.d.ts +9 -8
  241. package/dist/plugins/tool-result-store-sql.js +23 -2
  242. package/dist/plugins/wiring-section-codec.d.ts +32 -0
  243. package/dist/plugins/wiring-section-codec.js +55 -0
  244. package/dist/plugins/workspace-fill.d.ts +1 -1
  245. package/dist/rule-entry-list.d.ts +3 -2
  246. package/dist/rule-entry-list.js +5 -1
  247. package/dist/rules-consent.d.ts +28 -5
  248. package/dist/rules-consent.js +40 -28
  249. package/dist/run-local.js +11 -6
  250. package/dist/runs.d.ts +12 -8
  251. package/dist/runs.js +10 -7
  252. package/dist/runtime-governance.d.ts +1 -1
  253. package/dist/security.d.ts +0 -4
  254. package/dist/server-secret-env.d.ts +4 -0
  255. package/dist/session-error-wire.d.ts +34 -23
  256. package/dist/session-error-wire.js +8 -3
  257. package/dist/session-incarnation.d.ts +3 -3
  258. package/dist/session-notify-door.d.ts +106 -0
  259. package/dist/session-notify-door.js +97 -0
  260. package/dist/session-sync.d.ts +9 -14
  261. package/dist/session-sync.js +5 -5
  262. package/dist/session-workspace.d.ts +3 -13
  263. package/dist/session-workspace.js +0 -9
  264. package/dist/standing-answer-grant.d.ts +5 -0
  265. package/dist/standing-answer-grant.js +10 -0
  266. package/dist/stores-sql/session-policy-store-sql.d.ts +4 -2
  267. package/dist/stores-sql/session-policy-store-sql.js +3 -13
  268. package/dist/task-mcp.d.ts +1 -1
  269. package/dist/task-settings.d.ts +11 -8
  270. package/dist/task-settings.js +31 -11
  271. package/dist/tool-approval.d.ts +55 -35
  272. package/dist/tool-approval.js +112 -74
  273. package/dist/trace/core-keyset-guard.d.ts +12 -9
  274. package/dist/trace/engine-notice-wire.d.ts +1 -1
  275. package/dist/trace/engine-notice-wire.js +4 -2
  276. package/dist/trace/exit-seat.d.ts +7 -1
  277. package/dist/trace/exit-seat.js +1 -0
  278. package/dist/trace/ledger-sink.d.ts +2 -2
  279. package/dist/trace/ledger-sink.js +12 -4
  280. package/dist/trace/model-segment.d.ts +74 -25
  281. package/dist/trace/model-segment.js +141 -32
  282. package/dist/trace/project.d.ts +15 -6
  283. package/dist/trace/project.js +12 -4
  284. package/dist/trace/redact.d.ts +72 -9
  285. package/dist/trace/redact.js +1509 -471
  286. package/dist/trace/self-minted-wire.d.ts +598 -47
  287. package/dist/trace/self-minted-wire.js +190 -20
  288. package/dist/trace/wire-projection-faces.d.ts +1 -1
  289. package/dist/trace/wire-projection-faces.js +1 -1
  290. package/dist/verifier-pause-card.d.ts +33 -5
  291. package/dist/verifier-pause-card.js +15 -10
  292. package/dist/web-admin-client/apply-effective.d.ts +12 -16
  293. package/dist/web-admin-client/apply-effective.js +90 -10
  294. package/dist/workspace-space.d.ts +19 -3
  295. package/dist/workspace-space.js +8 -4
  296. package/docs/DEVICE-EXECUTOR-PROTOCOL.md +3 -1
  297. package/package.json +3 -2
  298. package/wire-changes/server@7.143.0.json +1167 -0
  299. package/wire-changes/server@7.144.0.json +291 -0
  300. package/dist/session-records-skipped-notice.d.ts +0 -21
  301. package/dist/session-records-skipped-notice.js +0 -27
@@ -1,5 +1,5 @@
1
1
  import { readApprovalCard } from "./approval-content-kind.js";
2
- import { heldAskOf, liveSettledBy, readDecidedBy, retiredDecisionKeyFacts, DECIDED_BY_OUTSIDE_CLOSED_SET, POLICY_CANNOT_ALLOW_PERSON_ASK } from "./host-decision.js";
2
+ import { heldAskOf, liveHostSource, readDecider, retiredDecisionKeyFacts, POLICY_CANNOT_ALLOW_PERSON_ASK } from "./host-decision.js";
3
3
  import { AsyncLocalStorage } from "node:async_hooks";
4
4
  import { uuidv7, classifyAsk, foldArbitrationRow, policyCannotAnswer, screenAskClassMembers, MAX_RULE_TEXT_CHARS, READ_ROOT_CANDIDATE_DIR_MAX, parseRuleText, pathConfinableWriteToolNames } from "@sema-agent/core";
5
5
  import { precheckCardRuleText } from "./rules-consent.js";
@@ -12,14 +12,14 @@ import { createLogger } from "./observability/logger.js";
12
12
  import { errorKindOf } from "./observability/err-text.js";
13
13
  import { recordFailOpen } from "./observability/fail-open.js";
14
14
  import { ownerOfCheckpointScope } from "./security.js";
15
- import { deriveAskId, deriveAskScopedBatchId, deriveBatchId, MAX_DECISION_NOTE_CHARS, noteLandedOnRow, noteRecordedReceipt } from "./approval-ask-machine.js";
16
- import { currentParkArm, MAX_RULE_OFFERS, buildApprovalCard, buildApprovalCardEnvelope, buildApprovalRequestFrame, buildReplayFrame, buildRevokeFrame, readDenialLimitFallback, readProbeCause, readProbeReason, readReadRootCandidate, readStoredCardEnvelope, readRuleEvidence, readAllowRuleShadowed, readRuleOffersAbsence, readRuleOffersAbsenceSeat, readParkRowTrueSeat, readAskClassPair, readClosedWordSeat, buildApprovalCompleteFrame, readRuleOfferList, } from "./approval-card.js";
15
+ import { deriveAskId, deriveAskScopedBatchId, deriveBatchId, MAX_DECISION_NOTE_CHARS, noteLandedOnRow, noteRecordedReceipt, readBoundInputHash } from "./approval-ask-machine.js";
16
+ import { askDemandsAPerson, storedPersonDemandRecord, currentParkArm, MAX_RULE_OFFERS, buildApprovalCard, buildApprovalCardEnvelope, adoptStoredLiveFacts, buildApprovalRequestFrame, buildReplayFrame, buildRevokeFrame, readDenialLimitFallback, readProbeCause, readProbeReason, readReadRootCandidate, readStoredCardEnvelope, readRuleEvidence, readAllowRuleShadowed, readRuleOffersAbsence, readRuleOffersAbsenceSeat, readParkRowTrueSeat, readAskClassPair, readAskReasons, readClosedWordSeat, buildApprovalCompleteFrame, readRuleOfferList, } from "./approval-card.js";
17
17
  import { askOwnerAdmits, askRowCarriesOwner, POLICY_REFUSAL_DECISION, projectAskTerminalClaimTruth } from "./plugins/approval-ask-store-sql.js";
18
18
  import { APPROVAL_ENDING_CAUSES, SETTLE_OUTCOME, askRowEndingCause, askRowParkTrigger } from "./approval-deny-reasons.js";
19
19
  import { settleByPolicy } from "./approval-policy-settlement.js";
20
20
  import { governanceAskMarksFor, runWithGovernanceAskScope } from "./governance-ask-marks.js";
21
21
  import { governanceOriginOf } from "./runtime-governance.js";
22
- import { grantBindingOf } from "./standing-answer-grant.js";
22
+ import { agreedGrantBinding, grantBindingOf } from "./standing-answer-grant.js";
23
23
  import { operatorAsk } from "./operator-ask.js";
24
24
  import { APPROVAL_EXEMPTED_EVENT } from "./plugins/approval-exemption-store.js";
25
25
  import { refusalBody } from "./http/refusal-body.js";
@@ -47,7 +47,7 @@ export function approvalDecidePath(sessionId) {
47
47
  return `/v1/approvals/${encodeURIComponent(sessionId)}/decide`;
48
48
  }
49
49
  function parkSessionOf(row) {
50
- return row.sourceTaskId === row.sessionId && row.sessionId !== row.taskId ? row.sessionId : undefined;
50
+ return row.sourceSessionId === row.sessionId && row.sessionId !== row.taskId ? row.sessionId : undefined;
51
51
  }
52
52
  function ruleMaterialCarriesCredentialShape(command) {
53
53
  return redactSecretsWithArms(command, { observe: false }).arms.has("full");
@@ -119,7 +119,7 @@ function askStandingAnswerFacts(req, governanceForced, deploymentListAsks) {
119
119
  const deploymentListQuestion = carriesDeploymentListQuestion(deploymentListAsks, classes);
120
120
  return {
121
121
  governanceForced,
122
- requiresRealApproval: req.requiresRealApproval === true,
122
+ requiresRealApproval: askDemandsAPerson(req, undefined),
123
123
  mandated: req.mandated === true,
124
124
  grantBinding: grantBindingOf(req),
125
125
  classes,
@@ -136,7 +136,7 @@ export function carriesDeploymentListQuestion(deploymentListAsks, classes) {
136
136
  export function policyAskStandingAnswerFacts(req, ask, deploymentListQuestion) {
137
137
  return {
138
138
  governanceForced: false,
139
- requiresRealApproval: ask.requiresRealApproval === true,
139
+ requiresRealApproval: askDemandsAPerson(ask, undefined),
140
140
  mandated: ask.mandated === true,
141
141
  grantBinding: grantBindingOf(req),
142
142
  classes: [...classifyAsk(ask, noGateFacts({ toolCallId: req.toolCallId, toolName: req.toolName })).classes],
@@ -190,6 +190,29 @@ function pendingEntryStandingAnswerFacts(entry) {
190
190
  deploymentListQuestion: entry.deploymentListQuestion === true,
191
191
  };
192
192
  }
193
+ function projectDecisionFacts(facts, frame, card) {
194
+ const rememberRefused = standingAnswerHome(facts) === "none";
195
+ if (frame !== undefined) {
196
+ if (facts.requiresRealApproval)
197
+ frame.requiresRealApproval = true;
198
+ else
199
+ delete frame.requiresRealApproval;
200
+ if (rememberRefused)
201
+ frame.rememberRefused = true;
202
+ else
203
+ delete frame.rememberRefused;
204
+ }
205
+ if (card === undefined)
206
+ return undefined;
207
+ let out = card;
208
+ if (out.risk.requiresRealApproval !== facts.requiresRealApproval)
209
+ out = { ...out, risk: { ...out.risk, requiresRealApproval: facts.requiresRealApproval } };
210
+ if ((out.rememberRefused === true) !== rememberRefused) {
211
+ const { rememberRefused: _stale, ...rest } = out;
212
+ out = rememberRefused ? { ...rest, rememberRefused: true } : rest;
213
+ }
214
+ return out;
215
+ }
193
216
  function mandatedFromSeat(seat) {
194
217
  switch (seat.state) {
195
218
  case "word":
@@ -223,10 +246,11 @@ function livePendingRowOf(e) {
223
246
  ...(e.sessionId !== undefined ? { sessionId: e.sessionId } : {}),
224
247
  ...(e.requiresRealApproval ? { requiresRealApproval: true } : {}),
225
248
  ...(e.governanceForced ? { governanceForced: true } : {}),
226
- ...(e.mandated ? { mandated: true } : {}),
249
+ ...(listFrame.mandated === true ? { mandated: true } : {}),
227
250
  ...(standingAnswerHome(pendingEntryStandingAnswerFacts(e)) === "none" ? { rememberRefused: true } : {}),
228
- ...(e.mandate !== undefined ? { mandate: e.mandate } : {}),
229
- ...(e.origin !== undefined ? { origin: e.origin } : {}),
251
+ ...(listFrame.mandate !== undefined ? { mandate: listFrame.mandate } : {}),
252
+ ...(listFrame.origin !== undefined ? { origin: listFrame.origin } : {}),
253
+ ...(listFrame.type === "approval_request" && listFrame.liveFactsUnknown === true ? { liveFactsUnknown: true } : {}),
230
254
  ...(e.originTaskId !== undefined ? { fromSubagent: true, originTaskId: e.originTaskId } : {}),
231
255
  ...(approvalCard !== undefined ? { approvalCard } : {}),
232
256
  frame: listFrame,
@@ -294,17 +318,17 @@ function parseToolApprovalFields(body, retired) {
294
318
  }
295
319
  if (retired !== undefined)
296
320
  return { ok: false, error: retired.error };
297
- const decidedByReading = readDecidedBy(body.decidedBy, false);
298
- let decidedBy;
299
- switch (decidedByReading.kind) {
321
+ const deciderReading = readDecider(body, false);
322
+ let decider;
323
+ switch (deciderReading.kind) {
300
324
  case "outside_closed_set":
301
- return { ok: false, error: DECIDED_BY_OUTSIDE_CLOSED_SET };
325
+ return { ok: false, error: deciderReading.message };
302
326
  case "accepted":
303
- decidedBy = decidedByReading.decidedBy;
327
+ decider = deciderReading.decider;
304
328
  break;
305
329
  default: {
306
- const unreachable = decidedByReading;
307
- throw new Error(`unhandled decidedBy reading: ${JSON.stringify(unreachable)}`);
330
+ const unreachable = deciderReading;
331
+ throw new Error(`unhandled decider reading: ${JSON.stringify(unreachable)}`);
308
332
  }
309
333
  }
310
334
  const rawGrant = body.readRootGrant;
@@ -319,7 +343,7 @@ function parseToolApprovalFields(body, retired) {
319
343
  ...(d !== "deny" && u !== undefined ? { updatedInput: u } : {}),
320
344
  ...(persistRule !== undefined ? { persistRule } : {}),
321
345
  ...(note !== undefined ? { note } : {}),
322
- decidedBy,
346
+ decider,
323
347
  ...(readRootGrant !== undefined ? { readRootGrant } : {}),
324
348
  };
325
349
  }
@@ -357,12 +381,6 @@ function boundArgs(args) {
357
381
  }
358
382
  return { args: redacted, omitted: false, hasBidi };
359
383
  }
360
- function readBoundInputHash(req) {
361
- if (req === null || typeof req !== "object")
362
- return null;
363
- const v = Reflect.get(req, "boundInputHash");
364
- return typeof v === "string" && v.length > 0 ? v : null;
365
- }
366
384
  export function resolveStreamApprovalGate(input) {
367
385
  if (!input.toolApprovalEnabled)
368
386
  return { active: false, reason: "no_tool_approval" };
@@ -492,7 +510,7 @@ function replayTerminalAskRow(row) {
492
510
  }
493
511
  export function outcomeOfDecidedRow(row) {
494
512
  const allow = row.decision === "approve";
495
- const source = row.settledBy !== null ? { settledBy: row.settledBy } : {};
513
+ const source = row.settledBy !== null ? { settledBy: row.settledBy, ...(row.decidedVia !== null ? { decidedVia: row.decidedVia } : {}) } : {};
496
514
  const edit = allow && row.updatedInput !== undefined ? { updatedInput: row.updatedInput } : {};
497
515
  return row.settledBy === null && !("updatedInput" in edit) ? allow : { allow, ...edit, ...source };
498
516
  }
@@ -502,7 +520,7 @@ function settleArgsOfDecided(outcome) {
502
520
  return {
503
521
  allowed: outcome.allow,
504
522
  ...(outcome.updatedInput !== undefined ? { updatedInput: outcome.updatedInput } : {}),
505
- ...(outcome.settledBy !== undefined ? { settledBy: outcome.settledBy } : {}),
523
+ ...(outcome.settledBy !== undefined ? { source: { settledBy: outcome.settledBy, ...(outcome.decidedVia !== undefined ? { decidedVia: outcome.decidedVia } : {}) } } : {}),
506
524
  };
507
525
  }
508
526
  function verdictOfDecided(args) {
@@ -510,7 +528,7 @@ function verdictOfDecided(args) {
510
528
  by: "human",
511
529
  allowed: args.allowed,
512
530
  ...(args.updatedInput !== undefined ? { updatedInput: args.updatedInput } : {}),
513
- ...(args.settledBy !== undefined ? { hostSettledBy: args.settledBy } : {}),
531
+ ...(args.source !== undefined ? { hostSource: args.source } : {}),
514
532
  };
515
533
  }
516
534
  function settleArgsOf(outcome) {
@@ -633,8 +651,8 @@ export class ToolApprovalCoordinator {
633
651
  get unattendedRoutesToPark() {
634
652
  return this.unattendedPolicy !== "deny";
635
653
  }
636
- batchIdFor(askId, sourceTaskId, runId, legKey) {
637
- return this.unattendedRoutesToPark ? deriveBatchId(sourceTaskId, runId, legKey) : deriveAskScopedBatchId(askId);
654
+ batchIdFor(askId, sourceSessionId, runId, legKey) {
655
+ return this.unattendedRoutesToPark ? deriveBatchId(sourceSessionId, runId, legKey) : deriveAskScopedBatchId(askId);
638
656
  }
639
657
  unattendedAskOutcome(site) {
640
658
  const facts = {
@@ -1024,7 +1042,7 @@ export class ToolApprovalCoordinator {
1024
1042
  async sessionGrantUncontestedByRow(origin, req) {
1025
1043
  if (!this.askStore)
1026
1044
  return true;
1027
- const call = { taskId: origin.taskId, legKey: origin.legKey, toolCallId: req.toolCallId, sourceTaskId: req.sourceTaskId ?? origin.taskId };
1045
+ const call = { taskId: origin.taskId, legKey: origin.legKey, toolCallId: req.toolCallId, sourceSessionId: req.sourceSessionId ?? origin.taskId };
1028
1046
  try {
1029
1047
  const rows = await this.withStoreDeadline(this.askStore.listByCall(call), "listByCall(session-grant-provenance)", DURABLE_CONVERGE_READ_TIMEOUT_MS);
1030
1048
  return rows.length === 0;
@@ -1330,6 +1348,7 @@ export class ToolApprovalCoordinator {
1330
1348
  const cardWord = readApprovalCard(req.approvalCard);
1331
1349
  const originWord = typeof req.origin === "string" && req.origin.length > 0 ? req.origin : undefined;
1332
1350
  const askClassPair = readAskClassPair(req);
1351
+ const askReasonsOfReq = readAskReasons(req);
1333
1352
  const requester = extensionRequesterOf(req.requestedBy, "tool_approval");
1334
1353
  const frame = {
1335
1354
  type: "tool_approval",
@@ -1338,7 +1357,7 @@ export class ToolApprovalCoordinator {
1338
1357
  ...(typeof req.toolCallId === "string" && req.toolCallId !== "" ? { toolCallId: req.toolCallId } : {}),
1339
1358
  ...(child
1340
1359
  ? {
1341
- sourceTaskId: req.sourceTaskId,
1360
+ sourceSessionId: req.sourceSessionId,
1342
1361
  fromSubagent: true,
1343
1362
  ...(typeof req.sourceAgentName === "string" ? { sourceAgentName: redactSecrets(req.sourceAgentName) } : {}),
1344
1363
  ...(req.delegation
@@ -1352,9 +1371,10 @@ export class ToolApprovalCoordinator {
1352
1371
  : {}),
1353
1372
  }
1354
1373
  : {}),
1374
+ ...(typeof req.agentId === "string" && req.agentId !== "" ? { agentId: req.agentId } : {}),
1355
1375
  message: typeof req.message === "string" ? redactDeep(req.message) : "",
1376
+ ...(askReasonsOfReq !== undefined ? { askReasons: askReasonsOfReq } : {}),
1356
1377
  ...(governanceForced ? { governanceForced: true } : {}),
1357
- ...(req.requiresRealApproval === true ? { requiresRealApproval: true } : {}),
1358
1378
  ...(req.mandated === true ? { mandated: true } : {}),
1359
1379
  ...(standingAnswerHome(askStandingAnswerFacts(req, governanceForced, deploymentListAsks)) === "none" ? { rememberRefused: true } : {}),
1360
1380
  ...(typeof req.boundGrantDigest === "string" ? { boundGrantDigest: req.boundGrantDigest, ...(req.boundGrants !== undefined ? { boundGrants: req.boundGrants } : {}) } : {}),
@@ -1381,9 +1401,11 @@ export class ToolApprovalCoordinator {
1381
1401
  const expiresAtMs = Math.ceil(Date.now() + effectiveWindowMs);
1382
1402
  let askId;
1383
1403
  let batchId;
1384
- const card = this.askStore ? buildApprovalCard(frame, req, req.requiresRealApproval === true) : undefined;
1404
+ const card = this.askStore ? buildApprovalCard(frame, req, askDemandsAPerson(req, undefined)) : undefined;
1385
1405
  let cardForFrame = card;
1386
1406
  let persistedExpiresAtMs = expiresAtMs;
1407
+ let factsOfRecord;
1408
+ let recordCard;
1387
1409
  let entryExecutionLane = origin.executionLane;
1388
1410
  let lateEnsuredRow;
1389
1411
  let lateTerminalRow;
@@ -1412,16 +1434,16 @@ export class ToolApprovalCoordinator {
1412
1434
  : replayed;
1413
1435
  };
1414
1436
  if (this.askStore && card) {
1415
- const sourceTaskId = req.sourceTaskId ?? origin.taskId;
1437
+ const sourceSessionId = req.sourceSessionId ?? origin.taskId;
1416
1438
  const runId = origin.taskId;
1417
1439
  const legKey = origin.legKey;
1418
- askId = deriveAskId(sourceTaskId, runId, legKey, req);
1419
- batchId = this.batchIdFor(askId, sourceTaskId, runId, legKey);
1440
+ askId = deriveAskId(sourceSessionId, runId, legKey, req);
1441
+ batchId = this.batchIdFor(askId, sourceSessionId, runId, legKey);
1420
1442
  try {
1421
1443
  const existingOrCreated = await this.withStoreDeadline(this.askStore.ensureAsk({
1422
1444
  askId,
1423
1445
  taskId: origin.taskId,
1424
- sourceTaskId,
1446
+ sourceSessionId,
1425
1447
  sessionId: origin.sessionId ?? origin.taskId,
1426
1448
  owner: origin.owner,
1427
1449
  executionLane: origin.executionLane,
@@ -1429,7 +1451,7 @@ export class ToolApprovalCoordinator {
1429
1451
  toolCallId: req.toolCallId,
1430
1452
  legKey,
1431
1453
  parentToolCallId: req.delegation?.parentToolCallId ?? null,
1432
- cardJson: buildApprovalCardEnvelope(askId, card),
1454
+ cardJson: buildApprovalCardEnvelope(askId, card, frame),
1433
1455
  boundInputHash: readBoundInputHash(req),
1434
1456
  ...durableRuleMaterial(ruleLaneMaterial),
1435
1457
  schemaVersion: 1,
@@ -1463,6 +1485,10 @@ export class ToolApprovalCoordinator {
1463
1485
  persistedExpiresAtMs = existingOrCreated.row.expiresAtMs;
1464
1486
  entryExecutionLane = existingOrCreated.row.executionLane;
1465
1487
  cardForFrame = persistedEnvelope.card;
1488
+ recordCard = persistedEnvelope.card;
1489
+ factsOfRecord = existingOrCreated.inserted ? undefined : persistedEnvelope.liveFacts;
1490
+ if (factsOfRecord !== undefined)
1491
+ adoptStoredLiveFacts(frame, factsOfRecord);
1466
1492
  if (cardForFrame.governanceForced === true)
1467
1493
  frame.governanceForced = true;
1468
1494
  else
@@ -1508,6 +1534,8 @@ export class ToolApprovalCoordinator {
1508
1534
  confirmedRowExists = confirmedRow !== null;
1509
1535
  if (confirmedRow !== null)
1510
1536
  batchId = confirmedRow.batchId;
1537
+ if (confirmedRow !== null)
1538
+ recordCard = storedPersonDemandRecord(confirmedRow.cardJson);
1511
1539
  indeterminate = false;
1512
1540
  break;
1513
1541
  }
@@ -1560,7 +1588,7 @@ export class ToolApprovalCoordinator {
1560
1588
  if (hostSettled !== undefined || (denyReasonSettled !== undefined && denyReasonSettled !== "")) {
1561
1589
  return {
1562
1590
  allow: false,
1563
- ...(hostSettled !== undefined ? { settledBy: hostSettled } : {}),
1591
+ ...hostSettled,
1564
1592
  ...(denyReasonSettled !== undefined && denyReasonSettled !== "" ? { reason: denyReasonSettled } : {}),
1565
1593
  };
1566
1594
  }
@@ -1577,7 +1605,7 @@ export class ToolApprovalCoordinator {
1577
1605
  return {
1578
1606
  allow: true,
1579
1607
  ...(settled.updatedInput !== undefined ? { updatedInput: settled.updatedInput } : {}),
1580
- ...(hostSettled !== undefined ? { settledBy: hostSettled } : {}),
1608
+ ...hostSettled,
1581
1609
  ...(settled.readRootGrant !== undefined ? { readRootGrant: settled.readRootGrant } : {}),
1582
1610
  };
1583
1611
  }
@@ -1589,10 +1617,10 @@ export class ToolApprovalCoordinator {
1589
1617
  done = true;
1590
1618
  const allowed = verdict.by === "human" && verdict.allowed;
1591
1619
  const outcome = verdict.by === "system" ? SETTLE_OUTCOME.EXPIRED : verdict.allowed ? SETTLE_OUTCOME.ALLOWED : SETTLE_OUTCOME.DENIED;
1592
- const hostSettledBy = verdict.hostSettledBy;
1620
+ const hostSource = verdict.hostSource;
1593
1621
  const updatedInput = verdict.by === "human" ? verdict.updatedInput : undefined;
1594
1622
  const readRootGrant = verdict.by === "human" ? verdict.readRootGrant : undefined;
1595
- hostSettled = hostSettledBy;
1623
+ hostSettled = hostSource;
1596
1624
  denyReasonSettled = verdict.by === "human" && !verdict.allowed ? verdict.denyReason : undefined;
1597
1625
  if (timer)
1598
1626
  clearTimeout(timer);
@@ -1626,7 +1654,7 @@ export class ToolApprovalCoordinator {
1626
1654
  const common = {
1627
1655
  approvalId: wireApprovalId,
1628
1656
  ...(windowRouteUnavailable ? { parkRouted: true } : {}),
1629
- ...(hostSettledBy !== undefined ? { settledBy: hostSettledBy } : {}),
1657
+ ...(hostSource !== undefined ? { settledBy: hostSource.settledBy } : {}),
1630
1658
  settledAtMs: Date.now(),
1631
1659
  };
1632
1660
  return verdict.by === "system"
@@ -1638,7 +1666,7 @@ export class ToolApprovalCoordinator {
1638
1666
  approvalId: wireApprovalId,
1639
1667
  taskId: origin.taskId,
1640
1668
  carrierLeg,
1641
- executingSessionId: req.sourceTaskId,
1669
+ executingSessionId: req.sourceSessionId,
1642
1670
  toolCallId: req.toolCallId,
1643
1671
  settleRecord,
1644
1672
  });
@@ -1792,7 +1820,7 @@ export class ToolApprovalCoordinator {
1792
1820
  if (done)
1793
1821
  return;
1794
1822
  windowRouteUnavailable = true;
1795
- settle({ by: "system", cause, ...(hostSettledBy !== undefined ? { hostSettledBy } : {}) });
1823
+ settle({ by: "system", cause, ...(hostSettledBy !== undefined ? { hostSource: { settledBy: hostSettledBy } } : {}) });
1796
1824
  };
1797
1825
  const windowExpired = (hostSelfReport, cause) => {
1798
1826
  void (async () => {
@@ -1901,23 +1929,18 @@ export class ToolApprovalCoordinator {
1901
1929
  }
1902
1930
  const entryClasses = askClassPair?.classes;
1903
1931
  const entryDeploymentListQuestion = carriesDeploymentListQuestion(deploymentListAsks, entryClasses);
1904
- const entryGrantBinding = grantBindingOf(req);
1905
- const rememberRefused = standingAnswerHome(pendingEntryStandingAnswerFacts({
1932
+ const legGrantBinding = grantBindingOf(req);
1933
+ const entryGrantBinding = factsOfRecord === undefined ? legGrantBinding : agreedGrantBinding(legGrantBinding, grantBindingOf(factsOfRecord));
1934
+ const entryMandated = req.mandated === true || factsOfRecord?.mandated === true;
1935
+ const entryDemandsAPerson = askDemandsAPerson(req, recordCard) || [...(askId !== undefined ? (this.pendingByAskId.get(askId) ?? []) : [])].some((s) => s.requiresRealApproval === true);
1936
+ cardForFrame = projectDecisionFacts(pendingEntryStandingAnswerFacts({
1906
1937
  ...(effectiveGovernanceForced ? { governanceForced: true } : {}),
1907
- ...(req.requiresRealApproval === true ? { requiresRealApproval: true } : {}),
1908
- ...(req.mandated === true ? { mandated: true } : {}),
1938
+ ...(entryDemandsAPerson ? { requiresRealApproval: true } : {}),
1939
+ ...(entryMandated ? { mandated: true } : {}),
1909
1940
  grantBinding: entryGrantBinding,
1910
1941
  classes: entryClasses,
1911
1942
  ...(entryDeploymentListQuestion ? { deploymentListQuestion: true } : {}),
1912
- })) === "none";
1913
- if (rememberRefused)
1914
- frame.rememberRefused = true;
1915
- else
1916
- delete frame.rememberRefused;
1917
- if (cardForFrame !== undefined && (cardForFrame.rememberRefused === true) !== rememberRefused) {
1918
- const { rememberRefused: _stale, ...cardRest } = cardForFrame;
1919
- cardForFrame = rememberRefused ? { ...cardRest, rememberRefused: true } : cardRest;
1920
- }
1943
+ }), frame, cardForFrame);
1921
1944
  const cardFrame = askId !== undefined && cardForFrame !== undefined
1922
1945
  ? buildApprovalRequestFrame({ askId, taskId: origin.taskId, approvalId: wireApprovalId, card: cardForFrame, expiresAtMs: persistedExpiresAtMs, nowMs: Date.now(), live: frame })
1923
1946
  : undefined;
@@ -1928,7 +1951,7 @@ export class ToolApprovalCoordinator {
1928
1951
  owner: origin.owner,
1929
1952
  ...(primary ? { ctxTaskId: primary.taskId, originCtx: primary } : {}),
1930
1953
  ...(reachability === "unreached" ? { suspended: true } : {}),
1931
- ...(child ? { originTaskId: req.sourceTaskId } : primary ? { targetCtxs: new Set(aliveCtxs), onTargetGone } : {}),
1954
+ ...(child ? { originTaskId: req.sourceSessionId } : primary ? { targetCtxs: new Set(aliveCtxs), onTargetGone } : {}),
1932
1955
  ...(origin.sessionId ? { sessionId: origin.sessionId } : {}),
1933
1956
  frame,
1934
1957
  ...(cardFrame !== undefined ? { cardFrame } : {}),
@@ -1943,10 +1966,8 @@ export class ToolApprovalCoordinator {
1943
1966
  executionLane: entryExecutionLane,
1944
1967
  ...(ruleLaneMaterial !== undefined ? { ruleLane: ruleLaneMaterial } : {}),
1945
1968
  ...(effectiveGovernanceForced ? { governanceForced: true } : {}),
1946
- ...(req.requiresRealApproval === true ? { requiresRealApproval: true } : {}),
1947
- ...(req.mandated === true ? { mandated: true } : {}),
1948
- ...(mandateWord !== undefined ? { mandate: mandateWord } : {}),
1949
- ...(originWord !== undefined ? { origin: originWord } : {}),
1969
+ ...(entryDemandsAPerson ? { requiresRealApproval: true } : {}),
1970
+ ...(entryMandated ? { mandated: true } : {}),
1950
1971
  ...(askId !== undefined && batchId !== undefined ? { askId, batchId } : {}),
1951
1972
  };
1952
1973
  selfEntry = pendingEntry;
@@ -1959,11 +1980,21 @@ export class ToolApprovalCoordinator {
1959
1980
  this.pendingByAskId.set(askId, siblings);
1960
1981
  }
1961
1982
  siblings.add(pendingEntry);
1983
+ if (entryDemandsAPerson) {
1984
+ for (const s of siblings) {
1985
+ if (s.requiresRealApproval === true)
1986
+ continue;
1987
+ s.requiresRealApproval = true;
1988
+ const card = projectDecisionFacts(pendingEntryStandingAnswerFacts(s), s.frame, s.cardFrame?.card);
1989
+ if (s.cardFrame !== undefined && card !== undefined && card !== s.cardFrame.card)
1990
+ s.cardFrame = { ...s.cardFrame, card };
1991
+ }
1992
+ }
1962
1993
  }
1963
1994
  this.askAudit?.recordAsk({
1964
1995
  approvalId: wireApprovalId,
1965
1996
  taskId: origin.taskId,
1966
- ...(req.sourceTaskId !== undefined ? { sourceTaskId: req.sourceTaskId } : {}),
1997
+ ...(req.sourceSessionId !== undefined ? { sourceSessionId: req.sourceSessionId } : {}),
1967
1998
  ...(origin.sessionId !== undefined ? { sessionId: origin.sessionId } : {}),
1968
1999
  owner: origin.owner,
1969
2000
  toolName: req.toolName,
@@ -2123,7 +2154,7 @@ export class ToolApprovalCoordinator {
2123
2154
  const preRule = this.precheckEditedRuleBeforeDecision(entry, judgedOwner, parsed);
2124
2155
  if (preRule !== undefined)
2125
2156
  return preRule;
2126
- if (parsed.value !== "deny" && policyCannotAnswer(heldAskOf(entry.requiresRealApproval === true), parsed.decidedBy)) {
2157
+ if (parsed.value !== "deny" && policyCannotAnswer(heldAskOf(entry.requiresRealApproval === true), parsed.decider.decidedBy)) {
2127
2158
  return { status: 400, body: refusalBody({ errorCode: "request.body_shape", message: POLICY_CANNOT_ALLOW_PERSON_ASK }) };
2128
2159
  }
2129
2160
  const ruleEligibility = { eligible: true };
@@ -2486,7 +2517,7 @@ export class ToolApprovalCoordinator {
2486
2517
  gateBoundInputHash: row.gateBoundInputHash,
2487
2518
  decision,
2488
2519
  ...(parsed.note !== undefined ? { note: parsed.note } : {}),
2489
- decidedBy: parsed.decidedBy,
2520
+ decider: parsed.decider,
2490
2521
  ...(parsed.updatedInput !== undefined && parsed.value !== "deny" ? { updatedInput: parsed.updatedInput } : {}),
2491
2522
  ...(principal !== undefined ? { principal } : {}),
2492
2523
  ...(httpReq !== undefined ? { httpReq } : {}),
@@ -2729,7 +2760,7 @@ export class ToolApprovalCoordinator {
2729
2760
  decision: parsed.value === "deny" ? "deny" : "approve",
2730
2761
  ...(parsed.note !== undefined ? { decisionNote: parsed.note } : {}),
2731
2762
  ...(parsed.value !== "deny" && parsed.updatedInput !== undefined ? { updatedInput: parsed.updatedInput } : {}),
2732
- ...((sb) => (sb !== undefined ? { settledBy: sb } : {}))(liveSettledBy(parsed.decidedBy)),
2763
+ ...liveHostSource(parsed.decider),
2733
2764
  }), "decideAsk", DURABLE_CALL_TIMEOUT_MS, (late) => {
2734
2765
  if (late.ok)
2735
2766
  this.notifyExternalDecision(askId, outcomeOfDecidedRow(late.row));
@@ -2809,13 +2840,13 @@ export class ToolApprovalCoordinator {
2809
2840
  this.allowAllSessions.add(sessionAllowKey(judgedOwner, entry.sessionId, sessionAllowCategory(entry.toolName), entry.grantBinding));
2810
2841
  }
2811
2842
  const allowed = parsed.value !== "deny";
2812
- const settleArgs = opts?.settleOutcome !== undefined ? settleArgsOfDecided(opts.settleOutcome) : { allowed, updatedInput: parsed.updatedInput, settledBy: liveSettledBy(parsed.decidedBy) };
2843
+ const settleArgs = opts?.settleOutcome !== undefined ? settleArgsOfDecided(opts.settleOutcome) : { allowed, updatedInput: parsed.updatedInput, source: liveHostSource(parsed.decider) };
2813
2844
  const readRootGrant = opts?.settleOutcome === undefined || opts.settleOutcomeIsThisRequest === true ? parsed.readRootGrant : undefined;
2814
2845
  entry.settle({
2815
2846
  by: "human",
2816
2847
  allowed: settleArgs.allowed,
2817
2848
  updatedInput: settleArgs.updatedInput,
2818
- ...(settleArgs.settledBy !== undefined ? { hostSettledBy: settleArgs.settledBy } : {}),
2849
+ ...(settleArgs.source !== undefined ? { hostSource: settleArgs.source } : {}),
2819
2850
  ...(!settleArgs.allowed && parsed.note !== undefined ? { denyReason: parsed.note } : {}),
2820
2851
  ...(readRootGrant !== undefined ? { readRootGrant } : {}),
2821
2852
  });
@@ -2870,7 +2901,8 @@ export class ToolApprovalCoordinator {
2870
2901
  const registrationId = uuidv7();
2871
2902
  const facts = {
2872
2903
  ...(card.governanceForced === true ? { governanceForced: true } : {}),
2873
- ...(card.risk.requiresRealApproval ? { requiresRealApproval: true } : {}),
2904
+ ...(askDemandsAPerson(undefined, card) ? { requiresRealApproval: true } : {}),
2905
+ ...(replayFrame.mandated === true ? { mandated: true } : {}),
2874
2906
  grantBinding: { kind: "unreadable" },
2875
2907
  ...(card.classes !== undefined ? { classes: card.classes } : {}),
2876
2908
  };
@@ -2905,7 +2937,7 @@ export class ToolApprovalCoordinator {
2905
2937
  owner: row.owner,
2906
2938
  executionLane: row.executionLane,
2907
2939
  ...(row.sessionId !== row.taskId ? { sessionId: row.sessionId } : {}),
2908
- ...(card.fromSubagent === true ? { originTaskId: row.sourceTaskId } : {}),
2940
+ ...(card.fromSubagent === true ? { originTaskId: row.sourceSessionId } : {}),
2909
2941
  toolName: card.toolName,
2910
2942
  ...facts,
2911
2943
  approvalId: row.askId,
@@ -2962,10 +2994,16 @@ export class ToolApprovalCoordinator {
2962
2994
  }
2963
2995
  return rows;
2964
2996
  }
2965
- hasLivePendingFrom(originTaskId) {
2966
- for (const e of this.pending.values())
2967
- if (e.originTaskId === originTaskId && e.adopted !== true)
2997
+ hasLivePendingFromLeg(names) {
2998
+ if (names.length === 0)
2999
+ return false;
3000
+ for (const e of this.pending.values()) {
3001
+ if (e.adopted === true)
3002
+ continue;
3003
+ const { agentId, sourceSessionId } = e.frame;
3004
+ if ((agentId !== undefined && names.includes(agentId)) || (sourceSessionId !== undefined && names.includes(sourceSessionId)))
2968
3005
  return true;
3006
+ }
2969
3007
  return false;
2970
3008
  }
2971
3009
  async pollSuspendedDecisions() {
@@ -17,7 +17,7 @@
17
17
  * ⑨⑩([ref],2026-08-31)把两个最大的 wire 面也纳入:TaskSpec 按「server 有无写点」记 Wired/Unwired,
18
18
  * TaskResult 按「转发/摘除」记 Forwarded/Stripped —— 谁改 resolve-spec.ts / runs.ts 的发射点谁同步本文件。
19
19
  */
20
- import type { TaskNotificationPayload, SemaProvenance, BackgroundChildEvent, RosterEntry, AskRequest, CheckpointSummary, PendingAction, TaskEvent, TraceEvent, MailboxMessage, MailboxAppendMessage, TaskSpec, TaskResult, SideQueryResult, WiringManifest, PermissionModeReceipt, GateOutcome, GateDisposition, Settlement, PausedCause, TerminalCause, CheckpointGate, CheckpointToken, VerificationResult, CascadeRunResult, WorkflowRun, ReadRootGrantCandidate, McpReconnectResult, McpServerStatus, NodeLspManagerOptions, RunnerDeps, SessionMemoryStatus, PromptManifestIdentity, PromptIdentityLayers, PromptManifestSelectors, PromptManifestSection, PromptChainLink, SupersededOverlay, ToolDisclosureManifest } from "@sema-agent/core";
20
+ import type { TaskNotificationPayload, SemaProvenance, BackgroundChildEvent, RosterEntry, AskRequest, CheckpointSummary, PendingAction, TaskEvent, TraceEvent, MailboxMessage, MailboxAppendMessage, TaskSpec, TaskResult, SideQueryResult, WiringManifest, PermissionModeReceipt, GateOutcome, GateDisposition, Settlement, PausedCause, TerminalCause, CheckpointGate, CheckpointToken, VerificationResult, CascadeRunResult, WorkflowRun, ReadRootGrantCandidate, McpReconnectResult, McpServerStatus, NodeLspManagerOptions, RunnerDeps, SessionMemoryStatus, DeploymentSessionMemoryStatus, PromptManifestIdentity, PromptIdentityLayers, PromptManifestSelectors, PromptManifestSection, PromptChainLink, SupersededOverlay, ToolDisclosureManifest } from "@sema-agent/core";
21
21
  import type { ToolApprovalFrame } from "../tool-approval.js";
22
22
  import type { TableCoreKeys } from "./projection-table.js";
23
23
  import type { PauseSeat } from "../terminal.js";
@@ -45,7 +45,7 @@ type _GuardBgNotifReverse = AssertAllKeysHandled<Exclude<BgNotifProjected | BgNo
45
45
  type RosterProjected = "name" | "agentId" | "sessionId" | "toolUseId" | "owner" | "scope" | "sessionScoped" | "rootSessionId" | "model" | "modelFallback" | "createdAt";
46
46
  type _GuardRoster = AssertAllKeysHandled<Exclude<keyof RosterEntry, RosterProjected>>;
47
47
  type _GuardRosterReverse = AssertAllKeysHandled<Exclude<RosterProjected, keyof RosterEntry>>;
48
- type AskProjected = "toolName" | "toolCallId" | "args" | "message" | "sourceTaskId" | "fromSubagent" | "sourceAgentName" | "delegation" | "ruleOffers" | "ruleOffersAbsence" | "allowRuleShadowed" | "probeCause" | "probeReason" | "ruleEvidence" | "requiresRealApproval" | "denialLimitFallback" | "origin" | "readRootCandidate" | "mandated" | "mandate" | "askClass" | "classes" | "boundGrantDigest" | "boundGrants" | "classifierNoRuling" | "approvalCard" | "boundGrantAbsence" | "requestedBy";
48
+ type AskProjected = "toolName" | "toolCallId" | "args" | "message" | "sourceSessionId" | "agentId" | "askReasons" | "fromSubagent" | "sourceAgentName" | "delegation" | "ruleOffers" | "ruleOffersAbsence" | "allowRuleShadowed" | "probeCause" | "probeReason" | "ruleEvidence" | "requiresRealApproval" | "denialLimitFallback" | "origin" | "readRootCandidate" | "mandated" | "mandate" | "askClass" | "classes" | "boundGrantDigest" | "boundGrants" | "classifierNoRuling" | "approvalCard" | "boundGrantAbsence" | "requestedBy";
49
49
  type AskExcluded = "preview" | "principal" | "riskAxes" | "boundInputHash" | "isDelegatedChild" | "hasBidiControls" | "previewWithheld" | "execCwd" | "authoredBy" | "editRewritten";
50
50
  type _GuardAsk = AssertAllKeysHandled<Exclude<keyof AskRequest, AskProjected | AskExcluded>>;
51
51
  type _GuardAskReverse = AssertAllKeysHandled<Exclude<AskProjected | AskExcluded, keyof AskRequest>>;
@@ -217,8 +217,8 @@ type _GuardPromptManifestKeysReverse = AssertAllKeysHandled<{
217
217
  type _GuardPromptManifestKeysNonEmpty = AssertAllKeysHandled<{
218
218
  [L in keyof ManifestCore]: [ManifestDeclared<ManifestFaces, L>] extends [never] ? L : never;
219
219
  }[keyof ManifestCore]>;
220
- type SummaryProjected = "sessionId" | "scope" | "createdAt" | "gateKind" | "severity" | "spentMicroUsd" | "deadline" | "hasBidiControls" | "requiresRealApproval" | "denialLimitFallback" | "origin" | "mandated" | "mandate" | "boundGrantDigest" | "boundGrants" | "classifierNoRuling" | "boundGrantAbsence" | "checkpointId";
221
- type SummaryExcluded = "token" | "toolInput" | "toolName" | "toolCallId" | "preview" | "principal" | "sourceTaskId" | "approvalCard" | "restoreMode" | "previewWithheld" | "authoredBy" | "runOrigin" | "requestedByCallId";
220
+ type SummaryProjected = "sessionId" | "scope" | "createdAt" | "gateKind" | "severity" | "spentMicroUsd" | "deadline" | "hasBidiControls" | "requiresRealApproval" | "denialLimitFallback" | "origin" | "mandated" | "mandate" | "boundGrantDigest" | "boundGrants" | "classifierNoRuling" | "boundGrantAbsence" | "checkpointId" | "rowVerdict";
221
+ type SummaryExcluded = "token" | "toolInput" | "toolName" | "toolCallId" | "preview" | "principal" | "sourceSessionId" | "agentId" | "approvalCard" | "restoreMode" | "previewWithheld" | "authoredBy" | "runOrigin" | "requestedByCallId";
222
222
  type _GuardInboxSummary = AssertAllKeysHandled<Exclude<keyof CheckpointSummary, SummaryProjected | SummaryExcluded>>;
223
223
  type _GuardInboxSummaryReverse = AssertAllKeysHandled<Exclude<SummaryProjected | SummaryExcluded, keyof CheckpointSummary>>;
224
224
  type ParkArmKeys = keyof Extract<PendingAction, {
@@ -234,7 +234,7 @@ type TaskSpecWired = "objective" | "principal" | "images" | "sessionId" | "requi
234
234
  export type TaskSpecUnwired = "actor" | "roles" | "lspManager" | "tracer" | "readFace" | "interactiveQuestionFallback" | "alwaysLoadTools" | "restoreGatedTools" | "deferSelfResolve" | "basePolicyForResumeEdit" | "lspDiagnostics" | "streamingToolExecution" | "toolResultThresholdChars" | "peerPresence" | "modelRole" | "enableBlockedReport" | "promptForm" | "advisorModel" | "runOrigin" | "planFile" | "classifyAllShell";
235
235
  type _GuardTaskSpec = AssertAllKeysHandled<Exclude<keyof TaskSpec, TaskSpecWired | TaskSpecUnwired>>;
236
236
  type _GuardTaskSpecReverse = AssertAllKeysHandled<Exclude<TaskSpecWired | TaskSpecUnwired, keyof TaskSpec>>;
237
- type TaskResultForwarded = "taskId" | "runId" | "sessionId" | "terminal" | "model" | "effectiveReasoning" | "result" | "salvagedOutput" | "remoteEnvFailures" | "apiFailure" | "retryAfterMs" | "degraded" | "structuredOutput" | "rewindNotes" | "haltedOnUserRejection" | "haltedByUser" | "strandedHumanAnswers" | "pendingApproval" | "approvalWaitedMs" | "effectiveReadFace" | "effectiveReadDenyPatterns" | "effectiveWriteFace" | "effectiveMemoryScopes" | "stats" | "editedFiles" | "responseModel" | "compaction" | "resultEntryIds";
237
+ type TaskResultForwarded = "taskId" | "runId" | "sessionId" | "terminal" | "model" | "effectiveReasoning" | "result" | "salvagedOutput" | "remoteEnvFailures" | "apiFailure" | "retryAfterMs" | "degraded" | "structuredOutput" | "rewindNotes" | "haltedOnUserRejection" | "haltedByUser" | "strandedHumanAnswers" | "pendingApproval" | "approvalWaitedMs" | "effectiveReadFace" | "effectiveReadDenyPatterns" | "effectiveWriteFace" | "effectiveMemoryScopes" | "stats" | "editedFiles" | "responseModel" | "compaction" | "resultEntryIds" | "placementRoot";
238
238
  type TaskResultStripped = never;
239
239
  type _GuardTaskResult = AssertAllKeysHandled<Exclude<keyof TaskResult, TaskResultForwarded | TaskResultStripped>>;
240
240
  type _GuardTaskResultReverse = AssertAllKeysHandled<Exclude<TaskResultForwarded | TaskResultStripped, keyof TaskResult>>;
@@ -245,7 +245,7 @@ type _GuardPausedCauseReverse = AssertAllKeysHandled<Exclude<PausedCauseForwarde
245
245
  type NonPausedTerminalKeys = Exclude<TerminalCause, {
246
246
  kind: "paused";
247
247
  }> extends infer C ? (C extends object ? keyof C : never) : never;
248
- type TerminalArmForwarded = "kind" | "code" | "message" | "nestedPause" | "detail" | "reason";
248
+ type TerminalArmForwarded = "kind" | "code" | "message" | "nestedPause" | "detail" | "reason" | "unstartedRow";
249
249
  type TerminalArmStripped = never;
250
250
  type _GuardTerminalArm = AssertAllKeysHandled<Exclude<NonPausedTerminalKeys, TerminalArmForwarded | TerminalArmStripped>>;
251
251
  type _GuardTerminalArmReverse = AssertAllKeysHandled<Exclude<TerminalArmForwarded | TerminalArmStripped, NonPausedTerminalKeys>>;
@@ -433,10 +433,12 @@ type _CoverWordsCheck = AssertAllKeysHandled<Exclude<CoveringWords<{
433
433
  }, _CoverProbeWords>> | Exclude<"text[]" | "tree", CoveringWords<readonly string[] | undefined, _CoverProbeWords>> | Extract<"verbatim" | "text[]", CoveringWords<{
434
434
  note: string;
435
435
  }[], _CoverProbeWords>>>;
436
+ type SessionMemoryStatusSourceKey = keyof SessionMemoryStatus | keyof DeploymentSessionMemoryStatus;
436
437
  type SessionMemoryStatusProjected = "captureOptedOut" | "committedCount" | "foldedCount" | "optOutSource" | "lastCaptureAt";
437
- type SessionMemoryStatusExcluded = "writeHome";
438
- type _GuardSessionMemoryStatus = AssertAllKeysHandled<Exclude<keyof SessionMemoryStatus, SessionMemoryStatusProjected | SessionMemoryStatusExcluded>>;
439
- type _GuardSessionMemoryStatusReverse = AssertAllKeysHandled<Exclude<SessionMemoryStatusProjected | SessionMemoryStatusExcluded, keyof SessionMemoryStatus>>;
438
+ type SessionMemoryStatusExcluded = "writeHome" | "planes";
439
+ type _GuardSessionMemoryStatus = AssertAllKeysHandled<Exclude<SessionMemoryStatusSourceKey, SessionMemoryStatusProjected | SessionMemoryStatusExcluded>>;
440
+ type _GuardSessionMemoryStatusReverse = AssertAllKeysHandled<Exclude<SessionMemoryStatusProjected | SessionMemoryStatusExcluded, SessionMemoryStatusSourceKey>>;
441
+ type _GuardSessionMemoryStatusDeploymentReverse = AssertAllKeysHandled<Exclude<SessionMemoryStatusProjected, keyof DeploymentSessionMemoryStatus>>;
440
442
  type SideQueryResultForwarded = "text" | "toolCalls" | "model" | "servedModel" | "degraded" | "responseModel" | "usage" | "usageMissing" | "stopReason" | "errorMessage" | "errorCode" | "errorKind" | "inputTooLongRuledOut" | "account";
441
443
  type SideQueryResultStripped = never;
442
444
  type _GuardSideQueryResult = AssertAllKeysHandled<Exclude<keyof SideQueryResult, SideQueryResultForwarded | SideQueryResultStripped>>;
@@ -525,6 +527,7 @@ export type CoreKeysetGuards = [
525
527
  _GuardTerminalArmReverse,
526
528
  _GuardSessionMemoryStatus,
527
529
  _GuardSessionMemoryStatusReverse,
530
+ _GuardSessionMemoryStatusDeploymentReverse,
528
531
  _GuardNotificationReverse,
529
532
  _GuardProvenance,
530
533
  _GuardProvenanceReverse,
@@ -16,7 +16,7 @@
16
16
  * 同文件 G1 e2e 的全码扇出夹具、以及契约文档附录 D.3 那张表(含**小节标题里的码数** —— 那道门本批
17
17
  * 刚立,立完就在下一次加码时自己咬住了)。
18
18
  */
19
- export declare const ENGINE_NOTICE_WIRE_CODES: readonly ["memory.session_polluted", "memory.harvest_quarantined", "memory.delegation_static_mark_waived", "memory.hold_opened", "memory.hold_released", "memory.hold_disposed", "task.turn_interrupted", "steering.parked_input_blocked", "task.user_steer_undrained", "task.user_followup_undrained", "memory.capture_opted_out", "memory.capture_optout_unpersisted", "task.halt_unconsumed", "task.late_approval", "config.durable_gate_unavailable", "peer.inbound_disposition", "peer.held_settled", "peer.idle_subscription", "classifier.denial_limit", "mcp.injection_dropped", "delegation.ask_unresolvable", "task.interrupt_unconsumed", "approval.read_root_granted", "approval.read_root_grant_rejected", "instructions.source_changed", "session.records_skipped", "server.model_unreachable", "permission.entry_mode_clamped", "classifier.unavailable", "config.permission_mode_unavailable", "permission.ask_released_by_mode", "permission.read_deny_unapplied", "permission.rule_store_unavailable", "permission.rule_row_dropped", "permission.allowed_tool_not_granted", "task.tool_turn_incomplete", "route.finish_reason_unknown", "route.stream_end_ignored", "route.credential_origin_mismatch", "mods.registration_refused", "config.session_rules_earlier_grammar", "advisor.not_attached", "inherit_env.names_withheld", "model.capability_downgraded", "context.image_removed", "mcp.authorization_required"];
19
+ export declare const ENGINE_NOTICE_WIRE_CODES: readonly ["memory.session_polluted", "memory.harvest_quarantined", "memory.delegation_static_mark_waived", "memory.hold_opened", "memory.hold_released", "memory.hold_disposed", "task.turn_interrupted", "steering.parked_input_blocked", "task.user_steer_undrained", "task.user_followup_undrained", "memory.capture_opted_out", "memory.capture_optout_unpersisted", "task.halt_unconsumed", "task.late_approval", "config.durable_gate_unavailable", "peer.inbound_disposition", "peer.held_settled", "peer.idle_subscription", "classifier.denial_limit", "mcp.injection_dropped", "delegation.ask_unresolvable", "task.interrupt_unconsumed", "approval.read_root_granted", "approval.read_root_grant_rejected", "instructions.source_changed", "session.lineage_rerooted", "server.model_unreachable", "permission.entry_mode_clamped", "classifier.unavailable", "config.permission_mode_unavailable", "permission.ask_released_by_mode", "permission.read_deny_unapplied", "permission.rule_store_unavailable", "permission.rule_row_dropped", "permission.allowed_tool_not_granted", "task.tool_turn_incomplete", "route.finish_reason_unknown", "route.stream_end_ignored", "route.credential_origin_mismatch", "mods.registration_refused", "config.session_rules_earlier_grammar", "advisor.not_attached", "inherit_env.names_withheld", "model.capability_downgraded", "context.media_removed", "mcp.authorization_required", "classifier.seat_rate_limited", "context.tool_schema_removed"];
20
20
  export type EngineNoticeWireCode = (typeof ENGINE_NOTICE_WIRE_CODES)[number];
21
21
  /** 白名单谓词(单点):路由与门都读这一个,不许第二处手抄码串。 */
22
22
  export declare function isEngineNoticeWireCode(code: string): code is EngineNoticeWireCode;
@@ -28,7 +28,7 @@ export const ENGINE_NOTICE_WIRE_CODES = [
28
28
  "approval.read_root_granted",
29
29
  "approval.read_root_grant_rejected",
30
30
  "instructions.source_changed",
31
- "session.records_skipped",
31
+ "session.lineage_rerooted",
32
32
  "server.model_unreachable",
33
33
  "permission.entry_mode_clamped",
34
34
  "classifier.unavailable",
@@ -47,8 +47,10 @@ export const ENGINE_NOTICE_WIRE_CODES = [
47
47
  "advisor.not_attached",
48
48
  "inherit_env.names_withheld",
49
49
  "model.capability_downgraded",
50
- "context.image_removed",
50
+ "context.media_removed",
51
51
  "mcp.authorization_required",
52
+ "classifier.seat_rate_limited",
53
+ "context.tool_schema_removed",
52
54
  ];
53
55
  const WIRE_CODES = new Set(ENGINE_NOTICE_WIRE_CODES);
54
56
  export function isEngineNoticeWireCode(code) {