@timurproko/a1 0.1.8-dev.235df0e → 0.1.8-dev.260

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 (485) hide show
  1. package/README.md +107 -67
  2. package/bin/cli.js +28 -10
  3. package/bin/guardian.js +8 -3
  4. package/bin/module-identity.js +69 -35
  5. package/bin/pi-tui.d.ts +6 -0
  6. package/bin/pi-tui.js +28 -0
  7. package/bin/release-cleanup.js +8 -0
  8. package/bin/supervisor.js +2 -2
  9. package/bin/sync-pi-tui-proxy.js +97 -0
  10. package/bin/ui.js +47 -20
  11. package/bin/warmup.js +27 -0
  12. package/dist/cli/capabilities.d.ts +6 -0
  13. package/dist/{src/cli → cli}/capabilities.js +1 -1
  14. package/dist/{src/cli → cli}/dispatch.d.ts +15 -1
  15. package/dist/cli/dispatch.js +261 -0
  16. package/dist/cli/package-messages.d.ts +26 -0
  17. package/dist/cli/package-messages.js +71 -0
  18. package/dist/{src/cli → cli}/packages.d.ts +11 -2
  19. package/dist/{src/cli → cli}/packages.js +24 -27
  20. package/dist/{src/cli → cli}/version-stats.d.ts +6 -0
  21. package/dist/cli/version-stats.js +112 -0
  22. package/dist/composition/agent-engine-bridge.d.ts +3 -0
  23. package/dist/composition/agent-engine-bridge.js +108 -0
  24. package/dist/composition/index.d.ts +3 -0
  25. package/dist/composition/index.js +3 -0
  26. package/dist/composition/owned-ui.d.ts +31 -0
  27. package/dist/composition/owned-ui.js +66 -0
  28. package/dist/composition/process.d.ts +16 -0
  29. package/dist/composition/process.js +45 -0
  30. package/dist/composition/settings-route-host.d.ts +8 -0
  31. package/dist/composition/settings-route-host.js +75 -0
  32. package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/capability-ports.d.ts +2 -2
  33. package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/domain-validation.js +22 -4
  34. package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/domain.d.ts +17 -0
  35. package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/package-ports.d.ts +6 -0
  36. package/dist/{src/foundation/owned-ui-contracts → contracts/owned-ui}/model.d.ts +36 -0
  37. package/dist/{src/foundation/owned-ui-contracts → contracts/owned-ui}/validation.js +25 -0
  38. package/dist/{src/features → features}/launch/development-launch.js +11 -3
  39. package/dist/{src/features → features}/launch/index.d.ts +0 -1
  40. package/dist/{src/features → features}/launch/index.js +0 -1
  41. package/dist/features/launch/intent.d.ts +10 -0
  42. package/dist/features/launch/intent.js +8 -0
  43. package/dist/{src/features → features}/launch/prepare-launch.d.ts +0 -2
  44. package/dist/{src/features → features}/launch/prepare-launch.js +2 -9
  45. package/dist/{src/features → features}/launch/profile-paths.d.ts +1 -2
  46. package/dist/{src/features → features}/launch/profile-paths.js +2 -8
  47. package/dist/{src/features → features}/launch/runtime-selection.d.ts +2 -5
  48. package/dist/{src/features → features}/owned-ui/customization.d.ts +3 -1
  49. package/dist/{src/features → features}/owned-ui/customization.js +3 -1
  50. package/dist/{src/features → features}/owned-ui/diagnostics.d.ts +2 -1
  51. package/dist/{src/features → features}/owned-ui/diagnostics.js +1 -0
  52. package/dist/{src/features → features}/owned-ui/index.d.ts +2 -0
  53. package/dist/{src/features → features}/owned-ui/index.js +2 -0
  54. package/dist/features/owned-ui/project-trust-prompt.d.ts +25 -0
  55. package/dist/features/owned-ui/project-trust-prompt.js +149 -0
  56. package/dist/{src/features → features}/owned-ui/run.d.ts +2 -2
  57. package/dist/{src/features → features}/owned-ui/run.js +2 -0
  58. package/dist/features/owned-ui/session-fork-prompt.d.ts +8 -0
  59. package/dist/features/owned-ui/session-fork-prompt.js +34 -0
  60. package/dist/{src/features → features}/owned-ui/settings-app.d.ts +3 -3
  61. package/dist/{src/features → features}/owned-ui/settings-app.js +103 -54
  62. package/dist/{src/features → features}/workspace/capabilities.d.ts +1 -1
  63. package/dist/{src/features → features}/workspace/reducer.d.ts +2 -1
  64. package/dist/{src/features → features}/workspace/reducer.js +2 -1
  65. package/dist/{src/features → features}/workspace/router.d.ts +2 -1
  66. package/dist/{src/features → features}/workspace/router.js +1 -0
  67. package/dist/{src/features → features}/workspace/store.d.ts +2 -1
  68. package/dist/{src/features → features}/workspace/store.js +1 -0
  69. package/dist/{src/foundation → foundation}/launch-guardian/main.d.ts +2 -0
  70. package/dist/{src/foundation → foundation}/launch-guardian/main.js +18 -5
  71. package/dist/{src/foundation → foundation}/lifecycle/index.d.ts +2 -0
  72. package/dist/{src/foundation → foundation}/lifecycle/index.js +2 -0
  73. package/dist/{src/foundation → foundation}/lifecycle/model.d.ts +1 -1
  74. package/dist/{src/foundation → foundation}/lifecycle/model.js +1 -1
  75. package/dist/foundation/lifecycle/paths.d.ts +30 -0
  76. package/dist/{src/foundation → foundation}/lifecycle/paths.js +29 -1
  77. package/dist/foundation/lifecycle/session-selection.d.ts +9 -0
  78. package/dist/foundation/lifecycle/session-selection.js +39 -0
  79. package/dist/foundation/lifecycle/supervisor-startup.d.ts +30 -0
  80. package/dist/foundation/lifecycle/supervisor-startup.js +106 -0
  81. package/dist/{src/foundation → foundation}/native-host-protocol/codec.d.ts +2 -0
  82. package/dist/{src/foundation → foundation}/native-host-protocol/codec.js +2 -0
  83. package/dist/{src/foundation → foundation}/native-host-protocol/messages.d.ts +1 -1
  84. package/dist/{src/foundation → foundation}/native-host-protocol/messages.js +1 -1
  85. package/dist/foundation/process-containment/darwin-process-inspector.d.ts +5 -0
  86. package/dist/foundation/process-containment/darwin-process-inspector.js +7 -0
  87. package/dist/{src/foundation → foundation}/process-containment/index.d.ts +1 -0
  88. package/dist/{src/foundation → foundation}/process-containment/index.js +1 -0
  89. package/dist/{src/foundation → foundation}/process-containment/linux-process-inspector.d.ts +1 -0
  90. package/dist/{src/foundation → foundation}/process-containment/linux-process-inspector.js +1 -0
  91. package/dist/{src/foundation → foundation}/process-containment/native-guardian-containment.d.ts +1 -0
  92. package/dist/{src/foundation → foundation}/process-containment/native-guardian-containment.js +1 -0
  93. package/dist/{src/foundation → foundation}/process-containment/windows-process-inspector.d.ts +3 -1
  94. package/dist/{src/foundation → foundation}/process-containment/windows-process-inspector.js +5 -2
  95. package/dist/{src/foundation → foundation}/protocol/client.d.ts +1 -0
  96. package/dist/{src/foundation → foundation}/protocol/client.js +1 -0
  97. package/dist/{src/foundation → foundation}/protocol/messages.d.ts +1 -0
  98. package/dist/{src/foundation → foundation}/protocol/messages.js +1 -0
  99. package/dist/{src/foundation → foundation}/release/bootstrap.d.ts +25 -6
  100. package/dist/{src/foundation → foundation}/release/bootstrap.js +124 -34
  101. package/dist/foundation/release/cohort-state.d.ts +156 -0
  102. package/dist/foundation/release/cohort-state.js +471 -0
  103. package/dist/foundation/release/dependency-layer.d.ts +82 -0
  104. package/dist/foundation/release/dependency-layer.js +497 -0
  105. package/dist/foundation/release/endpoints.d.ts +20 -0
  106. package/dist/foundation/release/endpoints.js +50 -0
  107. package/dist/foundation/release/immutable-platform.d.ts +6 -0
  108. package/dist/foundation/release/immutable-platform.js +13 -0
  109. package/dist/{src/foundation → foundation}/release/index.d.ts +4 -0
  110. package/dist/{src/foundation → foundation}/release/index.js +4 -0
  111. package/dist/foundation/release/release-gc.d.ts +71 -0
  112. package/dist/foundation/release/release-gc.js +734 -0
  113. package/dist/{src/foundation → foundation}/release/release-store.d.ts +7 -3
  114. package/dist/{src/foundation → foundation}/release/release-store.js +65 -13
  115. package/dist/{src/foundation → foundation}/release/release.d.ts +4 -1
  116. package/dist/{src/foundation → foundation}/release/release.js +10 -3
  117. package/dist/foundation/release/restart-certification.d.ts +67 -0
  118. package/dist/foundation/release/restart-certification.js +211 -0
  119. package/dist/{src/foundation → foundation}/release/update-transaction.d.ts +1 -0
  120. package/dist/{src/foundation → foundation}/release/update-transaction.js +1 -0
  121. package/dist/{src/foundation → foundation}/release/update.d.ts +19 -3
  122. package/dist/{src/foundation → foundation}/release/update.js +116 -56
  123. package/dist/foundation/release/warmup.d.ts +3 -0
  124. package/dist/foundation/release/warmup.js +35 -0
  125. package/dist/foundation/startup/index.d.ts +1 -0
  126. package/dist/foundation/startup/index.js +1 -0
  127. package/dist/foundation/startup/startup-runtime.d.ts +36 -0
  128. package/dist/foundation/startup/startup-runtime.js +140 -0
  129. package/dist/{src/foundation → foundation}/storage/control-store.d.ts +2 -1
  130. package/dist/{src/foundation → foundation}/storage/control-store.js +39 -4
  131. package/dist/{src/foundation → foundation}/structured-agent-runtime/backpressure.d.ts +2 -1
  132. package/dist/{src/foundation → foundation}/structured-agent-runtime/backpressure.js +2 -1
  133. package/dist/{src/foundation → foundation}/structured-agent-runtime/commands.d.ts +2 -1
  134. package/dist/{src/foundation → foundation}/structured-agent-runtime/commands.js +2 -1
  135. package/dist/{src/foundation → foundation}/structured-agent-runtime/handshake.d.ts +1 -1
  136. package/dist/{src/foundation → foundation}/structured-agent-runtime/handshake.js +1 -1
  137. package/dist/{src/foundation → foundation}/structured-agent-runtime/reconnection.d.ts +2 -1
  138. package/dist/{src/foundation → foundation}/structured-agent-runtime/reconnection.js +2 -1
  139. package/dist/{src/foundation → foundation}/structured-agent-runtime/state.d.ts +2 -1
  140. package/dist/{src/foundation → foundation}/structured-agent-runtime/state.js +2 -1
  141. package/dist/foundation/supervision/index.d.ts +3 -0
  142. package/dist/foundation/supervision/index.js +3 -0
  143. package/dist/foundation/supervision/main.d.ts +1 -0
  144. package/dist/foundation/supervision/main.js +80 -0
  145. package/dist/foundation/supervision/paths.d.ts +1 -0
  146. package/dist/foundation/supervision/paths.js +1 -0
  147. package/dist/{src/foundation → foundation}/supervision/server.d.ts +19 -1
  148. package/dist/{src/foundation → foundation}/supervision/server.js +65 -3
  149. package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/components.d.ts +1 -1
  150. package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/conformance.d.ts +1 -0
  151. package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/conformance.js +3 -2
  152. package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/index.d.ts +1 -1
  153. package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/index.js +1 -1
  154. package/dist/integrations/pi/components/owned-editor-ux.d.ts +55 -0
  155. package/dist/integrations/pi/components/owned-editor-ux.js +778 -0
  156. package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/shell-components.d.ts +1 -0
  157. package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/shell-components.js +1 -0
  158. package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/shell-editor-autocomplete.js +54 -6
  159. package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/shell-extension-ui.d.ts +1 -1
  160. package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/shell-footer-status.d.ts +3 -3
  161. package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/shell-footer-status.js +49 -18
  162. package/dist/integrations/pi/components/shell-presenters-info.d.ts +36 -0
  163. package/dist/integrations/pi/components/shell-presenters-info.js +78 -0
  164. package/dist/integrations/pi/components/shell-presenters-transcript.d.ts +25 -0
  165. package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/shell-presenters-transcript.js +92 -131
  166. package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/shell-selectors-dialogs.d.ts +5 -2
  167. package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/shell-selectors-dialogs.js +2 -1
  168. package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/shell-shared-facade.d.ts +57 -8
  169. package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/shell-shared-facade.js +4 -2
  170. package/dist/integrations/pi/components/submitted-prompt-adapter.d.ts +13 -0
  171. package/dist/integrations/pi/components/submitted-prompt-adapter.js +27 -0
  172. package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/adjacent/core/keybindings.d.ts +10 -2
  173. package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/adjacent/core/keybindings.js +36 -3
  174. package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/session-footer.d.ts +1 -1
  175. package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/adapter.d.ts +28 -4
  176. package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/adapter.js +714 -127
  177. package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/conformance.d.ts +2 -0
  178. package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/conformance.js +4 -2
  179. package/dist/integrations/pi/engine/http-dispatcher.d.ts +4 -0
  180. package/dist/integrations/pi/engine/http-dispatcher.js +25 -0
  181. package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/index.d.ts +4 -0
  182. package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/index.js +4 -0
  183. package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/model-auth-integration.d.ts +2 -1
  184. package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/model-auth-integration.js +1 -0
  185. package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/package-integration.d.ts +1 -1
  186. package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/package-integration.js +32 -26
  187. package/dist/integrations/pi/engine/project-trust-preflight.d.ts +22 -0
  188. package/dist/integrations/pi/engine/project-trust-preflight.js +50 -0
  189. package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/resource-extension-integration.d.ts +2 -1
  190. package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/resource-extension-integration.js +1 -0
  191. package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/runtime-integration.d.ts +19 -1
  192. package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/runtime-integration.js +47 -5
  193. package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/session-integration.d.ts +4 -2
  194. package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/session-integration.js +19 -4
  195. package/dist/integrations/pi/engine/session-selection.d.ts +28 -0
  196. package/dist/integrations/pi/engine/session-selection.js +90 -0
  197. package/dist/integrations/pi/engine/settings-effects.d.ts +66 -0
  198. package/dist/integrations/pi/engine/settings-effects.js +249 -0
  199. package/dist/integrations/pi/engine/settings-integration.d.ts +43 -0
  200. package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/settings-integration.js +102 -108
  201. package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/workflow-controllers.d.ts +3 -2
  202. package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/workflow-controllers.js +1 -0
  203. package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/workflows.d.ts +18 -1
  204. package/dist/integrations/pi/session-ui/clipboard-image.d.ts +11 -0
  205. package/dist/integrations/pi/session-ui/clipboard-image.js +29 -0
  206. package/dist/{src/foundation/pi-owned-ui-integration → integrations/pi/session-ui}/index.d.ts +1 -0
  207. package/dist/{src/foundation/pi-owned-ui-integration → integrations/pi/session-ui}/index.js +1 -0
  208. package/dist/integrations/pi/session-ui/prompt-chips.d.ts +23 -0
  209. package/dist/integrations/pi/session-ui/prompt-chips.js +246 -0
  210. package/dist/integrations/pi/session-ui/route-host.d.ts +5 -0
  211. package/dist/integrations/pi/session-ui/session-shell-root.d.ts +141 -0
  212. package/dist/integrations/pi/session-ui/session-shell-root.js +1158 -0
  213. package/dist/integrations/pi/session-ui/session-shell.d.ts +55 -0
  214. package/dist/{src/foundation/pi-owned-ui-integration → integrations/pi/session-ui}/session-shell.js +479 -719
  215. package/dist/integrations/pi/session-ui/session-viewport-controller.d.ts +45 -0
  216. package/dist/integrations/pi/session-ui/session-viewport-controller.js +463 -0
  217. package/dist/integrations/pi/session-ui/stream-presentation-coalescer.d.ts +29 -0
  218. package/dist/integrations/pi/session-ui/stream-presentation-coalescer.js +79 -0
  219. package/dist/integrations/pi/session-ui/system-clipboard.d.ts +20 -0
  220. package/dist/integrations/pi/session-ui/system-clipboard.js +130 -0
  221. package/dist/{src/foundation/pi-tui-runtime-adapter → integrations/pi/tui-runtime}/adapter.d.ts +8 -1
  222. package/dist/{src/foundation/pi-tui-runtime-adapter → integrations/pi/tui-runtime}/adapter.js +216 -9
  223. package/dist/{src/foundation/pi-tui-runtime-adapter → integrations/pi/tui-runtime}/contracts.d.ts +29 -6
  224. package/dist/integrations/pi/tui-runtime/damage-aware-terminal.d.ts +74 -0
  225. package/dist/integrations/pi/tui-runtime/damage-aware-terminal.js +380 -0
  226. package/dist/{src/foundation/pi-tui-runtime-adapter → integrations/pi/tui-runtime}/index.d.ts +2 -0
  227. package/dist/{src/foundation/pi-tui-runtime-adapter → integrations/pi/tui-runtime}/index.js +2 -0
  228. package/dist/integrations/pi/tui-runtime/input-presentation-coordinator.d.ts +39 -0
  229. package/dist/integrations/pi/tui-runtime/input-presentation-coordinator.js +139 -0
  230. package/dist/{src/foundation/pi-tui-runtime-adapter → integrations/pi/tui-runtime}/presentation-adapter.d.ts +1 -1
  231. package/dist/native/darwin-arm64/manifest.json +4 -4
  232. package/dist/native/darwin-arm64/process-guardian +0 -0
  233. package/dist/native/linux-x64/manifest.json +3 -3
  234. package/dist/native/linux-x64/process-guardian +0 -0
  235. package/dist/native/win32-x64/manifest.json +3 -3
  236. package/dist/native/win32-x64/process-guardian.exe +0 -0
  237. package/dist/{src/product-identity.d.ts → product-identity.d.ts} +3 -3
  238. package/dist/{src/product-identity.js → product-identity.js} +7 -5
  239. package/dist/{src/product-identity.json → product-identity.json} +11 -6
  240. package/dist/runtime-payload-inventory.json +122328 -0
  241. package/dist/{src/foundation/ui-apps → ui/apps}/contracts.d.ts +23 -1
  242. package/dist/{src/foundation/ui-apps → ui/apps}/host.d.ts +1 -1
  243. package/dist/{src/foundation/ui-apps → ui/apps}/host.js +14 -10
  244. package/dist/{src/foundation/ui-apps → ui/apps}/registry.d.ts +1 -0
  245. package/dist/{src/foundation/ui-apps → ui/apps}/registry.js +1 -0
  246. package/dist/{src/foundation/ui-components → ui/components}/dialog-panel.js +5 -3
  247. package/dist/{src/foundation/ui-components → ui/components}/frame.d.ts +1 -0
  248. package/dist/{src/foundation/ui-components → ui/components}/frame.js +1 -0
  249. package/dist/{src/foundation/ui-components → ui/components}/index.d.ts +5 -0
  250. package/dist/{src/foundation/ui-components → ui/components}/index.js +5 -0
  251. package/dist/{src/foundation/ui-components → ui/components}/line-input.d.ts +1 -6
  252. package/dist/{src/foundation/ui-components → ui/components}/line-input.js +4 -9
  253. package/dist/{src/foundation/ui-components → ui/components}/list-view.d.ts +0 -6
  254. package/dist/{src/foundation/ui-components → ui/components}/list-view.js +14 -7
  255. package/dist/{src/foundation/ui-components → ui/components}/mouse.d.ts +10 -0
  256. package/dist/{src/foundation/ui-components → ui/components}/mouse.js +23 -0
  257. package/dist/ui/components/progress-status.d.ts +2 -0
  258. package/dist/ui/components/progress-status.js +4 -0
  259. package/dist/ui/components/prompt-row.d.ts +14 -0
  260. package/dist/ui/components/prompt-row.js +20 -0
  261. package/dist/{src/foundation/ui-components → ui/components}/scrollbar.d.ts +26 -0
  262. package/dist/{src/foundation/ui-components → ui/components}/scrollbar.js +35 -0
  263. package/dist/{src/foundation/ui-components → ui/components}/shortcuts.d.ts +1 -0
  264. package/dist/{src/foundation/ui-components → ui/components}/shortcuts.js +1 -0
  265. package/dist/ui/components/spans.d.ts +25 -0
  266. package/dist/ui/components/spans.js +257 -0
  267. package/dist/ui/components/submitted-prompt.d.ts +23 -0
  268. package/dist/ui/components/submitted-prompt.js +50 -0
  269. package/dist/{src/foundation/ui-components → ui/components}/surface.d.ts +0 -5
  270. package/dist/{src/foundation/ui-components → ui/components}/surface.js +1 -5
  271. package/dist/ui/components/text-selection.d.ts +62 -0
  272. package/dist/ui/components/text-selection.js +208 -0
  273. package/dist/{src/foundation/ui-components → ui/components}/text.d.ts +14 -0
  274. package/dist/{src/foundation/ui-components → ui/components}/text.js +66 -4
  275. package/dist/ui/components/transcript-viewport.d.ts +152 -0
  276. package/dist/ui/components/transcript-viewport.js +631 -0
  277. package/dist/ui/components/visible-hyperlinks.d.ts +19 -0
  278. package/dist/ui/components/visible-hyperlinks.js +64 -0
  279. package/dist/{src/foundation/owned-ui-settings → ui/settings}/declarations.d.ts +8 -1
  280. package/dist/{src/foundation/owned-ui-settings → ui/settings}/declarations.js +33 -5
  281. package/dist/{src/foundation/owned-ui-settings → ui/settings}/migrations.d.ts +1 -1
  282. package/dist/{src/foundation/owned-ui-settings → ui/settings}/migrations.js +21 -2
  283. package/dist/{src/foundation/owned-ui-settings → ui/settings}/sections.d.ts +6 -19
  284. package/dist/{src/foundation/owned-ui-settings → ui/settings}/sections.js +32 -23
  285. package/dist/{src/foundation/owned-ui-settings → ui/settings}/session.d.ts +9 -17
  286. package/dist/{src/foundation/owned-ui-settings → ui/settings}/session.js +65 -55
  287. package/dist/{src/foundation/owned-ui-settings → ui/settings}/store.d.ts +1 -0
  288. package/dist/{src/foundation/owned-ui-settings → ui/settings}/store.js +2 -1
  289. package/docs/architecture/boundaries.md +9 -9
  290. package/docs/architecture/code-documentation.md +77 -0
  291. package/docs/architecture/process-guardian-provenance.md +3 -1
  292. package/docs/architecture/project-structure.md +67 -30
  293. package/docs/architecture/resource-and-data-policy.md +1 -1
  294. package/docs/architecture/toolchain.md +10 -10
  295. package/docs/architecture/ui-reference-provenance.md +36 -5
  296. package/docs/ci-release-runbook.md +186 -79
  297. package/docs/features/launch-profiles.md +24 -17
  298. package/docs/manual-ghost-link-baseline.md +89 -0
  299. package/docs/manual-launch-instance-acceptance.md +12 -35
  300. package/docs/manual-owned-ui-checkpoint.md +78 -0
  301. package/docs/manual-pi-boundary-candidate.md +4 -5
  302. package/docs/manual-terminal-colour-check.md +4 -3
  303. package/docs/repository-governance-live-acceptance.md +77 -0
  304. package/package.json +37 -27
  305. package/dist/src/cli/capabilities.d.ts +0 -15
  306. package/dist/src/cli/dispatch.js +0 -177
  307. package/dist/src/cli/version-stats.js +0 -72
  308. package/dist/src/composition/index.d.ts +0 -48
  309. package/dist/src/composition/index.js +0 -258
  310. package/dist/src/features/launch/intent.d.ts +0 -7
  311. package/dist/src/features/launch/intent.js +0 -4
  312. package/dist/src/features/launch/profiles.d.ts +0 -12
  313. package/dist/src/features/launch/profiles.js +0 -26
  314. package/dist/src/foundation/lifecycle/paths.d.ts +0 -10
  315. package/dist/src/foundation/pi-component-adapter/shell-presenters-transcript.d.ts +0 -57
  316. package/dist/src/foundation/pi-engine-adapter/settings-integration.d.ts +0 -55
  317. package/dist/src/foundation/pi-owned-ui-integration/route-host.d.ts +0 -29
  318. package/dist/src/foundation/pi-owned-ui-integration/session-shell.d.ts +0 -106
  319. package/dist/src/foundation/release/cohort-state.d.ts +0 -70
  320. package/dist/src/foundation/release/cohort-state.js +0 -202
  321. package/dist/src/foundation/release/release-gc.d.ts +0 -5
  322. package/dist/src/foundation/release/release-gc.js +0 -16
  323. package/dist/src/foundation/supervision/index.d.ts +0 -3
  324. package/dist/src/foundation/supervision/index.js +0 -3
  325. package/dist/src/foundation/supervision/main.d.ts +0 -1
  326. package/dist/src/foundation/supervision/main.js +0 -41
  327. package/dist/src/foundation/supervision/paths.d.ts +0 -1
  328. package/dist/src/foundation/supervision/paths.js +0 -1
  329. package/dist/src/foundation/ui-components/spans.d.ts +0 -7
  330. package/dist/src/foundation/ui-components/spans.js +0 -59
  331. package/docs/manual-transparent-checkpoint.md +0 -53
  332. /package/dist/{src/cli → cli}/index.d.ts +0 -0
  333. /package/dist/{src/cli → cli}/index.js +0 -0
  334. /package/dist/{src/cli → cli}/version.d.ts +0 -0
  335. /package/dist/{src/cli → cli}/version.js +0 -0
  336. /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/capability-ports.js +0 -0
  337. /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/domain-validation.d.ts +0 -0
  338. /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/domain.js +0 -0
  339. /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/index.d.ts +0 -0
  340. /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/index.js +0 -0
  341. /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/model.d.ts +0 -0
  342. /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/model.js +0 -0
  343. /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/package-ports.js +0 -0
  344. /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/ports.d.ts +0 -0
  345. /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/ports.js +0 -0
  346. /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/serialization.d.ts +0 -0
  347. /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/serialization.js +0 -0
  348. /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/validation.d.ts +0 -0
  349. /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/validation.js +0 -0
  350. /package/dist/{src/foundation/owned-ui-contracts → contracts/owned-ui}/extension-ui.d.ts +0 -0
  351. /package/dist/{src/foundation/owned-ui-contracts → contracts/owned-ui}/extension-ui.js +0 -0
  352. /package/dist/{src/foundation/owned-ui-contracts → contracts/owned-ui}/index.d.ts +0 -0
  353. /package/dist/{src/foundation/owned-ui-contracts → contracts/owned-ui}/index.js +0 -0
  354. /package/dist/{src/foundation/owned-ui-contracts → contracts/owned-ui}/model.js +0 -0
  355. /package/dist/{src/foundation/owned-ui-contracts → contracts/owned-ui}/validation.d.ts +0 -0
  356. /package/dist/{src/foundation/presentation-contracts → contracts/presentation}/index.d.ts +0 -0
  357. /package/dist/{src/foundation/presentation-contracts → contracts/presentation}/index.js +0 -0
  358. /package/dist/{src/foundation/workspace-contracts → contracts/workspace}/index.d.ts +0 -0
  359. /package/dist/{src/foundation/workspace-contracts → contracts/workspace}/index.js +0 -0
  360. /package/dist/{src/foundation/workspace-contracts → contracts/workspace}/model.d.ts +0 -0
  361. /package/dist/{src/foundation/workspace-contracts → contracts/workspace}/model.js +0 -0
  362. /package/dist/{src/foundation/workspace-contracts → contracts/workspace}/validation.d.ts +0 -0
  363. /package/dist/{src/foundation/workspace-contracts → contracts/workspace}/validation.js +0 -0
  364. /package/dist/{src/features → features}/launch/development-launch.d.ts +0 -0
  365. /package/dist/{src/features → features}/launch/initialize-profile.d.ts +0 -0
  366. /package/dist/{src/features → features}/launch/initialize-profile.js +0 -0
  367. /package/dist/{src/features → features}/launch/runtime-selection.js +0 -0
  368. /package/dist/{src/features → features}/workspace/capabilities.js +0 -0
  369. /package/dist/{src/features → features}/workspace/index.d.ts +0 -0
  370. /package/dist/{src/features → features}/workspace/index.js +0 -0
  371. /package/dist/{src/features → features}/workspace/presentation.d.ts +0 -0
  372. /package/dist/{src/features → features}/workspace/presentation.js +0 -0
  373. /package/dist/{src/features → features}/workspace/reconciliation.d.ts +0 -0
  374. /package/dist/{src/features → features}/workspace/reconciliation.js +0 -0
  375. /package/dist/{src/foundation → foundation}/launch-guardian/index.d.ts +0 -0
  376. /package/dist/{src/foundation → foundation}/launch-guardian/index.js +0 -0
  377. /package/dist/{src/foundation → foundation}/lifecycle/commands.d.ts +0 -0
  378. /package/dist/{src/foundation → foundation}/lifecycle/commands.js +0 -0
  379. /package/dist/{src/foundation → foundation}/lifecycle/launch-instance.d.ts +0 -0
  380. /package/dist/{src/foundation → foundation}/lifecycle/launch-instance.js +0 -0
  381. /package/dist/{src/foundation → foundation}/native-host-protocol/evidence.d.ts +0 -0
  382. /package/dist/{src/foundation → foundation}/native-host-protocol/evidence.js +0 -0
  383. /package/dist/{src/foundation → foundation}/native-host-protocol/index.d.ts +0 -0
  384. /package/dist/{src/foundation → foundation}/native-host-protocol/index.js +0 -0
  385. /package/dist/{src/foundation → foundation}/native-host-protocol/proof-gate.d.ts +0 -0
  386. /package/dist/{src/foundation → foundation}/native-host-protocol/proof-gate.js +0 -0
  387. /package/dist/{src/foundation → foundation}/process-containment/artifact.d.ts +0 -0
  388. /package/dist/{src/foundation → foundation}/process-containment/artifact.js +0 -0
  389. /package/dist/{src/foundation → foundation}/process-containment/contracts.d.ts +0 -0
  390. /package/dist/{src/foundation → foundation}/process-containment/contracts.js +0 -0
  391. /package/dist/{src/foundation → foundation}/protocol/index.d.ts +0 -0
  392. /package/dist/{src/foundation → foundation}/protocol/index.js +0 -0
  393. /package/dist/{src/foundation → foundation}/release/cohort-selection.d.ts +0 -0
  394. /package/dist/{src/foundation → foundation}/release/cohort-selection.js +0 -0
  395. /package/dist/{src/foundation → foundation}/release/concurrency.d.ts +0 -0
  396. /package/dist/{src/foundation → foundation}/release/concurrency.js +0 -0
  397. /package/dist/{src/foundation → foundation}/release/process-cleanup.d.ts +0 -0
  398. /package/dist/{src/foundation → foundation}/release/process-cleanup.js +0 -0
  399. /package/dist/{src/foundation → foundation}/release/stable-release.d.ts +0 -0
  400. /package/dist/{src/foundation → foundation}/release/stable-release.js +0 -0
  401. /package/dist/{src/foundation → foundation}/storage/index.d.ts +0 -0
  402. /package/dist/{src/foundation → foundation}/storage/index.js +0 -0
  403. /package/dist/{src/foundation → foundation}/structured-agent-runtime/index.d.ts +0 -0
  404. /package/dist/{src/foundation → foundation}/structured-agent-runtime/index.js +0 -0
  405. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/components.js +0 -0
  406. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/resources/builtin-themes.d.ts +0 -0
  407. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/resources/builtin-themes.js +0 -0
  408. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/shell-editor-autocomplete.d.ts +0 -0
  409. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/shell-extension-ui.js +0 -0
  410. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/theme.d.ts +0 -0
  411. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/theme.js +0 -0
  412. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/countdown-timer.d.ts +0 -0
  413. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/countdown-timer.js +0 -0
  414. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/custom-entry.d.ts +0 -0
  415. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/custom-entry.js +0 -0
  416. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/daxnuts.d.ts +0 -0
  417. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/daxnuts.js +0 -0
  418. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/earendil-announcement.d.ts +0 -0
  419. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/earendil-announcement.js +0 -0
  420. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/extension-editor.d.ts +0 -0
  421. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/extension-editor.js +0 -0
  422. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/first-time-setup.d.ts +0 -0
  423. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/first-time-setup.js +0 -0
  424. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/markdown-transform.d.ts +0 -0
  425. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/markdown-transform.js +0 -0
  426. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/mermaid.d.ts +0 -0
  427. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/mermaid.js +0 -0
  428. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/owned-editor.d.ts +0 -0
  429. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/owned-editor.js +0 -0
  430. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/scoped-models-selector.d.ts +0 -0
  431. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/scoped-models-selector.js +0 -0
  432. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/session-footer.js +0 -0
  433. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/session-selector-search.d.ts +0 -0
  434. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/session-selector-search.js +0 -0
  435. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/session-selector.d.ts +0 -0
  436. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/session-selector.js +0 -0
  437. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/skill-invocation-message.d.ts +0 -0
  438. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/skill-invocation-message.js +0 -0
  439. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/status-indicator.d.ts +0 -0
  440. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/status-indicator.js +0 -0
  441. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/tree-selector.d.ts +0 -0
  442. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/tree-selector.js +0 -0
  443. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/trust-selector.d.ts +0 -0
  444. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/trust-selector.js +0 -0
  445. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/external-editor.d.ts +0 -0
  446. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/external-editor.js +0 -0
  447. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/model-search.d.ts +0 -0
  448. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/model-search.js +0 -0
  449. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/theme/theme-controller.d.ts +0 -0
  450. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/theme/theme-controller.js +0 -0
  451. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/theme/theme.d.ts +0 -0
  452. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/theme/theme.js +0 -0
  453. /package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/pi-settings-metadata.json +0 -0
  454. /package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/public-main-entry.d.ts +0 -0
  455. /package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/public-main-entry.js +0 -0
  456. /package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/workflows.js +0 -0
  457. /package/dist/{src/foundation/pi-owned-ui-integration → integrations/pi/session-ui}/route-host.js +0 -0
  458. /package/dist/{src/foundation/pi-tui-runtime-adapter → integrations/pi/tui-runtime}/conformance.d.ts +0 -0
  459. /package/dist/{src/foundation/pi-tui-runtime-adapter → integrations/pi/tui-runtime}/conformance.js +0 -0
  460. /package/dist/{src/foundation/pi-tui-runtime-adapter → integrations/pi/tui-runtime}/contracts.js +0 -0
  461. /package/dist/{src/foundation/pi-tui-runtime-adapter → integrations/pi/tui-runtime}/presentation-adapter.js +0 -0
  462. /package/dist/{src/foundation/ui-apps → ui/apps}/contracts.js +0 -0
  463. /package/dist/{src/foundation/ui-apps → ui/apps}/index.d.ts +0 -0
  464. /package/dist/{src/foundation/ui-apps → ui/apps}/index.js +0 -0
  465. /package/dist/{src/foundation/ui-components → ui/components}/dialog-panel.d.ts +0 -0
  466. /package/dist/{src/foundation/ui-components → ui/components}/label.d.ts +0 -0
  467. /package/dist/{src/foundation/ui-components → ui/components}/label.js +0 -0
  468. /package/dist/{src/foundation/ui-components → ui/components}/list-block.d.ts +0 -0
  469. /package/dist/{src/foundation/ui-components → ui/components}/list-block.js +0 -0
  470. /package/dist/{src/foundation/ui-components → ui/components}/pane.d.ts +0 -0
  471. /package/dist/{src/foundation/ui-components → ui/components}/pane.js +0 -0
  472. /package/dist/{src/foundation/ui-components → ui/components}/revision.d.ts +0 -0
  473. /package/dist/{src/foundation/ui-components → ui/components}/revision.js +0 -0
  474. /package/dist/{src/foundation/ui-components → ui/components}/status-line.d.ts +0 -0
  475. /package/dist/{src/foundation/ui-components → ui/components}/status-line.js +0 -0
  476. /package/dist/{src/foundation/ui-components → ui/components}/stepper.d.ts +0 -0
  477. /package/dist/{src/foundation/ui-components → ui/components}/stepper.js +0 -0
  478. /package/dist/{src/foundation/ui-components → ui/components}/theme.d.ts +0 -0
  479. /package/dist/{src/foundation/ui-components → ui/components}/theme.js +0 -0
  480. /package/dist/{src/foundation/ui-components → ui/components}/value-menu.d.ts +0 -0
  481. /package/dist/{src/foundation/ui-components → ui/components}/value-menu.js +0 -0
  482. /package/dist/{src/foundation/owned-ui-settings → ui/settings}/index.d.ts +0 -0
  483. /package/dist/{src/foundation/owned-ui-settings → ui/settings}/index.js +0 -0
  484. /package/dist/{src/foundation/owned-ui-settings → ui/settings}/resolution.d.ts +0 -0
  485. /package/dist/{src/foundation/owned-ui-settings → ui/settings}/resolution.js +0 -0
