@timurproko/a1 0.1.8-dev.50ebb19 → 0.1.8-dev.512

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 (869) hide show
  1. package/README.md +168 -65
  2. package/bin/activate.js +8 -0
  3. package/bin/cli.js +33 -11
  4. package/bin/guardian.js +16 -6
  5. package/bin/module-identity.js +76 -69
  6. package/bin/module-resolver.js +138 -0
  7. package/bin/pinned-pi-public.d.ts +3 -0
  8. package/bin/pinned-pi-public.js +93 -0
  9. package/bin/release-cleanup.js +8 -0
  10. package/bin/supervisor.js +2 -2
  11. package/bin/sync-pi-tui-proxy.js +7 -0
  12. package/bin/ui.js +67 -22
  13. package/bin/update-recovery.js +343 -0
  14. package/bin/warmup.js +28 -0
  15. package/dist/app/session-shell/clipboard-diagnostics.d.ts +16 -0
  16. package/dist/app/session-shell/clipboard-diagnostics.js +65 -0
  17. package/dist/app/session-shell/clipboard-image.d.ts +11 -0
  18. package/dist/app/session-shell/clipboard-image.js +38 -0
  19. package/dist/app/session-shell/editor-hyperlink-budget.d.ts +9 -0
  20. package/dist/app/session-shell/editor-hyperlink-budget.js +23 -0
  21. package/dist/app/session-shell/helper-pool.d.ts +33 -0
  22. package/dist/app/session-shell/helper-pool.js +98 -0
  23. package/dist/app/session-shell/image-preparation-client.d.ts +20 -0
  24. package/dist/app/session-shell/image-preparation-client.js +145 -0
  25. package/dist/app/session-shell/image-preparation.d.ts +18 -0
  26. package/dist/app/session-shell/image-preparation.js +126 -0
  27. package/dist/app/session-shell/image-source.d.ts +13 -0
  28. package/dist/app/session-shell/image-source.js +171 -0
  29. package/dist/app/session-shell/image-worker.d.ts +17 -0
  30. package/dist/app/session-shell/image-worker.js +23 -0
  31. package/dist/app/session-shell/index.d.ts +7 -0
  32. package/dist/app/session-shell/index.js +4 -0
  33. package/dist/app/session-shell/paste-executor.d.ts +18 -0
  34. package/dist/app/session-shell/paste-executor.js +253 -0
  35. package/dist/app/session-shell/paste-helper.js +173 -0
  36. package/dist/app/session-shell/paste-preparation-client.d.ts +31 -0
  37. package/dist/app/session-shell/paste-preparation-client.js +170 -0
  38. package/dist/app/session-shell/paste-protocol.d.ts +78 -0
  39. package/dist/app/session-shell/paste-protocol.js +18 -0
  40. package/dist/app/session-shell/paste-text-preparation.d.ts +6 -0
  41. package/dist/app/session-shell/paste-text-preparation.js +134 -0
  42. package/dist/app/session-shell/paste-text-worker.js +12 -0
  43. package/dist/app/session-shell/paste-types.d.ts +17 -0
  44. package/dist/app/session-shell/path-chip-presentation.d.ts +7 -0
  45. package/dist/app/session-shell/path-chip-presentation.js +24 -0
  46. package/dist/app/session-shell/prompt-chips.d.ts +76 -0
  47. package/dist/app/session-shell/prompt-chips.js +507 -0
  48. package/dist/app/session-shell/prompt-history-controller.d.ts +36 -0
  49. package/dist/app/session-shell/prompt-history-controller.js +170 -0
  50. package/dist/app/session-shell/prompt-suggestion-controller.d.ts +35 -0
  51. package/dist/app/session-shell/prompt-suggestion-controller.js +207 -0
  52. package/dist/app/session-shell/quit-outro-effects.d.ts +29 -0
  53. package/dist/app/session-shell/quit-outro-effects.js +242 -0
  54. package/dist/app/session-shell/quit-outro.d.ts +38 -0
  55. package/dist/app/session-shell/quit-outro.js +98 -0
  56. package/dist/app/session-shell/response-copy-coordinator.d.ts +27 -0
  57. package/dist/app/session-shell/response-copy-coordinator.js +187 -0
  58. package/dist/app/session-shell/response-copy-helper.js +122 -0
  59. package/dist/app/session-shell/response-copy-protocol.d.ts +56 -0
  60. package/dist/app/session-shell/response-copy-protocol.js +5 -0
  61. package/dist/app/session-shell/response-copy-transport.d.ts +39 -0
  62. package/dist/app/session-shell/response-copy-transport.js +217 -0
  63. package/dist/app/session-shell/session-shell-root.d.ts +265 -0
  64. package/dist/app/session-shell/session-shell-root.js +1366 -0
  65. package/dist/app/session-shell/session-shell.d.ts +59 -0
  66. package/dist/app/session-shell/session-shell.js +1917 -0
  67. package/dist/app/session-shell/session-viewport-controller.d.ts +61 -0
  68. package/dist/app/session-shell/session-viewport-controller.js +597 -0
  69. package/dist/app/session-shell/stream-presentation-coalescer.d.ts +29 -0
  70. package/dist/app/session-shell/stream-presentation-coalescer.js +79 -0
  71. package/dist/app/session-shell/system-clipboard.d.ts +20 -0
  72. package/dist/app/session-shell/system-clipboard.js +159 -0
  73. package/dist/app/session-shell/text-paste.d.ts +5 -0
  74. package/dist/app/session-shell/text-paste.js +16 -0
  75. package/dist/cli/capabilities.d.ts +6 -0
  76. package/dist/cli/capabilities.js +7 -0
  77. package/dist/cli/dispatch.d.ts +46 -0
  78. package/dist/cli/dispatch.js +261 -0
  79. package/dist/cli/index.d.ts +8 -0
  80. package/dist/cli/index.js +4 -0
  81. package/dist/cli/package-messages.d.ts +26 -0
  82. package/dist/cli/package-messages.js +71 -0
  83. package/dist/cli/packages.d.ts +32 -0
  84. package/dist/cli/packages.js +81 -0
  85. package/dist/cli/version-stats.d.ts +22 -0
  86. package/dist/cli/version-stats.js +112 -0
  87. package/dist/composition/index.d.ts +2 -0
  88. package/dist/composition/index.js +2 -0
  89. package/dist/composition/owned-ui.d.ts +37 -0
  90. package/dist/composition/owned-ui.js +136 -0
  91. package/dist/composition/settings-route-host.d.ts +7 -0
  92. package/dist/composition/settings-route-host.js +110 -0
  93. package/dist/contracts/agent-engine/capability-ports.d.ts +95 -0
  94. package/dist/contracts/agent-engine/domain-validation.js +107 -0
  95. package/dist/contracts/agent-engine/domain.d.ts +138 -0
  96. package/dist/contracts/agent-engine/index.d.ts +11 -0
  97. package/dist/contracts/agent-engine/index.js +6 -0
  98. package/dist/contracts/agent-engine/package-ports.d.ts +60 -0
  99. package/dist/contracts/agent-engine/ports.js +1 -0
  100. package/dist/contracts/owned-ui/extension-ui.d.ts +310 -0
  101. package/dist/contracts/owned-ui/image-attachments.d.ts +36 -0
  102. package/dist/contracts/owned-ui/image-attachments.js +67 -0
  103. package/dist/contracts/owned-ui/index.d.ts +12 -0
  104. package/dist/contracts/owned-ui/index.js +8 -0
  105. package/dist/contracts/owned-ui/model.d.ts +378 -0
  106. package/dist/contracts/owned-ui/prompt-history.d.ts +55 -0
  107. package/dist/contracts/owned-ui/prompt-history.js +23 -0
  108. package/dist/contracts/owned-ui/prompt-suggestions.d.ts +3 -0
  109. package/dist/contracts/owned-ui/prompt-suggestions.js +44 -0
  110. package/dist/contracts/owned-ui/suggestion-diagnostics.d.ts +22 -0
  111. package/dist/contracts/owned-ui/suggestion-diagnostics.js +9 -0
  112. package/dist/contracts/owned-ui/transcript-lifecycle.d.ts +5 -0
  113. package/dist/contracts/owned-ui/transcript-lifecycle.js +33 -0
  114. package/dist/contracts/owned-ui/validation.d.ts +15 -0
  115. package/dist/contracts/owned-ui/validation.js +523 -0
  116. package/dist/contracts/presentation/index.d.ts +104 -0
  117. package/dist/features/launch/development-launch.js +36 -0
  118. package/dist/features/launch/index.d.ts +12 -0
  119. package/dist/features/launch/index.js +6 -0
  120. package/dist/features/launch/intent.d.ts +12 -0
  121. package/dist/features/launch/intent.js +8 -0
  122. package/dist/features/launch/prepare-launch.d.ts +11 -0
  123. package/dist/features/launch/prepare-launch.js +14 -0
  124. package/dist/features/launch/profile-paths.d.ts +16 -0
  125. package/dist/features/launch/profile-paths.js +36 -0
  126. package/dist/features/launch/runtime-selection.d.ts +16 -0
  127. package/dist/features/launch/runtime-selection.js +13 -0
  128. package/dist/features/owned-ui/index.d.ts +6 -0
  129. package/dist/features/owned-ui/index.js +4 -0
  130. package/dist/features/owned-ui/project-trust-prompt.d.ts +25 -0
  131. package/dist/features/owned-ui/project-trust-prompt.js +149 -0
  132. package/dist/features/owned-ui/run.d.ts +17 -0
  133. package/dist/features/owned-ui/run.js +64 -0
  134. package/dist/features/owned-ui/session-fork-prompt.d.ts +8 -0
  135. package/dist/features/owned-ui/session-fork-prompt.js +34 -0
  136. package/dist/features/owned-ui/settings-app.d.ts +21 -0
  137. package/dist/features/owned-ui/settings-app.js +807 -0
  138. package/dist/features/owned-ui/settings-route.d.ts +2 -0
  139. package/dist/features/owned-ui/settings-route.js +2 -0
  140. package/dist/features/prompt-history/image-sidecar.d.ts +32 -0
  141. package/dist/features/prompt-history/image-sidecar.js +130 -0
  142. package/dist/features/prompt-history/index.d.ts +4 -0
  143. package/dist/features/prompt-history/index.js +3 -0
  144. package/dist/features/prompt-history/paths.d.ts +5 -0
  145. package/dist/features/prompt-history/paths.js +17 -0
  146. package/dist/features/prompt-history/service.d.ts +54 -0
  147. package/dist/features/prompt-history/service.js +425 -0
  148. package/dist/features/prompt-history/store.d.ts +16 -0
  149. package/dist/features/prompt-history/store.js +219 -0
  150. package/dist/features/prompt-history/worker.d.ts +9 -0
  151. package/dist/features/prompt-history/worker.js +45 -0
  152. package/dist/features/prompt-suggestions/diagnostics.d.ts +18 -0
  153. package/dist/features/prompt-suggestions/diagnostics.js +82 -0
  154. package/dist/features/prompt-suggestions/index.d.ts +2 -0
  155. package/dist/features/prompt-suggestions/index.js +1 -0
  156. package/dist/foundation/launch-context/index.d.ts +59 -0
  157. package/dist/foundation/launch-context/index.js +136 -0
  158. package/dist/foundation/launch-guardian/index.d.ts +2 -0
  159. package/dist/foundation/launch-guardian/index.js +1 -0
  160. package/dist/foundation/launch-guardian/main.d.ts +33 -0
  161. package/dist/foundation/launch-guardian/main.js +180 -0
  162. package/dist/foundation/lifecycle/commands.js +1 -0
  163. package/dist/foundation/lifecycle/index.d.ts +11 -0
  164. package/dist/foundation/lifecycle/index.js +5 -0
  165. package/dist/foundation/lifecycle/model.d.ts +64 -0
  166. package/dist/foundation/lifecycle/model.js +40 -0
  167. package/dist/foundation/lifecycle/paths.d.ts +30 -0
  168. package/dist/foundation/lifecycle/paths.js +70 -0
  169. package/dist/foundation/lifecycle/session-selection.d.ts +9 -0
  170. package/dist/foundation/lifecycle/session-selection.js +39 -0
  171. package/dist/foundation/lifecycle/supervisor-startup.d.ts +30 -0
  172. package/dist/foundation/lifecycle/supervisor-startup.js +106 -0
  173. package/dist/foundation/process-containment/darwin-process-inspector.d.ts +5 -0
  174. package/dist/foundation/process-containment/darwin-process-inspector.js +7 -0
  175. package/dist/foundation/process-containment/index.d.ts +8 -0
  176. package/dist/foundation/process-containment/index.js +6 -0
  177. package/dist/foundation/process-containment/linux-process-inspector.d.ts +7 -0
  178. package/dist/foundation/process-containment/linux-process-inspector.js +27 -0
  179. package/dist/foundation/process-containment/native-guardian-containment.d.ts +17 -0
  180. package/dist/foundation/process-containment/native-guardian-containment.js +140 -0
  181. package/dist/foundation/process-containment/windows-process-inspector.d.ts +19 -0
  182. package/dist/foundation/process-containment/windows-process-inspector.js +56 -0
  183. package/dist/foundation/protocol/client.d.ts +18 -0
  184. package/dist/foundation/protocol/client.js +130 -0
  185. package/dist/foundation/protocol/index.d.ts +3 -0
  186. package/dist/foundation/protocol/index.js +2 -0
  187. package/dist/foundation/protocol/messages.d.ts +90 -0
  188. package/dist/foundation/protocol/messages.js +100 -0
  189. package/dist/foundation/release/bootstrap.d.ts +51 -0
  190. package/dist/foundation/release/bootstrap.js +427 -0
  191. package/dist/foundation/release/cohort-state.d.ts +157 -0
  192. package/dist/foundation/release/cohort-state.js +472 -0
  193. package/dist/foundation/release/dependency-certification-retention.d.ts +7 -0
  194. package/dist/foundation/release/dependency-certification-retention.js +88 -0
  195. package/dist/foundation/release/dependency-certification.d.ts +24 -0
  196. package/dist/foundation/release/dependency-certification.js +266 -0
  197. package/dist/foundation/release/dependency-layer.d.ts +78 -0
  198. package/dist/foundation/release/dependency-layer.js +466 -0
  199. package/dist/foundation/release/endpoints.d.ts +24 -0
  200. package/dist/foundation/release/endpoints.js +134 -0
  201. package/dist/foundation/release/immutable-platform.d.ts +6 -0
  202. package/dist/foundation/release/immutable-platform.js +13 -0
  203. package/dist/foundation/release/index.d.ts +32 -0
  204. package/dist/foundation/release/index.js +17 -0
  205. package/dist/foundation/release/release-gc.d.ts +71 -0
  206. package/dist/foundation/release/release-gc.js +764 -0
  207. package/dist/foundation/release/release-store.d.ts +49 -0
  208. package/dist/foundation/release/release-store.js +235 -0
  209. package/dist/foundation/release/release.d.ts +43 -0
  210. package/dist/foundation/release/release.js +215 -0
  211. package/dist/foundation/release/restart-certification.d.ts +68 -0
  212. package/dist/foundation/release/restart-certification.js +227 -0
  213. package/dist/foundation/release/types.d.ts +11 -0
  214. package/dist/foundation/release/types.js +1 -0
  215. package/dist/foundation/release/update-activation.d.ts +72 -0
  216. package/dist/foundation/release/update-activation.js +204 -0
  217. package/dist/foundation/release/update-launch.d.ts +6 -0
  218. package/dist/foundation/release/update-launch.js +17 -0
  219. package/dist/foundation/release/update-recovery.d.ts +76 -0
  220. package/dist/foundation/release/update-recovery.js +356 -0
  221. package/dist/foundation/release/update-transaction.d.ts +42 -0
  222. package/dist/foundation/release/update-transaction.js +101 -0
  223. package/dist/foundation/release/update.d.ts +114 -0
  224. package/dist/foundation/release/update.js +633 -0
  225. package/dist/foundation/release/warmup.d.ts +3 -0
  226. package/dist/foundation/release/warmup.js +47 -0
  227. package/dist/foundation/startup/index.d.ts +4 -0
  228. package/dist/foundation/startup/index.js +2 -0
  229. package/dist/foundation/startup/startup-budget.d.ts +46 -0
  230. package/dist/foundation/startup/startup-budget.js +42 -0
  231. package/dist/foundation/startup/startup-descriptor.js +34 -0
  232. package/dist/foundation/startup/startup-runtime.d.ts +27 -0
  233. package/dist/foundation/startup/startup-runtime.js +128 -0
  234. package/dist/foundation/storage/control-store.d.ts +18 -0
  235. package/dist/foundation/storage/control-store.js +342 -0
  236. package/dist/foundation/storage/index.d.ts +1 -0
  237. package/dist/foundation/storage/index.js +1 -0
  238. package/dist/foundation/supervision/index.d.ts +3 -0
  239. package/dist/foundation/supervision/index.js +3 -0
  240. package/dist/foundation/supervision/main.d.ts +1 -0
  241. package/dist/foundation/supervision/main.js +84 -0
  242. package/dist/foundation/supervision/paths.d.ts +1 -0
  243. package/dist/foundation/supervision/paths.js +1 -0
  244. package/dist/foundation/supervision/server.d.ts +46 -0
  245. package/dist/foundation/supervision/server.js +573 -0
  246. package/dist/foundation/terminal-cleanup/fatal-exit.d.ts +12 -0
  247. package/dist/foundation/terminal-cleanup/fatal-exit.js +87 -0
  248. package/dist/foundation/terminal-cleanup/index.d.ts +3 -0
  249. package/dist/foundation/terminal-cleanup/index.js +2 -0
  250. package/dist/foundation/terminal-cleanup/terminal-reset.d.ts +4 -0
  251. package/dist/foundation/terminal-cleanup/terminal-reset.js +40 -0
  252. package/dist/integrations/pi/components/components.d.ts +4 -0
  253. package/dist/integrations/pi/components/components.js +64 -0
  254. package/dist/integrations/pi/components/conformance.d.ts +18 -0
  255. package/dist/integrations/pi/components/conformance.js +70 -0
  256. package/dist/integrations/pi/components/editor-interaction.d.ts +38 -0
  257. package/dist/integrations/pi/components/editor-interaction.js +1 -0
  258. package/dist/integrations/pi/components/history-editor-loader.d.ts +5 -0
  259. package/dist/integrations/pi/components/history-editor-loader.js +5 -0
  260. package/dist/integrations/pi/components/index.d.ts +21 -0
  261. package/dist/integrations/pi/components/index.js +13 -0
  262. package/dist/integrations/pi/components/owned-editor-ux.d.ts +74 -0
  263. package/dist/integrations/pi/components/owned-editor-ux.js +1094 -0
  264. package/dist/integrations/pi/components/path-word-ranges.d.ts +2 -0
  265. package/dist/integrations/pi/components/path-word-ranges.js +37 -0
  266. package/dist/integrations/pi/components/prompt-input-port.d.ts +18 -0
  267. package/dist/integrations/pi/components/prompt-input-port.js +1 -0
  268. package/dist/integrations/pi/components/resources/builtin-themes.d.ts +167 -0
  269. package/dist/integrations/pi/components/resources/builtin-themes.js +168 -0
  270. package/dist/integrations/pi/components/shell-components.d.ts +7 -0
  271. package/dist/integrations/pi/components/shell-components.js +7 -0
  272. package/dist/integrations/pi/components/shell-editor-autocomplete.js +298 -0
  273. package/dist/integrations/pi/components/shell-extension-ui.d.ts +35 -0
  274. package/dist/integrations/pi/components/shell-extension-ui.js +280 -0
  275. package/dist/integrations/pi/components/shell-footer-status.d.ts +7 -0
  276. package/dist/integrations/pi/components/shell-footer-status.js +248 -0
  277. package/dist/integrations/pi/components/shell-presenters-info.d.ts +43 -0
  278. package/dist/integrations/pi/components/shell-presenters-info.js +114 -0
  279. package/dist/integrations/pi/components/shell-presenters-transcript.d.ts +29 -0
  280. package/dist/integrations/pi/components/shell-presenters-transcript.js +433 -0
  281. package/dist/integrations/pi/components/shell-selectors-dialogs.d.ts +123 -0
  282. package/dist/integrations/pi/components/shell-selectors-dialogs.js +242 -0
  283. package/dist/integrations/pi/components/shell-shared-facade.d.ts +217 -0
  284. package/dist/integrations/pi/components/shell-shared-facade.js +92 -0
  285. package/dist/integrations/pi/components/submitted-prompt-adapter.d.ts +17 -0
  286. package/dist/integrations/pi/components/submitted-prompt-adapter.js +49 -0
  287. package/dist/integrations/pi/components/tool-image-presentation.d.ts +21 -0
  288. package/dist/integrations/pi/components/tool-image-presentation.js +83 -0
  289. package/dist/integrations/pi/components/tool-result-adapter.d.ts +6 -0
  290. package/dist/integrations/pi/components/tool-result-adapter.js +27 -0
  291. package/dist/integrations/pi/components/transcript-image-resolver.d.ts +7 -0
  292. package/dist/integrations/pi/components/transcript-image-resolver.js +19 -0
  293. package/dist/integrations/pi/components/upstream/adjacent/core/keybindings.d.ts +445 -0
  294. package/dist/integrations/pi/components/upstream/adjacent/core/keybindings.js +370 -0
  295. package/dist/integrations/pi/components/upstream/assets/earendil-image.json +12 -0
  296. package/dist/integrations/pi/components/upstream/components/countdown-timer.d.ts +13 -0
  297. package/dist/integrations/pi/components/upstream/components/daxnuts.d.ts +29 -0
  298. package/dist/integrations/pi/components/upstream/components/daxnuts.js +146 -0
  299. package/dist/integrations/pi/components/upstream/components/earendil-announcement.d.ts +4 -0
  300. package/dist/integrations/pi/components/upstream/components/earendil-announcement.js +48 -0
  301. package/dist/integrations/pi/components/upstream/components/extension-editor.d.ts +20 -0
  302. package/dist/integrations/pi/components/upstream/components/extension-editor.js +84 -0
  303. package/dist/integrations/pi/components/upstream/components/mermaid.js +81 -0
  304. package/dist/integrations/pi/components/upstream/components/owned-editor.d.ts +46 -0
  305. package/dist/integrations/pi/components/upstream/components/owned-editor.js +187 -0
  306. package/dist/integrations/pi/components/upstream/components/scoped-models-selector.d.ts +59 -0
  307. package/dist/integrations/pi/components/upstream/components/scoped-models-selector.js +346 -0
  308. package/dist/integrations/pi/components/upstream/components/session-footer.d.ts +11 -0
  309. package/dist/integrations/pi/components/upstream/components/session-footer.js +123 -0
  310. package/dist/integrations/pi/components/upstream/components/session-selector-search.js +161 -0
  311. package/dist/integrations/pi/components/upstream/components/session-selector.d.ts +95 -0
  312. package/dist/integrations/pi/components/upstream/components/session-selector.js +893 -0
  313. package/dist/integrations/pi/components/upstream/components/skill-invocation-message.d.ts +21 -0
  314. package/dist/integrations/pi/components/upstream/components/skill-invocation-message.js +46 -0
  315. package/dist/integrations/pi/components/upstream/components/status-indicator.d.ts +35 -0
  316. package/dist/integrations/pi/components/upstream/components/status-indicator.js +69 -0
  317. package/dist/integrations/pi/components/upstream/components/tool-execution.d.ts +67 -0
  318. package/dist/integrations/pi/components/upstream/components/tool-execution.js +365 -0
  319. package/dist/integrations/pi/components/upstream/components/tree-selector.d.ts +101 -0
  320. package/dist/integrations/pi/components/upstream/components/tree-selector.js +1275 -0
  321. package/dist/integrations/pi/components/upstream/components/trust-selector.d.ts +33 -0
  322. package/dist/integrations/pi/components/upstream/components/trust-selector.js +81 -0
  323. package/dist/integrations/pi/components/upstream/external-editor.js +43 -0
  324. package/dist/integrations/pi/components/upstream/history/editor-core.d.ts +289 -0
  325. package/dist/integrations/pi/components/upstream/history/editor-core.js +2144 -0
  326. package/dist/integrations/pi/components/upstream/history/kill-ring.d.ts +35 -0
  327. package/dist/integrations/pi/components/upstream/history/kill-ring.js +51 -0
  328. package/dist/integrations/pi/components/upstream/history/printable-key.d.ts +1 -0
  329. package/dist/integrations/pi/components/upstream/history/printable-key.js +43 -0
  330. package/dist/integrations/pi/components/upstream/history/text-helpers.d.ts +14 -0
  331. package/dist/integrations/pi/components/upstream/history/text-helpers.js +31 -0
  332. package/dist/integrations/pi/components/upstream/history/undo-stack.d.ts +25 -0
  333. package/dist/integrations/pi/components/upstream/history/undo-stack.js +39 -0
  334. package/dist/integrations/pi/components/upstream/history/word-navigation.d.ts +24 -0
  335. package/dist/integrations/pi/components/upstream/history/word-navigation.js +103 -0
  336. package/dist/integrations/pi/components/upstream/model-search.d.ts +18 -0
  337. package/dist/integrations/pi/components/upstream/theme/theme-controller.d.ts +33 -0
  338. package/dist/integrations/pi/components/upstream/theme/theme-controller.js +114 -0
  339. package/dist/integrations/pi/components/upstream/theme/theme.d.ts +61 -0
  340. package/dist/integrations/pi/components/upstream/theme/theme.js +337 -0
  341. package/dist/integrations/pi/engine/adapter.d.ts +135 -0
  342. package/dist/integrations/pi/engine/adapter.js +648 -0
  343. package/dist/integrations/pi/engine/changelog.d.ts +2 -0
  344. package/dist/integrations/pi/engine/changelog.js +63 -0
  345. package/dist/integrations/pi/engine/command-dispatch.d.ts +41 -0
  346. package/dist/integrations/pi/engine/command-dispatch.js +125 -0
  347. package/dist/integrations/pi/engine/compaction-progress.d.ts +28 -0
  348. package/dist/integrations/pi/engine/compaction-progress.js +96 -0
  349. package/dist/integrations/pi/engine/conformance.d.ts +39 -0
  350. package/dist/integrations/pi/engine/conformance.js +140 -0
  351. package/dist/integrations/pi/engine/event-delivery.d.ts +100 -0
  352. package/dist/integrations/pi/engine/event-delivery.js +184 -0
  353. package/dist/integrations/pi/engine/extension-ui-binding.d.ts +35 -0
  354. package/dist/integrations/pi/engine/extension-ui-binding.js +81 -0
  355. package/dist/integrations/pi/engine/http-dispatcher.d.ts +4 -0
  356. package/dist/integrations/pi/engine/http-dispatcher.js +25 -0
  357. package/dist/integrations/pi/engine/index.d.ts +18 -0
  358. package/dist/integrations/pi/engine/index.js +10 -0
  359. package/dist/integrations/pi/engine/message-values.d.ts +29 -0
  360. package/dist/integrations/pi/engine/message-values.js +168 -0
  361. package/dist/integrations/pi/engine/package-integration.d.ts +13 -0
  362. package/dist/integrations/pi/engine/package-integration.js +118 -0
  363. package/dist/integrations/pi/engine/pending-delivery.d.ts +30 -0
  364. package/dist/integrations/pi/engine/pending-delivery.js +156 -0
  365. package/dist/integrations/pi/engine/pi-settings-metadata.json +385 -0
  366. package/dist/integrations/pi/engine/project-trust-preflight.d.ts +22 -0
  367. package/dist/integrations/pi/engine/project-trust-preflight.js +50 -0
  368. package/dist/integrations/pi/engine/prompt-suggestions.d.ts +30 -0
  369. package/dist/integrations/pi/engine/prompt-suggestions.js +102 -0
  370. package/dist/integrations/pi/engine/provider-authentication.d.ts +34 -0
  371. package/dist/integrations/pi/engine/provider-authentication.js +209 -0
  372. package/dist/integrations/pi/engine/resource-catalog.d.ts +49 -0
  373. package/dist/integrations/pi/engine/resource-catalog.js +289 -0
  374. package/dist/integrations/pi/engine/resources/changelog.json +12 -0
  375. package/dist/integrations/pi/engine/runtime-integration.d.ts +53 -0
  376. package/dist/integrations/pi/engine/runtime-integration.js +118 -0
  377. package/dist/integrations/pi/engine/session-events.d.ts +48 -0
  378. package/dist/integrations/pi/engine/session-events.js +223 -0
  379. package/dist/integrations/pi/engine/session-integration.d.ts +67 -0
  380. package/dist/integrations/pi/engine/session-integration.js +195 -0
  381. package/dist/integrations/pi/engine/session-runtime.d.ts +84 -0
  382. package/dist/integrations/pi/engine/session-runtime.js +249 -0
  383. package/dist/integrations/pi/engine/session-selection.d.ts +28 -0
  384. package/dist/integrations/pi/engine/session-selection.js +90 -0
  385. package/dist/integrations/pi/engine/settings-bridge.d.ts +121 -0
  386. package/dist/integrations/pi/engine/settings-bridge.js +514 -0
  387. package/dist/integrations/pi/engine/settings-metadata.d.ts +31 -0
  388. package/dist/integrations/pi/engine/settings-metadata.js +67 -0
  389. package/dist/integrations/pi/engine/settings-port.d.ts +42 -0
  390. package/dist/integrations/pi/engine/settings-port.js +353 -0
  391. package/dist/integrations/pi/engine/tool-rendering.d.ts +13 -0
  392. package/dist/integrations/pi/engine/tool-rendering.js +145 -0
  393. package/dist/integrations/pi/engine/transcript-image-assets.d.ts +11 -0
  394. package/dist/integrations/pi/engine/transcript-image-assets.js +86 -0
  395. package/dist/integrations/pi/engine/transcript-projection.d.ts +39 -0
  396. package/dist/integrations/pi/engine/transcript-projection.js +405 -0
  397. package/dist/integrations/pi/engine/usage-view.d.ts +4 -0
  398. package/dist/integrations/pi/engine/usage-view.js +56 -0
  399. package/dist/integrations/pi/engine/windows-filesystem-hygiene.d.ts +21 -0
  400. package/dist/integrations/pi/engine/windows-filesystem-hygiene.js +55 -0
  401. package/dist/integrations/pi/engine/workflow-contexts.d.ts +59 -0
  402. package/dist/integrations/pi/engine/workflow-contexts.js +316 -0
  403. package/dist/integrations/pi/engine/workflow-runner.d.ts +60 -0
  404. package/dist/integrations/pi/engine/workflow-runner.js +509 -0
  405. package/dist/integrations/pi/engine/workflow-support.d.ts +33 -0
  406. package/dist/integrations/pi/engine/workflow-support.js +352 -0
  407. package/dist/integrations/pi/engine/workflows.d.ts +251 -0
  408. package/dist/integrations/pi/engine/workflows.js +63 -0
  409. package/dist/integrations/pi/startup-public.d.ts +2 -0
  410. package/dist/integrations/pi/startup-public.js +2223 -0
  411. package/dist/integrations/pi/startup-public.manifest.json +12502 -0
  412. package/dist/integrations/pi/tui-runtime/adapter.d.ts +56 -0
  413. package/dist/integrations/pi/tui-runtime/adapter.js +783 -0
  414. package/dist/integrations/pi/tui-runtime/contracts.d.ts +156 -0
  415. package/dist/integrations/pi/tui-runtime/contracts.js +1 -0
  416. package/dist/integrations/pi/tui-runtime/damage-aware-terminal.d.ts +88 -0
  417. package/dist/integrations/pi/tui-runtime/damage-aware-terminal.js +433 -0
  418. package/dist/integrations/pi/tui-runtime/index.d.ts +9 -0
  419. package/dist/integrations/pi/tui-runtime/index.js +5 -0
  420. package/dist/integrations/pi/tui-runtime/input-presentation-coordinator.d.ts +39 -0
  421. package/dist/integrations/pi/tui-runtime/input-presentation-coordinator.js +139 -0
  422. package/dist/integrations/pi/tui-runtime/mouse-report-input.d.ts +13 -0
  423. package/dist/integrations/pi/tui-runtime/mouse-report-input.js +57 -0
  424. package/dist/integrations/pi/tui-runtime/overlay-geometry.d.ts +32 -0
  425. package/dist/integrations/pi/tui-runtime/overlay-geometry.js +158 -0
  426. package/dist/integrations/pi/tui-runtime/presentation-adapter.d.ts +4 -0
  427. package/dist/integrations/pi/tui-runtime/presentation-adapter.js +48 -0
  428. package/dist/native/darwin-arm64/manifest.json +4 -4
  429. package/dist/native/darwin-arm64/process-guardian +0 -0
  430. package/dist/native/linux-x64/manifest.json +3 -3
  431. package/dist/native/linux-x64/process-guardian +0 -0
  432. package/dist/native/win32-x64/manifest.json +3 -3
  433. package/dist/native/win32-x64/process-guardian.exe +0 -0
  434. package/dist/product-identity.d.ts +37 -0
  435. package/dist/product-identity.js +119 -0
  436. package/dist/product-identity.json +85 -0
  437. package/dist/runtime-payload-inventory.json +127148 -0
  438. package/dist/ui/apps/contracts.d.ts +64 -0
  439. package/dist/ui/apps/host.d.ts +42 -0
  440. package/dist/ui/apps/host.js +156 -0
  441. package/dist/ui/apps/index.d.ts +5 -0
  442. package/dist/ui/apps/index.js +3 -0
  443. package/dist/ui/apps/registry.d.ts +12 -0
  444. package/dist/ui/apps/registry.js +33 -0
  445. package/dist/ui/components/dialog-panel.js +49 -0
  446. package/dist/ui/components/frame.d.ts +22 -0
  447. package/dist/ui/components/frame.js +55 -0
  448. package/dist/ui/components/index.d.ts +47 -0
  449. package/dist/ui/components/index.js +25 -0
  450. package/dist/ui/components/line-input.d.ts +68 -0
  451. package/dist/ui/components/line-input.js +224 -0
  452. package/dist/ui/components/list-view.d.ts +60 -0
  453. package/dist/ui/components/list-view.js +82 -0
  454. package/dist/ui/components/mouse.d.ts +25 -0
  455. package/dist/ui/components/mouse.js +70 -0
  456. package/dist/ui/components/progress-status.d.ts +2 -0
  457. package/dist/ui/components/progress-status.js +4 -0
  458. package/dist/ui/components/prompt-input.d.ts +32 -0
  459. package/dist/ui/components/prompt-input.js +51 -0
  460. package/dist/ui/components/scrollbar.d.ts +88 -0
  461. package/dist/ui/components/scrollbar.js +137 -0
  462. package/dist/ui/components/selection-copy.d.ts +24 -0
  463. package/dist/ui/components/selection-copy.js +39 -0
  464. package/dist/ui/components/shortcuts.d.ts +58 -0
  465. package/dist/ui/components/shortcuts.js +82 -0
  466. package/dist/ui/components/spans.d.ts +28 -0
  467. package/dist/ui/components/spans.js +266 -0
  468. package/dist/ui/components/submitted-prompt.d.ts +23 -0
  469. package/dist/ui/components/submitted-prompt.js +50 -0
  470. package/dist/ui/components/surface.d.ts +20 -0
  471. package/dist/ui/components/surface.js +44 -0
  472. package/dist/ui/components/text-selection.d.ts +62 -0
  473. package/dist/ui/components/text-selection.js +210 -0
  474. package/dist/ui/components/text.d.ts +38 -0
  475. package/dist/ui/components/text.js +185 -0
  476. package/dist/ui/components/transcript-viewport.d.ts +173 -0
  477. package/dist/ui/components/transcript-viewport.js +753 -0
  478. package/dist/ui/components/visible-hyperlinks.d.ts +26 -0
  479. package/dist/ui/components/visible-hyperlinks.js +97 -0
  480. package/dist/ui/settings/declarations.d.ts +141 -0
  481. package/dist/ui/settings/declarations.js +135 -0
  482. package/dist/ui/settings/index.d.ts +10 -0
  483. package/dist/ui/settings/index.js +5 -0
  484. package/dist/ui/settings/manager.d.ts +54 -0
  485. package/dist/ui/settings/manager.js +256 -0
  486. package/dist/ui/settings/migrations.d.ts +13 -0
  487. package/dist/ui/settings/migrations.js +74 -0
  488. package/dist/ui/settings/sections.d.ts +52 -0
  489. package/dist/ui/settings/sections.js +112 -0
  490. package/docs/architecture/boundaries.md +17 -13
  491. package/docs/architecture/code-documentation.md +77 -0
  492. package/docs/architecture/history-editor-provenance.md +100 -0
  493. package/docs/architecture/internal-naming.md +93 -0
  494. package/docs/architecture/process-guardian-provenance.md +3 -1
  495. package/docs/architecture/project-structure.md +69 -30
  496. package/docs/architecture/prompt-suggestions.md +68 -0
  497. package/docs/architecture/resource-and-data-policy.md +28 -2
  498. package/docs/architecture/response-copy-delivery.md +85 -0
  499. package/docs/architecture/terminal-host-proof-gate.md +1 -1
  500. package/docs/architecture/terminal-host-spike-evidence.md +1 -1
  501. package/docs/architecture/tool-image-presentation.md +62 -0
  502. package/docs/architecture/toolchain.md +32 -10
  503. package/docs/architecture/ui-reference-provenance.md +60 -6
  504. package/docs/ci-release-runbook.md +256 -79
  505. package/docs/features/launch-profiles.md +24 -17
  506. package/docs/features/modal-content-interaction.md +37 -0
  507. package/docs/features/prompt-history.md +149 -0
  508. package/docs/local-worktree-cleanup.md +212 -0
  509. package/docs/manual-code-streaming-cleanup.md +88 -0
  510. package/docs/manual-ghost-link-baseline.md +89 -0
  511. package/docs/manual-launch-instance-acceptance.md +12 -35
  512. package/docs/manual-owned-ui-checkpoint.md +79 -0
  513. package/docs/manual-pi-boundary-candidate.md +4 -5
  514. package/docs/manual-terminal-colour-check.md +4 -3
  515. package/docs/openspec-archive-automation.md +259 -0
  516. package/docs/repository-governance-live-acceptance.md +77 -0
  517. package/docs/validation.md +100 -0
  518. package/package.json +52 -34
  519. package/dist/src/cli/capabilities.d.ts +0 -15
  520. package/dist/src/cli/capabilities.js +0 -7
  521. package/dist/src/cli/dispatch.d.ts +0 -32
  522. package/dist/src/cli/dispatch.js +0 -142
  523. package/dist/src/cli/index.d.ts +0 -5
  524. package/dist/src/cli/index.js +0 -5
  525. package/dist/src/cli/packages.d.ts +0 -23
  526. package/dist/src/cli/packages.js +0 -84
  527. package/dist/src/cli/version-stats.d.ts +0 -16
  528. package/dist/src/cli/version-stats.js +0 -72
  529. package/dist/src/cli/version.d.ts +0 -2
  530. package/dist/src/cli/version.js +0 -23
  531. package/dist/src/composition/index.d.ts +0 -48
  532. package/dist/src/composition/index.js +0 -258
  533. package/dist/src/features/launch/development-launch.js +0 -28
  534. package/dist/src/features/launch/index.d.ts +0 -7
  535. package/dist/src/features/launch/index.js +0 -7
  536. package/dist/src/features/launch/intent.d.ts +0 -7
  537. package/dist/src/features/launch/intent.js +0 -4
  538. package/dist/src/features/launch/prepare-launch.d.ts +0 -13
  539. package/dist/src/features/launch/prepare-launch.js +0 -21
  540. package/dist/src/features/launch/profile-paths.d.ts +0 -15
  541. package/dist/src/features/launch/profile-paths.js +0 -31
  542. package/dist/src/features/launch/profiles.d.ts +0 -12
  543. package/dist/src/features/launch/profiles.js +0 -26
  544. package/dist/src/features/launch/runtime-selection.d.ts +0 -19
  545. package/dist/src/features/launch/runtime-selection.js +0 -13
  546. package/dist/src/features/owned-ui/customization.d.ts +0 -38
  547. package/dist/src/features/owned-ui/customization.js +0 -108
  548. package/dist/src/features/owned-ui/diagnostics.d.ts +0 -33
  549. package/dist/src/features/owned-ui/diagnostics.js +0 -94
  550. package/dist/src/features/owned-ui/index.d.ts +0 -4
  551. package/dist/src/features/owned-ui/index.js +0 -4
  552. package/dist/src/features/owned-ui/run.d.ts +0 -11
  553. package/dist/src/features/owned-ui/run.js +0 -15
  554. package/dist/src/features/owned-ui/settings-app.d.ts +0 -22
  555. package/dist/src/features/owned-ui/settings-app.js +0 -633
  556. package/dist/src/features/workspace/capabilities.d.ts +0 -31
  557. package/dist/src/features/workspace/capabilities.js +0 -75
  558. package/dist/src/features/workspace/index.d.ts +0 -6
  559. package/dist/src/features/workspace/index.js +0 -6
  560. package/dist/src/features/workspace/presentation.d.ts +0 -30
  561. package/dist/src/features/workspace/presentation.js +0 -70
  562. package/dist/src/features/workspace/reconciliation.d.ts +0 -15
  563. package/dist/src/features/workspace/reconciliation.js +0 -82
  564. package/dist/src/features/workspace/reducer.d.ts +0 -42
  565. package/dist/src/features/workspace/reducer.js +0 -213
  566. package/dist/src/features/workspace/router.d.ts +0 -31
  567. package/dist/src/features/workspace/router.js +0 -124
  568. package/dist/src/features/workspace/store.d.ts +0 -17
  569. package/dist/src/features/workspace/store.js +0 -54
  570. package/dist/src/foundation/agent-engine-contracts/capability-ports.d.ts +0 -95
  571. package/dist/src/foundation/agent-engine-contracts/domain-validation.js +0 -89
  572. package/dist/src/foundation/agent-engine-contracts/domain.d.ts +0 -116
  573. package/dist/src/foundation/agent-engine-contracts/index.d.ts +0 -8
  574. package/dist/src/foundation/agent-engine-contracts/index.js +0 -8
  575. package/dist/src/foundation/agent-engine-contracts/package-ports.d.ts +0 -54
  576. package/dist/src/foundation/launch-guardian/index.d.ts +0 -1
  577. package/dist/src/foundation/launch-guardian/index.js +0 -1
  578. package/dist/src/foundation/launch-guardian/main.d.ts +0 -31
  579. package/dist/src/foundation/launch-guardian/main.js +0 -165
  580. package/dist/src/foundation/lifecycle/index.d.ts +0 -4
  581. package/dist/src/foundation/lifecycle/index.js +0 -4
  582. package/dist/src/foundation/lifecycle/model.d.ts +0 -64
  583. package/dist/src/foundation/lifecycle/model.js +0 -40
  584. package/dist/src/foundation/lifecycle/paths.d.ts +0 -10
  585. package/dist/src/foundation/lifecycle/paths.js +0 -42
  586. package/dist/src/foundation/native-host-protocol/codec.d.ts +0 -11
  587. package/dist/src/foundation/native-host-protocol/codec.js +0 -56
  588. package/dist/src/foundation/native-host-protocol/evidence.d.ts +0 -67
  589. package/dist/src/foundation/native-host-protocol/evidence.js +0 -141
  590. package/dist/src/foundation/native-host-protocol/index.d.ts +0 -4
  591. package/dist/src/foundation/native-host-protocol/index.js +0 -4
  592. package/dist/src/foundation/native-host-protocol/messages.d.ts +0 -56
  593. package/dist/src/foundation/native-host-protocol/messages.js +0 -149
  594. package/dist/src/foundation/native-host-protocol/proof-gate.d.ts +0 -13
  595. package/dist/src/foundation/native-host-protocol/proof-gate.js +0 -33
  596. package/dist/src/foundation/owned-ui-contracts/extension-ui.d.ts +0 -302
  597. package/dist/src/foundation/owned-ui-contracts/index.d.ts +0 -3
  598. package/dist/src/foundation/owned-ui-contracts/index.js +0 -3
  599. package/dist/src/foundation/owned-ui-contracts/model.d.ts +0 -241
  600. package/dist/src/foundation/owned-ui-contracts/validation.d.ts +0 -11
  601. package/dist/src/foundation/owned-ui-contracts/validation.js +0 -395
  602. package/dist/src/foundation/owned-ui-settings/declarations.d.ts +0 -13
  603. package/dist/src/foundation/owned-ui-settings/declarations.js +0 -39
  604. package/dist/src/foundation/owned-ui-settings/index.d.ts +0 -6
  605. package/dist/src/foundation/owned-ui-settings/index.js +0 -6
  606. package/dist/src/foundation/owned-ui-settings/migrations.d.ts +0 -13
  607. package/dist/src/foundation/owned-ui-settings/migrations.js +0 -28
  608. package/dist/src/foundation/owned-ui-settings/sections.d.ts +0 -70
  609. package/dist/src/foundation/owned-ui-settings/sections.js +0 -93
  610. package/dist/src/foundation/owned-ui-settings/session.d.ts +0 -44
  611. package/dist/src/foundation/owned-ui-settings/session.js +0 -145
  612. package/dist/src/foundation/owned-ui-settings/store.d.ts +0 -28
  613. package/dist/src/foundation/owned-ui-settings/store.js +0 -90
  614. package/dist/src/foundation/pi-component-adapter/components.d.ts +0 -4
  615. package/dist/src/foundation/pi-component-adapter/components.js +0 -64
  616. package/dist/src/foundation/pi-component-adapter/conformance.d.ts +0 -17
  617. package/dist/src/foundation/pi-component-adapter/conformance.js +0 -69
  618. package/dist/src/foundation/pi-component-adapter/index.d.ts +0 -13
  619. package/dist/src/foundation/pi-component-adapter/index.js +0 -13
  620. package/dist/src/foundation/pi-component-adapter/resources/builtin-themes.d.ts +0 -165
  621. package/dist/src/foundation/pi-component-adapter/resources/builtin-themes.js +0 -166
  622. package/dist/src/foundation/pi-component-adapter/shell-components.d.ts +0 -6
  623. package/dist/src/foundation/pi-component-adapter/shell-components.js +0 -6
  624. package/dist/src/foundation/pi-component-adapter/shell-editor-autocomplete.js +0 -162
  625. package/dist/src/foundation/pi-component-adapter/shell-extension-ui.d.ts +0 -35
  626. package/dist/src/foundation/pi-component-adapter/shell-extension-ui.js +0 -279
  627. package/dist/src/foundation/pi-component-adapter/shell-footer-status.d.ts +0 -7
  628. package/dist/src/foundation/pi-component-adapter/shell-footer-status.js +0 -189
  629. package/dist/src/foundation/pi-component-adapter/shell-presenters-transcript.d.ts +0 -57
  630. package/dist/src/foundation/pi-component-adapter/shell-presenters-transcript.js +0 -429
  631. package/dist/src/foundation/pi-component-adapter/shell-selectors-dialogs.d.ts +0 -113
  632. package/dist/src/foundation/pi-component-adapter/shell-selectors-dialogs.js +0 -235
  633. package/dist/src/foundation/pi-component-adapter/shell-shared-facade.d.ts +0 -116
  634. package/dist/src/foundation/pi-component-adapter/shell-shared-facade.js +0 -87
  635. package/dist/src/foundation/pi-component-adapter/upstream/adjacent/core/keybindings.d.ts +0 -422
  636. package/dist/src/foundation/pi-component-adapter/upstream/adjacent/core/keybindings.js +0 -296
  637. package/dist/src/foundation/pi-component-adapter/upstream/components/countdown-timer.d.ts +0 -10
  638. package/dist/src/foundation/pi-component-adapter/upstream/components/custom-entry.d.ts +0 -17
  639. package/dist/src/foundation/pi-component-adapter/upstream/components/custom-entry.js +0 -51
  640. package/dist/src/foundation/pi-component-adapter/upstream/components/daxnuts.d.ts +0 -22
  641. package/dist/src/foundation/pi-component-adapter/upstream/components/daxnuts.js +0 -142
  642. package/dist/src/foundation/pi-component-adapter/upstream/components/earendil-announcement.d.ts +0 -4
  643. package/dist/src/foundation/pi-component-adapter/upstream/components/earendil-announcement.js +0 -19
  644. package/dist/src/foundation/pi-component-adapter/upstream/components/extension-editor.d.ts +0 -17
  645. package/dist/src/foundation/pi-component-adapter/upstream/components/extension-editor.js +0 -81
  646. package/dist/src/foundation/pi-component-adapter/upstream/components/first-time-setup.d.ts +0 -24
  647. package/dist/src/foundation/pi-component-adapter/upstream/components/first-time-setup.js +0 -105
  648. package/dist/src/foundation/pi-component-adapter/upstream/components/markdown-transform.d.ts +0 -2
  649. package/dist/src/foundation/pi-component-adapter/upstream/components/markdown-transform.js +0 -18
  650. package/dist/src/foundation/pi-component-adapter/upstream/components/mermaid.js +0 -77
  651. package/dist/src/foundation/pi-component-adapter/upstream/components/owned-editor.d.ts +0 -18
  652. package/dist/src/foundation/pi-component-adapter/upstream/components/owned-editor.js +0 -55
  653. package/dist/src/foundation/pi-component-adapter/upstream/components/scoped-models-selector.d.ts +0 -55
  654. package/dist/src/foundation/pi-component-adapter/upstream/components/scoped-models-selector.js +0 -342
  655. package/dist/src/foundation/pi-component-adapter/upstream/components/session-footer.d.ts +0 -10
  656. package/dist/src/foundation/pi-component-adapter/upstream/components/session-footer.js +0 -120
  657. package/dist/src/foundation/pi-component-adapter/upstream/components/session-selector-search.js +0 -159
  658. package/dist/src/foundation/pi-component-adapter/upstream/components/session-selector.d.ts +0 -95
  659. package/dist/src/foundation/pi-component-adapter/upstream/components/session-selector.js +0 -889
  660. package/dist/src/foundation/pi-component-adapter/upstream/components/skill-invocation-message.d.ts +0 -19
  661. package/dist/src/foundation/pi-component-adapter/upstream/components/skill-invocation-message.js +0 -44
  662. package/dist/src/foundation/pi-component-adapter/upstream/components/status-indicator.d.ts +0 -30
  663. package/dist/src/foundation/pi-component-adapter/upstream/components/status-indicator.js +0 -59
  664. package/dist/src/foundation/pi-component-adapter/upstream/components/tree-selector.d.ts +0 -98
  665. package/dist/src/foundation/pi-component-adapter/upstream/components/tree-selector.js +0 -1272
  666. package/dist/src/foundation/pi-component-adapter/upstream/components/trust-selector.d.ts +0 -33
  667. package/dist/src/foundation/pi-component-adapter/upstream/components/trust-selector.js +0 -76
  668. package/dist/src/foundation/pi-component-adapter/upstream/external-editor.js +0 -39
  669. package/dist/src/foundation/pi-component-adapter/upstream/model-search.d.ts +0 -15
  670. package/dist/src/foundation/pi-component-adapter/upstream/theme/theme-controller.d.ts +0 -25
  671. package/dist/src/foundation/pi-component-adapter/upstream/theme/theme-controller.js +0 -117
  672. package/dist/src/foundation/pi-component-adapter/upstream/theme/theme.d.ts +0 -61
  673. package/dist/src/foundation/pi-component-adapter/upstream/theme/theme.js +0 -326
  674. package/dist/src/foundation/pi-engine-adapter/adapter.d.ts +0 -164
  675. package/dist/src/foundation/pi-engine-adapter/adapter.js +0 -2367
  676. package/dist/src/foundation/pi-engine-adapter/conformance.d.ts +0 -37
  677. package/dist/src/foundation/pi-engine-adapter/conformance.js +0 -130
  678. package/dist/src/foundation/pi-engine-adapter/index.d.ts +0 -10
  679. package/dist/src/foundation/pi-engine-adapter/index.js +0 -10
  680. package/dist/src/foundation/pi-engine-adapter/model-auth-integration.d.ts +0 -30
  681. package/dist/src/foundation/pi-engine-adapter/model-auth-integration.js +0 -61
  682. package/dist/src/foundation/pi-engine-adapter/package-integration.d.ts +0 -13
  683. package/dist/src/foundation/pi-engine-adapter/package-integration.js +0 -112
  684. package/dist/src/foundation/pi-engine-adapter/pi-settings-metadata.json +0 -374
  685. package/dist/src/foundation/pi-engine-adapter/resource-extension-integration.d.ts +0 -31
  686. package/dist/src/foundation/pi-engine-adapter/resource-extension-integration.js +0 -80
  687. package/dist/src/foundation/pi-engine-adapter/runtime-integration.d.ts +0 -35
  688. package/dist/src/foundation/pi-engine-adapter/runtime-integration.js +0 -67
  689. package/dist/src/foundation/pi-engine-adapter/session-integration.d.ts +0 -43
  690. package/dist/src/foundation/pi-engine-adapter/session-integration.js +0 -97
  691. package/dist/src/foundation/pi-engine-adapter/settings-integration.d.ts +0 -55
  692. package/dist/src/foundation/pi-engine-adapter/settings-integration.js +0 -233
  693. package/dist/src/foundation/pi-engine-adapter/workflow-controllers.d.ts +0 -20
  694. package/dist/src/foundation/pi-engine-adapter/workflow-controllers.js +0 -48
  695. package/dist/src/foundation/pi-engine-adapter/workflows.d.ts +0 -173
  696. package/dist/src/foundation/pi-engine-adapter/workflows.js +0 -60
  697. package/dist/src/foundation/pi-owned-ui-integration/index.d.ts +0 -2
  698. package/dist/src/foundation/pi-owned-ui-integration/index.js +0 -2
  699. package/dist/src/foundation/pi-owned-ui-integration/route-host.d.ts +0 -29
  700. package/dist/src/foundation/pi-owned-ui-integration/session-shell.d.ts +0 -106
  701. package/dist/src/foundation/pi-owned-ui-integration/session-shell.js +0 -1518
  702. package/dist/src/foundation/pi-tui-runtime-adapter/adapter.d.ts +0 -39
  703. package/dist/src/foundation/pi-tui-runtime-adapter/adapter.js +0 -493
  704. package/dist/src/foundation/pi-tui-runtime-adapter/conformance.d.ts +0 -18
  705. package/dist/src/foundation/pi-tui-runtime-adapter/conformance.js +0 -145
  706. package/dist/src/foundation/pi-tui-runtime-adapter/contracts.d.ts +0 -120
  707. package/dist/src/foundation/pi-tui-runtime-adapter/index.d.ts +0 -4
  708. package/dist/src/foundation/pi-tui-runtime-adapter/index.js +0 -4
  709. package/dist/src/foundation/pi-tui-runtime-adapter/presentation-adapter.d.ts +0 -4
  710. package/dist/src/foundation/pi-tui-runtime-adapter/presentation-adapter.js +0 -48
  711. package/dist/src/foundation/presentation-contracts/index.d.ts +0 -96
  712. package/dist/src/foundation/process-containment/index.d.ts +0 -5
  713. package/dist/src/foundation/process-containment/index.js +0 -5
  714. package/dist/src/foundation/process-containment/linux-process-inspector.d.ts +0 -6
  715. package/dist/src/foundation/process-containment/linux-process-inspector.js +0 -26
  716. package/dist/src/foundation/process-containment/native-guardian-containment.d.ts +0 -16
  717. package/dist/src/foundation/process-containment/native-guardian-containment.js +0 -139
  718. package/dist/src/foundation/process-containment/windows-process-inspector.d.ts +0 -17
  719. package/dist/src/foundation/process-containment/windows-process-inspector.js +0 -53
  720. package/dist/src/foundation/protocol/client.d.ts +0 -17
  721. package/dist/src/foundation/protocol/client.js +0 -129
  722. package/dist/src/foundation/protocol/index.d.ts +0 -2
  723. package/dist/src/foundation/protocol/index.js +0 -2
  724. package/dist/src/foundation/protocol/messages.d.ts +0 -89
  725. package/dist/src/foundation/protocol/messages.js +0 -99
  726. package/dist/src/foundation/release/bootstrap.d.ts +0 -29
  727. package/dist/src/foundation/release/bootstrap.js +0 -335
  728. package/dist/src/foundation/release/cohort-state.d.ts +0 -70
  729. package/dist/src/foundation/release/cohort-state.js +0 -202
  730. package/dist/src/foundation/release/index.d.ts +0 -10
  731. package/dist/src/foundation/release/index.js +0 -10
  732. package/dist/src/foundation/release/release-gc.d.ts +0 -5
  733. package/dist/src/foundation/release/release-gc.js +0 -16
  734. package/dist/src/foundation/release/release-store.d.ts +0 -43
  735. package/dist/src/foundation/release/release-store.js +0 -175
  736. package/dist/src/foundation/release/release.d.ts +0 -38
  737. package/dist/src/foundation/release/release.js +0 -204
  738. package/dist/src/foundation/release/update-transaction.d.ts +0 -31
  739. package/dist/src/foundation/release/update-transaction.js +0 -89
  740. package/dist/src/foundation/release/update.d.ts +0 -82
  741. package/dist/src/foundation/release/update.js +0 -527
  742. package/dist/src/foundation/storage/control-store.d.ts +0 -61
  743. package/dist/src/foundation/storage/control-store.js +0 -530
  744. package/dist/src/foundation/storage/index.d.ts +0 -1
  745. package/dist/src/foundation/storage/index.js +0 -1
  746. package/dist/src/foundation/structured-agent-runtime/backpressure.d.ts +0 -46
  747. package/dist/src/foundation/structured-agent-runtime/backpressure.js +0 -118
  748. package/dist/src/foundation/structured-agent-runtime/commands.d.ts +0 -52
  749. package/dist/src/foundation/structured-agent-runtime/commands.js +0 -164
  750. package/dist/src/foundation/structured-agent-runtime/handshake.d.ts +0 -41
  751. package/dist/src/foundation/structured-agent-runtime/handshake.js +0 -151
  752. package/dist/src/foundation/structured-agent-runtime/index.d.ts +0 -5
  753. package/dist/src/foundation/structured-agent-runtime/index.js +0 -5
  754. package/dist/src/foundation/structured-agent-runtime/reconnection.d.ts +0 -37
  755. package/dist/src/foundation/structured-agent-runtime/reconnection.js +0 -129
  756. package/dist/src/foundation/structured-agent-runtime/state.d.ts +0 -56
  757. package/dist/src/foundation/structured-agent-runtime/state.js +0 -118
  758. package/dist/src/foundation/supervision/index.d.ts +0 -3
  759. package/dist/src/foundation/supervision/index.js +0 -3
  760. package/dist/src/foundation/supervision/main.d.ts +0 -1
  761. package/dist/src/foundation/supervision/main.js +0 -41
  762. package/dist/src/foundation/supervision/paths.d.ts +0 -1
  763. package/dist/src/foundation/supervision/paths.js +0 -1
  764. package/dist/src/foundation/supervision/server.d.ts +0 -22
  765. package/dist/src/foundation/supervision/server.js +0 -451
  766. package/dist/src/foundation/ui-apps/contracts.d.ts +0 -42
  767. package/dist/src/foundation/ui-apps/host.d.ts +0 -42
  768. package/dist/src/foundation/ui-apps/host.js +0 -152
  769. package/dist/src/foundation/ui-apps/index.d.ts +0 -3
  770. package/dist/src/foundation/ui-apps/index.js +0 -3
  771. package/dist/src/foundation/ui-apps/registry.d.ts +0 -11
  772. package/dist/src/foundation/ui-apps/registry.js +0 -32
  773. package/dist/src/foundation/ui-components/dialog-panel.js +0 -47
  774. package/dist/src/foundation/ui-components/frame.d.ts +0 -21
  775. package/dist/src/foundation/ui-components/frame.js +0 -54
  776. package/dist/src/foundation/ui-components/index.d.ts +0 -18
  777. package/dist/src/foundation/ui-components/index.js +0 -18
  778. package/dist/src/foundation/ui-components/line-input.d.ts +0 -74
  779. package/dist/src/foundation/ui-components/line-input.js +0 -245
  780. package/dist/src/foundation/ui-components/list-view.d.ts +0 -66
  781. package/dist/src/foundation/ui-components/list-view.js +0 -76
  782. package/dist/src/foundation/ui-components/mouse.d.ts +0 -15
  783. package/dist/src/foundation/ui-components/mouse.js +0 -46
  784. package/dist/src/foundation/ui-components/scrollbar.d.ts +0 -62
  785. package/dist/src/foundation/ui-components/scrollbar.js +0 -102
  786. package/dist/src/foundation/ui-components/shortcuts.d.ts +0 -57
  787. package/dist/src/foundation/ui-components/shortcuts.js +0 -81
  788. package/dist/src/foundation/ui-components/spans.d.ts +0 -7
  789. package/dist/src/foundation/ui-components/spans.js +0 -59
  790. package/dist/src/foundation/ui-components/surface.d.ts +0 -20
  791. package/dist/src/foundation/ui-components/surface.js +0 -38
  792. package/dist/src/foundation/ui-components/text.d.ts +0 -24
  793. package/dist/src/foundation/ui-components/text.js +0 -123
  794. package/dist/src/foundation/workspace-contracts/index.d.ts +0 -2
  795. package/dist/src/foundation/workspace-contracts/index.js +0 -2
  796. package/dist/src/foundation/workspace-contracts/model.d.ts +0 -248
  797. package/dist/src/foundation/workspace-contracts/model.js +0 -2
  798. package/dist/src/foundation/workspace-contracts/validation.d.ts +0 -13
  799. package/dist/src/foundation/workspace-contracts/validation.js +0 -335
  800. package/dist/src/product-identity.d.ts +0 -37
  801. package/dist/src/product-identity.js +0 -150
  802. package/dist/src/product-identity.json +0 -99
  803. package/docs/manual-transparent-checkpoint.md +0 -53
  804. /package/dist/{src/foundation/agent-engine-contracts/domain.js → app/session-shell/paste-helper.d.ts} +0 -0
  805. /package/dist/{src/foundation/agent-engine-contracts/ports.js → app/session-shell/paste-text-worker.d.ts} +0 -0
  806. /package/dist/{src/foundation/lifecycle/commands.js → app/session-shell/paste-types.js} +0 -0
  807. /package/dist/{src/foundation/pi-owned-ui-integration/route-host.js → app/session-shell/response-copy-helper.d.ts} +0 -0
  808. /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/capability-ports.js +0 -0
  809. /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/domain-validation.d.ts +0 -0
  810. /package/dist/{src/foundation/pi-tui-runtime-adapter/contracts.js → contracts/agent-engine/domain.js} +0 -0
  811. /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/model.d.ts +0 -0
  812. /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/model.js +0 -0
  813. /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/package-ports.js +0 -0
  814. /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/ports.d.ts +0 -0
  815. /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/serialization.d.ts +0 -0
  816. /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/serialization.js +0 -0
  817. /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/validation.d.ts +0 -0
  818. /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/validation.js +0 -0
  819. /package/dist/{src/foundation/owned-ui-contracts → contracts/owned-ui}/extension-ui.js +0 -0
  820. /package/dist/{src/foundation/owned-ui-contracts → contracts/owned-ui}/model.js +0 -0
  821. /package/dist/{src/foundation/presentation-contracts → contracts/presentation}/index.js +0 -0
  822. /package/dist/{src/features → features}/launch/development-launch.d.ts +0 -0
  823. /package/dist/{src/features → features}/launch/initialize-profile.d.ts +0 -0
  824. /package/dist/{src/features → features}/launch/initialize-profile.js +0 -0
  825. /package/dist/{src/foundation → foundation}/lifecycle/commands.d.ts +0 -0
  826. /package/dist/{src/foundation → foundation}/lifecycle/launch-instance.d.ts +0 -0
  827. /package/dist/{src/foundation → foundation}/lifecycle/launch-instance.js +0 -0
  828. /package/dist/{src/foundation → foundation}/process-containment/artifact.d.ts +0 -0
  829. /package/dist/{src/foundation → foundation}/process-containment/artifact.js +0 -0
  830. /package/dist/{src/foundation → foundation}/process-containment/contracts.d.ts +0 -0
  831. /package/dist/{src/foundation → foundation}/process-containment/contracts.js +0 -0
  832. /package/dist/{src/foundation → foundation}/release/cohort-selection.d.ts +0 -0
  833. /package/dist/{src/foundation → foundation}/release/cohort-selection.js +0 -0
  834. /package/dist/{src/foundation → foundation}/release/concurrency.d.ts +0 -0
  835. /package/dist/{src/foundation → foundation}/release/concurrency.js +0 -0
  836. /package/dist/{src/foundation → foundation}/release/process-cleanup.d.ts +0 -0
  837. /package/dist/{src/foundation → foundation}/release/process-cleanup.js +0 -0
  838. /package/dist/{src/foundation → foundation}/release/stable-release.d.ts +0 -0
  839. /package/dist/{src/foundation → foundation}/release/stable-release.js +0 -0
  840. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/shell-editor-autocomplete.d.ts +0 -0
  841. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/theme.d.ts +0 -0
  842. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/theme.js +0 -0
  843. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/countdown-timer.js +0 -0
  844. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/mermaid.d.ts +0 -0
  845. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/session-selector-search.d.ts +0 -0
  846. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/external-editor.d.ts +0 -0
  847. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/model-search.js +0 -0
  848. /package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/public-main-entry.d.ts +0 -0
  849. /package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/public-main-entry.js +0 -0
  850. /package/dist/{src/foundation/ui-apps → ui/apps}/contracts.js +0 -0
  851. /package/dist/{src/foundation/ui-components → ui/components}/dialog-panel.d.ts +0 -0
  852. /package/dist/{src/foundation/ui-components → ui/components}/label.d.ts +0 -0
  853. /package/dist/{src/foundation/ui-components → ui/components}/label.js +0 -0
  854. /package/dist/{src/foundation/ui-components → ui/components}/list-block.d.ts +0 -0
  855. /package/dist/{src/foundation/ui-components → ui/components}/list-block.js +0 -0
  856. /package/dist/{src/foundation/ui-components → ui/components}/pane.d.ts +0 -0
  857. /package/dist/{src/foundation/ui-components → ui/components}/pane.js +0 -0
  858. /package/dist/{src/foundation/ui-components → ui/components}/revision.d.ts +0 -0
  859. /package/dist/{src/foundation/ui-components → ui/components}/revision.js +0 -0
  860. /package/dist/{src/foundation/ui-components → ui/components}/status-line.d.ts +0 -0
  861. /package/dist/{src/foundation/ui-components → ui/components}/status-line.js +0 -0
  862. /package/dist/{src/foundation/ui-components → ui/components}/stepper.d.ts +0 -0
  863. /package/dist/{src/foundation/ui-components → ui/components}/stepper.js +0 -0
  864. /package/dist/{src/foundation/ui-components → ui/components}/theme.d.ts +0 -0
  865. /package/dist/{src/foundation/ui-components → ui/components}/theme.js +0 -0
  866. /package/dist/{src/foundation/ui-components → ui/components}/value-menu.d.ts +0 -0
  867. /package/dist/{src/foundation/ui-components → ui/components}/value-menu.js +0 -0
  868. /package/dist/{src/foundation/owned-ui-settings → ui/settings}/resolution.d.ts +0 -0
  869. /package/dist/{src/foundation/owned-ui-settings → ui/settings}/resolution.js +0 -0
