@sema-agent/server 7.148.0 → 7.149.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 (247) hide show
  1. package/MIGRATION.md +429 -0
  2. package/README.md +16 -1
  3. package/README.zh-CN.md +4 -0
  4. package/USAGE.md +89 -55
  5. package/dist/adoption/wire.d.ts +3 -3
  6. package/dist/approval-card.d.ts +32 -32
  7. package/dist/approval-leg-origin.d.ts +33 -0
  8. package/dist/approval-leg-origin.js +4 -0
  9. package/dist/auth-bridge.d.ts +9 -1
  10. package/dist/auth-bridge.js +4 -4
  11. package/dist/auth-keys.d.ts +10 -1
  12. package/dist/auth-keys.js +8 -0
  13. package/dist/boot/execution-env.js +10 -11
  14. package/dist/boot/execution-lane.d.ts +6 -4
  15. package/dist/boot/execution-lane.js +3 -1
  16. package/dist/boot/org-delivery.d.ts +3 -2
  17. package/dist/boot/resolve-spec.js +6 -4
  18. package/dist/boot/runner-deps.js +3 -1
  19. package/dist/boot/stage-01-config.d.ts +1 -0
  20. package/dist/boot/stage-01-config.js +4 -3
  21. package/dist/boot/stage-02-web-admin-pull.d.ts +1 -0
  22. package/dist/boot/stage-02-web-admin-pull.js +10 -2
  23. package/dist/boot/stage-03-store-backend.d.ts +1 -0
  24. package/dist/boot/stage-03-store-backend.js +2 -2
  25. package/dist/boot/stage-04-stores.d.ts +1 -0
  26. package/dist/boot/stage-05-execution-env.d.ts +1 -0
  27. package/dist/boot/stage-06-runners.d.ts +2 -1
  28. package/dist/boot/stage-07-capability-layer.d.ts +2 -1
  29. package/dist/boot/stage-08-reapers.d.ts +2 -1
  30. package/dist/boot/stage-09-leader.d.ts +2 -1
  31. package/dist/boot/stage-10-http-server.d.ts +2 -1
  32. package/dist/boot/stores.d.ts +3 -0
  33. package/dist/boot/stores.js +22 -19
  34. package/dist/capabilities/tool-defer.d.ts +1 -1
  35. package/dist/capability-facts.d.ts +5 -4
  36. package/dist/capability-facts.js +3 -14
  37. package/dist/card-settle-stored-scope.d.ts +56 -0
  38. package/dist/card-settle-stored-scope.js +27 -0
  39. package/dist/card-void.d.ts +7 -12
  40. package/dist/card-void.js +2 -7
  41. package/dist/config-catalog.d.ts +12 -0
  42. package/dist/config-catalog.js +36 -32
  43. package/dist/config-invariants.d.ts +5 -4
  44. package/dist/config-invariants.js +4 -4
  45. package/dist/config-types.d.ts +37 -5
  46. package/dist/config.d.ts +6 -5
  47. package/dist/config.js +35 -24
  48. package/dist/context-window-notice.d.ts +31 -0
  49. package/dist/context-window-notice.js +28 -0
  50. package/dist/deployment-shape.d.ts +20 -11
  51. package/dist/deployment-shape.js +1 -0
  52. package/dist/env-name-allowlist-knobs.d.ts +6 -5
  53. package/dist/env-name-allowlist-knobs.js +5 -0
  54. package/dist/execution-lane-caps.d.ts +20 -5
  55. package/dist/execution-lane-caps.js +18 -4
  56. package/dist/hooks/command-spawn.d.ts +7 -2
  57. package/dist/hooks/command-spawn.js +13 -6
  58. package/dist/hooks/hook-runner.d.ts +5 -0
  59. package/dist/hooks/hook-runner.js +11 -7
  60. package/dist/http/admission.js +3 -3
  61. package/dist/http/approval-sweeps.js +3 -2
  62. package/dist/http/claim-heartbeat.d.ts +3 -3
  63. package/dist/http/claim-heartbeat.js +3 -3
  64. package/dist/http/claimed-run.d.ts +16 -9
  65. package/dist/http/claimed-run.js +8 -0
  66. package/dist/http/dispatch.js +5 -3
  67. package/dist/http/durable-run-leg.d.ts +8 -1
  68. package/dist/http/durable-run-leg.js +30 -11
  69. package/dist/http/execution-context.d.ts +115 -14
  70. package/dist/http/execution-context.js +130 -40
  71. package/dist/http/owner-access.d.ts +3 -2
  72. package/dist/http/owner-access.js +2 -3
  73. package/dist/http/principal-gate.d.ts +18 -11
  74. package/dist/http/principal-gate.js +3 -1
  75. package/dist/http/resume-ctx-read.d.ts +14 -3
  76. package/dist/http/resume-ctx-read.js +8 -2
  77. package/dist/http/resume-legs.d.ts +35 -3
  78. package/dist/http/resume-legs.js +244 -92
  79. package/dist/http/route-ctx.d.ts +6 -0
  80. package/dist/http/routes/a2a-serve.js +2 -0
  81. package/dist/http/routes/approvals-assistant.js +3 -2
  82. package/dist/http/routes/capabilities.js +1 -1
  83. package/dist/http/routes/diagnostics.d.ts +3 -1
  84. package/dist/http/routes/diagnostics.js +30 -5
  85. package/dist/http/routes/principal-inbox.d.ts +3 -1
  86. package/dist/http/routes/principal-inbox.js +3 -2
  87. package/dist/http/routes/runs.js +10 -7
  88. package/dist/http/routes/session-sync.d.ts +24 -5
  89. package/dist/http/routes/session-sync.js +46 -34
  90. package/dist/http/routes/sessions-list.d.ts +1 -1
  91. package/dist/http/routes/tasks.js +127 -93
  92. package/dist/http/server.d.ts +4 -5
  93. package/dist/http/server.js +30 -5
  94. package/dist/http/submit-ctx.d.ts +1 -0
  95. package/dist/http/submit-ctx.js +2 -3
  96. package/dist/index.d.ts +3 -1
  97. package/dist/index.js +1 -0
  98. package/dist/leg-facts.d.ts +7 -2
  99. package/dist/leg-facts.js +1 -0
  100. package/dist/local-store-declaration.d.ts +54 -0
  101. package/dist/local-store-declaration.js +59 -0
  102. package/dist/mcp-assertion-header.d.ts +1 -1
  103. package/dist/mcp-assertion-header.js +1 -1
  104. package/dist/memory-project-layer.js +1 -1
  105. package/dist/memory-scope.d.ts +4 -4
  106. package/dist/memory-scope.js +4 -4
  107. package/dist/memory-sync-client.js +2 -2
  108. package/dist/model-context-window.d.ts +50 -11
  109. package/dist/model-context-window.js +20 -1
  110. package/dist/model-entry-refusal.d.ts +5 -4
  111. package/dist/model-entry-refusal.js +17 -3
  112. package/dist/model-reach-scope.d.ts +2 -1
  113. package/dist/observability/fail-open.d.ts +14 -2
  114. package/dist/observability/fail-open.js +14 -2
  115. package/dist/observability/metrics.js +1 -1
  116. package/dist/observability/run-terminal.js +1 -0
  117. package/dist/observability/secret-env-scrub.d.ts +1 -1
  118. package/dist/observability/secret-env-scrub.js +1 -1
  119. package/dist/org-delivery-gate.d.ts +31 -6
  120. package/dist/org-delivery-gate.js +7 -4
  121. package/dist/owner-faces.d.ts +3 -2
  122. package/dist/park-row-commit.d.ts +67 -0
  123. package/dist/park-row-commit.js +76 -0
  124. package/dist/parked-decide.d.ts +9 -7
  125. package/dist/parked-decide.js +25 -6
  126. package/dist/peer-directory.d.ts +1 -1
  127. package/dist/plugins/adoption-log-sql.d.ts +3 -3
  128. package/dist/plugins/adoption-log-sql.js +19 -19
  129. package/dist/plugins/approval-ask-store-sql.d.ts +1 -1
  130. package/dist/plugins/approval-ask-store-sql.js +3 -5
  131. package/dist/plugins/approval-exemption-skill-cutoff.d.ts +64 -0
  132. package/dist/plugins/approval-exemption-skill-cutoff.js +122 -0
  133. package/dist/plugins/approval-exemption-skill-m46.d.ts +0 -6
  134. package/dist/plugins/approval-exemption-skill-m46.js +6 -10
  135. package/dist/plugins/approval-exemption-store.d.ts +26 -1
  136. package/dist/plugins/approval-exemption-store.js +28 -19
  137. package/dist/plugins/ensure-schema-lock-policy.d.ts +36 -3
  138. package/dist/plugins/ensure-schema-lock-policy.js +75 -9
  139. package/dist/plugins/file-run-store.d.ts +22 -9
  140. package/dist/plugins/file-run-store.js +50 -22
  141. package/dist/plugins/local-checkpoint-store.d.ts +4 -0
  142. package/dist/plugins/local-checkpoint-store.js +2 -1
  143. package/dist/plugins/local-data-root-admission.d.ts +52 -0
  144. package/dist/plugins/local-data-root-admission.js +100 -0
  145. package/dist/plugins/local-engine-high-water.d.ts +28 -7
  146. package/dist/plugins/local-engine-high-water.js +27 -22
  147. package/dist/plugins/local-session-store.d.ts +134 -49
  148. package/dist/plugins/local-session-store.js +149 -108
  149. package/dist/plugins/memory-run-store.d.ts +14 -9
  150. package/dist/plugins/memory-run-store.js +47 -21
  151. package/dist/plugins/one-time-migration-marker.d.ts +19 -3
  152. package/dist/plugins/one-time-migration-marker.js +7 -1
  153. package/dist/plugins/one-time-migrations.d.ts +46 -20
  154. package/dist/plugins/one-time-migrations.js +102 -79
  155. package/dist/plugins/org-delivery-quota-store.d.ts +34 -11
  156. package/dist/plugins/org-delivery-quota-store.js +29 -14
  157. package/dist/plugins/permission-rule-store-sql.d.ts +1 -1
  158. package/dist/plugins/permission-rule-store-sql.js +5 -9
  159. package/dist/plugins/pg-pool.d.ts +1 -1
  160. package/dist/plugins/pg-pool.js +10 -12
  161. package/dist/plugins/remote-env-device.d.ts +3 -2
  162. package/dist/plugins/remote-env-e2b.d.ts +1 -7
  163. package/dist/plugins/remote-env-e2b.js +10 -7
  164. package/dist/plugins/remote-env-host.d.ts +50 -9
  165. package/dist/plugins/remote-env-host.js +77 -20
  166. package/dist/plugins/remote-env-k8s.js +4 -2
  167. package/dist/plugins/remote-env-local-docker.d.ts +6 -3
  168. package/dist/plugins/remote-env-local-docker.js +8 -23
  169. package/dist/plugins/run-store-sql.d.ts +26 -7
  170. package/dist/plugins/run-store-sql.js +44 -16
  171. package/dist/plugins/scenario-prefix-switch-m42.d.ts +3 -1
  172. package/dist/plugins/scenario-prefix-switch-m42.js +4 -3
  173. package/dist/plugins/schema-consistency.d.ts +89 -5
  174. package/dist/plugins/schema-consistency.js +176 -7
  175. package/dist/plugins/schema-drift-sentence.d.ts +6 -5
  176. package/dist/plugins/schema-drift-sentence.js +13 -5
  177. package/dist/plugins/session-placement.d.ts +5 -4
  178. package/dist/plugins/shell-sentinel-owner-m48.d.ts +22 -0
  179. package/dist/plugins/shell-sentinel-owner-m48.js +6 -0
  180. package/dist/plugins/stop-then-start-sentence.d.ts +16 -0
  181. package/dist/plugins/stop-then-start-sentence.js +7 -0
  182. package/dist/plugins/store-backend.d.ts +22 -8
  183. package/dist/plugins/store-backend.js +58 -24
  184. package/dist/plugins/store-contracts.d.ts +33 -3
  185. package/dist/plugins/store-contracts.js +16 -0
  186. package/dist/plugins/tidb-pool.d.ts +11 -6
  187. package/dist/plugins/tidb-pool.js +18 -12
  188. package/dist/plugins/workspace-custody.d.ts +44 -0
  189. package/dist/plugins/workspace-custody.js +47 -0
  190. package/dist/project-identity.d.ts +8 -7
  191. package/dist/project-identity.js +40 -17
  192. package/dist/project-layer-key.d.ts +13 -2
  193. package/dist/project-layer-key.js +9 -1
  194. package/dist/read-deny-floor-notice.d.ts +36 -0
  195. package/dist/read-deny-floor-notice.js +40 -0
  196. package/dist/{plain-string-record.d.ts → request-declaration-disposition.d.ts} +9 -23
  197. package/dist/request-declaration-disposition.js +39 -0
  198. package/dist/run-cancel-card.d.ts +28 -0
  199. package/dist/run-cancel-card.js +19 -0
  200. package/dist/run-cancel-context.d.ts +10 -0
  201. package/dist/run-cancel-context.js +1 -0
  202. package/dist/run-local.js +28 -13
  203. package/dist/runs.d.ts +31 -7
  204. package/dist/runs.js +34 -16
  205. package/dist/security.d.ts +2 -2
  206. package/dist/server-secret-env.d.ts +34 -20
  207. package/dist/server-secret-env.js +61 -18
  208. package/dist/session-agent.d.ts +3 -2
  209. package/dist/session-children-retire.d.ts +6 -3
  210. package/dist/session-children-retire.js +2 -5
  211. package/dist/session-workspace.d.ts +3 -3
  212. package/dist/store-admission.d.ts +33 -0
  213. package/dist/store-admission.js +49 -0
  214. package/dist/store-posture.d.ts +5 -0
  215. package/dist/store-posture.js +18 -1
  216. package/dist/stores-sql/checkpoint-store-sql.d.ts +1 -1
  217. package/dist/stores-sql/checkpoint-store-sql.js +3 -5
  218. package/dist/stores-sql/file-history-store-sql.d.ts +1 -1
  219. package/dist/stores-sql/file-history-store-sql.js +3 -5
  220. package/dist/stores-sql/tool-result-store-sql.d.ts +1 -1
  221. package/dist/stores-sql/tool-result-store-sql.js +4 -6
  222. package/dist/task-a2a.d.ts +3 -8
  223. package/dist/task-a2a.js +25 -27
  224. package/dist/task-cwd.d.ts +23 -7
  225. package/dist/task-cwd.js +3 -0
  226. package/dist/task-mcp.d.ts +3 -3
  227. package/dist/task-mcp.js +1 -1
  228. package/dist/task-settings.js +1 -0
  229. package/dist/terminal.d.ts +2 -0
  230. package/dist/terminal.js +21 -6
  231. package/dist/tool-approval.d.ts +44 -36
  232. package/dist/tool-approval.js +66 -47
  233. package/dist/trace/engine-notice-wire.d.ts +24 -21
  234. package/dist/trace/engine-notice-wire.js +7 -3
  235. package/dist/trace/ledger-sink.d.ts +3 -1
  236. package/dist/trace/project.d.ts +4 -2
  237. package/dist/trace/project.js +8 -7
  238. package/dist/trace/redact.d.ts +12 -0
  239. package/dist/trace/redact.js +5 -1
  240. package/dist/trace/self-minted-wire.d.ts +131 -52
  241. package/dist/trace/self-minted-wire.js +71 -39
  242. package/dist/web-admin-client/apply-effective.js +22 -9
  243. package/docs/error-text-lexicon.json +317 -0
  244. package/package.json +3 -1
  245. package/scripts/embed-minimal.mjs +183 -0
  246. package/wire-changes/server@7.149.0.json +372 -0
  247. package/dist/plain-string-record.js +0 -70
