@timurproko/a1 0.1.8-dev.3b54f21 → 0.1.8-dev.402

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 (642) hide show
  1. package/README.md +159 -65
  2. package/bin/cli.js +28 -10
  3. package/bin/guardian.js +12 -6
  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 +62 -21
  11. package/bin/update-recovery.js +274 -0
  12. package/bin/warmup.js +27 -0
  13. package/dist/cli/capabilities.d.ts +6 -0
  14. package/dist/{src/cli → cli}/capabilities.js +1 -1
  15. package/dist/{src/cli → cli}/dispatch.d.ts +15 -1
  16. package/dist/cli/dispatch.js +261 -0
  17. package/dist/cli/package-messages.d.ts +26 -0
  18. package/dist/cli/package-messages.js +71 -0
  19. package/dist/{src/cli → cli}/packages.d.ts +11 -2
  20. package/dist/{src/cli → cli}/packages.js +24 -27
  21. package/dist/{src/cli → cli}/version-stats.d.ts +6 -0
  22. package/dist/cli/version-stats.js +112 -0
  23. package/dist/composition/agent-engine-bridge.d.ts +3 -0
  24. package/dist/composition/agent-engine-bridge.js +108 -0
  25. package/dist/composition/index.d.ts +3 -0
  26. package/dist/composition/index.js +3 -0
  27. package/dist/composition/owned-ui.d.ts +35 -0
  28. package/dist/composition/owned-ui.js +118 -0
  29. package/dist/composition/process.d.ts +16 -0
  30. package/dist/composition/process.js +45 -0
  31. package/dist/composition/settings-route-host.d.ts +8 -0
  32. package/dist/composition/settings-route-host.js +75 -0
  33. package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/capability-ports.d.ts +2 -2
  34. package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/domain-validation.js +22 -4
  35. package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/domain.d.ts +17 -0
  36. package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/package-ports.d.ts +6 -0
  37. package/dist/contracts/owned-ui/image-attachments.d.ts +36 -0
  38. package/dist/contracts/owned-ui/image-attachments.js +67 -0
  39. package/dist/contracts/owned-ui/index.d.ts +8 -0
  40. package/dist/contracts/owned-ui/index.js +8 -0
  41. package/dist/{src/foundation/owned-ui-contracts → contracts/owned-ui}/model.d.ts +123 -0
  42. package/dist/contracts/owned-ui/prompt-history.d.ts +55 -0
  43. package/dist/contracts/owned-ui/prompt-history.js +23 -0
  44. package/dist/contracts/owned-ui/prompt-suggestions.d.ts +3 -0
  45. package/dist/contracts/owned-ui/prompt-suggestions.js +44 -0
  46. package/dist/contracts/owned-ui/suggestion-diagnostics.d.ts +22 -0
  47. package/dist/contracts/owned-ui/suggestion-diagnostics.js +9 -0
  48. package/dist/contracts/owned-ui/transcript-lifecycle.d.ts +5 -0
  49. package/dist/contracts/owned-ui/transcript-lifecycle.js +33 -0
  50. package/dist/{src/foundation/owned-ui-contracts → contracts/owned-ui}/validation.d.ts +5 -1
  51. package/dist/{src/foundation/owned-ui-contracts → contracts/owned-ui}/validation.js +129 -4
  52. package/dist/{src/foundation/presentation-contracts → contracts/presentation}/index.d.ts +8 -0
  53. package/dist/{src/features → features}/launch/development-launch.js +11 -3
  54. package/dist/{src/features → features}/launch/index.d.ts +0 -1
  55. package/dist/{src/features → features}/launch/index.js +0 -1
  56. package/dist/features/launch/intent.d.ts +10 -0
  57. package/dist/features/launch/intent.js +8 -0
  58. package/dist/{src/features → features}/launch/prepare-launch.d.ts +0 -2
  59. package/dist/{src/features → features}/launch/prepare-launch.js +2 -9
  60. package/dist/{src/features → features}/launch/profile-paths.d.ts +3 -2
  61. package/dist/{src/features → features}/launch/profile-paths.js +13 -8
  62. package/dist/{src/features → features}/launch/runtime-selection.d.ts +2 -5
  63. package/dist/{src/features → features}/owned-ui/customization.d.ts +3 -1
  64. package/dist/{src/features → features}/owned-ui/customization.js +3 -1
  65. package/dist/{src/features → features}/owned-ui/diagnostics.d.ts +2 -1
  66. package/dist/{src/features → features}/owned-ui/diagnostics.js +1 -0
  67. package/dist/{src/features → features}/owned-ui/index.d.ts +2 -0
  68. package/dist/{src/features → features}/owned-ui/index.js +2 -0
  69. package/dist/features/owned-ui/project-trust-prompt.d.ts +25 -0
  70. package/dist/features/owned-ui/project-trust-prompt.js +149 -0
  71. package/dist/{src/features → features}/owned-ui/run.d.ts +2 -2
  72. package/dist/features/owned-ui/run.js +32 -0
  73. package/dist/features/owned-ui/session-fork-prompt.d.ts +8 -0
  74. package/dist/features/owned-ui/session-fork-prompt.js +34 -0
  75. package/dist/{src/features → features}/owned-ui/settings-app.d.ts +3 -3
  76. package/dist/{src/features → features}/owned-ui/settings-app.js +105 -56
  77. package/dist/features/prompt-history/image-sidecar.d.ts +32 -0
  78. package/dist/features/prompt-history/image-sidecar.js +130 -0
  79. package/dist/features/prompt-history/index.d.ts +4 -0
  80. package/dist/features/prompt-history/index.js +3 -0
  81. package/dist/features/prompt-history/paths.d.ts +5 -0
  82. package/dist/features/prompt-history/paths.js +17 -0
  83. package/dist/features/prompt-history/service.d.ts +54 -0
  84. package/dist/features/prompt-history/service.js +425 -0
  85. package/dist/features/prompt-history/store.d.ts +16 -0
  86. package/dist/features/prompt-history/store.js +223 -0
  87. package/dist/features/prompt-history/worker.d.ts +9 -0
  88. package/dist/features/prompt-history/worker.js +45 -0
  89. package/dist/features/prompt-suggestions/diagnostics.d.ts +18 -0
  90. package/dist/features/prompt-suggestions/diagnostics.js +82 -0
  91. package/dist/features/prompt-suggestions/index.d.ts +1 -0
  92. package/dist/features/prompt-suggestions/index.js +1 -0
  93. package/dist/{src/features → features}/workspace/capabilities.d.ts +1 -1
  94. package/dist/{src/features → features}/workspace/reducer.d.ts +2 -1
  95. package/dist/{src/features → features}/workspace/reducer.js +2 -1
  96. package/dist/{src/features → features}/workspace/router.d.ts +2 -1
  97. package/dist/{src/features → features}/workspace/router.js +1 -0
  98. package/dist/{src/features → features}/workspace/store.d.ts +2 -1
  99. package/dist/{src/features → features}/workspace/store.js +1 -0
  100. package/dist/foundation/launch-context/index.d.ts +59 -0
  101. package/dist/foundation/launch-context/index.js +136 -0
  102. package/dist/{src/foundation → foundation}/launch-guardian/main.d.ts +2 -0
  103. package/dist/{src/foundation → foundation}/launch-guardian/main.js +23 -8
  104. package/dist/{src/foundation → foundation}/lifecycle/index.d.ts +2 -0
  105. package/dist/{src/foundation → foundation}/lifecycle/index.js +2 -0
  106. package/dist/{src/foundation → foundation}/lifecycle/model.d.ts +1 -1
  107. package/dist/{src/foundation → foundation}/lifecycle/model.js +1 -1
  108. package/dist/foundation/lifecycle/paths.d.ts +30 -0
  109. package/dist/{src/foundation → foundation}/lifecycle/paths.js +29 -1
  110. package/dist/foundation/lifecycle/session-selection.d.ts +9 -0
  111. package/dist/foundation/lifecycle/session-selection.js +39 -0
  112. package/dist/foundation/lifecycle/supervisor-startup.d.ts +30 -0
  113. package/dist/foundation/lifecycle/supervisor-startup.js +106 -0
  114. package/dist/{src/foundation → foundation}/native-host-protocol/codec.d.ts +2 -0
  115. package/dist/{src/foundation → foundation}/native-host-protocol/codec.js +2 -0
  116. package/dist/{src/foundation → foundation}/native-host-protocol/messages.d.ts +1 -1
  117. package/dist/{src/foundation → foundation}/native-host-protocol/messages.js +1 -1
  118. package/dist/foundation/process-containment/darwin-process-inspector.d.ts +5 -0
  119. package/dist/foundation/process-containment/darwin-process-inspector.js +7 -0
  120. package/dist/{src/foundation → foundation}/process-containment/index.d.ts +1 -0
  121. package/dist/{src/foundation → foundation}/process-containment/index.js +1 -0
  122. package/dist/{src/foundation → foundation}/process-containment/linux-process-inspector.d.ts +1 -0
  123. package/dist/{src/foundation → foundation}/process-containment/linux-process-inspector.js +1 -0
  124. package/dist/{src/foundation → foundation}/process-containment/native-guardian-containment.d.ts +1 -0
  125. package/dist/{src/foundation → foundation}/process-containment/native-guardian-containment.js +1 -0
  126. package/dist/{src/foundation → foundation}/process-containment/windows-process-inspector.d.ts +3 -1
  127. package/dist/{src/foundation → foundation}/process-containment/windows-process-inspector.js +5 -2
  128. package/dist/{src/foundation → foundation}/protocol/client.d.ts +1 -0
  129. package/dist/{src/foundation → foundation}/protocol/client.js +1 -0
  130. package/dist/{src/foundation → foundation}/protocol/messages.d.ts +1 -0
  131. package/dist/{src/foundation → foundation}/protocol/messages.js +1 -0
  132. package/dist/foundation/release/bootstrap.d.ts +55 -0
  133. package/dist/{src/foundation → foundation}/release/bootstrap.js +219 -46
  134. package/dist/foundation/release/cohort-state.d.ts +157 -0
  135. package/dist/foundation/release/cohort-state.js +472 -0
  136. package/dist/foundation/release/dependency-certification-retention.d.ts +7 -0
  137. package/dist/foundation/release/dependency-certification-retention.js +88 -0
  138. package/dist/foundation/release/dependency-certification.d.ts +24 -0
  139. package/dist/foundation/release/dependency-certification.js +266 -0
  140. package/dist/foundation/release/dependency-layer.d.ts +81 -0
  141. package/dist/foundation/release/dependency-layer.js +466 -0
  142. package/dist/foundation/release/endpoints.d.ts +20 -0
  143. package/dist/foundation/release/endpoints.js +50 -0
  144. package/dist/foundation/release/immutable-platform.d.ts +6 -0
  145. package/dist/foundation/release/immutable-platform.js +13 -0
  146. package/dist/{src/foundation → foundation}/release/index.d.ts +6 -0
  147. package/dist/{src/foundation → foundation}/release/index.js +6 -0
  148. package/dist/foundation/release/release-gc.d.ts +71 -0
  149. package/dist/foundation/release/release-gc.js +764 -0
  150. package/dist/{src/foundation → foundation}/release/release-store.d.ts +9 -3
  151. package/dist/{src/foundation → foundation}/release/release-store.js +74 -14
  152. package/dist/{src/foundation → foundation}/release/release.d.ts +6 -1
  153. package/dist/{src/foundation → foundation}/release/release.js +15 -4
  154. package/dist/foundation/release/restart-certification.d.ts +68 -0
  155. package/dist/foundation/release/restart-certification.js +227 -0
  156. package/dist/foundation/release/update-launch.d.ts +6 -0
  157. package/dist/foundation/release/update-launch.js +17 -0
  158. package/dist/foundation/release/update-recovery.d.ts +76 -0
  159. package/dist/foundation/release/update-recovery.js +356 -0
  160. package/dist/{src/foundation → foundation}/release/update-transaction.d.ts +11 -0
  161. package/dist/{src/foundation → foundation}/release/update-transaction.js +13 -1
  162. package/dist/{src/foundation → foundation}/release/update.d.ts +40 -4
  163. package/dist/{src/foundation → foundation}/release/update.js +196 -78
  164. package/dist/foundation/release/warmup.d.ts +3 -0
  165. package/dist/foundation/release/warmup.js +47 -0
  166. package/dist/foundation/startup/index.d.ts +1 -0
  167. package/dist/foundation/startup/index.js +1 -0
  168. package/dist/foundation/startup/startup-runtime.d.ts +36 -0
  169. package/dist/foundation/startup/startup-runtime.js +142 -0
  170. package/dist/{src/foundation → foundation}/storage/control-store.d.ts +2 -1
  171. package/dist/{src/foundation → foundation}/storage/control-store.js +39 -4
  172. package/dist/{src/foundation → foundation}/structured-agent-runtime/backpressure.d.ts +2 -1
  173. package/dist/{src/foundation → foundation}/structured-agent-runtime/backpressure.js +2 -1
  174. package/dist/{src/foundation → foundation}/structured-agent-runtime/commands.d.ts +2 -1
  175. package/dist/{src/foundation → foundation}/structured-agent-runtime/commands.js +2 -1
  176. package/dist/{src/foundation → foundation}/structured-agent-runtime/handshake.d.ts +1 -1
  177. package/dist/{src/foundation → foundation}/structured-agent-runtime/handshake.js +1 -1
  178. package/dist/{src/foundation → foundation}/structured-agent-runtime/reconnection.d.ts +2 -1
  179. package/dist/{src/foundation → foundation}/structured-agent-runtime/reconnection.js +2 -1
  180. package/dist/{src/foundation → foundation}/structured-agent-runtime/state.d.ts +2 -1
  181. package/dist/{src/foundation → foundation}/structured-agent-runtime/state.js +2 -1
  182. package/dist/foundation/supervision/index.d.ts +3 -0
  183. package/dist/foundation/supervision/index.js +3 -0
  184. package/dist/foundation/supervision/main.d.ts +1 -0
  185. package/dist/foundation/supervision/main.js +84 -0
  186. package/dist/foundation/supervision/paths.d.ts +1 -0
  187. package/dist/foundation/supervision/paths.js +1 -0
  188. package/dist/foundation/supervision/server.d.ts +51 -0
  189. package/dist/{src/foundation → foundation}/supervision/server.js +142 -20
  190. package/dist/foundation/terminal-cleanup/fatal-exit.d.ts +12 -0
  191. package/dist/foundation/terminal-cleanup/fatal-exit.js +85 -0
  192. package/dist/foundation/terminal-cleanup/index.d.ts +2 -0
  193. package/dist/foundation/terminal-cleanup/index.js +2 -0
  194. package/dist/foundation/terminal-cleanup/terminal-reset.d.ts +4 -0
  195. package/dist/foundation/terminal-cleanup/terminal-reset.js +40 -0
  196. package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/components.d.ts +1 -1
  197. package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/conformance.d.ts +1 -0
  198. package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/conformance.js +3 -2
  199. package/dist/integrations/pi/components/editor-interaction.d.ts +38 -0
  200. package/dist/integrations/pi/components/history-editor-loader.d.ts +5 -0
  201. package/dist/integrations/pi/components/history-editor-loader.js +5 -0
  202. package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/index.d.ts +2 -1
  203. package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/index.js +2 -1
  204. package/dist/integrations/pi/components/owned-editor-ux.d.ts +74 -0
  205. package/dist/integrations/pi/components/owned-editor-ux.js +1093 -0
  206. package/dist/integrations/pi/components/path-word-ranges.d.ts +2 -0
  207. package/dist/integrations/pi/components/path-word-ranges.js +37 -0
  208. package/dist/integrations/pi/components/prompt-input-port.d.ts +18 -0
  209. package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/shell-components.d.ts +1 -0
  210. package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/shell-components.js +1 -0
  211. package/dist/integrations/pi/components/shell-editor-autocomplete.js +297 -0
  212. package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/shell-extension-ui.d.ts +1 -1
  213. package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/shell-footer-status.d.ts +4 -4
  214. package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/shell-footer-status.js +58 -23
  215. package/dist/integrations/pi/components/shell-presenters-info.d.ts +43 -0
  216. package/dist/integrations/pi/components/shell-presenters-info.js +114 -0
  217. package/dist/integrations/pi/components/shell-presenters-transcript.d.ts +29 -0
  218. package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/shell-presenters-transcript.js +174 -170
  219. package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/shell-selectors-dialogs.d.ts +8 -4
  220. package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/shell-selectors-dialogs.js +10 -6
  221. package/dist/integrations/pi/components/shell-shared-facade.d.ts +213 -0
  222. package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/shell-shared-facade.js +5 -2
  223. package/dist/integrations/pi/components/submitted-prompt-adapter.d.ts +15 -0
  224. package/dist/integrations/pi/components/submitted-prompt-adapter.js +43 -0
  225. package/dist/integrations/pi/components/tool-image-presentation.d.ts +21 -0
  226. package/dist/integrations/pi/components/tool-image-presentation.js +86 -0
  227. package/dist/integrations/pi/components/tool-result-adapter.d.ts +6 -0
  228. package/dist/integrations/pi/components/tool-result-adapter.js +27 -0
  229. package/dist/integrations/pi/components/transcript-image-resolver.d.ts +7 -0
  230. package/dist/integrations/pi/components/transcript-image-resolver.js +19 -0
  231. package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/adjacent/core/keybindings.d.ts +11 -2
  232. package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/adjacent/core/keybindings.js +41 -3
  233. package/dist/integrations/pi/components/upstream/assets/earendil-image.json +12 -0
  234. package/dist/integrations/pi/components/upstream/components/earendil-announcement.js +42 -0
  235. package/dist/integrations/pi/components/upstream/components/owned-editor.d.ts +40 -0
  236. package/dist/integrations/pi/components/upstream/components/owned-editor.js +166 -0
  237. package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/scoped-models-selector.d.ts +1 -1
  238. package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/scoped-models-selector.js +3 -1
  239. package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/session-footer.d.ts +3 -2
  240. package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/session-footer.js +12 -7
  241. package/dist/integrations/pi/components/upstream/components/tool-execution.d.ts +61 -0
  242. package/dist/integrations/pi/components/upstream/components/tool-execution.js +344 -0
  243. package/dist/integrations/pi/components/upstream/history/editor-core.d.ts +280 -0
  244. package/dist/integrations/pi/components/upstream/history/editor-core.js +2062 -0
  245. package/dist/integrations/pi/components/upstream/history/kill-ring.d.ts +32 -0
  246. package/dist/integrations/pi/components/upstream/history/kill-ring.js +48 -0
  247. package/dist/integrations/pi/components/upstream/history/printable-key.d.ts +1 -0
  248. package/dist/integrations/pi/components/upstream/history/printable-key.js +40 -0
  249. package/dist/integrations/pi/components/upstream/history/text-helpers.d.ts +14 -0
  250. package/dist/integrations/pi/components/upstream/history/text-helpers.js +28 -0
  251. package/dist/integrations/pi/components/upstream/history/undo-stack.d.ts +22 -0
  252. package/dist/integrations/pi/components/upstream/history/undo-stack.js +36 -0
  253. package/dist/integrations/pi/components/upstream/history/word-navigation.d.ts +24 -0
  254. package/dist/integrations/pi/components/upstream/history/word-navigation.js +100 -0
  255. package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/adapter.d.ts +74 -6
  256. package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/adapter.js +1340 -228
  257. package/dist/integrations/pi/engine/changelog.d.ts +2 -0
  258. package/dist/integrations/pi/engine/changelog.js +63 -0
  259. package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/conformance.d.ts +4 -2
  260. package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/conformance.js +15 -5
  261. package/dist/integrations/pi/engine/http-dispatcher.d.ts +4 -0
  262. package/dist/integrations/pi/engine/http-dispatcher.js +25 -0
  263. package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/index.d.ts +4 -0
  264. package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/index.js +4 -0
  265. package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/model-auth-integration.d.ts +2 -1
  266. package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/model-auth-integration.js +1 -0
  267. package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/package-integration.d.ts +1 -1
  268. package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/package-integration.js +32 -26
  269. package/dist/integrations/pi/engine/pending-delivery.d.ts +30 -0
  270. package/dist/integrations/pi/engine/pending-delivery.js +158 -0
  271. package/dist/integrations/pi/engine/project-trust-preflight.d.ts +22 -0
  272. package/dist/integrations/pi/engine/project-trust-preflight.js +50 -0
  273. package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/resource-extension-integration.d.ts +2 -1
  274. package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/resource-extension-integration.js +1 -0
  275. package/dist/integrations/pi/engine/resources/changelog.json +12 -0
  276. package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/runtime-integration.d.ts +19 -1
  277. package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/runtime-integration.js +56 -5
  278. package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/session-integration.d.ts +4 -2
  279. package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/session-integration.js +19 -4
  280. package/dist/integrations/pi/engine/session-selection.d.ts +28 -0
  281. package/dist/integrations/pi/engine/session-selection.js +90 -0
  282. package/dist/integrations/pi/engine/settings-effects.d.ts +66 -0
  283. package/dist/integrations/pi/engine/settings-effects.js +249 -0
  284. package/dist/integrations/pi/engine/settings-integration.d.ts +43 -0
  285. package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/settings-integration.js +102 -108
  286. package/dist/integrations/pi/engine/tool-rendering.d.ts +13 -0
  287. package/dist/integrations/pi/engine/tool-rendering.js +145 -0
  288. package/dist/integrations/pi/engine/transcript-image-assets.d.ts +11 -0
  289. package/dist/integrations/pi/engine/transcript-image-assets.js +86 -0
  290. package/dist/integrations/pi/engine/windows-filesystem-hygiene.d.ts +21 -0
  291. package/dist/integrations/pi/engine/windows-filesystem-hygiene.js +55 -0
  292. package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/workflow-controllers.d.ts +3 -2
  293. package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/workflow-controllers.js +1 -0
  294. package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/workflows.d.ts +19 -2
  295. package/dist/integrations/pi/session-ui/clipboard-diagnostics.d.ts +16 -0
  296. package/dist/integrations/pi/session-ui/clipboard-diagnostics.js +65 -0
  297. package/dist/integrations/pi/session-ui/clipboard-image.d.ts +11 -0
  298. package/dist/integrations/pi/session-ui/clipboard-image.js +38 -0
  299. package/dist/integrations/pi/session-ui/editor-hyperlink-budget.d.ts +9 -0
  300. package/dist/integrations/pi/session-ui/editor-hyperlink-budget.js +23 -0
  301. package/dist/integrations/pi/session-ui/image-preparation-client.d.ts +20 -0
  302. package/dist/integrations/pi/session-ui/image-preparation-client.js +145 -0
  303. package/dist/integrations/pi/session-ui/image-preparation.d.ts +18 -0
  304. package/dist/integrations/pi/session-ui/image-preparation.js +126 -0
  305. package/dist/integrations/pi/session-ui/image-source.d.ts +13 -0
  306. package/dist/integrations/pi/session-ui/image-source.js +171 -0
  307. package/dist/integrations/pi/session-ui/image-worker.d.ts +17 -0
  308. package/dist/integrations/pi/session-ui/image-worker.js +23 -0
  309. package/dist/integrations/pi/session-ui/index.d.ts +5 -0
  310. package/dist/integrations/pi/session-ui/index.js +5 -0
  311. package/dist/integrations/pi/session-ui/paste-executor.d.ts +10 -0
  312. package/dist/integrations/pi/session-ui/paste-executor.js +232 -0
  313. package/dist/integrations/pi/session-ui/paste-helper.d.ts +1 -0
  314. package/dist/integrations/pi/session-ui/paste-helper.js +173 -0
  315. package/dist/integrations/pi/session-ui/paste-preparation-client.d.ts +16 -0
  316. package/dist/integrations/pi/session-ui/paste-preparation-client.js +159 -0
  317. package/dist/integrations/pi/session-ui/paste-protocol.d.ts +78 -0
  318. package/dist/integrations/pi/session-ui/paste-protocol.js +18 -0
  319. package/dist/integrations/pi/session-ui/paste-text-preparation.d.ts +20 -0
  320. package/dist/integrations/pi/session-ui/paste-text-preparation.js +134 -0
  321. package/dist/integrations/pi/session-ui/paste-text-worker.d.ts +1 -0
  322. package/dist/integrations/pi/session-ui/paste-text-worker.js +12 -0
  323. package/dist/integrations/pi/session-ui/path-chip-presentation.d.ts +7 -0
  324. package/dist/integrations/pi/session-ui/path-chip-presentation.js +24 -0
  325. package/dist/integrations/pi/session-ui/prompt-chips.d.ts +72 -0
  326. package/dist/integrations/pi/session-ui/prompt-chips.js +503 -0
  327. package/dist/integrations/pi/session-ui/prompt-history-controller.d.ts +36 -0
  328. package/dist/integrations/pi/session-ui/prompt-history-controller.js +170 -0
  329. package/dist/integrations/pi/session-ui/prompt-suggestion-controller.d.ts +35 -0
  330. package/dist/integrations/pi/session-ui/prompt-suggestion-controller.js +207 -0
  331. package/dist/integrations/pi/session-ui/response-copy-coordinator.d.ts +27 -0
  332. package/dist/integrations/pi/session-ui/response-copy-coordinator.js +189 -0
  333. package/dist/integrations/pi/session-ui/response-copy-helper.d.ts +1 -0
  334. package/dist/integrations/pi/session-ui/response-copy-helper.js +122 -0
  335. package/dist/integrations/pi/session-ui/response-copy-protocol.d.ts +56 -0
  336. package/dist/integrations/pi/session-ui/response-copy-protocol.js +5 -0
  337. package/dist/integrations/pi/session-ui/response-copy-transport.d.ts +31 -0
  338. package/dist/integrations/pi/session-ui/response-copy-transport.js +187 -0
  339. package/dist/integrations/pi/session-ui/route-host.d.ts +5 -0
  340. package/dist/integrations/pi/session-ui/route-host.js +1 -0
  341. package/dist/integrations/pi/session-ui/session-shell-root.d.ts +221 -0
  342. package/dist/integrations/pi/session-ui/session-shell-root.js +1305 -0
  343. package/dist/integrations/pi/session-ui/session-shell.d.ts +55 -0
  344. package/dist/integrations/pi/session-ui/session-shell.js +1792 -0
  345. package/dist/integrations/pi/session-ui/session-viewport-controller.d.ts +56 -0
  346. package/dist/integrations/pi/session-ui/session-viewport-controller.js +569 -0
  347. package/dist/integrations/pi/session-ui/stream-presentation-coalescer.d.ts +29 -0
  348. package/dist/integrations/pi/session-ui/stream-presentation-coalescer.js +79 -0
  349. package/dist/integrations/pi/session-ui/system-clipboard.d.ts +20 -0
  350. package/dist/integrations/pi/session-ui/system-clipboard.js +156 -0
  351. package/dist/integrations/pi/session-ui/text-paste.d.ts +5 -0
  352. package/dist/integrations/pi/session-ui/text-paste.js +16 -0
  353. package/dist/{src/foundation/pi-tui-runtime-adapter → integrations/pi/tui-runtime}/adapter.d.ts +10 -1
  354. package/dist/{src/foundation/pi-tui-runtime-adapter → integrations/pi/tui-runtime}/adapter.js +255 -11
  355. package/dist/{src/foundation/pi-tui-runtime-adapter → integrations/pi/tui-runtime}/contracts.d.ts +32 -6
  356. package/dist/integrations/pi/tui-runtime/contracts.js +1 -0
  357. package/dist/integrations/pi/tui-runtime/damage-aware-terminal.d.ts +81 -0
  358. package/dist/integrations/pi/tui-runtime/damage-aware-terminal.js +424 -0
  359. package/dist/integrations/pi/tui-runtime/index.d.ts +7 -0
  360. package/dist/integrations/pi/tui-runtime/index.js +7 -0
  361. package/dist/integrations/pi/tui-runtime/input-presentation-coordinator.d.ts +39 -0
  362. package/dist/integrations/pi/tui-runtime/input-presentation-coordinator.js +139 -0
  363. package/dist/integrations/pi/tui-runtime/mouse-report-input.d.ts +13 -0
  364. package/dist/integrations/pi/tui-runtime/mouse-report-input.js +59 -0
  365. package/dist/integrations/pi/tui-runtime/overlay-geometry.d.ts +32 -0
  366. package/dist/integrations/pi/tui-runtime/overlay-geometry.js +159 -0
  367. package/dist/{src/foundation/pi-tui-runtime-adapter → integrations/pi/tui-runtime}/presentation-adapter.d.ts +1 -1
  368. package/dist/native/darwin-arm64/manifest.json +4 -4
  369. package/dist/native/darwin-arm64/process-guardian +0 -0
  370. package/dist/native/linux-x64/manifest.json +3 -3
  371. package/dist/native/linux-x64/process-guardian +0 -0
  372. package/dist/native/win32-x64/manifest.json +3 -3
  373. package/dist/native/win32-x64/process-guardian.exe +0 -0
  374. package/dist/{src/product-identity.d.ts → product-identity.d.ts} +4 -4
  375. package/dist/{src/product-identity.js → product-identity.js} +7 -38
  376. package/dist/{src/product-identity.json → product-identity.json} +13 -27
  377. package/dist/runtime-payload-inventory.json +122333 -0
  378. package/dist/{src/foundation/ui-apps → ui/apps}/contracts.d.ts +23 -1
  379. package/dist/{src/foundation/ui-apps → ui/apps}/host.d.ts +1 -1
  380. package/dist/{src/foundation/ui-apps → ui/apps}/host.js +14 -10
  381. package/dist/{src/foundation/ui-apps → ui/apps}/registry.d.ts +1 -0
  382. package/dist/{src/foundation/ui-apps → ui/apps}/registry.js +1 -0
  383. package/dist/{src/foundation/ui-components → ui/components}/dialog-panel.js +5 -3
  384. package/dist/{src/foundation/ui-components → ui/components}/frame.d.ts +1 -0
  385. package/dist/{src/foundation/ui-components → ui/components}/frame.js +1 -0
  386. package/dist/{src/foundation/ui-components → ui/components}/index.d.ts +7 -0
  387. package/dist/{src/foundation/ui-components → ui/components}/index.js +7 -0
  388. package/dist/{src/foundation/ui-components → ui/components}/line-input.d.ts +2 -8
  389. package/dist/{src/foundation/ui-components → ui/components}/line-input.js +7 -28
  390. package/dist/{src/foundation/ui-components → ui/components}/list-view.d.ts +0 -6
  391. package/dist/{src/foundation/ui-components → ui/components}/list-view.js +14 -7
  392. package/dist/{src/foundation/ui-components → ui/components}/mouse.d.ts +10 -0
  393. package/dist/{src/foundation/ui-components → ui/components}/mouse.js +24 -0
  394. package/dist/ui/components/progress-status.d.ts +2 -0
  395. package/dist/ui/components/progress-status.js +4 -0
  396. package/dist/ui/components/prompt-input.d.ts +32 -0
  397. package/dist/ui/components/prompt-input.js +54 -0
  398. package/dist/ui/components/prompt-row.d.ts +14 -0
  399. package/dist/ui/components/prompt-row.js +20 -0
  400. package/dist/{src/foundation/ui-components → ui/components}/scrollbar.d.ts +26 -0
  401. package/dist/{src/foundation/ui-components → ui/components}/scrollbar.js +35 -0
  402. package/dist/ui/components/selection-copy.d.ts +24 -0
  403. package/dist/ui/components/selection-copy.js +39 -0
  404. package/dist/{src/foundation/ui-components → ui/components}/shortcuts.d.ts +1 -0
  405. package/dist/{src/foundation/ui-components → ui/components}/shortcuts.js +1 -0
  406. package/dist/ui/components/spans.d.ts +28 -0
  407. package/dist/ui/components/spans.js +266 -0
  408. package/dist/ui/components/submitted-prompt.d.ts +23 -0
  409. package/dist/ui/components/submitted-prompt.js +50 -0
  410. package/dist/{src/foundation/ui-components → ui/components}/surface.d.ts +0 -5
  411. package/dist/{src/foundation/ui-components → ui/components}/surface.js +1 -5
  412. package/dist/ui/components/text-selection.d.ts +62 -0
  413. package/dist/ui/components/text-selection.js +210 -0
  414. package/dist/{src/foundation/ui-components → ui/components}/text.d.ts +14 -0
  415. package/dist/{src/foundation/ui-components → ui/components}/text.js +67 -5
  416. package/dist/ui/components/transcript-viewport.d.ts +173 -0
  417. package/dist/ui/components/transcript-viewport.js +753 -0
  418. package/dist/ui/components/visible-hyperlinks.d.ts +26 -0
  419. package/dist/ui/components/visible-hyperlinks.js +97 -0
  420. package/dist/{src/foundation/owned-ui-settings → ui/settings}/declarations.d.ts +8 -1
  421. package/dist/ui/settings/declarations.js +94 -0
  422. package/dist/{src/foundation/owned-ui-settings → ui/settings}/migrations.d.ts +1 -1
  423. package/dist/{src/foundation/owned-ui-settings → ui/settings}/migrations.js +28 -2
  424. package/dist/{src/foundation/owned-ui-settings → ui/settings}/sections.d.ts +6 -19
  425. package/dist/{src/foundation/owned-ui-settings → ui/settings}/sections.js +41 -22
  426. package/dist/{src/foundation/owned-ui-settings → ui/settings}/session.d.ts +9 -17
  427. package/dist/ui/settings/session.js +164 -0
  428. package/dist/{src/foundation/owned-ui-settings → ui/settings}/store.d.ts +1 -0
  429. package/dist/{src/foundation/owned-ui-settings → ui/settings}/store.js +2 -1
  430. package/docs/architecture/boundaries.md +14 -10
  431. package/docs/architecture/code-documentation.md +77 -0
  432. package/docs/architecture/history-editor-provenance.md +100 -0
  433. package/docs/architecture/internal-naming.md +91 -0
  434. package/docs/architecture/process-guardian-provenance.md +3 -1
  435. package/docs/architecture/project-structure.md +69 -30
  436. package/docs/architecture/prompt-suggestions.md +68 -0
  437. package/docs/architecture/resource-and-data-policy.md +28 -2
  438. package/docs/architecture/response-copy-delivery.md +83 -0
  439. package/docs/architecture/tool-image-presentation.md +62 -0
  440. package/docs/architecture/toolchain.md +24 -10
  441. package/docs/architecture/ui-reference-provenance.md +59 -5
  442. package/docs/ci-release-runbook.md +236 -79
  443. package/docs/features/launch-profiles.md +24 -17
  444. package/docs/features/modal-content-interaction.md +37 -0
  445. package/docs/features/prompt-history.md +149 -0
  446. package/docs/manual-code-streaming-cleanup.md +88 -0
  447. package/docs/manual-ghost-link-baseline.md +89 -0
  448. package/docs/manual-launch-instance-acceptance.md +12 -35
  449. package/docs/manual-owned-ui-checkpoint.md +78 -0
  450. package/docs/manual-pi-boundary-candidate.md +4 -5
  451. package/docs/manual-terminal-colour-check.md +4 -3
  452. package/docs/openspec-archive-automation.md +124 -0
  453. package/docs/repository-governance-live-acceptance.md +77 -0
  454. package/package.json +45 -28
  455. package/dist/src/cli/capabilities.d.ts +0 -15
  456. package/dist/src/cli/dispatch.js +0 -142
  457. package/dist/src/cli/version-stats.js +0 -72
  458. package/dist/src/composition/index.d.ts +0 -48
  459. package/dist/src/composition/index.js +0 -258
  460. package/dist/src/features/launch/intent.d.ts +0 -7
  461. package/dist/src/features/launch/intent.js +0 -4
  462. package/dist/src/features/launch/profiles.d.ts +0 -12
  463. package/dist/src/features/launch/profiles.js +0 -26
  464. package/dist/src/features/owned-ui/run.js +0 -15
  465. package/dist/src/foundation/lifecycle/paths.d.ts +0 -10
  466. package/dist/src/foundation/owned-ui-contracts/index.d.ts +0 -3
  467. package/dist/src/foundation/owned-ui-contracts/index.js +0 -3
  468. package/dist/src/foundation/owned-ui-settings/declarations.js +0 -39
  469. package/dist/src/foundation/owned-ui-settings/session.js +0 -145
  470. package/dist/src/foundation/pi-component-adapter/shell-editor-autocomplete.js +0 -162
  471. package/dist/src/foundation/pi-component-adapter/shell-presenters-transcript.d.ts +0 -57
  472. package/dist/src/foundation/pi-component-adapter/shell-shared-facade.d.ts +0 -116
  473. package/dist/src/foundation/pi-component-adapter/upstream/components/earendil-announcement.js +0 -19
  474. package/dist/src/foundation/pi-component-adapter/upstream/components/owned-editor.d.ts +0 -18
  475. package/dist/src/foundation/pi-component-adapter/upstream/components/owned-editor.js +0 -55
  476. package/dist/src/foundation/pi-engine-adapter/settings-integration.d.ts +0 -55
  477. package/dist/src/foundation/pi-owned-ui-integration/index.d.ts +0 -2
  478. package/dist/src/foundation/pi-owned-ui-integration/index.js +0 -2
  479. package/dist/src/foundation/pi-owned-ui-integration/route-host.d.ts +0 -29
  480. package/dist/src/foundation/pi-owned-ui-integration/session-shell.d.ts +0 -106
  481. package/dist/src/foundation/pi-owned-ui-integration/session-shell.js +0 -1518
  482. package/dist/src/foundation/pi-tui-runtime-adapter/index.d.ts +0 -4
  483. package/dist/src/foundation/pi-tui-runtime-adapter/index.js +0 -4
  484. package/dist/src/foundation/release/bootstrap.d.ts +0 -29
  485. package/dist/src/foundation/release/cohort-state.d.ts +0 -70
  486. package/dist/src/foundation/release/cohort-state.js +0 -202
  487. package/dist/src/foundation/release/release-gc.d.ts +0 -5
  488. package/dist/src/foundation/release/release-gc.js +0 -16
  489. package/dist/src/foundation/supervision/index.d.ts +0 -3
  490. package/dist/src/foundation/supervision/index.js +0 -3
  491. package/dist/src/foundation/supervision/main.d.ts +0 -1
  492. package/dist/src/foundation/supervision/main.js +0 -41
  493. package/dist/src/foundation/supervision/paths.d.ts +0 -1
  494. package/dist/src/foundation/supervision/paths.js +0 -1
  495. package/dist/src/foundation/supervision/server.d.ts +0 -22
  496. package/dist/src/foundation/ui-components/spans.d.ts +0 -7
  497. package/dist/src/foundation/ui-components/spans.js +0 -59
  498. package/docs/manual-transparent-checkpoint.md +0 -53
  499. /package/dist/{src/cli → cli}/index.d.ts +0 -0
  500. /package/dist/{src/cli → cli}/index.js +0 -0
  501. /package/dist/{src/cli → cli}/version.d.ts +0 -0
  502. /package/dist/{src/cli → cli}/version.js +0 -0
  503. /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/capability-ports.js +0 -0
  504. /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/domain-validation.d.ts +0 -0
  505. /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/domain.js +0 -0
  506. /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/index.d.ts +0 -0
  507. /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/index.js +0 -0
  508. /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/model.d.ts +0 -0
  509. /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/model.js +0 -0
  510. /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/package-ports.js +0 -0
  511. /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/ports.d.ts +0 -0
  512. /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/ports.js +0 -0
  513. /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/serialization.d.ts +0 -0
  514. /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/serialization.js +0 -0
  515. /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/validation.d.ts +0 -0
  516. /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/validation.js +0 -0
  517. /package/dist/{src/foundation/owned-ui-contracts → contracts/owned-ui}/extension-ui.d.ts +0 -0
  518. /package/dist/{src/foundation/owned-ui-contracts → contracts/owned-ui}/extension-ui.js +0 -0
  519. /package/dist/{src/foundation/owned-ui-contracts → contracts/owned-ui}/model.js +0 -0
  520. /package/dist/{src/foundation/presentation-contracts → contracts/presentation}/index.js +0 -0
  521. /package/dist/{src/foundation/workspace-contracts → contracts/workspace}/index.d.ts +0 -0
  522. /package/dist/{src/foundation/workspace-contracts → contracts/workspace}/index.js +0 -0
  523. /package/dist/{src/foundation/workspace-contracts → contracts/workspace}/model.d.ts +0 -0
  524. /package/dist/{src/foundation/workspace-contracts → contracts/workspace}/model.js +0 -0
  525. /package/dist/{src/foundation/workspace-contracts → contracts/workspace}/validation.d.ts +0 -0
  526. /package/dist/{src/foundation/workspace-contracts → contracts/workspace}/validation.js +0 -0
  527. /package/dist/{src/features → features}/launch/development-launch.d.ts +0 -0
  528. /package/dist/{src/features → features}/launch/initialize-profile.d.ts +0 -0
  529. /package/dist/{src/features → features}/launch/initialize-profile.js +0 -0
  530. /package/dist/{src/features → features}/launch/runtime-selection.js +0 -0
  531. /package/dist/{src/features → features}/workspace/capabilities.js +0 -0
  532. /package/dist/{src/features → features}/workspace/index.d.ts +0 -0
  533. /package/dist/{src/features → features}/workspace/index.js +0 -0
  534. /package/dist/{src/features → features}/workspace/presentation.d.ts +0 -0
  535. /package/dist/{src/features → features}/workspace/presentation.js +0 -0
  536. /package/dist/{src/features → features}/workspace/reconciliation.d.ts +0 -0
  537. /package/dist/{src/features → features}/workspace/reconciliation.js +0 -0
  538. /package/dist/{src/foundation → foundation}/launch-guardian/index.d.ts +0 -0
  539. /package/dist/{src/foundation → foundation}/launch-guardian/index.js +0 -0
  540. /package/dist/{src/foundation → foundation}/lifecycle/commands.d.ts +0 -0
  541. /package/dist/{src/foundation → foundation}/lifecycle/commands.js +0 -0
  542. /package/dist/{src/foundation → foundation}/lifecycle/launch-instance.d.ts +0 -0
  543. /package/dist/{src/foundation → foundation}/lifecycle/launch-instance.js +0 -0
  544. /package/dist/{src/foundation → foundation}/native-host-protocol/evidence.d.ts +0 -0
  545. /package/dist/{src/foundation → foundation}/native-host-protocol/evidence.js +0 -0
  546. /package/dist/{src/foundation → foundation}/native-host-protocol/index.d.ts +0 -0
  547. /package/dist/{src/foundation → foundation}/native-host-protocol/index.js +0 -0
  548. /package/dist/{src/foundation → foundation}/native-host-protocol/proof-gate.d.ts +0 -0
  549. /package/dist/{src/foundation → foundation}/native-host-protocol/proof-gate.js +0 -0
  550. /package/dist/{src/foundation → foundation}/process-containment/artifact.d.ts +0 -0
  551. /package/dist/{src/foundation → foundation}/process-containment/artifact.js +0 -0
  552. /package/dist/{src/foundation → foundation}/process-containment/contracts.d.ts +0 -0
  553. /package/dist/{src/foundation → foundation}/process-containment/contracts.js +0 -0
  554. /package/dist/{src/foundation → foundation}/protocol/index.d.ts +0 -0
  555. /package/dist/{src/foundation → foundation}/protocol/index.js +0 -0
  556. /package/dist/{src/foundation → foundation}/release/cohort-selection.d.ts +0 -0
  557. /package/dist/{src/foundation → foundation}/release/cohort-selection.js +0 -0
  558. /package/dist/{src/foundation → foundation}/release/concurrency.d.ts +0 -0
  559. /package/dist/{src/foundation → foundation}/release/concurrency.js +0 -0
  560. /package/dist/{src/foundation → foundation}/release/process-cleanup.d.ts +0 -0
  561. /package/dist/{src/foundation → foundation}/release/process-cleanup.js +0 -0
  562. /package/dist/{src/foundation → foundation}/release/stable-release.d.ts +0 -0
  563. /package/dist/{src/foundation → foundation}/release/stable-release.js +0 -0
  564. /package/dist/{src/foundation → foundation}/storage/index.d.ts +0 -0
  565. /package/dist/{src/foundation → foundation}/storage/index.js +0 -0
  566. /package/dist/{src/foundation → foundation}/structured-agent-runtime/index.d.ts +0 -0
  567. /package/dist/{src/foundation → foundation}/structured-agent-runtime/index.js +0 -0
  568. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/components.js +0 -0
  569. /package/dist/{src/foundation/pi-owned-ui-integration/route-host.js → integrations/pi/components/editor-interaction.js} +0 -0
  570. /package/dist/{src/foundation/pi-tui-runtime-adapter/contracts.js → integrations/pi/components/prompt-input-port.js} +0 -0
  571. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/resources/builtin-themes.d.ts +0 -0
  572. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/resources/builtin-themes.js +0 -0
  573. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/shell-editor-autocomplete.d.ts +0 -0
  574. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/shell-extension-ui.js +0 -0
  575. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/theme.d.ts +0 -0
  576. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/theme.js +0 -0
  577. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/countdown-timer.d.ts +0 -0
  578. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/countdown-timer.js +0 -0
  579. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/custom-entry.d.ts +0 -0
  580. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/custom-entry.js +0 -0
  581. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/daxnuts.d.ts +0 -0
  582. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/daxnuts.js +0 -0
  583. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/earendil-announcement.d.ts +0 -0
  584. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/extension-editor.d.ts +0 -0
  585. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/extension-editor.js +0 -0
  586. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/first-time-setup.d.ts +0 -0
  587. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/first-time-setup.js +0 -0
  588. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/markdown-transform.d.ts +0 -0
  589. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/markdown-transform.js +0 -0
  590. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/mermaid.d.ts +0 -0
  591. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/mermaid.js +0 -0
  592. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/session-selector-search.d.ts +0 -0
  593. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/session-selector-search.js +0 -0
  594. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/session-selector.d.ts +0 -0
  595. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/session-selector.js +0 -0
  596. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/skill-invocation-message.d.ts +0 -0
  597. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/skill-invocation-message.js +0 -0
  598. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/status-indicator.d.ts +0 -0
  599. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/status-indicator.js +0 -0
  600. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/tree-selector.d.ts +0 -0
  601. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/tree-selector.js +0 -0
  602. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/trust-selector.d.ts +0 -0
  603. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/trust-selector.js +0 -0
  604. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/external-editor.d.ts +0 -0
  605. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/external-editor.js +0 -0
  606. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/model-search.d.ts +0 -0
  607. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/model-search.js +0 -0
  608. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/theme/theme-controller.d.ts +0 -0
  609. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/theme/theme-controller.js +0 -0
  610. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/theme/theme.d.ts +0 -0
  611. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/theme/theme.js +0 -0
  612. /package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/pi-settings-metadata.json +0 -0
  613. /package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/public-main-entry.d.ts +0 -0
  614. /package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/public-main-entry.js +0 -0
  615. /package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/workflows.js +0 -0
  616. /package/dist/{src/foundation/pi-tui-runtime-adapter → integrations/pi/tui-runtime}/conformance.d.ts +0 -0
  617. /package/dist/{src/foundation/pi-tui-runtime-adapter → integrations/pi/tui-runtime}/conformance.js +0 -0
  618. /package/dist/{src/foundation/pi-tui-runtime-adapter → integrations/pi/tui-runtime}/presentation-adapter.js +0 -0
  619. /package/dist/{src/foundation/ui-apps → ui/apps}/contracts.js +0 -0
  620. /package/dist/{src/foundation/ui-apps → ui/apps}/index.d.ts +0 -0
  621. /package/dist/{src/foundation/ui-apps → ui/apps}/index.js +0 -0
  622. /package/dist/{src/foundation/ui-components → ui/components}/dialog-panel.d.ts +0 -0
  623. /package/dist/{src/foundation/ui-components → ui/components}/label.d.ts +0 -0
  624. /package/dist/{src/foundation/ui-components → ui/components}/label.js +0 -0
  625. /package/dist/{src/foundation/ui-components → ui/components}/list-block.d.ts +0 -0
  626. /package/dist/{src/foundation/ui-components → ui/components}/list-block.js +0 -0
  627. /package/dist/{src/foundation/ui-components → ui/components}/pane.d.ts +0 -0
  628. /package/dist/{src/foundation/ui-components → ui/components}/pane.js +0 -0
  629. /package/dist/{src/foundation/ui-components → ui/components}/revision.d.ts +0 -0
  630. /package/dist/{src/foundation/ui-components → ui/components}/revision.js +0 -0
  631. /package/dist/{src/foundation/ui-components → ui/components}/status-line.d.ts +0 -0
  632. /package/dist/{src/foundation/ui-components → ui/components}/status-line.js +0 -0
  633. /package/dist/{src/foundation/ui-components → ui/components}/stepper.d.ts +0 -0
  634. /package/dist/{src/foundation/ui-components → ui/components}/stepper.js +0 -0
  635. /package/dist/{src/foundation/ui-components → ui/components}/theme.d.ts +0 -0
  636. /package/dist/{src/foundation/ui-components → ui/components}/theme.js +0 -0
  637. /package/dist/{src/foundation/ui-components → ui/components}/value-menu.d.ts +0 -0
  638. /package/dist/{src/foundation/ui-components → ui/components}/value-menu.js +0 -0
  639. /package/dist/{src/foundation/owned-ui-settings → ui/settings}/index.d.ts +0 -0
  640. /package/dist/{src/foundation/owned-ui-settings → ui/settings}/index.js +0 -0
  641. /package/dist/{src/foundation/owned-ui-settings → ui/settings}/resolution.d.ts +0 -0
  642. /package/dist/{src/foundation/owned-ui-settings → ui/settings}/resolution.js +0 -0
