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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (642) hide show
  1. package/README.md +159 -65
  2. package/bin/cli.js +28 -10
  3. package/bin/guardian.js +12 -6
  4. package/bin/module-identity.js +69 -35
  5. package/bin/pi-tui.d.ts +6 -0
  6. package/bin/pi-tui.js +28 -0
  7. package/bin/release-cleanup.js +8 -0
  8. package/bin/supervisor.js +2 -2
  9. package/bin/sync-pi-tui-proxy.js +97 -0
  10. package/bin/ui.js +62 -21
  11. package/bin/update-recovery.js +274 -0
  12. package/bin/warmup.js +27 -0
  13. package/dist/cli/capabilities.d.ts +6 -0
  14. package/dist/{src/cli → cli}/capabilities.js +1 -1
  15. package/dist/{src/cli → cli}/dispatch.d.ts +15 -1
  16. package/dist/cli/dispatch.js +261 -0
  17. package/dist/cli/package-messages.d.ts +26 -0
  18. package/dist/cli/package-messages.js +71 -0
  19. package/dist/{src/cli → cli}/packages.d.ts +11 -2
  20. package/dist/{src/cli → cli}/packages.js +24 -27
  21. package/dist/{src/cli → cli}/version-stats.d.ts +6 -0
  22. package/dist/cli/version-stats.js +112 -0
  23. package/dist/composition/agent-engine-bridge.d.ts +3 -0
  24. package/dist/composition/agent-engine-bridge.js +108 -0
  25. package/dist/composition/index.d.ts +3 -0
  26. package/dist/composition/index.js +3 -0
  27. package/dist/composition/owned-ui.d.ts +35 -0
  28. package/dist/composition/owned-ui.js +118 -0
  29. package/dist/composition/process.d.ts +16 -0
  30. package/dist/composition/process.js +45 -0
  31. package/dist/composition/settings-route-host.d.ts +8 -0
  32. package/dist/composition/settings-route-host.js +75 -0
  33. package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/capability-ports.d.ts +2 -2
  34. package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/domain-validation.js +22 -4
  35. package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/domain.d.ts +17 -0
  36. package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/package-ports.d.ts +6 -0
  37. package/dist/contracts/owned-ui/image-attachments.d.ts +36 -0
  38. package/dist/contracts/owned-ui/image-attachments.js +67 -0
  39. package/dist/contracts/owned-ui/index.d.ts +8 -0
  40. package/dist/contracts/owned-ui/index.js +8 -0
  41. package/dist/{src/foundation/owned-ui-contracts → contracts/owned-ui}/model.d.ts +123 -0
  42. package/dist/contracts/owned-ui/prompt-history.d.ts +55 -0
  43. package/dist/contracts/owned-ui/prompt-history.js +23 -0
  44. package/dist/contracts/owned-ui/prompt-suggestions.d.ts +3 -0
  45. package/dist/contracts/owned-ui/prompt-suggestions.js +44 -0
  46. package/dist/contracts/owned-ui/suggestion-diagnostics.d.ts +22 -0
  47. package/dist/contracts/owned-ui/suggestion-diagnostics.js +9 -0
  48. package/dist/contracts/owned-ui/transcript-lifecycle.d.ts +5 -0
  49. package/dist/contracts/owned-ui/transcript-lifecycle.js +33 -0
  50. package/dist/{src/foundation/owned-ui-contracts → contracts/owned-ui}/validation.d.ts +5 -1
  51. package/dist/{src/foundation/owned-ui-contracts → contracts/owned-ui}/validation.js +129 -4
  52. package/dist/{src/foundation/presentation-contracts → contracts/presentation}/index.d.ts +8 -0
  53. package/dist/{src/features → features}/launch/development-launch.js +11 -3
  54. package/dist/{src/features → features}/launch/index.d.ts +0 -1
  55. package/dist/{src/features → features}/launch/index.js +0 -1
  56. package/dist/features/launch/intent.d.ts +10 -0
  57. package/dist/features/launch/intent.js +8 -0
  58. package/dist/{src/features → features}/launch/prepare-launch.d.ts +0 -2
  59. package/dist/{src/features → features}/launch/prepare-launch.js +2 -9
  60. package/dist/{src/features → features}/launch/profile-paths.d.ts +3 -2
  61. package/dist/{src/features → features}/launch/profile-paths.js +13 -8
  62. package/dist/{src/features → features}/launch/runtime-selection.d.ts +2 -5
  63. package/dist/{src/features → features}/owned-ui/customization.d.ts +3 -1
  64. package/dist/{src/features → features}/owned-ui/customization.js +3 -1
  65. package/dist/{src/features → features}/owned-ui/diagnostics.d.ts +2 -1
  66. package/dist/{src/features → features}/owned-ui/diagnostics.js +1 -0
  67. package/dist/{src/features → features}/owned-ui/index.d.ts +2 -0
  68. package/dist/{src/features → features}/owned-ui/index.js +2 -0
  69. package/dist/features/owned-ui/project-trust-prompt.d.ts +25 -0
  70. package/dist/features/owned-ui/project-trust-prompt.js +149 -0
  71. package/dist/{src/features → features}/owned-ui/run.d.ts +2 -2
  72. package/dist/features/owned-ui/run.js +32 -0
  73. package/dist/features/owned-ui/session-fork-prompt.d.ts +8 -0
  74. package/dist/features/owned-ui/session-fork-prompt.js +34 -0
  75. package/dist/{src/features → features}/owned-ui/settings-app.d.ts +3 -3
  76. package/dist/{src/features → features}/owned-ui/settings-app.js +105 -56
  77. package/dist/features/prompt-history/image-sidecar.d.ts +32 -0
  78. package/dist/features/prompt-history/image-sidecar.js +130 -0
  79. package/dist/features/prompt-history/index.d.ts +4 -0
  80. package/dist/features/prompt-history/index.js +3 -0
  81. package/dist/features/prompt-history/paths.d.ts +5 -0
  82. package/dist/features/prompt-history/paths.js +17 -0
  83. package/dist/features/prompt-history/service.d.ts +54 -0
  84. package/dist/features/prompt-history/service.js +425 -0
  85. package/dist/features/prompt-history/store.d.ts +16 -0
  86. package/dist/features/prompt-history/store.js +223 -0
  87. package/dist/features/prompt-history/worker.d.ts +9 -0
  88. package/dist/features/prompt-history/worker.js +45 -0
  89. package/dist/features/prompt-suggestions/diagnostics.d.ts +18 -0
  90. package/dist/features/prompt-suggestions/diagnostics.js +82 -0
  91. package/dist/features/prompt-suggestions/index.d.ts +1 -0
  92. package/dist/features/prompt-suggestions/index.js +1 -0
  93. package/dist/{src/features → features}/workspace/capabilities.d.ts +1 -1
  94. package/dist/{src/features → features}/workspace/reducer.d.ts +2 -1
  95. package/dist/{src/features → features}/workspace/reducer.js +2 -1
  96. package/dist/{src/features → features}/workspace/router.d.ts +2 -1
  97. package/dist/{src/features → features}/workspace/router.js +1 -0
  98. package/dist/{src/features → features}/workspace/store.d.ts +2 -1
  99. package/dist/{src/features → features}/workspace/store.js +1 -0
  100. package/dist/foundation/launch-context/index.d.ts +59 -0
  101. package/dist/foundation/launch-context/index.js +136 -0
  102. package/dist/{src/foundation → foundation}/launch-guardian/main.d.ts +2 -0
  103. package/dist/{src/foundation → foundation}/launch-guardian/main.js +23 -8
  104. package/dist/{src/foundation → foundation}/lifecycle/index.d.ts +2 -0
  105. package/dist/{src/foundation → foundation}/lifecycle/index.js +2 -0
  106. package/dist/{src/foundation → foundation}/lifecycle/model.d.ts +1 -1
  107. package/dist/{src/foundation → foundation}/lifecycle/model.js +1 -1
  108. package/dist/foundation/lifecycle/paths.d.ts +30 -0
  109. package/dist/{src/foundation → foundation}/lifecycle/paths.js +29 -1
  110. package/dist/foundation/lifecycle/session-selection.d.ts +9 -0
  111. package/dist/foundation/lifecycle/session-selection.js +39 -0
  112. package/dist/foundation/lifecycle/supervisor-startup.d.ts +30 -0
  113. package/dist/foundation/lifecycle/supervisor-startup.js +106 -0
  114. package/dist/{src/foundation → foundation}/native-host-protocol/codec.d.ts +2 -0
  115. package/dist/{src/foundation → foundation}/native-host-protocol/codec.js +2 -0
  116. package/dist/{src/foundation → foundation}/native-host-protocol/messages.d.ts +1 -1
  117. package/dist/{src/foundation → foundation}/native-host-protocol/messages.js +1 -1
  118. package/dist/foundation/process-containment/darwin-process-inspector.d.ts +5 -0
  119. package/dist/foundation/process-containment/darwin-process-inspector.js +7 -0
  120. package/dist/{src/foundation → foundation}/process-containment/index.d.ts +1 -0
  121. package/dist/{src/foundation → foundation}/process-containment/index.js +1 -0
  122. package/dist/{src/foundation → foundation}/process-containment/linux-process-inspector.d.ts +1 -0
  123. package/dist/{src/foundation → foundation}/process-containment/linux-process-inspector.js +1 -0
  124. package/dist/{src/foundation → foundation}/process-containment/native-guardian-containment.d.ts +1 -0
  125. package/dist/{src/foundation → foundation}/process-containment/native-guardian-containment.js +1 -0
  126. package/dist/{src/foundation → foundation}/process-containment/windows-process-inspector.d.ts +3 -1
  127. package/dist/{src/foundation → foundation}/process-containment/windows-process-inspector.js +5 -2
  128. package/dist/{src/foundation → foundation}/protocol/client.d.ts +1 -0
  129. package/dist/{src/foundation → foundation}/protocol/client.js +1 -0
  130. package/dist/{src/foundation → foundation}/protocol/messages.d.ts +1 -0
  131. package/dist/{src/foundation → foundation}/protocol/messages.js +1 -0
  132. package/dist/foundation/release/bootstrap.d.ts +55 -0
  133. package/dist/{src/foundation → foundation}/release/bootstrap.js +219 -46
  134. package/dist/foundation/release/cohort-state.d.ts +157 -0
  135. package/dist/foundation/release/cohort-state.js +472 -0
  136. package/dist/foundation/release/dependency-certification-retention.d.ts +7 -0
  137. package/dist/foundation/release/dependency-certification-retention.js +88 -0
  138. package/dist/foundation/release/dependency-certification.d.ts +24 -0
  139. package/dist/foundation/release/dependency-certification.js +266 -0
  140. package/dist/foundation/release/dependency-layer.d.ts +81 -0
  141. package/dist/foundation/release/dependency-layer.js +466 -0
  142. package/dist/foundation/release/endpoints.d.ts +20 -0
  143. package/dist/foundation/release/endpoints.js +50 -0
  144. package/dist/foundation/release/immutable-platform.d.ts +6 -0
  145. package/dist/foundation/release/immutable-platform.js +13 -0
  146. package/dist/{src/foundation → foundation}/release/index.d.ts +6 -0
  147. package/dist/{src/foundation → foundation}/release/index.js +6 -0
  148. package/dist/foundation/release/release-gc.d.ts +71 -0
  149. package/dist/foundation/release/release-gc.js +764 -0
  150. package/dist/{src/foundation → foundation}/release/release-store.d.ts +9 -3
  151. package/dist/{src/foundation → foundation}/release/release-store.js +74 -14
  152. package/dist/{src/foundation → foundation}/release/release.d.ts +6 -1
  153. package/dist/{src/foundation → foundation}/release/release.js +15 -4
  154. package/dist/foundation/release/restart-certification.d.ts +68 -0
  155. package/dist/foundation/release/restart-certification.js +227 -0
  156. package/dist/foundation/release/update-launch.d.ts +6 -0
  157. package/dist/foundation/release/update-launch.js +17 -0
  158. package/dist/foundation/release/update-recovery.d.ts +76 -0
  159. package/dist/foundation/release/update-recovery.js +356 -0
  160. package/dist/{src/foundation → foundation}/release/update-transaction.d.ts +11 -0
  161. package/dist/{src/foundation → foundation}/release/update-transaction.js +13 -1
  162. package/dist/{src/foundation → foundation}/release/update.d.ts +40 -4
  163. package/dist/{src/foundation → foundation}/release/update.js +196 -78
  164. package/dist/foundation/release/warmup.d.ts +3 -0
  165. package/dist/foundation/release/warmup.js +47 -0
  166. package/dist/foundation/startup/index.d.ts +1 -0
  167. package/dist/foundation/startup/index.js +1 -0
  168. package/dist/foundation/startup/startup-runtime.d.ts +36 -0
  169. package/dist/foundation/startup/startup-runtime.js +142 -0
  170. package/dist/{src/foundation → foundation}/storage/control-store.d.ts +2 -1
  171. package/dist/{src/foundation → foundation}/storage/control-store.js +39 -4
  172. package/dist/{src/foundation → foundation}/structured-agent-runtime/backpressure.d.ts +2 -1
  173. package/dist/{src/foundation → foundation}/structured-agent-runtime/backpressure.js +2 -1
  174. package/dist/{src/foundation → foundation}/structured-agent-runtime/commands.d.ts +2 -1
  175. package/dist/{src/foundation → foundation}/structured-agent-runtime/commands.js +2 -1
  176. package/dist/{src/foundation → foundation}/structured-agent-runtime/handshake.d.ts +1 -1
  177. package/dist/{src/foundation → foundation}/structured-agent-runtime/handshake.js +1 -1
  178. package/dist/{src/foundation → foundation}/structured-agent-runtime/reconnection.d.ts +2 -1
  179. package/dist/{src/foundation → foundation}/structured-agent-runtime/reconnection.js +2 -1
  180. package/dist/{src/foundation → foundation}/structured-agent-runtime/state.d.ts +2 -1
  181. package/dist/{src/foundation → foundation}/structured-agent-runtime/state.js +2 -1
  182. package/dist/foundation/supervision/index.d.ts +3 -0
  183. package/dist/foundation/supervision/index.js +3 -0
  184. package/dist/foundation/supervision/main.d.ts +1 -0
  185. package/dist/foundation/supervision/main.js +84 -0
  186. package/dist/foundation/supervision/paths.d.ts +1 -0
  187. package/dist/foundation/supervision/paths.js +1 -0
  188. package/dist/foundation/supervision/server.d.ts +51 -0
  189. package/dist/{src/foundation → foundation}/supervision/server.js +142 -20
  190. package/dist/foundation/terminal-cleanup/fatal-exit.d.ts +12 -0
  191. package/dist/foundation/terminal-cleanup/fatal-exit.js +85 -0
  192. package/dist/foundation/terminal-cleanup/index.d.ts +2 -0
  193. package/dist/foundation/terminal-cleanup/index.js +2 -0
  194. package/dist/foundation/terminal-cleanup/terminal-reset.d.ts +4 -0
  195. package/dist/foundation/terminal-cleanup/terminal-reset.js +40 -0
  196. package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/components.d.ts +1 -1
  197. package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/conformance.d.ts +1 -0
  198. package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/conformance.js +3 -2
  199. package/dist/integrations/pi/components/editor-interaction.d.ts +38 -0
  200. package/dist/integrations/pi/components/history-editor-loader.d.ts +5 -0
  201. package/dist/integrations/pi/components/history-editor-loader.js +5 -0
  202. package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/index.d.ts +2 -1
  203. package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/index.js +2 -1
  204. package/dist/integrations/pi/components/owned-editor-ux.d.ts +74 -0
  205. package/dist/integrations/pi/components/owned-editor-ux.js +1093 -0
  206. package/dist/integrations/pi/components/path-word-ranges.d.ts +2 -0
  207. package/dist/integrations/pi/components/path-word-ranges.js +37 -0
  208. package/dist/integrations/pi/components/prompt-input-port.d.ts +18 -0
  209. package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/shell-components.d.ts +1 -0
  210. package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/shell-components.js +1 -0
  211. package/dist/integrations/pi/components/shell-editor-autocomplete.js +297 -0
  212. package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/shell-extension-ui.d.ts +1 -1
  213. package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/shell-footer-status.d.ts +4 -4
  214. package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/shell-footer-status.js +58 -23
  215. package/dist/integrations/pi/components/shell-presenters-info.d.ts +43 -0
  216. package/dist/integrations/pi/components/shell-presenters-info.js +114 -0
  217. package/dist/integrations/pi/components/shell-presenters-transcript.d.ts +29 -0
  218. package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/shell-presenters-transcript.js +174 -170
  219. package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/shell-selectors-dialogs.d.ts +8 -4
  220. package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/shell-selectors-dialogs.js +10 -6
  221. package/dist/integrations/pi/components/shell-shared-facade.d.ts +213 -0
  222. package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/shell-shared-facade.js +5 -2
  223. package/dist/integrations/pi/components/submitted-prompt-adapter.d.ts +15 -0
  224. package/dist/integrations/pi/components/submitted-prompt-adapter.js +43 -0
  225. package/dist/integrations/pi/components/tool-image-presentation.d.ts +21 -0
  226. package/dist/integrations/pi/components/tool-image-presentation.js +86 -0
  227. package/dist/integrations/pi/components/tool-result-adapter.d.ts +6 -0
  228. package/dist/integrations/pi/components/tool-result-adapter.js +27 -0
  229. package/dist/integrations/pi/components/transcript-image-resolver.d.ts +7 -0
  230. package/dist/integrations/pi/components/transcript-image-resolver.js +19 -0
  231. package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/adjacent/core/keybindings.d.ts +11 -2
  232. package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/adjacent/core/keybindings.js +41 -3
  233. package/dist/integrations/pi/components/upstream/assets/earendil-image.json +12 -0
  234. package/dist/integrations/pi/components/upstream/components/earendil-announcement.js +42 -0
  235. package/dist/integrations/pi/components/upstream/components/owned-editor.d.ts +40 -0
  236. package/dist/integrations/pi/components/upstream/components/owned-editor.js +166 -0
  237. package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/scoped-models-selector.d.ts +1 -1
  238. package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/scoped-models-selector.js +3 -1
  239. package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/session-footer.d.ts +3 -2
  240. package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/session-footer.js +12 -7
  241. package/dist/integrations/pi/components/upstream/components/tool-execution.d.ts +61 -0
  242. package/dist/integrations/pi/components/upstream/components/tool-execution.js +344 -0
  243. package/dist/integrations/pi/components/upstream/history/editor-core.d.ts +280 -0
  244. package/dist/integrations/pi/components/upstream/history/editor-core.js +2062 -0
  245. package/dist/integrations/pi/components/upstream/history/kill-ring.d.ts +32 -0
  246. package/dist/integrations/pi/components/upstream/history/kill-ring.js +48 -0
  247. package/dist/integrations/pi/components/upstream/history/printable-key.d.ts +1 -0
  248. package/dist/integrations/pi/components/upstream/history/printable-key.js +40 -0
  249. package/dist/integrations/pi/components/upstream/history/text-helpers.d.ts +14 -0
  250. package/dist/integrations/pi/components/upstream/history/text-helpers.js +28 -0
  251. package/dist/integrations/pi/components/upstream/history/undo-stack.d.ts +22 -0
  252. package/dist/integrations/pi/components/upstream/history/undo-stack.js +36 -0
  253. package/dist/integrations/pi/components/upstream/history/word-navigation.d.ts +24 -0
  254. package/dist/integrations/pi/components/upstream/history/word-navigation.js +100 -0
  255. package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/adapter.d.ts +74 -6
  256. package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/adapter.js +1340 -228
  257. package/dist/integrations/pi/engine/changelog.d.ts +2 -0
  258. package/dist/integrations/pi/engine/changelog.js +63 -0
  259. package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/conformance.d.ts +4 -2
  260. package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/conformance.js +15 -5
  261. package/dist/integrations/pi/engine/http-dispatcher.d.ts +4 -0
  262. package/dist/integrations/pi/engine/http-dispatcher.js +25 -0
  263. package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/index.d.ts +4 -0
  264. package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/index.js +4 -0
  265. package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/model-auth-integration.d.ts +2 -1
  266. package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/model-auth-integration.js +1 -0
  267. package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/package-integration.d.ts +1 -1
  268. package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/package-integration.js +32 -26
  269. package/dist/integrations/pi/engine/pending-delivery.d.ts +30 -0
  270. package/dist/integrations/pi/engine/pending-delivery.js +158 -0
  271. package/dist/integrations/pi/engine/project-trust-preflight.d.ts +22 -0
  272. package/dist/integrations/pi/engine/project-trust-preflight.js +50 -0
  273. package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/resource-extension-integration.d.ts +2 -1
  274. package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/resource-extension-integration.js +1 -0
  275. package/dist/integrations/pi/engine/resources/changelog.json +12 -0
  276. package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/runtime-integration.d.ts +19 -1
  277. package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/runtime-integration.js +56 -5
  278. package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/session-integration.d.ts +4 -2
  279. package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/session-integration.js +19 -4
  280. package/dist/integrations/pi/engine/session-selection.d.ts +28 -0
  281. package/dist/integrations/pi/engine/session-selection.js +90 -0
  282. package/dist/integrations/pi/engine/settings-effects.d.ts +66 -0
  283. package/dist/integrations/pi/engine/settings-effects.js +249 -0
  284. package/dist/integrations/pi/engine/settings-integration.d.ts +43 -0
  285. package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/settings-integration.js +102 -108
  286. package/dist/integrations/pi/engine/tool-rendering.d.ts +13 -0
  287. package/dist/integrations/pi/engine/tool-rendering.js +145 -0
  288. package/dist/integrations/pi/engine/transcript-image-assets.d.ts +11 -0
  289. package/dist/integrations/pi/engine/transcript-image-assets.js +86 -0
  290. package/dist/integrations/pi/engine/windows-filesystem-hygiene.d.ts +21 -0
  291. package/dist/integrations/pi/engine/windows-filesystem-hygiene.js +55 -0
  292. package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/workflow-controllers.d.ts +3 -2
  293. package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/workflow-controllers.js +1 -0
  294. package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/workflows.d.ts +19 -2
  295. package/dist/integrations/pi/session-ui/clipboard-diagnostics.d.ts +16 -0
  296. package/dist/integrations/pi/session-ui/clipboard-diagnostics.js +65 -0
  297. package/dist/integrations/pi/session-ui/clipboard-image.d.ts +11 -0
  298. package/dist/integrations/pi/session-ui/clipboard-image.js +38 -0
  299. package/dist/integrations/pi/session-ui/editor-hyperlink-budget.d.ts +9 -0
  300. package/dist/integrations/pi/session-ui/editor-hyperlink-budget.js +23 -0
  301. package/dist/integrations/pi/session-ui/image-preparation-client.d.ts +20 -0
  302. package/dist/integrations/pi/session-ui/image-preparation-client.js +145 -0
  303. package/dist/integrations/pi/session-ui/image-preparation.d.ts +18 -0
  304. package/dist/integrations/pi/session-ui/image-preparation.js +126 -0
  305. package/dist/integrations/pi/session-ui/image-source.d.ts +13 -0
  306. package/dist/integrations/pi/session-ui/image-source.js +171 -0
  307. package/dist/integrations/pi/session-ui/image-worker.d.ts +17 -0
  308. package/dist/integrations/pi/session-ui/image-worker.js +23 -0
  309. package/dist/integrations/pi/session-ui/index.d.ts +5 -0
  310. package/dist/integrations/pi/session-ui/index.js +5 -0
  311. package/dist/integrations/pi/session-ui/paste-executor.d.ts +10 -0
  312. package/dist/integrations/pi/session-ui/paste-executor.js +232 -0
  313. package/dist/integrations/pi/session-ui/paste-helper.d.ts +1 -0
  314. package/dist/integrations/pi/session-ui/paste-helper.js +173 -0
  315. package/dist/integrations/pi/session-ui/paste-preparation-client.d.ts +16 -0
  316. package/dist/integrations/pi/session-ui/paste-preparation-client.js +159 -0
  317. package/dist/integrations/pi/session-ui/paste-protocol.d.ts +78 -0
  318. package/dist/integrations/pi/session-ui/paste-protocol.js +18 -0
  319. package/dist/integrations/pi/session-ui/paste-text-preparation.d.ts +20 -0
  320. package/dist/integrations/pi/session-ui/paste-text-preparation.js +134 -0
  321. package/dist/integrations/pi/session-ui/paste-text-worker.d.ts +1 -0
  322. package/dist/integrations/pi/session-ui/paste-text-worker.js +12 -0
  323. package/dist/integrations/pi/session-ui/path-chip-presentation.d.ts +7 -0
  324. package/dist/integrations/pi/session-ui/path-chip-presentation.js +24 -0
  325. package/dist/integrations/pi/session-ui/prompt-chips.d.ts +72 -0
  326. package/dist/integrations/pi/session-ui/prompt-chips.js +503 -0
  327. package/dist/integrations/pi/session-ui/prompt-history-controller.d.ts +36 -0
  328. package/dist/integrations/pi/session-ui/prompt-history-controller.js +170 -0
  329. package/dist/integrations/pi/session-ui/prompt-suggestion-controller.d.ts +35 -0
  330. package/dist/integrations/pi/session-ui/prompt-suggestion-controller.js +207 -0
  331. package/dist/integrations/pi/session-ui/response-copy-coordinator.d.ts +27 -0
  332. package/dist/integrations/pi/session-ui/response-copy-coordinator.js +189 -0
  333. package/dist/integrations/pi/session-ui/response-copy-helper.d.ts +1 -0
  334. package/dist/integrations/pi/session-ui/response-copy-helper.js +122 -0
  335. package/dist/integrations/pi/session-ui/response-copy-protocol.d.ts +56 -0
  336. package/dist/integrations/pi/session-ui/response-copy-protocol.js +5 -0
  337. package/dist/integrations/pi/session-ui/response-copy-transport.d.ts +31 -0
  338. package/dist/integrations/pi/session-ui/response-copy-transport.js +187 -0
  339. package/dist/integrations/pi/session-ui/route-host.d.ts +5 -0
  340. package/dist/integrations/pi/session-ui/route-host.js +1 -0
  341. package/dist/integrations/pi/session-ui/session-shell-root.d.ts +221 -0
  342. package/dist/integrations/pi/session-ui/session-shell-root.js +1305 -0
  343. package/dist/integrations/pi/session-ui/session-shell.d.ts +55 -0
  344. package/dist/integrations/pi/session-ui/session-shell.js +1792 -0
  345. package/dist/integrations/pi/session-ui/session-viewport-controller.d.ts +56 -0
  346. package/dist/integrations/pi/session-ui/session-viewport-controller.js +569 -0
  347. package/dist/integrations/pi/session-ui/stream-presentation-coalescer.d.ts +29 -0
  348. package/dist/integrations/pi/session-ui/stream-presentation-coalescer.js +79 -0
  349. package/dist/integrations/pi/session-ui/system-clipboard.d.ts +20 -0
  350. package/dist/integrations/pi/session-ui/system-clipboard.js +156 -0
  351. package/dist/integrations/pi/session-ui/text-paste.d.ts +5 -0
  352. package/dist/integrations/pi/session-ui/text-paste.js +16 -0
  353. package/dist/{src/foundation/pi-tui-runtime-adapter → integrations/pi/tui-runtime}/adapter.d.ts +10 -1
  354. package/dist/{src/foundation/pi-tui-runtime-adapter → integrations/pi/tui-runtime}/adapter.js +255 -11
  355. package/dist/{src/foundation/pi-tui-runtime-adapter → integrations/pi/tui-runtime}/contracts.d.ts +32 -6
  356. package/dist/integrations/pi/tui-runtime/contracts.js +1 -0
  357. package/dist/integrations/pi/tui-runtime/damage-aware-terminal.d.ts +81 -0
  358. package/dist/integrations/pi/tui-runtime/damage-aware-terminal.js +424 -0
  359. package/dist/integrations/pi/tui-runtime/index.d.ts +7 -0
  360. package/dist/integrations/pi/tui-runtime/index.js +7 -0
  361. package/dist/integrations/pi/tui-runtime/input-presentation-coordinator.d.ts +39 -0
  362. package/dist/integrations/pi/tui-runtime/input-presentation-coordinator.js +139 -0
  363. package/dist/integrations/pi/tui-runtime/mouse-report-input.d.ts +13 -0
  364. package/dist/integrations/pi/tui-runtime/mouse-report-input.js +59 -0
  365. package/dist/integrations/pi/tui-runtime/overlay-geometry.d.ts +32 -0
  366. package/dist/integrations/pi/tui-runtime/overlay-geometry.js +159 -0
  367. package/dist/{src/foundation/pi-tui-runtime-adapter → integrations/pi/tui-runtime}/presentation-adapter.d.ts +1 -1
  368. package/dist/native/darwin-arm64/manifest.json +4 -4
  369. package/dist/native/darwin-arm64/process-guardian +0 -0
  370. package/dist/native/linux-x64/manifest.json +3 -3
  371. package/dist/native/linux-x64/process-guardian +0 -0
  372. package/dist/native/win32-x64/manifest.json +3 -3
  373. package/dist/native/win32-x64/process-guardian.exe +0 -0
  374. package/dist/{src/product-identity.d.ts → product-identity.d.ts} +4 -4
  375. package/dist/{src/product-identity.js → product-identity.js} +7 -38
  376. package/dist/{src/product-identity.json → product-identity.json} +13 -27
  377. package/dist/runtime-payload-inventory.json +122333 -0
  378. package/dist/{src/foundation/ui-apps → ui/apps}/contracts.d.ts +23 -1
  379. package/dist/{src/foundation/ui-apps → ui/apps}/host.d.ts +1 -1
  380. package/dist/{src/foundation/ui-apps → ui/apps}/host.js +14 -10
  381. package/dist/{src/foundation/ui-apps → ui/apps}/registry.d.ts +1 -0
  382. package/dist/{src/foundation/ui-apps → ui/apps}/registry.js +1 -0
  383. package/dist/{src/foundation/ui-components → ui/components}/dialog-panel.js +5 -3
  384. package/dist/{src/foundation/ui-components → ui/components}/frame.d.ts +1 -0
  385. package/dist/{src/foundation/ui-components → ui/components}/frame.js +1 -0
  386. package/dist/{src/foundation/ui-components → ui/components}/index.d.ts +7 -0
  387. package/dist/{src/foundation/ui-components → ui/components}/index.js +7 -0
  388. package/dist/{src/foundation/ui-components → ui/components}/line-input.d.ts +2 -8
  389. package/dist/{src/foundation/ui-components → ui/components}/line-input.js +7 -28
  390. package/dist/{src/foundation/ui-components → ui/components}/list-view.d.ts +0 -6
  391. package/dist/{src/foundation/ui-components → ui/components}/list-view.js +14 -7
  392. package/dist/{src/foundation/ui-components → ui/components}/mouse.d.ts +10 -0
  393. package/dist/{src/foundation/ui-components → ui/components}/mouse.js +24 -0
  394. package/dist/ui/components/progress-status.d.ts +2 -0
  395. package/dist/ui/components/progress-status.js +4 -0
  396. package/dist/ui/components/prompt-input.d.ts +32 -0
  397. package/dist/ui/components/prompt-input.js +54 -0
  398. package/dist/ui/components/prompt-row.d.ts +14 -0
  399. package/dist/ui/components/prompt-row.js +20 -0
  400. package/dist/{src/foundation/ui-components → ui/components}/scrollbar.d.ts +26 -0
  401. package/dist/{src/foundation/ui-components → ui/components}/scrollbar.js +35 -0
  402. package/dist/ui/components/selection-copy.d.ts +24 -0
  403. package/dist/ui/components/selection-copy.js +39 -0
  404. package/dist/{src/foundation/ui-components → ui/components}/shortcuts.d.ts +1 -0
  405. package/dist/{src/foundation/ui-components → ui/components}/shortcuts.js +1 -0
  406. package/dist/ui/components/spans.d.ts +28 -0
  407. package/dist/ui/components/spans.js +266 -0
  408. package/dist/ui/components/submitted-prompt.d.ts +23 -0
  409. package/dist/ui/components/submitted-prompt.js +50 -0
  410. package/dist/{src/foundation/ui-components → ui/components}/surface.d.ts +0 -5
  411. package/dist/{src/foundation/ui-components → ui/components}/surface.js +1 -5
  412. package/dist/ui/components/text-selection.d.ts +62 -0
  413. package/dist/ui/components/text-selection.js +210 -0
  414. package/dist/{src/foundation/ui-components → ui/components}/text.d.ts +14 -0
  415. package/dist/{src/foundation/ui-components → ui/components}/text.js +67 -5
  416. package/dist/ui/components/transcript-viewport.d.ts +173 -0
  417. package/dist/ui/components/transcript-viewport.js +753 -0
  418. package/dist/ui/components/visible-hyperlinks.d.ts +26 -0
  419. package/dist/ui/components/visible-hyperlinks.js +97 -0
  420. package/dist/{src/foundation/owned-ui-settings → ui/settings}/declarations.d.ts +8 -1
  421. package/dist/ui/settings/declarations.js +94 -0
  422. package/dist/{src/foundation/owned-ui-settings → ui/settings}/migrations.d.ts +1 -1
  423. package/dist/{src/foundation/owned-ui-settings → ui/settings}/migrations.js +28 -2
  424. package/dist/{src/foundation/owned-ui-settings → ui/settings}/sections.d.ts +6 -19
  425. package/dist/{src/foundation/owned-ui-settings → ui/settings}/sections.js +41 -22
  426. package/dist/{src/foundation/owned-ui-settings → ui/settings}/session.d.ts +9 -17
  427. package/dist/ui/settings/session.js +164 -0
  428. package/dist/{src/foundation/owned-ui-settings → ui/settings}/store.d.ts +1 -0
  429. package/dist/{src/foundation/owned-ui-settings → ui/settings}/store.js +2 -1
  430. package/docs/architecture/boundaries.md +14 -10
  431. package/docs/architecture/code-documentation.md +77 -0
  432. package/docs/architecture/history-editor-provenance.md +100 -0
  433. package/docs/architecture/internal-naming.md +91 -0
  434. package/docs/architecture/process-guardian-provenance.md +3 -1
  435. package/docs/architecture/project-structure.md +69 -30
  436. package/docs/architecture/prompt-suggestions.md +68 -0
  437. package/docs/architecture/resource-and-data-policy.md +28 -2
  438. package/docs/architecture/response-copy-delivery.md +83 -0
  439. package/docs/architecture/tool-image-presentation.md +62 -0
  440. package/docs/architecture/toolchain.md +24 -10
  441. package/docs/architecture/ui-reference-provenance.md +59 -5
  442. package/docs/ci-release-runbook.md +236 -79
  443. package/docs/features/launch-profiles.md +24 -17
  444. package/docs/features/modal-content-interaction.md +37 -0
  445. package/docs/features/prompt-history.md +149 -0
  446. package/docs/manual-code-streaming-cleanup.md +88 -0
  447. package/docs/manual-ghost-link-baseline.md +89 -0
  448. package/docs/manual-launch-instance-acceptance.md +12 -35
  449. package/docs/manual-owned-ui-checkpoint.md +78 -0
  450. package/docs/manual-pi-boundary-candidate.md +4 -5
  451. package/docs/manual-terminal-colour-check.md +4 -3
  452. package/docs/openspec-archive-automation.md +124 -0
  453. package/docs/repository-governance-live-acceptance.md +77 -0
  454. package/package.json +45 -28
  455. package/dist/src/cli/capabilities.d.ts +0 -15
  456. package/dist/src/cli/dispatch.js +0 -142
  457. package/dist/src/cli/version-stats.js +0 -72
  458. package/dist/src/composition/index.d.ts +0 -48
  459. package/dist/src/composition/index.js +0 -258
  460. package/dist/src/features/launch/intent.d.ts +0 -7
  461. package/dist/src/features/launch/intent.js +0 -4
  462. package/dist/src/features/launch/profiles.d.ts +0 -12
  463. package/dist/src/features/launch/profiles.js +0 -26
  464. package/dist/src/features/owned-ui/run.js +0 -15
  465. package/dist/src/foundation/lifecycle/paths.d.ts +0 -10
  466. package/dist/src/foundation/owned-ui-contracts/index.d.ts +0 -3
  467. package/dist/src/foundation/owned-ui-contracts/index.js +0 -3
  468. package/dist/src/foundation/owned-ui-settings/declarations.js +0 -39
  469. package/dist/src/foundation/owned-ui-settings/session.js +0 -145
  470. package/dist/src/foundation/pi-component-adapter/shell-editor-autocomplete.js +0 -162
  471. package/dist/src/foundation/pi-component-adapter/shell-presenters-transcript.d.ts +0 -57
  472. package/dist/src/foundation/pi-component-adapter/shell-shared-facade.d.ts +0 -116
  473. package/dist/src/foundation/pi-component-adapter/upstream/components/earendil-announcement.js +0 -19
  474. package/dist/src/foundation/pi-component-adapter/upstream/components/owned-editor.d.ts +0 -18
  475. package/dist/src/foundation/pi-component-adapter/upstream/components/owned-editor.js +0 -55
  476. package/dist/src/foundation/pi-engine-adapter/settings-integration.d.ts +0 -55
  477. package/dist/src/foundation/pi-owned-ui-integration/index.d.ts +0 -2
  478. package/dist/src/foundation/pi-owned-ui-integration/index.js +0 -2
  479. package/dist/src/foundation/pi-owned-ui-integration/route-host.d.ts +0 -29
  480. package/dist/src/foundation/pi-owned-ui-integration/session-shell.d.ts +0 -106
  481. package/dist/src/foundation/pi-owned-ui-integration/session-shell.js +0 -1518
  482. package/dist/src/foundation/pi-tui-runtime-adapter/index.d.ts +0 -4
  483. package/dist/src/foundation/pi-tui-runtime-adapter/index.js +0 -4
  484. package/dist/src/foundation/release/bootstrap.d.ts +0 -29
  485. package/dist/src/foundation/release/cohort-state.d.ts +0 -70
  486. package/dist/src/foundation/release/cohort-state.js +0 -202
  487. package/dist/src/foundation/release/release-gc.d.ts +0 -5
  488. package/dist/src/foundation/release/release-gc.js +0 -16
  489. package/dist/src/foundation/supervision/index.d.ts +0 -3
  490. package/dist/src/foundation/supervision/index.js +0 -3
  491. package/dist/src/foundation/supervision/main.d.ts +0 -1
  492. package/dist/src/foundation/supervision/main.js +0 -41
  493. package/dist/src/foundation/supervision/paths.d.ts +0 -1
  494. package/dist/src/foundation/supervision/paths.js +0 -1
  495. package/dist/src/foundation/supervision/server.d.ts +0 -22
  496. package/dist/src/foundation/ui-components/spans.d.ts +0 -7
  497. package/dist/src/foundation/ui-components/spans.js +0 -59
  498. package/docs/manual-transparent-checkpoint.md +0 -53
  499. /package/dist/{src/cli → cli}/index.d.ts +0 -0
  500. /package/dist/{src/cli → cli}/index.js +0 -0
  501. /package/dist/{src/cli → cli}/version.d.ts +0 -0
  502. /package/dist/{src/cli → cli}/version.js +0 -0
  503. /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/capability-ports.js +0 -0
  504. /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/domain-validation.d.ts +0 -0
  505. /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/domain.js +0 -0
  506. /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/index.d.ts +0 -0
  507. /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/index.js +0 -0
  508. /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/model.d.ts +0 -0
  509. /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/model.js +0 -0
  510. /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/package-ports.js +0 -0
  511. /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/ports.d.ts +0 -0
  512. /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/ports.js +0 -0
  513. /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/serialization.d.ts +0 -0
  514. /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/serialization.js +0 -0
  515. /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/validation.d.ts +0 -0
  516. /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/validation.js +0 -0
  517. /package/dist/{src/foundation/owned-ui-contracts → contracts/owned-ui}/extension-ui.d.ts +0 -0
  518. /package/dist/{src/foundation/owned-ui-contracts → contracts/owned-ui}/extension-ui.js +0 -0
  519. /package/dist/{src/foundation/owned-ui-contracts → contracts/owned-ui}/model.js +0 -0
  520. /package/dist/{src/foundation/presentation-contracts → contracts/presentation}/index.js +0 -0
  521. /package/dist/{src/foundation/workspace-contracts → contracts/workspace}/index.d.ts +0 -0
  522. /package/dist/{src/foundation/workspace-contracts → contracts/workspace}/index.js +0 -0
  523. /package/dist/{src/foundation/workspace-contracts → contracts/workspace}/model.d.ts +0 -0
  524. /package/dist/{src/foundation/workspace-contracts → contracts/workspace}/model.js +0 -0
  525. /package/dist/{src/foundation/workspace-contracts → contracts/workspace}/validation.d.ts +0 -0
  526. /package/dist/{src/foundation/workspace-contracts → contracts/workspace}/validation.js +0 -0
  527. /package/dist/{src/features → features}/launch/development-launch.d.ts +0 -0
  528. /package/dist/{src/features → features}/launch/initialize-profile.d.ts +0 -0
  529. /package/dist/{src/features → features}/launch/initialize-profile.js +0 -0
  530. /package/dist/{src/features → features}/launch/runtime-selection.js +0 -0
  531. /package/dist/{src/features → features}/workspace/capabilities.js +0 -0
  532. /package/dist/{src/features → features}/workspace/index.d.ts +0 -0
  533. /package/dist/{src/features → features}/workspace/index.js +0 -0
  534. /package/dist/{src/features → features}/workspace/presentation.d.ts +0 -0
  535. /package/dist/{src/features → features}/workspace/presentation.js +0 -0
  536. /package/dist/{src/features → features}/workspace/reconciliation.d.ts +0 -0
  537. /package/dist/{src/features → features}/workspace/reconciliation.js +0 -0
  538. /package/dist/{src/foundation → foundation}/launch-guardian/index.d.ts +0 -0
  539. /package/dist/{src/foundation → foundation}/launch-guardian/index.js +0 -0
  540. /package/dist/{src/foundation → foundation}/lifecycle/commands.d.ts +0 -0
  541. /package/dist/{src/foundation → foundation}/lifecycle/commands.js +0 -0
  542. /package/dist/{src/foundation → foundation}/lifecycle/launch-instance.d.ts +0 -0
  543. /package/dist/{src/foundation → foundation}/lifecycle/launch-instance.js +0 -0
  544. /package/dist/{src/foundation → foundation}/native-host-protocol/evidence.d.ts +0 -0
  545. /package/dist/{src/foundation → foundation}/native-host-protocol/evidence.js +0 -0
  546. /package/dist/{src/foundation → foundation}/native-host-protocol/index.d.ts +0 -0
  547. /package/dist/{src/foundation → foundation}/native-host-protocol/index.js +0 -0
  548. /package/dist/{src/foundation → foundation}/native-host-protocol/proof-gate.d.ts +0 -0
  549. /package/dist/{src/foundation → foundation}/native-host-protocol/proof-gate.js +0 -0
  550. /package/dist/{src/foundation → foundation}/process-containment/artifact.d.ts +0 -0
  551. /package/dist/{src/foundation → foundation}/process-containment/artifact.js +0 -0
  552. /package/dist/{src/foundation → foundation}/process-containment/contracts.d.ts +0 -0
  553. /package/dist/{src/foundation → foundation}/process-containment/contracts.js +0 -0
  554. /package/dist/{src/foundation → foundation}/protocol/index.d.ts +0 -0
  555. /package/dist/{src/foundation → foundation}/protocol/index.js +0 -0
  556. /package/dist/{src/foundation → foundation}/release/cohort-selection.d.ts +0 -0
  557. /package/dist/{src/foundation → foundation}/release/cohort-selection.js +0 -0
  558. /package/dist/{src/foundation → foundation}/release/concurrency.d.ts +0 -0
  559. /package/dist/{src/foundation → foundation}/release/concurrency.js +0 -0
  560. /package/dist/{src/foundation → foundation}/release/process-cleanup.d.ts +0 -0
  561. /package/dist/{src/foundation → foundation}/release/process-cleanup.js +0 -0
  562. /package/dist/{src/foundation → foundation}/release/stable-release.d.ts +0 -0
  563. /package/dist/{src/foundation → foundation}/release/stable-release.js +0 -0
  564. /package/dist/{src/foundation → foundation}/storage/index.d.ts +0 -0
  565. /package/dist/{src/foundation → foundation}/storage/index.js +0 -0
  566. /package/dist/{src/foundation → foundation}/structured-agent-runtime/index.d.ts +0 -0
  567. /package/dist/{src/foundation → foundation}/structured-agent-runtime/index.js +0 -0
  568. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/components.js +0 -0
  569. /package/dist/{src/foundation/pi-owned-ui-integration/route-host.js → integrations/pi/components/editor-interaction.js} +0 -0
  570. /package/dist/{src/foundation/pi-tui-runtime-adapter/contracts.js → integrations/pi/components/prompt-input-port.js} +0 -0
  571. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/resources/builtin-themes.d.ts +0 -0
  572. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/resources/builtin-themes.js +0 -0
  573. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/shell-editor-autocomplete.d.ts +0 -0
  574. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/shell-extension-ui.js +0 -0
  575. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/theme.d.ts +0 -0
  576. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/theme.js +0 -0
  577. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/countdown-timer.d.ts +0 -0
  578. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/countdown-timer.js +0 -0
  579. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/custom-entry.d.ts +0 -0
  580. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/custom-entry.js +0 -0
  581. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/daxnuts.d.ts +0 -0
  582. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/daxnuts.js +0 -0
  583. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/earendil-announcement.d.ts +0 -0
  584. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/extension-editor.d.ts +0 -0
  585. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/extension-editor.js +0 -0
  586. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/first-time-setup.d.ts +0 -0
  587. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/first-time-setup.js +0 -0
  588. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/markdown-transform.d.ts +0 -0
  589. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/markdown-transform.js +0 -0
  590. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/mermaid.d.ts +0 -0
  591. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/mermaid.js +0 -0
  592. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/session-selector-search.d.ts +0 -0
  593. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/session-selector-search.js +0 -0
  594. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/session-selector.d.ts +0 -0
  595. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/session-selector.js +0 -0
  596. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/skill-invocation-message.d.ts +0 -0
  597. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/skill-invocation-message.js +0 -0
  598. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/status-indicator.d.ts +0 -0
  599. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/status-indicator.js +0 -0
  600. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/tree-selector.d.ts +0 -0
  601. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/tree-selector.js +0 -0
  602. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/trust-selector.d.ts +0 -0
  603. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/trust-selector.js +0 -0
  604. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/external-editor.d.ts +0 -0
  605. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/external-editor.js +0 -0
  606. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/model-search.d.ts +0 -0
  607. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/model-search.js +0 -0
  608. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/theme/theme-controller.d.ts +0 -0
  609. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/theme/theme-controller.js +0 -0
  610. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/theme/theme.d.ts +0 -0
  611. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/theme/theme.js +0 -0
  612. /package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/pi-settings-metadata.json +0 -0
  613. /package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/public-main-entry.d.ts +0 -0
  614. /package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/public-main-entry.js +0 -0
  615. /package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/workflows.js +0 -0
  616. /package/dist/{src/foundation/pi-tui-runtime-adapter → integrations/pi/tui-runtime}/conformance.d.ts +0 -0
  617. /package/dist/{src/foundation/pi-tui-runtime-adapter → integrations/pi/tui-runtime}/conformance.js +0 -0
  618. /package/dist/{src/foundation/pi-tui-runtime-adapter → integrations/pi/tui-runtime}/presentation-adapter.js +0 -0
  619. /package/dist/{src/foundation/ui-apps → ui/apps}/contracts.js +0 -0
  620. /package/dist/{src/foundation/ui-apps → ui/apps}/index.d.ts +0 -0
  621. /package/dist/{src/foundation/ui-apps → ui/apps}/index.js +0 -0
  622. /package/dist/{src/foundation/ui-components → ui/components}/dialog-panel.d.ts +0 -0
  623. /package/dist/{src/foundation/ui-components → ui/components}/label.d.ts +0 -0
  624. /package/dist/{src/foundation/ui-components → ui/components}/label.js +0 -0
  625. /package/dist/{src/foundation/ui-components → ui/components}/list-block.d.ts +0 -0
  626. /package/dist/{src/foundation/ui-components → ui/components}/list-block.js +0 -0
  627. /package/dist/{src/foundation/ui-components → ui/components}/pane.d.ts +0 -0
  628. /package/dist/{src/foundation/ui-components → ui/components}/pane.js +0 -0
  629. /package/dist/{src/foundation/ui-components → ui/components}/revision.d.ts +0 -0
  630. /package/dist/{src/foundation/ui-components → ui/components}/revision.js +0 -0
  631. /package/dist/{src/foundation/ui-components → ui/components}/status-line.d.ts +0 -0
  632. /package/dist/{src/foundation/ui-components → ui/components}/status-line.js +0 -0
  633. /package/dist/{src/foundation/ui-components → ui/components}/stepper.d.ts +0 -0
  634. /package/dist/{src/foundation/ui-components → ui/components}/stepper.js +0 -0
  635. /package/dist/{src/foundation/ui-components → ui/components}/theme.d.ts +0 -0
  636. /package/dist/{src/foundation/ui-components → ui/components}/theme.js +0 -0
  637. /package/dist/{src/foundation/ui-components → ui/components}/value-menu.d.ts +0 -0
  638. /package/dist/{src/foundation/ui-components → ui/components}/value-menu.js +0 -0
  639. /package/dist/{src/foundation/owned-ui-settings → ui/settings}/index.d.ts +0 -0
  640. /package/dist/{src/foundation/owned-ui-settings → ui/settings}/index.js +0 -0
  641. /package/dist/{src/foundation/owned-ui-settings → ui/settings}/resolution.d.ts +0 -0
  642. /package/dist/{src/foundation/owned-ui-settings → ui/settings}/resolution.js +0 -0
