@timurproko/a1 0.2.7-dev.1249 → 0.2.7-dev.1252

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 (340) hide show
  1. package/README.md +11 -36
  2. package/bin/cli.js +2 -17
  3. package/bin/ui.js +7 -48
  4. package/dist/app/session-shell/exit-notice.d.ts +2 -2
  5. package/dist/app/session-shell/exit-notice.js +10 -10
  6. package/dist/app/session-shell/prompt-submission.d.ts +2 -4
  7. package/dist/app/session-shell/prompt-submission.js +3 -23
  8. package/dist/app/session-shell/response-copy-transport.js +1 -2
  9. package/dist/app/session-shell/session-lifecycle.d.ts +1 -2
  10. package/dist/app/session-shell/session-lifecycle.js +2 -4
  11. package/dist/app/session-shell/session-shell-root.d.ts +0 -31
  12. package/dist/app/session-shell/session-shell-root.js +3 -4
  13. package/dist/app/session-shell/session-shell.js +6 -47
  14. package/dist/app/session-shell/session-viewport-controller.js +3 -6
  15. package/dist/app/session-shell/shell-host.js +2 -18
  16. package/dist/app/session-shell/transcript-document.d.ts +1 -2
  17. package/dist/app/session-shell/transcript-document.js +3 -28
  18. package/dist/app/session-shell/workflow-output.js +1 -1
  19. package/dist/app/session-shell/workflow-router.d.ts +1 -3
  20. package/dist/app/session-shell/workflow-router.js +1 -4
  21. package/dist/cli/dispatch.d.ts +1 -11
  22. package/dist/cli/dispatch.js +5 -92
  23. package/dist/cli/session-context.js +5 -7
  24. package/dist/cli/uninstall.d.ts +1 -5
  25. package/dist/cli/uninstall.js +6 -35
  26. package/dist/cli/version-stats.js +4 -7
  27. package/dist/composition/owned-settings.d.ts +0 -1
  28. package/dist/composition/owned-settings.js +0 -1
  29. package/dist/composition/owned-ui.d.ts +2 -24
  30. package/dist/composition/owned-ui.js +11 -87
  31. package/dist/composition/release-update-observation.d.ts +4 -4
  32. package/dist/composition/release-update-observation.js +17 -47
  33. package/dist/composition/session-backend.d.ts +0 -1
  34. package/dist/composition/session-runtime-registry.d.ts +3 -3
  35. package/dist/composition/settings-route-host.d.ts +0 -7
  36. package/dist/composition/settings-route-host.js +4 -10
  37. package/dist/composition/startup-route.d.ts +0 -1
  38. package/dist/composition/startup-route.js +0 -1
  39. package/dist/contracts/owned-ui/index.d.ts +1 -1
  40. package/dist/contracts/owned-ui/model.d.ts +0 -3
  41. package/dist/contracts/owned-ui/session-workflows.d.ts +1 -4
  42. package/dist/features/launch/development-launch.js +0 -1
  43. package/dist/features/launch/index.d.ts +1 -1
  44. package/dist/features/launch/intent.d.ts +1 -3
  45. package/dist/features/launch/intent.js +2 -4
  46. package/dist/features/launch/session-context.d.ts +2 -2
  47. package/dist/features/owned-ui/reference-screen-app.d.ts +0 -2
  48. package/dist/features/owned-ui/reference-screen-app.js +2 -9
  49. package/dist/features/owned-ui/settings-app.d.ts +0 -6
  50. package/dist/features/owned-ui/settings-app.js +5 -36
  51. package/dist/foundation/launch-context/index.d.ts +0 -12
  52. package/dist/foundation/launch-context/index.js +0 -26
  53. package/dist/foundation/lifecycle/claim-gate.d.ts +8 -0
  54. package/dist/foundation/lifecycle/claim-gate.js +37 -0
  55. package/dist/foundation/lifecycle/index.d.ts +5 -9
  56. package/dist/foundation/lifecycle/index.js +3 -4
  57. package/dist/foundation/lifecycle/model.d.ts +2 -59
  58. package/dist/foundation/lifecycle/model.js +0 -35
  59. package/dist/foundation/lifecycle/paths.d.ts +0 -24
  60. package/dist/foundation/lifecycle/paths.js +0 -40
  61. package/dist/foundation/lifecycle/process-liveness.d.ts +8 -0
  62. package/dist/foundation/lifecycle/process-liveness.js +18 -0
  63. package/dist/foundation/lifecycle/session-claim-lock.d.ts +1 -1
  64. package/dist/foundation/lifecycle/session-claim-lock.js +2 -2
  65. package/dist/foundation/lifecycle/session-repository-context.d.ts +6 -6
  66. package/dist/foundation/lifecycle/session-repository-context.js +2 -3
  67. package/dist/foundation/release/automatic-update.d.ts +1 -3
  68. package/dist/foundation/release/automatic-update.js +9 -30
  69. package/dist/foundation/release/bootstrap.d.ts +2 -25
  70. package/dist/foundation/release/bootstrap.js +33 -344
  71. package/dist/foundation/release/cohort-state.d.ts +21 -46
  72. package/dist/foundation/release/cohort-state.js +30 -62
  73. package/dist/foundation/release/dependency-certification.d.ts +1 -1
  74. package/dist/foundation/release/index.d.ts +10 -17
  75. package/dist/foundation/release/index.js +7 -11
  76. package/dist/foundation/release/latest-release.d.ts +1 -2
  77. package/dist/foundation/release/latest-release.js +1 -2
  78. package/dist/foundation/release/process-liveness.d.ts +2 -0
  79. package/dist/foundation/release/process-liveness.js +12 -0
  80. package/dist/foundation/release/release-gc.d.ts +12 -9
  81. package/dist/foundation/release/release-gc.js +34 -98
  82. package/dist/foundation/release/release-store.d.ts +2 -2
  83. package/dist/foundation/release/release-store.js +2 -2
  84. package/dist/foundation/release/restart-certification.js +1 -1
  85. package/dist/foundation/release/update-activation.d.ts +2 -9
  86. package/dist/foundation/release/update-activation.js +28 -43
  87. package/dist/foundation/release/update-execution-lease.js +1 -1
  88. package/dist/foundation/release/update-launch.d.ts +0 -2
  89. package/dist/foundation/release/update-launch.js +0 -7
  90. package/dist/foundation/release/update-recovery.js +1 -1
  91. package/dist/foundation/release/update-transaction.d.ts +1 -1
  92. package/dist/foundation/release/update-transaction.js +5 -2
  93. package/dist/foundation/release/update.d.ts +2 -10
  94. package/dist/foundation/release/update.js +23 -200
  95. package/dist/foundation/session-writer-lock/index.d.ts +14 -6
  96. package/dist/foundation/session-writer-lock/index.js +48 -103
  97. package/dist/foundation/startup/startup-runtime.d.ts +1 -1
  98. package/dist/foundation/terminal-cleanup/exit-notice.d.ts +6 -0
  99. package/dist/foundation/terminal-cleanup/exit-notice.js +36 -0
  100. package/dist/foundation/terminal-cleanup/index.d.ts +2 -1
  101. package/dist/foundation/terminal-cleanup/index.js +2 -1
  102. package/dist/foundation/terminal-cleanup/terminal-reset.d.ts +0 -5
  103. package/dist/foundation/terminal-cleanup/terminal-reset.js +0 -5
  104. package/dist/integrations/pi/components/index.d.ts +1 -1
  105. package/dist/integrations/pi/components/index.js +1 -1
  106. package/dist/integrations/pi/components/shell-editor-autocomplete.js +1 -4
  107. package/dist/integrations/pi/components/shell-footer-status.d.ts +1 -1
  108. package/dist/integrations/pi/components/shell-footer-status.js +2 -2
  109. package/dist/integrations/pi/components/shell-hotkey-sections.js +1 -1
  110. package/dist/integrations/pi/components/shell-presenters-info.d.ts +2 -5
  111. package/dist/integrations/pi/components/shell-presenters-info.js +4 -18
  112. package/dist/integrations/pi/components/shell-presenters-transcript.d.ts +1 -1
  113. package/dist/integrations/pi/components/shell-presenters-transcript.js +1 -1
  114. package/dist/integrations/pi/components/shell-shared-facade.d.ts +0 -2
  115. package/dist/integrations/pi/components/submitted-prompt-adapter.d.ts +2 -5
  116. package/dist/integrations/pi/components/submitted-prompt-adapter.js +2 -16
  117. package/dist/integrations/pi/components/upstream/components/session-footer.d.ts +1 -2
  118. package/dist/integrations/pi/components/upstream/components/session-footer.js +6 -8
  119. package/dist/integrations/pi/engine/adapter.d.ts +0 -1
  120. package/dist/integrations/pi/engine/adapter.js +1 -16
  121. package/dist/integrations/pi/engine/diagnostics-state.d.ts +0 -1
  122. package/dist/integrations/pi/engine/diagnostics-state.js +0 -14
  123. package/dist/integrations/pi/engine/prompt-suggestions.d.ts +0 -1
  124. package/dist/integrations/pi/engine/prompt-suggestions.js +0 -40
  125. package/dist/integrations/pi/engine/session-runtime.js +0 -2
  126. package/dist/integrations/pi/engine/workflow-runner.js +1 -1
  127. package/dist/integrations/pi/tui-runtime/adapter.d.ts +2 -2
  128. package/dist/integrations/pi/tui-runtime/adapter.js +2 -2
  129. package/dist/product-identity.d.ts +4 -6
  130. package/dist/product-identity.js +6 -11
  131. package/dist/product-identity.json +1 -40
  132. package/dist/runtime-payload-inventory.json +0 -3
  133. package/dist/ui/components/index.d.ts +2 -2
  134. package/dist/ui/components/index.js +1 -1
  135. package/dist/ui/components/submitted-prompt.d.ts +3 -13
  136. package/dist/ui/components/submitted-prompt.js +8 -41
  137. package/dist/ui/components/transcript-viewport.d.ts +1 -3
  138. package/dist/ui/components/transcript-viewport.js +1 -4
  139. package/dist/ui/settings/declarations.d.ts +3 -97
  140. package/dist/ui/settings/declarations.js +3 -78
  141. package/dist/ui/settings/migrations.js +18 -2
  142. package/docs/architecture/boundaries.md +22 -39
  143. package/docs/architecture/code-documentation.md +2 -2
  144. package/docs/architecture/internal-naming.md +9 -17
  145. package/docs/architecture/project-structure.md +9 -14
  146. package/docs/architecture/resource-and-data-policy.md +16 -31
  147. package/docs/architecture/toolchain.md +14 -19
  148. package/docs/architecture/ui-reference-provenance.md +2 -2
  149. package/docs/ci-release-runbook.md +5 -5
  150. package/docs/features/launch-profiles.md +11 -17
  151. package/docs/features/prompt-history.md +10 -11
  152. package/docs/local-worktree-cleanup.md +28 -1
  153. package/docs/manual-owned-ui-checkpoint.md +0 -1
  154. package/docs/validation.md +5 -11
  155. package/docs/worktree-link-recovery.md +6 -6
  156. package/package.json +7 -19
  157. package/bin/guardian.js +0 -42
  158. package/bin/supervisor.js +0 -7
  159. package/bin/tab-launch-context.d.ts +0 -27
  160. package/bin/tab-launch-context.js +0 -94
  161. package/dist/app/session-shell/resident-tab-coordinator.d.ts +0 -38
  162. package/dist/app/session-shell/resident-tab-coordinator.js +0 -77
  163. package/dist/cli/tabs-request.d.ts +0 -7
  164. package/dist/cli/tabs-request.js +0 -1
  165. package/dist/cli/tabs.d.ts +0 -14
  166. package/dist/cli/tabs.js +0 -151
  167. package/dist/composition/resident-tab-bridge.d.ts +0 -41
  168. package/dist/composition/resident-tab-bridge.js +0 -209
  169. package/dist/composition/utility-tab.d.ts +0 -28
  170. package/dist/composition/utility-tab.js +0 -244
  171. package/dist/features/owned-ui/plus-menu-dialog.d.ts +0 -28
  172. package/dist/features/owned-ui/plus-menu-dialog.js +0 -89
  173. package/dist/features/resident-tab/auto-name.d.ts +0 -11
  174. package/dist/features/resident-tab/auto-name.js +0 -44
  175. package/dist/features/resident-tab/index.d.ts +0 -5
  176. package/dist/features/resident-tab/index.js +0 -7
  177. package/dist/features/resident-tab/shortcut-bindings-file.d.ts +0 -8
  178. package/dist/features/resident-tab/shortcut-bindings-file.js +0 -40
  179. package/dist/features/resident-tab/shortcut-declarations.d.ts +0 -13
  180. package/dist/features/resident-tab/shortcut-declarations.js +0 -26
  181. package/dist/features/resident-tab/shortcut-projection.d.ts +0 -29
  182. package/dist/features/resident-tab/shortcut-projection.js +0 -64
  183. package/dist/features/resident-tab/status-deriver.d.ts +0 -10
  184. package/dist/features/resident-tab/status-deriver.js +0 -12
  185. package/dist/foundation/launch-guardian/exit-watcher.d.ts +0 -14
  186. package/dist/foundation/launch-guardian/exit-watcher.js +0 -103
  187. package/dist/foundation/launch-guardian/index.d.ts +0 -2
  188. package/dist/foundation/launch-guardian/index.js +0 -1
  189. package/dist/foundation/launch-guardian/main.d.ts +0 -39
  190. package/dist/foundation/launch-guardian/main.js +0 -232
  191. package/dist/foundation/lifecycle/commands.d.ts +0 -40
  192. package/dist/foundation/lifecycle/commands.js +0 -1
  193. package/dist/foundation/lifecycle/launch-instance.d.ts +0 -46
  194. package/dist/foundation/lifecycle/launch-instance.js +0 -134
  195. package/dist/foundation/lifecycle/native-claim-gate.d.ts +0 -5
  196. package/dist/foundation/lifecycle/native-claim-gate.js +0 -41
  197. package/dist/foundation/lifecycle/supervisor-startup.d.ts +0 -30
  198. package/dist/foundation/lifecycle/supervisor-startup.js +0 -106
  199. package/dist/foundation/process-containment/addon-containment.d.ts +0 -20
  200. package/dist/foundation/process-containment/addon-containment.js +0 -139
  201. package/dist/foundation/process-containment/addon-process-inspector.d.ts +0 -11
  202. package/dist/foundation/process-containment/addon-process-inspector.js +0 -36
  203. package/dist/foundation/process-containment/addon.d.ts +0 -47
  204. package/dist/foundation/process-containment/addon.js +0 -57
  205. package/dist/foundation/process-containment/artifact.d.ts +0 -1
  206. package/dist/foundation/process-containment/artifact.js +0 -35
  207. package/dist/foundation/process-containment/contracts.d.ts +0 -33
  208. package/dist/foundation/process-containment/contracts.js +0 -35
  209. package/dist/foundation/process-containment/index.d.ts +0 -9
  210. package/dist/foundation/process-containment/index.js +0 -7
  211. package/dist/foundation/process-containment/linux-process-inspector.d.ts +0 -7
  212. package/dist/foundation/process-containment/linux-process-inspector.js +0 -27
  213. package/dist/foundation/process-containment/native-process-inspector.d.ts +0 -4
  214. package/dist/foundation/process-containment/native-process-inspector.js +0 -21
  215. package/dist/foundation/protocol/client.d.ts +0 -18
  216. package/dist/foundation/protocol/client.js +0 -130
  217. package/dist/foundation/protocol/index.d.ts +0 -3
  218. package/dist/foundation/protocol/index.js +0 -2
  219. package/dist/foundation/protocol/messages.d.ts +0 -90
  220. package/dist/foundation/protocol/messages.js +0 -100
  221. package/dist/foundation/release/cohort-selection.d.ts +0 -33
  222. package/dist/foundation/release/cohort-selection.js +0 -67
  223. package/dist/foundation/release/endpoint-lock.d.ts +0 -2
  224. package/dist/foundation/release/endpoint-lock.js +0 -37
  225. package/dist/foundation/release/endpoint-recovery.d.ts +0 -10
  226. package/dist/foundation/release/endpoint-recovery.js +0 -45
  227. package/dist/foundation/release/endpoints.d.ts +0 -32
  228. package/dist/foundation/release/endpoints.js +0 -152
  229. package/dist/foundation/release/prepared-update-activation.d.ts +0 -3
  230. package/dist/foundation/release/prepared-update-activation.js +0 -27
  231. package/dist/foundation/release/process-cleanup.d.ts +0 -14
  232. package/dist/foundation/release/process-cleanup.js +0 -76
  233. package/dist/foundation/release/supervisor-identity.d.ts +0 -15
  234. package/dist/foundation/release/supervisor-identity.js +0 -63
  235. package/dist/foundation/resident-tabs/boot-identity.d.ts +0 -6
  236. package/dist/foundation/resident-tabs/boot-identity.js +0 -16
  237. package/dist/foundation/resident-tabs/bounded-host-command.d.ts +0 -20
  238. package/dist/foundation/resident-tabs/bounded-host-command.js +0 -62
  239. package/dist/foundation/resident-tabs/bridge-client.d.ts +0 -73
  240. package/dist/foundation/resident-tabs/bridge-client.js +0 -327
  241. package/dist/foundation/resident-tabs/continuity.d.ts +0 -12
  242. package/dist/foundation/resident-tabs/continuity.js +0 -63
  243. package/dist/foundation/resident-tabs/doctor.d.ts +0 -28
  244. package/dist/foundation/resident-tabs/doctor.js +0 -166
  245. package/dist/foundation/resident-tabs/draft-checkpoint.d.ts +0 -27
  246. package/dist/foundation/resident-tabs/draft-checkpoint.js +0 -145
  247. package/dist/foundation/resident-tabs/ensure-terminal-host.d.ts +0 -36
  248. package/dist/foundation/resident-tabs/ensure-terminal-host.js +0 -151
  249. package/dist/foundation/resident-tabs/fault-injection.d.ts +0 -8
  250. package/dist/foundation/resident-tabs/fault-injection.js +0 -26
  251. package/dist/foundation/resident-tabs/fixture-control.d.ts +0 -7
  252. package/dist/foundation/resident-tabs/fixture-control.js +0 -35
  253. package/dist/foundation/resident-tabs/host-entry.d.ts +0 -1
  254. package/dist/foundation/resident-tabs/host-entry.js +0 -17
  255. package/dist/foundation/resident-tabs/index.d.ts +0 -15
  256. package/dist/foundation/resident-tabs/index.js +0 -10
  257. package/dist/foundation/resident-tabs/maintenance.d.ts +0 -39
  258. package/dist/foundation/resident-tabs/maintenance.js +0 -75
  259. package/dist/foundation/resident-tabs/progress-observation-schema.d.ts +0 -34
  260. package/dist/foundation/resident-tabs/progress-observation-schema.js +0 -1
  261. package/dist/foundation/resident-tabs/progress-observation.d.ts +0 -4
  262. package/dist/foundation/resident-tabs/progress-observation.js +0 -150
  263. package/dist/foundation/resident-tabs/prompt-journal.d.ts +0 -63
  264. package/dist/foundation/resident-tabs/prompt-journal.js +0 -213
  265. package/dist/foundation/resident-tabs/protocol.d.ts +0 -12
  266. package/dist/foundation/resident-tabs/protocol.js +0 -195
  267. package/dist/foundation/resident-tabs/recovery.d.ts +0 -26
  268. package/dist/foundation/resident-tabs/recovery.js +0 -205
  269. package/dist/foundation/resident-tabs/release-holds.d.ts +0 -28
  270. package/dist/foundation/resident-tabs/release-holds.js +0 -78
  271. package/dist/foundation/resident-tabs/routes.d.ts +0 -5
  272. package/dist/foundation/resident-tabs/routes.js +0 -5
  273. package/dist/foundation/resident-tabs/routing.d.ts +0 -11
  274. package/dist/foundation/resident-tabs/routing.js +0 -10
  275. package/dist/foundation/resident-tabs/runtime-control.d.ts +0 -38
  276. package/dist/foundation/resident-tabs/runtime-control.js +0 -74
  277. package/dist/foundation/resident-tabs/session-sync.d.ts +0 -14
  278. package/dist/foundation/resident-tabs/session-sync.js +0 -37
  279. package/dist/foundation/resident-tabs/settings.d.ts +0 -16
  280. package/dist/foundation/resident-tabs/settings.js +0 -60
  281. package/dist/foundation/resident-tabs/terminal-host-artifact.d.ts +0 -14
  282. package/dist/foundation/resident-tabs/terminal-host-artifact.js +0 -78
  283. package/dist/foundation/resident-tabs/zip-archive.d.ts +0 -9
  284. package/dist/foundation/resident-tabs/zip-archive.js +0 -56
  285. package/dist/foundation/storage/control-store.d.ts +0 -20
  286. package/dist/foundation/storage/control-store.js +0 -331
  287. package/dist/foundation/storage/index.d.ts +0 -1
  288. package/dist/foundation/storage/index.js +0 -1
  289. package/dist/foundation/supervision/index.d.ts +0 -3
  290. package/dist/foundation/supervision/index.js +0 -3
  291. package/dist/foundation/supervision/main.d.ts +0 -1
  292. package/dist/foundation/supervision/main.js +0 -86
  293. package/dist/foundation/supervision/paths.d.ts +0 -1
  294. package/dist/foundation/supervision/paths.js +0 -1
  295. package/dist/foundation/supervision/server.d.ts +0 -46
  296. package/dist/foundation/supervision/server.js +0 -611
  297. package/dist/integrations/pi/engine/offline-settings-port.d.ts +0 -23
  298. package/dist/integrations/pi/engine/offline-settings-port.js +0 -54
  299. package/dist/native/darwin-arm64/manifest.json +0 -23
  300. package/dist/native/darwin-arm64/process-guardian.node +0 -0
  301. package/dist/native/darwin-arm64/terminal-host-THIRD-PARTY-NOTICES.txt +0 -10500
  302. package/dist/native/darwin-arm64/terminal-host.manifest.json +0 -46
  303. package/dist/native/darwin-arm64/terminal-host.node +0 -0
  304. package/dist/native/darwin-x64/manifest.json +0 -23
  305. package/dist/native/darwin-x64/process-guardian.node +0 -0
  306. package/dist/native/darwin-x64/terminal-host-THIRD-PARTY-NOTICES.txt +0 -10737
  307. package/dist/native/darwin-x64/terminal-host.manifest.json +0 -46
  308. package/dist/native/darwin-x64/terminal-host.node +0 -0
  309. package/dist/native/linux-x64/manifest.json +0 -23
  310. package/dist/native/linux-x64/process-guardian.node +0 -0
  311. package/dist/native/linux-x64/terminal-host-THIRD-PARTY-NOTICES.txt +0 -11226
  312. package/dist/native/linux-x64/terminal-host.manifest.json +0 -46
  313. package/dist/native/linux-x64/terminal-host.node +0 -0
  314. package/dist/native/win32-x64/manifest.json +0 -23
  315. package/dist/native/win32-x64/process-guardian.node +0 -0
  316. package/dist/native/win32-x64/terminal-host-THIRD-PARTY-NOTICES.txt +0 -10757
  317. package/dist/native/win32-x64/terminal-host.manifest.json +0 -46
  318. package/dist/native/win32-x64/terminal-host.node +0 -0
  319. package/docs/architecture/evidence/resident-tabs/linux-x64.md +0 -37
  320. package/docs/architecture/evidence/resident-tabs/macos-arm64.md +0 -36
  321. package/docs/architecture/evidence/resident-tabs/macos-x64.md +0 -35
  322. package/docs/architecture/evidence/resident-tabs/windows-x64.md +0 -36
  323. package/docs/architecture/evidence/terminal-host-spike/manual-one-pane-terminal-host.md +0 -70
  324. package/docs/architecture/evidence/terminal-host-spike/manual-two-by-two-basic-terminal-host.md +0 -32
  325. package/docs/architecture/evidence/terminal-host-spike/milestone-baseline.json +0 -115
  326. package/docs/architecture/evidence/terminal-host-spike/owned-ui-foundation-prerequisite.json +0 -48
  327. package/docs/architecture/evidence/terminal-host-spike/terminal-host-provenance.json +0 -125
  328. package/docs/architecture/evidence/terminal-host-spike/terminal-host-task-5-1.json +0 -56
  329. package/docs/architecture/evidence/terminal-host-spike/terminal-host-task-5-3.json +0 -174
  330. package/docs/architecture/evidence/terminal-host-spike/terminal-spike-acceptance-record.json +0 -18
  331. package/docs/architecture/native-fixture-isolation.md +0 -23
  332. package/docs/architecture/process-guardian-provenance.md +0 -36
  333. package/docs/architecture/resident-tabs-requirements.md +0 -18
  334. package/docs/architecture/resident-tabs.md +0 -668
  335. package/docs/architecture/terminal-host-proof-gate.md +0 -34
  336. package/docs/architecture/terminal-host-provenance.md +0 -81
  337. package/docs/architecture/terminal-host-spike-evidence.md +0 -39
  338. package/docs/launch-recovery.md +0 -23
  339. package/docs/manual-launch-instance-acceptance.md +0 -43
  340. package/docs/manual-resident-tabs-acceptance.md +0 -51
