@empire-builder-kit/nx 1.0.0-rc.37 → 1.0.0-rc.39

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 (637) hide show
  1. package/README.md +18 -0
  2. package/executors.json +5 -0
  3. package/generators.json +10 -0
  4. package/package.json +20 -3
  5. package/src/aws-authority/index.d.ts +1 -0
  6. package/src/aws-authority/index.js +1 -0
  7. package/src/aws-authority/lambda-policy-ordering.d.ts +38 -0
  8. package/src/aws-authority/lambda-policy-ordering.js +56 -0
  9. package/src/aws-authority/stage-authority.d.ts +11 -3
  10. package/src/aws-authority/stage-authority.js +615 -29
  11. package/src/blueprints/external-sandbox.js +21 -9
  12. package/src/blueprints/manifest.d.ts +1 -1
  13. package/src/blueprints/resolver.js +28 -15
  14. package/src/cli/bootstrap.d.ts +1 -1
  15. package/src/cli/deploy-runtime.d.ts +6 -0
  16. package/src/cli/deploy-runtime.js +58 -0
  17. package/src/cli/dev-command.d.ts +16 -4
  18. package/src/cli/dev-command.js +63 -0
  19. package/src/cli/main.d.ts +7 -1
  20. package/src/cli/main.js +128 -20
  21. package/src/cli/output.d.ts +1 -1
  22. package/src/developer-agent/context.js +41 -9
  23. package/src/developer-agent/generator-planning.js +16 -2
  24. package/src/developer-agent/git-inspection.d.ts +6 -2
  25. package/src/developer-agent/git-inspection.js +78 -6
  26. package/src/developer-agent/model.d.ts +4 -2
  27. package/src/developer-agent/operation-registry.d.ts +5 -0
  28. package/src/developer-agent/operation-registry.js +179 -23
  29. package/src/developer-agent/preview-changes.d.ts +2 -0
  30. package/src/developer-agent/preview-changes.js +14 -2
  31. package/src/developer-agent/preview-source.js +3 -0
  32. package/src/developer-agent/validation.js +20 -8
  33. package/src/developer-agent/workspace-inspection.js +37 -3
  34. package/src/executors/deployment-plan/deployment-plan.d.ts +2 -0
  35. package/src/executors/deployment-plan/deployment-plan.js +51 -4
  36. package/src/executors/dev-doctor/dev-doctor.js +13 -6
  37. package/src/executors/dev-task-cleanup/dev-task-cleanup.d.ts +23 -0
  38. package/src/executors/dev-task-cleanup/dev-task-cleanup.js +145 -0
  39. package/src/executors/dev-task-cleanup/schema.json +9 -0
  40. package/src/executors/dev-task-cleanup/task-stack-absence.d.ts +27 -0
  41. package/src/executors/dev-task-cleanup/task-stack-absence.js +281 -0
  42. package/src/executors/dev-task-cleanup/task-stack-checkpoint.d.ts +12 -0
  43. package/src/executors/dev-task-cleanup/task-stack-checkpoint.js +92 -0
  44. package/src/executors/fleet/fleet.js +1 -1
  45. package/src/executors/foundation-remove-preflight/foundation-remove-preflight.js +28 -1
  46. package/src/executors/local-deploy/local-deploy.d.ts +8 -1
  47. package/src/executors/local-deploy/local-deploy.js +97 -24
  48. package/src/executors/local-deploy/schema.json +8 -0
  49. package/src/executors/router-waf-rehearsal/router-waf-rehearsal.js +30 -18
  50. package/src/executors/sst-lifecycle/governed-native-operation.d.ts +2 -0
  51. package/src/executors/sst-lifecycle/governed-native-operation.js +9 -0
  52. package/src/executors/sst-lifecycle/run-sst-command.d.ts +5 -0
  53. package/src/executors/sst-lifecycle/run-sst-command.js +220 -32
  54. package/src/executors/sst-lifecycle/sst-environment-source.d.ts +8 -0
  55. package/src/executors/sst-lifecycle/sst-environment-source.js +54 -0
  56. package/src/executors/sst-lifecycle/task-unlock.d.ts +15 -0
  57. package/src/executors/sst-lifecycle/task-unlock.js +126 -0
  58. package/src/foundation/capability-plan.d.ts +43 -0
  59. package/src/foundation/capability-plan.js +168 -0
  60. package/src/foundation/discovery.d.ts +14 -11
  61. package/src/foundation/discovery.js +32 -6
  62. package/src/foundation/index.d.ts +1 -0
  63. package/src/foundation/index.js +1 -0
  64. package/src/foundation/local-database-contract.d.ts +20 -0
  65. package/src/foundation/local-database-contract.js +262 -13
  66. package/src/foundation/local-private-smoke-access.d.ts +20 -0
  67. package/src/foundation/local-private-smoke-access.js +197 -0
  68. package/src/foundation/preflight.js +37 -18
  69. package/src/foundation/private-smoke-access.js +10 -2
  70. package/src/foundation/private-smoke-admission.d.ts +3 -1
  71. package/src/foundation/private-smoke-admission.js +29 -8
  72. package/src/foundation/private-smoke-control-plane.js +17 -6
  73. package/src/foundation/provision-database-bindings.d.ts +5 -0
  74. package/src/foundation/provision-database-bindings.js +41 -8
  75. package/src/foundation/provision-logical-database.js +13 -8
  76. package/src/foundation/requirements.d.ts +3 -3
  77. package/src/foundation/requirements.js +24 -12
  78. package/src/foundation/router-waf.d.ts +1 -0
  79. package/src/foundation/router-waf.js +14 -1
  80. package/src/generators/blueprint/blueprint.d.ts +5 -0
  81. package/src/generators/blueprint/blueprint.js +102 -0
  82. package/src/generators/blueprint/files.d.ts +6 -0
  83. package/src/generators/blueprint/files.js +217 -0
  84. package/src/generators/blueprint/schema.d.ts +4 -0
  85. package/src/generators/blueprint/schema.json +18 -0
  86. package/src/generators/formatting.js +24 -1
  87. package/src/generators/logging-registry.d.ts +2 -0
  88. package/src/generators/logging-registry.js +22 -0
  89. package/src/generators/preset/workspace-files-adopter-skills.d.ts +7 -0
  90. package/src/generators/preset/workspace-files-adopter-skills.js +301 -0
  91. package/src/generators/preset/workspace-files-ci-install.d.ts +2 -0
  92. package/src/generators/preset/workspace-files-ci-install.js +196 -0
  93. package/src/generators/preset/workspace-files-developer-agent.js +40 -13
  94. package/src/generators/preset/workspace-files-performance-load.js +8 -0
  95. package/src/generators/preset/workspace-files-stage-authority.js +40 -1
  96. package/src/generators/preset/workspace-files-thin-deploy.js +66 -34
  97. package/src/generators/preset/workspace-files-thin-docs.js +64 -18
  98. package/src/generators/preset/workspace-files.d.ts +4 -0
  99. package/src/generators/preset/workspace-files.js +159 -91
  100. package/src/generators/repository-policy/repository-policy.js +37 -0
  101. package/src/generators/slice/built-in-plan-api-contract-files.js +42 -7
  102. package/src/generators/slice/built-in-plan-api-files.d.ts +1 -1
  103. package/src/generators/slice/built-in-plan-api-files.js +47 -389
  104. package/src/generators/slice/built-in-plan-async-work-files.js +19 -1912
  105. package/src/generators/slice/built-in-plan-authorization-files.js +92 -329
  106. package/src/generators/slice/built-in-plan-authorization-infrastructure-files.js +36 -2
  107. package/src/generators/slice/built-in-plan-authorization-storage.d.ts +3 -0
  108. package/src/generators/slice/built-in-plan-authorization-storage.js +119 -0
  109. package/src/generators/slice/built-in-plan-background-work-files.d.ts +1 -1
  110. package/src/generators/slice/built-in-plan-background-work-files.js +15 -5
  111. package/src/generators/slice/built-in-plan-data-deletion-files.js +2 -830
  112. package/src/generators/slice/built-in-plan-data-files.d.ts +1 -1
  113. package/src/generators/slice/built-in-plan-data-files.js +61 -1164
  114. package/src/generators/slice/built-in-plan-data-lifecycle-files.js +53 -28
  115. package/src/generators/slice/built-in-plan-data-lifecycle-runtime-files.js +18 -2
  116. package/src/generators/slice/built-in-plan-data-retention-job-files.js +7 -2446
  117. package/src/generators/slice/built-in-plan-data-retention-launcher-files.js +30 -6
  118. package/src/generators/slice/built-in-plan-data-rights-files.js +6 -4482
  119. package/src/generators/slice/built-in-plan-database-lifecycle-files.js +4 -15
  120. package/src/generators/slice/built-in-plan-foundation-files.d.ts +2 -1
  121. package/src/generators/slice/built-in-plan-foundation-files.js +34 -10
  122. package/src/generators/slice/built-in-plan-frontend-files.js +2 -2
  123. package/src/generators/slice/built-in-plan-infrastructure-files.d.ts +1 -1
  124. package/src/generators/slice/built-in-plan-infrastructure-files.js +180 -522
  125. package/src/generators/slice/built-in-plan-key-value-cleanup.d.ts +4 -0
  126. package/src/generators/slice/built-in-plan-key-value-cleanup.js +100 -0
  127. package/src/generators/slice/built-in-plan-key-value-consumer.d.ts +4 -0
  128. package/src/generators/slice/built-in-plan-key-value-consumer.js +151 -0
  129. package/src/generators/slice/built-in-plan-key-value-deletion.d.ts +2 -0
  130. package/src/generators/slice/built-in-plan-key-value-deletion.js +377 -0
  131. package/src/generators/slice/built-in-plan-key-value-delivery.d.ts +2 -0
  132. package/src/generators/slice/built-in-plan-key-value-delivery.js +120 -0
  133. package/src/generators/slice/built-in-plan-key-value-export.d.ts +2 -0
  134. package/src/generators/slice/built-in-plan-key-value-export.js +595 -0
  135. package/src/generators/slice/built-in-plan-key-value-files.d.ts +2 -0
  136. package/src/generators/slice/built-in-plan-key-value-files.js +31 -0
  137. package/src/generators/slice/built-in-plan-key-value-holds.d.ts +2 -0
  138. package/src/generators/slice/built-in-plan-key-value-holds.js +189 -0
  139. package/src/generators/slice/built-in-plan-key-value-infrastructure.d.ts +2 -0
  140. package/src/generators/slice/built-in-plan-key-value-infrastructure.js +102 -0
  141. package/src/generators/slice/built-in-plan-key-value-performance.d.ts +5 -0
  142. package/src/generators/slice/built-in-plan-key-value-performance.js +530 -0
  143. package/src/generators/slice/built-in-plan-key-value-provider.d.ts +4 -0
  144. package/src/generators/slice/built-in-plan-key-value-provider.js +366 -0
  145. package/src/generators/slice/built-in-plan-key-value-records.d.ts +3 -0
  146. package/src/generators/slice/built-in-plan-key-value-records.js +232 -0
  147. package/src/generators/slice/built-in-plan-key-value-retention-infrastructure.d.ts +2 -0
  148. package/src/generators/slice/built-in-plan-key-value-retention-infrastructure.js +103 -0
  149. package/src/generators/slice/built-in-plan-key-value-retention-job-files.d.ts +2 -0
  150. package/src/generators/slice/built-in-plan-key-value-retention-job-files.js +160 -0
  151. package/src/generators/slice/built-in-plan-key-value-retention-maintenance.d.ts +2 -0
  152. package/src/generators/slice/built-in-plan-key-value-retention-maintenance.js +329 -0
  153. package/src/generators/slice/built-in-plan-key-value-retention-worker.d.ts +2 -0
  154. package/src/generators/slice/built-in-plan-key-value-retention-worker.js +477 -0
  155. package/src/generators/slice/built-in-plan-key-value-retention.d.ts +2 -0
  156. package/src/generators/slice/built-in-plan-key-value-retention.js +184 -0
  157. package/src/generators/slice/built-in-plan-metadata-files.d.ts +1 -1
  158. package/src/generators/slice/built-in-plan-metadata-files.js +140 -28
  159. package/src/generators/slice/built-in-plan-native-runtime-authority-files.d.ts +1 -1
  160. package/src/generators/slice/built-in-plan-native-runtime-authority-files.js +36 -19
  161. package/src/generators/slice/built-in-plan-operations-files.d.ts +1 -1
  162. package/src/generators/slice/built-in-plan-operations-files.js +89 -50
  163. package/src/generators/slice/built-in-plan-performance-files.js +84 -1010
  164. package/src/generators/slice/built-in-plan-project-files.js +116 -67
  165. package/src/generators/slice/built-in-plan-release-files.d.ts +1 -1
  166. package/src/generators/slice/built-in-plan-release-files.js +64 -15
  167. package/src/generators/slice/built-in-plan-reliability-files.js +54 -28
  168. package/src/generators/slice/built-in-plan-shared.d.ts +4 -2
  169. package/src/generators/slice/built-in-plan-shared.js +41 -19
  170. package/src/generators/slice/built-in-plan-sql-events.d.ts +2 -0
  171. package/src/generators/slice/built-in-plan-sql-events.js +257 -0
  172. package/src/generators/slice/built-in-plan-testing-files.d.ts +1 -1
  173. package/src/generators/slice/built-in-plan-testing-files.js +184 -132
  174. package/src/generators/slice/built-in-plan-testing-persistence-files.d.ts +2 -0
  175. package/src/generators/slice/built-in-plan-testing-persistence-files.js +178 -0
  176. package/src/generators/slice/built-in-plan-thin-release-files.d.ts +1 -1
  177. package/src/generators/slice/built-in-plan-thin-release-files.js +35 -2
  178. package/src/generators/slice/built-in-plan-verification-files.js +70 -0
  179. package/src/generators/slice/built-in-plan-web-files.d.ts +1 -1
  180. package/src/generators/slice/built-in-plan-web-files.js +206 -14
  181. package/src/generators/slice/built-in-plan-workload-role-files.d.ts +1 -1
  182. package/src/generators/slice/built-in-plan-workload-role-files.js +113 -274
  183. package/src/generators/slice/built-in-plan.d.ts +9 -1
  184. package/src/generators/slice/built-in-plan.js +49 -21
  185. package/src/generators/slice/data-policy-review-seed.d.ts +2 -0
  186. package/src/generators/slice/data-policy-review-seed.js +22 -0
  187. package/src/generators/slice/deployed-smoke-readiness.d.ts +2 -0
  188. package/src/generators/slice/deployed-smoke-readiness.js +214 -0
  189. package/src/generators/slice/local-source-identity.d.ts +2 -0
  190. package/src/generators/slice/local-source-identity.js +31 -0
  191. package/src/generators/slice/persistence-contract.d.ts +14 -0
  192. package/src/generators/slice/persistence-contract.js +32 -0
  193. package/src/generators/slice/slice.js +29 -24
  194. package/src/generators/sql/schema.d.ts +7 -0
  195. package/src/generators/sql/schema.json +38 -0
  196. package/src/generators/sql/sql.d.ts +6 -0
  197. package/src/generators/sql/sql.js +53 -0
  198. package/src/generators/upgrade/sql-seeded-reconciliation.d.ts +2 -0
  199. package/src/generators/upgrade/sql-seeded-reconciliation.js +170 -0
  200. package/src/generators/upgrade/upgrade.d.ts +2 -0
  201. package/src/generators/upgrade/upgrade.js +136 -9
  202. package/src/generators/workload/workload.js +51 -2
  203. package/src/local-dev/browser-verification.d.ts +37 -0
  204. package/src/local-dev/browser-verification.js +281 -0
  205. package/src/local-dev/contracts.d.ts +10 -1
  206. package/src/local-dev/contracts.js +114 -13
  207. package/src/local-dev/dev-command-core.js +24 -5
  208. package/src/local-dev/docker-credential-health.d.ts +14 -0
  209. package/src/local-dev/docker-credential-health.js +94 -0
  210. package/src/local-dev/environment-inspector.d.ts +7 -0
  211. package/src/local-dev/environment-inspector.js +42 -15
  212. package/src/local-dev/environment-state.js +2 -2
  213. package/src/local-dev/errors.d.ts +1 -1
  214. package/src/local-dev/errors.js +2 -0
  215. package/src/local-dev/fleet-client.js +2 -2
  216. package/src/local-dev/fleet-configuration.js +57 -25
  217. package/src/local-dev/fleet-inventory.js +46 -18
  218. package/src/local-dev/fleet-ipc.d.ts +7 -0
  219. package/src/local-dev/fleet-ipc.js +14 -2
  220. package/src/local-dev/fleet-launcher.d.ts +6 -0
  221. package/src/local-dev/fleet-launcher.js +14 -2
  222. package/src/local-dev/fleet-logs.js +50 -22
  223. package/src/local-dev/fleet-process.d.ts +20 -1
  224. package/src/local-dev/fleet-process.js +197 -41
  225. package/src/local-dev/fleet-runner-evidence.d.ts +5 -0
  226. package/src/local-dev/fleet-runner-evidence.js +56 -0
  227. package/src/local-dev/fleet-runtime.js +268 -229
  228. package/src/local-dev/fleet-session.d.ts +2 -0
  229. package/src/local-dev/fleet-session.js +28 -11
  230. package/src/local-dev/fleet-slice-runner-daemon.js +4 -0
  231. package/src/local-dev/fleet-state.d.ts +5 -2
  232. package/src/local-dev/fleet-state.js +25 -4
  233. package/src/local-dev/fleet-supervisor.d.ts +3 -0
  234. package/src/local-dev/fleet-supervisor.js +66 -11
  235. package/src/local-dev/fleet-web-start.d.ts +12 -0
  236. package/src/local-dev/fleet-web-start.js +48 -0
  237. package/src/local-dev/identity.js +3 -14
  238. package/src/local-dev/index.d.ts +1 -0
  239. package/src/local-dev/index.js +1 -0
  240. package/src/local-dev/native-completion.d.ts +9 -0
  241. package/src/local-dev/native-completion.js +130 -0
  242. package/src/local-dev/nx-workspace.d.ts +4 -2
  243. package/src/local-dev/nx-workspace.js +11 -6
  244. package/src/local-dev/personal-stage.d.ts +4 -5
  245. package/src/local-dev/personal-stage.js +6 -54
  246. package/src/local-dev/port-claims.d.ts +13 -0
  247. package/src/local-dev/port-claims.js +46 -0
  248. package/src/local-dev/ports.d.ts +14 -2
  249. package/src/local-dev/ports.js +78 -3
  250. package/src/local-dev/private-state.d.ts +6 -0
  251. package/src/local-dev/private-state.js +126 -34
  252. package/src/local-dev/process-group.d.ts +4 -0
  253. package/src/local-dev/process-group.js +29 -0
  254. package/src/local-dev/process-identity.d.ts +8 -0
  255. package/src/local-dev/process-identity.js +31 -1
  256. package/src/local-dev/proxy.js +11 -12
  257. package/src/local-dev/runtime-paths.js +1 -1
  258. package/src/local-dev/slice-claim.js +1 -1
  259. package/src/local-dev/slice-runner.d.ts +15 -6
  260. package/src/local-dev/slice-runner.js +189 -54
  261. package/src/local-dev/task-attachment.d.ts +17 -0
  262. package/src/local-dev/task-attachment.js +73 -0
  263. package/src/local-dev/task-authority.d.ts +10 -0
  264. package/src/local-dev/task-authority.js +27 -0
  265. package/src/local-dev/task-identity.d.ts +33 -0
  266. package/src/local-dev/task-identity.js +418 -0
  267. package/src/local-dev/task-native-writer.d.ts +18 -0
  268. package/src/local-dev/task-native-writer.js +329 -0
  269. package/src/local-dev/tls.js +3 -1
  270. package/src/local-dev/web-launch.d.ts +9 -0
  271. package/src/local-dev/web-launch.js +130 -0
  272. package/src/ownership/composition.d.ts +2 -1
  273. package/src/ownership/composition.js +1 -0
  274. package/src/performance/scenario.d.ts +22 -0
  275. package/src/performance/scenario.js +100 -92
  276. package/src/repository-policy/deployment-plan.d.ts +2 -2
  277. package/src/repository-policy/deployment-plan.js +2 -1
  278. package/src/repository-policy/policy.js +38 -3
  279. package/src/schemas/blueprint-v1.json +5 -4
  280. package/src/schemas/foundation-requirement-v1.json +5 -4
  281. package/src/schemas/testing-evidence-result-v1.json +1 -1
  282. package/src/secrets/operator.d.ts +3 -1
  283. package/src/secrets/operator.js +22 -3
  284. package/src/sst-environment-source-format.d.ts +3 -0
  285. package/src/sst-environment-source-format.js +20 -0
  286. package/src/supply-chain/blueprint-trust-git.js +13 -3
  287. package/src/supply-chain/build-output.js +15 -0
  288. package/src/supply-chain/generated-blueprint-trust-command.js +18 -1
  289. package/src/testing-evidence/fixture-scope.d.ts +2 -1
  290. package/src/testing-evidence/fixture-scope.js +4 -2
  291. package/src/testing-evidence/result.d.ts +2 -1
  292. package/src/testing-evidence/result.js +18 -4
  293. package/src/workload-roles/standard-slice.js +2 -3
  294. package/src/api-contract/baseline-update.js.map +0 -1
  295. package/src/api-contract/compatibility.js.map +0 -1
  296. package/src/api-contract/contract-graph.js.map +0 -1
  297. package/src/api-contract/evidence.js.map +0 -1
  298. package/src/api-contract/index.js.map +0 -1
  299. package/src/api-contract/model.fixtures.d.ts +0 -2
  300. package/src/api-contract/model.fixtures.js +0 -81
  301. package/src/api-contract/model.fixtures.js.map +0 -1
  302. package/src/api-contract/model.js.map +0 -1
  303. package/src/api-contract/rollout.js.map +0 -1
  304. package/src/authorization/compatibility.js.map +0 -1
  305. package/src/authorization/index.js.map +0 -1
  306. package/src/aws/child-environment.js.map +0 -1
  307. package/src/aws/identity.js.map +0 -1
  308. package/src/aws-authority/index.js.map +0 -1
  309. package/src/aws-authority/stage-authority.js.map +0 -1
  310. package/src/blueprints/execution.js.map +0 -1
  311. package/src/blueprints/external-sandbox.js.map +0 -1
  312. package/src/blueprints/index.js.map +0 -1
  313. package/src/blueprints/inputs.js.map +0 -1
  314. package/src/blueprints/manifest.js.map +0 -1
  315. package/src/blueprints/resolver.js.map +0 -1
  316. package/src/blueprints/transitions.js.map +0 -1
  317. package/src/cli/agent-command.js.map +0 -1
  318. package/src/cli/agent-runtime.js.map +0 -1
  319. package/src/cli/blueprint-authority.js.map +0 -1
  320. package/src/cli/blueprint-command.js.map +0 -1
  321. package/src/cli/bootstrap.js.map +0 -1
  322. package/src/cli/dev-command.js.map +0 -1
  323. package/src/cli/main.js.map +0 -1
  324. package/src/cli/output.js.map +0 -1
  325. package/src/cli/personal-secret-runtime.js.map +0 -1
  326. package/src/cli/secret-terminal.js.map +0 -1
  327. package/src/container-images.js.map +0 -1
  328. package/src/data-lifecycle/index.js.map +0 -1
  329. package/src/data-lifecycle/model.fixtures.d.ts +0 -2
  330. package/src/data-lifecycle/model.fixtures.js +0 -244
  331. package/src/data-lifecycle/model.fixtures.js.map +0 -1
  332. package/src/data-lifecycle/model.js.map +0 -1
  333. package/src/data-lifecycle/sensitive-artifacts.js.map +0 -1
  334. package/src/data-lifecycle/validation.js.map +0 -1
  335. package/src/database-retirement/contract.js.map +0 -1
  336. package/src/database-retirement/index.js.map +0 -1
  337. package/src/deterministic-order.js.map +0 -1
  338. package/src/developer-agent/context.js.map +0 -1
  339. package/src/developer-agent/generator-planning.js.map +0 -1
  340. package/src/developer-agent/generator-preview.js.map +0 -1
  341. package/src/developer-agent/git-inspection.js.map +0 -1
  342. package/src/developer-agent/handoff.js.map +0 -1
  343. package/src/developer-agent/index.js.map +0 -1
  344. package/src/developer-agent/model.js.map +0 -1
  345. package/src/developer-agent/operation-registry.js.map +0 -1
  346. package/src/developer-agent/ordering.js.map +0 -1
  347. package/src/developer-agent/planning.js.map +0 -1
  348. package/src/developer-agent/preview-changes.js.map +0 -1
  349. package/src/developer-agent/preview-source.js.map +0 -1
  350. package/src/developer-agent/validation.js.map +0 -1
  351. package/src/developer-agent/workspace-inspection.js.map +0 -1
  352. package/src/developer-agent/workspace-path.js.map +0 -1
  353. package/src/executors/blueprint-trust/blueprint-trust.js.map +0 -1
  354. package/src/executors/blueprint-verification/blueprint-verification.js.map +0 -1
  355. package/src/executors/deploy/deploy.js.map +0 -1
  356. package/src/executors/deployment-plan/deployment-plan.js.map +0 -1
  357. package/src/executors/dev/dev.js.map +0 -1
  358. package/src/executors/dev-doctor/dev-doctor.js.map +0 -1
  359. package/src/executors/dev-setup/dev-setup.js.map +0 -1
  360. package/src/executors/developer-context/developer-context.js.map +0 -1
  361. package/src/executors/fleet/fleet.js.map +0 -1
  362. package/src/executors/foundation-preflight/foundation-preflight.js.map +0 -1
  363. package/src/executors/foundation-profile-preflight/foundation-profile-preflight.js.map +0 -1
  364. package/src/executors/foundation-profile-preflight/production-database-safeguard.js.map +0 -1
  365. package/src/executors/foundation-remove-preflight/foundation-remove-preflight.js.map +0 -1
  366. package/src/executors/github-bootstrap/github-bootstrap.js.map +0 -1
  367. package/src/executors/infrastructure-plan/infrastructure-plan.js.map +0 -1
  368. package/src/executors/local-deploy/federated-credential-transport.js.map +0 -1
  369. package/src/executors/local-deploy/fixtures/local-deploy-state-machine.mjs +0 -53
  370. package/src/executors/local-deploy/local-approval.js.map +0 -1
  371. package/src/executors/local-deploy/local-deploy.js.map +0 -1
  372. package/src/executors/refresh/refresh.js.map +0 -1
  373. package/src/executors/remove/remove.js.map +0 -1
  374. package/src/executors/router-waf-rehearsal/router-waf-rehearsal.js.map +0 -1
  375. package/src/executors/secret-guardrails/secret-guardrails.js.map +0 -1
  376. package/src/executors/secret-initialize/secret-initialize.js.map +0 -1
  377. package/src/executors/secret-metadata/secret-metadata.js.map +0 -1
  378. package/src/executors/sst-lifecycle/generated-secret-retirement.js.map +0 -1
  379. package/src/executors/sst-lifecycle/governed-native-operation.js.map +0 -1
  380. package/src/executors/sst-lifecycle/logging-preflight.js.map +0 -1
  381. package/src/executors/sst-lifecycle/run-sst-command.js.map +0 -1
  382. package/src/executors/sst-lifecycle/secret-preflight.js.map +0 -1
  383. package/src/executors/sst-lifecycle/sst-environment-source.js.map +0 -1
  384. package/src/executors/unlock/unlock.js.map +0 -1
  385. package/src/executors/work-markers/work-markers.js.map +0 -1
  386. package/src/foundation/discovery.js.map +0 -1
  387. package/src/foundation/index.js.map +0 -1
  388. package/src/foundation/local-database-contract.js.map +0 -1
  389. package/src/foundation/logging-preflight.js.map +0 -1
  390. package/src/foundation/logging.js.map +0 -1
  391. package/src/foundation/partial-state.js.map +0 -1
  392. package/src/foundation/preflight.js.map +0 -1
  393. package/src/foundation/private-smoke-access.js.map +0 -1
  394. package/src/foundation/private-smoke-admission.js.map +0 -1
  395. package/src/foundation/private-smoke-control-plane.js.map +0 -1
  396. package/src/foundation/provision-database-bindings.js.map +0 -1
  397. package/src/foundation/provision-logical-database.js.map +0 -1
  398. package/src/foundation/requirements.js.map +0 -1
  399. package/src/foundation/router-origin-proof.js.map +0 -1
  400. package/src/foundation/router-waf-rate-rehearsal.js.map +0 -1
  401. package/src/foundation/router-waf.js.map +0 -1
  402. package/src/foundation/stages.js.map +0 -1
  403. package/src/frontend-security/index.js.map +0 -1
  404. package/src/frontend-security/security-headers.js.map +0 -1
  405. package/src/generators/feature-registry.js.map +0 -1
  406. package/src/generators/formatting.js.map +0 -1
  407. package/src/generators/function/function.js.map +0 -1
  408. package/src/generators/job/job.js.map +0 -1
  409. package/src/generators/logging-registry.js.map +0 -1
  410. package/src/generators/post-generation-install.js.map +0 -1
  411. package/src/generators/preset/dependency-overrides.js.map +0 -1
  412. package/src/generators/preset/generator.js.map +0 -1
  413. package/src/generators/preset/tool-versions.js.map +0 -1
  414. package/src/generators/preset/workspace-files-ci-acceptance.js.map +0 -1
  415. package/src/generators/preset/workspace-files-developer-agent.js.map +0 -1
  416. package/src/generators/preset/workspace-files-ecr-inspector.js.map +0 -1
  417. package/src/generators/preset/workspace-files-foundation-workload-roles.js.map +0 -1
  418. package/src/generators/preset/workspace-files-performance-cost.js.map +0 -1
  419. package/src/generators/preset/workspace-files-performance-load.js.map +0 -1
  420. package/src/generators/preset/workspace-files-stage-authority.js.map +0 -1
  421. package/src/generators/preset/workspace-files-thin-deploy.js.map +0 -1
  422. package/src/generators/preset/workspace-files-thin-docs.js.map +0 -1
  423. package/src/generators/preset/workspace-files-thin-release.js.map +0 -1
  424. package/src/generators/preset/workspace-files-workload-role-baseline.js.map +0 -1
  425. package/src/generators/preset/workspace-files.js.map +0 -1
  426. package/src/generators/repository-policy/repository-policy.js.map +0 -1
  427. package/src/generators/repository-policy/tree-policy.js.map +0 -1
  428. package/src/generators/service/service.js.map +0 -1
  429. package/src/generators/slice/built-in-plan-api-contract-files.js.map +0 -1
  430. package/src/generators/slice/built-in-plan-api-files.js.map +0 -1
  431. package/src/generators/slice/built-in-plan-async-work-files.js.map +0 -1
  432. package/src/generators/slice/built-in-plan-authorization-files.js.map +0 -1
  433. package/src/generators/slice/built-in-plan-authorization-infrastructure-files.js.map +0 -1
  434. package/src/generators/slice/built-in-plan-background-work-files.js.map +0 -1
  435. package/src/generators/slice/built-in-plan-data-deletion-files.js.map +0 -1
  436. package/src/generators/slice/built-in-plan-data-export-infrastructure-files.js.map +0 -1
  437. package/src/generators/slice/built-in-plan-data-files.js.map +0 -1
  438. package/src/generators/slice/built-in-plan-data-lifecycle-files.js.map +0 -1
  439. package/src/generators/slice/built-in-plan-data-lifecycle-runtime-files.js.map +0 -1
  440. package/src/generators/slice/built-in-plan-data-retention-job-files.js.map +0 -1
  441. package/src/generators/slice/built-in-plan-data-retention-launcher-files.js.map +0 -1
  442. package/src/generators/slice/built-in-plan-data-rights-files.js.map +0 -1
  443. package/src/generators/slice/built-in-plan-database-lifecycle-files.js.map +0 -1
  444. package/src/generators/slice/built-in-plan-database-retirement-rehearsal-files.js.map +0 -1
  445. package/src/generators/slice/built-in-plan-foundation-files.js.map +0 -1
  446. package/src/generators/slice/built-in-plan-frontend-files.js.map +0 -1
  447. package/src/generators/slice/built-in-plan-infrastructure-files.js.map +0 -1
  448. package/src/generators/slice/built-in-plan-infrastructure-safety-files.js.map +0 -1
  449. package/src/generators/slice/built-in-plan-metadata-files.js.map +0 -1
  450. package/src/generators/slice/built-in-plan-native-runtime-authority-files.js.map +0 -1
  451. package/src/generators/slice/built-in-plan-operations-files.js.map +0 -1
  452. package/src/generators/slice/built-in-plan-performance-files.js.map +0 -1
  453. package/src/generators/slice/built-in-plan-project-files.js.map +0 -1
  454. package/src/generators/slice/built-in-plan-release-files.js.map +0 -1
  455. package/src/generators/slice/built-in-plan-reliability-files.js.map +0 -1
  456. package/src/generators/slice/built-in-plan-secret-runtime-files.js.map +0 -1
  457. package/src/generators/slice/built-in-plan-shared.js.map +0 -1
  458. package/src/generators/slice/built-in-plan-testing-files.js.map +0 -1
  459. package/src/generators/slice/built-in-plan-thin-release-files.js.map +0 -1
  460. package/src/generators/slice/built-in-plan-verification-files.js.map +0 -1
  461. package/src/generators/slice/built-in-plan-web-files.js.map +0 -1
  462. package/src/generators/slice/built-in-plan-workload-role-files.js.map +0 -1
  463. package/src/generators/slice/built-in-plan.js.map +0 -1
  464. package/src/generators/slice/slice.js.map +0 -1
  465. package/src/generators/upgrade/upgrade.js.map +0 -1
  466. package/src/generators/workload/frozen-container.js.map +0 -1
  467. package/src/generators/workload/performance-registration.js.map +0 -1
  468. package/src/generators/workload/reliability-registration.js.map +0 -1
  469. package/src/generators/workload/service-performance-files.js.map +0 -1
  470. package/src/generators/workload/workload.js.map +0 -1
  471. package/src/git-policy/action-pins.js.map +0 -1
  472. package/src/git-policy/github-bootstrap.js.map +0 -1
  473. package/src/git-policy/index.js.map +0 -1
  474. package/src/git-policy/routing.js.map +0 -1
  475. package/src/index.js.map +0 -1
  476. package/src/infrastructure-change/convergence.js.map +0 -1
  477. package/src/infrastructure-change/drift.js.map +0 -1
  478. package/src/infrastructure-change/index.js.map +0 -1
  479. package/src/infrastructure-change/local-capability.js.map +0 -1
  480. package/src/infrastructure-change/model.js.map +0 -1
  481. package/src/infrastructure-change/normalize.js.map +0 -1
  482. package/src/infrastructure-change/plan.js.map +0 -1
  483. package/src/infrastructure-change/risk.js.map +0 -1
  484. package/src/infrastructure-change/summary.js.map +0 -1
  485. package/src/local-dev/context-discovery.js.map +0 -1
  486. package/src/local-dev/contract-validation.js.map +0 -1
  487. package/src/local-dev/contracts.js.map +0 -1
  488. package/src/local-dev/control-contract.js.map +0 -1
  489. package/src/local-dev/dev-command-core.js.map +0 -1
  490. package/src/local-dev/effects.js.map +0 -1
  491. package/src/local-dev/environment-inspector.js.map +0 -1
  492. package/src/local-dev/environment-state.js.map +0 -1
  493. package/src/local-dev/errors.js.map +0 -1
  494. package/src/local-dev/fleet-client.js.map +0 -1
  495. package/src/local-dev/fleet-configuration.js.map +0 -1
  496. package/src/local-dev/fleet-inventory.js.map +0 -1
  497. package/src/local-dev/fleet-ipc.js.map +0 -1
  498. package/src/local-dev/fleet-launcher.js.map +0 -1
  499. package/src/local-dev/fleet-lock.js.map +0 -1
  500. package/src/local-dev/fleet-logs.js.map +0 -1
  501. package/src/local-dev/fleet-process.js.map +0 -1
  502. package/src/local-dev/fleet-runtime.js.map +0 -1
  503. package/src/local-dev/fleet-session.js.map +0 -1
  504. package/src/local-dev/fleet-slice-runner-daemon.js.map +0 -1
  505. package/src/local-dev/fleet-startup.js.map +0 -1
  506. package/src/local-dev/fleet-state.js.map +0 -1
  507. package/src/local-dev/fleet-supervisor-daemon.js.map +0 -1
  508. package/src/local-dev/fleet-supervisor.js.map +0 -1
  509. package/src/local-dev/gateway-daemon.js.map +0 -1
  510. package/src/local-dev/gateway.js.map +0 -1
  511. package/src/local-dev/identity.js.map +0 -1
  512. package/src/local-dev/index.js.map +0 -1
  513. package/src/local-dev/local-context.js.map +0 -1
  514. package/src/local-dev/nx-workspace.js.map +0 -1
  515. package/src/local-dev/personal-secret-ledger.js.map +0 -1
  516. package/src/local-dev/personal-stage.js.map +0 -1
  517. package/src/local-dev/portless.js.map +0 -1
  518. package/src/local-dev/ports.js.map +0 -1
  519. package/src/local-dev/private-state.js.map +0 -1
  520. package/src/local-dev/process-identity.js.map +0 -1
  521. package/src/local-dev/proxy.js.map +0 -1
  522. package/src/local-dev/runtime-paths.js.map +0 -1
  523. package/src/local-dev/secret-slice-claim.js.map +0 -1
  524. package/src/local-dev/slice-claim.js.map +0 -1
  525. package/src/local-dev/slice-runner.js.map +0 -1
  526. package/src/local-dev/tls.js.map +0 -1
  527. package/src/ownership/composition.js.map +0 -1
  528. package/src/ownership/foundation-record.js.map +0 -1
  529. package/src/ownership/hash.js.map +0 -1
  530. package/src/ownership/index.js.map +0 -1
  531. package/src/ownership/json-ownership.js.map +0 -1
  532. package/src/ownership/record.js.map +0 -1
  533. package/src/ownership/workspace-record.js.map +0 -1
  534. package/src/performance/cost-collection.js.map +0 -1
  535. package/src/performance/cost-controls.js.map +0 -1
  536. package/src/performance/evidence.js.map +0 -1
  537. package/src/performance/index.js.map +0 -1
  538. package/src/performance/load-safety.js.map +0 -1
  539. package/src/performance/model.js.map +0 -1
  540. package/src/performance/pr-artifact-budget.js.map +0 -1
  541. package/src/performance/runner.js.map +0 -1
  542. package/src/performance/scenario-endpoint.js.map +0 -1
  543. package/src/performance/scenario.js.map +0 -1
  544. package/src/performance/test-fixtures.d.ts +0 -7
  545. package/src/performance/test-fixtures.js +0 -167
  546. package/src/performance/test-fixtures.js.map +0 -1
  547. package/src/performance/unit-cost.js.map +0 -1
  548. package/src/release/index.js.map +0 -1
  549. package/src/release/lifecycle.js.map +0 -1
  550. package/src/release/manifest.js.map +0 -1
  551. package/src/release/rollout.js.map +0 -1
  552. package/src/release/source-authority.js.map +0 -1
  553. package/src/repository-policy/aurora-preflight.js.map +0 -1
  554. package/src/repository-policy/capacity-migration.js.map +0 -1
  555. package/src/repository-policy/deployment-plan.js.map +0 -1
  556. package/src/repository-policy/foundation-profile.js.map +0 -1
  557. package/src/repository-policy/index.js.map +0 -1
  558. package/src/repository-policy/policy.js.map +0 -1
  559. package/src/secrets/adapters.js.map +0 -1
  560. package/src/secrets/aws-control-plane.js.map +0 -1
  561. package/src/secrets/declaration-verification.js.map +0 -1
  562. package/src/secrets/generated-aws-control-plane.js.map +0 -1
  563. package/src/secrets/guardrails.js.map +0 -1
  564. package/src/secrets/index.js.map +0 -1
  565. package/src/secrets/metadata.js.map +0 -1
  566. package/src/secrets/model.js.map +0 -1
  567. package/src/secrets/operator.js.map +0 -1
  568. package/src/secrets/permissions.js.map +0 -1
  569. package/src/secrets/personal-command.js.map +0 -1
  570. package/src/secrets/personal-ledger.js.map +0 -1
  571. package/src/secrets/registry.js.map +0 -1
  572. package/src/secrets/verification.js.map +0 -1
  573. package/src/secrets/workload-access.js.map +0 -1
  574. package/src/sst-environment-source-format.js.map +0 -1
  575. package/src/supply-chain/action-pins.js.map +0 -1
  576. package/src/supply-chain/blueprint-trust-git.js.map +0 -1
  577. package/src/supply-chain/blueprint-trust-process.js.map +0 -1
  578. package/src/supply-chain/blueprint-trust.js.map +0 -1
  579. package/src/supply-chain/blueprint-verification-authority.js.map +0 -1
  580. package/src/supply-chain/blueprint-verification-execution.js.map +0 -1
  581. package/src/supply-chain/build-output-bounds.js.map +0 -1
  582. package/src/supply-chain/build-output.js.map +0 -1
  583. package/src/supply-chain/common.js.map +0 -1
  584. package/src/supply-chain/container-artifact-contract.js.map +0 -1
  585. package/src/supply-chain/container-release.js.map +0 -1
  586. package/src/supply-chain/ecr-applicability.js.map +0 -1
  587. package/src/supply-chain/ecr-scanning.js.map +0 -1
  588. package/src/supply-chain/ecs-deployed-image.js.map +0 -1
  589. package/src/supply-chain/errors.js.map +0 -1
  590. package/src/supply-chain/generated-blueprint-trust-command.js.map +0 -1
  591. package/src/supply-chain/generated-command.js.map +0 -1
  592. package/src/supply-chain/generated-container-release-command.js.map +0 -1
  593. package/src/supply-chain/generated-ecr-collector-command.js.map +0 -1
  594. package/src/supply-chain/generated-files.js.map +0 -1
  595. package/src/supply-chain/generated-scanner-command.js.map +0 -1
  596. package/src/supply-chain/index.js.map +0 -1
  597. package/src/supply-chain/inventory.js.map +0 -1
  598. package/src/supply-chain/license-expression.js.map +0 -1
  599. package/src/supply-chain/pnpm-toolchain-authority.js.map +0 -1
  600. package/src/supply-chain/policy.js.map +0 -1
  601. package/src/supply-chain/publication.js.map +0 -1
  602. package/src/supply-chain/sbom.js.map +0 -1
  603. package/src/supply-chain/scanner.js.map +0 -1
  604. package/src/supply-chain/vendored-source.js.map +0 -1
  605. package/src/testing-evidence/fixture-scope.js.map +0 -1
  606. package/src/testing-evidence/index.js.map +0 -1
  607. package/src/testing-evidence/quarantine.js.map +0 -1
  608. package/src/testing-evidence/result.js.map +0 -1
  609. package/src/testing-evidence/runner-adapter.js.map +0 -1
  610. package/src/testing-evidence/sensitive-artifacts.js.map +0 -1
  611. package/src/validation.js.map +0 -1
  612. package/src/work-markers/index.js.map +0 -1
  613. package/src/work-markers/work-markers.js.map +0 -1
  614. package/src/workload-roles/account-baseline.js.map +0 -1
  615. package/src/workload-roles/authority.js.map +0 -1
  616. package/src/workload-roles/aws-adapter.js.map +0 -1
  617. package/src/workload-roles/aws-internal-handler.js.map +0 -1
  618. package/src/workload-roles/aws-s3-state.js.map +0 -1
  619. package/src/workload-roles/aws-sdk-control-plane.js.map +0 -1
  620. package/src/workload-roles/boundary.js.map +0 -1
  621. package/src/workload-roles/convergence.js.map +0 -1
  622. package/src/workload-roles/effective-policy.js.map +0 -1
  623. package/src/workload-roles/handler.js.map +0 -1
  624. package/src/workload-roles/history.js.map +0 -1
  625. package/src/workload-roles/index.js.map +0 -1
  626. package/src/workload-roles/injection.js.map +0 -1
  627. package/src/workload-roles/manifest.js.map +0 -1
  628. package/src/workload-roles/provisioner.js.map +0 -1
  629. package/src/workload-roles/registration.js.map +0 -1
  630. package/src/workload-roles/stage-boundary.js.map +0 -1
  631. package/src/workload-roles/standard-slice.js.map +0 -1
  632. package/src/workspace-deployment/affected-lifecycle.js.map +0 -1
  633. package/src/workspace-deployment/identity.js.map +0 -1
  634. package/src/workspace-deployment/index.js.map +0 -1
  635. package/src/workspace-deployment/migration-evidence.js.map +0 -1
  636. package/src/workspace-deployment/migration.js.map +0 -1
  637. package/src/workspace-deployment/ownership.js.map +0 -1
