@sema-agent/server 7.144.0 → 7.146.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 (305) hide show
  1. package/MIGRATION.md +621 -0
  2. package/README.md +3 -0
  3. package/README.zh-CN.md +1 -0
  4. package/USAGE.md +233 -54
  5. package/deploy/facts/CHANGES.json +25 -0
  6. package/deploy/facts/README.md +57 -0
  7. package/deploy/facts/lanes.json +54 -0
  8. package/deploy/facts/lanes.schema.json +57 -0
  9. package/deploy/facts/sandbox-rbac.json +113 -0
  10. package/deploy/facts/sandbox-rbac.schema.json +74 -0
  11. package/deploy/facts/sealed-key.json +9 -0
  12. package/deploy/facts/sealed-key.schema.json +52 -0
  13. package/deploy/sema-up/chart/templates/_helpers.tpl +19 -0
  14. package/deploy/sema-up/chart/templates/sandbox-rbac.yaml +47 -7
  15. package/deploy/sema-up/chart/templates/server-v4pro.yaml +4 -0
  16. package/deploy/sema-up/chart/templates/server.yaml +4 -0
  17. package/deploy/sema-up/chart/values.yaml +7 -0
  18. package/deploy/sema-up/stack/sema-stack-cluster.yaml +30 -14
  19. package/dist/adoption/import-limits.d.ts +6 -0
  20. package/dist/adoption/import-limits.js +7 -0
  21. package/dist/adoption/import.d.ts +62 -0
  22. package/dist/adoption/import.js +107 -0
  23. package/dist/adoption/wire.d.ts +52 -0
  24. package/dist/adoption/wire.js +9 -0
  25. package/dist/approval-ask-machine.d.ts +2 -2
  26. package/dist/approval-card.d.ts +3 -12
  27. package/dist/approval-card.js +0 -4
  28. package/dist/approval-gate-currency.d.ts +1 -1
  29. package/dist/approval-gate-currency.js +1 -1
  30. package/dist/approval-reconciler.d.ts +1 -1
  31. package/dist/audit.d.ts +2 -21
  32. package/dist/audit.js +0 -9
  33. package/dist/boot/deployment-mods.d.ts +11 -1
  34. package/dist/boot/deployment-mods.js +15 -2
  35. package/dist/boot/device-lane.js +2 -0
  36. package/dist/boot/engine-lease.d.ts +193 -21
  37. package/dist/boot/engine-lease.js +146 -20
  38. package/dist/boot/execution-env.d.ts +4 -0
  39. package/dist/boot/execution-env.js +12 -0
  40. package/dist/boot/exit-boundary.d.ts +50 -0
  41. package/dist/boot/exit-boundary.js +32 -0
  42. package/dist/boot/exit-last.d.ts +20 -4
  43. package/dist/boot/exit-last.js +21 -4
  44. package/dist/boot/governance-seams.js +1 -0
  45. package/dist/boot/memory-consolidation.d.ts +29 -17
  46. package/dist/boot/memory-consolidation.js +26 -15
  47. package/dist/boot/reapers.d.ts +12 -4
  48. package/dist/boot/reapers.js +39 -15
  49. package/dist/boot/resolve-spec.d.ts +2 -0
  50. package/dist/boot/resolve-spec.js +38 -15
  51. package/dist/boot/runner-deps.js +1 -1
  52. package/dist/boot/session-faces.d.ts +1 -1
  53. package/dist/boot/session-faces.js +6 -4
  54. package/dist/boot/shutdown.js +27 -9
  55. package/dist/boot/stage-01-config.js +1 -1
  56. package/dist/boot/stage-03-store-backend.d.ts +1 -0
  57. package/dist/boot/stage-03-store-backend.js +2 -2
  58. package/dist/boot/stage-04-stores.d.ts +1 -0
  59. package/dist/boot/stage-05-execution-env.d.ts +3 -0
  60. package/dist/boot/stage-05-execution-env.js +3 -3
  61. package/dist/boot/stage-06-runners.d.ts +3 -0
  62. package/dist/boot/stage-06-runners.js +11 -10
  63. package/dist/boot/stage-07-capability-layer.d.ts +3 -0
  64. package/dist/boot/stage-07-capability-layer.js +7 -2
  65. package/dist/boot/stage-08-reapers.d.ts +3 -0
  66. package/dist/boot/stage-08-reapers.js +3 -3
  67. package/dist/boot/stage-09-leader.d.ts +4 -1
  68. package/dist/boot/stage-10-http-server.d.ts +4 -1
  69. package/dist/boot/stage-10-http-server.js +4 -3
  70. package/dist/boot/stores.d.ts +1 -0
  71. package/dist/boot/stores.js +35 -19
  72. package/dist/boot/workflow-orchestration.d.ts +1 -1
  73. package/dist/boot/workflow-orchestration.js +2 -1
  74. package/dist/capabilities/composite-members.d.ts +3 -1
  75. package/dist/capabilities/composite-members.js +3 -1
  76. package/dist/capabilities/scenarios.d.ts +2 -2
  77. package/dist/capability-facts.d.ts +18 -1
  78. package/dist/capability-facts.js +25 -7
  79. package/dist/checkpoint-ctx-seal-m28.d.ts +1 -1
  80. package/dist/config-catalog.js +13 -4
  81. package/dist/config-d-migration.d.ts +3 -2
  82. package/dist/config-provider.d.ts +2 -2
  83. package/dist/config-types.d.ts +43 -4
  84. package/dist/config.d.ts +6 -1
  85. package/dist/config.js +67 -11
  86. package/dist/deleted-session-ids.d.ts +19 -0
  87. package/dist/deleted-session-ids.js +26 -0
  88. package/dist/deploy-facts.d.ts +155 -0
  89. package/dist/deploy-facts.js +94 -0
  90. package/dist/device-ws-hub.d.ts +48 -3
  91. package/dist/device-ws-hub.js +48 -2
  92. package/dist/error-code-family.d.ts +35 -0
  93. package/dist/error-code-family.js +26 -0
  94. package/dist/fleet/drain-entry.d.ts +39 -3
  95. package/dist/fleet/drain-entry.js +6 -0
  96. package/dist/fleet/fleet-bus.d.ts +15 -4
  97. package/dist/fleet/fleet-bus.js +17 -3
  98. package/dist/hooks/branch-transcript.d.ts +1 -1
  99. package/dist/hooks/branch-transcript.js +1 -0
  100. package/dist/hooks/classic-stations.d.ts +25 -8
  101. package/dist/hooks/classic-stations.js +29 -3
  102. package/dist/hooks/hook-runner.d.ts +33 -16
  103. package/dist/hooks/hook-runner.js +166 -73
  104. package/dist/hooks/hook-source.d.ts +14 -2
  105. package/dist/hooks/hook-source.js +8 -0
  106. package/dist/http/active-run-conflict.d.ts +1 -1
  107. package/dist/http/active-run-conflict.js +1 -1
  108. package/dist/http/admission.js +13 -2
  109. package/dist/http/checkpoint-ctx.d.ts +60 -71
  110. package/dist/http/checkpoint-ctx.js +35 -40
  111. package/dist/http/dispatch.js +18 -2
  112. package/dist/http/durable-run-leg.d.ts +5 -0
  113. package/dist/http/durable-run-leg.js +8 -6
  114. package/dist/http/execution-context.d.ts +4 -0
  115. package/dist/http/execution-context.js +9 -0
  116. package/dist/http/health-self-report.d.ts +6 -2
  117. package/dist/http/health-self-report.js +3 -2
  118. package/dist/http/memory-compliance-failure-reply.d.ts +1 -1
  119. package/dist/http/memory-compliance-failure-reply.js +2 -15
  120. package/dist/http/memory-control-plane-corrupt-reply.d.ts +25 -0
  121. package/dist/http/memory-control-plane-corrupt-reply.js +19 -0
  122. package/dist/http/principal-gate.d.ts +35 -12
  123. package/dist/http/principal-gate.js +16 -12
  124. package/dist/http/request-guards.d.ts +1 -1
  125. package/dist/http/request-guards.js +5 -5
  126. package/dist/http/resume-legs.d.ts +22 -0
  127. package/dist/http/resume-legs.js +31 -20
  128. package/dist/http/route-ctx.d.ts +26 -10
  129. package/dist/http/route-table.js +2 -0
  130. package/dist/http/routes/adoption.d.ts +11 -0
  131. package/dist/http/routes/adoption.js +80 -6
  132. package/dist/http/routes/agents-roster.js +1 -0
  133. package/dist/http/routes/approvals-assistant.d.ts +20 -1
  134. package/dist/http/routes/approvals-assistant.js +29 -7
  135. package/dist/http/routes/background.js +1 -0
  136. package/dist/http/routes/capabilities.js +4 -1
  137. package/dist/http/routes/diagnostics.d.ts +9 -14
  138. package/dist/http/routes/diagnostics.js +10 -20
  139. package/dist/http/routes/engine.d.ts +31 -0
  140. package/dist/http/routes/engine.js +81 -0
  141. package/dist/http/routes/memory-bundle.js +3 -0
  142. package/dist/http/routes/memory-consolidation.js +3 -5
  143. package/dist/http/routes/memory-origin.d.ts +1 -1
  144. package/dist/http/routes/memory-origin.js +2 -4
  145. package/dist/http/routes/memory-policy.js +5 -1
  146. package/dist/http/routes/observability.js +3 -6
  147. package/dist/http/routes/rules.d.ts +1 -1
  148. package/dist/http/routes/rules.js +5 -2
  149. package/dist/http/routes/runs.js +7 -3
  150. package/dist/http/routes/session-sync.js +24 -25
  151. package/dist/http/routes/sessions-list.d.ts +1 -1
  152. package/dist/http/routes/sessions.js +4 -0
  153. package/dist/http/routes/tasks.js +35 -14
  154. package/dist/http/routes/trace-usage.js +1 -1
  155. package/dist/http/run-concurrency-cap.d.ts +86 -0
  156. package/dist/http/run-concurrency-cap.js +54 -0
  157. package/dist/http/run-meta.d.ts +14 -7
  158. package/dist/http/run-meta.js +5 -2
  159. package/dist/http/server.d.ts +27 -16
  160. package/dist/http/server.js +21 -3
  161. package/dist/http/stored-body-replay.d.ts +9 -6
  162. package/dist/http/stored-body-replay.js +19 -5
  163. package/dist/http/submit-ctx.d.ts +12 -0
  164. package/dist/http/submit-ctx.js +23 -0
  165. package/dist/http/wire-types.d.ts +8 -3
  166. package/dist/json-body-limit.d.ts +8 -0
  167. package/dist/json-body-limit.js +2 -0
  168. package/dist/leader/diffout.d.ts +1 -1
  169. package/dist/local-data-root.d.ts +2 -2
  170. package/dist/memory-operator-faces.d.ts +9 -4
  171. package/dist/memory-scope-stores.d.ts +9 -7
  172. package/dist/memory-scope-stores.js +3 -14
  173. package/dist/memory-scope.d.ts +36 -0
  174. package/dist/memory-scope.js +32 -1
  175. package/dist/net-address.d.ts +53 -0
  176. package/dist/net-address.js +111 -0
  177. package/dist/observability/fail-open.d.ts +28 -12
  178. package/dist/observability/fail-open.js +28 -12
  179. package/dist/orchestration/workflow-notify-journal.js +2 -3
  180. package/dist/org-delivery-gate.js +1 -1
  181. package/dist/peer-directory.d.ts +6 -12
  182. package/dist/peer-directory.js +5 -1
  183. package/dist/plugins/approval-ask-store-file.d.ts +16 -2
  184. package/dist/plugins/approval-ask-store-file.js +21 -1
  185. package/dist/plugins/approval-ask-store-memory.d.ts +8 -2
  186. package/dist/plugins/approval-ask-store-memory.js +11 -8
  187. package/dist/plugins/caching-session-store.d.ts +6 -1
  188. package/dist/plugins/caching-session-store.js +6 -0
  189. package/dist/plugins/checkpoint-store-face.d.ts +426 -0
  190. package/dist/plugins/checkpoint-store-face.js +152 -0
  191. package/dist/plugins/file-run-store.d.ts +13 -7
  192. package/dist/plugins/file-run-store.js +12 -13
  193. package/dist/plugins/fork-routing-session-store.d.ts +6 -2
  194. package/dist/plugins/fork-routing-session-store.js +2 -2
  195. package/dist/plugins/imported-layer-root-retirement.d.ts +10 -8
  196. package/dist/plugins/local-checkpoint-store.d.ts +16 -5
  197. package/dist/plugins/local-checkpoint-store.js +25 -6
  198. package/dist/plugins/local-session-store.d.ts +80 -21
  199. package/dist/plugins/local-session-store.js +79 -22
  200. package/dist/plugins/memory-engine-pg.d.ts +29 -6
  201. package/dist/plugins/memory-engine-pg.js +96 -214
  202. package/dist/plugins/memory-engine-sql-apply.d.ts +121 -0
  203. package/dist/plugins/memory-engine-sql-apply.js +358 -0
  204. package/dist/plugins/memory-engine-tidb.d.ts +35 -9
  205. package/dist/plugins/memory-engine-tidb.js +97 -227
  206. package/dist/plugins/memory-key-guards.d.ts +1 -1
  207. package/dist/plugins/memory-origin-law.d.ts +3 -3
  208. package/dist/plugins/memory-run-store.d.ts +2 -0
  209. package/dist/plugins/memory-run-store.js +6 -0
  210. package/dist/plugins/one-time-migrations.d.ts +32 -56
  211. package/dist/plugins/one-time-migrations.js +27 -119
  212. package/dist/plugins/permission-rule-store-file.d.ts +17 -3
  213. package/dist/plugins/permission-rule-store-file.js +8 -1
  214. package/dist/plugins/pg-pool.js +1 -1
  215. package/dist/plugins/pg-session-storage.d.ts +17 -4
  216. package/dist/plugins/pg-session-storage.js +8 -4
  217. package/dist/plugins/run-store-sql.d.ts +4 -0
  218. package/dist/plugins/run-store-sql.js +5 -2
  219. package/dist/plugins/schema-ensure-legs.js +2 -2
  220. package/dist/plugins/session-fork.d.ts +31 -9
  221. package/dist/plugins/session-fork.js +3 -2
  222. package/dist/plugins/session-placement.d.ts +4 -2
  223. package/dist/plugins/session-store.d.ts +1 -1
  224. package/dist/plugins/sql-json-column.d.ts +5 -1
  225. package/dist/plugins/store-backend.d.ts +11 -8
  226. package/dist/plugins/store-backend.js +8 -7
  227. package/dist/plugins/store-contracts.d.ts +1 -11
  228. package/dist/plugins/store-contracts.js +0 -9
  229. package/dist/plugins/store-sweep.d.ts +63 -0
  230. package/dist/plugins/store-sweep.js +48 -0
  231. package/dist/plugins/tidb-pool.js +1 -1
  232. package/dist/plugins/tidb-session-store.d.ts +16 -3
  233. package/dist/plugins/tidb-session-store.js +8 -4
  234. package/dist/prompt-screen.d.ts +18 -0
  235. package/dist/prompt-screen.js +5 -0
  236. package/dist/rules-consent.d.ts +56 -51
  237. package/dist/rules-consent.js +86 -14
  238. package/dist/run-acceptance.d.ts +40 -10
  239. package/dist/run-acceptance.js +38 -5
  240. package/dist/run-cancel-context.d.ts +4 -1
  241. package/dist/run-cancel-context.js +2 -1
  242. package/dist/runs.js +2 -2
  243. package/dist/sandbox-egress-policy.js +6 -11
  244. package/dist/sandbox-rbac-rules.d.ts +88 -0
  245. package/dist/sandbox-rbac-rules.js +80 -0
  246. package/dist/sealed-key-layout.d.ts +17 -0
  247. package/dist/sealed-key-layout.js +4 -0
  248. package/dist/sealed-key.js +5 -5
  249. package/dist/security.d.ts +48 -9
  250. package/dist/security.js +9 -2
  251. package/dist/session-agent.d.ts +39 -0
  252. package/dist/session-agent.js +16 -0
  253. package/dist/session-error-wire.d.ts +4 -4
  254. package/dist/session-notify-door.d.ts +5 -3
  255. package/dist/session-resident-background.d.ts +57 -0
  256. package/dist/session-resident-background.js +20 -0
  257. package/dist/session-sync-kernel.d.ts +53 -14
  258. package/dist/session-sync-kernel.js +70 -1
  259. package/dist/session-sync.d.ts +5 -3
  260. package/dist/session-workspace.d.ts +1 -0
  261. package/dist/session-workspace.js +1 -0
  262. package/dist/sighup-idle.d.ts +9 -7
  263. package/dist/sighup-idle.js +4 -5
  264. package/dist/spec-fields.d.ts +16 -0
  265. package/dist/spec-fields.js +7 -0
  266. package/dist/stored-request-env-credentials-m38.d.ts +3 -0
  267. package/dist/stored-request-env-credentials-m38.js +8 -0
  268. package/dist/stored-request-prompt-profile-m30.d.ts +1 -1
  269. package/dist/{plugins → stores-sql}/checkpoint-store-sql.d.ts +33 -429
  270. package/dist/{plugins → stores-sql}/checkpoint-store-sql.js +70 -209
  271. package/dist/{plugins → stores-sql}/mailbox-store-sql.d.ts +2 -2
  272. package/dist/{plugins → stores-sql}/mailbox-store-sql.js +4 -4
  273. package/dist/{plugins → stores-sql}/roster-store-sql.d.ts +2 -2
  274. package/dist/{plugins → stores-sql}/roster-store-sql.js +1 -1
  275. package/dist/{plugins → stores-sql}/tool-result-store-sql.d.ts +2 -2
  276. package/dist/{plugins → stores-sql}/tool-result-store-sql.js +6 -6
  277. package/dist/{plugins → stores-sql}/workflow-journal-store-sql.d.ts +7 -12
  278. package/dist/{plugins → stores-sql}/workflow-journal-store-sql.js +3 -8
  279. package/dist/task-settings.d.ts +59 -4
  280. package/dist/task-settings.js +50 -4
  281. package/dist/tool-approval.d.ts +2 -2
  282. package/dist/trace/core-keyset-guard.d.ts +8 -7
  283. package/dist/trace/engine-notice-wire.d.ts +1 -1
  284. package/dist/trace/engine-notice-wire.js +2 -0
  285. package/dist/trace/exit-seat.d.ts +6 -0
  286. package/dist/trace/exit-seat.js +1 -0
  287. package/dist/trace/model-segment.d.ts +3 -2
  288. package/dist/trace/model-segment.js +16 -8
  289. package/dist/trace/project.js +9 -0
  290. package/dist/trace/redact.d.ts +79 -4
  291. package/dist/trace/redact.js +523 -123
  292. package/dist/trace/self-minted-wire.d.ts +391 -1
  293. package/dist/trace/self-minted-wire.js +145 -0
  294. package/dist/trace/wire-projection-faces.d.ts +1 -1
  295. package/dist/trace/wire-projection-faces.js +1 -1
  296. package/dist/usage-analytics.d.ts +4 -0
  297. package/package.json +12 -4
  298. package/scripts/drain-check-local.mjs +8 -29
  299. package/scripts/drain-check.mysql.sql +3 -24
  300. package/scripts/drain-check.pg.sql +3 -24
  301. package/skills/update-config.md +1 -1
  302. package/wire-changes/server@7.145.0.json +146 -0
  303. package/wire-changes/server@7.146.0.json +3221 -0
  304. package/dist/approval-batch-census.d.ts +0 -27
  305. package/dist/approval-batch-census.js +0 -27