@@ -1,14 +0,0 @@
1
- import { type ProcessGuardianAddon } from "../process-containment/index.js";
2
- interface ExitWatcherOptions {
3
- readonly guardianPid: number;
4
- readonly noticePath: string;
5
- readonly encodedModes: string;
6
- readonly addonPath: string;
7
- readonly runtimePid: number;
8
- readonly processGroup: number | null;
9
- readonly foregroundGroup: number | null;
10
- }
11
- /** Waits outside launch containment, then performs the cleanup its dead guardian could not. */
12
- export declare function runExitWatcher(arguments_: readonly string[], platform?: NodeJS.Platform, loadAddon?: (path: string) => ProcessGuardianAddon): Promise<number>;
13
- export declare function exitWatcherArguments(options: ExitWatcherOptions): string[];
14
- export {};
@@ -1,103 +0,0 @@
1
- import { fileURLToPath } from "node:url";
2
- import { resolve } from "node:path";
3
- import { loadProcessGuardianAddon } from "../process-containment/index.js";
4
- /** Waits outside launch containment, then performs the cleanup its dead guardian could not. */
5
- export async function runExitWatcher(arguments_, platform = process.platform, loadAddon = loadProcessGuardianAddon) {
6
- const options = parseArguments(arguments_);
7
- const addon = loadAddon(options.addonPath);
8
- if (platform === "win32")
9
- addon.ignoreConsoleControl();
10
- else {
11
- process.on("SIGINT", ignoreSignal);
12
- process.on("SIGTTOU", ignoreSignal);
13
- }
14
- try {
15
- await addon.waitForProcessExit(options.guardianPid);
16
- let cleanupFailure = null;
17
- try {
18
- if (platform === "win32") {
19
- // Rationale: job termination is asynchronous; keep the runtime's final frame ahead of the notice.
20
- await Promise.race([
21
- addon.waitForProcessExit(options.runtimePid),
22
- delay(2_000),
23
- ]);
24
- }
25
- else if (options.processGroup !== null) {
26
- addon.stopProcessGroup(options.processGroup);
27
- if (options.foregroundGroup !== null)
28
- addon.restoreForegroundGroup(options.foregroundGroup);
29
- }
30
- }
31
- catch (error) {
32
- cleanupFailure = error;
33
- }
34
- // Invariant: an armed notice, such as the running-Agent reminder, survives a failed cleanup.
35
- addon.deliverExitNotice(options.noticePath, options.encodedModes);
36
- if (cleanupFailure !== null)
37
- throw cleanupFailure;
38
- return 0;
39
- }
40
- finally {
41
- if (platform !== "win32") {
42
- process.off("SIGINT", ignoreSignal);
43
- process.off("SIGTTOU", ignoreSignal);
44
- }
45
- }
46
- }
47
- export function exitWatcherArguments(options) {
48
- return [
49
- "--guardian-pid", String(options.guardianPid),
50
- "--notice", options.noticePath,
51
- "--modes", options.encodedModes,
52
- "--addon", options.addonPath,
53
- "--runtime-pid", String(options.runtimePid),
54
- ...(options.processGroup === null ? [] : ["--process-group", String(options.processGroup)]),
55
- ...(options.foregroundGroup === null ? [] : ["--foreground-group", String(options.foregroundGroup)]),
56
- ];
57
- }
58
- function parseArguments(arguments_) {
59
- const values = new Map();
60
- for (let index = 0; index < arguments_.length; index += 2) {
61
- const name = arguments_[index];
62
- const value = arguments_[index + 1];
63
- if (!name?.startsWith("--") || value === undefined || values.has(name))
64
- throw new TypeError("exit watcher arguments are malformed");
65
- values.set(name, value);
66
- }
67
- const guardianPid = positiveInteger(values.get("--guardian-pid"), "guardian PID");
68
- const runtimePid = positiveInteger(values.get("--runtime-pid"), "runtime PID");
69
- const noticePath = boundedValue(values.get("--notice"), "notice path");
70
- const encodedModes = boundedValue(values.get("--modes"), "terminal modes", 32_768);
71
- const addonPath = boundedValue(values.get("--addon"), "addon path");
72
- const processGroup = optionalPositiveInteger(values.get("--process-group"), "process group");
73
- const foregroundGroup = optionalPositiveInteger(values.get("--foreground-group"), "foreground group");
74
- const expected = 5 + (processGroup === null ? 0 : 1) + (foregroundGroup === null ? 0 : 1);
75
- if (values.size !== expected)
76
- throw new TypeError("exit watcher received an unknown argument");
77
- return { guardianPid, noticePath, encodedModes, addonPath, runtimePid, processGroup, foregroundGroup };
78
- }
79
- function positiveInteger(value, name) {
80
- const parsed = Number(value);
81
- if (!Number.isSafeInteger(parsed) || parsed <= 0)
82
- throw new TypeError(`exit watcher ${name} must be a positive safe integer`);
83
- return parsed;
84
- }
85
- function optionalPositiveInteger(value, name) {
86
- return value === undefined ? null : positiveInteger(value, name);
87
- }
88
- function boundedValue(value, name, limit = 4_096) {
89
- if (!value || value.length > limit || value.includes("\0"))
90
- throw new TypeError(`exit watcher ${name} is invalid`);
91
- return value;
92
- }
93
- function delay(milliseconds) {
94
- return new Promise(resolvePromise => setTimeout(resolvePromise, milliseconds));
95
- }
96
- function ignoreSignal() { }
97
- const invokedPath = process.argv[1] ? resolve(process.argv[1]) : null;
98
- if (invokedPath === fileURLToPath(import.meta.url)) {
99
- void runExitWatcher(process.argv.slice(2)).then(code => process.exit(code), error => {
100
- process.stderr.write(`a1 exit watcher: ${error instanceof Error ? error.message : String(error)}\n`);
101
- process.exit(2);
102
- });
103
- }
@@ -1,2 +0,0 @@
1
- export { runLaunchGuardian } from "./main.js";
2
- export type { LaunchGuardianOptions } from "./main.js";
@@ -1 +0,0 @@
1
- export { runLaunchGuardian } from "./main.js";
@@ -1,39 +0,0 @@
1
- import type { LaunchInstanceStopIntent, LaunchProfileId, SupervisorCommand } from "../lifecycle/index.js";
2
- import { type SessionSelection } from "../lifecycle/index.js";
3
- import { type NativeProcessInspector, type ProcessContainment, type ProcessGuardianAddon } from "../process-containment/index.js";
4
- interface GuardianControl {
5
- connect(endpoint: string, timeoutMs?: number): Promise<unknown>;
6
- command(command: SupervisorCommand): Promise<{
7
- readonly ok: boolean;
8
- readonly error?: {
9
- readonly code: string;
10
- readonly message: string;
11
- };
12
- }>;
13
- on(event: "stopIntent", listener: (intent: LaunchInstanceStopIntent) => void): unknown;
14
- on(event: "disconnect", listener: () => void): unknown;
15
- off(event: "stopIntent", listener: (intent: LaunchInstanceStopIntent) => void): unknown;
16
- off(event: "disconnect", listener: () => void): unknown;
17
- close(): void;
18
- }
19
- export interface LaunchGuardianRootCommand {
20
- readonly executable: string;
21
- readonly arguments: readonly string[];
22
- }
23
- export interface LaunchGuardianOptions {
24
- readonly profileId: LaunchProfileId;
25
- readonly releaseRoot: string;
26
- readonly uiEntry: string;
27
- readonly sessionSelection?: SessionSelection;
28
- readonly rootCommand?: LaunchGuardianRootCommand;
29
- readonly environment?: NodeJS.ProcessEnv;
30
- readonly cwd?: string;
31
- readonly helperPath?: string;
32
- readonly inspector?: NativeProcessInspector;
33
- readonly control?: GuardianControl;
34
- readonly containment?: ProcessContainment;
35
- readonly addon?: ProcessGuardianAddon;
36
- readonly ensureHelper?: (path: string) => Promise<void>;
37
- }
38
- export declare function runLaunchGuardian(options: LaunchGuardianOptions): Promise<number>;
39
- export {};
@@ -1,232 +0,0 @@
1
- import { spawn } from "node:child_process";
2
- import { randomUUID } from "node:crypto";
3
- import { fileURLToPath } from "node:url";
4
- import { PRODUCT_TEXT } from "../../product-identity.js";
5
- import { readLaunchContext } from "../launch-context/index.js";
6
- import { resolve } from "node:path";
7
- import { assertLaunchProfileId, resolveCohortEndpoint, resolveProductPaths, sessionSelectionArguments } from "../lifecycle/index.js";
8
- import { AddonContainment, AddonProcessInspector, closeVerifiedContainment, LinuxNativeProcessInspector, loadProcessGuardianAddon, resolveProcessGuardianPath, verifyProcessGuardianArtifact, } from "../process-containment/index.js";
9
- import { SupervisorClient } from "../protocol/index.js";
10
- import { markStartupPhase } from "../startup/index.js";
11
- import { exitWatcherArguments } from "./exit-watcher.js";
12
- export async function runLaunchGuardian(options) {
13
- assertLaunchProfileId(options.profileId);
14
- const sessionArgs = sessionSelectionArguments(options.sessionSelection);
15
- if (sessionArgs.length > 0 && options.profileId !== "a1")
16
- throw new Error("session selection requires the normal A1 profile");
17
- const environment = { ...(options.environment ?? process.env) };
18
- const paths = resolveProductPaths(environment);
19
- const instanceId = randomUUID();
20
- const helperPath = options.helperPath ?? resolveProcessGuardianPath(options.releaseRoot, environment);
21
- await (options.ensureHelper ?? verifyProcessGuardianArtifact)(helperPath);
22
- // Rationale: tests that inject both process boundaries need no native module; every production
23
- // path loads the exact artifact only after its manifest and digest have been verified.
24
- const addon = options.addon ?? (options.containment && options.inspector ? null : loadProcessGuardianAddon(helperPath));
25
- const inspector = options.inspector ?? platformInspector(requireAddon(addon));
26
- const guardianIdentity = await inspector.observe(process.pid);
27
- if (!guardianIdentity)
28
- throw diagnosticError("launch guardian cannot verify its own native process identity", "PROCESS_IDENTITY_UNAVAILABLE");
29
- const context = readLaunchContext(environment);
30
- const client = options.control ?? new SupervisorClient(context.releaseId);
31
- // Invariant: an instance belongs to the cohort that launched it and talks to that cohort's endpoint
32
- // for its whole life, whatever release becomes the active one meanwhile.
33
- const releaseId = context.releaseId;
34
- const endpoint = releaseId
35
- ? resolveCohortEndpoint(paths, releaseId, environment).endpoint
36
- : paths.endpoint;
37
- await client.connect(endpoint);
38
- await markStartupPhase(environment, "guardian-connected");
39
- const exitNoticePath = resolve(paths.runtimeDir, "launch-instances", `${instanceId}.exit-notice`);
40
- const containment = options.containment ?? new AddonContainment(instanceId, helperPath, exitNoticePath, requireAddon(addon));
41
- const stop = stopRequests(client, instanceId);
42
- let rootIdentity = null;
43
- try {
44
- await requireAccepted(client, {
45
- type: "create-launch-instance",
46
- requestId: randomUUID(),
47
- instanceId,
48
- profileId: options.profileId,
49
- shutdownPolicy: "terminate-tree-on-close",
50
- guardianIdentity,
51
- });
52
- let handle;
53
- let encodedModes = null;
54
- try {
55
- const rootCommand = options.rootCommand ?? { executable: process.execPath, arguments: [options.uiEntry, ...sessionArgs] };
56
- encodedModes = addon?.captureTerminalModes() ?? null;
57
- handle = await containment.spawn(rootCommand.executable, [...rootCommand.arguments], {
58
- cwd: options.cwd ?? process.cwd(),
59
- environment: environmentEntries(environment),
60
- ...(environment.TERM ? { terminalType: environment.TERM } : {}),
61
- });
62
- rootIdentity = handle.identity;
63
- if (addon && encodedModes !== null) {
64
- await startExitWatcher(addon, {
65
- addonPath: helperPath,
66
- noticePath: exitNoticePath,
67
- encodedModes,
68
- runtimePid: handle.identity.pid,
69
- processGroup: handle.processGroup ?? null,
70
- foregroundGroup: handle.foregroundGroup ?? null,
71
- });
72
- }
73
- await requireAccepted(client, {
74
- type: "activate-launch-instance",
75
- requestId: randomUUID(),
76
- instanceId,
77
- rootIdentity,
78
- containmentIdentity: containment.identity,
79
- });
80
- }
81
- catch (error) {
82
- const outcome = failureOutcome(error, "guardian-error");
83
- await completeBestEffort(client, instanceId, "completed", outcome);
84
- throw error;
85
- }
86
- const outcome = await Promise.race([
87
- handle.outcome,
88
- stop.requested.then(async (reason) => {
89
- if (reason !== "supervisor-disconnect") {
90
- await requireAccepted(client, {
91
- type: "begin-launch-instance-stop",
92
- requestId: randomUUID(),
93
- instanceId,
94
- reason,
95
- });
96
- }
97
- if (!rootIdentity)
98
- return failureOutcome(new Error("launch root identity is unavailable"), "cleanup-error");
99
- const result = await closeVerifiedContainment(containment, inspector, rootIdentity, reason);
100
- await containment.close();
101
- if (reason === "supervisor-disconnect" && result.outcome.kind === "stopped") {
102
- return {
103
- kind: "interrupted",
104
- reason,
105
- message: "supervisor disconnected after local launch-instance containment closed",
106
- };
107
- }
108
- return result.outcome;
109
- }),
110
- ]);
111
- // Invariant: the root removes a clean notice. If it left the notice armed, the guardian claims,
112
- // restores, and prints it before closing the native containment handle.
113
- if (addon && encodedModes !== null)
114
- addon.deliverExitNotice(exitNoticePath, encodedModes);
115
- await containment.close();
116
- if (outcome.kind !== "interrupted" || outcome.reason !== "supervisor-disconnect") {
117
- await completeBestEffort(client, instanceId, outcome.kind === "interrupted" || outcome.kind === "cleanup-error" ? "interrupted" : "completed", outcome);
118
- }
119
- return exitCode(outcome);
120
- }
121
- catch (error) {
122
- await containment.close().catch(() => undefined);
123
- throw error;
124
- }
125
- finally {
126
- stop.dispose();
127
- client.close();
128
- }
129
- }
130
- async function startExitWatcher(addon, options) {
131
- const entry = fileURLToPath(new URL("./exit-watcher.js", import.meta.url));
132
- const arguments_ = [entry, ...exitWatcherArguments({
133
- guardianPid: process.pid,
134
- ...options,
135
- })];
136
- if (process.platform === "win32") {
137
- addon.spawnWatcher({ executable: process.execPath, arguments: arguments_ });
138
- return;
139
- }
140
- await new Promise((resolvePromise, rejectPromise) => {
141
- const watcher = spawn(process.execPath, arguments_, {
142
- stdio: "inherit",
143
- detached: false,
144
- windowsHide: false,
145
- });
146
- watcher.once("error", rejectPromise);
147
- watcher.once("spawn", () => {
148
- watcher.off("error", rejectPromise);
149
- watcher.unref();
150
- resolvePromise();
151
- });
152
- });
153
- }
154
- function platformInspector(addon) {
155
- if (process.platform === "win32")
156
- return new AddonProcessInspector(addon, "windows-filetime:");
157
- if (process.platform === "linux")
158
- return new LinuxNativeProcessInspector();
159
- if (process.platform === "darwin")
160
- return new AddonProcessInspector(addon, "darwin-proc-start:");
161
- throw diagnosticError(`launch-instance process containment is unsupported on ${process.platform}`, "CONTAINMENT_UNSUPPORTED");
162
- }
163
- function requireAddon(addon) {
164
- if (!addon)
165
- throw diagnosticError("process guardian addon is unavailable", "CONTAINMENT_ARTIFACT_MISSING");
166
- return addon;
167
- }
168
- function stopRequests(client, instanceId) {
169
- let resolveStop;
170
- let settled = false;
171
- const requested = new Promise(resolvePromise => { resolveStop = resolvePromise; });
172
- const request = (reason) => {
173
- if (settled)
174
- return;
175
- settled = true;
176
- resolveStop(reason);
177
- };
178
- const onStopIntent = (intent) => {
179
- if (intent.instanceId === instanceId)
180
- request(intent.reason);
181
- };
182
- const onDisconnect = () => request("supervisor-disconnect");
183
- const onSigterm = () => request("user-request");
184
- const onSigint = () => undefined;
185
- client.on("stopIntent", onStopIntent);
186
- client.on("disconnect", onDisconnect);
187
- process.once("SIGTERM", onSigterm);
188
- process.on("SIGINT", onSigint);
189
- return {
190
- requested,
191
- dispose() {
192
- client.off("stopIntent", onStopIntent);
193
- client.off("disconnect", onDisconnect);
194
- process.off("SIGTERM", onSigterm);
195
- process.off("SIGINT", onSigint);
196
- },
197
- };
198
- }
199
- async function requireAccepted(client, command) {
200
- const result = await client.command(command);
201
- if (!result.ok)
202
- throw diagnosticError(result.error?.message ?? `supervisor rejected ${command.type}`, result.error?.code ?? "SUPERVISOR_REJECTED");
203
- }
204
- async function completeBestEffort(client, instanceId, terminalState, outcome) {
205
- await requireAccepted(client, {
206
- type: "complete-launch-instance",
207
- requestId: randomUUID(),
208
- instanceId,
209
- terminalState,
210
- outcome,
211
- }).catch(() => undefined);
212
- }
213
- function environmentEntries(environment) {
214
- return Object.fromEntries(Object.entries(environment).filter((entry) => entry[1] !== undefined));
215
- }
216
- function failureOutcome(error, kind) {
217
- return {
218
- kind,
219
- message: error instanceof Error ? error.message : String(error),
220
- code: error instanceof Error && "code" in error && typeof error.code === "string" ? error.code : null,
221
- };
222
- }
223
- function exitCode(outcome) {
224
- if (outcome.kind === "exited")
225
- return outcome.exitCode;
226
- if (outcome.kind === "stopped")
227
- return 0;
228
- return 1;
229
- }
230
- function diagnosticError(message, code) {
231
- return Object.assign(new Error(`${PRODUCT_TEXT.displayName}: ${message}`), { code });
232
- }
@@ -1,40 +0,0 @@
1
- import type { LaunchInstanceId, LaunchInstanceOutcome, LaunchInstanceShutdownPolicy, LaunchInstanceStopReason, ProcessContainmentIdentity } from "./launch-instance.js";
2
- import type { LaunchProfileId, NativeProcessIdentity, RequestId } from "./model.js";
3
- export type SupervisorCommand = {
4
- readonly type: "create-launch-instance";
5
- readonly requestId: RequestId;
6
- readonly instanceId: LaunchInstanceId;
7
- readonly profileId: LaunchProfileId;
8
- readonly shutdownPolicy: LaunchInstanceShutdownPolicy;
9
- readonly guardianIdentity: NativeProcessIdentity;
10
- } | {
11
- readonly type: "activate-launch-instance";
12
- readonly requestId: RequestId;
13
- readonly instanceId: LaunchInstanceId;
14
- readonly rootIdentity: NativeProcessIdentity;
15
- readonly containmentIdentity: ProcessContainmentIdentity;
16
- } | {
17
- readonly type: "begin-launch-instance-stop";
18
- readonly requestId: RequestId;
19
- readonly instanceId: LaunchInstanceId;
20
- readonly reason: LaunchInstanceStopReason;
21
- } | {
22
- readonly type: "complete-launch-instance";
23
- readonly requestId: RequestId;
24
- readonly instanceId: LaunchInstanceId;
25
- readonly terminalState: "completed" | "interrupted";
26
- readonly outcome: LaunchInstanceOutcome;
27
- } | {
28
- readonly type: "reconcile-launch-instance";
29
- readonly requestId: RequestId;
30
- readonly instanceId: LaunchInstanceId;
31
- } | {
32
- readonly type: "resynchronize";
33
- readonly requestId: RequestId;
34
- };
35
- export interface LaunchInstanceStopIntent {
36
- readonly type: "stop-launch-instance";
37
- readonly requestId: RequestId;
38
- readonly instanceId: LaunchInstanceId;
39
- readonly reason: LaunchInstanceStopReason;
40
- }
@@ -1 +0,0 @@
1
- export {};
@@ -1,46 +0,0 @@
1
- import type { LaunchProfileId, NativeProcessIdentity } from "./model.js";
2
- export type LaunchInstanceId = string;
3
- export type LaunchInstanceState = "requested" | "active" | "stopping" | "completed" | "interrupted";
4
- export type LaunchInstanceShutdownPolicy = "terminate-tree-on-close";
5
- export type LaunchInstanceStopReason = "owner-disconnect" | "supervisor-disconnect" | "user-request" | "update";
6
- export interface ProcessContainmentIdentity {
7
- readonly provider: string;
8
- readonly token: string;
9
- }
10
- export type LaunchInstanceOutcome = {
11
- readonly kind: "exited";
12
- readonly exitCode: number;
13
- } | {
14
- readonly kind: "signaled";
15
- readonly signal: string;
16
- } | {
17
- readonly kind: "stopped";
18
- readonly reason: LaunchInstanceStopReason;
19
- } | {
20
- readonly kind: "spawn-error" | "guardian-error" | "cleanup-error";
21
- readonly message: string;
22
- readonly code: string | null;
23
- } | {
24
- readonly kind: "interrupted";
25
- readonly reason: "owner-disconnect" | "supervisor-disconnect" | "guardian-exit" | "legacy-migration";
26
- readonly message: string;
27
- };
28
- export interface LaunchInstance {
29
- readonly id: LaunchInstanceId;
30
- readonly ownerClientId: string;
31
- readonly profileId: LaunchProfileId;
32
- readonly state: LaunchInstanceState;
33
- readonly shutdownPolicy: LaunchInstanceShutdownPolicy;
34
- readonly guardianIdentity: NativeProcessIdentity;
35
- readonly rootIdentity: NativeProcessIdentity | null;
36
- readonly containmentIdentity: ProcessContainmentIdentity | null;
37
- readonly createdAt: string;
38
- readonly activatedAt: string | null;
39
- readonly stoppingAt: string | null;
40
- readonly completedAt: string | null;
41
- readonly outcome: LaunchInstanceOutcome | null;
42
- }
43
- export declare function assertLaunchInstance(instance: LaunchInstance): void;
44
- export declare function assertLaunchInstanceTransition(previous: LaunchInstance, next: LaunchInstance): void;
45
- export declare function assertProcessContainmentIdentity(identity: ProcessContainmentIdentity): void;
46
- export declare function assertLaunchInstanceOutcome(outcome: LaunchInstanceOutcome): void;
@@ -1,134 +0,0 @@
1
- import { assertLaunchProfileId, assertNativeProcessIdentity } from "./model.js";
2
- const ALLOWED_TRANSITIONS = {
3
- requested: ["active", "completed", "interrupted"],
4
- active: ["stopping", "completed", "interrupted"],
5
- stopping: ["completed", "interrupted"],
6
- completed: [],
7
- interrupted: [],
8
- };
9
- export function assertLaunchInstance(instance) {
10
- assertIdentifier(instance.id, "launch instance identity");
11
- assertIdentifier(instance.ownerClientId, "launch instance owner identity");
12
- assertLaunchProfileId(instance.profileId);
13
- if (!(instance.state in ALLOWED_TRANSITIONS))
14
- throw new TypeError(`invalid launch instance state: ${String(instance.state)}`);
15
- if (instance.shutdownPolicy !== "terminate-tree-on-close")
16
- throw new TypeError("launch instance shutdown policy must terminate its process tree on close");
17
- assertNativeProcessIdentity(instance.guardianIdentity);
18
- if (instance.rootIdentity !== null)
19
- assertNativeProcessIdentity(instance.rootIdentity);
20
- if (instance.containmentIdentity !== null)
21
- assertProcessContainmentIdentity(instance.containmentIdentity);
22
- assertTimestamp(instance.createdAt, "launch instance creation time");
23
- assertOptionalTimestamp(instance.activatedAt, "launch instance activation time");
24
- assertOptionalTimestamp(instance.stoppingAt, "launch instance stopping time");
25
- assertOptionalTimestamp(instance.completedAt, "launch instance completion time");
26
- if (instance.outcome !== null)
27
- assertLaunchInstanceOutcome(instance.outcome);
28
- if (instance.state === "requested") {
29
- if (instance.rootIdentity !== null || instance.containmentIdentity !== null || instance.activatedAt !== null) {
30
- throw new TypeError("requested launch instance cannot have active runtime ownership");
31
- }
32
- if (instance.stoppingAt !== null || instance.completedAt !== null || instance.outcome !== null) {
33
- throw new TypeError("requested launch instance cannot have stopping or terminal state");
34
- }
35
- return;
36
- }
37
- if (instance.state === "active" || instance.state === "stopping") {
38
- if (instance.rootIdentity === null || instance.containmentIdentity === null || instance.activatedAt === null) {
39
- throw new TypeError(`${instance.state} launch instance requires root and containment ownership`);
40
- }
41
- if (instance.completedAt !== null || instance.outcome !== null)
42
- throw new TypeError(`${instance.state} launch instance cannot have a terminal outcome`);
43
- if (instance.state === "active" && instance.stoppingAt !== null)
44
- throw new TypeError("active launch instance cannot have a stopping time");
45
- if (instance.state === "stopping" && instance.stoppingAt === null)
46
- throw new TypeError("stopping launch instance requires a stopping time");
47
- return;
48
- }
49
- if (instance.completedAt === null || instance.outcome === null)
50
- throw new TypeError("terminal launch instance requires completion time and outcome");
51
- if (instance.state === "completed" && instance.outcome.kind === "interrupted")
52
- throw new TypeError("completed launch instance cannot carry an interrupted outcome");
53
- if (instance.state === "interrupted" && instance.outcome.kind !== "interrupted" && instance.outcome.kind !== "cleanup-error") {
54
- throw new TypeError("interrupted launch instance requires an interrupted or cleanup-error outcome");
55
- }
56
- }
57
- export function assertLaunchInstanceTransition(previous, next) {
58
- assertLaunchInstance(previous);
59
- assertLaunchInstance(next);
60
- if (previous.id !== next.id || previous.ownerClientId !== next.ownerClientId || previous.profileId !== next.profileId) {
61
- throw new TypeError("launch instance identity and ownership are immutable");
62
- }
63
- if (previous.shutdownPolicy !== next.shutdownPolicy
64
- || !sameProcessIdentity(previous.guardianIdentity, next.guardianIdentity)
65
- || previous.createdAt !== next.createdAt) {
66
- throw new TypeError("launch instance guardian, policy, and creation identity are immutable");
67
- }
68
- const allowedTransitions = ALLOWED_TRANSITIONS[previous.state];
69
- if (!allowedTransitions.includes(next.state)) {
70
- throw new TypeError(`invalid launch instance transition: ${previous.state} -> ${next.state}`);
71
- }
72
- if (previous.rootIdentity !== null && !sameProcessIdentity(previous.rootIdentity, next.rootIdentity)) {
73
- throw new TypeError("launch instance root identity is immutable after activation");
74
- }
75
- if (previous.containmentIdentity !== null && !sameContainmentIdentity(previous.containmentIdentity, next.containmentIdentity)) {
76
- throw new TypeError("launch instance containment identity is immutable after activation");
77
- }
78
- }
79
- export function assertProcessContainmentIdentity(identity) {
80
- assertIdentifier(identity.provider, "process containment provider");
81
- assertIdentifier(identity.token, "process containment token");
82
- }
83
- export function assertLaunchInstanceOutcome(outcome) {
84
- if (outcome.kind === "exited") {
85
- if (!Number.isSafeInteger(outcome.exitCode))
86
- throw new TypeError("launch instance exit code must be a safe integer");
87
- return;
88
- }
89
- if (outcome.kind === "signaled") {
90
- assertIdentifier(outcome.signal, "launch instance signal");
91
- return;
92
- }
93
- if (outcome.kind === "stopped") {
94
- if (!["owner-disconnect", "supervisor-disconnect", "user-request", "update"].includes(outcome.reason)) {
95
- throw new TypeError("invalid launch instance stop reason");
96
- }
97
- return;
98
- }
99
- if (outcome.kind === "interrupted") {
100
- if (!["owner-disconnect", "supervisor-disconnect", "guardian-exit", "legacy-migration"].includes(outcome.reason)) {
101
- throw new TypeError("invalid launch instance interruption reason");
102
- }
103
- assertDiagnostic(outcome.message, "launch instance interruption message");
104
- return;
105
- }
106
- if (outcome.kind !== "spawn-error" && outcome.kind !== "guardian-error" && outcome.kind !== "cleanup-error") {
107
- throw new TypeError(`invalid launch instance outcome: ${String(outcome.kind)}`);
108
- }
109
- assertDiagnostic(outcome.message, "launch instance failure message");
110
- if (outcome.code !== null)
111
- assertIdentifier(outcome.code, "launch instance failure code");
112
- }
113
- function sameProcessIdentity(left, right) {
114
- return right !== null && left.pid === right.pid && left.startIdentity === right.startIdentity;
115
- }
116
- function sameContainmentIdentity(left, right) {
117
- return right !== null && left.provider === right.provider && left.token === right.token;
118
- }
119
- function assertIdentifier(value, name) {
120
- if (!value || value.length > 512 || value.includes("\0"))
121
- throw new TypeError(`${name} must be non-empty, bounded, and contain no null byte`);
122
- }
123
- function assertDiagnostic(value, name) {
124
- if (!value || value.length > 4_096 || value.includes("\0"))
125
- throw new TypeError(`${name} must be non-empty, bounded, and contain no null byte`);
126
- }
127
- function assertTimestamp(value, name) {
128
- if (!value || !Number.isFinite(Date.parse(value)))
129
- throw new TypeError(`${name} must be a valid timestamp`);
130
- }
131
- function assertOptionalTimestamp(value, name) {
132
- if (value !== null)
133
- assertTimestamp(value, name);
134
- }
@@ -1,5 +0,0 @@
1
- export interface ClaimGateHandle {
2
- release(): void;
3
- }
4
- /** No PID-file fallback: only the platform descriptor can prove upgraded-writer exclusion. */
5
- export declare function tryAcquireClaimGate(path: string): ClaimGateHandle | null;