@@ -86,14 +86,14 @@ export declare const RuleOfferSchema: z.ZodUnion<readonly [z.ZodObject<{
86
86
  name: "name";
87
87
  path: "path";
88
88
  host: "host";
89
+ tool: "tool";
90
+ pattern: "pattern";
89
91
  exact: "exact";
90
92
  prefix: "prefix";
91
93
  wildcard: "wildcard";
92
- pattern: "pattern";
93
94
  subpath: "subpath";
94
95
  name_prefix: "name_prefix";
95
96
  subdomain: "subdomain";
96
- tool: "tool";
97
97
  }>;
98
98
  command: z.ZodString;
99
99
  }, z.core.$strict>, z.ZodObject<{
@@ -105,14 +105,14 @@ export declare const RuleOfferSchema: z.ZodUnion<readonly [z.ZodObject<{
105
105
  name: "name";
106
106
  path: "path";
107
107
  host: "host";
108
+ tool: "tool";
109
+ pattern: "pattern";
108
110
  exact: "exact";
109
111
  prefix: "prefix";
110
112
  wildcard: "wildcard";
111
- pattern: "pattern";
112
113
  subpath: "subpath";
113
114
  name_prefix: "name_prefix";
114
115
  subdomain: "subdomain";
115
- tool: "tool";
116
116
  }>;
117
117
  command: z.ZodString;
118
118
  segment: z.ZodString;
@@ -574,15 +574,15 @@ export declare const ApprovalCardSchema: z.ZodObject<{
574
574
  governanceForced: z.ZodOptional<z.ZodLiteral<true>>;
575
575
  rememberRefused: z.ZodOptional<z.ZodLiteral<true>>;
576
576
  approvalCard: z.ZodOptional<z.ZodEnum<{
577
- shell: "shell";
578
- plan: "plan";
579
- skill: "skill";
580
577
  question: "question";
578
+ fetch: "fetch";
581
579
  "file-edit": "file-edit";
582
580
  "file-write": "file-write";
583
581
  "notebook-edit": "notebook-edit";
584
- fetch: "fetch";
582
+ shell: "shell";
583
+ skill: "skill";
585
584
  workflow: "workflow";
585
+ plan: "plan";
586
586
  generic: "generic";
587
587
  "computer-access": "computer-access";
588
588
  "computer-control": "computer-control";
@@ -590,10 +590,10 @@ export declare const ApprovalCardSchema: z.ZodObject<{
590
590
  inputHasBidi: z.ZodOptional<z.ZodLiteral<true>>;
591
591
  allowRuleShadowed: z.ZodOptional<z.ZodArray<z.ZodObject<{
592
592
  member: z.ZodEnum<{
593
- hook: "hook";
594
- skill: "skill";
595
- deployment: "deployment";
596
593
  request: "request";
594
+ deployment: "deployment";
595
+ skill: "skill";
596
+ hook: "hook";
597
597
  persisted: "persisted";
598
598
  }>;
599
599
  entries: z.ZodArray<z.ZodString>;
@@ -606,14 +606,14 @@ export declare const ApprovalCardSchema: z.ZodObject<{
606
606
  name: "name";
607
607
  path: "path";
608
608
  host: "host";
609
+ tool: "tool";
610
+ pattern: "pattern";
609
611
  exact: "exact";
610
612
  prefix: "prefix";
611
613
  wildcard: "wildcard";
612
- pattern: "pattern";
613
614
  subpath: "subpath";
614
615
  name_prefix: "name_prefix";
615
616
  subdomain: "subdomain";
616
- tool: "tool";
617
617
  }>;
618
618
  command: z.ZodString;
619
619
  }, z.core.$strict>, z.ZodObject<{
@@ -625,14 +625,14 @@ export declare const ApprovalCardSchema: z.ZodObject<{
625
625
  name: "name";
626
626
  path: "path";
627
627
  host: "host";
628
+ tool: "tool";
629
+ pattern: "pattern";
628
630
  exact: "exact";
629
631
  prefix: "prefix";
630
632
  wildcard: "wildcard";
631
- pattern: "pattern";
632
633
  subpath: "subpath";
633
634
  name_prefix: "name_prefix";
634
635
  subdomain: "subdomain";
635
- tool: "tool";
636
636
  }>;
637
637
  command: z.ZodString;
638
638
  segment: z.ZodString;
@@ -692,8 +692,8 @@ export declare const ApprovalCardSchema: z.ZodObject<{
692
692
  }, z.core.$strict>>>;
693
693
  personalRuleDotsAbsent: z.ZodOptional<z.ZodCustom<AskEvidenceAbsence, AskEvidenceAbsence>>;
694
694
  }, z.core.$strict>>;
695
- askClass: z.ZodOptional<z.ZodCustom<"mode" | "hook" | "org_rule" | "write_protection" | "target_unresolved" | "content_question" | "ask_rule" | "denial_limit_fallback" | "ancestor" | "dangerous_delete" | "unverifiable_delete" | "unverifiable_shell_text" | "transcript_write" | "rule_unreadable" | "classifier_no_ruling" | "requires_user_interaction" | "cross_boundary" | "operator_forced" | "shell_floor" | "probe" | "write_protection_on_disk" | "tool_marks_mcp" | "tool_marks_a2a" | "policy_rra" | "artifact_shared_read" | "unstated" | "ordinary", "mode" | "hook" | "org_rule" | "write_protection" | "target_unresolved" | "content_question" | "ask_rule" | "denial_limit_fallback" | "ancestor" | "dangerous_delete" | "unverifiable_delete" | "unverifiable_shell_text" | "transcript_write" | "rule_unreadable" | "classifier_no_ruling" | "requires_user_interaction" | "cross_boundary" | "operator_forced" | "shell_floor" | "probe" | "write_protection_on_disk" | "tool_marks_mcp" | "tool_marks_a2a" | "policy_rra" | "artifact_shared_read" | "unstated" | "ordinary">>;
696
- classes: z.ZodOptional<z.ZodArray<z.ZodCustom<"mode" | "hook" | "org_rule" | "write_protection" | "target_unresolved" | "content_question" | "ask_rule" | "denial_limit_fallback" | "ancestor" | "dangerous_delete" | "unverifiable_delete" | "unverifiable_shell_text" | "transcript_write" | "rule_unreadable" | "classifier_no_ruling" | "requires_user_interaction" | "cross_boundary" | "operator_forced" | "shell_floor" | "probe" | "write_protection_on_disk" | "tool_marks_mcp" | "tool_marks_a2a" | "policy_rra" | "artifact_shared_read" | "unstated" | "ordinary", "mode" | "hook" | "org_rule" | "write_protection" | "target_unresolved" | "content_question" | "ask_rule" | "denial_limit_fallback" | "ancestor" | "dangerous_delete" | "unverifiable_delete" | "unverifiable_shell_text" | "transcript_write" | "rule_unreadable" | "classifier_no_ruling" | "requires_user_interaction" | "cross_boundary" | "operator_forced" | "shell_floor" | "probe" | "write_protection_on_disk" | "tool_marks_mcp" | "tool_marks_a2a" | "policy_rra" | "artifact_shared_read" | "unstated" | "ordinary">>>;
695
+ askClass: z.ZodOptional<z.ZodCustom<"hook" | "content_question" | "org_rule" | "ask_rule" | "denial_limit_fallback" | "probe" | "mode" | "write_protection" | "target_unresolved" | "ancestor" | "dangerous_delete" | "unverifiable_delete" | "unverifiable_shell_text" | "transcript_write" | "rule_unreadable" | "classifier_no_ruling" | "requires_user_interaction" | "cross_boundary" | "operator_forced" | "shell_floor" | "write_protection_on_disk" | "tool_marks_mcp" | "tool_marks_a2a" | "policy_rra" | "artifact_shared_read" | "unstated" | "ordinary", "hook" | "content_question" | "org_rule" | "ask_rule" | "denial_limit_fallback" | "probe" | "mode" | "write_protection" | "target_unresolved" | "ancestor" | "dangerous_delete" | "unverifiable_delete" | "unverifiable_shell_text" | "transcript_write" | "rule_unreadable" | "classifier_no_ruling" | "requires_user_interaction" | "cross_boundary" | "operator_forced" | "shell_floor" | "write_protection_on_disk" | "tool_marks_mcp" | "tool_marks_a2a" | "policy_rra" | "artifact_shared_read" | "unstated" | "ordinary">>;
696
+ classes: z.ZodOptional<z.ZodArray<z.ZodCustom<"hook" | "content_question" | "org_rule" | "ask_rule" | "denial_limit_fallback" | "probe" | "mode" | "write_protection" | "target_unresolved" | "ancestor" | "dangerous_delete" | "unverifiable_delete" | "unverifiable_shell_text" | "transcript_write" | "rule_unreadable" | "classifier_no_ruling" | "requires_user_interaction" | "cross_boundary" | "operator_forced" | "shell_floor" | "write_protection_on_disk" | "tool_marks_mcp" | "tool_marks_a2a" | "policy_rra" | "artifact_shared_read" | "unstated" | "ordinary", "hook" | "content_question" | "org_rule" | "ask_rule" | "denial_limit_fallback" | "probe" | "mode" | "write_protection" | "target_unresolved" | "ancestor" | "dangerous_delete" | "unverifiable_delete" | "unverifiable_shell_text" | "transcript_write" | "rule_unreadable" | "classifier_no_ruling" | "requires_user_interaction" | "cross_boundary" | "operator_forced" | "shell_floor" | "write_protection_on_disk" | "tool_marks_mcp" | "tool_marks_a2a" | "policy_rra" | "artifact_shared_read" | "unstated" | "ordinary">>>;
697
697
  fromSubagent: z.ZodOptional<z.ZodLiteral<true>>;
698
698
  sourceSessionId: z.ZodOptional<z.ZodString>;
699
699
  agentId: z.ZodOptional<z.ZodString>;
@@ -708,7 +708,7 @@ export declare const ApprovalCardSchema: z.ZodObject<{
708
708
  }>;
709
709
  words: z.ZodOptional<z.ZodString>;
710
710
  }, z.core.$strict>, z.ZodObject<{
711
- by: z.ZodCustom<"org_rule" | "org_unavailable" | "content_question" | "plan_review" | "ancestor_marked" | "rule_store_unavailable" | "ask_rule" | "denial_limit_fallback" | "shell_gate_tighten" | "safety_tighten" | "policy", "org_rule" | "org_unavailable" | "content_question" | "plan_review" | "ancestor_marked" | "rule_store_unavailable" | "ask_rule" | "denial_limit_fallback" | "shell_gate_tighten" | "safety_tighten" | "policy">;
711
+ by: z.ZodCustom<"content_question" | "plan_review" | "ancestor_marked" | "org_unavailable" | "org_rule" | "rule_store_unavailable" | "ask_rule" | "denial_limit_fallback" | "shell_gate_tighten" | "safety_tighten" | "policy", "content_question" | "plan_review" | "ancestor_marked" | "org_unavailable" | "org_rule" | "rule_store_unavailable" | "ask_rule" | "denial_limit_fallback" | "shell_gate_tighten" | "safety_tighten" | "policy">;
712
712
  words: z.ZodString;
713
713
  }, z.core.$strict>]>>>;
714
714
  delegation: z.ZodOptional<z.ZodObject<{
@@ -752,15 +752,15 @@ export declare const ApprovalCardEnvelopeSchema: z.ZodObject<{
752
752
  governanceForced: z.ZodOptional<z.ZodLiteral<true>>;
753
753
  rememberRefused: z.ZodOptional<z.ZodLiteral<true>>;
754
754
  approvalCard: z.ZodOptional<z.ZodEnum<{
755
- shell: "shell";
756
- plan: "plan";
757
- skill: "skill";
758
755
  question: "question";
756
+ fetch: "fetch";
759
757
  "file-edit": "file-edit";
760
758
  "file-write": "file-write";
761
759
  "notebook-edit": "notebook-edit";
762
- fetch: "fetch";
760
+ shell: "shell";
761
+ skill: "skill";
763
762
  workflow: "workflow";
763
+ plan: "plan";
764
764
  generic: "generic";
765
765
  "computer-access": "computer-access";
766
766
  "computer-control": "computer-control";
@@ -768,10 +768,10 @@ export declare const ApprovalCardEnvelopeSchema: z.ZodObject<{
768
768
  inputHasBidi: z.ZodOptional<z.ZodLiteral<true>>;
769
769
  allowRuleShadowed: z.ZodOptional<z.ZodArray<z.ZodObject<{
770
770
  member: z.ZodEnum<{
771
- hook: "hook";
772
- skill: "skill";
773
- deployment: "deployment";
774
771
  request: "request";
772
+ deployment: "deployment";
773
+ skill: "skill";
774
+ hook: "hook";
775
775
  persisted: "persisted";
776
776
  }>;
777
777
  entries: z.ZodArray<z.ZodString>;
@@ -784,14 +784,14 @@ export declare const ApprovalCardEnvelopeSchema: z.ZodObject<{
784
784
  name: "name";
785
785
  path: "path";
786
786
  host: "host";
787
+ tool: "tool";
788
+ pattern: "pattern";
787
789
  exact: "exact";
788
790
  prefix: "prefix";
789
791
  wildcard: "wildcard";
790
- pattern: "pattern";
791
792
  subpath: "subpath";
792
793
  name_prefix: "name_prefix";
793
794
  subdomain: "subdomain";
794
- tool: "tool";
795
795
  }>;
796
796
  command: z.ZodString;
797
797
  }, z.core.$strict>, z.ZodObject<{
@@ -803,14 +803,14 @@ export declare const ApprovalCardEnvelopeSchema: z.ZodObject<{
803
803
  name: "name";
804
804
  path: "path";
805
805
  host: "host";
806
+ tool: "tool";
807
+ pattern: "pattern";
806
808
  exact: "exact";
807
809
  prefix: "prefix";
808
810
  wildcard: "wildcard";
809
- pattern: "pattern";
810
811
  subpath: "subpath";
811
812
  name_prefix: "name_prefix";
812
813
  subdomain: "subdomain";
813
- tool: "tool";
814
814
  }>;
815
815
  command: z.ZodString;
816
816
  segment: z.ZodString;
@@ -870,8 +870,8 @@ export declare const ApprovalCardEnvelopeSchema: z.ZodObject<{
870
870
  }, z.core.$strict>>>;
871
871
  personalRuleDotsAbsent: z.ZodOptional<z.ZodCustom<AskEvidenceAbsence, AskEvidenceAbsence>>;
872
872
  }, z.core.$strict>>;
873
- askClass: z.ZodOptional<z.ZodCustom<"mode" | "hook" | "org_rule" | "write_protection" | "target_unresolved" | "content_question" | "ask_rule" | "denial_limit_fallback" | "ancestor" | "dangerous_delete" | "unverifiable_delete" | "unverifiable_shell_text" | "transcript_write" | "rule_unreadable" | "classifier_no_ruling" | "requires_user_interaction" | "cross_boundary" | "operator_forced" | "shell_floor" | "probe" | "write_protection_on_disk" | "tool_marks_mcp" | "tool_marks_a2a" | "policy_rra" | "artifact_shared_read" | "unstated" | "ordinary", "mode" | "hook" | "org_rule" | "write_protection" | "target_unresolved" | "content_question" | "ask_rule" | "denial_limit_fallback" | "ancestor" | "dangerous_delete" | "unverifiable_delete" | "unverifiable_shell_text" | "transcript_write" | "rule_unreadable" | "classifier_no_ruling" | "requires_user_interaction" | "cross_boundary" | "operator_forced" | "shell_floor" | "probe" | "write_protection_on_disk" | "tool_marks_mcp" | "tool_marks_a2a" | "policy_rra" | "artifact_shared_read" | "unstated" | "ordinary">>;
874
- classes: z.ZodOptional<z.ZodArray<z.ZodCustom<"mode" | "hook" | "org_rule" | "write_protection" | "target_unresolved" | "content_question" | "ask_rule" | "denial_limit_fallback" | "ancestor" | "dangerous_delete" | "unverifiable_delete" | "unverifiable_shell_text" | "transcript_write" | "rule_unreadable" | "classifier_no_ruling" | "requires_user_interaction" | "cross_boundary" | "operator_forced" | "shell_floor" | "probe" | "write_protection_on_disk" | "tool_marks_mcp" | "tool_marks_a2a" | "policy_rra" | "artifact_shared_read" | "unstated" | "ordinary", "mode" | "hook" | "org_rule" | "write_protection" | "target_unresolved" | "content_question" | "ask_rule" | "denial_limit_fallback" | "ancestor" | "dangerous_delete" | "unverifiable_delete" | "unverifiable_shell_text" | "transcript_write" | "rule_unreadable" | "classifier_no_ruling" | "requires_user_interaction" | "cross_boundary" | "operator_forced" | "shell_floor" | "probe" | "write_protection_on_disk" | "tool_marks_mcp" | "tool_marks_a2a" | "policy_rra" | "artifact_shared_read" | "unstated" | "ordinary">>>;
873
+ askClass: z.ZodOptional<z.ZodCustom<"hook" | "content_question" | "org_rule" | "ask_rule" | "denial_limit_fallback" | "probe" | "mode" | "write_protection" | "target_unresolved" | "ancestor" | "dangerous_delete" | "unverifiable_delete" | "unverifiable_shell_text" | "transcript_write" | "rule_unreadable" | "classifier_no_ruling" | "requires_user_interaction" | "cross_boundary" | "operator_forced" | "shell_floor" | "write_protection_on_disk" | "tool_marks_mcp" | "tool_marks_a2a" | "policy_rra" | "artifact_shared_read" | "unstated" | "ordinary", "hook" | "content_question" | "org_rule" | "ask_rule" | "denial_limit_fallback" | "probe" | "mode" | "write_protection" | "target_unresolved" | "ancestor" | "dangerous_delete" | "unverifiable_delete" | "unverifiable_shell_text" | "transcript_write" | "rule_unreadable" | "classifier_no_ruling" | "requires_user_interaction" | "cross_boundary" | "operator_forced" | "shell_floor" | "write_protection_on_disk" | "tool_marks_mcp" | "tool_marks_a2a" | "policy_rra" | "artifact_shared_read" | "unstated" | "ordinary">>;
874
+ classes: z.ZodOptional<z.ZodArray<z.ZodCustom<"hook" | "content_question" | "org_rule" | "ask_rule" | "denial_limit_fallback" | "probe" | "mode" | "write_protection" | "target_unresolved" | "ancestor" | "dangerous_delete" | "unverifiable_delete" | "unverifiable_shell_text" | "transcript_write" | "rule_unreadable" | "classifier_no_ruling" | "requires_user_interaction" | "cross_boundary" | "operator_forced" | "shell_floor" | "write_protection_on_disk" | "tool_marks_mcp" | "tool_marks_a2a" | "policy_rra" | "artifact_shared_read" | "unstated" | "ordinary", "hook" | "content_question" | "org_rule" | "ask_rule" | "denial_limit_fallback" | "probe" | "mode" | "write_protection" | "target_unresolved" | "ancestor" | "dangerous_delete" | "unverifiable_delete" | "unverifiable_shell_text" | "transcript_write" | "rule_unreadable" | "classifier_no_ruling" | "requires_user_interaction" | "cross_boundary" | "operator_forced" | "shell_floor" | "write_protection_on_disk" | "tool_marks_mcp" | "tool_marks_a2a" | "policy_rra" | "artifact_shared_read" | "unstated" | "ordinary">>>;
875
875
  fromSubagent: z.ZodOptional<z.ZodLiteral<true>>;
876
876
  sourceSessionId: z.ZodOptional<z.ZodString>;
877
877
  agentId: z.ZodOptional<z.ZodString>;
@@ -886,7 +886,7 @@ export declare const ApprovalCardEnvelopeSchema: z.ZodObject<{
886
886
  }>;
887
887
  words: z.ZodOptional<z.ZodString>;
888
888
  }, z.core.$strict>, z.ZodObject<{
889
- by: z.ZodCustom<"org_rule" | "org_unavailable" | "content_question" | "plan_review" | "ancestor_marked" | "rule_store_unavailable" | "ask_rule" | "denial_limit_fallback" | "shell_gate_tighten" | "safety_tighten" | "policy", "org_rule" | "org_unavailable" | "content_question" | "plan_review" | "ancestor_marked" | "rule_store_unavailable" | "ask_rule" | "denial_limit_fallback" | "shell_gate_tighten" | "safety_tighten" | "policy">;
889
+ by: z.ZodCustom<"content_question" | "plan_review" | "ancestor_marked" | "org_unavailable" | "org_rule" | "rule_store_unavailable" | "ask_rule" | "denial_limit_fallback" | "shell_gate_tighten" | "safety_tighten" | "policy", "content_question" | "plan_review" | "ancestor_marked" | "org_unavailable" | "org_rule" | "rule_store_unavailable" | "ask_rule" | "denial_limit_fallback" | "shell_gate_tighten" | "safety_tighten" | "policy">;
890
890
  words: z.ZodString;
891
891
  }, z.core.$strict>]>>>;
892
892
  delegation: z.ZodOptional<z.ZodObject<{
@@ -0,0 +1,33 @@
1
+ /**
2
+ * 一条腿的**审批出处两格**:执行车道 + 这条腿的会话此刻的住客令牌(化身,`session-incarnation.ts`)。
3
+ *
4
+ * 两格都取自装配点手里**同一只**执行上下文(`http/execution-context.ts` 的 `ExecutionContext`:解析器步 ① 那一次行读的住客 + 由此定的车道)。三条提交腿
5
+ * (同步 · 后台 · 续跑)与 parked 赎回腿经 {@link approvalLegOriginOf} 一处读、一处展开进 `ToolApprovalRunContext` / `boundAsk` / `boundUnattendedAsk` /
6
+ * `approverSeatFor` 的身份 —— 出处的新格只在这一处加,不会有哪个装配点漏带。读者:协调器的「本会话放行」进程内表(`tool-approval.ts` `sessionAllowKey`),
7
+ * 键含 {@link ApprovalLegOrigin.incarnation} ⇒ 会话删了再登记(同一个 id、新的一位住客)之后,上一位住客点的放行读不中。
8
+ *
9
+ * 叶模块(只有类型位的 import):装配点的各层模块都从这里取,不经协调器本体,不构成运行时环。
10
+ */
11
+ import type { ExecutionLane } from "./execution-lane-caps.js";
12
+ export interface ApprovalLegOrigin {
13
+ /**
14
+ * 这条腿的执行车道(必填:出处没有车道的问不可表示)—— 每只席的身份都从所在边界的执行上下文铸(`ctx.lane`)。铸入三句:新行 ⇒ 本出处的车道;
15
+ * 既有行命中 / 收养 ⇒ 行上的车道(派生只对新行有意义,既有行一律采信行上的);无问店的活登记 ⇒ 本出处的车道。
16
+ */
17
+ readonly executionLane: ExecutionLane;
18
+ /**
19
+ * 这条腿的会话(`sessionId`)此刻的**住客令牌**(化身,`session-incarnation.ts`)—— 装配点写所在边界执行上下文那一读的住客(`ctx.occupant.incarnation`,
20
+ * 与 {@link executionLane} 同一只上下文、同一次行读;不另读第二次)。出处带化身:「本会话放行」(协调器的进程内授权表)的键含它,读写两点都取这一格
21
+ * (与 `sessionId` 同源同理由随**出处**走,不取投递连接的)⇒ 会话删了再登记(同一个 id、新的一位住客)之后,上一位住客点的放行读不中。
22
+ * 缺席 = 这条腿读不出这位住客(会话店不带执行席 / 腿没有会话):这条腿上**不读也不铸**进程内授权(点 `allow_session` 只放行这一次,回执 `rememberApplied:false`)。
23
+ */
24
+ readonly incarnation?: string;
25
+ }
26
+ /** 执行上下文 → 这条腿的出处两格({@link ApprovalLegOrigin})。形参只取两样(车道、住客),不依赖 http 层的类型。 */
27
+ export declare function approvalLegOriginOf(execution: {
28
+ readonly lane: ExecutionLane;
29
+ readonly occupant?: {
30
+ readonly incarnation: string;
31
+ } | undefined;
32
+ }): ApprovalLegOrigin;
33
+ //# sourceMappingURL=approval-leg-origin.d.ts.map
@@ -0,0 +1,4 @@
1
+ export function approvalLegOriginOf(execution) {
2
+ return { executionLane: execution.lane, ...(execution.occupant !== undefined ? { incarnation: execution.occupant.incarnation } : {}) };
3
+ }
4
+ //# sourceMappingURL=approval-leg-origin.js.map
@@ -58,14 +58,22 @@ type ReportedOutcome = {
58
58
  * (调用方按验证失败处置:不设身份 ⇒ 门答 generic 401)。验证失败的结局验证器自己已记过账,这里只答「不装」。
59
59
  */
60
60
  export declare function admitBridgeIdentity(outcome: ReportedOutcome, sinks: BridgeSinks): BridgeIdentity | undefined;
61
- /** The live object `createWebAdminJwtVerifier` produces — a single `verify` entry point over the process-level JWKS cache. */
61
+ /**
62
+ * The live object `createWebAdminJwtVerifier` produces — a single `verify` entry point over the process-level JWKS cache, and the issuer it verifies for.
63
+ * This is also the type of the injected seat (`ServiceDeps.webAdminJwtVerifier`): an embedder's verifier states which issuer it verifies, so `createHttpServer`
64
+ * can pair it with the config's bridge ("which issuer does this deployment accept" has one source — the config — and one comparison, at that seat).
65
+ */
62
66
  export interface WebAdminJwtVerifier {
67
+ /** The issuer this verifier verifies tokens for, in {@link normalizeBridgeIssuer} form (what the R4 `iss` check compares against). The factory mints it from its own option; the seat compares it with the config's reading. */
68
+ readonly issuer: string;
63
69
  verify: (bearer: string) => Promise<VerifyOutcome>;
64
70
  }
65
71
  /** 缓存键的常规刷新周期缺省(秒):过期后下一发在后台重拉,当前请求不等。 */
66
72
  export declare const DEFAULT_JWKS_TTL_SEC: number;
67
73
  /** 一次 JWKS 拉取的时限(毫秒):kid 未知、超离线宽限、后台刷新三条路用同一只拉取,同一个时限。 */
68
74
  export declare const JWKS_FETCH_TIMEOUT_MS = 10000;
75
+ /** The one normal form of a bridge issuer: trailing slashes folded. The R4 `iss` check compares both sides in this form, and the `createHttpServer` pairing seat compares the verifier's {@link WebAdminJwtVerifier.issuer} with the config's reading in this same form (one reading, so the two can never disagree about what "the same issuer" means). */
76
+ export declare const normalizeBridgeIssuer: (s: string) => string;
69
77
  /**
70
78
  * registry-JWT verifier(单例,进程级 JWKS 缓存)。`verify(bearer)` 全程不 throw——一切异常折为拒因闭集
71
79
  * {@link AuthBridgeRefusal}(HTTP 面由调用方恒答 generic 401,码只进日志/metrics,R9)。
@@ -40,9 +40,9 @@ function b64urlJson(seg) {
40
40
  return undefined;
41
41
  }
42
42
  }
43
- const stripSlash = (s) => s.replace(/\/+$/, "");
43
+ export const normalizeBridgeIssuer = (s) => s.replace(/\/+$/, "");
44
44
  export function createWebAdminJwtVerifier(opts) {
45
- const issuer = stripSlash(opts.issuer);
45
+ const issuer = normalizeBridgeIssuer(opts.issuer);
46
46
  const displayIssuer = buildDisplaySafeUrl(issuer);
47
47
  const jwksUrl = opts.jwksUrl ?? `${issuer}${WEB_ADMIN_JWKS_PATH}`;
48
48
  const clockSkewSec = opts.clockSkewSec ?? DEFAULT_CLOCK_SKEW_SEC;
@@ -122,7 +122,7 @@ export function createWebAdminJwtVerifier(opts) {
122
122
  const kid = typeof header.kid === "string" ? header.kid : undefined;
123
123
  if (!kid)
124
124
  return fail("malformed");
125
- const iss = typeof payload.iss === "string" ? stripSlash(payload.iss) : undefined;
125
+ const iss = typeof payload.iss === "string" ? normalizeBridgeIssuer(payload.iss) : undefined;
126
126
  if (iss !== issuer)
127
127
  return fail("unknown_issuer", kid);
128
128
  if (classifyTimeClaims(payload, Math.floor(now() / 1000), clockSkewSec) !== "ok")
@@ -163,6 +163,6 @@ export function createWebAdminJwtVerifier(opts) {
163
163
  opts.metrics?.inc("auth_bridge_verify_total", { outcome: "ok" });
164
164
  return { ok: true, identity: { ...mapped.identity, scope: scoped.scope } };
165
165
  }
166
- return { verify };
166
+ return { issuer, verify };
167
167
  }
168
168
  //# sourceMappingURL=auth-bridge.js.map
@@ -2,7 +2,8 @@
2
2
  * AUTH KEY-SET parsing ([ref] A4) — the env→key-set decoders for the two D-G credential planes, moved VERBATIM
3
3
  * out of security.ts: {@link parseApprovalHmacKeys} (APPROVAL_HMAC_KEYS — the rotating HMAC secret set, decision
4
4
  * INTEGRITY) and {@link parsePrincipalJwks} (PRINCIPAL_JWT_PUBKEYS — the rotating issuer public-key set, principal
5
- * IDENTITY). config.ts consumes ONLY these two functions + their row types at env-load time, and importing them from
5
+ * IDENTITY), plus {@link parseServiceAuthTokens} (SERVICE_AUTH_TOKENS — the per-system service token table). config.ts consumes
6
+ * these decoders + their row types at env-load time, and importing them from
6
7
  * security.ts made the base config layer value-depend on the whole 55KiB auth module (lens2 §F). This file is a pure
7
8
  * leaf (JSON.parse + shape filters, zero repo imports); the VERIFIERS that consume the parsed key-sets
8
9
  * (verifyApprovalHmac / verifyPrincipalJwt) stay in ./approval-hmac.ts and ./principal-jwt.ts; consumers import these four names from HERE ([ref] 兼容面全清).
@@ -54,4 +55,12 @@ export interface PrincipalJwtKey {
54
55
  * [ref]: fail-closed 语义逐字不变,但每条被丢弃的条目经 `onReject` 报出(序号 + 缺陷字段名,不带值)——
55
56
  * 这里的 key 是**公**钥,但 reason 仍只说字段名,与 HMAC 那条同形(两个出口的口径不该分岔)。 */
56
57
  export declare function parsePrincipalJwks(raw: string | undefined, onReject: OnKeySetRejection): PrincipalJwtKey[];
58
+ /**
59
+ * Parse SERVICE_AUTH_TOKENS — the per-system service credential table, `tok=system` pairs separated by commas (token →
60
+ * system name; the `source` of a run is derived from the token, never self-asserted). Each pair is trimmed and split at
61
+ * its FIRST `=` (a system name may hold `=`); a pair without `=`, or with an empty token or system, is not an entry.
62
+ * THE one reading: `loadConfig` builds `authTokens` from it, and the withheld table declares each token as a credential
63
+ * value of its own (`server-secret-env.ts`) — a copy of one token under another variable name is the same credential.
64
+ */
65
+ export declare function parseServiceAuthTokens(raw: string | undefined): Record<string, string>;
57
66
  //# sourceMappingURL=auth-keys.d.ts.map
package/dist/auth-keys.js CHANGED
@@ -63,4 +63,12 @@ export function parsePrincipalJwks(raw, onReject) {
63
63
  });
64
64
  return out;
65
65
  }
66
+ export function parseServiceAuthTokens(raw) {
67
+ return Object.fromEntries((raw ?? "")
68
+ .split(",")
69
+ .map((s) => s.trim())
70
+ .filter((s) => s.includes("="))
71
+ .map((s) => [s.slice(0, s.indexOf("=")).trim(), s.slice(s.indexOf("=") + 1).trim()])
72
+ .filter(([tok, sys]) => tok.length > 0 && sys.length > 0));
73
+ }
66
74
  //# sourceMappingURL=auth-keys.js.map
@@ -40,7 +40,7 @@ import { sayEgressPolicyReading } from "../sandbox-egress-policy.js";
40
40
  import { sandboxPathEnvSlots, withSandboxPathEnvSlot } from "./deferred-sandbox-path-env.js";
41
41
  import { createLaneHomeAbsenceReporter } from "../lane-home-probe.js";
42
42
  import { buildLaneHomeBootNote, buildLaneHomeClaim, capabilitiesFor, laneIsolated, laneSandboxReadFloorState } from "../execution-lane-caps.js";
43
- import { warnReadDenyFloorUnkept } from "./execution-lane.js";
43
+ import { settleReadDenyFloor } from "./execution-lane.js";
44
44
  import { seatText } from "../trace/exit-seat.js";
45
45
  import { countSessionResidentBackground } from "../session-resident-background.js";
46
46
  function boundedSessionSetter(map, maxEntries) {
@@ -384,22 +384,21 @@ export function createExecutionEnv(ctx) {
384
384
  ...(config.remoteExec.workspaceBase ? { workspaceBase: config.remoteExec.workspaceBase } : {}),
385
385
  ...(config.remoteExec.commandTimeoutMs != null ? { commandTimeoutMs: config.remoteExec.commandTimeoutMs } : {}),
386
386
  ...(hostScheduler ? { scheduler: hostScheduler } : {}),
387
- backgroundShell: config.requirePrincipal !== true,
387
+ backgroundShell: DEPLOYMENT_SHAPE_PREDICATES.backgroundShell.holds(config),
388
388
  };
389
- executionEnvFactory = (ctx) => {
389
+ executionEnvFactory = hostExecutionEnvFactory(hostCfg, (ctx) => {
390
390
  if (ctx.isolation === "worktree")
391
391
  throw hostWorktreeUnwrappedRefusal();
392
392
  const cwd = effectiveHostWorkspace(perSessionCwd.get(ctx.sessionId), ctx);
393
393
  const shellEnv = perSessionShellEnv.get(ctx.sessionId);
394
394
  const inheritEnv = perSessionInheritEnv.get(ctx.sessionId);
395
- const env = hostExecutionEnvFactory({
396
- ...hostCfg,
395
+ return {
397
396
  ...(cwd ? { workspaceDir: cwd } : {}),
398
397
  ...(shellEnv ? { env: shellEnv } : {}),
399
398
  ...(inheritEnv !== undefined ? { inheritEnv } : {}),
400
- })(ctx);
401
- return lspManager && !cwd ? evictLspOnDestroy(env, lspManager) : env;
402
- };
399
+ ...(lspManager && !cwd ? { minted: (env) => void evictLspOnDestroy(env, lspManager) } : {}),
400
+ };
401
+ });
403
402
  }
404
403
  }
405
404
  else if (config.remoteExec.provider === "local-docker") {
@@ -441,14 +440,14 @@ export function createExecutionEnv(ctx) {
441
440
  });
442
441
  }
443
442
  else if (config.remoteExec.provider === "host") {
444
- const gitBaseEnv = new RemoteHostExecutionEnv({ workspaceDir: config.worktreeIsolation.repoRoot, inheritEnv: "all", backgroundShell: config.requirePrincipal !== true, gitBase: true });
443
+ const gitBaseEnv = new RemoteHostExecutionEnv({ workspaceDir: config.worktreeIsolation.repoRoot, inheritEnv: "all", backgroundShell: DEPLOYMENT_SHAPE_PREDICATES.backgroundShell.holds(config), gitBase: true });
445
444
  executionEnvFactory = withWorktreeIsolation(executionEnvFactory, {
446
445
  repoRoot: config.worktreeIsolation.repoRoot,
447
446
  ...(config.worktreeIsolation.allowedRoots ? { allowedRoots: config.worktreeIsolation.allowedRoots } : {}),
448
447
  ...(config.worktreeIsolation.commit ? { commit: config.worktreeIsolation.commit } : {}),
449
448
  baseEnvForGit: gitBaseEnv,
450
449
  rootEnvAt: (dir) => {
451
- const env = new RemoteHostExecutionEnv({ ...homeDirSeat, workspaceDir: dir, backgroundShell: config.requirePrincipal !== true });
450
+ const env = new RemoteHostExecutionEnv({ ...homeDirSeat, workspaceDir: dir, backgroundShell: DEPLOYMENT_SHAPE_PREDICATES.backgroundShell.holds(config) });
452
451
  return lspManager ? evictLspOnDestroy(env, lspManager) : env;
453
452
  },
454
453
  logger,
@@ -501,7 +500,7 @@ export function createExecutionEnv(ctx) {
501
500
  if (config.remoteExec.provider === "host")
502
501
  logger.info("task_inherit_env_honored", { honored: taskInheritEnvRefusal(config) === undefined });
503
502
  }
504
- warnReadDenyFloorUnkept(config, logger);
503
+ settleReadDenyFloor(config, logger);
505
504
  const unreadableReported = new Set();
506
505
  let stallReapFailureReported = false;
507
506
  const stallMs = config.backgroundAgentStallMs;
@@ -58,12 +58,14 @@ export declare function composeDeclaredExecutionLane(loaded: LoadedConfig, logge
58
58
  */
59
59
  export declare function settleHostLaneShell(config: Pick<ServiceConfig, "remoteExec">, logger: Pick<Logger, "info" | "warn">): Promise<void>;
60
60
  /**
61
- * **读地板的起服一行**:部署要求读拒表的字节地板(`READ_DENY_FLOOR_REQUIRED=true`)而最终车道的执行环境块不守 ⇒ 每条读拒表有行的 run 都在准备期拒 ——
62
- * 起服先说清后果与出路(`warn read_deny_floor_required_unkept { provider, note }`;判据与句子的唯一属主 `buildReadDenyFloorUnkeptNote`)。
61
+ * **读拒字节地板在本部署上怎么说** —— 两件事,一个入口:
62
+ * ① 把部署的执行车道装给说法的属主(`read-deny-floor-notice.ts` 的 `installReadDenyFloorDeployment`):每条 run 的通告 / 结果格 / 拒句由它点名 `REMOTE_EXEC=<车道>`;
63
+ * ② 起服一行:部署要求读拒表的字节地板(`READ_DENY_FLOOR_REQUIRED=true`)而最终车道的执行环境块不守 ⇒ 每条读拒表有行的 run 都在准备期拒 ——
64
+ * 起服先说清后果与出路(`warn read_deny_floor_required_unkept { provider, note }`;判据与句子的唯一属主 `buildReadDenyFloorUnkeptNote`,句子 = 每条 run 的拒句)。
63
65
  * 两个入口调同一只(与 {@link settleHostLaneShell} 同形):HTTP 服务在执行环境装配里(`boot/execution-env.ts`,有没有执行环境工厂都调),`run-local` 在宿主车道定下之后 ——
64
- * 旋钮两个入口都递给引擎(`RunnerDeps.readDenyFloorRequired`),所以两个入口都要先说。不要求 / 车道守地板 ⇒ 零动作。
66
+ * 旋钮两个入口都递给引擎(`RunnerDeps.readDenyFloorRequired`),所以两个入口都要先装、先说。不要求 / 车道守地板 ⇒ 不出那一行(装照装:车道名是每条 run 的说法要的)。
65
67
  */
66
- export declare function warnReadDenyFloorUnkept(config: Parameters<typeof buildReadDenyFloorUnkeptNote>[0], logger: Pick<Logger, "warn">): void;
68
+ export declare function settleReadDenyFloor(config: Parameters<typeof buildReadDenyFloorUnkeptNote>[0], logger: Pick<Logger, "warn">): void;
67
69
  /**
68
70
  * 车道合成之后的跨域不变量 —— 表(`config-invariants.ts`)里读 `remoteExec.provider` 的那几条,boot 期 `live === next`。
69
71
  * 同步、纯判据:只读 config,不碰文件(测试可以对 `loadConfig()` 的产物直接调它)。
@@ -3,6 +3,7 @@ import { assertLocalConfigDirTrusted } from "../config-dir-trust.js";
3
3
  import { crossInvariant } from "../config-invariants.js";
4
4
  import { entryDeclarableRemoteExec } from "../config.js";
5
5
  import { ALL_EXECUTION_LANES, buildReadDenyFloorUnkeptNote, laneIsolated, laneWiresExecutionEnv } from "../execution-lane-caps.js";
6
+ import { installReadDenyFloorDeployment } from "../read-deny-floor-notice.js";
6
7
  import { buildReadFacePostureNotice, settleDerivedReadFace } from "../read-face-posture.js";
7
8
  import { settleHostShellAtBoot } from "../plugins/host-platform.js";
8
9
  import { seatText } from "../trace/exit-seat.js";
@@ -70,7 +71,8 @@ export async function settleHostLaneShell(config, logger) {
70
71
  return;
71
72
  await settleHostShellAtBoot(logger);
72
73
  }
73
- export function warnReadDenyFloorUnkept(config, logger) {
74
+ export function settleReadDenyFloor(config, logger) {
75
+ installReadDenyFloorDeployment(config);
74
76
  const note = buildReadDenyFloorUnkeptNote(config);
75
77
  if (note !== undefined)
76
78
  logger.warn("read_deny_floor_required_unkept", { provider: config.remoteExec.provider, note });
@@ -9,7 +9,8 @@
9
9
  * 消费方取自**同一个** `RunnerDeps` 对象(`principalInboxConsumerOf(runnerDeps)`),不从 config 再读一遍(core 契约原句:
10
10
  * 「over the same RunnerDeps the deployment runs its legs with」)。
11
11
  */
12
- import { type MailboxStore, type OrgDeliveryGate, type RunnerDeps } from "@sema-agent/core";
12
+ import { type MailboxStore, type RunnerDeps } from "@sema-agent/core";
13
+ import { type ServerOrgDeliveryGate } from "../org-delivery-gate.js";
13
14
  import type { OrgMemoryDirectory } from "../org-memory-admission.js";
14
15
  import type { StoreBackend } from "../plugins/store-backend.js";
15
16
  import type { Logger } from "../observability/logger.js";
@@ -24,5 +25,5 @@ export interface OrgDeliveryMountInput {
24
25
  readonly logger: Pick<Logger, "info">;
25
26
  }
26
27
  /** 门在座 ⇒ 门;部署没声明消费方 ⇒ `undefined`;声明了而前提缺 ⇒ 抛(拒启)。 */
27
- export declare function mountOrgDeliveryGate(input: OrgDeliveryMountInput): OrgDeliveryGate | undefined;
28
+ export declare function mountOrgDeliveryGate(input: OrgDeliveryMountInput): ServerOrgDeliveryGate | undefined;
28
29
  //# sourceMappingURL=org-delivery.d.ts.map
@@ -17,7 +17,7 @@ import { createSettingsHooksRegistrations, settingsHooksBudgetMs } from "../hook
17
17
  import { headerStr } from "../http/principal-gate.js";
18
18
  import { explicitOperatorOk } from "../http/server.js";
19
19
  import { isAtMentionable, matchCatalogModel, pickUserModel, refusedCatalogEntry, terminalCatalogName } from "../model-select.js";
20
- import { echoModelRef, modelNotAllowedMessage, modelUnavailableMessage } from "../model-entry-refusal.js";
20
+ import { echoModelRef, modelNotAllowedMessage, modelUnavailableMessage, refusedNameLogField } from "../model-entry-refusal.js";
21
21
  import { PerTaskImageRegistry, resolveSandboxImageRef } from "../per-task-image.js";
22
22
  import { remoteScratchpadDirFor } from "../plugins/remote-scratchpad.js";
23
23
  import { attachmentBindRefusalAnswer, bindAttachmentsForTask } from "../plugins/task-attachment-store.js";
@@ -205,7 +205,8 @@ export function createResolveSpec(ctx) {
205
205
  scratchpadDir: folded.scratchpadDir,
206
206
  hostSemanticsLane: folded.hostSemanticsLane,
207
207
  });
208
- return { spec: final, facts: { hands: gated.hands, skills: runSkills.roster, sessionWitness: gated.sessionWitness } };
208
+ const registeredCwd = perSessionCwd.get(root);
209
+ return { spec: final, facts: { hands: gated.hands, skills: runSkills.roster, sessionWitness: gated.sessionWitness, ...(registeredCwd !== undefined ? { registeredCwd } : {}) } };
209
210
  };
210
211
  const gateScenarioAndAppend = async (body, auth, root, opts, settingsEnv) => {
211
212
  const { parts: subjectParts, person } = identityAxesOf(auth);
@@ -302,6 +303,7 @@ export function createResolveSpec(ctx) {
302
303
  logger,
303
304
  sessionId: root,
304
305
  cwd: perSessionCwd.get(root) ?? process.cwd(),
306
+ hookEnvAllow: config.hookEnvAllow,
305
307
  ...(parsedSettings.settings?.shellEnv ? { shellEnv: parsedSettings.settings.shellEnv } : {}),
306
308
  httpHookAllowlistLayers: parsedSettings.settings?.httpHookAllowlist !== undefined ? [parsedSettings.settings.httpHookAllowlist] : [],
307
309
  belowTaskChainPatterns,
@@ -336,7 +338,7 @@ export function createResolveSpec(ctx) {
336
338
  throw new HttpError(400, modelUnavailableMessage(source === "mention" ? "@-mention" : "model", requested, name, refusal), { code: "request.model_unavailable" });
337
339
  }
338
340
  metrics.inc("task_model_unavailable_fallback_total");
339
- logger.warn("task_model_unavailable_fallback", { requested: echoModelRef(requested), name, code: refusal.code, source, fallback: picked.model, sessionId: root });
341
+ logger.warn("task_model_unavailable_fallback", { requested: echoModelRef(requested), ...refusedNameLogField("name", name), code: refusal.code, source, fallback: picked.model, sessionId: root });
340
342
  }
341
343
  if (picked.notAllowed !== undefined) {
342
344
  const { requested, resolved, source } = picked.notAllowed;
@@ -516,7 +518,7 @@ export function createResolveSpec(ctx) {
516
518
  ...(parsedSettings.settings?.skillListingBudgetFraction !== undefined ? { skillListingBudgetFraction: parsedSettings.settings.skillListingBudgetFraction } : {}),
517
519
  ...(parsedSettings.settings?.skillListingMaxDescChars !== undefined ? { skillListingMaxDescChars: parsedSettings.settings.skillListingMaxDescChars } : {}),
518
520
  mcp: resolveRequestMcp(mcpForScenario(config.mcpServers, scenarioName), body.mcpServers, config, peerDesk, opts.lease, logger, opts?.onNotice !== undefined ? { sessionId: root, emit: opts.onNotice } : undefined, storedToolAxes),
519
- a2a: resolveRequestA2a(a2aForScenario(config.a2aPeers, scenarioName), a2aPeers, config, peerDesk, opts.lease, logger, opts?.leg === "fresh" ? "fresh" : "resume", storedToolAxes),
521
+ a2a: resolveRequestA2a(a2aForScenario(config.a2aPeers, scenarioName), a2aPeers, config, peerDesk, opts.lease, logger, storedToolAxes),
520
522
  toolPolicy: toolPolicyForHands(hands, durableEnabled
521
523
  ? createApprovalBaselinePolicy(config, {
522
524
  kind: "durable",
@@ -9,6 +9,7 @@ import { createHardenedVmRunner } from "../orchestration/hardened-vm-runner.js";
9
9
  import { createWorkerHardenedVmRunner } from "../orchestration/hardened-vm-worker-runner.js";
10
10
  import { WorkflowAgentRegistry } from "../orchestration/workflow-agent-steer.js";
11
11
  import { defaultEngineNoticeRouter, redactNoticeMessage, redactNoticeRuleText } from "../trace/engine-notice-wire.js";
12
+ import { presentEngineNotice } from "../read-deny-floor-notice.js";
12
13
  import { WorkflowNotifyGate } from "../orchestration/workflow-notify-journal.js";
13
14
  import { makeLoadProjectMemory, makeProbeInstructionSources } from "../project-memory.js";
14
15
  import { createInstructionSourceSeat } from "../instruction-source-notice.js";
@@ -48,7 +49,8 @@ export const PROMPT_CACHE_BREAK_CAUSE_LEVEL = {
48
49
  const PROMPT_CACHE_BREAK_LEVELS = new Map(Object.entries(PROMPT_CACHE_BREAK_CAUSE_LEVEL));
49
50
  const CEILING_ORIGINS = new Set(["walltime", "turns"]);
50
51
  export function createEngineNoticeForwarder(logger, router = defaultEngineNoticeRouter, metrics) {
51
- return (notice) => {
52
+ return (engineNotice) => {
53
+ const notice = presentEngineNotice(engineNotice);
52
54
  const detail = redactNoticeRuleText(notice.code, notice.detail);
53
55
  const message = redactNoticeMessage(notice.message);
54
56
  logger.warn("engine_notice", { code: notice.code, message, ...(detail !== undefined ? { detail } : {}) });
@@ -1,5 +1,6 @@
1
1
  export declare function runStage01(): {
2
2
  config: import("../config-types.js").LoadedConfig;
3
+ localAdmission: import("../plugins/local-data-root-admission.js").LocalDataRootAdmission | undefined;
3
4
  localRoot: string;
4
5
  logger: import("../observability/logger.js").Logger;
5
6
  metrics: import("../observability/metrics.js").Metrics;
@@ -13,8 +13,9 @@ import { installSecretEnvScrubRecorder } from "../observability/secret-env-scrub
13
13
  import { setRunTerminalLogObserver } from "../observability/run-terminal.js";
14
14
  import { setRedactionObserver } from "../trace/redact.js";
15
15
  import { installOutboundDispatcher } from "../outbound-dispatcher.js";
16
- import { provisionSemaConfigDir } from "../sema-config-dir.js";
17
16
  import { bindOwnCredentialsConfig, declareServerWithheldEnv } from "../server-secret-env.js";
17
+ import { admitLocalDataRoot } from "../plugins/local-data-root-admission.js";
18
+ import { localBackendRootOf } from "../plugins/store-backend.js";
18
19
  import { installDefaultEngineNoticeSeat } from "./runner-deps.js";
19
20
  export function runStage01() {
20
21
  declareServerWithheldEnv();
@@ -62,7 +63,7 @@ export function runStage01() {
62
63
  else
63
64
  logger.info("run_failed", fields);
64
65
  });
65
- provisionSemaConfigDir(config, logger);
66
+ const localAdmission = config.dbBackend === "local" ? admitLocalDataRoot(localBackendRootOf(config)) : undefined;
66
67
  const localRoot = configLocalRoot(config);
67
68
  const rootsSplit = splitLocalRoots({
68
69
  localDataRoot: config.localDataRoot,
@@ -77,6 +78,6 @@ export function runStage01() {
77
78
  });
78
79
  }
79
80
  installOutboundDispatcher(logger);
80
- return { config, localRoot, logger, metrics };
81
+ return { config, localAdmission, localRoot, logger, metrics };
81
82
  }
82
83
  //# sourceMappingURL=stage-01-config.js.map
@@ -4,6 +4,7 @@ export declare function runStage02(ctx: Awaited<ReturnType<typeof runStage01>>):
4
4
  ceilingVerdict: import("./unpriced-ceiling-verdict.js").UnpricedCeilingVerdict;
5
5
  storeEvidence: import("../store-posture.js").StoreEvidence;
6
6
  webAdmin: import("./web-admin.js").WebAdminRuntime;
7
+ localAdmission: import("../plugins/local-data-root-admission.js").LocalDataRootAdmission | undefined;
7
8
  localRoot: string;
8
9
  logger: import("../index.js").Logger;
9
10
  metrics: import("../index.js").Metrics;