@@ -13,7 +13,7 @@ import { assertGuardPatternsUsable, buildApprovalGrantNotice, buildOnlySensitive
13
13
  import { createDeploymentListExemption, gateIntentUnserviceableReason, singleUserAutoAcceptBaselineApplies } from "../approval.js";
14
14
  import { acceptShellScratchpadDir, buildEnvFacts, egressForRemoteExec, ensureScratchpadDir, resumeFactsForLane, scratchpadCoveringTaskRoot } from "../env-facts.js";
15
15
  import { FleetEventBus } from "../fleet/fleet-bus.js";
16
- import { createSettingsHooksRegistration, settingsHooksBudgetMs } from "../hooks/hook-runner.js";
16
+ import { createSettingsHooksRegistrations, settingsHooksBudgetMs } from "../hooks/hook-runner.js";
17
17
  import { HOST_POSTURE_REFUSED_CODE, permissionModeWriteFaceRefusal, taskInheritEnvRefusal } from "../hosted-posture.js";
18
18
  import { headerStr } from "../http/principal-gate.js";
19
19
  import { explicitOperatorOk } from "../http/server.js";
@@ -33,7 +33,7 @@ import { memorySpecForRequest } from "../memory-scope.js";
33
33
  import { createMemoryProjectLayers } from "../memory-project-layer.js";
34
34
  import { inheritEnvFacts, inheritEnvFieldIssue, singleMemberOffFieldIssue } from "../request-value-closure.js";
35
35
  import { a2aForScenario, mcpForScenario } from "../web-admin-client/facade.js";
36
- import { normalizeAttachments, normalizeResilience, normalizeResumeAtMode, normalizeSuggestNextPrompts, promptLeanSpecFragment, resolveTaskLimits, retainBackgroundProcessesFromBody, taskAgentsSpecFragment, toolMaterializeStrategyFromBody, allowToolsSpecFragment, toolNameListFromBody } from "../spec-fields.js";
36
+ import { compactionSpecFragment, normalizeAttachments, normalizeResilience, normalizeResumeAtMode, normalizeSuggestNextPrompts, promptLeanSpecFragment, resolveTaskLimits, retainBackgroundProcessesFromBody, taskAgentsSpecFragment, toolMaterializeStrategyFromBody, allowToolsSpecFragment, toolNameListFromBody } from "../spec-fields.js";
37
37
  import { isAbsoluteHostPath } from "@sema-agent/settings-schema";
38
38
  import { effectiveHostWorkspace, parseAdditionalDirectories, satisfiedByProcessCwd, shellEnvMismatchCount } from "../task-cwd.js";
39
39
  import { DEPLOYMENT_SHAPE_PREDICATES } from "../deployment-shape.js";
@@ -43,7 +43,9 @@ import { assertRequestMcpEntries, assertRequestMcpUnlocked, resolveRequestMcp }
43
43
  import { GOVERNANCE_HTTP_STATUS } from "../governance-http-status.js";
44
44
  import { storedToolAxesRereadM19 } from "../stored-request-tool-axes-m19.js";
45
45
  import { storedHooksRereadM20 } from "../stored-request-hooks-m20.js";
46
- import { MAX_SETTINGS_OUTPUT_STYLE_CHARS, REQUEST_SETTINGS_REFUSAL_PREFIX, SETTINGS_RULE_REFUSAL_CODE, SettingsRuleRefusalError, acceptAppendSystemPrompt, applyTaskSettings, createWorkflowAskPolicy, effectivePermissionMode, effectiveThinking, parseTaskSettings, taskHooksHonored, settingsPermissionBucketIssue } from "../task-settings.js";
46
+ import { storedEnvCredentialsDropM38 } from "../stored-request-env-credentials-m38.js";
47
+ import { serverCredentialValueSources } from "../server-secret-env.js";
48
+ import { MAX_SETTINGS_OUTPUT_STYLE_CHARS, REQUEST_SETTINGS_REFUSAL_PREFIX, SETTINGS_RULE_REFUSAL_CODE, SettingsRuleRefusalError, acceptAppendSystemPrompt, applyTaskSettings, createWorkflowAskPolicy, effectivePermissionMode, effectiveThinking, parseTaskSettings, readSettingsEnv, taskHooksHonored, settingsEnvCredentialIssue, settingsPermissionBucketIssue, withoutKeys } from "../task-settings.js";
47
49
  import { tightenOnlySeatIssue } from "../tighten-only-seats.js";
48
50
  import { entryProblemsFacts } from "../entry-problems.js";
49
51
  import { inertToolListEntryOf } from "../rule-entry-list.js";
@@ -59,7 +61,7 @@ function unrooted(spec) {
59
61
  return resolved;
60
62
  }
61
63
  export function createResolveSpec(ctx) {
62
- const { config, logger, metrics, localRoot, scenarios, principalCaps, centerRuntimeCapsResolver, getKeyResolver, taskAttachmentStore, perSessionCwd, setSessionCwd, setSessionShellEnv, fenceSessionOwner, hookLlm, hookAgent, fleetBus, hookWakeBus, resumeAnchorStore, ownerAware, taskLimitCaps, taskTimeoutSec, selectEnvTool, sendUserFileToolSpec, memoryEngine, memorySyncRunner, durableEnabled, approvalExemptionStore, checkpointStore, imageIndex, perTaskImage, sessionEnvSelection, liveQuestionFace, approverSeat, lockedKeys, loadedSkills, peerDesk, } = ctx;
64
+ const { config, logger, metrics, localRoot, scenarios, principalCaps, centerRuntimeCapsResolver, getKeyResolver, taskAttachmentStore, perSessionCwd, setSessionCwd, setSessionShellEnv, fenceSessionOwner, hookLlm, hookAgent, belowTaskChainPatterns, fleetBus, hookWakeBus, resumeAnchorStore, ownerAware, taskLimitCaps, taskTimeoutSec, selectEnvTool, sendUserFileToolSpec, memoryEngine, memorySyncRunner, durableEnabled, approvalExemptionStore, checkpointStore, imageIndex, perTaskImage, sessionEnvSelection, liveQuestionFace, approverSeat, lockedKeys, loadedSkills, peerDesk, } = ctx;
63
65
  const deploymentSkillSources = new Map(loadedSkills.map((k) => [k.spec.name, k.source]));
64
66
  const scenarioGate = createScenarioGate({ config, scenarios, principalCaps, logger }, "enforce");
65
67
  const sessionHeadOf = headReadOf(ownerAware);
@@ -138,6 +140,26 @@ export function createResolveSpec(ctx) {
138
140
  if (seatIssue)
139
141
  throw new HttpError(400, seatIssue.message, { code: "request.field_invalid", extra: seatIssue.fields });
140
142
  }
143
+ let settingsEnv = readSettingsEnv(body.settings);
144
+ {
145
+ const envIssue = settingsEnvCredentialIssue(settingsEnv.reaching, serverCredentialValueSources(config.modelApiKeyEnv));
146
+ if (envIssue !== null) {
147
+ if (opts?.leg !== "fresh" && storedEnvCredentialsDropM38(new Date().toISOString().slice(0, 10))) {
148
+ settingsEnv = withoutKeys(settingsEnv, envIssue.keys);
149
+ const dropped = { name: 0, value_shape: 0 };
150
+ for (const e of envIssue.fields.entries)
151
+ dropped[e.match]++;
152
+ logger.warn("settings_env_credentials_dropped", {
153
+ migration: "M38",
154
+ sessionId: auth?.sessionId ?? null,
155
+ dropped,
156
+ note: "this replayed request was stored before the upgrade and its settings.env carries credentials (a credential variable name of this engine, or a value shaped like a secret); while one-time migration M38 is open they are dropped from what the session's shell and hooks receive and the task resumes — the engine's own credentials come from its process environment and are unaffected; once the window closes the same request is refused",
157
+ });
158
+ }
159
+ else
160
+ throw createCodedHttpError(400, "request.env_credential_refused", envIssue.message, { ...envIssue.fields });
161
+ }
162
+ }
141
163
  {
142
164
  const replay = opts?.leg === "resume";
143
165
  const inertList = inertToolListEntryOf(body, replay ? ["deny"] : undefined);
@@ -159,7 +181,7 @@ export function createResolveSpec(ctx) {
159
181
  assertRequestA2aEntries(a2aPeers);
160
182
  if (opts?.leg === "fresh")
161
183
  assertRequestImageUrls(body.images);
162
- const gated = await gateScenarioAndAppend(body, auth, opts);
184
+ const gated = await gateScenarioAndAppend(body, auth, opts, settingsEnv);
163
185
  const effMode = effectivePermissionMode(body, gated.parsedSettings.settings);
164
186
  {
165
187
  const why = permissionModeWriteFaceRefusal(effMode, config);
@@ -179,7 +201,7 @@ export function createResolveSpec(ctx) {
179
201
  });
180
202
  return { spec: final, facts: { hands: gated.hands, skills: runSkills.roster, sessionWitness: gated.sessionWitness } };
181
203
  };
182
- const gateScenarioAndAppend = async (body, auth, opts) => {
204
+ const gateScenarioAndAppend = async (body, auth, opts, settingsEnv) => {
183
205
  const scenarioName = await scenarioGate(auth?.principal, body.scenario);
184
206
  const root = opts.execution.root;
185
207
  const rootFace = sessionHeadOf === undefined ? undefined : sessionFaceOfHead(root, await sessionHeadOf(root));
@@ -187,7 +209,10 @@ export function createResolveSpec(ctx) {
187
209
  const cap = selectScenario(scenarios, scenarioName)(body, auth?.principal, { sessionId: sessionWitness.sessionId, delegationRoot: sessionWitness });
188
210
  const acceptedAppend = acceptAppendSystemPrompt(body.appendSystemPrompt, (detail) => logger.warn("append_system_prompt_dropped", { detail, sessionId: auth?.sessionId ?? null }));
189
211
  const objective = typeof body.objective === "string" ? body.objective : "";
190
- const parsedSettings = parseTaskSettings(body.settings, opts?.leg === "fresh" || !taskHooksHonored(config) ? {} : { storedHooksReread: storedHooksRereadM20(new Date().toISOString().slice(0, 10)) });
212
+ const parsedSettings = parseTaskSettings(body.settings, {
213
+ ...(opts?.leg === "fresh" || !taskHooksHonored(config) ? {} : { storedHooksReread: storedHooksRereadM20(new Date().toISOString().slice(0, 10)) }),
214
+ settingsEnv,
215
+ });
191
216
  if (parsedSettings.deferred.length > 0) {
192
217
  logger.warn("task_settings_deferred", { fields: parsedSettings.deferred, sessionId: auth?.sessionId ?? null });
193
218
  }
@@ -275,17 +300,18 @@ export function createResolveSpec(ctx) {
275
300
  const taskHooks = (() => {
276
301
  const hc = parsedSettings.settings?.hooks;
277
302
  if (!hc)
278
- return undefined;
303
+ return [];
279
304
  if (!taskHooksHonored(config)) {
280
305
  logger.warn("task_hooks_ignored", { honored: false, sessionId: auth?.sessionId ?? null });
281
- return undefined;
306
+ return [];
282
307
  }
283
- return createSettingsHooksRegistration(hc, {
308
+ return createSettingsHooksRegistrations(hc, {
284
309
  logger,
285
310
  sessionId: auth?.sessionId ?? "",
286
311
  cwd: (auth?.sessionId ? perSessionCwd.get(auth.sessionId) : undefined) ?? process.cwd(),
287
312
  ...(parsedSettings.settings?.shellEnv ? { shellEnv: parsedSettings.settings.shellEnv } : {}),
288
313
  httpHookAllowlistLayers: parsedSettings.settings?.httpHookAllowlist !== undefined ? [parsedSettings.settings.httpHookAllowlist] : [],
314
+ belowTaskChainPatterns,
289
315
  hookLlm,
290
316
  hookAgent,
291
317
  onHookNotice: (n) => fleetBus.publishHookNotice({
@@ -392,10 +418,7 @@ export function createResolveSpec(ctx) {
392
418
  images: body.images,
393
419
  ...(body.userAttachments !== undefined ? { userAttachments: body.userAttachments } : {}),
394
420
  ...(body.clientContext ? { clientContext: { timeZone: body.clientContext.timeZone, userEmail: body.clientContext.userEmail } } : {}),
395
- ...(() => {
396
- const ct = body.compaction?.clampTolerance;
397
- return typeof ct === "number" && Number.isFinite(ct) && ct >= 0 && ct <= 1 ? { compaction: { clampTolerance: ct } } : {};
398
- })(),
421
+ ...compactionSpecFragment(body.compaction?.clampTolerance, parsedSettings.settings?.autoCompactEnabled),
399
422
  outputSchema: body.outputSchema,
400
423
  ...(typeof body.outputRetries === "number" && Number.isFinite(body.outputRetries) && body.outputRetries >= 1
401
424
  ? { outputRetries: Math.min(10, Math.floor(body.outputRetries)) }
@@ -433,7 +456,7 @@ export function createResolveSpec(ctx) {
433
456
  resilience: normalizeResilience(body.resilience, explicitOperatorOk(auth?.principal, config)),
434
457
  finalVerification: cap.finalVerification === true || body.finalVerification === true ? true : undefined,
435
458
  attachments: normalizeAttachments(body.attachments),
436
- ...(taskHooks ? { mods: [taskHooks] } : {}),
459
+ ...(taskHooks.length > 0 ? { mods: [...taskHooks] } : {}),
437
460
  model: picked.model,
438
461
  ...((() => {
439
462
  if (typeof body.compactionModel !== "string" || body.compactionModel.length === 0)
@@ -144,7 +144,7 @@ export function createSharedRunnerDeps(ctx) {
144
144
  }
145
145
  export function createRunnerDeps(ctx) {
146
146
  const { config, logger, metrics, localRoot, outcomeSink, elicitation, question, toolApproval, sessionStore, memoryEngine, sessionCaptureRecords, memorySyncRunner, runtimeCapsResolver, fileHistoryStore, permissionRuleStore, fleetBus, workflowRunStore, workflowJournalStore, workflowAgentRegistry, workflowNotifyGate, deliverWorkflowCompletion, } = ctx;
147
- const peerSessionLister = sessionStore.listSessions?.bind(sessionStore);
147
+ const peerSessionLister = sessionStore.listSessionRows?.bind(sessionStore);
148
148
  const memoryEngineIncident = createMemoryEngineIncidentSink({ logger, metrics });
149
149
  const sharedRunnerDeps = createSharedRunnerDeps(ctx);
150
150
  const workflowModelAllowlist = workflowModelAllowlistFor(config);
@@ -66,7 +66,7 @@ export interface SessionFacesCtx {
66
66
  export declare function createSessionFaces(ctx: SessionFacesCtx): {
67
67
  ownerAware: OwnerAwareSessionStore;
68
68
  sessionAudit: ((sessionId: string, opts?: SessionAuditReadOpts) => Promise<{
69
- agent?: import("../audit.js").SessionAgent | undefined;
69
+ agent?: import("../session-agent.js").SessionAgent | undefined;
70
70
  owner: string | null;
71
71
  sessionId: string;
72
72
  createdAt: string;
@@ -1,4 +1,5 @@
1
- import { buildRewindHandles, buildSessionAudit, buildSessionAuditLocal, buildSessionAuditPg, sessionAgentOf } from "../audit.js";
1
+ import { buildRewindHandles, buildSessionAudit, buildSessionAuditLocal, buildSessionAuditPg } from "../audit.js";
2
+ import { readSessionAgent } from "../session-agent.js";
2
3
  import { makeDegenerateInstrument } from "../degenerate-instrument.js";
3
4
  import { PlanCacheProbe } from "../plan-cache-probe.js";
4
5
  import { purgeScratchpadDir } from "../env-facts.js";
@@ -11,6 +12,7 @@ import { probeSessionChildren, retireSessionChildren, sessionChildrenScope, Sess
11
12
  import { SessionActiveRunError } from "../execution-placement.js";
12
13
  import { headReadOf, redactIncarnations } from "../session-incarnation.js";
13
14
  import { recordFailOpen } from "../observability/fail-open.js";
15
+ import { retireSessionId } from "../deleted-session-ids.js";
14
16
  import { seatText } from "../trace/exit-seat.js";
15
17
  export function createSessionFaces(ctx) {
16
18
  const { config, logger, metrics, localRoot, backend, sessionStore, runStore, checkpointStore, toolResultStore, resumeAnchorStore, approvalExemptionStore, sessionPolicyStore, taskAttachmentStore, fileHistoryErasure, workflowCompletionInbox, taskListLane, dropSessionScoped, mailboxStore, mailboxRecipientLifecycle, backgroundAgentStore, userInputLedgerStore, spaceReclaimer, } = ctx;
@@ -29,9 +31,8 @@ export function createSessionFaces(ctx) {
29
31
  : await buildSessionAuditLocal(auditLocalRows, sessionId, handles);
30
32
  if (!audit)
31
33
  return undefined;
32
- const [head, placement] = await Promise.all([headOf?.(sessionId), opts !== undefined ? ownerAware.placementOf?.(sessionId) : undefined]);
34
+ const [head, agent] = await Promise.all([headOf?.(sessionId), opts !== undefined ? readSessionAgent(ownerAware, sessionId) : undefined]);
33
35
  const owner = head?.owner;
34
- const agent = sessionAgentOf(placement);
35
36
  return { ...audit, owner: owner ?? null, ...(agent !== undefined ? { agent } : {}) };
36
37
  }
37
38
  : undefined;
@@ -102,7 +103,7 @@ export function createSessionFaces(ctx) {
102
103
  await fileHistoryErasure.reap(sessionId, []);
103
104
  logger.warn("session_file_history_baselines_retained", {
104
105
  sessionId,
105
- note: "the local file-history store has no whole-scope purge verb; boundaries were reaped but v1 baselines (original file bytes) remain under the data root until the upstream purge seam lands — recorded as an open deletion-rights gap, not silent",
106
+ note: "this file-history store has no whole-scope erase verb (deleteBySession); boundaries were reaped but v1 baselines (original file bytes) remain in the store until it implements that verb — an open deletion-rights gap, not silent",
106
107
  });
107
108
  }
108
109
  }
@@ -123,6 +124,7 @@ export function createSessionFaces(ctx) {
123
124
  }
124
125
  if (peerBox !== undefined)
125
126
  await peerBox.store.drop(peerBox.scope, peerBox.handle);
127
+ retireSessionId(sessionId, owner, config);
126
128
  let historyDeleted;
127
129
  try {
128
130
  historyDeleted = await ownerAware.deleteSession(sessionId, owner);
@@ -5,8 +5,8 @@ import { createParentWatch } from "../parent-watch.js";
5
5
  import { setTimeout as delay } from "node:timers/promises";
6
6
  import { HOST_BG_KILL_GRACE_MS } from "../plugins/remote-env-host.js";
7
7
  import { installProcessExitBoundary } from "./exit-boundary.js";
8
- import { createEngineLeaseTracker } from "./engine-lease.js";
9
- import { writeExitLast, readExitLast, clearExitLast } from "./exit-last.js";
8
+ import { backgroundShellsUnreachable, createEngineLeaseTracker, laneWork } from "./engine-lease.js";
9
+ import { writeExitLast, readExitLast, clearExitLast, EXIT_LAST_FORMAT } from "./exit-last.js";
10
10
  import { isScriptRealmRejection, describeRejectionReason } from "../orchestration/hardened-vm-runner.js";
11
11
  import { DRAIN_CAUSE_COUNTS_AS_FIRST_STOP_SIGNAL, HARD_STOP_ACTION_ID, drainDeadlineBeyondBound } from "../fleet/drain-entry.js";
12
12
  import { seatText } from "../trace/exit-seat.js";
@@ -24,10 +24,20 @@ export function installShutdownHandlers(ctx) {
24
24
  const prior = readCrashLast(dataRoot);
25
25
  if (prior)
26
26
  logger.warn("crash_last_found", { at: prior.at, version: prior.version, pid: prior.pid, uptimeMs: prior.uptimeMs, ...(prior.inflight !== undefined ? { inflight: prior.inflight } : {}), err: prior.err });
27
- const lastExit = readExitLast(dataRoot);
27
+ const lastExitReading = readExitLast(dataRoot);
28
+ if (lastExitReading?.kind === "formatMismatch") {
29
+ logger.warn("exit_last_stale_format", {
30
+ fileFormat: lastExitReading.fileFormat,
31
+ buildFormat: EXIT_LAST_FORMAT,
32
+ note: "exit-last.json on this data root was written in a different format by another engine version — it is not projected " +
33
+ "(no exit_last_found for it) and is removed now; only the previous exit's self-exit record is lost, nothing else is affected.",
34
+ });
35
+ clearExitLast(dataRoot);
36
+ }
37
+ const lastExit = lastExitReading?.kind === "found" ? lastExitReading.info : undefined;
28
38
  if (lastExit) {
29
39
  logger.info("exit_last_found", {
30
- at: lastExit.at, version: lastExit.version, pid: lastExit.pid, orphan: lastExit.orphan, reason: lastExit.reason,
40
+ at: lastExit.at, version: lastExit.version, pid: lastExit.pid, lane: lastExit.lane, reason: lastExit.reason,
31
41
  idleForMs: lastExit.idleForMs, attached: lastExit.attached, inflight: lastExit.inflight, lingerMs: lastExit.lingerMs,
32
42
  ...(lastExit.orphanedForMs !== undefined ? { orphanedForMs: lastExit.orphanedForMs } : {}),
33
43
  crashedDuringExit: prior !== undefined && prior.pid === lastExit.pid,
@@ -76,6 +86,7 @@ export function installShutdownHandlers(ctx) {
76
86
  let parentWatch;
77
87
  let engineLease;
78
88
  let leaseFactsReader;
89
+ let handoverDoor;
79
90
  const hardShutdown = () => {
80
91
  if (closing)
81
92
  return;
@@ -191,14 +202,14 @@ export function installShutdownHandlers(ctx) {
191
202
  drainState.endSubscriptions?.();
192
203
  toolApproval?.beginDrain();
193
204
  void fleetClient?.announceNow();
194
- const inflight = drainState.inflight?.() ?? 0;
205
+ const inflight = drainState.blockingInflight?.() ?? 0;
195
206
  logger.info("draining_started", { actionId: entry.actionId, inflight, deadlineAt: entry.deadlineAt, windowMs });
196
207
  if (inflight === 0) {
197
208
  hardShutdown();
198
209
  return { ...current, state: "draining" };
199
210
  }
200
211
  const tick = setInterval(() => {
201
- const n = drainState.inflight?.() ?? 0;
212
+ const n = drainState.blockingInflight?.() ?? 0;
202
213
  const now = performance.now();
203
214
  if (n === 0 || now >= deadlineMono) {
204
215
  clearInterval(tick);
@@ -254,9 +265,9 @@ export function installShutdownHandlers(ctx) {
254
265
  const onSigint = () => onStopSignal("SIGINT");
255
266
  process.on("SIGTERM", onSigterm);
256
267
  process.on("SIGINT", onSigint);
268
+ const handoverLane = !config.requirePrincipal ? { lingerMs: config.engineHandoverLingerMs, backgroundShells: exitBoundary.shellsExitWouldKill } : undefined;
257
269
  const onSighup = createSighupIdleHandler({
258
- inflight: () => drainState.inflight?.() ?? 0,
259
- attached: () => drainState.attachedStreams?.() ?? 0,
270
+ work: () => laneWork(engineLease?.lane(), { attached: drainState.attachedStreams?.() ?? 0, inflight: drainState.blockingInflight?.() ?? 0, backgroundShells: handoverLane?.backgroundShells ?? backgroundShellsUnreachable }, "sighup"),
260
271
  lastActivityAt: () => drainState.lastActivityAt?.() ?? 0,
261
272
  isStopped: () => closing || draining,
262
273
  escalate: () => drainOnCause("signal:SIGHUP"),
@@ -283,7 +294,7 @@ export function installShutdownHandlers(ctx) {
283
294
  if (config.parentPid !== undefined || config.engineAutoExit) {
284
295
  engineLease = createEngineLeaseTracker({
285
296
  attachedStreams: () => drainState.attachedStreams?.() ?? 0,
286
- inflight: () => drainState.inflight?.() ?? 0,
297
+ inflight: () => drainState.blockingInflight?.() ?? 0,
287
298
  lastActivityAt: () => drainState.lastActivityAt?.() ?? 0,
288
299
  lastAttachEndedAt: () => drainState.lastAttachEndedAt?.() ?? 0,
289
300
  isStopped: () => closing || draining,
@@ -296,10 +307,15 @@ export function installShutdownHandlers(ctx) {
296
307
  ...(config.parentPid !== undefined
297
308
  ? { orphan: { lingerMs: config.engineOrphanLingerMs, read: () => orphanState } }
298
309
  : {}),
310
+ firstAttach: { windowMs: config.engineFirstAttachMs, firstTouchAt: () => drainState.firstActivityAt?.() ?? null },
311
+ ...(handoverLane !== undefined ? { handover: handoverLane } : {}),
299
312
  log: (event, fields) => logger.info(event, fields),
300
313
  });
301
314
  leaseFactsReader = () => engineLease?.facts;
302
315
  drainState.engineLease = leaseFactsReader;
316
+ handoverDoor = engineLease.handover;
317
+ if (handoverDoor !== undefined)
318
+ drainState.engineHandover = handoverDoor;
303
319
  }
304
320
  let disposed = false;
305
321
  return {
@@ -324,6 +340,8 @@ export function installShutdownHandlers(ctx) {
324
340
  drainState.enter = undefined;
325
341
  if (leaseFactsReader !== undefined && drainState.engineLease === leaseFactsReader)
326
342
  drainState.engineLease = undefined;
343
+ if (handoverDoor !== undefined && drainState.engineHandover === handoverDoor)
344
+ drainState.engineHandover = undefined;
327
345
  },
328
346
  };
329
347
  }
@@ -61,7 +61,7 @@ export function runStage01() {
61
61
  if (rootsSplit) {
62
62
  logger.warn("local_roots_split", {
63
63
  ...rootsSplit,
64
- note: "LOCAL_DATA_ROOT moved the local backend's DATA root, but config.d / remote-exec.json are still read from the config root (LOCAL_DATA_ROOT is not consulted there). If you meant to move both, set CONFIG_LOCAL_DIR to the same directory.",
64
+ note: "The local backend's DATA root and the config root differ, and CONFIG_LOCAL_DIR is not set: config.d / remote-exec.json are read from the derived config root (AGENT_DATA_DIR or ~/.ai-agent; LOCAL_DATA_ROOT is not consulted there), while data lives under the data root (LOCAL_DATA_ROOT, else CONFIG_LOCAL_DIR, AGENT_DATA_DIR, ~/.ai-agent). If you meant to move both, set CONFIG_LOCAL_DIR to the same directory; if the split is intended, set CONFIG_LOCAL_DIR to the config directory explicitly — any explicit CONFIG_LOCAL_DIR silences this line.",
65
65
  });
66
66
  }
67
67
  installOutboundDispatcher(logger);
@@ -20,6 +20,7 @@ export declare function runStage03(ctx: Awaited<ReturnType<typeof runStage02>>):
20
20
  sessionStore: import("@sema-agent/core").SessionStore<import("@sema-agent/core").SessionStoreSummary, import("@sema-agent/core").SessionListQuery>;
21
21
  sqlEngine: import("../plugins/sql-driver.js").SqlEngineReading | undefined;
22
22
  storePosture: import("../store-posture.js").StorePosture;
23
+ storeSweep: import("../plugins/store-sweep.js").StoreSweep;
23
24
  taskAttachmentStore: import("../plugins/task-attachment-store.js").TaskAttachmentStore | undefined;
24
25
  taskListLane: import("./task-list-lane.js").TaskListLane;
25
26
  usageWindowStore: import("@sema-agent/core").UsageWindowStore | undefined;
@@ -2,8 +2,8 @@ import { uuidv7 } from "@sema-agent/core";
2
2
  import { openStores } from "./stores.js";
3
3
  export async function runStage03(ctx) {
4
4
  const { config, localRoot, logger, metrics } = ctx;
5
- const { backend, storePosture, memoryEngine, engineDataRoot, memorySyncCursors, rosterStore, backgroundAgentStore, sessionCaptureRecords, taskAttachmentStore, mailboxStore, mailboxRecipientLifecycle, memoryExportStores, memorySyncRunner, sessionStore, breakerState, usageWindowStore, memoryPosture, taskListLane, sqlEngine, } = await openStores({ config, logger, metrics, localRoot });
5
+ const { backend, storePosture, memoryEngine, engineDataRoot, memorySyncCursors, rosterStore, backgroundAgentStore, sessionCaptureRecords, taskAttachmentStore, mailboxStore, mailboxRecipientLifecycle, memoryExportStores, memorySyncRunner, sessionStore, breakerState, usageWindowStore, memoryPosture, taskListLane, sqlEngine, storeSweep, } = await openStores({ config, logger, metrics, localRoot });
6
6
  const instanceId = uuidv7();
7
- return { ...ctx, backend, backgroundAgentStore, breakerState, engineDataRoot, instanceId, mailboxRecipientLifecycle, mailboxStore, memoryEngine, memoryExportStores, memoryPosture, memorySyncCursors, memorySyncRunner, rosterStore, sessionCaptureRecords, sessionStore, sqlEngine, storePosture, taskAttachmentStore, taskListLane, usageWindowStore };
7
+ return { ...ctx, backend, backgroundAgentStore, breakerState, engineDataRoot, instanceId, mailboxRecipientLifecycle, mailboxStore, memoryEngine, memoryExportStores, memoryPosture, memorySyncCursors, memorySyncRunner, rosterStore, sessionCaptureRecords, sessionStore, sqlEngine, storePosture, storeSweep, taskAttachmentStore, taskListLane, usageWindowStore };
8
8
  }
9
9
  //# sourceMappingURL=stage-03-store-backend.js.map
@@ -50,6 +50,7 @@ export declare function runStage04(ctx: Awaited<ReturnType<typeof runStage03>>):
50
50
  sessionStore: import("@sema-agent/core").SessionStore<import("@sema-agent/core").SessionStoreSummary, import("@sema-agent/core").SessionListQuery>;
51
51
  sqlEngine: import("../plugins/sql-driver.js").SqlEngineReading | undefined;
52
52
  storePosture: import("../store-posture.js").StorePosture;
53
+ storeSweep: import("../plugins/store-sweep.js").StoreSweep;
53
54
  taskAttachmentStore: import("../plugins/task-attachment-store.js").TaskAttachmentStore | undefined;
54
55
  taskListLane: import("./task-list-lane.js").TaskListLane;
55
56
  usageWindowStore: import("@sema-agent/core").UsageWindowStore | undefined;
@@ -2,11 +2,13 @@ import type { runStage04 } from "./stage-04-stores.js";
2
2
  export declare function runStage05(ctx: Awaited<ReturnType<typeof runStage04>>): Promise<{
3
3
  deploymentMods: readonly import("@sema-agent/core").ModRegistration<import("@sema-agent/core").EngineDollar>[];
4
4
  deploymentModsLoaded: readonly import("./deployment-mods.js").LoadedModPackage[];
5
+ belowTaskChainPatterns: readonly string[];
5
6
  deviceLane: import("./device-lane.js").DeviceLane | undefined;
6
7
  peerDesk: import("../peer-seat.js").PeerDesk;
7
8
  dropSessionScoped: (sid: string) => void;
8
9
  executionEnvFactory: import("@sema-agent/core").ExecutionEnvFactory | undefined;
9
10
  fenceSessionOwner: (sid: string, owner: string | null) => void;
11
+ sessionResidentBackground: () => number;
10
12
  lspManager: import("@sema-agent/core").NodeLspManager | import("../lsp/manager.js").E2bLspManager | undefined;
11
13
  spaceReclaimer: import("../workspace-space.js").SpaceReclaimer | undefined;
12
14
  sandboxPodReaper: import("../plugins/k8s-pod-reaper.js").SandboxPodReaper | undefined;
@@ -69,6 +71,7 @@ export declare function runStage05(ctx: Awaited<ReturnType<typeof runStage04>>):
69
71
  sessionStore: import("@sema-agent/core").SessionStore<import("@sema-agent/core").SessionStoreSummary, import("@sema-agent/core").SessionListQuery>;
70
72
  sqlEngine: import("../plugins/sql-driver.js").SqlEngineReading | undefined;
71
73
  storePosture: import("../store-posture.js").StorePosture;
74
+ storeSweep: import("../plugins/store-sweep.js").StoreSweep;
72
75
  taskAttachmentStore: import("../plugins/task-attachment-store.js").TaskAttachmentStore | undefined;
73
76
  taskListLane: import("./task-list-lane.js").TaskListLane;
74
77
  usageWindowStore: import("@sema-agent/core").UsageWindowStore | undefined;
@@ -13,7 +13,7 @@ export async function runStage05(ctx) {
13
13
  const deviceLane = config.remoteExec?.provider === "device" ? createDeviceLane({ config, logger, metrics, backend, seat: sessionStore.executionPlacement, replicaId: instanceId }) : undefined;
14
14
  const headOf = headReadOf(sessionStore);
15
15
  const spaceCommits = backend !== undefined ? () => runStore : undefined;
16
- const { perTaskImage, sessionEnvSelection, perSessionCwd, setSessionCwd, setSessionShellEnv, setSessionInheritEnv, fenceSessionOwner, dropSessionScoped, executionEnvFactory, worktreeReap, sendUserFileTaskEnvs, lspManager, spaceReclaimer, sandboxSecretSeatGate, sandboxPodReaper, sandboxGitPlane: sandboxGitPlaneSeat, } = createExecutionEnv({ config, logger, metrics, taskAttachmentStore, ...(deviceLane ? { deviceLane } : {}), ...(spaceCommits !== undefined ? { spaceCommits } : {}), ...(headOf !== undefined ? { headOf } : {}), ...(backend !== undefined ? { runRows: () => runStore } : {}) });
16
+ const { perTaskImage, sessionEnvSelection, perSessionCwd, setSessionCwd, setSessionShellEnv, setSessionInheritEnv, fenceSessionOwner, dropSessionScoped, sessionResidentBackground, executionEnvFactory, worktreeReap, sendUserFileTaskEnvs, lspManager, spaceReclaimer, sandboxSecretSeatGate, sandboxPodReaper, sandboxGitPlane: sandboxGitPlaneSeat, } = createExecutionEnv({ config, logger, metrics, taskAttachmentStore, ...(deviceLane ? { deviceLane } : {}), ...(spaceCommits !== undefined ? { spaceCommits } : {}), ...(headOf !== undefined ? { headOf } : {}), ...(backend !== undefined ? { runRows: () => runStore } : {}) });
17
17
  assertDeviceLaneWired(config.remoteExec?.provider === "device", deviceLane, executionEnvFactory !== undefined);
18
18
  if (deviceLane !== undefined && config.remoteExec?.provider === "device")
19
19
  await noteDeviceRelayBindings(config.remoteExec.relay, deviceLane.store, logger);
@@ -30,10 +30,10 @@ export async function runStage05(ctx) {
30
30
  }
31
31
  if (config.toolTrace)
32
32
  logger.info("tool_trace_enabled", {});
33
- const { registrations: deploymentMods, loaded: deploymentModsLoaded } = await assembleDeploymentMods({ metrics, ...(config.toolTrace ? { traceLogger: logger } : {}), brandIdentity: isBrandedDeployment(config), declaration: config.modsDeclaration, logger });
33
+ const { registrations: deploymentMods, loaded: deploymentModsLoaded, belowTaskChainPatterns } = await assembleDeploymentMods({ metrics, ...(config.toolTrace ? { traceLogger: logger } : {}), brandIdentity: isBrandedDeployment(config), declaration: config.modsDeclaration, logger });
34
34
  const peerDesk = createPeerDesk({ log: logger });
35
35
  metrics.dynamicGauge("peer_registry_entries", "Peer desk entries (declared peer credentials registered for in-flight legs and the roster)", () => peerDesk.size().entries);
36
36
  metrics.dynamicGauge("peer_registry_holders", "Peer desk holders of entries (host leases and engine holds), summed across entries", () => peerDesk.size().holders);
37
- return { ...ctx, deploymentMods, deploymentModsLoaded, deviceLane, peerDesk, dropSessionScoped, executionEnvFactory, fenceSessionOwner, lspManager, spaceReclaimer, sandboxPodReaper, sandboxGitPlane, perSessionCwd, perTaskImage, sendUserFileTaskEnvs, sessionEnvSelection, setSessionCwd, setSessionInheritEnv, setSessionShellEnv, worktreeReap };
37
+ return { ...ctx, deploymentMods, deploymentModsLoaded, belowTaskChainPatterns, deviceLane, peerDesk, dropSessionScoped, executionEnvFactory, fenceSessionOwner, sessionResidentBackground, lspManager, spaceReclaimer, sandboxPodReaper, sandboxGitPlane, perSessionCwd, perTaskImage, sendUserFileTaskEnvs, sessionEnvSelection, setSessionCwd, setSessionInheritEnv, setSessionShellEnv, worktreeReap };
38
38
  }
39
39
  //# sourceMappingURL=stage-05-execution-env.js.map
@@ -63,11 +63,13 @@ export declare function runStage06(ctx: Awaited<ReturnType<typeof runStage05>>):
63
63
  orgDeliveryGate: import("@sema-agent/core").OrgDeliveryGate | undefined;
64
64
  deploymentMods: readonly import("@sema-agent/core").ModRegistration<import("@sema-agent/core").EngineDollar>[];
65
65
  deploymentModsLoaded: readonly import("./deployment-mods.js").LoadedModPackage[];
66
+ belowTaskChainPatterns: readonly string[];
66
67
  deviceLane: import("./device-lane.js").DeviceLane | undefined;
67
68
  peerDesk: import("../peer-seat.js").PeerDesk;
68
69
  dropSessionScoped: (sid: string) => void;
69
70
  executionEnvFactory: import("@sema-agent/core").ExecutionEnvFactory | undefined;
70
71
  fenceSessionOwner: (sid: string, owner: string | null) => void;
72
+ sessionResidentBackground: () => number;
71
73
  lspManager: import("@sema-agent/core").NodeLspManager | import("../lsp/manager.js").E2bLspManager | undefined;
72
74
  spaceReclaimer: import("../workspace-space.js").SpaceReclaimer | undefined;
73
75
  sandboxPodReaper: import("../plugins/k8s-pod-reaper.js").SandboxPodReaper | undefined;
@@ -130,6 +132,7 @@ export declare function runStage06(ctx: Awaited<ReturnType<typeof runStage05>>):
130
132
  sessionStore: import("@sema-agent/core").SessionStore<import("@sema-agent/core").SessionStoreSummary, import("@sema-agent/core").SessionListQuery>;
131
133
  sqlEngine: import("../plugins/sql-driver.js").SqlEngineReading | undefined;
132
134
  storePosture: import("../store-posture.js").StorePosture;
135
+ storeSweep: import("../plugins/store-sweep.js").StoreSweep;
133
136
  taskAttachmentStore: import("../plugins/task-attachment-store.js").TaskAttachmentStore | undefined;
134
137
  taskListLane: import("./task-list-lane.js").TaskListLane;
135
138
  usageWindowStore: import("@sema-agent/core").UsageWindowStore | undefined;
@@ -79,6 +79,16 @@ export async function runStage06(ctx) {
79
79
  ],
80
80
  locked: (config.lockedConfigKeys ?? []).includes("retentionPolicy"),
81
81
  });
82
+ const governanceSeams = createGovernanceSeams({
83
+ config,
84
+ logger,
85
+ retentionStores: [
86
+ { name: "sessionStore", store: sessionStore },
87
+ { name: "checkpointStore", store: checkpointStore },
88
+ { name: "toolResultStore", store: runnerOffloadStore },
89
+ ],
90
+ retentionExecutor: retentionSweepRuns(config.retentionSweep) ? (retentionExecutor ?? null) : null,
91
+ });
82
92
  const consolidationSeat = consolidationValve.enabled && memoryEngine
83
93
  ? resolveConsolidationDriverSeat({
84
94
  brain,
@@ -97,6 +107,7 @@ export async function runStage06(ctx) {
97
107
  onStopDetail: (audit) => logger.warn("memory_consolidation_stop_detail", audit),
98
108
  writeJudge: createOperatorValveWriteJudge({ ruleStoreProvider: permissionRuleProvider, config }),
99
109
  onNotice: createEngineNoticeForwarder(logger, defaultEngineNoticeRouter, metrics),
110
+ postureOf: governanceSeams.compliancePostureResolver,
100
111
  })
101
112
  : undefined;
102
113
  for (const w of buildConsolidationValveAudit({
@@ -117,16 +128,6 @@ export async function runStage06(ctx) {
117
128
  autoRunOnRecommendation: config.memoryConsolidationDriver.autoRunOnRecommendation ?? "engine-default(on)",
118
129
  });
119
130
  }
120
- const governanceSeams = createGovernanceSeams({
121
- config,
122
- logger,
123
- retentionStores: [
124
- { name: "sessionStore", store: sessionStore },
125
- { name: "checkpointStore", store: checkpointStore },
126
- { name: "toolResultStore", store: runnerOffloadStore },
127
- ],
128
- retentionExecutor: retentionSweepRuns(config.retentionSweep) ? (retentionExecutor ?? null) : null,
129
- });
130
131
  const mcpRevocations = webAdmin.takeMcpRevocations();
131
132
  const workflowModelAllowlistSnapshot = workflowModelAllowlistFor(config) ?? [];
132
133
  const runnerDeps = createRunnerDeps({
@@ -80,11 +80,13 @@ export declare function runStage07(ctx: Awaited<ReturnType<typeof runStage06>>):
80
80
  orgDeliveryGate: import("@sema-agent/core").OrgDeliveryGate | undefined;
81
81
  deploymentMods: readonly import("@sema-agent/core").ModRegistration<import("@sema-agent/core").EngineDollar>[];
82
82
  deploymentModsLoaded: readonly import("./deployment-mods.js").LoadedModPackage[];
83
+ belowTaskChainPatterns: readonly string[];
83
84
  deviceLane: import("./device-lane.js").DeviceLane | undefined;
84
85
  peerDesk: import("../peer-seat.js").PeerDesk;
85
86
  dropSessionScoped: (sid: string) => void;
86
87
  executionEnvFactory: import("@sema-agent/core").ExecutionEnvFactory | undefined;
87
88
  fenceSessionOwner: (sid: string, owner: string | null) => void;
89
+ sessionResidentBackground: () => number;
88
90
  lspManager: import("@sema-agent/core").NodeLspManager | import("../lsp/manager.js").E2bLspManager | undefined;
89
91
  spaceReclaimer: import("../workspace-space.js").SpaceReclaimer | undefined;
90
92
  sandboxPodReaper: import("../plugins/k8s-pod-reaper.js").SandboxPodReaper | undefined;
@@ -147,6 +149,7 @@ export declare function runStage07(ctx: Awaited<ReturnType<typeof runStage06>>):
147
149
  sessionStore: import("@sema-agent/core").SessionStore<import("@sema-agent/core").SessionStoreSummary, import("@sema-agent/core").SessionListQuery>;
148
150
  sqlEngine: import("../plugins/sql-driver.js").SqlEngineReading | undefined;
149
151
  storePosture: import("../store-posture.js").StorePosture;
152
+ storeSweep: import("../plugins/store-sweep.js").StoreSweep;
150
153
  taskAttachmentStore: import("../plugins/task-attachment-store.js").TaskAttachmentStore | undefined;
151
154
  taskListLane: import("./task-list-lane.js").TaskListLane;
152
155
  usageWindowStore: import("@sema-agent/core").UsageWindowStore | undefined;
@@ -14,7 +14,7 @@ import { buildScenarios, builtinScenarioDetails, danglingScenarioRefusal } from
14
14
  import { isBrandedDeployment } from "../capabilities/brand-identity.js";
15
15
  import { RateLimiter } from "../observability/rate-limit.js";
16
16
  import { explicitOperatorOk } from "../http/server.js";
17
- import { buildOperatorUndeclaredNotice } from "../http/principal-gate.js";
17
+ import { buildOperatorUndeclaredNotice, buildServiceTokenPostureNotice } from "../http/principal-gate.js";
18
18
  import { selfOrchestrationDenial } from "../task-workflow.js";
19
19
  import { centerEntitlementSourceWired } from "../runtime-caps-resolver.js";
20
20
  import { reclaimOrphansAtBoot } from "../boot-reclaim.js";
@@ -100,10 +100,15 @@ export async function runStage07(ctx) {
100
100
  if (durableEnabled)
101
101
  logger.info("durable_approval_enabled", { toolApprovalGate: config.approvalRequire.length });
102
102
  {
103
- const undeclared = buildOperatorUndeclaredNotice(config, durableEnabled);
103
+ const undeclared = buildOperatorUndeclaredNotice(config);
104
104
  if (undeclared)
105
105
  logger.warn(undeclared.event, undeclared.fields);
106
106
  }
107
+ {
108
+ const posture = buildServiceTokenPostureNotice(config);
109
+ if (posture)
110
+ logger.info(posture.event, posture.fields);
111
+ }
107
112
  if (config.a2aServe) {
108
113
  const peer = facts.a2aServe({ config, runStore });
109
114
  if (peer.available) {
@@ -93,11 +93,13 @@ export declare function runStage08(ctx: Awaited<ReturnType<typeof runStage07>>):
93
93
  orgDeliveryGate: import("@sema-agent/core").OrgDeliveryGate | undefined;
94
94
  deploymentMods: readonly import("@sema-agent/core").ModRegistration<import("@sema-agent/core").EngineDollar>[];
95
95
  deploymentModsLoaded: readonly import("./deployment-mods.js").LoadedModPackage[];
96
+ belowTaskChainPatterns: readonly string[];
96
97
  deviceLane: import("./device-lane.js").DeviceLane | undefined;
97
98
  peerDesk: import("../peer-seat.js").PeerDesk;
98
99
  dropSessionScoped: (sid: string) => void;
99
100
  executionEnvFactory: import("@sema-agent/core").ExecutionEnvFactory | undefined;
100
101
  fenceSessionOwner: (sid: string, owner: string | null) => void;
102
+ sessionResidentBackground: () => number;
101
103
  lspManager: import("@sema-agent/core").NodeLspManager | import("../lsp/manager.js").E2bLspManager | undefined;
102
104
  spaceReclaimer: import("../workspace-space.js").SpaceReclaimer | undefined;
103
105
  sandboxPodReaper: import("../plugins/k8s-pod-reaper.js").SandboxPodReaper | undefined;
@@ -160,6 +162,7 @@ export declare function runStage08(ctx: Awaited<ReturnType<typeof runStage07>>):
160
162
  sessionStore: import("@sema-agent/core").SessionStore<import("@sema-agent/core").SessionStoreSummary, import("@sema-agent/core").SessionListQuery>;
161
163
  sqlEngine: import("../plugins/sql-driver.js").SqlEngineReading | undefined;
162
164
  storePosture: import("../store-posture.js").StorePosture;
165
+ storeSweep: import("../plugins/store-sweep.js").StoreSweep;
163
166
  taskAttachmentStore: import("../plugins/task-attachment-store.js").TaskAttachmentStore | undefined;
164
167
  taskListLane: import("./task-list-lane.js").TaskListLane;
165
168
  usageWindowStore: import("@sema-agent/core").UsageWindowStore | undefined;
@@ -6,11 +6,11 @@ import { createLimitSync } from "./limit-sync.js";
6
6
  import { runDenySweep } from "./late-binds.js";
7
7
  import { seatText } from "../trace/exit-seat.js";
8
8
  export function runStage08(ctx) {
9
- const { approvalAskAudit, approvalNonceStore, backend, backgroundAgentStore, ceilingVerdict, checkpointStore, parkCommits, config, webAdmin, consolidationSeatWatch, costQuota, degradeRouteWatch, fileHistoryErasure, spaceReclaimer, sandboxPodReaper, handslessRunner, hookAgentRunner, imageBakes, instanceId, localRoot, logger, mailboxStore, metrics, permissionRuleStores, pricing, rateLimiter, retentionExecutor, retentionLaneStore, rosterStore, runStore, runner, sqlWorkflowRunStore, subRunner, taskAttachmentStore, toolApproval, toolResultStore, userInputLedger, workflowJournalStore, workflowNotifyGate, workflowNotifyJournal, workflowRecoverOpts, worktreeReap } = ctx;
9
+ const { approvalAskAudit, approvalNonceStore, backend, backgroundAgentStore, ceilingVerdict, checkpointStore, parkCommits, config, webAdmin, consolidationSeatWatch, costQuota, degradeRouteWatch, fileHistoryErasure, spaceReclaimer, sandboxPodReaper, handslessRunner, hookAgentRunner, imageBakes, instanceId, localRoot, logger, mailboxStore, metrics, permissionRuleStores, pricing, rateLimiter, retentionExecutor, retentionLaneStore, runStore, runner, sqlWorkflowRunStore, storeSweep, subRunner, taskAttachmentStore, toolApproval, userInputLedger, workflowNotifyGate, workflowNotifyJournal, workflowRecoverOpts, worktreeReap } = ctx;
10
10
  const reaper = startReapers({
11
11
  config, logger, metrics, localRoot, backend, subRunner, runStore, checkpointStore, parkCommits,
12
- rateLimiter, costQuota, toolResultStore, fileHistoryErasure, taskAttachmentStore, imageBakes, worktreeReap,
13
- workflowNotifyGate, workflowRecoverOpts, workflowJournalStore, sqlWorkflowRunStore, workflowNotifyJournal, rosterStore,
12
+ rateLimiter, costQuota, storeSweep, fileHistoryErasure, taskAttachmentStore, imageBakes, worktreeReap,
13
+ workflowNotifyGate, workflowRecoverOpts, sqlWorkflowRunStore, workflowNotifyJournal,
14
14
  backgroundAgentStore, mailboxStore, toolApproval, permissionRuleStores, approvalNonceStore, userInputLedger, approvalAskAudit,
15
15
  ...(sandboxPodReaper !== undefined ? { sandboxPodReaper } : {}),
16
16
  getRunDenySweep: () => runDenySweep,
@@ -18,7 +18,7 @@ export declare function runStage09(ctx: Awaited<ReturnType<typeof runStage08>>):
18
18
  }>) | undefined;
19
19
  webAdminJwtVerifier: import("../auth-bridge.js").WebAdminJwtVerifier | undefined;
20
20
  sessionAudit: ((sessionId: string, opts?: import("../audit.js").SessionAuditReadOpts) => Promise<{
21
- agent?: import("../audit.js").SessionAgent | undefined;
21
+ agent?: import("../session-agent.js").SessionAgent | undefined;
22
22
  owner: string | null;
23
23
  sessionId: string;
24
24
  createdAt: string;
@@ -117,11 +117,13 @@ export declare function runStage09(ctx: Awaited<ReturnType<typeof runStage08>>):
117
117
  orgDeliveryGate: import("@sema-agent/core").OrgDeliveryGate | undefined;
118
118
  deploymentMods: readonly import("@sema-agent/core").ModRegistration<import("@sema-agent/core").EngineDollar>[];
119
119
  deploymentModsLoaded: readonly import("./deployment-mods.js").LoadedModPackage[];
120
+ belowTaskChainPatterns: readonly string[];
120
121
  deviceLane: import("./device-lane.js").DeviceLane | undefined;
121
122
  peerDesk: import("../peer-seat.js").PeerDesk;
122
123
  dropSessionScoped: (sid: string) => void;
123
124
  executionEnvFactory: import("@sema-agent/core").ExecutionEnvFactory | undefined;
124
125
  fenceSessionOwner: (sid: string, owner: string | null) => void;
126
+ sessionResidentBackground: () => number;
125
127
  lspManager: import("@sema-agent/core").NodeLspManager | import("../lsp/manager.js").E2bLspManager | undefined;
126
128
  spaceReclaimer: import("../workspace-space.js").SpaceReclaimer | undefined;
127
129
  sandboxPodReaper: import("../plugins/k8s-pod-reaper.js").SandboxPodReaper | undefined;
@@ -184,6 +186,7 @@ export declare function runStage09(ctx: Awaited<ReturnType<typeof runStage08>>):
184
186
  sessionStore: import("@sema-agent/core").SessionStore<import("@sema-agent/core").SessionStoreSummary, import("@sema-agent/core").SessionListQuery>;
185
187
  sqlEngine: import("../plugins/sql-driver.js").SqlEngineReading | undefined;
186
188
  storePosture: import("../store-posture.js").StorePosture;
189
+ storeSweep: import("../plugins/store-sweep.js").StoreSweep;
187
190
  taskAttachmentStore: import("../plugins/task-attachment-store.js").TaskAttachmentStore | undefined;
188
191
  taskListLane: import("./task-list-lane.js").TaskListLane;
189
192
  usageWindowStore: import("@sema-agent/core").UsageWindowStore | undefined;