@@ -1,5 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SUPERVISOR_READINESS_TIMEOUT_MS = void 0;
3
4
  exports.resolveGitCommonDirectory = resolveGitCommonDirectory;
4
5
  exports.prepareFleetLaunch = prepareFleetLaunch;
5
6
  exports.verifyAttachedState = verifyAttachedState;
@@ -57,7 +58,7 @@ function workspaceName(plan) {
57
58
  }
58
59
  async function prepareFleetLaunch(input, dependencies = {}) {
59
60
  const workspaceRealpath = (0, node_fs_1.realpathSync)(input.workspaceRoot);
60
- const identity = (dependencies.personalStageResolver ?? (0, personal_stage_js_1.createPersonalStageResolver)()).resolve();
61
+ const identity = (dependencies.personalStageResolver ?? (0, personal_stage_js_1.createPersonalStageResolver)()).resolve(workspaceRealpath);
61
62
  const plan = await (dependencies.loadPlan ?? nx_workspace_js_1.loadWorkspaceFleetPlan)();
62
63
  const name = workspaceName(plan);
63
64
  const fleetId = (0, identity_js_1.createFleetId)({
@@ -126,7 +127,18 @@ function verifyAttachedState(prepared, client) {
126
127
  }
127
128
  });
128
129
  }