@@ -1,45 +1,90 @@
1
1
  import { spawn } from "node:child_process";
2
- import { mkdir, readFile, rm, writeFile } from "node:fs/promises";
2
+ import { chmod, mkdir, readFile, rm, writeFile } from "node:fs/promises";
3
3
  import { connect } from "node:net";
4
4
  import { platform } from "node:os";
5
5
  import { resolve } from "node:path";
6
6
  import { selectCohortLaunch } from "./cohort-selection.js";
7
7
  import { CohortStateStore } from "./cohort-state.js";
8
- import { assertLaunchProfileId, resolveProductPaths } from "../lifecycle/index.js";
8
+ import { assertLaunchProfileId, createSupervisorStartupAttempt, readSupervisorStartupResult, resolveCohortEndpoint, resolveProductPaths, sessionSelectionArguments } from "../lifecycle/index.js";
9
9
  import { encodeFrame, LineFrameDecoder } from "../protocol/index.js";
10
10
  import { cleanupProvenIdleOwner, processIsAlive } from "./process-cleanup.js";
11
+ import { sweepDeadEndpoints } from "./endpoints.js";
11
12
  import { consumeMaterializationProof, materializeRelease, readCertifiedReleaseManifest, readMaterializedRelease, resolveReleaseEntryPoint, verifyMaterializedRelease } from "./release-store.js";