@@ -0,0 +1,503 @@
1
+ import { randomBytes } from "node:crypto";
2
+ import path from "node:path";
3
+ import { canonicalizeClipboardImage } from "./clipboard-image.js";
4
+ import { assertImageEncodedSize, assertPromptImages, ImageAttachmentError } from "../../../contracts/owned-ui/index.js";
5
+ import { ImagePreparationClient } from "./image-preparation-client.js";
6
+ import { preparePasteText } from "./paste-text-preparation.js";
7
+ import { pathChipTag } from "./path-chip-presentation.js";
8
+ import { PastePreparationClient } from "./paste-preparation-client.js";
9
+ const CHIP_PATTERN = /\[(?:paste #\d+ (?:\+\d+ lines|\d+ chars)|📷 [^\]]+|📁 [^\]]+|📄 [^\]]+|🖼 {1,2}[^\]]+|🔗 [^\]]+)\]/gu;
10
+ const URL_SUBSTRING_PATTERN = /https?:\/\/[^\s\u0000-\u001f\u007f\]]+/giu;
11
+ const IMAGE_CHIP_IDENTIFIER_PATTERN = /^\[📷 screenshot-([a-f0-9]+)(?:-resized)?\]$/u;
12
+ const URL_DISPLAY_LENGTH = 40;
13
+ function imageChipIdentifier(tag) {
14
+ const match = IMAGE_CHIP_IDENTIFIER_PATTERN.exec(tag);
15
+ return match === null ? null : match[1] ?? null;
16
+ }
17
+ /** Owns semantic chips and bounded pending paste references; cancels background work on reset or disposal. */
18
+ export class PromptChipStore {
19
+ #chips = new Map();
20
+ // Invariant: clearing the editor never recycles a recoverable text chip's identity.
21
+ #textCounter = 0;
22
+ #pending = new Map();
23
+ #preparation = new ImagePreparationClient();
24
+ #stopping = new Set();
25
+ #isolated;
26
+ #provisionalOwners = new Map();
27
+ #ownedChipTags = new Map();
28
+ constructor(options = {}) {
29
+ this.#isolated = options.isolated ? new PastePreparationClient(options.onEvent) : undefined;
30
+ }
31
+ beginPaste(currentText, read, onError, onImage = () => { }) {
32
+ if (this.#isolated)
33
+ return this.#beginIsolatedPaste(currentText, typeof read === "function" ? { kind: "provided", read } : read, onError, onImage);
34
+ if (typeof read !== "function")
35
+ throw new Error("Clipboard sources require isolated paste preparation");
36
+ const id = randomBytes(5).toString("hex");
37
+ // Invariant: reserve paste identity immediately, but only display a screenshot after identifying an image.
38
+ const marker = `[📷 screenshot-${id}]`;
39
+ const job = this.#preparation.start(async (signal) => {
40
+ const content = await read(signal);
41
+ entry.kind = content?.kind === "image" ? "image" : "text";
42
+ if (content?.kind === "image") {
43
+ onImage();
44
+ if (this.#imageCount(currentText) >= 8)
45
+ throw new ImageAttachmentError("image-count");
46
+ }
47
+ return content;
48
+ });
49
+ const entry = { marker, job, references: 0, kind: "unknown", completion: job.result.then(content => {
50
+ if (content === null)
51
+ return "";
52
+ if (content.kind === "image") {
53
+ return this.#addPreparedImage(content, id);
54
+ }
55
+ return this.transformPastedContent(content);
56
+ }).catch(error => {
57
+ entry.error = error instanceof ImageAttachmentError ? error : new ImageAttachmentError("image-codec");
58
+ if (entry.error.code !== "image-canceled" && entry.references === 0)
59
+ onError(entry.error);
60
+ return marker.replace("screenshot-", "failed-");
61
+ }).then(replacement => {
62
+ entry.replacement = replacement;
63
+ return replacement;
64
+ }) };
65
+ this.#pending.set(marker, entry);
66
+ return { marker, result: entry.completion };
67
+ }
68
+ #beginIsolatedPaste(currentText, source, onError, onImage) {
69
+ const id = randomBytes(5).toString("hex");
70
+ const marker = `[📷 screenshot-${id}]`;
71
+ let entry;
72
+ const owner = Symbol("paste");
73
+ this.#ownedChipTags.set(owner, new Set());
74
+ const job = this.#isolated.start(source, async (value, signal) => {
75
+ if (signal.aborted)
76
+ throw new ImageAttachmentError("image-canceled");
77
+ if (value === null)
78
+ return "";
79
+ if (value.kind === "image")
80
+ return this.#addPreparedImage(value, id, owner);
81
+ entry.kind = "text";
82
+ return this.#adoptPreparedText(value, signal, owner);
83
+ }, () => {
84
+ entry.kind = "image";
85
+ onImage();
86
+ if (this.#imageCount(currentText) >= 8)
87
+ throw new ImageAttachmentError("image-count");
88
+ }, () => { entry.kind = "text"; });
89
+ entry = { marker, job, references: 0, kind: "unknown", completion: job.result.catch(error => {
90
+ this.#finishChipOwnership(owner, false);
91
+ entry.error = error instanceof ImageAttachmentError ? error : new ImageAttachmentError("paste-unavailable");
92
+ // Compatibility: typed image validation can fail before transfer identifies the payload to this store.
93
+ if (entry.kind === "unknown" && entry.error.code.startsWith("image-") && entry.error.code !== "image-canceled")
94
+ entry.kind = "image";
95
+ if (entry.error.code !== "image-canceled" && entry.references === 0)
96
+ onError(entry.error);
97
+ return entry.kind === "image" ? marker.replace("screenshot-", "failed-") : "";
98
+ }).then(replacement => { entry.replacement = replacement; return replacement; }) };
99
+ entry.onComplete = () => {
100
+ this.#finishChipOwnership(owner, job.isCurrent() && entry.error === undefined);
101
+ job.complete();
102
+ };
103
+ this.#pending.set(marker, entry);
104
+ return { marker, result: entry.completion, complete: entry.onComplete, isCurrent: () => job.isCurrent() };
105
+ }
106
+ async #adoptPreparedText(value, signal, owner) {
107
+ if (value.kind !== "paths")
108
+ return this.#recordPreparedText(value, owner);
109
+ let text = "";
110
+ for (let start = 0; start < value.paths.length; start += 32) {
111
+ if (signal.aborted)
112
+ throw new ImageAttachmentError("image-canceled");
113
+ text += this.#recordPreparedText({ kind: "paths", paths: value.paths.slice(start, start + 32) }, owner);
114
+ await new Promise(resolve => setImmediate(resolve));
115
+ }
116
+ return text;
117
+ }
118
+ hasPending(text) {
119
+ return [...this.#pending.values()].some(item => text.includes(item.marker) && item.replacement === undefined);
120
+ }
121
+ async waitForPastes(text, signal, readDraft = () => "") {
122
+ const entries = [...this.#pending.values()].filter(item => text.includes(item.marker));
123
+ for (const entry of entries)
124
+ entry.references++;
125
+ try {
126
+ await new Promise((resolve, reject) => {
127
+ const abort = () => reject(new ImageAttachmentError("image-canceled"));
128
+ if (signal.aborted) {
129
+ abort();
130
+ return;
131
+ }
132
+ signal.addEventListener("abort", abort, { once: true });
133
+ void Promise.all(entries.map(item => item.completion)).then(() => {
134
+ signal.removeEventListener("abort", abort);
135
+ resolve();
136
+ }, reject);
137
+ });
138
+ return this.prepareSubmission(text);
139
+ }
140
+ finally {
141
+ for (const entry of entries) {
142
+ entry.references--;
143
+ if (entry.replacement !== undefined)
144
+ entry.onComplete?.();
145
+ if (signal.aborted && entry.references === 0 && !readDraft().includes(entry.marker))
146
+ entry.job.cancel();
147
+ }
148
+ }
149
+ }
150
+ reconcileDraft(text) {
151
+ for (const entry of this.#pending.values()) {
152
+ if (entry.references === 0 && !text.includes(entry.marker) && !text.includes(entry.marker.replace("screenshot-", "failed-"))) {
153
+ entry.job.cancel();
154
+ if (entry.replacement !== undefined) {
155
+ entry.onComplete?.();
156
+ this.#pending.delete(entry.marker);
157
+ }
158
+ }
159
+ }
160
+ }
161
+ resetPastes(text) {
162
+ let remaining = text;
163
+ for (const entry of this.#pending.values())
164
+ if (entry.replacement === undefined)
165
+ remaining = remaining.replaceAll(entry.marker, "");
166
+ this.#isolated?.reset();
167
+ const stopped = this.#preparation.dispose();
168
+ this.#stopping.add(stopped);
169
+ void stopped.finally(() => this.#stopping.delete(stopped));
170
+ this.#preparation = new ImagePreparationClient();
171
+ for (const entry of this.#pending.values())
172
+ if (entry.replacement === undefined)
173
+ entry.job.cancel();
174
+ return remaining;
175
+ }
176
+ async dispose() {
177
+ await Promise.all([this.#preparation.dispose(), this.#isolated?.dispose(), ...this.#stopping]);
178
+ this.#chips.clear();
179
+ this.#pending.clear();
180
+ this.#provisionalOwners.clear();
181
+ this.#ownedChipTags.clear();
182
+ }
183
+ #imageCount(text) {
184
+ const tags = new Set([...this.#chips.values()].filter(chip => chip.kind === "image" && text.includes(chip.tag)).map(chip => chip.tag));
185
+ for (const entry of this.#pending.values()) {
186
+ if (entry.kind !== "text" && (text.includes(entry.marker) || text.includes(entry.marker.replace("screenshot-", "failed-")))) {
187
+ // Invariant: a ready screenshot can retain its pending label but still occupies only one slot.
188
+ tags.add(entry.replacement ?? entry.marker);
189
+ }
190
+ }
191
+ return tags.size;
192
+ }
193
+ #addPreparedImage(image, id, owner) {
194
+ const tag = `[📷 screenshot-${id}${image.transformed ? "-resized" : ""}]`;
195
+ const attachment = Object.freeze({ type: "image", data: image.data, mimeType: image.mimeType });
196
+ assertPromptImages([attachment]);
197
+ this.#chips.set(tag, { kind: "image", tag, image: attachment });
198
+ this.#claimChip(tag, owner, true);
199
+ return tag;
200
+ }
201
+ transformPastedContent(content, currentText = "") {
202
+ if (content.kind === "image") {
203
+ assertImageEncodedSize(content.data);
204
+ const image = canonicalizeClipboardImage(content);
205
+ if (image === null)
206
+ return "";
207
+ assertPromptImages([...this.prepareSubmission(currentText).images, { type: "image", ...image }]);
208
+ const id = randomBytes(5).toString("hex");
209
+ const tag = `[📷 screenshot-${id}]`;
210
+ this.#chips.set(tag, {
211
+ kind: "image",
212
+ tag,
213
+ image: { type: "image", data: image.data, mimeType: image.mimeType },
214
+ });
215
+ return tag;
216
+ }
217
+ const text = content.text;
218
+ if (this.#chips.has(text.trim())) {
219
+ this.#claimChip(text.trim(), undefined, false);
220
+ return text.trim();
221
+ }
222
+ return this.#recordPreparedText(preparePasteText(text));
223
+ }
224
+ #recordPreparedText(paste, owner) {
225
+ if (paste.kind === "url")
226
+ return this.#recordUnique({ kind: "url", tag: `[🔗 ${paste.label}]`, label: paste.label, url: paste.url }, owner);
227
+ if (paste.kind === "text") {
228
+ if (paste.label === undefined) {
229
+ const tag = paste.text.trim();
230
+ if (this.#chips.has(tag)) {
231
+ this.#claimChip(tag, owner, false);
232
+ return tag;
233
+ }
234
+ return paste.text;
235
+ }
236
+ const tag = `[paste #${++this.#textCounter} ${paste.label}]`;
237
+ this.#chips.set(tag, Object.freeze({ kind: "text", tag, text: paste.text }));
238
+ this.#claimChip(tag, owner, true);
239
+ return tag;
240
+ }
241
+ return paste.paths.map(item => this.#recordUnique({ kind: item.kind, tag: pathChipTag(item), path: item.fullPath }, owner)).join("");
242
+ }
243
+ /** Hide provisional clipboard identities until the read identifies an actual image. */
244
+ hiddenRanges(line) {
245
+ const ranges = [];
246
+ for (const entry of this.#pending.values()) {
247
+ if (entry.kind === "image")
248
+ continue;
249
+ let from = 0;
250
+ while ((from = line.indexOf(entry.marker, from)) >= 0) {
251
+ ranges.push({ start: from, end: from + entry.marker.length });
252
+ from += entry.marker.length;
253
+ }
254
+ }
255
+ return ranges.sort((left, right) => left.start - right.start);
256
+ }
257
+ atomicRanges(line) {
258
+ return [...line.matchAll(CHIP_PATTERN)].filter(match => !match[0].startsWith("[paste #") || this.#chips.has(match[0])).map(match => ({
259
+ start: match.index,
260
+ end: match.index + match[0].length,
261
+ }));
262
+ }
263
+ hyperlinkRanges(text) {
264
+ const ranges = [];
265
+ for (const chip of this.#chips.values()) {
266
+ if (chip.kind !== "url")
267
+ continue;
268
+ const labelOffset = chip.tag.indexOf(chip.label);
269
+ if (labelOffset < 0)
270
+ continue;
271
+ let searchFrom = 0;
272
+ while (searchFrom <= text.length - chip.tag.length) {
273
+ const tagStart = text.indexOf(chip.tag, searchFrom);
274
+ if (tagStart < 0)
275
+ break;
276
+ const start = tagStart + labelOffset;
277
+ ranges.push({ start, end: start + chip.label.length, target: chip.url });
278
+ searchFrom = tagStart + chip.tag.length;
279
+ }
280
+ }
281
+ return ranges.sort((left, right) => right.start - left.start);
282
+ }
283
+ expandCopiedText(text) {
284
+ return this.#replaceResolvable(text, false).text;
285
+ }
286
+ /**
287
+ * Recall-safe history text. Text / URL / file / folder chips expand to their resolved value
288
+ * so a restart can reuse them without the originating chip cache. Image chip tags are
289
+ * preserved verbatim so the sidecar-backed rehydration path can re-render them into live
290
+ * chips carrying the original attachment bytes.
291
+ */
292
+ prepareHistoryText(text) {
293
+ return this.#replaceResolvable(text, false, false).text.trim();
294
+ }
295
+ /**
296
+ * Extract the image chip attachments referenced by an editor draft in occurrence order,
297
+ * paired with their sidecar identifier. Callers use this to persist image sidecars before a
298
+ * history row commits, so a fresh process can rehydrate the same chip layout. Unresolved
299
+ * pending pastes and non-image chips are skipped; caller is responsible for waiting on
300
+ * pending readiness before this point.
301
+ */
302
+ imageChipAttachments(text) {
303
+ const results = [];
304
+ const seen = new Set();
305
+ for (const match of text.matchAll(CHIP_PATTERN)) {
306
+ const tag = match[0];
307
+ if (seen.has(tag))
308
+ continue;
309
+ const chip = this.#chips.get(tag);
310
+ if (chip === undefined || chip.kind !== "image")
311
+ continue;
312
+ const identifier = imageChipIdentifier(tag);
313
+ if (identifier === null)
314
+ continue;
315
+ seen.add(tag);
316
+ results.push({ id: identifier, tag, image: chip.image });
317
+ }
318
+ return results;
319
+ }
320
+ /**
321
+ * Rehydrate a durable recall value into an editor-ready draft: image chip tags are looked up
322
+ * against a caller-supplied sidecar resolver, and detectable URL / file / folder / large text
323
+ * substrings are re-registered as atomic chips through the same identity rules the paste path
324
+ * uses. Image chips whose sidecar returns null are silently stripped without a placeholder.
325
+ *
326
+ * Every chip returned is registered in the session `#chips` map so atomic-range,
327
+ * hyperlink-range, and submission-expansion paths behave identically to a freshly typed draft.
328
+ * Callers should treat the returned string as programmatic editor text, not another draft to
329
+ * scan.
330
+ */
331
+ rehydrateHistoryText(text, resolveImage) {
332
+ if (!text)
333
+ return text;
334
+ // Rationale: resolve image chip tags in-place before further classification. Sidecar hits
335
+ // register a live image chip; misses silently strip the tag (no placeholder, no notice) per
336
+ // the durability contract.
337
+ CHIP_PATTERN.lastIndex = 0;
338
+ const resolvedImages = text.replace(CHIP_PATTERN, tag => {
339
+ const identifier = imageChipIdentifier(tag);
340
+ if (identifier === null)
341
+ return tag;
342
+ const attachment = resolveImage(identifier);
343
+ if (attachment === null)
344
+ return "";
345
+ this.#chips.set(tag, { kind: "image", tag, image: attachment });
346
+ return tag;
347
+ });
348
+ // Rationale: split around any surviving image tags so paste-time classification runs on the
349
+ // intervening prose exactly as it would on a fresh clipboard payload, plus a substring URL
350
+ // scan so embedded links become atomic chips even in the middle of surrounding text.
351
+ CHIP_PATTERN.lastIndex = 0;
352
+ const segments = [];
353
+ let cursor = 0;
354
+ for (const match of resolvedImages.matchAll(CHIP_PATTERN)) {
355
+ const index = match.index ?? cursor;
356
+ if (index > cursor)
357
+ segments.push(resolvedImages.slice(cursor, index));
358
+ segments.push(match[0]);
359
+ cursor = index + match[0].length;
360
+ }
361
+ if (cursor < resolvedImages.length)
362
+ segments.push(resolvedImages.slice(cursor));
363
+ CHIP_PATTERN.lastIndex = 0;
364
+ return segments.map(segment => {
365
+ if (segment.length === 0 || CHIP_PATTERN.test(segment)) {
366
+ CHIP_PATTERN.lastIndex = 0;
367
+ return segment;
368
+ }
369
+ CHIP_PATTERN.lastIndex = 0;
370
+ // Invariant: preserve original whitespace framing so the concatenated recall value
371
+ // remains stable across rehydration.
372
+ const leading = segment.match(/^\s+/)?.[0] ?? "";
373
+ const trailing = segment.match(/\s+$/)?.[0] ?? "";
374
+ const body = segment.slice(leading.length, segment.length - trailing.length);
375
+ if (body.length === 0)
376
+ return segment;
377
+ // Rationale: substring URL rehydration reuses paste-time URL classification and identity
378
+ // rules, producing a URL chip whenever a bare http(s) URL appears in the prose. Whole-text
379
+ // classification runs afterwards to catch path / large-paste candidates that consume the
380
+ // entire remaining body.
381
+ const withUrlChips = this.#rehydrateUrlSubstrings(body);
382
+ if (withUrlChips !== body)
383
+ return `${leading}${withUrlChips}${trailing}`;
384
+ const classified = this.transformPastedContent({ kind: "text", text: body });
385
+ return `${leading}${classified}${trailing}`;
386
+ }).join("");
387
+ }
388
+ #rehydrateUrlSubstrings(body) {
389
+ let output = "";
390
+ let cursor = 0;
391
+ URL_SUBSTRING_PATTERN.lastIndex = 0;
392
+ for (;;) {
393
+ const match = URL_SUBSTRING_PATTERN.exec(body);
394
+ if (match === null)
395
+ break;
396
+ const url = match[0];
397
+ if (match.index > cursor)
398
+ output += body.slice(cursor, match.index);
399
+ const label = url.length <= URL_DISPLAY_LENGTH ? url : `${url.slice(0, URL_DISPLAY_LENGTH)}…`;
400
+ output += this.#recordUnique({ kind: "url", tag: `[🔗 ${label}]`, label, url });
401
+ cursor = match.index + url.length;
402
+ }
403
+ URL_SUBSTRING_PATTERN.lastIndex = 0;
404
+ if (cursor === 0)
405
+ return body;
406
+ if (cursor < body.length)
407
+ output += body.slice(cursor);
408
+ return output;
409
+ }
410
+ prepareSubmission(text) {
411
+ const expanded = this.#replaceResolvable(text, true);
412
+ return { text: expanded.text, images: expanded.images };
413
+ }
414
+ #replaceResolvable(text, includeImages, omitImages = false) {
415
+ const images = [];
416
+ const seenImages = new Set();
417
+ const resolveChip = (tag) => {
418
+ const chip = this.#chips.get(tag);
419
+ if (chip === undefined)
420
+ return tag;
421
+ if (chip.kind === "text")
422
+ return chip.text;
423
+ if (chip.kind === "image") {
424
+ if (includeImages && !seenImages.has(tag)) {
425
+ images.push(chip.image);
426
+ seenImages.add(tag);
427
+ }
428
+ return omitImages ? "" : tag;
429
+ }
430
+ return chip.kind === "url" ? chip.url : chip.path;
431
+ };
432
+ // Invariant: scan only draft tokens (and resolved reservation tokens), never emitted payloads.
433
+ const expanded = text.replace(CHIP_PATTERN, tag => {
434
+ const entry = this.#pending.get(tag) ?? this.#pending.get(tag.replace("failed-", "screenshot-"));
435
+ if (entry === undefined)
436
+ return resolveChip(tag);
437
+ if (includeImages && entry.error !== undefined)
438
+ throw entry.error;
439
+ if (includeImages && entry.replacement === undefined)
440
+ throw new ImageAttachmentError("image-pending");
441
+ return entry.replacement === undefined ? tag : entry.replacement.replace(CHIP_PATTERN, resolveChip);
442
+ });
443
+ return { text: expanded, images };
444
+ }
445
+ #claimChip(tag, owner, created) {
446
+ if (owner === undefined) {
447
+ this.#provisionalOwners.delete(tag);
448
+ return;
449
+ }
450
+ let owners = this.#provisionalOwners.get(tag);
451
+ if (!owners && !created)
452
+ return; // Invariant: existing committed chips must survive canceled later pastes.
453
+ if (!owners) {
454
+ owners = new Set();
455
+ this.#provisionalOwners.set(tag, owners);
456
+ }
457
+ owners.add(owner);
458
+ this.#ownedChipTags.get(owner)?.add(tag);
459
+ }
460
+ #finishChipOwnership(owner, commit) {
461
+ for (const tag of this.#ownedChipTags.get(owner) ?? []) {
462
+ const owners = this.#provisionalOwners.get(tag);
463
+ if (!owners?.has(owner))
464
+ continue;
465
+ if (commit)
466
+ this.#provisionalOwners.delete(tag);
467
+ else {
468
+ owners.delete(owner);
469
+ if (owners.size === 0) {
470
+ this.#provisionalOwners.delete(tag);
471
+ this.#chips.delete(tag);
472
+ }
473
+ }
474
+ }
475
+ this.#ownedChipTags.delete(owner);
476
+ }
477
+ #recordUnique(chip, owner) {
478
+ const existing = this.#chips.get(chip.tag);
479
+ if (existing === undefined || sameChipValue(existing, chip)) {
480
+ this.#chips.set(chip.tag, chip);
481
+ this.#claimChip(chip.tag, owner, existing === undefined);
482
+ return chip.tag;
483
+ }
484
+ const suffix = randomBytes(2).toString("hex");
485
+ const uniqueTag = `${chip.tag.slice(0, -1)} #${suffix}]`;
486
+ const unique = { ...chip, tag: uniqueTag };
487
+ this.#chips.set(uniqueTag, unique);
488
+ this.#claimChip(uniqueTag, owner, true);
489
+ return uniqueTag;
490
+ }
491
+ }
492
+ function sameChipValue(left, right) {
493
+ if (left.kind !== right.kind)
494
+ return false;
495
+ if (left.kind === "url" && right.kind === "url")
496
+ return left.url === right.url;
497
+ if ((left.kind === "file" || left.kind === "folder") && (right.kind === "file" || right.kind === "folder")) {
498
+ return path.normalize(left.path) === path.normalize(right.path);
499
+ }
500
+ if (left.kind === "image" && right.kind === "image")
501
+ return left.image.data === right.image.data;
502
+ return false;
503
+ }
@@ -0,0 +1,36 @@
1
+ import { type PromptHistoryKind, type PromptHistoryPort } from "../../../contracts/owned-ui/index.js";
2
+ import type { PiShellEditorPort } from "../components/index.js";
3
+ /** Merges bounded recall snapshots; the editor alone owns browsing, draft, cursor, and undo state. */
4
+ export declare class PromptHistoryController {
5
+ #private;
6
+ readonly options: {
7
+ editor: PiShellEditorPort;
8
+ store: PromptHistoryPort;
9
+ limit: number;
10
+ fallback: readonly string[];
11
+ active(): boolean;
12
+ render(): void;
13
+ /** Applied to every recall text before it enters the editor recall list. Callers use this
14
+ * to re-classify durable chip content back into atomic chips; the identity map returned by
15
+ * default keeps historical behavior for callers that opt out. */
16
+ rehydrate?: (text: string) => string;
17
+ };
18
+ constructor(options: {
19
+ editor: PiShellEditorPort;
20
+ store: PromptHistoryPort;
21
+ limit: number;
22
+ fallback: readonly string[];
23
+ active(): boolean;
24
+ render(): void;
25
+ /** Applied to every recall text before it enters the editor recall list. Callers use this
26
+ * to re-classify durable chip content back into atomic chips; the identity map returned by
27
+ * default keeps historical behavior for callers that opt out. */
28
+ rehydrate?: (text: string) => string;
29
+ });
30
+ start(): void;
31
+ capture(text: string, kind: PromptHistoryKind, cwd: string, sessionId: string): void;
32
+ rememberRecovery(text: string): void;
33
+ synchronize(): void;
34
+ reset(fallback: readonly string[]): void;
35
+ close(): Promise<boolean>;
36
+ }