129
- async function waitForSupervisor(prepared, child, security, timeoutMs = 15_000) {
130
+ /** Supervisor readiness budget: startup captures identities through
131
+ * PowerShell on Windows, several seconds each. */
132
+ exports.SUPERVISOR_READINESS_TIMEOUT_MS = Object.freeze({
133
+ default: 15_000,
134
+ win32: 60_000,
135
+ });
136
+ function supervisorReadinessTimeout() {
137
+ return process.platform === 'win32'
138
+ ? exports.SUPERVISOR_READINESS_TIMEOUT_MS.win32
139
+ : exports.SUPERVISOR_READINESS_TIMEOUT_MS.default;
140
+ }
141
+ async function waitForSupervisor(prepared, child, security, timeoutMs = supervisorReadinessTimeout()) {
130
142
  const deadline = Date.now() + timeoutMs;
131
143
  let lastError;
132
144
  let exited;
@@ -63,15 +63,35 @@ function isSensitiveRecordKey(key) {
63
63
  function logError(message) {
64
64
  throw new errors_js_1.LocalDevContractError('log-query-invalid', message);
65
65
  }
66
+ function safeLogCharacter(character) {
67
+ const codePoint = character.codePointAt(0);
68
+ return (codePoint === 0x09 ||
69
+ (codePoint >= 0x20 &&
70
+ !(codePoint >= 0x7f && codePoint <= 0x9f) &&
71
+ codePoint !== 0x2028 &&
72
+ codePoint !== 0x2029));
73
+ }
74
+ /** Log text is not an identity token: indentation and tabs are meaningful. */
75
+ function requireLogMessage(value) {
76
+ if (typeof value !== 'string' ||
77
+ value.length === 0 ||
78
+ Buffer.byteLength(value, 'utf8') > exports.LOCAL_LOG_MAX_LINE_BYTES ||
79
+ [...value].some((character) => !safeLogCharacter(character))) {
80
+ return logError('Local log message must be bounded UTF-8 text without unsafe controls.');
81
+ }
82
+ return value;
83
+ }
84
+ function truncateUtf8(value, maximumBytes) {
85
+ const bytes = Buffer.from(value, 'utf8');
86
+ if (bytes.length <= maximumBytes)
87
+ return value;
88
+ let end = maximumBytes;
89
+ while (end > 0 && (bytes[end] & 0xc0) === 0x80)
90
+ end -= 1;
91
+ return bytes.subarray(0, end).toString('utf8');
92
+ }
66
93
  function stripUnsafeTerminalText(value) {
67
- return [...value.replace(ANSI_ESCAPE, '')]
68
- .filter((character) => {
69
- const codePoint = character.codePointAt(0);
70
- return (codePoint === 0x09 ||
71
- (codePoint >= 0x20 && codePoint !== 0x7f) ||
72
- codePoint > 0x9f);
73
- })
74
- .join('');
94
+ return [...value.replace(ANSI_ESCAPE, '')].filter(safeLogCharacter).join('');
75
95
  }
76
96
  function replaceCredentialUrl(value) {
77
97
  return value.replace(sharedCredentialPattern('credential-url'), (credentialUrl) => {
@@ -94,7 +114,7 @@ function boundedRecordValue(value, exactValues, depth = 0) {
94
114
  if (depth > 4)
95
115
  return '[TRUNCATED_DEPTH]';
96
116
  if (typeof value === 'string') {
97
- return redactLocalLogText(value, exactValues).slice(0, 2_048);
117
+ return truncateUtf8(redactLocalLogText(value, exactValues), 2_048);
98
118
  }
99
119
  if (value === null ||
100
120
  typeof value === 'boolean' ||
@@ -166,9 +186,7 @@ function validateLocalLogEnvelope(value) {
166
186
  fleetId: (0, fleet_lock_js_1.validateFleetIdentitySlug)(value.fleetId, 'Local log fleetId'),
167
187
  kind: value.kind,
168
188
  level: value.level,
169
- message: (0, contract_validation_js_1.requireBoundedString)(value.message, 'Local log message', {
170
- maximumLength: exports.LOCAL_LOG_MAX_LINE_BYTES,
171
- }),
189
+ message: requireLogMessage(value.message),
172
190
  schemaVersion: exports.LOCAL_LOG_SCHEMA_VERSION,
173
191
  sequence: (0, contract_validation_js_1.requireInteger)(value.sequence, 'Local log sequence', 0, Number.MAX_SAFE_INTEGER),
174
192
  sessionGeneration: (0, contract_validation_js_1.requireBoundedString)(value.sessionGeneration, 'Local log sessionGeneration', {
@@ -338,6 +356,9 @@ class FleetLogStore {
338
356
  this.#maxAgeMs = options.maxAgeMs ?? exports.LOCAL_LOG_MAX_AGE_MS;
339
357
  this.#maxGenerations = options.maxGenerations ?? exports.LOCAL_LOG_MAX_GENERATIONS;
340
358
  this.#maxLineBytes = options.maxLineBytes ?? exports.LOCAL_LOG_MAX_LINE_BYTES;
359
+ if (this.#maxLineBytes > exports.LOCAL_LOG_MAX_LINE_BYTES) {
360
+ return logError('Local log line bound cannot exceed the public protocol byte limit.');
361
+ }
341
362
  this.#now = options.now ?? (() => new Date());
342
363
  this.#security = options.security ?? {};
343
364
  for (const [value, label] of [
@@ -392,11 +413,8 @@ class FleetLogStore {
392
413
  writeLine(slice, stream, attempt, line) {
393
414
  const terminalSafe = stripUnsafeTerminalText(line);
394
415
  const bytes = Buffer.byteLength(terminalSafe);
395
- const truncated = bytes > this.#maxLineBytes;
416
+ let truncated = bytes > this.#maxLineBytes;
396
417
  const redacted = redactLocalLogText(terminalSafe, this.#exactValues);
397
- const boundedPlain = truncated
398
- ? Buffer.from(redacted).subarray(0, this.#maxLineBytes).toString('utf8')
399
- : redacted;
400
418
  let parsed;
401
419
  if (!truncated) {
402
420
  try {
@@ -406,22 +424,32 @@ class FleetLogStore {
406
424
  parsed = undefined;
407
425
  }
408
426
  }
409
- const structured = parsed !== null && typeof parsed === 'object' && !Array.isArray(parsed);
410
- const bounded = structured ? terminalSafe : boundedPlain;
411
- const record = structured
427
+ let structured = parsed !== null && typeof parsed === 'object' && !Array.isArray(parsed);
428
+ let record = structured
412
429
  ? boundedRecordValue(parsed, this.#exactValues)
413
430
  : undefined;
414
- const rawMessage = record && typeof record.message === 'string'
431
+ let rawMessage = record && typeof record.message === 'string'
415
432
  ? record.message
416
433
  : structured
417
434
  ? 'Structured log record'
418
- : bounded || '[empty line]';
435
+ : redacted || '[empty line]';
436
+ // Redaction can expand short inputs. Bound the sanitized payload, not its
437
+ // pre-redaction length, and never split a multi-byte UTF-8 character.
438
+ if (record &&
439
+ Buffer.byteLength(JSON.stringify(record)) > this.#maxLineBytes) {
440
+ rawMessage = JSON.stringify(record);
441
+ record = undefined;
442
+ structured = false;
443
+ truncated = true;
444
+ }
445
+ truncated ||= Buffer.byteLength(rawMessage) > this.#maxLineBytes;
446
+ const message = truncateUtf8(rawMessage, this.#maxLineBytes) || '.';
419
447
  const envelope = {
420
448
  attempt,
421
449
  fleetId: this.#fleetId,
422
450
  kind: structured ? 'structured' : 'plain',
423
451
  level: normalizeLevel(record?.level, stream),
424
- message: rawMessage,
452
+ message,
425
453
  ...(record ? { record } : {}),
426
454
  schemaVersion: exports.LOCAL_LOG_SCHEMA_VERSION,
427
455
  sequence: this.#sequence,
@@ -1,6 +1,8 @@
1
1
  import { type ChildProcess } from 'node:child_process';
2
2
  import type { LocalDevAdapter } from './contracts.js';
3
3
  import type { FleetLogStore } from './fleet-logs.js';
4
+ import type { FleetProcessIdentity } from './fleet-lock.js';
5
+ import type { NativeDevelopmentCompletion } from './native-completion.js';
4
6
  export type FleetProcessRouteState = 'remote' | 'starting' | 'ready' | 'unavailable';
5
7
  export type FleetProcessCleanupState = 'failed' | 'not-declared' | 'pending' | 'succeeded';
6
8
  export interface FleetProcessLaunch {
@@ -8,6 +10,10 @@ export interface FleetProcessLaunch {
8
10
  child: ChildProcess;
9
11
  }
10
12
  export interface FleetProcessEffects {
13
+ /** Native provisioning may outlast HTTP readiness. This is an owned launch
14
+ * notification, not an HTTP-health result. Non-native adapters omit it. */
15
+ applicationStarted?: () => boolean;
16
+ nativeDeployment?: (signal: AbortSignal) => Promise<NativeDevelopmentCompletion>;
11
17
  cleanup?: () => Promise<void>;
12
18
  delay?: (milliseconds: number, signal: AbortSignal) => Promise<void>;
13
19
  launch: (attempt: number) => FleetProcessLaunch;
@@ -19,6 +25,7 @@ export interface FleetProcessEffects {
19
25
  export interface FleetProcessControllerOptions {
20
26
  adapter: LocalDevAdapter;
21
27
  healthTimeoutMs?: number;
28
+ provisioningTimeoutMs?: number;
22
29
  logStore?: FleetLogStore;
23
30
  maxRestartAttempts: number;
24
31
  name: string;
@@ -33,7 +40,15 @@ export declare function planFleetRestart(completedRestartAttempts: number, maxRe
33
40
  nextAttempt: number;
34
41
  restart: true;
35
42
  };
36
- export declare function terminateOwnedChild(child: ChildProcess): Promise<void>;
43
+ export declare function assertOwnedGroupAbsent(pid: number, deadline?: number): Promise<void>;
44
+ export declare function terminateOwnedChild(child: ChildProcess, ownedIdentity?: FleetProcessIdentity): Promise<void>;
45
+ export declare const FLEET_RUNNER_STOP_MESSAGE = "ebk-fleet-runner-stop";
46
+ /** A runner coordinates detached children and native cleanup. Never force-kill
47
+ * that coordinator on a client observation deadline. An explicit diagnostic
48
+ * deadline retains live ownership and reports failure instead of orphaning a
49
+ * writer (and falsely permitting stale-process recovery).
50
+ */
51
+ export declare function terminateCoordinatingFleetRunner(child: ChildProcess, runnerGeneration: string, timeoutMs?: number): Promise<void>;
37
52
  export declare class FleetProcessController {
38
53
  #private;
39
54
  constructor(options: FleetProcessControllerOptions, effects: FleetProcessEffects);
@@ -42,6 +57,10 @@ export declare class FleetProcessController {
42
57
  get runnerGeneration(): string | undefined;
43
58
  get state(): FleetProcessRouteState;
44
59
  start(): Promise<void>;
60
+ /** Cancel readiness and pending automatic retries, not controller lifetime.
61
+ * The serialized startup rollback retains
62
+ * responsibility for native termination and exact cleanup before down runs. */
63
+ interruptStartup(): void;
45
64
  restart(): Promise<void>;
46
65
  stop(options: {
47
66
  cleanup: boolean;
@@ -1,11 +1,15 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.FleetProcessController = void 0;
3
+ exports.FleetProcessController = exports.FLEET_RUNNER_STOP_MESSAGE = void 0;
4
4
  exports.fleetRestartDelay = fleetRestartDelay;
5
5
  exports.planFleetRestart = planFleetRestart;
6
+ exports.assertOwnedGroupAbsent = assertOwnedGroupAbsent;
6
7
  exports.terminateOwnedChild = terminateOwnedChild;
8
+ exports.terminateCoordinatingFleetRunner = terminateCoordinatingFleetRunner;
7
9
  const node_child_process_1 = require("node:child_process");
8
10
  const errors_js_1 = require("./errors.js");
11
+ const process_group_js_1 = require("./process-group.js");
12
+ const process_identity_js_1 = require("./process-identity.js");
9
13
  function fleetRestartDelay(attempt) {
10
14
  if (!Number.isInteger(attempt) || attempt < 0) {
11
15
  throw new errors_js_1.LocalDevContractError('invalid-input', 'Fleet restart attempt must be a non-negative integer.');
@@ -27,9 +31,40 @@ function planFleetRestart(completedRestartAttempts, maxRestartAttempts) {
27
31
  restart: true,
28
32
  };
29
33
  }
30
- async function terminateOwnedChild(child) {
31
- if (child.exitCode !== null || child.signalCode !== null)
34
+ async function waitForOwnedExit(exited, timeoutMs) {
35
+ let timer;
36
+ try {
37
+ return await Promise.race([
38
+ exited.then(() => true),
39
+ new Promise((resolvePromise) => {
40
+ timer = setTimeout(() => resolvePromise(false), timeoutMs);
41
+ }),
42
+ ]);
43
+ }
44
+ finally {
45
+ if (timer)
46
+ clearTimeout(timer);
47
+ }
48
+ }
49
+ async function assertOwnedGroupAbsent(pid, deadline = Date.now() + 1_000) {
50
+ // Native Windows retains its existing taskkill contract. This POSIX proof
51
+ // is not a claim that Windows orphan trees can be inspected after exit.
52
+ if (process.platform === 'win32')
53
+ return;
54
+ while ((0, process_group_js_1.exactOwnedProcessGroupExists)(pid)) {
55
+ if (Date.now() >= deadline)
56
+ throw new errors_js_1.LocalDevContractError('cleanup-incomplete', 'Owned child group remains after leader exit; child ownership is retained.');
57
+ await new Promise((resolve) => setTimeout(resolve, 25));
58
+ }
59
+ }
60
+ async function terminateOwnedChild(child, ownedIdentity) {
61
+ if (!child.pid)
62
+ throw new errors_js_1.LocalDevContractError('cleanup-incomplete', 'Owned child PID is unavailable.');
63
+ if (child.exitCode !== null || child.signalCode !== null) {
64
+ await assertOwnedGroupAbsent(child.pid);
32
65
  return;
66
+ }
67
+ const deadline = Date.now() + process_group_js_1.OWNED_PROCESS_SIGNAL_GRACE_MS + process_group_js_1.OWNED_PROCESS_KILL_WAIT_MS;
33
68
  const exited = new Promise((resolvePromise) => child.once('exit', () => resolvePromise()));
34
69
  if (process.platform === 'win32' && child.pid) {
35
70
  const killer = (0, node_child_process_1.spawn)('taskkill', ['/pid', String(child.pid), '/t', '/f'], {
@@ -37,36 +72,84 @@ async function terminateOwnedChild(child) {
37
72
  windowsHide: true,
38
73
  });
39
74
  await new Promise((resolvePromise) => killer.once('exit', () => resolvePromise()));
40
- await Promise.race([
41
- exited,
42
- new Promise((resolvePromise) => setTimeout(resolvePromise, 2_000)),
43
- ]);
75
+ await waitForOwnedExit(exited, 2_000);
44
76
  return;
45
77
  }
46
- if (child.pid) {
78
+ const identity = ownedIdentity ?? (0, process_identity_js_1.captureProcessIdentity)(child.pid);
79
+ const signalOwned = (signal) => {
80
+ if (identity.pid !== child.pid ||
81
+ (0, process_identity_js_1.probeProcessIdentity)(identity) !== 'matching')
82
+ throw new errors_js_1.LocalDevContractError('cleanup-incomplete', 'Owned child identity changed; no process group was signaled.');
47
83
  try {
48
- process.kill(-child.pid, 'SIGTERM');
84
+ process.kill(-identity.pid, signal);
49
85
  }
50
- catch {
51
- child.kill('SIGTERM');
86
+ catch (error) {
87
+ if (typeof error !== 'object' ||
88
+ error === null ||
89
+ !('code' in error) ||
90
+ error.code !== 'ESRCH')
91
+ throw error;
92
+ if ((0, process_identity_js_1.probeProcessIdentity)(identity) !== 'matching')
93
+ throw new errors_js_1.LocalDevContractError('cleanup-incomplete', 'Owned child identity changed before direct signal.');
94
+ child.kill(signal);
52
95
  }
53
- }
54
- const stopped = await Promise.race([
55
- exited.then(() => true),
56
- new Promise((resolvePromise) => setTimeout(() => resolvePromise(false), 5_000)),
57
- ]);
96
+ };
97
+ signalOwned('SIGTERM');
98
+ const stopped = await waitForOwnedExit(exited, process_group_js_1.OWNED_PROCESS_SIGNAL_GRACE_MS);
58
99
  if (!stopped && child.pid) {
100
+ signalOwned('SIGKILL');
101
+ if (!(await waitForOwnedExit(exited, Math.max(0, deadline - Date.now()))))
102
+ throw new errors_js_1.LocalDevContractError('cleanup-incomplete', 'Owned child did not exit; ownership is retained.');
103
+ }
104
+ await assertOwnedGroupAbsent(child.pid, deadline);
105
+ }
106
+ exports.FLEET_RUNNER_STOP_MESSAGE = 'ebk-fleet-runner-stop';
107
+ /** A runner coordinates detached children and native cleanup. Never force-kill
108
+ * that coordinator on a client observation deadline. An explicit diagnostic
109
+ * deadline retains live ownership and reports failure instead of orphaning a
110
+ * writer (and falsely permitting stale-process recovery).
111
+ */
112
+ async function terminateCoordinatingFleetRunner(child, runnerGeneration, timeoutMs) {
113
+ if (child.exitCode !== null || child.signalCode !== null)
114
+ return;
115
+ if (!child.connected || !child.send) {
116
+ throw new errors_js_1.LocalDevContractError('cleanup-incomplete', 'Fleet runner control channel is unavailable; live ownership is retained.');
117
+ }
118
+ if (timeoutMs !== undefined &&
119
+ (!Number.isInteger(timeoutMs) || timeoutMs < 1 || timeoutMs > 300_000)) {
120
+ throw new errors_js_1.LocalDevContractError('invalid-input', 'Invalid runner stop deadline.');
121
+ }
122
+ await new Promise((resolvePromise, reject) => {
123
+ const settle = (error) => {
124
+ if (timer)
125
+ clearTimeout(timer);
126
+ child.removeListener('exit', exited);
127
+ child.removeListener('error', failed);
128
+ if (error)
129
+ reject(error);
130
+ else
131
+ resolvePromise();
132
+ };
133
+ const exited = () => settle();
134
+ const failed = (error) => settle(error);
135
+ child.once('exit', exited);
136
+ child.once('error', failed);
137
+ // Native SST removal may legitimately outlive a client's observation
138
+ // deadline. The ordinary stop retains ownership until the exact runner
139
+ // exits; an explicit deadline is only for bounded diagnostics/tests.
140
+ const timer = timeoutMs === undefined
141
+ ? undefined
142
+ : setTimeout(() => settle(new errors_js_1.LocalDevContractError('cleanup-incomplete', `Fleet runner has not completed coordinated shutdown within ${timeoutMs}ms; its process and claim remain retained.`)), timeoutMs);
59
143
  try {
60
- process.kill(-child.pid, 'SIGKILL');
144
+ child.send?.({ type: exports.FLEET_RUNNER_STOP_MESSAGE, runnerGeneration }, (error) => {
145
+ if (error)
146
+ settle(error);
147
+ });
61
148
  }
62
- catch {
63
- child.kill('SIGKILL');
149
+ catch (error) {
150
+ settle(error instanceof Error ? error : new Error(String(error)));
64
151
  }
65
- await Promise.race([
66
- exited,
67
- new Promise((resolvePromise) => setTimeout(resolvePromise, 1_000)),
68
- ]);
69
- }
152
+ });
70
153
  }
71
154
  async function defaultProbe(url, signal) {
72
155
  try {
@@ -86,11 +169,13 @@ function defaultDelay(milliseconds, signal) {
86
169
  resolvePromise();
87
170
  return;
88
171
  }
89
- const timer = setTimeout(resolvePromise, milliseconds);
90
- signal.addEventListener('abort', () => {
172
+ const settle = () => {
91
173
  clearTimeout(timer);
174
+ signal.removeEventListener('abort', settle);
92
175
  resolvePromise();
93
- }, { once: true });
176
+ };
177
+ const timer = setTimeout(settle, milliseconds);
178
+ signal.addEventListener('abort', settle, { once: true });
94
179
  });
95
180
  }
96
181
  class FleetProcessController {
@@ -100,7 +185,9 @@ class FleetProcessController {
100
185
  #cleanup;
101
186
  #effects;
102
187
  #healthTimeoutMs;
188
+ #provisioningTimeoutMs;
103
189
  #lifetime = new AbortController();
190
+ #startup = new AbortController();
104
191
  #logStore;
105
192
  #maxRestartAttempts;
106
193
  #name;
@@ -118,16 +205,28 @@ class FleetProcessController {
118
205
  }
119
206
  this.#adapter = options.adapter;
120
207
  this.#cleanup =
121
- options.adapter.adapterVersion === 2 && options.adapter.lifecycle
208
+ options.adapter.adapterVersion !== 1 && options.adapter.lifecycle
122
209
  ? 'pending'
123
210
  : 'not-declared';
124
211
  this.#healthTimeoutMs = options.healthTimeoutMs ?? 120_000;
212
+ this.#provisioningTimeoutMs = options.provisioningTimeoutMs ?? 30 * 60_000;
213
+ for (const timeout of [
214
+ this.#healthTimeoutMs,
215
+ this.#provisioningTimeoutMs,
216
+ ]) {
217
+ if (!Number.isSafeInteger(timeout) ||
218
+ timeout < 1 ||
219
+ timeout > 2_147_483_647)
220
+ throw new errors_js_1.LocalDevContractError('invalid-input', 'Fleet readiness deadline is invalid.');
221
+ }
125
222
  this.#logStore = options.logStore;
126
223
  this.#maxRestartAttempts = options.maxRestartAttempts;
127
224
  this.#name = options.name;
128
225
  this.#onStateChange = options.onStateChange;
129
226
  this.#upstream = options.upstream;
130
227
  this.#effects = {
228
+ applicationStarted: effects.applicationStarted,
229
+ nativeDeployment: effects.nativeDeployment,
131
230
  cleanup: effects.cleanup,
132
231
  delay: effects.delay ?? defaultDelay,
133
232
  launch: effects.launch,
@@ -158,8 +257,9 @@ class FleetProcessController {
158
257
  child.stderr?.on('data', (chunk) => this.#logStore?.writeChunk(this.#name, 'stderr', attempt, chunk));
159
258
  }
160
259
  #launch() {
260
+ this.#startup = new AbortController();
161
261
  this.#cleanup =
162
- this.#adapter.adapterVersion === 2 && this.#adapter.lifecycle
262
+ this.#adapter.adapterVersion !== 1 && this.#adapter.lifecycle
163
263
  ? 'pending'
164
264
  : 'not-declared';
165
265
  const launched = this.#effects.launch(this.#activeAttempt);
@@ -177,41 +277,80 @@ class FleetProcessController {
177
277
  this.#logStore?.writeLine(this.#name, 'stderr', launched.attempt, `Local process exited with ${signal ? `signal ${signal}` : `status ${code ?? 'unknown'}`}.`);
178
278
  if (signal || code !== 0) {
179
279
  this.#cleanup =
180
- this.#adapter.adapterVersion === 2 && this.#adapter.lifecycle
280
+ this.#adapter.adapterVersion !== 1 && this.#adapter.lifecycle
181
281
  ? 'failed'
182
282
  : 'not-declared';
183
283
  this.#logStore?.writeLine(this.#name, 'stderr', launched.attempt, 'Runner cleanup did not complete cleanly; automatic restart is blocked until declared cleanup succeeds.');
184
284
  return;
185
285
  }
186
- this.#restartTask = this.#autoRestart();
286
+ if (!this.#startup.signal.aborted) {
287
+ this.#restartTask = this.#autoRestart();
288
+ }
187
289
  });
188
290
  }
189
291
  async #waitForReadiness() {
190
- const deadline = Date.now() + this.#healthTimeoutMs;
292
+ const child = this.#child;
293
+ const signal = AbortSignal.any([
294
+ this.#lifetime.signal,
295
+ this.#startup.signal,
296
+ ]);
297
+ const provisioningDeadline = Date.now() + this.#provisioningTimeoutMs;
298
+ let deadline;
191
299
  const target = new URL(this.#adapter.healthPath, this.#upstream);
192
- while (!this.#lifetime.signal.aborted && Date.now() < deadline) {
193
- if (!this.#child) {
300
+ while (!signal.aborted && !this.#stopping) {
301
+ if (!child || this.#child !== child) {
194
302
  throw new errors_js_1.LocalDevContractError('readiness-timeout', `${this.#name} exited before readiness.`);
195
303
  }
196
- if (await this.#effects.probe(target, this.#lifetime.signal)) {
304
+ if (deadline === undefined) {
305
+ const native = await this.#effects.nativeDeployment?.(signal);
306
+ if (native === 'failed') {
307
+ this.#transition('unavailable');
308
+ throw new errors_js_1.LocalDevContractError('prerequisite-unavailable', `${this.#name} native SST deployment failed; web health cannot accept this task. Inspect ebk dev logs ${this.#name}, resolve the native diagnostic, then run ebk dev restart ${this.#name} after owned cleanup settles.`);
309
+ }
310
+ if (native === 'pending' ||
311
+ (this.#effects.applicationStarted &&
312
+ !this.#effects.applicationStarted())) {
313
+ if (Date.now() >= provisioningDeadline) {
314
+ this.#transition('unavailable');
315
+ throw new errors_js_1.LocalDevContractError('provisioning-timeout', `${this.#name} native provisioning did not complete and launch the web application within ${this.#provisioningTimeoutMs}ms. Inspect ebk dev logs before retrying; owned cleanup must settle first.`);
316
+ }
317
+ await this.#effects.delay(500, signal);
318
+ continue;
319
+ }
320
+ deadline = Date.now() + this.#healthTimeoutMs;
321
+ }
322
+ if (Date.now() >= deadline)
323
+ break;
324
+ if (await this.#effects.probe(target, signal)) {
325
+ if (this.#child !== child || this.#stopping || signal.aborted)
326
+ continue;
197
327
  this.#restartAttempts = 0;
198
328
  this.#transition('ready');
199
329
  return;
200
330
  }
201
- await this.#effects.delay(500, this.#lifetime.signal);
331
+ await this.#effects.delay(500, signal);
202
332
  }
203
333
  this.#transition('unavailable');
334
+ if (signal.aborted || this.#stopping) {
335
+ throw new errors_js_1.LocalDevContractError('startup-interrupted', `${this.#name} startup was interrupted; owned cleanup must settle before retrying.`);
336
+ }
204
337
  throw new errors_js_1.LocalDevContractError('readiness-timeout', `${this.#name} did not become ready within ${this.#healthTimeoutMs}ms.`);
205
338
  }
206
339
  async #autoRestart() {
340
+ const signal = AbortSignal.any([
341
+ this.#lifetime.signal,
342
+ this.#startup.signal,
343
+ ]);
344
+ if (this.#stopping || signal.aborted)
345
+ return;
207
346
  const restart = planFleetRestart(this.#restartAttempts, this.#maxRestartAttempts);
208
347
  if (!restart.restart) {
209
348
  this.#logStore?.writeLine(this.#name, 'stderr', this.#activeAttempt, `Automatic restart stopped after ${this.#maxRestartAttempts} attempt(s).`);
210
349
  return;
211
350
  }
212
351
  this.#restartAttempts = restart.nextAttempt;
213
- await this.#effects.delay(restart.delayMs, this.#lifetime.signal);
214
- if (this.#stopping || this.#lifetime.signal.aborted)
352
+ await this.#effects.delay(restart.delayMs, signal);
353
+ if (this.#stopping || signal.aborted)
215
354
  return;
216
355
  this.#activeAttempt = restart.nextAttempt;
217
356
  this.#launch();
@@ -222,7 +361,10 @@ class FleetProcessController {
222
361
  if (this.#child) {
223
362
  await this.#effects.terminate(this.#child);
224
363
  }
225
- if (!this.#restartTask && !this.#lifetime.signal.aborted) {
364
+ if (!this.#restartTask &&
365
+ !this.#stopping &&
366
+ !this.#lifetime.signal.aborted &&
367
+ !this.#startup.signal.aborted) {
226
368
  this.#restartTask = this.#autoRestart();
227
369
  }
228
370
  this.#logStore?.writeLine(this.#name, 'stderr', this.#activeAttempt, error instanceof Error ? error.message : String(error));
@@ -236,6 +378,14 @@ class FleetProcessController {
236
378
  this.#launch();
237
379
  await this.#waitForReadiness();
238
380
  }
381
+ /** Cancel readiness and pending automatic retries, not controller lifetime.
382
+ * The serialized startup rollback retains
383
+ * responsibility for native termination and exact cleanup before down runs. */
384
+ interruptStartup() {
385
+ if (this.#state === 'starting' ||
386
+ (this.#state === 'unavailable' && this.#restartTask))
387
+ this.#startup.abort();
388
+ }
239
389
  async restart() {
240
390
  if (this.#state === 'remote') {
241
391
  throw new errors_js_1.LocalDevContractError('not-running', `${this.#name} is not selected.`);
@@ -243,8 +393,13 @@ class FleetProcessController {
243
393
  this.#stopping = true;
244
394
  try {
245
395
  if (this.#child) {
246
- await this.#effects.prepareRestart?.(this.#child);
247
- await this.#effects.terminate(this.#child);
396
+ const stoppedChild = this.#child;
397
+ await this.#effects.prepareRestart?.(stoppedChild);
398
+ await this.#effects.terminate(stoppedChild);
399
+ if (stoppedChild.exitCode !== 0 || stoppedChild.signalCode !== null) {
400
+ this.#cleanup = 'failed';
401
+ throw new errors_js_1.LocalDevContractError('cleanup-incomplete', `${this.#name} runner did not settle successfully for restart; its claim remains retained.`);
402
+ }
248
403
  }
249
404
  await this.#restartTask;
250
405
  this.#restartTask = undefined;
@@ -263,6 +418,7 @@ class FleetProcessController {
263
418
  if (this.#state === 'remote')
264
419
  return;
265
420
  this.#stopping = true;
421
+ this.#startup.abort();
266
422
  if (this.#child)
267
423
  await this.#effects.terminate(this.#child);
268
424
  await this.#restartTask;
@@ -0,0 +1,5 @@
1
+ import type { FleetStateRecord } from './fleet-state.js';
2
+ import type { FleetRuntimePaths } from './runtime-paths.js';
3
+ import { inspectFleetRunnersAbsent } from './slice-runner.js';
4
+ /** Retire terminal diagnostics only while the supervisor still owns its state. */
5
+ export declare function retireFleetRunnerEvidence(state: FleetStateRecord, paths: FleetRuntimePaths, effects?: Parameters<typeof inspectFleetRunnersAbsent>[2]): void;
@@ -0,0 +1,56 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.retireFleetRunnerEvidence = retireFleetRunnerEvidence;
4
+ const node_fs_1 = require("node:fs");
5
+ const node_path_1 = require("node:path");
6
+ const contract_validation_js_1 = require("./contract-validation.js");
7
+ const errors_js_1 = require("./errors.js");
8
+ const private_state_js_1 = require("./private-state.js");
9
+ const slice_runner_js_1 = require("./slice-runner.js");
10
+ /** Retire terminal diagnostics only while the supervisor still owns its state. */
11
+ function retireFleetRunnerEvidence(state, paths, effects = {}) {
12
+ const security = effects.security ?? {};
13
+ const refuse = () => {
14
+ throw new errors_js_1.LocalDevContractError('fleet-ownership-ambiguous', 'Fleet runner evidence cannot be retired without exact terminal ownership and process absence.');
15
+ };
16
+ if (state.slices.some(({ selected }) => selected))
17
+ refuse();
18
+ if ((0, slice_runner_js_1.inspectFleetRunnersAbsent)(state, paths, effects) !== true)
19
+ refuse();
20
+ if (!(0, node_fs_1.existsSync)(paths.runnersDirectory))
21
+ return;
22
+ (0, private_state_js_1.assertPrivatePath)(paths.runnersDirectory, 'directory', security);
23
+ const archive = (0, node_path_1.join)(paths.logDirectory, 'runner-evidence', (0, contract_validation_js_1.sha256Digest)(state.sessionGeneration));
24
+ (0, private_state_js_1.ensurePrivateDirectory)(paths.logDirectory, security);
25
+ (0, private_state_js_1.ensurePrivateDirectory)((0, node_path_1.join)(paths.logDirectory, 'runner-evidence'), security);
26
+ (0, private_state_js_1.ensurePrivateDirectory)(archive, security);
27
+ // A retry may encounter copies from an interrupted retirement. They must
28
+ // independently belong to this exact terminal generation, never be replaced.
29
+ if ((0, slice_runner_js_1.inspectFleetRunnersAbsent)(state, { ...paths, runnersDirectory: archive }, effects) !== true)
30
+ refuse();
31
+ const entries = (0, node_fs_1.readdirSync)(paths.runnersDirectory).sort();
32
+ const copies = entries.map((name) => ({
33
+ name,
34
+ contents: (0, private_state_js_1.readPrivateFile)((0, node_path_1.join)(paths.runnersDirectory, name), security),
35
+ }));
36
+ for (const { name, contents } of copies) {
37
+ const destination = (0, node_path_1.join)(archive, name);
38
+ (0, private_state_js_1.publishPrivateFileExclusive)(destination, contents, security);
39
+ if (!(0, private_state_js_1.readPrivateFile)(destination, security).equals(contents))
40
+ refuse();
41
+ }
42
+ // No authority is removed until every byte has a verified durable copy.
43
+ if ((0, slice_runner_js_1.inspectFleetRunnersAbsent)(state, paths, effects) !== true)
44
+ refuse();
45
+ if (JSON.stringify((0, node_fs_1.readdirSync)(paths.runnersDirectory).sort()) !==
46
+ JSON.stringify(entries))
47
+ refuse();
48
+ for (const { name, contents } of copies) {
49
+ const source = (0, node_path_1.join)(paths.runnersDirectory, name);
50
+ if (!(0, private_state_js_1.readPrivateFile)(source, security).equals(contents))
51
+ refuse();
52
+ (0, node_fs_1.unlinkSync)(source);
53
+ }
54
+ (0, node_fs_1.rmdirSync)(paths.runnersDirectory);
55
+ }
56
+ //# sourceMappingURL=fleet-runner-evidence.js.map