13
+ import { scheduleReleaseCleanup } from "./release-gc.js";
14
+ import { createRestartSeal, readRestartCertifiedRelease, releaseCertificationDocument } from "./restart-certification.js";
12
15
  import { PRODUCT_IDENTITY, PRODUCT_TEXT } from "../../product-identity.js";
16
+ import { markStartupPhase } from "../startup/index.js";
13
17
  export async function runBootstrap(options) {
14
18
  const environment = { ...(options.environment ?? process.env) };
15
- const launchProfileId = options.launchIntent?.profile.id ?? "a1";
19
+ await markStartupPhase(environment, "bootstrap-start");
20
+ const launchProfileId = options.launchIntent?.profileId ?? "a1";
16
21
  assertLaunchProfileId(launchProfileId);
22
+ const sessionArgs = sessionSelectionArguments(options.launchIntent?.sessionSelection);
23
+ if (sessionArgs.length > 0 && launchProfileId !== "a1")
24
+ throw new Error("session selection requires the normal A1 profile");
17
25
  environment[PRODUCT_IDENTITY.environment.launchProfile] = launchProfileId;
18
26
  const output = options.output ?? process.stderr;
19
27
  const paths = resolveProductPaths(environment);
20
28
  await mkdir(paths.runtimeDir, { recursive: true, mode: 0o700 });
21
29
  const stateStore = new CohortStateStore(paths.dataDir);
22
30
  let state = await stateStore.read();
23
- let endpoint = await readEndpointMetadata(paths.endpointMetadataPath);
31
+ // Invariant: records left by cohorts whose processes are gone say nothing about ownership, and there
32
+ // can now be several of them. Clearing them first keeps the decision below about what is
33
+ // actually running.
34
+ await sweepDeadEndpoints(paths).catch(() => []);
35
+ // Performance: reconciliation is serialized by cohort state, but launch never awaits a physical
36
+ // backlog. The scheduler commits a plan and starts a detached bounded worker.
37
+ const scheduleMaintenance = options.scheduleMaintenance ?? scheduleReleaseCleanup;
38
+ void scheduleMaintenance(paths.dataDir, paths).catch(() => { });
39
+ // Protocol: each cohort keeps its own endpoint, so a launch looks for the endpoint of the release it
40
+ // is about to run rather than for the one endpoint the runtime directory used to have.
41
+ const activeReleaseId = state.references.active;
42
+ let endpointPaths = activeReleaseId === null
43
+ ? { endpoint: paths.endpoint, endpointMetadataPath: paths.endpointMetadataPath }
44
+ : resolveCohortEndpoint(paths, activeReleaseId, environment);
45
+ let endpoint = await readEndpointMetadata(endpointPaths.endpointMetadataPath);
46
+ if (endpoint === null) {
47
+ // Compatibility: a release that predates cohort-scoped endpoints published one endpoint for the whole
48
+ // runtime directory. Recognizing it is what lets a session started by that release keep
49
+ // working through the first launch that knows about cohorts.
50
+ const legacy = await readEndpointMetadata(paths.endpointMetadataPath);
51
+ if (legacy !== null) {
52
+ endpoint = legacy;
53
+ endpointPaths = { endpoint: paths.endpoint, endpointMetadataPath: paths.endpointMetadataPath };
54
+ }
55
+ }
24
56
  let probe = endpoint ? await probeOwnership(endpoint) : "dead";
25
57
  const installedVersion = await readInstalledVersion(options.packageRoot);
26
58
  const activeId = state.references.active;
27
59
  const active = activeId === null ? undefined : state.releases[activeId];
28
- if (active?.approval === "approved" && active.packageVersion === installedVersion) {
60
+ const activeIsLaunchable = active === undefined || (options.releaseIsLaunchable?.(active.releaseRoot) ?? true);
61
+ if (activeIsLaunchable && active?.approval === "approved" && active.packageVersion === installedVersion) {
29
62
  const endpointMatches = endpoint?.releaseId === active.releaseId
30
63
  && endpoint.releaseRoot === active.releaseRoot
31
64
  && endpoint.contentDigest === active.contentDigest;
32
65
  if (endpointMatches && probe === "live-verified") {
33
66
  const retained = await readCertifiedReleaseManifest(active, resolve(paths.dataDir, "releases"));
34
- return await launchUi(retained, environment);
67
+ return await launchUi(retained, environment, sessionArgs);
35
68
  }
36
69
  if (endpoint === null || probe === "dead") {
37
70
  if (endpoint)
38
- await removeEndpointArtifacts(paths.endpointMetadataPath, paths.endpoint);
39
- const retained = await readMaterializedRelease(active.releaseRoot);
40
- await startSupervisor(retained, environment);
41
- await waitForVerifiedEndpoint(paths.endpointMetadataPath, retained, 8_000);
42
- return await launchUi(retained, environment);
71
+ await removeEndpointArtifacts(endpointPaths.endpointMetadataPath, endpointPaths.endpoint);
72
+ await markStartupPhase(environment, "durable-validation-start");
73
+ const retained = await readRestartCertifiedRelease(active, paths.dataDir).catch(async () => {
74
+ const verified = await readMaterializedRelease(active.releaseRoot, resolve(paths.dataDir, "releases"));
75
+ if (verified.releaseId !== active.releaseId || verified.contentDigest !== active.contentDigest || verified.packageVersion !== active.packageVersion) {
76
+ throw new Error("completely verified release differs from the approved active record");
77
+ }
78
+ await certifyMaterializedRelease(verified, paths.dataDir);
79
+ return verified;
80
+ });
81
+ await markStartupPhase(environment, "durable-validation-complete");
82
+ const retainedPaths = resolveCohortEndpoint(paths, retained.releaseId, environment);
83
+ await markStartupPhase(environment, "replacement-supervisor-start");
84
+ const startup = await startSupervisor(retained, environment);
85
+ await waitForVerifiedEndpoint(retainedPaths.endpointMetadataPath, retained, 8_000, startup);
86
+ await markStartupPhase(environment, "replacement-supervisor-ready");
87
+ return await launchUi(retained, environment, sessionArgs);
43
88
  }
44
89
  }
45
90
  const candidate = await materializeRelease(options.packageRoot, paths.dataDir);
@@ -51,7 +96,28 @@ export async function runBootstrap(options) {
51
96
  await stateStore.activate(candidate.releaseId);
52
97
  state = await stateStore.read();
53
98
  }
54
- endpoint = await readEndpointMetadata(paths.endpointMetadataPath);
99
+ else if (!activeIsLaunchable && candidate.releaseId !== activeId
100
+ && state.releases[candidate.releaseId]?.approval !== "approved") {
101
+ // Invariant: the active reference points at a copy that cannot launch, so reusing it
102
+ // is off the table — but an unapproved candidate would lose the selection
103
+ // below to that same broken active (`start-active`). Approving the healed
104
+ // candidate here lets ordinary cohort selection activate it, while a live
105
+ // busy cohort still wins the endpoint checks and keeps its sessions.
106
+ const diagnosticsPath = await certifyMaterializedRelease(candidate, paths.dataDir);
107
+ await stateStore.approve(candidate.releaseId, diagnosticsPath);
108
+ state = await stateStore.read();
109
+ }
110
+ // Protocol: the candidate's own endpoint decides whether this launch attaches or starts a supervisor.
111
+ // A cohort other than this one is not in the way: it listens somewhere else.
112
+ endpointPaths = resolveCohortEndpoint(paths, candidate.releaseId, environment);
113
+ endpoint = await readEndpointMetadata(endpointPaths.endpointMetadataPath);
114
+ if (endpoint === null) {
115
+ const legacy = await readEndpointMetadata(paths.endpointMetadataPath);
116
+ if (legacy !== null) {
117
+ endpoint = legacy;
118
+ endpointPaths = { endpoint: paths.endpoint, endpointMetadataPath: paths.endpointMetadataPath };
119
+ }
120
+ }
55
121
  probe = endpoint ? await probeOwnership(endpoint) : "dead";
56
122
  let decision = selectCohortLaunch(candidate, state, endpoint, probe);
57
123
  if (decision.action === "blocked") {
@@ -64,18 +130,18 @@ export async function runBootstrap(options) {
64
130
  await writeFile(resolve(paths.dataDir, `cleanup-${Date.now()}.json`), JSON.stringify(diagnostics, null, 2));
65
131
  if (!diagnostics.terminated)
66
132
  throw new Error(`could not safely clean stale ${PRODUCT_TEXT.displayName} supervisor ${endpoint.pid}`);
67
- await removeEndpointArtifacts(paths.endpointMetadataPath, paths.endpoint);
133
+ await removeEndpointArtifacts(endpointPaths.endpointMetadataPath, endpointPaths.endpoint);
68
134
  decision = selectCohortLaunch(candidate, await stateStore.read(), null, "dead");
69
135
  }
70
136
  else if (endpoint && probe === "dead") {
71
- await removeEndpointArtifacts(paths.endpointMetadataPath, paths.endpoint);
137
+ await removeEndpointArtifacts(endpointPaths.endpointMetadataPath, endpointPaths.endpoint);
72
138
  }
73
139
  if (decision.action === "launch-retained-ui") {
74
140
  const retained = await verifyMaterializedRelease(decision.releaseRoot, undefined, resolve(paths.dataDir, "releases"));
75
141
  if (decision.recordPending && endpoint) {
76
142
  await stateStore.blockPending("candidate activation deferred by live non-resumable instances", endpoint.ownership.nonResumableInstanceIds);
77
143
  }
78
- const code = await launchUi(retained, environment);
144
+ const code = await launchUi(retained, environment, sessionArgs);
79
145
  if (decision.recordPending)
80
146
  await activatePendingAfterBlockerExit(candidate, stateStore, paths, environment);
81
147
  return code;
@@ -94,7 +160,7 @@ export async function runBootstrap(options) {
94
160
  output.write(`${PRODUCT_TEXT.diagnostic("could not complete bounded idle cohort shutdown; the candidate remains pending.")}\n`);
95
161
  return 1;
96
162
  }
97
- await removeEndpointArtifacts(paths.endpointMetadataPath, paths.endpoint);
163
+ await removeEndpointArtifacts(endpointPaths.endpointMetadataPath, endpointPaths.endpoint);
98
164
  await stateStore.activate(candidate.releaseId);
99
165
  decision = { action: "activate-candidate", releaseId: candidate.releaseId, releaseRoot: candidate.releaseRoot, reason: "idle cohort released ownership" };
100
166
  }
@@ -112,9 +178,9 @@ export async function runBootstrap(options) {
112
178
  else {
113
179
  selected = await readMaterializedRelease(decision.releaseRoot);
114
180
  }
115
- await startSupervisor(selected, environment);
116
- await waitForVerifiedEndpoint(paths.endpointMetadataPath, selected, 8_000);
117
- return await launchUi(selected, environment);
181
+ const startup = await startSupervisor(selected, environment);
182
+ await waitForVerifiedEndpoint(resolveCohortEndpoint(paths, selected.releaseId, environment).endpointMetadataPath, selected, 8_000, startup);
183
+ return await launchUi(selected, environment, sessionArgs);
118
184
  }
119
185
  async function readInstalledVersion(packageRoot) {
120
186
  const manifest = JSON.parse(await readFile(resolve(packageRoot, "package.json"), "utf8"));
@@ -127,34 +193,42 @@ export async function certifyMaterializedRelease(release, dataDir, verification
127
193
  if (!consumeMaterializationProof(release)) {
128
194
  await verifyMaterializedRelease(release.releaseRoot, release, resolve(dataDir, "releases"), verification);
129
195
  }
196
+ return await recordParentCertifiedRelease(release, dataDir);
197
+ }
198
+ /** Persist current-format evidence after an authenticated parent has certified the exact release. */
199
+ export async function recordParentCertifiedRelease(release, dataDir) {
130
200
  const path = resolve(dataDir, `certification-${release.releaseId}.json`);
131
- await writeFile(path, JSON.stringify({
132
- schema: PRODUCT_IDENTITY.evidence.releaseCertificationSchema,
133
- releaseId: release.releaseId,
134
- contentDigest: release.contentDigest,
135
- verifiedAt: new Date().toISOString(),
136
- checks: [{ id: "immutable-content", passed: true }],
137
- }, null, 2), { mode: 0o600 });
201
+ const restartSeal = await createRestartSeal(release, dataDir);
202
+ await chmod(path, 0o600).catch(() => { });
203
+ await writeFile(path, JSON.stringify(releaseCertificationDocument(release, restartSeal), null, 2), { mode: 0o600 });
204
+ await chmod(path, 0o400);
138
205
  return path;
139
206
  }
140
207
  export async function startSupervisor(release, environment) {
141
208
  const entry = await resolveReleaseEntryPoint(release, "bin/supervisor.js");
142
- const child = spawn(process.execPath, [entry], {
209
+ const paths = resolveProductPaths(environment);
210
+ const attempt = await createSupervisorStartupAttempt(paths.runtimeDir, release.releaseId);
211
+ const child = spawn(process.execPath, [entry, "--startup-attempt", attempt.attemptId], {
143
212
  detached: true,
144
213
  env: releaseEnvironment(environment, release),
145
214
  stdio: "ignore",
146
215
  windowsHide: true,
147
216
  });
217
+ const childOutcome = new Promise(resolvePromise => {
218
+ child.once("close", (exitCode, signal) => resolvePromise({ exitCode, signal }));
219
+ });
148
220
  await new Promise((resolvePromise, rejectPromise) => {
149
221
  child.once("spawn", resolvePromise);
150
222
  child.once("error", rejectPromise);
151
223
  });
152
224
  child.unref();
225
+ return { ...attempt, childOutcome };
153
226
  }
154
- async function launchUi(release, environment) {
227
+ async function launchUi(release, environment, sessionArgs) {
228
+ await markStartupPhase(environment, "bootstrap-selected");
155
229
  const entry = await resolveReleaseEntryPoint(release, "bin/guardian.js");
156
230
  return await new Promise((resolvePromise, rejectPromise) => {
157
- const child = spawn(process.execPath, [entry], {
231
+ const child = spawn(process.execPath, [entry, ...sessionArgs], {
158
232
  env: releaseEnvironment(environment, release),
159
233
  stdio: "inherit",
160
234
  windowsHide: false,
@@ -167,16 +241,32 @@ export function releaseEnvironment(environment, release) {
167
241
  return {
168
242
  ...environment,
169
243
  [PRODUCT_IDENTITY.environment.releaseId]: release.releaseId,
244
+ [PRODUCT_IDENTITY.environment.releaseLayers]: (release.dependencyLayers ?? []).map(layer => layer.layerId).join(","),
170
245
  [PRODUCT_IDENTITY.environment.releaseRoot]: release.releaseRoot,
171
246
  [PRODUCT_IDENTITY.environment.releaseDigest]: release.contentDigest,
172
247
  };
173
248
  }
174
- export async function waitForVerifiedEndpoint(path, release, timeoutMs) {
249
+ export async function waitForVerifiedEndpoint(path, release, timeoutMs, startup) {
175
250
  const deadline = Date.now() + timeoutMs;
251
+ let childOutcome = null;
252
+ void startup?.childOutcome.then(outcome => { childOutcome = outcome; });
176
253
  while (Date.now() < deadline) {
177
254
  const metadata = await readEndpointMetadata(path);
178
- if (metadata && metadata.releaseId === release.releaseId && await probeOwnership(metadata) === "live-verified")
255
+ if (metadata && metadata.releaseId === release.releaseId && await probeOwnership(metadata) === "live-verified") {
256
+ if (startup)
257
+ await rm(startup.resultPath, { force: true });
179
258
  return;
259
+ }
260
+ if (startup) {
261
+ const result = await readSupervisorStartupResult(startup.resultPath, startup.attemptId, startup.releaseId);
262
+ if (result?.outcome === "failure") {
263
+ throw Object.assign(new Error(PRODUCT_TEXT.diagnostic(`supervisor startup failed at ${result.stage}: ${result.message}`)), {
264
+ code: result.code ?? "SUPERVISOR_STARTUP_FAILED",
265
+ });
266
+ }
267
+ }
268
+ if (childOutcome)
269
+ throw new Error(PRODUCT_TEXT.diagnostic(`supervisor exited before readiness: ${JSON.stringify(childOutcome)}`));
180
270
  await new Promise(resolvePromise => setTimeout(resolvePromise, 40));
181
271
  }
182
272
  throw new Error(PRODUCT_TEXT.diagnostic(`supervisor did not publish verified endpoint metadata within ${timeoutMs}ms`));
@@ -273,8 +363,8 @@ async function activatePendingAfterBlockerExit(candidate, stateStore, paths, env
273
363
  return;
274
364
  await removeEndpointArtifacts(paths.endpointMetadataPath, paths.endpoint);
275
365
  await stateStore.activate(candidate.releaseId);
276
- await startSupervisor(candidate, environment);
277
- await waitForVerifiedEndpoint(paths.endpointMetadataPath, candidate, 8_000);
366
+ const startup = await startSupervisor(candidate, environment);
367
+ await waitForVerifiedEndpoint(resolveCohortEndpoint(paths, candidate.releaseId, environment).endpointMetadataPath, candidate, 8_000, startup);
278
368
  }
279
369
  export async function releaseVerifiedIdleOwner(metadata, dataDir, operations = {}) {
280
370
  try {
@@ -282,7 +372,7 @@ export async function releaseVerifiedIdleOwner(metadata, dataDir, operations = {
282
372
  return true;
283
373
  }
284
374
  catch {
285
- // The authenticated idle-release handshake authorizes bounded cleanup of
375
+ // Security: the authenticated idle-release handshake authorizes bounded cleanup of
286
376
  // this exact boot when a native handle outlives graceful shutdown.
287
377
  const diagnostics = await (operations.cleanup ?? cleanupProvenIdleOwner)(metadata);
288
378
  await writeFile(resolve(dataDir, `cleanup-${Date.now()}.json`), JSON.stringify(diagnostics, null, 2));
@@ -0,0 +1,156 @@
1
+ import type { MaterializedRelease } from "./release-store.js";
2
+ export declare const RELEASE_COHORT_SCHEMA: string;
3
+ export type ReleaseApproval = "candidate" | "approved" | "rejected";
4
+ export interface ReleaseRecord {
5
+ readonly releaseId: string;
6
+ readonly releaseRoot: string;
7
+ readonly packageVersion: string;
8
+ readonly contentDigest: string;
9
+ readonly approval: ReleaseApproval;
10
+ readonly materializedAt: string;
11
+ readonly certifiedAt: string | null;
12
+ readonly diagnosticsPath: string | null;
13
+ }
14
+ export interface ReleaseReferences {
15
+ readonly active: string | null;
16
+ readonly pending: string | null;
17
+ readonly approved: string | null;
18
+ readonly rollback: string | null;
19
+ readonly retention: readonly string[];
20
+ }
21
+ export type ExternalReleaseHoldAuthority = "agent" | "migration";
22
+ /** A current hold supplied by an authority that must participate in every reconciliation. */
23
+ export interface ExternalReleaseHold {
24
+ readonly authority: ExternalReleaseHoldAuthority;
25
+ readonly releaseId: string;
26
+ }
27
+ export interface ActiveReleaseTransactionReference {
28
+ readonly status: "active" | "completed" | "rolled-back" | "failed";
29
+ readonly priorActiveReleaseId: string | null;
30
+ }
31
+ export type ReleaseCleanupStage = "detached" | "trash";
32
+ export interface ReleaseCleanupDisposition {
33
+ readonly release: ReleaseRecord;
34
+ readonly stage: ReleaseCleanupStage;
35
+ readonly trashPath: string | null;
36
+ readonly attempts: number;
37
+ readonly lastAttemptAt: string | null;
38
+ readonly lastError: string | null;
39
+ }
40
+ export interface ReleaseCleanupDiagnostic {
41
+ readonly releaseId: string;
42
+ readonly stage: string;
43
+ readonly attemptedAt: string;
44
+ readonly error: string;
45
+ }
46
+ export type ReleaseCleanupWorkerStatus = "scheduled" | "running" | "completed" | "blocked" | "continued" | "failed" | "skipped";
47
+ export interface ReleaseCleanupWorkerRun {
48
+ readonly runId: string;
49
+ readonly status: ReleaseCleanupWorkerStatus;
50
+ readonly scheduledAt: string;
51
+ readonly startedAt: string | null;
52
+ readonly completedAt: string | null;
53
+ readonly pid: number | null;
54
+ readonly batches: number;
55
+ readonly attempted: number;
56
+ readonly completed: number;
57
+ readonly remaining: number;
58
+ readonly error: string | null;
59
+ }
60
+ export interface ReleaseCleanupWorkerSummary {
61
+ readonly batches: number;
62
+ readonly attempted: number;
63
+ readonly completed: number;
64
+ readonly remaining: number;
65
+ }
66
+ export interface ReleaseCleanupState {
67
+ readonly pending: Readonly<Record<string, ReleaseCleanupDisposition>>;
68
+ readonly diagnostics: readonly ReleaseCleanupDiagnostic[];
69
+ readonly workerRuns: readonly ReleaseCleanupWorkerRun[];
70
+ }
71
+ export interface CohortState {
72
+ readonly schema: typeof RELEASE_COHORT_SCHEMA;
73
+ readonly revision: number;
74
+ readonly releases: Readonly<Record<string, ReleaseRecord>>;
75
+ readonly references: ReleaseReferences;
76
+ readonly cleanup: ReleaseCleanupState;
77
+ readonly activation: {
78
+ readonly state: "idle" | "pending" | "draining" | "blocked" | "failed";
79
+ readonly reason: string | null;
80
+ readonly blockerGenerationIds: readonly string[];
81
+ readonly updatedAt: string;
82
+ };
83
+ }
84
+ export interface EndpointOwnership {
85
+ readonly state: "idle" | "busy" | "draining" | "released" | "blocked";
86
+ readonly liveInstanceIds: readonly string[];
87
+ readonly nonResumableInstanceIds: readonly string[];
88
+ readonly uncertainInstanceIds: readonly string[];
89
+ }
90
+ export interface SupervisorEndpointMetadata {
91
+ readonly schema: string;
92
+ readonly supervisorId: string;
93
+ readonly endpoint: string;
94
+ readonly pid: number;
95
+ readonly pidStartIdentity: string;
96
+ readonly bootNonce: string;
97
+ readonly startedAt: string;
98
+ readonly releaseId: string;
99
+ readonly releaseRoot: string;
100
+ readonly contentDigest: string;
101
+ readonly ownership: EndpointOwnership;
102
+ readonly envelope: string;
103
+ readonly envelopeRevision: number;
104
+ readonly requiredFeatures: readonly string[];
105
+ readonly optionalFeatures: readonly string[];
106
+ readonly contractDigest: string;
107
+ }
108
+ export interface ProtectedReleaseInputs {
109
+ readonly liveReleaseIds?: readonly string[];
110
+ readonly externalHolds?: readonly ExternalReleaseHold[];
111
+ readonly transaction?: ActiveReleaseTransactionReference | null;
112
+ }
113
+ export interface ProtectedReleasePlan {
114
+ readonly protectedReleaseIds: readonly string[];
115
+ readonly retainedReleaseIds: readonly string[];
116
+ readonly collectibleReleaseIds: readonly string[];
117
+ }
118
+ export interface OrphanReleaseDisposition {
119
+ readonly release: ReleaseRecord;
120
+ readonly stage: ReleaseCleanupStage;
121
+ readonly trashPath?: string | null;
122
+ }
123
+ export interface ReleaseRetentionReconciliation {
124
+ readonly state: CohortState;
125
+ readonly plan: ProtectedReleasePlan;
126
+ readonly detachedReleaseIds: readonly string[];
127
+ }
128
+ /**
129
+ * Derive protection exclusively from current selectors and ownership authorities.
130
+ * The historical retention snapshot is deliberately not an input to this plan.
131
+ */
132
+ export declare function planProtectedReleases(state: CohortState, inputs?: ProtectedReleaseInputs): ProtectedReleasePlan;
133
+ /** Serializes validated cohort-state revisions under a lock and commits each update atomically. */
134
+ export declare class CohortStateStore {
135
+ readonly path: string;
136
+ constructor(dataDir: string);
137
+ read(): Promise<CohortState>;
138
+ update(operation: (current: CohortState) => CohortState | Promise<CohortState>): Promise<CohortState>;
139
+ recordCandidate(release: MaterializedRelease): Promise<CohortState>;
140
+ approve(releaseId: string, diagnosticsPath: string): Promise<CohortState>;
141
+ activate(releaseId: string): Promise<CohortState>;
142
+ blockPending(reason: string, blockerGenerationIds: readonly string[]): Promise<CohortState>;
143
+ rollback(ownershipReleased: boolean): Promise<CohortState>;
144
+ setRetention(releaseIds: readonly string[]): Promise<CohortState>;
145
+ /** Atomically replace legacy retention history and detach every currently collectible record. */
146
+ reconcileRetention(resolveInputs: (current: CohortState) => ProtectedReleaseInputs | Promise<ProtectedReleaseInputs>, orphans?: readonly OrphanReleaseDisposition[]): Promise<ReleaseRetentionReconciliation>;
147
+ markCleanupTrash(releaseId: string, trashPath: string): Promise<CohortState>;
148
+ recordCleanupFailure(releaseId: string, stage: string, error: unknown): Promise<CohortState>;
149
+ completeCleanup(releaseId: string): Promise<CohortState>;
150
+ recordCleanupWorkerScheduled(runId: string): Promise<CohortState>;
151
+ recordCleanupWorkerStarted(runId: string, pid: number): Promise<CohortState>;
152
+ recordCleanupWorkerProgress(runId: string, summary: ReleaseCleanupWorkerSummary): Promise<CohortState>;
153
+ recordCleanupWorkerFinished(runId: string, status: Exclude<ReleaseCleanupWorkerStatus, "scheduled" | "running">, summary: ReleaseCleanupWorkerSummary, error?: unknown): Promise<CohortState>;
154
+ removeUnreferencedRelease(releaseId: string, externalReferences: readonly string[]): Promise<CohortState>;
155
+ }
156
+ export declare function emptyState(): CohortState;