@@ -0,0 +1,764 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { spawn } from "node:child_process";
3
+ import { lstat, mkdir, open, readFile, readdir, realpath, rename, rm, stat } from "node:fs/promises";
4
+ import { dirname, isAbsolute, relative, resolve, sep } from "node:path";
5
+ import { fileURLToPath } from "node:url";
6
+ import { CohortStateStore, planProtectedReleases, } from "./cohort-state.js";
7
+ import { liveReleaseIds } from "./endpoints.js";
8
+ import { resolveProductPaths } from "../lifecycle/index.js";
9
+ import { RELEASE_MANIFEST_FILENAME } from "./release-store.js";
10
+ import { DEPENDENCY_LAYER_MANIFEST, readCertifiedDependencyLayer } from "./dependency-layer.js";
11
+ import { dependencyCertificationDirectory, managedDependencyCertificationPath } from "./dependency-certification.js";
12
+ import { dependencyCertificationProtection } from "./dependency-certification-retention.js";
13
+ import { UpdateTransactionStore } from "./update-transaction.js";
14
+ import { cleanupUpdateRecoveryCapsules } from "./update-recovery.js";
15
+ import { PRODUCT_IDENTITY } from "../../product-identity.js";
16
+ import { collectCompileCaches, startupCompileCachePath } from "../startup/index.js";
17
+ const DEFAULT_CANDIDATE_AGE_MS = 60 * 60 * 1_000;
18
+ const DEFAULT_LIMITS = { maxItems: 8, maxDurationMs: 2_000, concurrency: 1 };
19
+ const DEFAULT_WORKER_DURATION_MS = 10 * 60 * 1_000;
20
+ const DEFAULT_NO_PROGRESS_BATCHES = 5;
21
+ const DEFAULT_RETRY_DELAY_MS = 500;
22
+ const WORKER_HOLDS_ENV = "RELEASE_CLEANUP_HOLDS";
23
+ const WORKER_RUN_ID_ENV = "RELEASE_CLEANUP_RUN_ID";
24
+ const WORKER_LEASE_FILENAME = "release-cleanup-worker.lock";
25
+ /**
26
+ * Reconcile current ownership under the cohort-state lock and durably detach obsolete releases.
27
+ * This operation intentionally reads only manifests and directory metadata, never payload bytes.
28
+ */
29
+ export async function prepareReleaseCleanup(dataDir, paths, options = {}) {
30
+ const store = new CohortStateStore(dataDir);
31
+ const discovered = await discoverCleanupInputs(dataDir, store, options);
32
+ const transactionStore = options.transactionStore ?? new UpdateTransactionStore(dataDir);
33
+ await store.reconcileRetention(async () => await protectionInputs(paths, transactionStore, options.externalHolds ?? []), discovered.orphans);
34
+ for (const diagnostic of discovered.diagnostics.slice(0, 16)) {
35
+ await store.recordCleanupFailure(diagnostic.releaseId, diagnostic.stage, diagnostic.error);
36
+ }
37
+ return { store, discovered };
38
+ }
39
+ /** Run a bounded, restart-safe physical cleanup pass over detached releases and abandoned artifacts. */
40
+ export async function runBoundedReleaseCleanup(dataDir, paths, options = {}) {
41
+ const now = options.now ?? Date.now;
42
+ const limits = normalizeLimits(options.limits);
43
+ const { store, discovered } = await prepareReleaseCleanup(dataDir, paths, options);
44
+ // Performance: The physical-work allowance begins after discovery, ownership probes, and the
45
+ // durable reconciliation write. A slow preparation phase must not starve every worker invocation.
46
+ const startedAt = now();
47
+ const initial = await store.read();
48
+ const pending = sortCleanupDispositions(Object.values(initial.cleanup.pending));
49
+ const transactionStore = options.transactionStore ?? new UpdateTransactionStore(dataDir);
50
+ const transaction = await transactionStore.read();
51
+ const activeTransaction = transaction?.status === "active";
52
+ const artifacts = sortArtifacts([
53
+ ...(!activeTransaction ? discovered.candidates : []),
54
+ ...discovered.unmanagedTrash,
55
+ ...discovered.certifications,
56
+ ], initial);
57
+ let attempted = 0;
58
+ let completed = 0;
59
+ let pendingOffset = 0;
60
+ let artifactOffset = 0;
61
+ const hasTime = (guaranteed = false) => guaranteed || attempted === 0 || now() - startedAt < limits.maxDurationMs;
62
+ const attemptPending = async (maximum, guaranteed = false) => {
63
+ while (pendingOffset < pending.length && attempted < limits.maxItems && maximum > 0 && hasTime(guaranteed)) {
64
+ const size = Math.min(limits.concurrency, maximum, limits.maxItems - attempted, pending.length - pendingOffset);
65
+ const batch = pending.slice(pendingOffset, pendingOffset + size);
66
+ pendingOffset += size;
67
+ maximum -= size;
68
+ attempted += batch.length;
69
+ const results = await Promise.all(batch.map(async (disposition) => await collectDisposition(store, dataDir, paths, disposition, options)));
70
+ completed += results.filter(Boolean).length;
71
+ guaranteed = false;
72
+ }
73
+ };
74
+ const attemptArtifacts = async (maximum, guaranteed = false) => {
75
+ while (artifactOffset < artifacts.length && attempted < limits.maxItems && maximum > 0 && hasTime(guaranteed)) {
76
+ const artifact = artifacts[artifactOffset++];
77
+ maximum -= 1;
78
+ const certificationId = certificationReleaseId(artifact);
79
+ if (certificationId !== null) {
80
+ const inputs = await protectionInputs(paths, transactionStore, options.externalHolds ?? []);
81
+ if (isProtectedDetachedRelease(await store.read(), inputs, certificationId))
82
+ continue;
83
+ }
84
+ attempted += 1;
85
+ try {
86
+ await removeAbandonedArtifact(dataDir, artifact, options.operations);
87
+ completed += 1;
88
+ }
89
+ catch (error) {
90
+ await store.recordCleanupFailure(artifactName(artifact), "artifact-delete", error);
91
+ }
92
+ guaranteed = false;
93
+ }
94
+ };
95
+ // Concurrency: Give each available class one opportunity before filling the batch. This keeps
96
+ // a locked release or a large release backlog from indefinitely starving candidates and evidence.
97
+ if (pending.length > 0)
98
+ await attemptPending(1, true);
99
+ if (artifacts.length > 0 && attempted < limits.maxItems)
100
+ await attemptArtifacts(1, true);
101
+ if (!activeTransaction && attempted < limits.maxItems) {
102
+ const layerResult = await collectUnreferencedDependencyLayers(store, dataDir, 1, options);
103
+ attempted += layerResult.attempted;
104
+ completed += layerResult.completed;
105
+ }
106
+ while (attempted < limits.maxItems && hasTime()) {
107
+ const before = attempted;
108
+ await attemptPending(1);
109
+ if (attempted < limits.maxItems)
110
+ await attemptArtifacts(1);
111
+ if (attempted === before)
112
+ break;
113
+ }
114
+ if (!activeTransaction && attempted < limits.maxItems && hasTime()) {
115
+ const layerResult = await collectUnreferencedDependencyLayers(store, dataDir, limits.maxItems - attempted, options);
116
+ attempted += layerResult.attempted;
117
+ completed += layerResult.completed;
118
+ }
119
+ if (!activeTransaction && hasTime()) {
120
+ await collectCompileCaches(dataDir, await protectedCompileCachePaths(dataDir, await store.read())).catch(() => { });
121
+ await cleanupUpdateRecoveryCapsules(dataDir).catch(() => { });
122
+ }
123
+ const remaining = Object.keys((await store.read()).cleanup.pending).length;
124
+ return { planned: pending.length + artifacts.length, attempted, completed, remaining, durationMs: Math.max(0, now() - startedAt) };
125
+ }
126
+ /**
127
+ * Commit cleanup intent synchronously, then let a dependency-light detached worker perform
128
+ * potentially slow recursive deletion. A later launch/update resumes work if spawning fails.
129
+ */
130
+ export async function scheduleReleaseCleanup(dataDir, paths, options = {}) {
131
+ const { store } = await prepareReleaseCleanup(dataDir, paths, options);
132
+ const runId = randomUUID();
133
+ await store.recordCleanupWorkerScheduled(runId);
134
+ const entry = fileURLToPath(new URL("../../../bin/release-cleanup.js", import.meta.url));
135
+ const environment = {
136
+ ...process.env,
137
+ [PRODUCT_IDENTITY.environment.dataDir]: dataDir,
138
+ [PRODUCT_IDENTITY.environment.runtimeDir]: paths.runtimeDir,
139
+ [WORKER_HOLDS_ENV]: JSON.stringify(options.externalHolds ?? []),
140
+ [WORKER_RUN_ID_ENV]: runId,
141
+ };
142
+ try {
143
+ await (options.workerSpawner ?? spawnCleanupWorker)(entry, environment);
144
+ }
145
+ catch (error) {
146
+ const summary = { batches: 0, attempted: 0, completed: 0, remaining: Object.keys((await store.read()).cleanup.pending).length };
147
+ await store.recordCleanupWorkerFinished(runId, "failed", summary, error);
148
+ await store.recordCleanupFailure("worker", "spawn", error);
149
+ }
150
+ }
151
+ /** Entry used by the private cleanup executable shipped in every immutable release. */
152
+ export async function runReleaseCleanupWorker(environment = process.env, workerOptions = {}) {
153
+ const paths = resolveProductPaths(environment);
154
+ const store = new CohortStateStore(paths.dataDir);
155
+ const runId = environment[WORKER_RUN_ID_ENV] ?? randomUUID();
156
+ const now = workerOptions.now ?? Date.now;
157
+ const sleep = workerOptions.sleep ?? (async (durationMs) => await new Promise(resolvePromise => setTimeout(resolvePromise, durationMs)));
158
+ const cleanupOptions = {
159
+ ...workerOptions.cleanup,
160
+ externalHolds: workerOptions.cleanup?.externalHolds ?? parseWorkerHolds(environment[WORKER_HOLDS_ENV]),
161
+ };
162
+ const summary = { batches: 0, attempted: 0, completed: 0, remaining: Object.keys((await store.read()).cleanup.pending).length };
163
+ let lease = null;
164
+ let continuation = false;
165
+ let status = "completed";
166
+ let failure = null;
167
+ const startedAt = now();
168
+ try {
169
+ lease = await acquireWorkerLease(paths.dataDir, runId);
170
+ if (lease === null) {
171
+ status = "skipped";
172
+ failure = "another release cleanup worker owns the data root";
173
+ return { planned: 0, attempted: 0, completed: 0, remaining: summary.remaining, durationMs: 0 };
174
+ }
175
+ await store.recordCleanupWorkerStarted(runId, process.pid);
176
+ let noProgressBatches = 0;
177
+ while (true) {
178
+ const result = await runBoundedReleaseCleanup(paths.dataDir, paths, cleanupOptions);
179
+ summary.batches += 1;
180
+ summary.attempted += result.attempted;
181
+ summary.completed += result.completed;
182
+ summary.remaining = result.remaining;
183
+ await store.recordCleanupWorkerProgress(runId, summary);
184
+ if (result.attempted === 0)
185
+ break;
186
+ if (result.completed === 0) {
187
+ noProgressBatches += 1;
188
+ if (noProgressBatches >= (workerOptions.maxNoProgressBatches ?? DEFAULT_NO_PROGRESS_BATCHES)) {
189
+ status = "blocked";
190
+ failure = "cleanup made no progress within its bounded retry allowance";
191
+ break;
192
+ }
193
+ await sleep((workerOptions.retryDelayMs ?? DEFAULT_RETRY_DELAY_MS) * (2 ** (noProgressBatches - 1)));
194
+ }
195
+ else {
196
+ noProgressBatches = 0;
197
+ }
198
+ if (now() - startedAt >= (workerOptions.maxDurationMs ?? DEFAULT_WORKER_DURATION_MS)) {
199
+ status = "continued";
200
+ continuation = true;
201
+ break;
202
+ }
203
+ }
204
+ }
205
+ catch (error) {
206
+ status = "failed";
207
+ failure = error;
208
+ }
209
+ finally {
210
+ if (lease !== null)
211
+ await releaseWorkerLease(paths.dataDir, runId, lease);
212
+ await store.recordCleanupWorkerFinished(runId, status, summary, failure);
213
+ }
214
+ if (continuation) {
215
+ await (workerOptions.continueWorker ?? scheduleReleaseCleanup)(paths.dataDir, paths, cleanupOptions).catch(async (error) => {
216
+ await store.recordCleanupFailure("worker", "continuation", error);
217
+ });
218
+ }
219
+ if (status === "failed")
220
+ throw failure instanceof Error ? failure : new Error(errorMessage(failure));
221
+ return {
222
+ planned: summary.remaining + summary.completed,
223
+ attempted: summary.attempted,
224
+ completed: summary.completed,
225
+ remaining: summary.remaining,
226
+ durationMs: Math.max(0, now() - startedAt),
227
+ };
228
+ }
229
+ /** Compatibility helper: detach one requested release and execute a one-item pass. */
230
+ export async function collectRelease(store, dataDir, releaseId, externalReferences, paths) {
231
+ const holds = externalReferences.map(referenced => ({ authority: "migration", releaseId: referenced }));
232
+ const state = await store.read();
233
+ if (!state.releases[releaseId])
234
+ throw new Error(`unknown release ${releaseId}`);
235
+ await store.reconcileRetention(async () => ({ ...(await protectionInputs(paths, new UpdateTransactionStore(dataDir), holds)) }));
236
+ const disposition = (await store.read()).cleanup.pending[releaseId];
237
+ if (!disposition)
238
+ throw new Error(`release ${releaseId} is still referenced and cannot be collected`);
239
+ const removed = await collectDisposition(store, dataDir, paths, disposition, { externalHolds: holds, limits: { maxItems: 1 } });
240
+ if (!removed)
241
+ throw new Error(`release ${releaseId} could not be collected`);
242
+ }
243
+ async function collectDisposition(store, dataDir, paths, disposition, options) {
244
+ const releaseId = disposition.release.releaseId;
245
+ try {
246
+ const inputs = await protectionInputs(paths, options.transactionStore ?? new UpdateTransactionStore(dataDir), options.externalHolds ?? []);
247
+ const current = await store.read();
248
+ if (isProtectedDetachedRelease(current, inputs, releaseId))
249
+ return false;
250
+ const storeRoot = await canonicalReleaseStore(dataDir);
251
+ const trashRoot = await canonicalTrashRoot(storeRoot);
252
+ let trashPath = disposition.trashPath;
253
+ if (disposition.stage === "detached") {
254
+ const source = resolve(storeRoot, releaseId);
255
+ const sourceMetadata = await lstat(source).catch(error => missingOrThrow(error));
256
+ if (sourceMetadata === null) {
257
+ trashPath = await findReleaseTrash(trashRoot, releaseId);
258
+ if (trashPath === null) {
259
+ await removeCertificationEvidence(dataDir, disposition.release, store);
260
+ await store.completeCleanup(releaseId);
261
+ return true;
262
+ }
263
+ }
264
+ else {
265
+ await assertReleaseDirectory(source, storeRoot, disposition.release, releaseId);
266
+ trashPath = resolve(trashRoot, `${releaseId}--${randomUUID()}`);
267
+ await (options.operations?.rename ?? rename)(source, trashPath);
268
+ }
269
+ await store.markCleanupTrash(releaseId, trashPath);
270
+ }
271
+ if (trashPath === null)
272
+ throw new Error(`release ${releaseId} has no managed trash path`);
273
+ await assertReleaseDirectory(trashPath, trashRoot, disposition.release, `${releaseId}--`);
274
+ await (options.operations?.remove ?? rm)(trashPath, { recursive: true, force: false, maxRetries: 0 });
275
+ await removeCertificationEvidence(dataDir, disposition.release, store);
276
+ await store.completeCleanup(releaseId);
277
+ return true;
278
+ }
279
+ catch (error) {
280
+ await store.recordCleanupFailure(releaseId, disposition.stage, error);
281
+ return false;
282
+ }
283
+ }
284
+ function isProtectedDetachedRelease(state, inputs, releaseId) {
285
+ const selected = [state.references.active, state.references.pending, state.references.approved, state.references.rollback]
286
+ .some(reference => reference === releaseId);
287
+ return selected
288
+ || (inputs.liveReleaseIds ?? []).includes(releaseId)
289
+ || (inputs.externalHolds ?? []).some(hold => hold.releaseId === releaseId)
290
+ || (inputs.transaction?.status === "active" && inputs.transaction.priorActiveReleaseId === releaseId);
291
+ }
292
+ async function protectionInputs(paths, transactionStore, externalHolds) {
293
+ const [liveIds, transaction] = await Promise.all([
294
+ paths ? liveReleaseIds(paths) : Promise.resolve([]),
295
+ transactionStore.read(),
296
+ ]);
297
+ return { liveReleaseIds: liveIds, externalHolds, transaction: transactionReference(transaction) };
298
+ }
299
+ function transactionReference(transaction) {
300
+ return transaction === null ? null : { status: transaction.status, priorActiveReleaseId: transaction.priorActiveReleaseId };
301
+ }
302
+ async function discoverCleanupInputs(dataDir, store, options) {
303
+ const releaseRoot = resolve(dataDir, "releases");
304
+ await mkdir(releaseRoot, { recursive: true, mode: 0o700 });
305
+ const state = await store.read();
306
+ const orphans = [];
307
+ const candidates = [];
308
+ const unmanagedTrash = [];
309
+ const certifications = [];
310
+ const diagnostics = [];
311
+ const candidateAgeMs = options.candidateAgeMs ?? DEFAULT_CANDIDATE_AGE_MS;
312
+ const now = options.now ?? Date.now;
313
+ for (const entry of await readdir(releaseRoot, { withFileTypes: true })) {
314
+ const path = resolve(releaseRoot, entry.name);
315
+ if (entry.name === ".trash")
316
+ continue;
317
+ if (entry.name.startsWith(".candidate-")) {
318
+ try {
319
+ const metadata = await lstat(path);
320
+ if (metadata.isDirectory() && !metadata.isSymbolicLink() && now() - metadata.mtimeMs >= candidateAgeMs)
321
+ candidates.push(path);
322
+ }
323
+ catch (error) {
324
+ diagnostics.push({ releaseId: entry.name, stage: "candidate-discovery", error: errorMessage(error) });
325
+ }
326
+ continue;
327
+ }
328
+ if (state.releases[entry.name] || state.cleanup.pending[entry.name])
329
+ continue;
330
+ try {
331
+ const release = await readReleaseRecord(path, releaseRoot, entry.name, dataDir);
332
+ orphans.push({ release, stage: "detached" });
333
+ }
334
+ catch (error) {
335
+ diagnostics.push({ releaseId: entry.name, stage: "orphan-discovery", error: errorMessage(error) });
336
+ }
337
+ }
338
+ const trashRoot = resolve(releaseRoot, ".trash");
339
+ const trashMetadata = await lstat(trashRoot).catch(error => missingOrThrow(error));
340
+ if (trashMetadata !== null) {
341
+ if (!trashMetadata.isDirectory() || trashMetadata.isSymbolicLink()) {
342
+ diagnostics.push({ releaseId: ".trash", stage: "trash-discovery", error: "managed trash is not a direct non-link directory" });
343
+ }
344
+ else {
345
+ for (const entry of await readdir(trashRoot, { withFileTypes: true })) {
346
+ const path = resolve(trashRoot, entry.name);
347
+ const releaseId = entry.name.split("--", 1)[0];
348
+ if (entry.name.startsWith(".candidate--")) {
349
+ unmanagedTrash.push(path);
350
+ }
351
+ else if (entry.name.includes("--") && !state.cleanup.pending[releaseId]) {
352
+ try {
353
+ const release = await readReleaseRecord(path, trashRoot, `${releaseId}--`, dataDir);
354
+ orphans.push({ release, stage: "trash", trashPath: path });
355
+ }
356
+ catch (error) {
357
+ diagnostics.push({ releaseId, stage: "trash-discovery", error: errorMessage(error) });
358
+ }
359
+ }
360
+ }
361
+ }
362
+ }
363
+ for (const entry of await readdir(dataDir, { withFileTypes: true })) {
364
+ const match = /^certification-(.+)\.json$/.exec(entry.name);
365
+ if (!match || !entry.isFile())
366
+ continue;
367
+ const releaseId = match[1];
368
+ if (!state.releases[releaseId] && !state.cleanup.pending[releaseId] && !orphans.some(orphan => orphan.release.releaseId === releaseId)) {
369
+ certifications.push(resolve(dataDir, entry.name));
370
+ }
371
+ }
372
+ return { orphans, candidates, unmanagedTrash, certifications, diagnostics };
373
+ }
374
+ async function readReleaseRecord(path, parent, expectedName, dataDir) {
375
+ const metadata = await lstat(path);
376
+ if (!metadata.isDirectory() || metadata.isSymbolicLink())
377
+ throw new Error("release path is not a non-link directory");
378
+ const [canonicalParent, canonicalPath] = await Promise.all([realpath(parent), realpath(path)]);
379
+ assertDirectChild(canonicalParent, canonicalPath);
380
+ const name = canonicalPath.split(sep).at(-1) ?? "";
381
+ if (expectedName.endsWith("--") ? !name.startsWith(expectedName) : name !== expectedName)
382
+ throw new Error("release directory name does not match its disposition");
383
+ const manifest = JSON.parse(await readFile(resolve(canonicalPath, RELEASE_MANIFEST_FILENAME), "utf8"));
384
+ if (typeof manifest.releaseId !== "string" || !/^[0-9A-Za-z.+_-]+-[a-f0-9]{20}$/.test(manifest.releaseId)
385
+ || typeof manifest.packageVersion !== "string" || typeof manifest.contentDigest !== "string"
386
+ || !/^[a-f0-9]{64}$/.test(manifest.contentDigest) || !name.startsWith(manifest.releaseId)) {
387
+ throw new Error("release manifest identity is invalid for cleanup");
388
+ }
389
+ return {
390
+ releaseId: manifest.releaseId,
391
+ releaseRoot: resolve(parent, manifest.releaseId),
392
+ packageVersion: manifest.packageVersion,
393
+ contentDigest: manifest.contentDigest,
394
+ approval: "approved",
395
+ materializedAt: new Date(0).toISOString(),
396
+ certifiedAt: null,
397
+ diagnosticsPath: resolve(dataDir, `certification-${manifest.releaseId}.json`),
398
+ };
399
+ }
400
+ async function assertReleaseDirectory(path, parent, release, expectedName) {
401
+ const metadata = await lstat(path);
402
+ if (!metadata.isDirectory() || metadata.isSymbolicLink())
403
+ throw new Error(`refused cleanup of linked or non-directory release ${release.releaseId}`);
404
+ const [canonicalParent, canonicalPath] = await Promise.all([realpath(parent), realpath(path)]);
405
+ assertDirectChild(canonicalParent, canonicalPath);
406
+ const name = canonicalPath.split(sep).at(-1) ?? "";
407
+ if (expectedName.endsWith("--") ? !name.startsWith(expectedName) : name !== expectedName)
408
+ throw new Error(`release directory does not match identity ${release.releaseId}`);
409
+ if (!expectedName.endsWith("--") && canonicalPath !== await realpath(release.releaseRoot))
410
+ throw new Error(`recorded release path differs from managed identity ${release.releaseId}`);
411
+ const manifest = JSON.parse(await readFile(resolve(canonicalPath, RELEASE_MANIFEST_FILENAME), "utf8"));
412
+ if (manifest.releaseId !== release.releaseId || manifest.contentDigest !== release.contentDigest || manifest.packageVersion !== release.packageVersion) {
413
+ throw new Error(`release manifest metadata differs from detached record ${release.releaseId}`);
414
+ }
415
+ }
416
+ async function removeCertificationEvidence(dataDir, release, store) {
417
+ if (release.diagnosticsPath === null)
418
+ return;
419
+ // Security: the persisted path is historical metadata, not deletion authority. Derive the
420
+ // only permitted target from validated identity so Windows casing changes cannot strand it.
421
+ const expected = resolve(dataDir, `certification-${release.releaseId}.json`);
422
+ const metadata = await lstat(expected).catch(error => missingOrThrow(error));
423
+ if (metadata === null)
424
+ return;
425
+ if (!metadata.isFile() || metadata.isSymbolicLink()) {
426
+ await store.recordCleanupFailure(release.releaseId, "certification", "refused to delete linked or non-file certification evidence");
427
+ return;
428
+ }
429
+ const [canonicalDataDir, canonicalEvidence] = await Promise.all([realpath(dataDir), realpath(expected)]);
430
+ assertDirectChild(canonicalDataDir, canonicalEvidence);
431
+ if (artifactName(canonicalEvidence) !== `certification-${release.releaseId}.json`) {
432
+ await store.recordCleanupFailure(release.releaseId, "certification", "refused to delete certification evidence with a different managed identity");
433
+ return;
434
+ }
435
+ await rm(canonicalEvidence, { force: true });
436
+ }
437
+ async function canonicalReleaseStore(dataDir) {
438
+ const root = resolve(dataDir, "releases");
439
+ await mkdir(root, { recursive: true, mode: 0o700 });
440
+ const metadata = await lstat(root);
441
+ if (!metadata.isDirectory() || metadata.isSymbolicLink())
442
+ throw new Error("release store is not a non-link directory");
443
+ return await realpath(root);
444
+ }
445
+ async function canonicalTrashRoot(storeRoot) {
446
+ const root = resolve(storeRoot, ".trash");
447
+ await mkdir(root, { recursive: true, mode: 0o700 });
448
+ const metadata = await lstat(root);
449
+ if (!metadata.isDirectory() || metadata.isSymbolicLink())
450
+ throw new Error("managed release trash is not a non-link directory");
451
+ const canonical = await realpath(root);
452
+ assertDirectChild(storeRoot, canonical);
453
+ return canonical;
454
+ }
455
+ async function findReleaseTrash(trashRoot, releaseId) {
456
+ const names = (await readdir(trashRoot)).filter(name => name.startsWith(`${releaseId}--`)).sort();
457
+ return names.length === 0 ? null : resolve(trashRoot, names[0]);
458
+ }
459
+ async function removeAbandonedArtifact(dataDir, path, operations) {
460
+ const storeRoot = await canonicalReleaseStore(dataDir);
461
+ const metadata = await lstat(path);
462
+ if (metadata.isSymbolicLink())
463
+ throw new Error("abandoned artifact is a link");
464
+ const canonical = await realpath(path);
465
+ const parent = dirname(canonical);
466
+ const canonicalDataDir = await realpath(dataDir);
467
+ if (parent === canonicalDataDir && certificationReleaseId(canonical) !== null && metadata.isFile()) {
468
+ await (operations?.remove ?? rm)(canonical, { force: true });
469
+ return;
470
+ }
471
+ if (!metadata.isDirectory())
472
+ throw new Error("abandoned artifact is not a managed directory or certification file");
473
+ if (parent === storeRoot && canonical.split(sep).at(-1)?.startsWith(".candidate-")) {
474
+ const trashRoot = await canonicalTrashRoot(storeRoot);
475
+ const moved = resolve(trashRoot, `.candidate--${randomUUID()}`);
476
+ await (operations?.rename ?? rename)(canonical, moved);
477
+ await (operations?.remove ?? rm)(moved, { recursive: true, force: false, maxRetries: 0 });
478
+ return;
479
+ }
480
+ const trashRoot = await canonicalTrashRoot(storeRoot);
481
+ if (parent === trashRoot && canonical.split(sep).at(-1)?.startsWith(".candidate--")) {
482
+ await (operations?.remove ?? rm)(canonical, { recursive: true, force: false, maxRetries: 0 });
483
+ return;
484
+ }
485
+ throw new Error("abandoned artifact is outside managed candidate, trash, or certification paths");
486
+ }
487
+ async function collectUnreferencedDependencyLayers(store, dataDir, maxItems, options) {
488
+ const transactionStore = options.transactionStore ?? new UpdateTransactionStore(dataDir);
489
+ if ((await transactionStore.read())?.status === "active")
490
+ return { attempted: 0, completed: 0 };
491
+ const protection = await dependencyCertificationProtection(dataDir, Object.keys((await store.read()).releases));
492
+ if (protection.uncertain)
493
+ return { attempted: 0, completed: 0 };
494
+ const { referenced } = protection;
495
+ const layersRoot = resolve(dataDir, "dependency-layers");
496
+ const layersMetadata = await lstat(layersRoot).catch(error => missingOrThrow(error));
497
+ if (layersMetadata === null)
498
+ return await collectDependencyCertificationRecords(store, dataDir, protection, maxItems, options);
499
+ if (!layersMetadata.isDirectory() || layersMetadata.isSymbolicLink())
500
+ throw new Error("dependency-layer store is not a managed directory");
501
+ const trashRoot = resolve(layersRoot, ".trash");
502
+ await mkdir(trashRoot, { recursive: true, mode: 0o700 });
503
+ let attempted = 0;
504
+ let completed = 0;
505
+ const entries = await readdir(layersRoot, { withFileTypes: true });
506
+ const candidates = [];
507
+ for (const entry of entries) {
508
+ if (entry.name === ".trash")
509
+ continue;
510
+ const path = resolve(layersRoot, entry.name);
511
+ if (entry.name.startsWith(".candidate-")) {
512
+ const metadata = await lstat(path);
513
+ const currentTime = options.now?.() ?? Date.now();
514
+ if (currentTime - metadata.mtimeMs >= (options.candidateAgeMs ?? DEFAULT_CANDIDATE_AGE_MS)) {
515
+ candidates.push({ path, layerId: null, inTrash: false });
516
+ }
517
+ continue;
518
+ }
519
+ if (!referenced.has(entry.name))
520
+ candidates.push({ path, layerId: entry.name, inTrash: false });
521
+ }
522
+ for (const entry of await readdir(trashRoot, { withFileTypes: true })) {
523
+ candidates.push({ path: resolve(trashRoot, entry.name), layerId: entry.name.split("--", 1)[0] ?? null, inTrash: true });
524
+ }
525
+ const certificates = await collectDependencyCertificationRecords(store, dataDir, protection, Math.min(1, maxItems), options);
526
+ attempted += certificates.attempted;
527
+ completed += certificates.completed;
528
+ for (const candidate of candidates.slice(0, maxItems - attempted)) {
529
+ if ((await transactionStore.read())?.status === "active")
530
+ break;
531
+ if (candidate.layerId !== null && referenced.has(candidate.layerId))
532
+ continue;
533
+ attempted += 1;
534
+ try {
535
+ const metadata = await lstat(candidate.path);
536
+ if (!metadata.isDirectory() || metadata.isSymbolicLink())
537
+ throw new Error("dependency-layer cleanup candidate is not a non-link directory");
538
+ let removalPath = candidate.path;
539
+ if (!candidate.inTrash) {
540
+ const canonicalRoot = await realpath(layersRoot);
541
+ const canonical = await realpath(candidate.path);
542
+ assertDirectChild(canonicalRoot, canonical);
543
+ if (candidate.layerId !== null) {
544
+ const manifest = JSON.parse(await readFile(resolve(canonical, DEPENDENCY_LAYER_MANIFEST), "utf8"));
545
+ if (manifest.layerId !== candidate.layerId || typeof manifest.contentDigest !== "string")
546
+ throw new Error("dependency-layer manifest does not match its directory");
547
+ }
548
+ removalPath = resolve(trashRoot, `${candidate.layerId ?? ".candidate"}--${randomUUID()}`);
549
+ await (options.operations?.rename ?? rename)(canonical, removalPath);
550
+ }
551
+ else {
552
+ const canonicalTrash = await realpath(trashRoot);
553
+ assertDirectChild(canonicalTrash, await realpath(removalPath));
554
+ }
555
+ await (options.operations?.remove ?? rm)(removalPath, { recursive: true, force: false, maxRetries: 0 });
556
+ if (candidate.layerId !== null && /^dependencies-[a-f0-9]{32}$/.test(candidate.layerId)) {
557
+ for (const legacy of [false, true]) {
558
+ const certificate = await managedDependencyCertificationPath(dataDir, candidate.layerId, legacy);
559
+ if (certificate !== null)
560
+ await (options.operations?.remove ?? rm)(certificate, { force: true });
561
+ }
562
+ }
563
+ completed += 1;
564
+ }
565
+ catch (error) {
566
+ // Platform: the pass is retry based, so a sharing violation leaves managed trash.
567
+ await store.recordCleanupFailure(candidate.layerId ?? artifactName(candidate.path), "dependency-layer-delete", error);
568
+ }
569
+ }
570
+ if (attempted < maxItems) {
571
+ const remaining = await collectDependencyCertificationRecords(store, dataDir, protection, maxItems - attempted, options);
572
+ attempted += remaining.attempted;
573
+ completed += remaining.completed;
574
+ }
575
+ return { attempted, completed };
576
+ }
577
+ async function collectDependencyCertificationRecords(store, dataDir, protection, maxItems, options) {
578
+ const candidates = new Map();
579
+ for (const entry of await readdir(dataDir, { withFileTypes: true })) {
580
+ const match = /^dependency-layer-certification-(dependencies-[a-f0-9]{32})\.json$/.exec(entry.name);
581
+ if (match && entry.isFile())
582
+ candidates.set(resolve(dataDir, entry.name), { layerId: match[1], legacy: true });
583
+ }
584
+ try {
585
+ const directory = await dependencyCertificationDirectory(dataDir);
586
+ if (directory !== null) {
587
+ for (const entry of await readdir(directory, { withFileTypes: true })) {
588
+ const match = /^(dependencies-[a-f0-9]{32})\.json$/.exec(entry.name);
589
+ if (match && entry.isFile())
590
+ candidates.set(resolve(directory, entry.name), { layerId: match[1], legacy: false });
591
+ }
592
+ }
593
+ }
594
+ catch (error) {
595
+ await store.recordCleanupFailure("dependency-certifications", "certification-discovery", error);
596
+ return { attempted: 0, completed: 0 };
597
+ }
598
+ const transactionStore = options.transactionStore ?? new UpdateTransactionStore(dataDir);
599
+ let attempted = 0;
600
+ let completed = 0;
601
+ for (const candidate of sortArtifacts([...candidates.keys()], await store.read())) {
602
+ if (attempted >= maxItems || (await transactionStore.read())?.status === "active")
603
+ break;
604
+ const { layerId, legacy } = candidates.get(candidate);
605
+ if (legacy ? protection.legacyRequired.has(layerId) : protection.referenced.has(layerId))
606
+ continue;
607
+ const layerExists = await lstat(resolve(dataDir, "dependency-layers", layerId)).catch(missingOrThrow) !== null;
608
+ if (!legacy && layerExists)
609
+ continue;
610
+ try {
611
+ if (legacy && (layerExists || protection.referenced.has(layerId))) {
612
+ // Security: a duplicate is disposable only with validated canonical evidence, never fallback.
613
+ await readCertifiedDependencyLayer(dataDir, layerId, undefined, { canonicalOnly: true });
614
+ }
615
+ attempted += 1;
616
+ const path = await managedDependencyCertificationPath(dataDir, layerId, legacy);
617
+ if (path !== null)
618
+ await (options.operations?.remove ?? rm)(path, { force: true });
619
+ completed += 1;
620
+ }
621
+ catch (error) {
622
+ await store.recordCleanupFailure(artifactName(candidate), "dependency-layer-certification", error);
623
+ }
624
+ }
625
+ return { attempted, completed };
626
+ }
627
+ async function protectedCompileCachePaths(dataDir, state) {
628
+ const paths = [];
629
+ for (const release of Object.values(state.releases)) {
630
+ try {
631
+ const manifest = JSON.parse(await readFile(resolve(release.releaseRoot, RELEASE_MANIFEST_FILENAME), "utf8"));
632
+ const layers = (manifest.dependencyLayers ?? []).map(layer => layer.layerId).filter((id) => typeof id === "string");
633
+ paths.push(startupCompileCachePath(dataDir, release.releaseId, layers));
634
+ }
635
+ catch {
636
+ paths.push(startupCompileCachePath(dataDir, release.releaseId, []));
637
+ }
638
+ }
639
+ return paths;
640
+ }
641
+ function assertDirectChild(parent, child) {
642
+ const fromParent = relative(parent, child);
643
+ if (fromParent.length === 0 || fromParent === ".." || fromParent.startsWith(`..${sep}`) || isAbsolute(fromParent) || fromParent.includes(sep)) {
644
+ throw new Error(`cleanup path is not a direct child of its managed root: ${child}`);
645
+ }
646
+ }
647
+ function normalizeLimits(input) {
648
+ const limits = { ...DEFAULT_LIMITS, ...input };
649
+ for (const [name, value] of Object.entries(limits)) {
650
+ if (!Number.isSafeInteger(value) || value < 1)
651
+ throw new Error(`invalid release cleanup ${name}: ${value}`);
652
+ }
653
+ return limits;
654
+ }
655
+ function sortCleanupDispositions(dispositions) {
656
+ return [...dispositions].sort((left, right) => left.attempts - right.attempts
657
+ || (left.lastAttemptAt ?? "").localeCompare(right.lastAttemptAt ?? "")
658
+ || left.release.releaseId.localeCompare(right.release.releaseId));
659
+ }
660
+ function sortArtifacts(artifacts, state) {
661
+ const attempts = new Map();
662
+ for (const diagnostic of state.cleanup.diagnostics) {
663
+ attempts.set(diagnostic.releaseId, (attempts.get(diagnostic.releaseId) ?? 0) + 1);
664
+ }
665
+ return [...artifacts].sort((left, right) => (attempts.get(artifactName(left)) ?? 0) - (attempts.get(artifactName(right)) ?? 0)
666
+ || artifactName(left).localeCompare(artifactName(right)));
667
+ }
668
+ async function spawnCleanupWorker(entry, environment) {
669
+ const child = spawn(process.execPath, [entry], {
670
+ detached: true,
671
+ windowsHide: true,
672
+ stdio: "ignore",
673
+ env: environment,
674
+ });
675
+ await new Promise((resolvePromise, rejectPromise) => {
676
+ child.once("spawn", resolvePromise);
677
+ child.once("error", rejectPromise);
678
+ });
679
+ child.unref();
680
+ }
681
+ async function acquireWorkerLease(dataDir, runId) {
682
+ const path = resolve(dataDir, WORKER_LEASE_FILENAME);
683
+ await mkdir(dataDir, { recursive: true, mode: 0o700 });
684
+ try {
685
+ const lease = await open(path, "wx", 0o600);
686
+ await lease.writeFile(JSON.stringify({ runId, pid: process.pid, createdAt: new Date().toISOString() }));
687
+ await lease.sync();
688
+ return lease;
689
+ }
690
+ catch (error) {
691
+ if (!(error instanceof Error && "code" in error && error.code === "EEXIST"))
692
+ throw error;
693
+ }
694
+ const owner = await readWorkerLease(path);
695
+ if (owner?.pid && processIsAlive(owner.pid))
696
+ return null;
697
+ if (owner === null) {
698
+ const metadata = await stat(path).catch(() => null);
699
+ if (metadata !== null && Date.now() - metadata.mtimeMs < 10_000)
700
+ return null;
701
+ }
702
+ const quarantine = `${path}.${randomUUID()}.abandoned`;
703
+ try {
704
+ await rename(path, quarantine);
705
+ await rm(quarantine, { force: true });
706
+ }
707
+ catch {
708
+ return null;
709
+ }
710
+ return await acquireWorkerLease(dataDir, runId);
711
+ }
712
+ async function releaseWorkerLease(dataDir, runId, lease) {
713
+ const path = resolve(dataDir, WORKER_LEASE_FILENAME);
714
+ await lease.close().catch(() => { });
715
+ const owner = await readWorkerLease(path);
716
+ if (owner?.runId === runId)
717
+ await rm(path, { force: true });
718
+ }
719
+ async function readWorkerLease(path) {
720
+ try {
721
+ const value = JSON.parse(await readFile(path, "utf8"));
722
+ return {
723
+ ...(typeof value.runId === "string" ? { runId: value.runId } : {}),
724
+ ...(typeof value.pid === "number" ? { pid: value.pid } : {}),
725
+ };
726
+ }
727
+ catch {
728
+ return null;
729
+ }
730
+ }
731
+ function processIsAlive(pid) {
732
+ try {
733
+ process.kill(pid, 0);
734
+ return true;
735
+ }
736
+ catch (error) {
737
+ return error instanceof Error && "code" in error && error.code === "EPERM";
738
+ }
739
+ }
740
+ function parseWorkerHolds(value) {
741
+ if (!value)
742
+ return [];
743
+ try {
744
+ const parsed = JSON.parse(value);
745
+ if (!Array.isArray(parsed))
746
+ return [];
747
+ return parsed.filter((hold) => Boolean(hold) && typeof hold === "object"
748
+ && (hold.authority === "agent" || hold.authority === "migration")
749
+ && typeof hold.releaseId === "string");
750
+ }
751
+ catch {
752
+ return [];
753
+ }
754
+ }
755
+ function missingOrThrow(error) {
756
+ if (error instanceof Error && "code" in error && error.code === "ENOENT")
757
+ return null;
758
+ throw error;
759
+ }
760
+ function artifactName(path) { return path.split(sep).at(-1) ?? "artifact"; }
761
+ function certificationReleaseId(path) {
762
+ return /^certification-(.+)\.json$/.exec(artifactName(path))?.[1] ?? null;
763
+ }
764
+ function errorMessage(error) { return error instanceof Error ? error.message : String(error); }