@@ -5,22 +5,18 @@ import { isAbsolute, relative, resolve, sep } from "node:path";
5
5
  import crossSpawn from "cross-spawn";
6
6
  import { valid as validSemver } from "semver";
7
7
  import { PRODUCT_IDENTITY, PRODUCT_TEXT } from "../../product-identity.js";
8
- import { certifyMaterializedRelease, probeOwnership, readEndpointMetadata, removeEndpointArtifacts, startSupervisor, waitForProcessExit, waitForVerifiedEndpoint, } from "./bootstrap.js";
9
- import { resolveProductPaths } from "../lifecycle/index.js";
8
+ import { certifyMaterializedRelease, probeOwnership, readEndpointMetadata, removeEndpointArtifacts, ensureSupervisor, waitForProcessExit, } from "./bootstrap.js";
9
+ import { resolveCohortEndpoint, resolveProductPaths } from "../lifecycle/index.js";
10
10
  import { encodeFrame, LineFrameDecoder } from "../protocol/index.js";
11
11
  import { CohortStateStore } from "./cohort-state.js";
12
12
  import { cleanupVerifiedOwner, processIsAlive } from "./process-cleanup.js";
13
13
  import { materializeRelease, readMaterializedRelease } from "./release-store.js";
14
+ import { scheduleReleaseCleanup } from "./release-gc.js";
15
+ import { warmMaterializedRelease } from "./warmup.js";
14
16
  import { UpdateTransactionStore } from "./update-transaction.js";
