@timurproko/a1 0.1.8-dev.49ff83a → 0.1.8-dev.508

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 (865) hide show
  1. package/README.md +168 -65
  2. package/bin/cli.js +33 -11
  3. package/bin/guardian.js +16 -6
  4. package/bin/module-identity.js +76 -69
  5. package/bin/module-resolver.js +138 -0
  6. package/bin/pinned-pi-public.d.ts +3 -0
  7. package/bin/pinned-pi-public.js +93 -0
  8. package/bin/release-cleanup.js +8 -0
  9. package/bin/supervisor.js +2 -2
  10. package/bin/ui.js +67 -22
  11. package/bin/update-recovery.js +343 -0
  12. package/bin/warmup.js +28 -0
  13. package/dist/app/session-shell/clipboard-diagnostics.d.ts +16 -0
  14. package/dist/app/session-shell/clipboard-diagnostics.js +65 -0
  15. package/dist/app/session-shell/clipboard-image.d.ts +11 -0
  16. package/dist/app/session-shell/clipboard-image.js +38 -0
  17. package/dist/app/session-shell/editor-hyperlink-budget.d.ts +9 -0
  18. package/dist/app/session-shell/editor-hyperlink-budget.js +23 -0
  19. package/dist/app/session-shell/helper-pool.d.ts +33 -0
  20. package/dist/app/session-shell/helper-pool.js +98 -0
  21. package/dist/app/session-shell/image-preparation-client.d.ts +20 -0
  22. package/dist/app/session-shell/image-preparation-client.js +145 -0
  23. package/dist/app/session-shell/image-preparation.d.ts +18 -0
  24. package/dist/app/session-shell/image-preparation.js +126 -0
  25. package/dist/app/session-shell/image-source.d.ts +13 -0
  26. package/dist/app/session-shell/image-source.js +171 -0
  27. package/dist/app/session-shell/image-worker.d.ts +17 -0
  28. package/dist/app/session-shell/image-worker.js +23 -0
  29. package/dist/app/session-shell/index.d.ts +7 -0
  30. package/dist/app/session-shell/index.js +4 -0
  31. package/dist/app/session-shell/paste-executor.d.ts +18 -0
  32. package/dist/app/session-shell/paste-executor.js +253 -0
  33. package/dist/app/session-shell/paste-helper.js +173 -0
  34. package/dist/app/session-shell/paste-preparation-client.d.ts +31 -0
  35. package/dist/app/session-shell/paste-preparation-client.js +170 -0
  36. package/dist/app/session-shell/paste-protocol.d.ts +78 -0
  37. package/dist/app/session-shell/paste-protocol.js +18 -0
  38. package/dist/app/session-shell/paste-text-preparation.d.ts +6 -0
  39. package/dist/app/session-shell/paste-text-preparation.js +134 -0
  40. package/dist/app/session-shell/paste-text-worker.js +12 -0
  41. package/dist/app/session-shell/paste-types.d.ts +17 -0
  42. package/dist/app/session-shell/path-chip-presentation.d.ts +7 -0
  43. package/dist/app/session-shell/path-chip-presentation.js +24 -0
  44. package/dist/app/session-shell/prompt-chips.d.ts +76 -0
  45. package/dist/app/session-shell/prompt-chips.js +507 -0
  46. package/dist/app/session-shell/prompt-history-controller.d.ts +36 -0
  47. package/dist/app/session-shell/prompt-history-controller.js +170 -0
  48. package/dist/app/session-shell/prompt-suggestion-controller.d.ts +35 -0
  49. package/dist/app/session-shell/prompt-suggestion-controller.js +207 -0
  50. package/dist/app/session-shell/quit-outro-effects.d.ts +29 -0
  51. package/dist/app/session-shell/quit-outro-effects.js +242 -0
  52. package/dist/app/session-shell/quit-outro.d.ts +38 -0
  53. package/dist/app/session-shell/quit-outro.js +98 -0
  54. package/dist/app/session-shell/response-copy-coordinator.d.ts +27 -0
  55. package/dist/app/session-shell/response-copy-coordinator.js +187 -0
  56. package/dist/app/session-shell/response-copy-helper.js +122 -0
  57. package/dist/app/session-shell/response-copy-protocol.d.ts +56 -0
  58. package/dist/app/session-shell/response-copy-protocol.js +5 -0
  59. package/dist/app/session-shell/response-copy-transport.d.ts +39 -0
  60. package/dist/app/session-shell/response-copy-transport.js +217 -0
  61. package/dist/app/session-shell/session-shell-root.d.ts +265 -0
  62. package/dist/app/session-shell/session-shell-root.js +1366 -0
  63. package/dist/app/session-shell/session-shell.d.ts +59 -0
  64. package/dist/app/session-shell/session-shell.js +1917 -0
  65. package/dist/app/session-shell/session-viewport-controller.d.ts +61 -0
  66. package/dist/app/session-shell/session-viewport-controller.js +597 -0
  67. package/dist/app/session-shell/stream-presentation-coalescer.d.ts +29 -0
  68. package/dist/app/session-shell/stream-presentation-coalescer.js +79 -0
  69. package/dist/app/session-shell/system-clipboard.d.ts +20 -0
  70. package/dist/app/session-shell/system-clipboard.js +159 -0
  71. package/dist/app/session-shell/text-paste.d.ts +5 -0
  72. package/dist/app/session-shell/text-paste.js +16 -0
  73. package/dist/cli/capabilities.d.ts +6 -0
  74. package/dist/cli/capabilities.js +7 -0
  75. package/dist/cli/dispatch.d.ts +46 -0
  76. package/dist/cli/dispatch.js +261 -0
  77. package/dist/cli/index.d.ts +8 -0
  78. package/dist/cli/index.js +4 -0
  79. package/dist/cli/package-messages.d.ts +26 -0
  80. package/dist/cli/package-messages.js +71 -0
  81. package/dist/cli/packages.d.ts +32 -0
  82. package/dist/cli/packages.js +81 -0
  83. package/dist/cli/version-stats.d.ts +22 -0
  84. package/dist/cli/version-stats.js +112 -0
  85. package/dist/composition/index.d.ts +2 -0
  86. package/dist/composition/index.js +2 -0
  87. package/dist/composition/owned-ui.d.ts +37 -0
  88. package/dist/composition/owned-ui.js +136 -0
  89. package/dist/composition/settings-route-host.d.ts +7 -0
  90. package/dist/composition/settings-route-host.js +110 -0
  91. package/dist/contracts/agent-engine/capability-ports.d.ts +95 -0
  92. package/dist/contracts/agent-engine/domain-validation.js +107 -0
  93. package/dist/contracts/agent-engine/domain.d.ts +138 -0
  94. package/dist/contracts/agent-engine/index.d.ts +11 -0
  95. package/dist/contracts/agent-engine/index.js +6 -0
  96. package/dist/contracts/agent-engine/package-ports.d.ts +60 -0
  97. package/dist/contracts/agent-engine/ports.js +1 -0
  98. package/dist/contracts/owned-ui/extension-ui.d.ts +310 -0
  99. package/dist/contracts/owned-ui/image-attachments.d.ts +36 -0
  100. package/dist/contracts/owned-ui/image-attachments.js +67 -0
  101. package/dist/contracts/owned-ui/index.d.ts +12 -0
  102. package/dist/contracts/owned-ui/index.js +8 -0
  103. package/dist/contracts/owned-ui/model.d.ts +378 -0
  104. package/dist/contracts/owned-ui/prompt-history.d.ts +55 -0
  105. package/dist/contracts/owned-ui/prompt-history.js +23 -0
  106. package/dist/contracts/owned-ui/prompt-suggestions.d.ts +3 -0
  107. package/dist/contracts/owned-ui/prompt-suggestions.js +44 -0
  108. package/dist/contracts/owned-ui/suggestion-diagnostics.d.ts +22 -0
  109. package/dist/contracts/owned-ui/suggestion-diagnostics.js +9 -0
  110. package/dist/contracts/owned-ui/transcript-lifecycle.d.ts +5 -0
  111. package/dist/contracts/owned-ui/transcript-lifecycle.js +33 -0
  112. package/dist/contracts/owned-ui/validation.d.ts +15 -0
  113. package/dist/contracts/owned-ui/validation.js +523 -0
  114. package/dist/contracts/presentation/index.d.ts +104 -0
  115. package/dist/features/launch/development-launch.js +36 -0
  116. package/dist/features/launch/index.d.ts +12 -0
  117. package/dist/features/launch/index.js +6 -0
  118. package/dist/features/launch/intent.d.ts +12 -0
  119. package/dist/features/launch/intent.js +8 -0
  120. package/dist/features/launch/prepare-launch.d.ts +11 -0
  121. package/dist/features/launch/prepare-launch.js +14 -0
  122. package/dist/features/launch/profile-paths.d.ts +16 -0
  123. package/dist/features/launch/profile-paths.js +36 -0
  124. package/dist/features/launch/runtime-selection.d.ts +16 -0
  125. package/dist/features/launch/runtime-selection.js +13 -0
  126. package/dist/features/owned-ui/index.d.ts +6 -0
  127. package/dist/features/owned-ui/index.js +4 -0
  128. package/dist/features/owned-ui/project-trust-prompt.d.ts +25 -0
  129. package/dist/features/owned-ui/project-trust-prompt.js +149 -0
  130. package/dist/features/owned-ui/run.d.ts +17 -0
  131. package/dist/features/owned-ui/run.js +64 -0
  132. package/dist/features/owned-ui/session-fork-prompt.d.ts +8 -0
  133. package/dist/features/owned-ui/session-fork-prompt.js +34 -0
  134. package/dist/features/owned-ui/settings-app.d.ts +21 -0
  135. package/dist/features/owned-ui/settings-app.js +807 -0
  136. package/dist/features/owned-ui/settings-route.d.ts +2 -0
  137. package/dist/features/owned-ui/settings-route.js +2 -0
  138. package/dist/features/prompt-history/image-sidecar.d.ts +32 -0
  139. package/dist/features/prompt-history/image-sidecar.js +130 -0
  140. package/dist/features/prompt-history/index.d.ts +4 -0
  141. package/dist/features/prompt-history/index.js +3 -0
  142. package/dist/features/prompt-history/paths.d.ts +5 -0
  143. package/dist/features/prompt-history/paths.js +17 -0
  144. package/dist/features/prompt-history/service.d.ts +54 -0
  145. package/dist/features/prompt-history/service.js +425 -0
  146. package/dist/features/prompt-history/store.d.ts +16 -0
  147. package/dist/features/prompt-history/store.js +219 -0
  148. package/dist/features/prompt-history/worker.d.ts +9 -0
  149. package/dist/features/prompt-history/worker.js +45 -0
  150. package/dist/features/prompt-suggestions/diagnostics.d.ts +18 -0
  151. package/dist/features/prompt-suggestions/diagnostics.js +82 -0
  152. package/dist/features/prompt-suggestions/index.d.ts +2 -0
  153. package/dist/features/prompt-suggestions/index.js +1 -0
  154. package/dist/foundation/launch-context/index.d.ts +59 -0
  155. package/dist/foundation/launch-context/index.js +136 -0
  156. package/dist/foundation/launch-guardian/index.d.ts +2 -0
  157. package/dist/foundation/launch-guardian/index.js +1 -0
  158. package/dist/foundation/launch-guardian/main.d.ts +33 -0
  159. package/dist/foundation/launch-guardian/main.js +180 -0
  160. package/dist/foundation/lifecycle/commands.js +1 -0
  161. package/dist/foundation/lifecycle/index.d.ts +11 -0
  162. package/dist/foundation/lifecycle/index.js +5 -0
  163. package/dist/foundation/lifecycle/model.d.ts +64 -0
  164. package/dist/foundation/lifecycle/model.js +40 -0
  165. package/dist/foundation/lifecycle/paths.d.ts +30 -0
  166. package/dist/foundation/lifecycle/paths.js +70 -0
  167. package/dist/foundation/lifecycle/session-selection.d.ts +9 -0
  168. package/dist/foundation/lifecycle/session-selection.js +39 -0
  169. package/dist/foundation/lifecycle/supervisor-startup.d.ts +30 -0
  170. package/dist/foundation/lifecycle/supervisor-startup.js +106 -0
  171. package/dist/foundation/process-containment/darwin-process-inspector.d.ts +5 -0
  172. package/dist/foundation/process-containment/darwin-process-inspector.js +7 -0
  173. package/dist/foundation/process-containment/index.d.ts +8 -0
  174. package/dist/foundation/process-containment/index.js +6 -0
  175. package/dist/foundation/process-containment/linux-process-inspector.d.ts +7 -0
  176. package/dist/foundation/process-containment/linux-process-inspector.js +27 -0
  177. package/dist/foundation/process-containment/native-guardian-containment.d.ts +17 -0
  178. package/dist/foundation/process-containment/native-guardian-containment.js +140 -0
  179. package/dist/foundation/process-containment/windows-process-inspector.d.ts +19 -0
  180. package/dist/foundation/process-containment/windows-process-inspector.js +56 -0
  181. package/dist/foundation/protocol/client.d.ts +18 -0
  182. package/dist/foundation/protocol/client.js +130 -0
  183. package/dist/foundation/protocol/index.d.ts +3 -0
  184. package/dist/foundation/protocol/index.js +2 -0
  185. package/dist/foundation/protocol/messages.d.ts +90 -0
  186. package/dist/foundation/protocol/messages.js +100 -0
  187. package/dist/foundation/release/bootstrap.d.ts +51 -0
  188. package/dist/foundation/release/bootstrap.js +427 -0
  189. package/dist/foundation/release/cohort-state.d.ts +157 -0
  190. package/dist/foundation/release/cohort-state.js +472 -0
  191. package/dist/foundation/release/dependency-certification-retention.d.ts +7 -0
  192. package/dist/foundation/release/dependency-certification-retention.js +88 -0
  193. package/dist/foundation/release/dependency-certification.d.ts +24 -0
  194. package/dist/foundation/release/dependency-certification.js +266 -0
  195. package/dist/foundation/release/dependency-layer.d.ts +78 -0
  196. package/dist/foundation/release/dependency-layer.js +466 -0
  197. package/dist/foundation/release/endpoints.d.ts +24 -0
  198. package/dist/foundation/release/endpoints.js +134 -0
  199. package/dist/foundation/release/immutable-platform.d.ts +6 -0
  200. package/dist/foundation/release/immutable-platform.js +13 -0
  201. package/dist/foundation/release/index.d.ts +30 -0
  202. package/dist/foundation/release/index.js +16 -0
  203. package/dist/foundation/release/release-gc.d.ts +71 -0
  204. package/dist/foundation/release/release-gc.js +764 -0
  205. package/dist/foundation/release/release-store.d.ts +49 -0
  206. package/dist/foundation/release/release-store.js +235 -0
  207. package/dist/foundation/release/release.d.ts +43 -0
  208. package/dist/foundation/release/release.js +215 -0
  209. package/dist/foundation/release/restart-certification.d.ts +68 -0
  210. package/dist/foundation/release/restart-certification.js +227 -0
  211. package/dist/foundation/release/types.d.ts +11 -0
  212. package/dist/foundation/release/types.js +1 -0
  213. package/dist/foundation/release/update-launch.d.ts +6 -0
  214. package/dist/foundation/release/update-launch.js +17 -0
  215. package/dist/foundation/release/update-recovery.d.ts +76 -0
  216. package/dist/foundation/release/update-recovery.js +356 -0
  217. package/dist/foundation/release/update-transaction.d.ts +42 -0
  218. package/dist/foundation/release/update-transaction.js +101 -0
  219. package/dist/foundation/release/update.d.ts +119 -0
  220. package/dist/foundation/release/update.js +632 -0
  221. package/dist/foundation/release/warmup.d.ts +3 -0
  222. package/dist/foundation/release/warmup.js +47 -0
  223. package/dist/foundation/startup/index.d.ts +4 -0
  224. package/dist/foundation/startup/index.js +2 -0
  225. package/dist/foundation/startup/startup-budget.d.ts +46 -0
  226. package/dist/foundation/startup/startup-budget.js +42 -0
  227. package/dist/foundation/startup/startup-descriptor.js +34 -0
  228. package/dist/foundation/startup/startup-runtime.d.ts +27 -0
  229. package/dist/foundation/startup/startup-runtime.js +128 -0
  230. package/dist/foundation/storage/control-store.d.ts +18 -0
  231. package/dist/foundation/storage/control-store.js +342 -0
  232. package/dist/foundation/storage/index.d.ts +1 -0
  233. package/dist/foundation/storage/index.js +1 -0
  234. package/dist/foundation/supervision/index.d.ts +3 -0
  235. package/dist/foundation/supervision/index.js +3 -0
  236. package/dist/foundation/supervision/main.d.ts +1 -0
  237. package/dist/foundation/supervision/main.js +84 -0
  238. package/dist/foundation/supervision/paths.d.ts +1 -0
  239. package/dist/foundation/supervision/paths.js +1 -0
  240. package/dist/foundation/supervision/server.d.ts +46 -0
  241. package/dist/foundation/supervision/server.js +573 -0
  242. package/dist/foundation/terminal-cleanup/fatal-exit.d.ts +12 -0
  243. package/dist/foundation/terminal-cleanup/fatal-exit.js +87 -0
  244. package/dist/foundation/terminal-cleanup/index.d.ts +3 -0
  245. package/dist/foundation/terminal-cleanup/index.js +2 -0
  246. package/dist/foundation/terminal-cleanup/terminal-reset.d.ts +4 -0
  247. package/dist/foundation/terminal-cleanup/terminal-reset.js +40 -0
  248. package/dist/integrations/pi/components/components.d.ts +4 -0
  249. package/dist/integrations/pi/components/components.js +64 -0
  250. package/dist/integrations/pi/components/conformance.d.ts +18 -0
  251. package/dist/integrations/pi/components/conformance.js +70 -0
  252. package/dist/integrations/pi/components/editor-interaction.d.ts +38 -0
  253. package/dist/integrations/pi/components/editor-interaction.js +1 -0
  254. package/dist/integrations/pi/components/history-editor-loader.d.ts +5 -0
  255. package/dist/integrations/pi/components/history-editor-loader.js +5 -0
  256. package/dist/integrations/pi/components/index.d.ts +21 -0
  257. package/dist/integrations/pi/components/index.js +13 -0
  258. package/dist/integrations/pi/components/owned-editor-ux.d.ts +74 -0
  259. package/dist/integrations/pi/components/owned-editor-ux.js +1094 -0
  260. package/dist/integrations/pi/components/path-word-ranges.d.ts +2 -0
  261. package/dist/integrations/pi/components/path-word-ranges.js +37 -0
  262. package/dist/integrations/pi/components/prompt-input-port.d.ts +18 -0
  263. package/dist/integrations/pi/components/prompt-input-port.js +1 -0
  264. package/dist/integrations/pi/components/resources/builtin-themes.d.ts +167 -0
  265. package/dist/integrations/pi/components/resources/builtin-themes.js +168 -0
  266. package/dist/integrations/pi/components/shell-components.d.ts +7 -0
  267. package/dist/integrations/pi/components/shell-components.js +7 -0
  268. package/dist/integrations/pi/components/shell-editor-autocomplete.js +298 -0
  269. package/dist/integrations/pi/components/shell-extension-ui.d.ts +35 -0
  270. package/dist/integrations/pi/components/shell-extension-ui.js +280 -0
  271. package/dist/integrations/pi/components/shell-footer-status.d.ts +7 -0
  272. package/dist/integrations/pi/components/shell-footer-status.js +248 -0
  273. package/dist/integrations/pi/components/shell-presenters-info.d.ts +43 -0
  274. package/dist/integrations/pi/components/shell-presenters-info.js +114 -0
  275. package/dist/integrations/pi/components/shell-presenters-transcript.d.ts +29 -0
  276. package/dist/integrations/pi/components/shell-presenters-transcript.js +433 -0
  277. package/dist/integrations/pi/components/shell-selectors-dialogs.d.ts +123 -0
  278. package/dist/integrations/pi/components/shell-selectors-dialogs.js +242 -0
  279. package/dist/integrations/pi/components/shell-shared-facade.d.ts +217 -0
  280. package/dist/integrations/pi/components/shell-shared-facade.js +92 -0
  281. package/dist/integrations/pi/components/submitted-prompt-adapter.d.ts +17 -0
  282. package/dist/integrations/pi/components/submitted-prompt-adapter.js +49 -0
  283. package/dist/integrations/pi/components/tool-image-presentation.d.ts +21 -0
  284. package/dist/integrations/pi/components/tool-image-presentation.js +83 -0
  285. package/dist/integrations/pi/components/tool-result-adapter.d.ts +6 -0
  286. package/dist/integrations/pi/components/tool-result-adapter.js +27 -0
  287. package/dist/integrations/pi/components/transcript-image-resolver.d.ts +7 -0
  288. package/dist/integrations/pi/components/transcript-image-resolver.js +19 -0
  289. package/dist/integrations/pi/components/upstream/adjacent/core/keybindings.d.ts +445 -0
  290. package/dist/integrations/pi/components/upstream/adjacent/core/keybindings.js +370 -0
  291. package/dist/integrations/pi/components/upstream/assets/earendil-image.json +12 -0
  292. package/dist/integrations/pi/components/upstream/components/countdown-timer.d.ts +13 -0
  293. package/dist/integrations/pi/components/upstream/components/daxnuts.d.ts +29 -0
  294. package/dist/integrations/pi/components/upstream/components/daxnuts.js +146 -0
  295. package/dist/integrations/pi/components/upstream/components/earendil-announcement.d.ts +4 -0
  296. package/dist/integrations/pi/components/upstream/components/earendil-announcement.js +48 -0
  297. package/dist/integrations/pi/components/upstream/components/extension-editor.d.ts +20 -0
  298. package/dist/integrations/pi/components/upstream/components/extension-editor.js +84 -0
  299. package/dist/integrations/pi/components/upstream/components/mermaid.js +81 -0
  300. package/dist/integrations/pi/components/upstream/components/owned-editor.d.ts +46 -0
  301. package/dist/integrations/pi/components/upstream/components/owned-editor.js +187 -0
  302. package/dist/integrations/pi/components/upstream/components/scoped-models-selector.d.ts +59 -0
  303. package/dist/integrations/pi/components/upstream/components/scoped-models-selector.js +346 -0
  304. package/dist/integrations/pi/components/upstream/components/session-footer.d.ts +11 -0
  305. package/dist/integrations/pi/components/upstream/components/session-footer.js +123 -0
  306. package/dist/integrations/pi/components/upstream/components/session-selector-search.js +161 -0
  307. package/dist/integrations/pi/components/upstream/components/session-selector.d.ts +95 -0
  308. package/dist/integrations/pi/components/upstream/components/session-selector.js +893 -0
  309. package/dist/integrations/pi/components/upstream/components/skill-invocation-message.d.ts +21 -0
  310. package/dist/integrations/pi/components/upstream/components/skill-invocation-message.js +46 -0
  311. package/dist/integrations/pi/components/upstream/components/status-indicator.d.ts +35 -0
  312. package/dist/integrations/pi/components/upstream/components/status-indicator.js +69 -0
  313. package/dist/integrations/pi/components/upstream/components/tool-execution.d.ts +67 -0
  314. package/dist/integrations/pi/components/upstream/components/tool-execution.js +365 -0
  315. package/dist/integrations/pi/components/upstream/components/tree-selector.d.ts +101 -0
  316. package/dist/integrations/pi/components/upstream/components/tree-selector.js +1275 -0
  317. package/dist/integrations/pi/components/upstream/components/trust-selector.d.ts +33 -0
  318. package/dist/integrations/pi/components/upstream/components/trust-selector.js +81 -0
  319. package/dist/integrations/pi/components/upstream/external-editor.js +43 -0
  320. package/dist/integrations/pi/components/upstream/history/editor-core.d.ts +289 -0
  321. package/dist/integrations/pi/components/upstream/history/editor-core.js +2144 -0
  322. package/dist/integrations/pi/components/upstream/history/kill-ring.d.ts +35 -0
  323. package/dist/integrations/pi/components/upstream/history/kill-ring.js +51 -0
  324. package/dist/integrations/pi/components/upstream/history/printable-key.d.ts +1 -0
  325. package/dist/integrations/pi/components/upstream/history/printable-key.js +43 -0
  326. package/dist/integrations/pi/components/upstream/history/text-helpers.d.ts +14 -0
  327. package/dist/integrations/pi/components/upstream/history/text-helpers.js +31 -0
  328. package/dist/integrations/pi/components/upstream/history/undo-stack.d.ts +25 -0
  329. package/dist/integrations/pi/components/upstream/history/undo-stack.js +39 -0
  330. package/dist/integrations/pi/components/upstream/history/word-navigation.d.ts +24 -0
  331. package/dist/integrations/pi/components/upstream/history/word-navigation.js +103 -0
  332. package/dist/integrations/pi/components/upstream/model-search.d.ts +18 -0
  333. package/dist/integrations/pi/components/upstream/theme/theme-controller.d.ts +33 -0
  334. package/dist/integrations/pi/components/upstream/theme/theme-controller.js +114 -0
  335. package/dist/integrations/pi/components/upstream/theme/theme.d.ts +61 -0
  336. package/dist/integrations/pi/components/upstream/theme/theme.js +337 -0
  337. package/dist/integrations/pi/engine/adapter.d.ts +135 -0
  338. package/dist/integrations/pi/engine/adapter.js +648 -0
  339. package/dist/integrations/pi/engine/changelog.d.ts +2 -0
  340. package/dist/integrations/pi/engine/changelog.js +63 -0
  341. package/dist/integrations/pi/engine/command-dispatch.d.ts +41 -0
  342. package/dist/integrations/pi/engine/command-dispatch.js +125 -0
  343. package/dist/integrations/pi/engine/compaction-progress.d.ts +28 -0
  344. package/dist/integrations/pi/engine/compaction-progress.js +96 -0
  345. package/dist/integrations/pi/engine/conformance.d.ts +39 -0
  346. package/dist/integrations/pi/engine/conformance.js +140 -0
  347. package/dist/integrations/pi/engine/event-delivery.d.ts +100 -0
  348. package/dist/integrations/pi/engine/event-delivery.js +184 -0
  349. package/dist/integrations/pi/engine/extension-ui-binding.d.ts +35 -0
  350. package/dist/integrations/pi/engine/extension-ui-binding.js +81 -0
  351. package/dist/integrations/pi/engine/http-dispatcher.d.ts +4 -0
  352. package/dist/integrations/pi/engine/http-dispatcher.js +25 -0
  353. package/dist/integrations/pi/engine/index.d.ts +18 -0
  354. package/dist/integrations/pi/engine/index.js +10 -0
  355. package/dist/integrations/pi/engine/message-values.d.ts +29 -0
  356. package/dist/integrations/pi/engine/message-values.js +168 -0
  357. package/dist/integrations/pi/engine/package-integration.d.ts +13 -0
  358. package/dist/integrations/pi/engine/package-integration.js +118 -0
  359. package/dist/integrations/pi/engine/pending-delivery.d.ts +30 -0
  360. package/dist/integrations/pi/engine/pending-delivery.js +156 -0
  361. package/dist/integrations/pi/engine/pi-settings-metadata.json +385 -0
  362. package/dist/integrations/pi/engine/project-trust-preflight.d.ts +22 -0
  363. package/dist/integrations/pi/engine/project-trust-preflight.js +50 -0
  364. package/dist/integrations/pi/engine/prompt-suggestions.d.ts +30 -0
  365. package/dist/integrations/pi/engine/prompt-suggestions.js +102 -0
  366. package/dist/integrations/pi/engine/provider-authentication.d.ts +34 -0
  367. package/dist/integrations/pi/engine/provider-authentication.js +209 -0
  368. package/dist/integrations/pi/engine/resource-catalog.d.ts +49 -0
  369. package/dist/integrations/pi/engine/resource-catalog.js +289 -0
  370. package/dist/integrations/pi/engine/resources/changelog.json +12 -0
  371. package/dist/integrations/pi/engine/runtime-integration.d.ts +53 -0
  372. package/dist/integrations/pi/engine/runtime-integration.js +118 -0
  373. package/dist/integrations/pi/engine/session-events.d.ts +48 -0
  374. package/dist/integrations/pi/engine/session-events.js +223 -0
  375. package/dist/integrations/pi/engine/session-integration.d.ts +67 -0
  376. package/dist/integrations/pi/engine/session-integration.js +195 -0
  377. package/dist/integrations/pi/engine/session-runtime.d.ts +84 -0
  378. package/dist/integrations/pi/engine/session-runtime.js +249 -0
  379. package/dist/integrations/pi/engine/session-selection.d.ts +28 -0
  380. package/dist/integrations/pi/engine/session-selection.js +90 -0
  381. package/dist/integrations/pi/engine/settings-bridge.d.ts +121 -0
  382. package/dist/integrations/pi/engine/settings-bridge.js +514 -0
  383. package/dist/integrations/pi/engine/settings-metadata.d.ts +31 -0
  384. package/dist/integrations/pi/engine/settings-metadata.js +67 -0
  385. package/dist/integrations/pi/engine/settings-port.d.ts +42 -0
  386. package/dist/integrations/pi/engine/settings-port.js +353 -0
  387. package/dist/integrations/pi/engine/tool-rendering.d.ts +13 -0
  388. package/dist/integrations/pi/engine/tool-rendering.js +145 -0
  389. package/dist/integrations/pi/engine/transcript-image-assets.d.ts +11 -0
  390. package/dist/integrations/pi/engine/transcript-image-assets.js +86 -0
  391. package/dist/integrations/pi/engine/transcript-projection.d.ts +39 -0
  392. package/dist/integrations/pi/engine/transcript-projection.js +405 -0
  393. package/dist/integrations/pi/engine/usage-view.d.ts +4 -0
  394. package/dist/integrations/pi/engine/usage-view.js +56 -0
  395. package/dist/integrations/pi/engine/windows-filesystem-hygiene.d.ts +21 -0
  396. package/dist/integrations/pi/engine/windows-filesystem-hygiene.js +55 -0
  397. package/dist/integrations/pi/engine/workflow-contexts.d.ts +59 -0
  398. package/dist/integrations/pi/engine/workflow-contexts.js +316 -0
  399. package/dist/integrations/pi/engine/workflow-runner.d.ts +60 -0
  400. package/dist/integrations/pi/engine/workflow-runner.js +509 -0
  401. package/dist/integrations/pi/engine/workflow-support.d.ts +33 -0
  402. package/dist/integrations/pi/engine/workflow-support.js +352 -0
  403. package/dist/integrations/pi/engine/workflows.d.ts +251 -0
  404. package/dist/integrations/pi/engine/workflows.js +63 -0
  405. package/dist/integrations/pi/startup-public.d.ts +2 -0
  406. package/dist/integrations/pi/startup-public.js +2223 -0
  407. package/dist/integrations/pi/startup-public.manifest.json +12502 -0
  408. package/dist/integrations/pi/tui-runtime/adapter.d.ts +56 -0
  409. package/dist/integrations/pi/tui-runtime/adapter.js +783 -0
  410. package/dist/integrations/pi/tui-runtime/contracts.d.ts +156 -0
  411. package/dist/integrations/pi/tui-runtime/contracts.js +1 -0
  412. package/dist/integrations/pi/tui-runtime/damage-aware-terminal.d.ts +88 -0
  413. package/dist/integrations/pi/tui-runtime/damage-aware-terminal.js +433 -0
  414. package/dist/integrations/pi/tui-runtime/index.d.ts +9 -0
  415. package/dist/integrations/pi/tui-runtime/index.js +5 -0
  416. package/dist/integrations/pi/tui-runtime/input-presentation-coordinator.d.ts +39 -0
  417. package/dist/integrations/pi/tui-runtime/input-presentation-coordinator.js +139 -0
  418. package/dist/integrations/pi/tui-runtime/mouse-report-input.d.ts +13 -0
  419. package/dist/integrations/pi/tui-runtime/mouse-report-input.js +57 -0
  420. package/dist/integrations/pi/tui-runtime/overlay-geometry.d.ts +32 -0
  421. package/dist/integrations/pi/tui-runtime/overlay-geometry.js +158 -0
  422. package/dist/integrations/pi/tui-runtime/presentation-adapter.d.ts +4 -0
  423. package/dist/integrations/pi/tui-runtime/presentation-adapter.js +48 -0
  424. package/dist/native/darwin-arm64/manifest.json +4 -4
  425. package/dist/native/darwin-arm64/process-guardian +0 -0
  426. package/dist/native/linux-x64/manifest.json +3 -3
  427. package/dist/native/linux-x64/process-guardian +0 -0
  428. package/dist/native/win32-x64/manifest.json +3 -3
  429. package/dist/native/win32-x64/process-guardian.exe +0 -0
  430. package/dist/product-identity.d.ts +37 -0
  431. package/dist/product-identity.js +119 -0
  432. package/dist/product-identity.json +85 -0
  433. package/dist/runtime-payload-inventory.json +127147 -0
  434. package/dist/ui/apps/contracts.d.ts +64 -0
  435. package/dist/ui/apps/host.d.ts +42 -0
  436. package/dist/ui/apps/host.js +156 -0
  437. package/dist/ui/apps/index.d.ts +5 -0
  438. package/dist/ui/apps/index.js +3 -0
  439. package/dist/ui/apps/registry.d.ts +12 -0
  440. package/dist/ui/apps/registry.js +33 -0
  441. package/dist/ui/components/dialog-panel.js +49 -0
  442. package/dist/ui/components/frame.d.ts +22 -0
  443. package/dist/ui/components/frame.js +55 -0
  444. package/dist/ui/components/index.d.ts +47 -0
  445. package/dist/ui/components/index.js +25 -0
  446. package/dist/ui/components/line-input.d.ts +68 -0
  447. package/dist/ui/components/line-input.js +224 -0
  448. package/dist/ui/components/list-view.d.ts +60 -0
  449. package/dist/ui/components/list-view.js +82 -0
  450. package/dist/ui/components/mouse.d.ts +25 -0
  451. package/dist/ui/components/mouse.js +70 -0
  452. package/dist/ui/components/progress-status.d.ts +2 -0
  453. package/dist/ui/components/progress-status.js +4 -0
  454. package/dist/ui/components/prompt-input.d.ts +32 -0
  455. package/dist/ui/components/prompt-input.js +51 -0
  456. package/dist/ui/components/scrollbar.d.ts +88 -0
  457. package/dist/ui/components/scrollbar.js +137 -0
  458. package/dist/ui/components/selection-copy.d.ts +24 -0
  459. package/dist/ui/components/selection-copy.js +39 -0
  460. package/dist/ui/components/shortcuts.d.ts +58 -0
  461. package/dist/ui/components/shortcuts.js +82 -0
  462. package/dist/ui/components/spans.d.ts +28 -0
  463. package/dist/ui/components/spans.js +266 -0
  464. package/dist/ui/components/submitted-prompt.d.ts +23 -0
  465. package/dist/ui/components/submitted-prompt.js +50 -0
  466. package/dist/ui/components/surface.d.ts +20 -0
  467. package/dist/ui/components/surface.js +44 -0
  468. package/dist/ui/components/text-selection.d.ts +62 -0
  469. package/dist/ui/components/text-selection.js +210 -0
  470. package/dist/ui/components/text.d.ts +38 -0
  471. package/dist/ui/components/text.js +185 -0
  472. package/dist/ui/components/transcript-viewport.d.ts +173 -0
  473. package/dist/ui/components/transcript-viewport.js +753 -0
  474. package/dist/ui/components/visible-hyperlinks.d.ts +26 -0
  475. package/dist/ui/components/visible-hyperlinks.js +97 -0
  476. package/dist/ui/settings/declarations.d.ts +141 -0
  477. package/dist/ui/settings/declarations.js +135 -0
  478. package/dist/ui/settings/index.d.ts +10 -0
  479. package/dist/ui/settings/index.js +5 -0
  480. package/dist/ui/settings/manager.d.ts +54 -0
  481. package/dist/ui/settings/manager.js +256 -0
  482. package/dist/ui/settings/migrations.d.ts +13 -0
  483. package/dist/ui/settings/migrations.js +74 -0
  484. package/dist/ui/settings/sections.d.ts +52 -0
  485. package/dist/ui/settings/sections.js +112 -0
  486. package/docs/architecture/boundaries.md +17 -13
  487. package/docs/architecture/code-documentation.md +77 -0
  488. package/docs/architecture/history-editor-provenance.md +100 -0
  489. package/docs/architecture/internal-naming.md +91 -0
  490. package/docs/architecture/process-guardian-provenance.md +3 -1
  491. package/docs/architecture/project-structure.md +69 -30
  492. package/docs/architecture/prompt-suggestions.md +68 -0
  493. package/docs/architecture/resource-and-data-policy.md +28 -2
  494. package/docs/architecture/response-copy-delivery.md +85 -0
  495. package/docs/architecture/terminal-host-proof-gate.md +1 -1
  496. package/docs/architecture/terminal-host-spike-evidence.md +1 -1
  497. package/docs/architecture/tool-image-presentation.md +62 -0
  498. package/docs/architecture/toolchain.md +32 -10
  499. package/docs/architecture/ui-reference-provenance.md +60 -6
  500. package/docs/ci-release-runbook.md +256 -79
  501. package/docs/features/launch-profiles.md +24 -17
  502. package/docs/features/modal-content-interaction.md +37 -0
  503. package/docs/features/prompt-history.md +149 -0
  504. package/docs/local-worktree-cleanup.md +212 -0
  505. package/docs/manual-code-streaming-cleanup.md +88 -0
  506. package/docs/manual-ghost-link-baseline.md +89 -0
  507. package/docs/manual-launch-instance-acceptance.md +12 -35
  508. package/docs/manual-owned-ui-checkpoint.md +79 -0
  509. package/docs/manual-pi-boundary-candidate.md +4 -5
  510. package/docs/manual-terminal-colour-check.md +4 -3
  511. package/docs/openspec-archive-automation.md +259 -0
  512. package/docs/repository-governance-live-acceptance.md +77 -0
  513. package/docs/validation.md +100 -0
  514. package/package.json +49 -34
  515. package/dist/src/cli/capabilities.d.ts +0 -15
  516. package/dist/src/cli/capabilities.js +0 -7
  517. package/dist/src/cli/dispatch.d.ts +0 -32
  518. package/dist/src/cli/dispatch.js +0 -142
  519. package/dist/src/cli/index.d.ts +0 -5
  520. package/dist/src/cli/index.js +0 -5
  521. package/dist/src/cli/packages.d.ts +0 -23
  522. package/dist/src/cli/packages.js +0 -84
  523. package/dist/src/cli/version-stats.d.ts +0 -16
  524. package/dist/src/cli/version-stats.js +0 -72
  525. package/dist/src/cli/version.d.ts +0 -2
  526. package/dist/src/cli/version.js +0 -23
  527. package/dist/src/composition/index.d.ts +0 -48
  528. package/dist/src/composition/index.js +0 -258
  529. package/dist/src/features/launch/development-launch.js +0 -28
  530. package/dist/src/features/launch/index.d.ts +0 -7
  531. package/dist/src/features/launch/index.js +0 -7
  532. package/dist/src/features/launch/intent.d.ts +0 -7
  533. package/dist/src/features/launch/intent.js +0 -4
  534. package/dist/src/features/launch/prepare-launch.d.ts +0 -13
  535. package/dist/src/features/launch/prepare-launch.js +0 -21
  536. package/dist/src/features/launch/profile-paths.d.ts +0 -15
  537. package/dist/src/features/launch/profile-paths.js +0 -31
  538. package/dist/src/features/launch/profiles.d.ts +0 -12
  539. package/dist/src/features/launch/profiles.js +0 -26
  540. package/dist/src/features/launch/runtime-selection.d.ts +0 -19
  541. package/dist/src/features/launch/runtime-selection.js +0 -13
  542. package/dist/src/features/owned-ui/customization.d.ts +0 -38
  543. package/dist/src/features/owned-ui/customization.js +0 -108
  544. package/dist/src/features/owned-ui/diagnostics.d.ts +0 -33
  545. package/dist/src/features/owned-ui/diagnostics.js +0 -94
  546. package/dist/src/features/owned-ui/index.d.ts +0 -4
  547. package/dist/src/features/owned-ui/index.js +0 -4
  548. package/dist/src/features/owned-ui/run.d.ts +0 -11
  549. package/dist/src/features/owned-ui/run.js +0 -15
  550. package/dist/src/features/owned-ui/settings-app.d.ts +0 -22
  551. package/dist/src/features/owned-ui/settings-app.js +0 -633
  552. package/dist/src/features/workspace/capabilities.d.ts +0 -31
  553. package/dist/src/features/workspace/capabilities.js +0 -75
  554. package/dist/src/features/workspace/index.d.ts +0 -6
  555. package/dist/src/features/workspace/index.js +0 -6
  556. package/dist/src/features/workspace/presentation.d.ts +0 -30
  557. package/dist/src/features/workspace/presentation.js +0 -70
  558. package/dist/src/features/workspace/reconciliation.d.ts +0 -15
  559. package/dist/src/features/workspace/reconciliation.js +0 -82
  560. package/dist/src/features/workspace/reducer.d.ts +0 -42
  561. package/dist/src/features/workspace/reducer.js +0 -213
  562. package/dist/src/features/workspace/router.d.ts +0 -31
  563. package/dist/src/features/workspace/router.js +0 -124
  564. package/dist/src/features/workspace/store.d.ts +0 -17
  565. package/dist/src/features/workspace/store.js +0 -54
  566. package/dist/src/foundation/agent-engine-contracts/capability-ports.d.ts +0 -95
  567. package/dist/src/foundation/agent-engine-contracts/domain-validation.js +0 -89
  568. package/dist/src/foundation/agent-engine-contracts/domain.d.ts +0 -116
  569. package/dist/src/foundation/agent-engine-contracts/index.d.ts +0 -8
  570. package/dist/src/foundation/agent-engine-contracts/index.js +0 -8
  571. package/dist/src/foundation/agent-engine-contracts/package-ports.d.ts +0 -54
  572. package/dist/src/foundation/launch-guardian/index.d.ts +0 -1
  573. package/dist/src/foundation/launch-guardian/index.js +0 -1
  574. package/dist/src/foundation/launch-guardian/main.d.ts +0 -31
  575. package/dist/src/foundation/launch-guardian/main.js +0 -165
  576. package/dist/src/foundation/lifecycle/index.d.ts +0 -4
  577. package/dist/src/foundation/lifecycle/index.js +0 -4
  578. package/dist/src/foundation/lifecycle/model.d.ts +0 -64
  579. package/dist/src/foundation/lifecycle/model.js +0 -40
  580. package/dist/src/foundation/lifecycle/paths.d.ts +0 -10
  581. package/dist/src/foundation/lifecycle/paths.js +0 -42
  582. package/dist/src/foundation/native-host-protocol/codec.d.ts +0 -11
  583. package/dist/src/foundation/native-host-protocol/codec.js +0 -56
  584. package/dist/src/foundation/native-host-protocol/evidence.d.ts +0 -67
  585. package/dist/src/foundation/native-host-protocol/evidence.js +0 -141
  586. package/dist/src/foundation/native-host-protocol/index.d.ts +0 -4
  587. package/dist/src/foundation/native-host-protocol/index.js +0 -4
  588. package/dist/src/foundation/native-host-protocol/messages.d.ts +0 -56
  589. package/dist/src/foundation/native-host-protocol/messages.js +0 -149
  590. package/dist/src/foundation/native-host-protocol/proof-gate.d.ts +0 -13
  591. package/dist/src/foundation/native-host-protocol/proof-gate.js +0 -33
  592. package/dist/src/foundation/owned-ui-contracts/extension-ui.d.ts +0 -302
  593. package/dist/src/foundation/owned-ui-contracts/index.d.ts +0 -3
  594. package/dist/src/foundation/owned-ui-contracts/index.js +0 -3
  595. package/dist/src/foundation/owned-ui-contracts/model.d.ts +0 -241
  596. package/dist/src/foundation/owned-ui-contracts/validation.d.ts +0 -11
  597. package/dist/src/foundation/owned-ui-contracts/validation.js +0 -395
  598. package/dist/src/foundation/owned-ui-settings/declarations.d.ts +0 -13
  599. package/dist/src/foundation/owned-ui-settings/declarations.js +0 -39
  600. package/dist/src/foundation/owned-ui-settings/index.d.ts +0 -6
  601. package/dist/src/foundation/owned-ui-settings/index.js +0 -6
  602. package/dist/src/foundation/owned-ui-settings/migrations.d.ts +0 -13
  603. package/dist/src/foundation/owned-ui-settings/migrations.js +0 -28
  604. package/dist/src/foundation/owned-ui-settings/sections.d.ts +0 -70
  605. package/dist/src/foundation/owned-ui-settings/sections.js +0 -93
  606. package/dist/src/foundation/owned-ui-settings/session.d.ts +0 -44
  607. package/dist/src/foundation/owned-ui-settings/session.js +0 -145
  608. package/dist/src/foundation/owned-ui-settings/store.d.ts +0 -28
  609. package/dist/src/foundation/owned-ui-settings/store.js +0 -90
  610. package/dist/src/foundation/pi-component-adapter/components.d.ts +0 -4
  611. package/dist/src/foundation/pi-component-adapter/components.js +0 -64
  612. package/dist/src/foundation/pi-component-adapter/conformance.d.ts +0 -17
  613. package/dist/src/foundation/pi-component-adapter/conformance.js +0 -69
  614. package/dist/src/foundation/pi-component-adapter/index.d.ts +0 -13
  615. package/dist/src/foundation/pi-component-adapter/index.js +0 -13
  616. package/dist/src/foundation/pi-component-adapter/resources/builtin-themes.d.ts +0 -165
  617. package/dist/src/foundation/pi-component-adapter/resources/builtin-themes.js +0 -166
  618. package/dist/src/foundation/pi-component-adapter/shell-components.d.ts +0 -6
  619. package/dist/src/foundation/pi-component-adapter/shell-components.js +0 -6
  620. package/dist/src/foundation/pi-component-adapter/shell-editor-autocomplete.js +0 -162
  621. package/dist/src/foundation/pi-component-adapter/shell-extension-ui.d.ts +0 -35
  622. package/dist/src/foundation/pi-component-adapter/shell-extension-ui.js +0 -279
  623. package/dist/src/foundation/pi-component-adapter/shell-footer-status.d.ts +0 -7
  624. package/dist/src/foundation/pi-component-adapter/shell-footer-status.js +0 -189
  625. package/dist/src/foundation/pi-component-adapter/shell-presenters-transcript.d.ts +0 -57
  626. package/dist/src/foundation/pi-component-adapter/shell-presenters-transcript.js +0 -429
  627. package/dist/src/foundation/pi-component-adapter/shell-selectors-dialogs.d.ts +0 -113
  628. package/dist/src/foundation/pi-component-adapter/shell-selectors-dialogs.js +0 -235
  629. package/dist/src/foundation/pi-component-adapter/shell-shared-facade.d.ts +0 -116
  630. package/dist/src/foundation/pi-component-adapter/shell-shared-facade.js +0 -87
  631. package/dist/src/foundation/pi-component-adapter/upstream/adjacent/core/keybindings.d.ts +0 -422
  632. package/dist/src/foundation/pi-component-adapter/upstream/adjacent/core/keybindings.js +0 -296
  633. package/dist/src/foundation/pi-component-adapter/upstream/components/countdown-timer.d.ts +0 -10
  634. package/dist/src/foundation/pi-component-adapter/upstream/components/custom-entry.d.ts +0 -17
  635. package/dist/src/foundation/pi-component-adapter/upstream/components/custom-entry.js +0 -51
  636. package/dist/src/foundation/pi-component-adapter/upstream/components/daxnuts.d.ts +0 -22
  637. package/dist/src/foundation/pi-component-adapter/upstream/components/daxnuts.js +0 -142
  638. package/dist/src/foundation/pi-component-adapter/upstream/components/earendil-announcement.d.ts +0 -4
  639. package/dist/src/foundation/pi-component-adapter/upstream/components/earendil-announcement.js +0 -19
  640. package/dist/src/foundation/pi-component-adapter/upstream/components/extension-editor.d.ts +0 -17
  641. package/dist/src/foundation/pi-component-adapter/upstream/components/extension-editor.js +0 -81
  642. package/dist/src/foundation/pi-component-adapter/upstream/components/first-time-setup.d.ts +0 -24
  643. package/dist/src/foundation/pi-component-adapter/upstream/components/first-time-setup.js +0 -105
  644. package/dist/src/foundation/pi-component-adapter/upstream/components/markdown-transform.d.ts +0 -2
  645. package/dist/src/foundation/pi-component-adapter/upstream/components/markdown-transform.js +0 -18
  646. package/dist/src/foundation/pi-component-adapter/upstream/components/mermaid.js +0 -77
  647. package/dist/src/foundation/pi-component-adapter/upstream/components/owned-editor.d.ts +0 -18
  648. package/dist/src/foundation/pi-component-adapter/upstream/components/owned-editor.js +0 -55
  649. package/dist/src/foundation/pi-component-adapter/upstream/components/scoped-models-selector.d.ts +0 -55
  650. package/dist/src/foundation/pi-component-adapter/upstream/components/scoped-models-selector.js +0 -342
  651. package/dist/src/foundation/pi-component-adapter/upstream/components/session-footer.d.ts +0 -10
  652. package/dist/src/foundation/pi-component-adapter/upstream/components/session-footer.js +0 -120
  653. package/dist/src/foundation/pi-component-adapter/upstream/components/session-selector-search.js +0 -159
  654. package/dist/src/foundation/pi-component-adapter/upstream/components/session-selector.d.ts +0 -95
  655. package/dist/src/foundation/pi-component-adapter/upstream/components/session-selector.js +0 -889
  656. package/dist/src/foundation/pi-component-adapter/upstream/components/skill-invocation-message.d.ts +0 -19
  657. package/dist/src/foundation/pi-component-adapter/upstream/components/skill-invocation-message.js +0 -44
  658. package/dist/src/foundation/pi-component-adapter/upstream/components/status-indicator.d.ts +0 -30
  659. package/dist/src/foundation/pi-component-adapter/upstream/components/status-indicator.js +0 -59
  660. package/dist/src/foundation/pi-component-adapter/upstream/components/tree-selector.d.ts +0 -98
  661. package/dist/src/foundation/pi-component-adapter/upstream/components/tree-selector.js +0 -1272
  662. package/dist/src/foundation/pi-component-adapter/upstream/components/trust-selector.d.ts +0 -33
  663. package/dist/src/foundation/pi-component-adapter/upstream/components/trust-selector.js +0 -76
  664. package/dist/src/foundation/pi-component-adapter/upstream/external-editor.js +0 -39
  665. package/dist/src/foundation/pi-component-adapter/upstream/model-search.d.ts +0 -15
  666. package/dist/src/foundation/pi-component-adapter/upstream/theme/theme-controller.d.ts +0 -25
  667. package/dist/src/foundation/pi-component-adapter/upstream/theme/theme-controller.js +0 -117
  668. package/dist/src/foundation/pi-component-adapter/upstream/theme/theme.d.ts +0 -61
  669. package/dist/src/foundation/pi-component-adapter/upstream/theme/theme.js +0 -326
  670. package/dist/src/foundation/pi-engine-adapter/adapter.d.ts +0 -164
  671. package/dist/src/foundation/pi-engine-adapter/adapter.js +0 -2367
  672. package/dist/src/foundation/pi-engine-adapter/conformance.d.ts +0 -37
  673. package/dist/src/foundation/pi-engine-adapter/conformance.js +0 -130
  674. package/dist/src/foundation/pi-engine-adapter/index.d.ts +0 -10
  675. package/dist/src/foundation/pi-engine-adapter/index.js +0 -10
  676. package/dist/src/foundation/pi-engine-adapter/model-auth-integration.d.ts +0 -30
  677. package/dist/src/foundation/pi-engine-adapter/model-auth-integration.js +0 -61
  678. package/dist/src/foundation/pi-engine-adapter/package-integration.d.ts +0 -13
  679. package/dist/src/foundation/pi-engine-adapter/package-integration.js +0 -112
  680. package/dist/src/foundation/pi-engine-adapter/pi-settings-metadata.json +0 -374
  681. package/dist/src/foundation/pi-engine-adapter/resource-extension-integration.d.ts +0 -31
  682. package/dist/src/foundation/pi-engine-adapter/resource-extension-integration.js +0 -80
  683. package/dist/src/foundation/pi-engine-adapter/runtime-integration.d.ts +0 -35
  684. package/dist/src/foundation/pi-engine-adapter/runtime-integration.js +0 -67
  685. package/dist/src/foundation/pi-engine-adapter/session-integration.d.ts +0 -43
  686. package/dist/src/foundation/pi-engine-adapter/session-integration.js +0 -97
  687. package/dist/src/foundation/pi-engine-adapter/settings-integration.d.ts +0 -55
  688. package/dist/src/foundation/pi-engine-adapter/settings-integration.js +0 -233
  689. package/dist/src/foundation/pi-engine-adapter/workflow-controllers.d.ts +0 -20
  690. package/dist/src/foundation/pi-engine-adapter/workflow-controllers.js +0 -48
  691. package/dist/src/foundation/pi-engine-adapter/workflows.d.ts +0 -173
  692. package/dist/src/foundation/pi-engine-adapter/workflows.js +0 -60
  693. package/dist/src/foundation/pi-owned-ui-integration/index.d.ts +0 -2
  694. package/dist/src/foundation/pi-owned-ui-integration/index.js +0 -2
  695. package/dist/src/foundation/pi-owned-ui-integration/route-host.d.ts +0 -29
  696. package/dist/src/foundation/pi-owned-ui-integration/session-shell.d.ts +0 -106
  697. package/dist/src/foundation/pi-owned-ui-integration/session-shell.js +0 -1518
  698. package/dist/src/foundation/pi-tui-runtime-adapter/adapter.d.ts +0 -39
  699. package/dist/src/foundation/pi-tui-runtime-adapter/adapter.js +0 -493
  700. package/dist/src/foundation/pi-tui-runtime-adapter/conformance.d.ts +0 -18
  701. package/dist/src/foundation/pi-tui-runtime-adapter/conformance.js +0 -145
  702. package/dist/src/foundation/pi-tui-runtime-adapter/contracts.d.ts +0 -120
  703. package/dist/src/foundation/pi-tui-runtime-adapter/index.d.ts +0 -4
  704. package/dist/src/foundation/pi-tui-runtime-adapter/index.js +0 -4
  705. package/dist/src/foundation/pi-tui-runtime-adapter/presentation-adapter.d.ts +0 -4
  706. package/dist/src/foundation/pi-tui-runtime-adapter/presentation-adapter.js +0 -48
  707. package/dist/src/foundation/presentation-contracts/index.d.ts +0 -96
  708. package/dist/src/foundation/process-containment/index.d.ts +0 -5
  709. package/dist/src/foundation/process-containment/index.js +0 -5
  710. package/dist/src/foundation/process-containment/linux-process-inspector.d.ts +0 -6
  711. package/dist/src/foundation/process-containment/linux-process-inspector.js +0 -26
  712. package/dist/src/foundation/process-containment/native-guardian-containment.d.ts +0 -16
  713. package/dist/src/foundation/process-containment/native-guardian-containment.js +0 -139
  714. package/dist/src/foundation/process-containment/windows-process-inspector.d.ts +0 -17
  715. package/dist/src/foundation/process-containment/windows-process-inspector.js +0 -53
  716. package/dist/src/foundation/protocol/client.d.ts +0 -17
  717. package/dist/src/foundation/protocol/client.js +0 -129
  718. package/dist/src/foundation/protocol/index.d.ts +0 -2
  719. package/dist/src/foundation/protocol/index.js +0 -2
  720. package/dist/src/foundation/protocol/messages.d.ts +0 -89
  721. package/dist/src/foundation/protocol/messages.js +0 -99
  722. package/dist/src/foundation/release/bootstrap.d.ts +0 -29
  723. package/dist/src/foundation/release/bootstrap.js +0 -335
  724. package/dist/src/foundation/release/cohort-state.d.ts +0 -70
  725. package/dist/src/foundation/release/cohort-state.js +0 -202
  726. package/dist/src/foundation/release/index.d.ts +0 -10
  727. package/dist/src/foundation/release/index.js +0 -10
  728. package/dist/src/foundation/release/release-gc.d.ts +0 -5
  729. package/dist/src/foundation/release/release-gc.js +0 -16
  730. package/dist/src/foundation/release/release-store.d.ts +0 -43
  731. package/dist/src/foundation/release/release-store.js +0 -175
  732. package/dist/src/foundation/release/release.d.ts +0 -38
  733. package/dist/src/foundation/release/release.js +0 -204
  734. package/dist/src/foundation/release/update-transaction.d.ts +0 -31
  735. package/dist/src/foundation/release/update-transaction.js +0 -89
  736. package/dist/src/foundation/release/update.d.ts +0 -82
  737. package/dist/src/foundation/release/update.js +0 -529
  738. package/dist/src/foundation/storage/control-store.d.ts +0 -61
  739. package/dist/src/foundation/storage/control-store.js +0 -530
  740. package/dist/src/foundation/storage/index.d.ts +0 -1
  741. package/dist/src/foundation/storage/index.js +0 -1
  742. package/dist/src/foundation/structured-agent-runtime/backpressure.d.ts +0 -46
  743. package/dist/src/foundation/structured-agent-runtime/backpressure.js +0 -118
  744. package/dist/src/foundation/structured-agent-runtime/commands.d.ts +0 -52
  745. package/dist/src/foundation/structured-agent-runtime/commands.js +0 -164
  746. package/dist/src/foundation/structured-agent-runtime/handshake.d.ts +0 -41
  747. package/dist/src/foundation/structured-agent-runtime/handshake.js +0 -151
  748. package/dist/src/foundation/structured-agent-runtime/index.d.ts +0 -5
  749. package/dist/src/foundation/structured-agent-runtime/index.js +0 -5
  750. package/dist/src/foundation/structured-agent-runtime/reconnection.d.ts +0 -37
  751. package/dist/src/foundation/structured-agent-runtime/reconnection.js +0 -129
  752. package/dist/src/foundation/structured-agent-runtime/state.d.ts +0 -56
  753. package/dist/src/foundation/structured-agent-runtime/state.js +0 -118
  754. package/dist/src/foundation/supervision/index.d.ts +0 -3
  755. package/dist/src/foundation/supervision/index.js +0 -3
  756. package/dist/src/foundation/supervision/main.d.ts +0 -1
  757. package/dist/src/foundation/supervision/main.js +0 -41
  758. package/dist/src/foundation/supervision/paths.d.ts +0 -1
  759. package/dist/src/foundation/supervision/paths.js +0 -1
  760. package/dist/src/foundation/supervision/server.d.ts +0 -22
  761. package/dist/src/foundation/supervision/server.js +0 -451
  762. package/dist/src/foundation/ui-apps/contracts.d.ts +0 -42
  763. package/dist/src/foundation/ui-apps/host.d.ts +0 -42
  764. package/dist/src/foundation/ui-apps/host.js +0 -152
  765. package/dist/src/foundation/ui-apps/index.d.ts +0 -3
  766. package/dist/src/foundation/ui-apps/index.js +0 -3
  767. package/dist/src/foundation/ui-apps/registry.d.ts +0 -11
  768. package/dist/src/foundation/ui-apps/registry.js +0 -32
  769. package/dist/src/foundation/ui-components/dialog-panel.js +0 -47
  770. package/dist/src/foundation/ui-components/frame.d.ts +0 -21
  771. package/dist/src/foundation/ui-components/frame.js +0 -54
  772. package/dist/src/foundation/ui-components/index.d.ts +0 -18
  773. package/dist/src/foundation/ui-components/index.js +0 -18
  774. package/dist/src/foundation/ui-components/line-input.d.ts +0 -74
  775. package/dist/src/foundation/ui-components/line-input.js +0 -245
  776. package/dist/src/foundation/ui-components/list-view.d.ts +0 -66
  777. package/dist/src/foundation/ui-components/list-view.js +0 -76
  778. package/dist/src/foundation/ui-components/mouse.d.ts +0 -15
  779. package/dist/src/foundation/ui-components/mouse.js +0 -46
  780. package/dist/src/foundation/ui-components/scrollbar.d.ts +0 -62
  781. package/dist/src/foundation/ui-components/scrollbar.js +0 -102
  782. package/dist/src/foundation/ui-components/shortcuts.d.ts +0 -57
  783. package/dist/src/foundation/ui-components/shortcuts.js +0 -81
  784. package/dist/src/foundation/ui-components/spans.d.ts +0 -7
  785. package/dist/src/foundation/ui-components/spans.js +0 -59
  786. package/dist/src/foundation/ui-components/surface.d.ts +0 -20
  787. package/dist/src/foundation/ui-components/surface.js +0 -38
  788. package/dist/src/foundation/ui-components/text.d.ts +0 -24
  789. package/dist/src/foundation/ui-components/text.js +0 -123
  790. package/dist/src/foundation/workspace-contracts/index.d.ts +0 -2
  791. package/dist/src/foundation/workspace-contracts/index.js +0 -2
  792. package/dist/src/foundation/workspace-contracts/model.d.ts +0 -248
  793. package/dist/src/foundation/workspace-contracts/model.js +0 -2
  794. package/dist/src/foundation/workspace-contracts/validation.d.ts +0 -13
  795. package/dist/src/foundation/workspace-contracts/validation.js +0 -335
  796. package/dist/src/product-identity.d.ts +0 -37
  797. package/dist/src/product-identity.js +0 -150
  798. package/dist/src/product-identity.json +0 -99
  799. package/docs/manual-transparent-checkpoint.md +0 -53
  800. /package/dist/{src/foundation/agent-engine-contracts/domain.js → app/session-shell/paste-helper.d.ts} +0 -0
  801. /package/dist/{src/foundation/agent-engine-contracts/ports.js → app/session-shell/paste-text-worker.d.ts} +0 -0
  802. /package/dist/{src/foundation/lifecycle/commands.js → app/session-shell/paste-types.js} +0 -0
  803. /package/dist/{src/foundation/pi-owned-ui-integration/route-host.js → app/session-shell/response-copy-helper.d.ts} +0 -0
  804. /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/capability-ports.js +0 -0
  805. /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/domain-validation.d.ts +0 -0
  806. /package/dist/{src/foundation/pi-tui-runtime-adapter/contracts.js → contracts/agent-engine/domain.js} +0 -0
  807. /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/model.d.ts +0 -0
  808. /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/model.js +0 -0
  809. /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/package-ports.js +0 -0
  810. /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/ports.d.ts +0 -0
  811. /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/serialization.d.ts +0 -0
  812. /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/serialization.js +0 -0
  813. /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/validation.d.ts +0 -0
  814. /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/validation.js +0 -0
  815. /package/dist/{src/foundation/owned-ui-contracts → contracts/owned-ui}/extension-ui.js +0 -0
  816. /package/dist/{src/foundation/owned-ui-contracts → contracts/owned-ui}/model.js +0 -0
  817. /package/dist/{src/foundation/presentation-contracts → contracts/presentation}/index.js +0 -0
  818. /package/dist/{src/features → features}/launch/development-launch.d.ts +0 -0
  819. /package/dist/{src/features → features}/launch/initialize-profile.d.ts +0 -0
  820. /package/dist/{src/features → features}/launch/initialize-profile.js +0 -0
  821. /package/dist/{src/foundation → foundation}/lifecycle/commands.d.ts +0 -0
  822. /package/dist/{src/foundation → foundation}/lifecycle/launch-instance.d.ts +0 -0
  823. /package/dist/{src/foundation → foundation}/lifecycle/launch-instance.js +0 -0
  824. /package/dist/{src/foundation → foundation}/process-containment/artifact.d.ts +0 -0
  825. /package/dist/{src/foundation → foundation}/process-containment/artifact.js +0 -0
  826. /package/dist/{src/foundation → foundation}/process-containment/contracts.d.ts +0 -0
  827. /package/dist/{src/foundation → foundation}/process-containment/contracts.js +0 -0
  828. /package/dist/{src/foundation → foundation}/release/cohort-selection.d.ts +0 -0
  829. /package/dist/{src/foundation → foundation}/release/cohort-selection.js +0 -0
  830. /package/dist/{src/foundation → foundation}/release/concurrency.d.ts +0 -0
  831. /package/dist/{src/foundation → foundation}/release/concurrency.js +0 -0
  832. /package/dist/{src/foundation → foundation}/release/process-cleanup.d.ts +0 -0
  833. /package/dist/{src/foundation → foundation}/release/process-cleanup.js +0 -0
  834. /package/dist/{src/foundation → foundation}/release/stable-release.d.ts +0 -0
  835. /package/dist/{src/foundation → foundation}/release/stable-release.js +0 -0
  836. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/shell-editor-autocomplete.d.ts +0 -0
  837. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/theme.d.ts +0 -0
  838. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/theme.js +0 -0
  839. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/countdown-timer.js +0 -0
  840. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/mermaid.d.ts +0 -0
  841. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/session-selector-search.d.ts +0 -0
  842. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/external-editor.d.ts +0 -0
  843. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/model-search.js +0 -0
  844. /package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/public-main-entry.d.ts +0 -0
  845. /package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/public-main-entry.js +0 -0
  846. /package/dist/{src/foundation/ui-apps → ui/apps}/contracts.js +0 -0
  847. /package/dist/{src/foundation/ui-components → ui/components}/dialog-panel.d.ts +0 -0
  848. /package/dist/{src/foundation/ui-components → ui/components}/label.d.ts +0 -0
  849. /package/dist/{src/foundation/ui-components → ui/components}/label.js +0 -0
  850. /package/dist/{src/foundation/ui-components → ui/components}/list-block.d.ts +0 -0
  851. /package/dist/{src/foundation/ui-components → ui/components}/list-block.js +0 -0
  852. /package/dist/{src/foundation/ui-components → ui/components}/pane.d.ts +0 -0
  853. /package/dist/{src/foundation/ui-components → ui/components}/pane.js +0 -0
  854. /package/dist/{src/foundation/ui-components → ui/components}/revision.d.ts +0 -0
  855. /package/dist/{src/foundation/ui-components → ui/components}/revision.js +0 -0
  856. /package/dist/{src/foundation/ui-components → ui/components}/status-line.d.ts +0 -0
  857. /package/dist/{src/foundation/ui-components → ui/components}/status-line.js +0 -0
  858. /package/dist/{src/foundation/ui-components → ui/components}/stepper.d.ts +0 -0
  859. /package/dist/{src/foundation/ui-components → ui/components}/stepper.js +0 -0
  860. /package/dist/{src/foundation/ui-components → ui/components}/theme.d.ts +0 -0
  861. /package/dist/{src/foundation/ui-components → ui/components}/theme.js +0 -0
  862. /package/dist/{src/foundation/ui-components → ui/components}/value-menu.d.ts +0 -0
  863. /package/dist/{src/foundation/ui-components → ui/components}/value-menu.js +0 -0
  864. /package/dist/{src/foundation/owned-ui-settings → ui/settings}/resolution.d.ts +0 -0
  865. /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); }