17
+ import { removeUpdateRecoveryCapsule, runProtectedPackageReplacement } from "./update-recovery.js";
15
18
  export const PRODUCT_PACKAGE = PRODUCT_TEXT.packageName;
16
19
  const UPDATE_DIST_TAGS = { stable: "latest", next: "next" };
17
- /**
18
- * What each channel is called when A1 says it out loud. The internal name stays
19
- * `stable` because that is what the channel is, but what a reader is moving to is
20
- * a release, and that is the word the repository, its tags, and its GitHub
21
- * releases all use.
22
- */
23
- const UPDATE_CHANNEL_LABELS = { stable: "release", next: "next" };
24
20
  const defaultFileSystem = {
25
21
  async readFile(path) { return await readFile(path, "utf8"); },
26
22
  realpath,
@@ -47,6 +43,33 @@ export function createNpmProcessRunner(platform = process.platform) {
47
43
  } });
48
44
  });
49
45
  }
46
+ /**
47
+ * What an update does about the owner it found. A cohort running from retained immutable
48
+ * content keeps its work: the installation replaces files it does not read, and it listens on
49
+ * its own endpoint. A cohort running from the mutable installation is the one exception,
50
+ * because that installation is exactly what is about to be replaced under it.
51
+ */
52
+ export function planUpdateOwnership(ownership, runsFromRetainedRelease) {
53
+ if (ownership === "dead")
54
+ return "clean-dead-record";
55
+ return runsFromRetainedRelease ? "leave-running" : "end-session";
56
+ }
57
+ /**
58
+ * The endpoint of the active cohort, together with where it is recorded, so a caller that
59
+ * finds it can also clean it up. A release that predates cohort-scoped endpoints published
60
+ * one endpoint for the runtime directory, and that one is recognized too.
61
+ */
62
+ async function readActiveEndpoint(paths, activeReleaseId, environment) {
63
+ if (activeReleaseId !== null) {
64
+ const cohort = resolveCohortEndpoint(paths, activeReleaseId, environment);
65
+ const metadata = await readEndpointMetadata(cohort.endpointMetadataPath);
66
+ if (metadata)
67
+ return { metadata, paths: cohort };
68
+ }
69
+ const legacyPaths = { endpoint: paths.endpoint, endpointMetadataPath: paths.endpointMetadataPath };
70
+ const legacy = await readEndpointMetadata(legacyPaths.endpointMetadataPath);
71
+ return legacy ? { metadata: legacy, paths: legacyPaths } : null;
72
+ }
50
73
  export function createUpdateLifecycleCoordinator(environment = process.env, fileSystem = defaultFileSystem, output = defaultOutput) {
51
74
  const paths = resolveProductPaths(environment);
52
75
  const stateStore = new CohortStateStore(paths.dataDir);
@@ -56,45 +79,51 @@ export function createUpdateLifecycleCoordinator(environment = process.env, file
56
79
  const activeId = state.references.active;
57
80
  if (!activeId || state.releases[activeId]?.packageVersion !== targetVersion)
58
81
  return false;
59
- const endpoint = await readEndpointMetadata(paths.endpointMetadataPath);
60
- return endpoint?.releaseId === activeId && await probeOwnership(endpoint) === "live-verified";
82
+ const endpoint = await readActiveEndpoint(paths, activeId, environment);
83
+ return endpoint?.metadata.releaseId === activeId && await probeOwnership(endpoint.metadata) === "live-verified";
61
84
  },
62
85
  async shutdownVerifiedOwners(targetVersion) {
63
86
  const state = await stateStore.read();
64
- const priorActiveVersion = state.references.active ? state.releases[state.references.active]?.packageVersion ?? null : null;
65
- const endpoint = await readEndpointMetadata(paths.endpointMetadataPath);
66
- if (!endpoint)
87
+ const activeId = state.references.active;
88
+ const priorActiveVersion = activeId ? state.releases[activeId]?.packageVersion ?? null : null;
89
+ const owner = await readActiveEndpoint(paths, activeId, environment);
90
+ if (!owner)
67
91
  return { priorActiveVersion };
92
+ const endpoint = owner.metadata;
68
93
  const ownership = await probeOwnership(endpoint);
69
94
  if (ownership !== "live-verified" && ownership !== "dead") {
70
95
  throw new Error(PRODUCT_TEXT.diagnostic(`refused update shutdown because supervisor ownership is ${ownership}`));
71
96
  }
72
- const immutableRoot = await canonicalImmutableRoot(paths.dataDir, endpoint.releaseRoot);
73
- const legacyMutableInstall = ownership === "live-verified" && !immutableRoot;
74
- const identity = ownership === "dead"
75
- ? { accepted: false, reason: "recorded owner is dead" }
76
- : await requestUpdateShutdown(endpoint, targetVersion, 2_000);
97
+ const plan = planUpdateOwnership(ownership, await canonicalImmutableRoot(paths.dataDir, endpoint.releaseRoot));
98
+ if (plan === "clean-dead-record") {
99
+ await removeEndpointArtifacts(owner.paths.endpointMetadataPath, owner.paths.endpoint);
100
+ return { priorActiveVersion };
101
+ }
102
+ // Rationale: leaving sessions alone is the expected outcome, and saying so mid-update tears
103
+ // the progress bar; only ending a session (below) is worth interrupting it for.
104
+ if (plan === "leave-running")
105
+ return { priorActiveVersion };
106
+ // Rationale: say whose work is ending before it ends.
107
+ const live = endpoint.ownership.liveInstanceIds.length;
108
+ if (live > 0) {
109
+ output.stderr(`${PRODUCT_TEXT.diagnostic(`ending ${live === 1 ? "one session" : `${live} sessions`} that run from the installation being replaced; a session started by an installed release would have been left alone.`)}\n`);
110
+ }
111
+ const identity = await requestUpdateShutdown(endpoint, targetVersion, 2_000);
77
112
  if (!identity.accepted && processIsAlive(endpoint.pid)) {
78
- // Explicit update consent permits bounded cleanup of an authenticated
113
+ // Security: explicit update consent permits bounded cleanup of an authenticated
79
114
  // older owner that predates the update-shutdown message.
80
- const cleanup = await cleanupVerifiedOwner(endpoint, {
81
- allowLiveInstances: true,
82
- reason: legacyMutableInstall ? "legacy-mutable-install" : "explicit-update",
83
- });
115
+ const cleanup = await cleanupVerifiedOwner(endpoint, { allowLiveInstances: true, reason: "legacy-mutable-install" });
84
116
  if (!cleanup.terminated)
85
117
  throw new Error(`verified ${PRODUCT_TEXT.displayName} owner ${endpoint.pid} rejected shutdown and could not be terminated: ${identity.reason}`);
86
118
  }
87
119
  else if (identity.accepted) {
88
120
  await waitForProcessExit(endpoint.pid, 3_000).catch(async () => {
89
- const cleanup = await cleanupVerifiedOwner(endpoint, {
90
- allowLiveInstances: true,
91
- reason: legacyMutableInstall ? "legacy-mutable-install" : "explicit-update",
92
- });
121
+ const cleanup = await cleanupVerifiedOwner(endpoint, { allowLiveInstances: true, reason: "legacy-mutable-install" });
93
122
  if (!cleanup.terminated)
94
123
  throw new Error(`verified ${PRODUCT_TEXT.displayName} owner ${endpoint.pid} did not terminate`);
95
124
  });
96
125
  }
97
- await removeEndpointArtifacts(paths.endpointMetadataPath, paths.endpoint);
126
+ await removeEndpointArtifacts(owner.paths.endpointMetadataPath, owner.paths.endpoint);
98
127
  return { priorActiveVersion };
99
128
  },
100
129
  async verifyPackageUnlocked(packageRoot) {
@@ -107,12 +136,12 @@ export function createUpdateLifecycleCoordinator(environment = process.env, file
107
136
  await rename(probe, packageRoot);
108
137
  }
109
138
  catch (error) {
110
- // Best-effort rollback if the first rename succeeded and the second did not.
139
+ // Invariant: best-effort rollback runs if the first rename succeeded and the second did not.
111
140
  await rename(probe, packageRoot).catch(() => { });
112
141
  throw new Error(PRODUCT_TEXT.diagnostic(`package remains locked after verified shutdown: ${errorMessage(error)}`));
113
142
  }
114
143
  },
115
- async activateInstalled(packageRoot, targetVersion, phase, onMaterializing) {
144
+ async activateInstalled(packageRoot, targetVersion, phase, onMaterializing, onWarmup) {
116
145
  let total = 0;
117
146
  let completed = 0;
118
147
  const candidate = await materializeRelease(packageRoot, paths.dataDir, {
@@ -121,7 +150,7 @@ export function createUpdateLifecycleCoordinator(environment = process.env, file
121
150
  onMaterializing?.({ completed, total });
122
151
  },
123
152
  onOperation: event => {
124
- if (event.operation !== "candidate-write")
153
+ if (event.operation !== "candidate-write" && event.operation !== "layer-write")
125
154
  return;
126
155
  completed += 1;
127
156
  onMaterializing?.({ completed, total });
@@ -134,14 +163,17 @@ export function createUpdateLifecycleCoordinator(environment = process.env, file
134
163
  const diagnostics = await certifyMaterializedRelease(candidate, paths.dataDir);
135
164
  await stateStore.approve(candidate.releaseId, diagnostics);
136
165
  await phase("certified");
166
+ onWarmup?.("started");
167
+ await warmMaterializedRelease(candidate, environment);
168
+ onWarmup?.("completed");
169
+ await ensureSupervisor(candidate, environment);
170
+ // Invariant: warmup and authenticated readiness precede changing the active reference.
137
171
  await stateStore.activate(candidate.releaseId);
138
172
  await phase("active-reference-committed");
139
- await startSupervisor(candidate, environment);
140
- await waitForVerifiedEndpoint(paths.endpointMetadataPath, candidate, 8_000);
141
173
  },
142
174
  };
143
175
  }
144
- const PROGRESS_BAR_WIDTH = 39;
176
+ const PROGRESS_BAR_WIDTH = 40;
145
177
  const PROGRESS_TICK_MS = 200;
146
178
  /**
147
179
  * Copying the release owns 78–92 and is reported file by file, so the bar crosses
@@ -154,10 +186,15 @@ const ACTIVATION_PROGRESS = {
154
186
  certified: { at: 94, creepTo: 96 },
155
187
  "active-reference-committed": { at: 96, creepTo: 99 },
156
188
  };
157
- function renderProgressBar(percent) {
189
+ /** Renders the terminal-only update meter; the visual preview shares this exact frame. */
190
+ export function renderUpdateProgressBar(percent) {
158
191
  const bounded = Math.min(100, Math.max(0, Math.round(percent)));
159
192
  const filled = Math.round((bounded / 100) * PROGRESS_BAR_WIDTH);
160
- return `${"█".repeat(filled)}${"░".repeat(PROGRESS_BAR_WIDTH - filled)} ${bounded}%`;
193
+ // Rationale: a gray line, a darker gray track, and one space before the percentage.
194
+ // Explicit RGB keeps both grays neutral even when the terminal remaps its ANSI palette.
195
+ const gray = "\u001b[38;2;128;128;128m";
196
+ const track = "\u001b[38;2;102;102;102m";
197
+ return `${gray}${"━".repeat(filled)}${track}${"─".repeat(PROGRESS_BAR_WIDTH - filled)}${gray} ${bounded}%\u001b[39m`;
161
198
  }
162
199
  function createUpdateProgress(output, enabled) {
163
200
  let visible = false;
@@ -170,7 +207,7 @@ function createUpdateProgress(output, enabled) {
170
207
  return;
171
208
  shown = rounded;
172
209
  visible = true;
173
- output.stdout(`\r${renderProgressBar(rounded)}`);
210
+ output.stdout(`\r${renderUpdateProgressBar(rounded)}`);
174
211
  };
175
212
  const stopCreep = () => {
176
213
  if (timer !== null) {
@@ -188,7 +225,7 @@ function createUpdateProgress(output, enabled) {
188
225
  draw();
189
226
  if (creepTo <= current)
190
227
  return;
191
- // Creep asymptotically toward (but never reach) the next milestone so
228
+ // Rationale: creep asymptotically toward (but never reach) the next milestone so
192
229
  // long opaque phases such as npm install still show visible motion. The
193
230
  // ceiling stays a whole point below the milestone: settling on `creepTo`
194
231
  // itself would render as that milestone and make arriving at it invisible,
@@ -199,7 +236,7 @@ function createUpdateProgress(output, enabled) {
199
236
  }, PROGRESS_TICK_MS);
200
237
  timer.unref?.();
201
238
  },
202
- // The bar exists to say the update is still moving. Once it has finished
239
+ // Rationale: the bar exists to say the update is still moving. Once it has finished
203
240
  // there is a better line to occupy that row — the one naming what is now
204
241
  // installed — so the bar gives the row back rather than leaving a full
205
242
  // meter above a message that already implies it.
@@ -223,12 +260,13 @@ function createUpdateProgress(output, enabled) {
223
260
  }
224
261
  /** The newest version the channel points at, which is what an unqualified update takes. */
225
262
  async function resolveChannelHead(runner, distTag, output) {
226
- const lookup = await runNpm(runner, ["view", `${PRODUCT_PACKAGE}@${distTag}`, "version"], true, output, `query the npm ${distTag} channel`);
263
+ const publicChannel = distTag === "next" ? "development" : "release";
264
+ const lookup = await runNpm(runner, ["view", `${PRODUCT_PACKAGE}@${distTag}`, "version"], true, output, `query the npm ${publicChannel} channel`);
227
265
  if (lookup.result === null)
228
266
  return { version: null, exitCode: lookup.exitCode };
229
267
  const version = validSemver(lookup.result.stdout.trim());
230
268
  if (version === null) {
231
- output.stderr(`${PRODUCT_TEXT.diagnostic(`received a malformed ${distTag} version from npm: ${JSON.stringify(lookup.result.stdout.trim())}.`)}\n`);
269
+ output.stderr(`${PRODUCT_TEXT.diagnostic(`received a malformed ${publicChannel} channel version from npm: ${JSON.stringify(lookup.result.stdout.trim())}.`)}\n`);
232
270
  return { version: null, exitCode: 1 };
233
271
  }
234
272
  return { version, exitCode: 0 };
@@ -236,14 +274,10 @@ async function resolveChannelHead(runner, distTag, output) {
236
274
  /**
237
275
  * Resolve a preview the caller named.
238
276
  *
239
- * A preview is published as `<version>-dev.<commit>`, so its commit is enough to
240
- * say which one is wanted the version in front of it is not something anyone
241
- * should have to remember. A full version is accepted too, for anyone reading one
242
- * back from `a1 version` or a changelog.
243
- *
244
- * The published list is the authority: naming a commit that was never published,
245
- * or one published more than once under different versions, is an error rather
246
- * than a guess.
277
+ * A preview is published as `<version>-dev.<pull-request-number>`, so its decimal
278
+ * development number is enough to identify it. A full version is accepted too.
279
+ * The published list remains authoritative: nothing is constructed from the
280
+ * installed package's base version.
247
281
  */
248
282
  async function resolveRequestedPreview(runner, requested, output) {
249
283
  const lookup = await runNpm(runner, ["view", PRODUCT_PACKAGE, "versions", "--json"], true, output, "list the published versions");
@@ -260,9 +294,8 @@ async function resolveRequestedPreview(runner, requested, output) {
260
294
  const versions = (Array.isArray(published) ? published : [published]).filter((value) => typeof value === "string");
261
295
  const exact = versions.find(version => version === requested);
262
296
  if (exact !== undefined) {
263
- // Naming a release here would install it through the preview path, which is a
264
- // different command with a different meaning. The commit form cannot express
265
- // one, so only the fuller spelling of a preview reaches this.
297
+ // Rationale: naming a release here would install it through the preview path, which is a
298
+ // different command with a different meaning.
266
299
  if (!exact.includes("-dev.")) {
267
300
  output.stderr(`${PRODUCT_TEXT.diagnostic(`${exact} is a release, not a preview; run ${PRODUCT_TEXT.commandName} update to move to the current release.`)}\n`);
268
301
  return { version: null, exitCode: 1 };
@@ -314,7 +347,9 @@ export async function runSelfUpdate(options) {
314
347
  if (resolved.version === null)
315
348
  return resolved.exitCode;
316
349
  const targetVersion = resolved.version;
317
- output.stdout(`${PRODUCT_TEXT.commandName} update (${UPDATE_CHANNEL_LABELS[channel]}): ${runningVersion} ${targetVersion}.\n`);
350
+ // Rationale: no full stop after a version: it already ends in a dot-separated identifier,
351
+ // and a trailing one reads as part of the version rather than as punctuation.
352
+ output.stdout(`${PRODUCT_TEXT.commandName} update: ${runningVersion} → ${targetVersion}\n`);
318
353
  const progress = createUpdateProgress(output, options.progress ?? (options.output === undefined && process.stdout.isTTY === true));
319
354
  const rootLookup = await measure("global-root", async () => await runNpm(runner, ["root", "--global"], true, output, "resolve npm's global package root"));
320
355
  if (rootLookup.result === null)
@@ -340,25 +375,37 @@ export async function runSelfUpdate(options) {
340
375
  const paths = resolveProductPaths(environment);
341
376
  const lifecycle = options.lifecycle ?? createUpdateLifecycleCoordinator(environment, fileSystem, output);
342
377
  const transactionStore = options.transactionStore ?? new UpdateTransactionStore(paths.dataDir);
378
+ const maintenance = options.maintenance ?? (options.lifecycle
379
+ ? async () => { }
380
+ : async () => await scheduleReleaseCleanup(paths.dataDir, paths));
343
381
  let transaction = await transactionStore.read();
344
382
  try {
345
- if (await lifecycle.targetIsActive(targetVersion)) {
346
- if (transaction?.status === "active") {
347
- await transactionStore.advance("supervisor-verified");
348
- await transactionStore.finish("completed");
349
- }
383
+ if ((!transaction || transaction.status === "completed") && await lifecycle.targetIsActive(targetVersion)) {
384
+ await maintenance();
350
385
  await transactionStore.clearCompleted();
351
386
  output.stdout(`${PRODUCT_TEXT.commandName} is up to date — no update needed.\n`);
352
387
  return 0;
353
388
  }
354
- // The bar first appears here so a no-change run never flashes it.
389
+ // Rationale: the bar first appears here so a no-change run never flashes it.
355
390
  progress.set(3, 15);
356
- const cohortState = await new CohortStateStore(paths.dataDir).read();
391
+ const cohortStore = new CohortStateStore(paths.dataDir);
392
+ let cohortState = await cohortStore.read();
393
+ let priorActiveReleaseId = cohortState.references.active;
394
+ if (options.runner === undefined && (priorActiveReleaseId === null || cohortState.releases[priorActiveReleaseId]?.approval !== "approved")) {
395
+ // Invariant: protected replacement needs an immutable launch authority that npm cannot rename.
396
+ const recoveryRelease = await materializeRelease(packageRoot, paths.dataDir);
397
+ await cohortStore.recordCandidate(recoveryRelease);
398
+ const diagnostics = await certifyMaterializedRelease(recoveryRelease, paths.dataDir);
399
+ await cohortStore.approve(recoveryRelease.releaseId, diagnostics);
400
+ await cohortStore.activate(recoveryRelease.releaseId);
401
+ cohortState = await cohortStore.read();
402
+ priorActiveReleaseId = recoveryRelease.releaseId;
403
+ }
357
404
  transaction = await transactionStore.begin({
358
405
  channel,
359
406
  targetVersion,
360
407
  packageRoot,
361
- priorActiveReleaseId: cohortState.references.active,
408
+ priorActiveReleaseId,
362
409
  });
363
410
  if (phaseBefore(transaction.phase, "ownership-released")) {
364
411
  await measure("ownership-release", async () => {
@@ -369,18 +416,73 @@ export async function runSelfUpdate(options) {
369
416
  }
370
417
  progress.set(15, 70);
371
418
  if (phaseBefore(transaction.phase, "package-installed")) {
372
- const installation = await measure("npm-install", async () => await runNpm(runner, ["install", "--global", "--loglevel=error", "--no-fund", "--no-audit", `${PRODUCT_PACKAGE}@${targetVersion}`], true, output, "start the global npm installation", false));
373
- if (installation.result === null)
374
- throw new UpdateFailure(installation.exitCode, "npm process failed");
375
- if (installation.result.code !== 0) {
376
- if (installation.result.stdout.trim().length > 0)
377
- output.stderr(`${installation.result.stdout.trimEnd()}\n`);
378
- throw new UpdateFailure(unsuccessfulCode(installation.result.code), `npm exited with status ${formatExitCode(installation.result.code)}`);
419
+ if (options.packageReplacement || options.runner === undefined) {
420
+ const priorReleaseId = transaction.priorActiveReleaseId ?? priorActiveReleaseId;
421
+ const recordedPrior = priorReleaseId === null ? undefined : cohortState.releases[priorReleaseId];
422
+ if ((!recordedPrior || recordedPrior.approval !== "approved") && !options.packageReplacement) {
423
+ throw new Error(PRODUCT_TEXT.diagnostic("cannot protect package replacement because no approved prior release is available"));
424
+ }
425
+ const priorRelease = recordedPrior ?? {
426
+ releaseId: priorReleaseId ?? "injected-prior-release",
427
+ releaseRoot: packageRoot,
428
+ contentDigest: "0".repeat(64),
429
+ };
430
+ const replacementTransaction = transaction;
431
+ const replacement = await measure("npm-install", async () => await (options.packageReplacement ?? runProtectedPackageReplacement)({
432
+ dataDir: paths.dataDir,
433
+ globalRoot,
434
+ packageRoot,
435
+ transaction: replacementTransaction,
436
+ priorRelease,
437
+ output,
438
+ environment,
439
+ onRecoveryState: async (recovery) => {
440
+ if (transactionStore.setRecovery)
441
+ transaction = await transactionStore.setRecovery(recovery) ?? transaction;
442
+ },
443
+ }));
444
+ if (replacement.stdout.trim().length > 0 && replacement.outcome !== "installed")
445
+ output.stderr(`${replacement.stdout.trimEnd()}\n`);
446
+ if (replacement.stderr.trim().length > 0)
447
+ output.stderr(`${replacement.stderr.trimEnd()}\n`);
448
+ if (replacement.outcome === "installed")
449
+ transaction = await transactionStore.advance("package-installed");
450
+ if (replacement.cancelled) {
451
+ progress.clear();
452
+ output.stderr(`${PRODUCT_TEXT.diagnostic("update cancelled safely; the launcher is available and the transaction can be resumed.")}\n`);
453
+ return 130;
454
+ }
455
+ if (replacement.outcome !== "installed") {
456
+ throw new UpdateFailure(unsuccessfulCode(replacement.npmExitCode), `npm exited with status ${formatExitCode(replacement.npmExitCode)}`);
457
+ }
458
+ }
459
+ else {
460
+ const installation = await measure("npm-install", async () => await runNpm(runner, ["install", "--global", "--loglevel=error", "--no-fund", "--no-audit", `${PRODUCT_PACKAGE}@${targetVersion}`], true, output, "start the global npm installation", false));
461
+ if (installation.result === null)
462
+ throw new UpdateFailure(installation.exitCode, "npm process failed");
463
+ if (installation.result.code !== 0) {
464
+ if (installation.result.stdout.trim().length > 0)
465
+ output.stderr(`${installation.result.stdout.trimEnd()}\n`);
466
+ throw new UpdateFailure(unsuccessfulCode(installation.result.code), `npm exited with status ${formatExitCode(installation.result.code)}`);
467
+ }
468
+ transaction = await transactionStore.advance("package-installed");
379
469
  }
380
- transaction = await transactionStore.advance("package-installed");
470
+ }
471
+ // Compatibility: npm 12 blocks install scripts unless allowScripts covers the package, so
472
+ // the postinstall that points the #pi-tui proxy at the tree npm just built
473
+ // may never have run. Run the shipped script directly: the proxy must be
474
+ // correct before the release store copies this tree. A failure is reported
475
+ // and left to the launch-time self-heal rather than failing the update.
476
+ try {
477
+ const proxySync = await runner(process.execPath, [resolve(packageRoot, "bin", "sync-pi-tui-proxy.js")], { captureStdout: true });
478
+ if (proxySync.code !== 0)
479
+ output.stderr(`${PRODUCT_TEXT.diagnostic(`could not point the #pi-tui proxy at the installed tree (exited ${formatExitCode(proxySync.code)}).`)}\n`);
480
+ }
481
+ catch (error) {
482
+ output.stderr(`${PRODUCT_TEXT.diagnostic(`could not point the #pi-tui proxy at the installed tree: ${errorMessage(error)}`)}\n`);
381
483
  }
382
484
  progress.set(70, 75);
383
- // Ownership can be reacquired after an interrupted installation (for
485
+ // Concurrency: ownership can be reacquired after an interrupted installation (for
384
486
  // example, if bare A1 is launched before the update is resumed). Recheck
385
487
  // immediately before activation so recovery cannot start a second cohort.
386
488
  await measure("ownership-release", async () => { await lifecycle.shutdownVerifiedOwners(targetVersion); });
@@ -395,15 +497,31 @@ export async function runSelfUpdate(options) {
395
497
  const span = MATERIALIZE_PROGRESS.to - MATERIALIZE_PROGRESS.from;
396
498
  const done = total > 0 ? Math.min(1, completed / total) : 0;
397
499
  progress.set(MATERIALIZE_PROGRESS.from + span * done);
500
+ }, state => {
501
+ if (state === "started") {
502
+ activationPhaseStartedAt = now();
503
+ progress.set(98, 99);
504
+ }
505
+ else {
506
+ options.onPhaseTiming?.({ phase: "warmup", durationMs: Math.max(0, now() - activationPhaseStartedAt) });
507
+ activationPhaseStartedAt = now();
508
+ progress.set(99);
509
+ }
398
510
  });
399
511
  options.onPhaseTiming?.({ phase: "supervisor-verified", durationMs: Math.max(0, now() - activationPhaseStartedAt) });
400
512
  const transactionStartedAt = now();
401
513
  await transactionStore.advance("supervisor-verified");
514
+ if (transaction.recovery?.capsulePath)
515
+ await removeUpdateRecoveryCapsule(paths.dataDir, transaction.transactionId);
516
+ // Invariant: successful output follows the durable cleanup disposition. Slow recursive
517
+ // removal belongs to the detached worker started by this maintenance coordinator.
518
+ await maintenance();
519
+ // Concurrency: this is the launch cutover. No failure-prone update work follows success.
402
520
  await transactionStore.finish("completed");
403
- await transactionStore.clearCompleted();
521
+ await transactionStore.clearCompleted().catch(() => undefined);
404
522
  options.onPhaseTiming?.({ phase: "transaction-complete", durationMs: Math.max(0, now() - transactionStartedAt) });
405
523
  progress.finish();
406
- output.stdout(`${PRODUCT_TEXT.commandName} updated successfully: ${targetVersion}.\n`);
524
+ output.stdout(`${PRODUCT_TEXT.commandName} updated successfully: ${targetVersion}\n`);
407
525
  return 0;
408
526
  }
409
527
  catch (error) {
@@ -424,8 +542,9 @@ export function assertUpdatePerformanceBudget(evidence, maximumPostNpmDurationMs
424
542
  failures.push("fixture contains no payload files");
425
543
  if (evidence.sourceReads !== evidence.fileCount)
426
544
  failures.push(`source payload read count is ${evidence.sourceReads} for ${evidence.fileCount} files`);
427
- if (evidence.candidateWrites !== evidence.fileCount)
428
- failures.push(`candidate payload write count is ${evidence.candidateWrites} for ${evidence.fileCount} files`);
545
+ const totalWrites = evidence.candidateWrites + (evidence.layerWrites ?? 0);
546
+ if (totalWrites !== evidence.fileCount)
547
+ failures.push(`runtime payload write count is ${totalWrites} for ${evidence.fileCount} files`);
429
548
  if (evidence.verificationReads > 0)
430
549
  failures.push(`fresh certification reread ${evidence.verificationReads} candidate files`);
431
550
  if (evidence.postNpmDurationMs > maximumPostNpmDurationMs)
@@ -492,9 +611,8 @@ async function rollbackPriorCohort(dataDir, environment, priorReleaseId) {
492
611
  throw new Error(`prior release ${priorReleaseId} is not the recorded rollback cohort`);
493
612
  }
494
613
  const release = await readMaterializedRelease(prior.releaseRoot);
495
- const paths = resolveProductPaths(environment);
496
- await startSupervisor(release, environment);
497
- await waitForVerifiedEndpoint(paths.endpointMetadataPath, release, 8_000);
614
+ // Invariant: rollback reuses a surviving prior cohort rather than racing its occupied endpoint.
615
+ await ensureSupervisor(release, environment);
498
616
  return "rolled back";
499
617
  }
500
618
  function phaseBefore(current, target) {
@@ -0,0 +1,3 @@
1
+ import { type MaterializedRelease } from "./release-store.js";
2
+ /** Import the exact immutable startup graph in a terminal-free bounded child process. */
3
+ export declare function warmMaterializedRelease(release: MaterializedRelease, environment: NodeJS.ProcessEnv, timeoutMs?: number): Promise<void>;
@@ -0,0 +1,47 @@
1
+ import { spawn } from "node:child_process";
2
+ import { resolveReleaseEntryPoint } from "./release-store.js";
3
+ import { releaseEnvironment } from "./bootstrap.js";
4
+ import { launchContractTarget, launchEnvironmentKeys } from "../launch-context/index.js";
5
+ const WARMUP_DIAGNOSTIC_LIMIT = 2_000;
6
+ /** Summarize the child's own failure text without letting an unbounded graph error escape. */
7
+ function warmupDiagnostics(text) {
8
+ const lines = text.split(/\r?\n/).map(line => line.trim()).filter(line => line.length > 0);
9
+ return lines.length === 0 ? "" : `: ${lines.slice(0, 4).join(" | ").slice(0, WARMUP_DIAGNOSTIC_LIMIT)}`;
10
+ }
11
+ /** Import the exact immutable startup graph in a terminal-free bounded child process. */
12
+ export async function warmMaterializedRelease(release, environment, timeoutMs = 30_000) {
13
+ const entry = await resolveReleaseEntryPoint(release, "bin/warmup.js");
14
+ await new Promise((resolvePromise, rejectPromise) => {
15
+ // Rationale: the child still gets no terminal, but a discarded failure reason leaves an
16
+ // update reporting only an exit status. Its own diagnostics are read and bounded so the
17
+ // transaction journal records why the graph could not be imported.
18
+ const child = spawn(process.execPath, [entry], {
19
+ env: { ...releaseEnvironment(environment, release), [launchEnvironmentKeys(launchContractTarget(release)).immutableWarmup]: "1" },
20
+ stdio: ["ignore", "ignore", "pipe"],
21
+ windowsHide: true,
22
+ });
23
+ let diagnostics = "";
24
+ child.stderr?.setEncoding("utf8");
25
+ child.stderr?.on("data", chunk => { diagnostics = `${diagnostics}${chunk}`.slice(-WARMUP_DIAGNOSTIC_LIMIT); });
26
+ let settled = false;
27
+ const finish = (error) => {
28
+ if (settled)
29
+ return;
30
+ settled = true;
31
+ clearTimeout(timer);
32
+ if (error)
33
+ rejectPromise(error);
34
+ else
35
+ resolvePromise();
36
+ };
37
+ child.once("error", error => finish(error));
38
+ child.once("close", (code, signal) => finish(code === 0
39
+ ? undefined
40
+ : new Error(`immutable startup warmup exited with ${code === null ? signal ?? "unknown status" : `status ${code}`}${warmupDiagnostics(diagnostics)}`)));
41
+ const timer = setTimeout(() => {
42
+ child.kill();
43
+ finish(new Error(`immutable startup warmup exceeded ${timeoutMs}ms`));
44
+ }, timeoutMs);
45
+ timer.unref?.();
46
+ });
47
+ }
@@ -0,0 +1 @@
1
+ export * from "./startup-runtime.js";
@@ -0,0 +1 @@
1
+ export * from "./startup-runtime.js";
@@ -0,0 +1,36 @@
1
+ import { PRODUCT_IDENTITY } from "../../product-identity.js";
2
+ export type StartupPhase = "command-invoked" | "bootstrap-start" | "bootstrap-selected" | "durable-validation-start" | "durable-validation-complete" | "replacement-supervisor-start" | "replacement-supervisor-ready" | "guardian-start" | "guardian-connected" | "ui-entry" | "ui-modules-loaded" | "pi-services" | "resource-discovery" | "session-created" | "settings-loaded" | "first-input-ready-render";
3
+ export interface StartupPerformanceEvidence {
4
+ readonly profileId: "a1" | "pi";
5
+ readonly launchKind: "post-update" | "no-live-supervisor" | "warm";
6
+ readonly events: readonly StartupTraceEvent[];
7
+ }
8
+ export interface StartupTraceEvent {
9
+ readonly schema: typeof PRODUCT_IDENTITY.evidence.startupTraceSchema;
10
+ readonly traceId: string;
11
+ readonly phase: StartupPhase;
12
+ readonly elapsedMs: number;
13
+ readonly processId: number;
14
+ readonly profileId: string;
15
+ readonly releaseId: string | null;
16
+ readonly dependencyLayerIds: readonly string[];
17
+ readonly nodeVersion: string;
18
+ readonly fileReadOperations: number;
19
+ }
20
+ /** Initialize opt-in startup tracing from a caller-provided evidence path. */
21
+ export declare function initializeStartupTrace(environment: NodeJS.ProcessEnv, profileId: string, startedAtMs?: number): void;
22
+ /** Append one redacted phase event; ordinary launches without trace context perform no I/O. */
23
+ export declare function markStartupPhase(environment: NodeJS.ProcessEnv, phase: StartupPhase): Promise<void>;
24
+ export declare function assertImmutableWarmupEnvironment(environment: NodeJS.ProcessEnv): void;
25
+ /** Enable the compile cache directly from launch environment without loading profile services. */
26
+ export declare function enableEnvironmentCompileCache(environment: NodeJS.ProcessEnv): string | null;
27
+ /** Enable Node's supported persistent compile cache in an immutable-identity namespace. */
28
+ export declare function enableStartupCompileCache(dataDir: string, releaseId: string | null, dependencyLayerIds: readonly string[]): string | null;
29
+ export declare function startupCompileCachePath(dataDir: string, releaseId: string | null, dependencyLayerIds: readonly string[]): string;
30
+ /** Retain current compile namespaces plus a bounded number of recent fallbacks. */
31
+ export declare function collectCompileCaches(dataDir: string, protectedPaths: readonly string[], keepRecent?: number): Promise<void>;
32
+ export declare function assertStartupPerformanceBudget(evidence: StartupPerformanceEvidence, budgets?: {
33
+ readonly postUpdateMs: number;
34
+ readonly warmMs: number;
35
+ }): void;
36
+ export declare function parseStartupTrace(source: string): readonly StartupTraceEvent[];