@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
@@ -1,4 +1,4 @@
1
- import { GLOBAL_SCOPE, LineInput, PLAIN_THEME, ShortcutRegistry, PROMPT_GLYPH, blockJumpTarget, dialogValueColumn, numericValues, RAIL_COLUMNS, renderDialogPanel, renderEmptyState, renderGroupHeader, renderInputRow, renderStatusLine, renderListRow, renderNote, dialogRowAt, menuRowAt, regionAt, renderValueMenu, withScrollbarRail, stepperEnds, steppedValue, valueColumnFor, valueMenuFrame, promptRule, caretCell, blockRowSpan, displayWidth, faint, handleLineInputKey, humanizeLabel, humanizeTitle, indexOfKey, isThumbRow, layoutList, moveSelection, rowKey, scrollForSelection, scrollbarGeometry, selectableIndexes, } from "../../foundation/ui-components/index.js";
1
+ import { GLOBAL_SCOPE, LineInput, PLAIN_THEME, ShortcutRegistry, assertNoShortcutConflicts, blockJumpTarget, dialogValueColumn, numericValues, RAIL_COLUMNS, renderDialogPanel, renderEmptyState, renderGroupHeader, renderInputRow, renderListRow, renderNote, renderStatusLine, dialogRowAt, menuRowAt, regionAt, renderValueMenu, withScrollbarRail, stepperEnds, steppedValue, valueColumnFor, valueMenuFrame, blockRowSpan, displayWidth, handleLineInputKey, humanizeLabel, humanizeTitle, indexOfKey, isThumbRow, layoutList, moveSelection, rowKey, scrollForSelection, scrollbarGeometry, scrollbarWheelRows, selectableIndexes, } from "../../ui/components/index.js";
2
2
  export const SETTINGS_APP_ID = "settings";
3
3
  export const SETTINGS_ROUTE = "settings";
4
4
  const SCOPE = SETTINGS_APP_ID;
@@ -29,6 +29,7 @@ SETTINGS_SHORTCUTS.declare({ key: "left", scope: DIALOG_SCOPE, description: "Cha
29
29
  SETTINGS_SHORTCUTS.declare({ key: "right", scope: DIALOG_SCOPE, description: "Change this part", section: "Parts" }, "part-change");
30
30
  SETTINGS_SHORTCUTS.declare({ key: "up", scope: DIALOG_SCOPE, description: "Previous part", section: "Parts" }, "part-previous");
31
31
  SETTINGS_SHORTCUTS.declare({ key: "down", scope: DIALOG_SCOPE, description: "Next part", section: "Parts" }, "part-next");
32
+ assertNoShortcutConflicts(SETTINGS_SHORTCUTS.assemble());
32
33
  const KEYS = {
33
34
  "\u001b[A": "up",
34
35
  "\u001b[B": "down",
@@ -56,6 +57,8 @@ export class SettingsApp {
56
57
  #session;
57
58
  #selectedKey;
58
59
  #scroll = 0;
60
+ // Invariant: keyboard navigation requests visibility once; pointer scrolling then stays free.
61
+ #selectionNeedsReveal = true;
59
62
  #reveal;
60
63
  #notice = null;
61
64
  #filter = null;
@@ -63,19 +66,15 @@ export class SettingsApp {
63
66
  #structured = null;
64
67
  #loading = true;
65
68
  #interruptArmed = false;
66
- /** Values requested but not yet reflected by the source, keyed by entry. */
69
+ // Invariant: pending values remain visible until the source reflects them.
67
70
  #pending = new Map();
68
71
  #footerHeight = 1;
69
- /** Column the dialog's values start at, so a label stays a label. */
70
72
  #dialogValueColumn = 0;
71
- /** Screen row the dialog panel starts on, for pointer hits. */
72
73
  #panelTop = 0;
73
74
  #panelTopForFrame = 0;
74
- /** Row key under the pointer, and where each row was drawn last frame. */
75
75
  #hoverKey = null;
76
76
  #hoverRegion = "label";
77
77
  #frameRows = [];
78
- /** Where the value menu was drawn last frame, for hit testing. */
79
78
  #menuFrame = null;
80
79
  constructor(session) {
81
80
  this.#session = session;
@@ -90,15 +89,19 @@ export class SettingsApp {
90
89
  const theme = host.theme ?? PLAIN_THEME;
91
90
  this.#interruptArmed = host.interruptArmed;
92
91
  const rows = this.#rows();
92
+ const selected = indexOfKey(rows, this.#selectedKey);
93
93
  const footer = this.#footerLines(rect.width, theme);
94
94
  this.#footerHeight = footer.length;
95
95
  this.#panelTopForFrame = Math.max(0, rect.height - footer.length);
96
96
  this.#panelTop = this.#panelTopForFrame;
97
97
  const bodyHeight = Math.max(0, rect.height - footer.length);
98
- const selected = indexOfKey(rows, this.#selectedKey);
99
- this.#scroll = scrollForSelection(rows, bodyHeight, this.#scroll, selected, this.#reveal);
98
+ if (this.#selectionNeedsReveal) {
99
+ this.#scroll = scrollForSelection(rows, bodyHeight, this.#scroll, selected, this.#reveal);
100
+ this.#selectionNeedsReveal = false;
101
+ }
100
102
  this.#reveal = undefined;
101
103
  const layout = layoutList(rows, bodyHeight, this.#scroll);
104
+ this.#scroll = layout.scroll;
102
105
  const contentWidth = Math.max(0, rect.width - RAIL_COLUMNS);
103
106
  const valueColumn = this.#valueColumn(rows);
104
107
  const geometry = scrollbarGeometry({
@@ -121,14 +124,13 @@ export class SettingsApp {
121
124
  for (const index of layout.rowIndexes) {
122
125
  const row = rows[index];
123
126
  if (row !== undefined && row.kind === "element") {
127
+ const view = this.#viewRow(row.value);
124
128
  this.#frameRows.push({
125
- key: `${row.value.backend}:${row.value.id}`,
129
+ key: view.key,
126
130
  screenRow: body.length,
127
131
  valueColumn,
128
- valueWidth: row.value.structured
129
- ? CONFIGURE.length
130
- : row.value.value === null ? 0 : displayWidth(displayValue(row.value.value)),
131
- stepper: isStepper(row.value),
132
+ valueWidth: displayWidth(view.value),
133
+ stepper: view.stepper !== undefined,
132
134
  });
133
135
  }
134
136
  body.push(this.#renderRow(row, index === selected, contentWidth, valueColumn, theme));
@@ -148,7 +150,8 @@ export class SettingsApp {
148
150
  return this.#menuKey(data);
149
151
  if (this.#filter !== null)
150
152
  return this.#filterKey(data);
151
- const action = SETTINGS_SHORTCUTS.resolve(KEYS[data] ?? data, SCOPE);
153
+ const key = KEYS[data] ?? data;
154
+ const action = SETTINGS_SHORTCUTS.resolve(key, SCOPE);
152
155
  if (action === null)
153
156
  return { consumed: false };
154
157
  const rows = this.#rows();
@@ -186,11 +189,14 @@ export class SettingsApp {
186
189
  }
187
190
  case "first":
188
191
  case "last": {
189
- // End lands on the very last setting, not on the head of its section.
192
+ // Invariant: End lands on the very last setting, not on the head of its section.
190
193
  const selectable = selectableIndexes(rows);
191
194
  const target = action === "last" ? selectable.at(-1) : selectable[0];
192
- if (target !== undefined)
193
- this.#jump(rows, target);
195
+ if (target !== undefined) {
196
+ this.#select(rows, target);
197
+ if (action === "first")
198
+ this.#scroll = 0;
199
+ }
194
200
  return { consumed: true };
195
201
  }
196
202
  case "previous-value":
@@ -208,7 +214,7 @@ export class SettingsApp {
208
214
  const overRow = menuRowAt(frame, event.row - 1, event.column);
209
215
  const overMenu = overRow !== null;
210
216
  if (event.kind === "motion") {
211
- // The menu owns the pointer, but the row it came from is still the thing
217
+ // Invariant: the menu owns the pointer, but the row it came from is still the thing
212
218
  // being changed, so its value keeps reading as the one under the pointer.
213
219
  // Only a dialog that takes the screen puts that out.
214
220
  const hadHover = this.#hoverKey !== menu.anchorKey || this.#hoverRegion !== "value";
@@ -227,7 +233,7 @@ export class SettingsApp {
227
233
  if (event.kind !== "press")
228
234
  return { consumed: true, render: false };
229
235
  if (overRow === null) {
230
- // A press anywhere else dismisses the menu rather than acting through it.
236
+ // Invariant: a press anywhere else dismisses the menu rather than acting through it.
231
237
  this.#menu = null;
232
238
  return { consumed: true };
233
239
  }
@@ -239,7 +245,7 @@ export class SettingsApp {
239
245
  }
240
246
  const open = this.#structured;
241
247
  if (open !== null) {
242
- // The panel owns the pointer while it is open; its flag rows are the targets.
248
+ // Invariant: the panel owns the pointer while it is open; its flag rows are the targets.
243
249
  // The panel's rows begin one line below its rule.
244
250
  const panel = { firstRow: this.#panelTop + 1, rows: open.flags.length, valueColumn: this.#dialogValueColumn };
245
251
  const row = event.row - 1 - panel.firstRow;
@@ -253,7 +259,7 @@ export class SettingsApp {
253
259
  }
254
260
  if (event.kind === "press") {
255
261
  open.index = row;
256
- // Pointing at the label picks the row; the value is what changes it,
262
+ // Rationale: pointing at the label picks the row; the value is what changes it,
257
263
  // exactly as in the list behind the dialog.
258
264
  const key = open.flags[row] ?? "";
259
265
  const width = displayWidth((open.record[key] ?? false) ? "true" : "false");
@@ -263,6 +269,15 @@ export class SettingsApp {
263
269
  }
264
270
  return { consumed: true, render: false };
265
271
  }
272
+ if (event.kind === "wheel-up" || event.kind === "wheel-down") {
273
+ // Invariant: the whole list pane owns wheel scrolling, including blank space beside
274
+ // short labels. It must not depend on finding an item under the pointer.
275
+ if (event.row < 1 || event.row > this.#panelTopForFrame)
276
+ return { consumed: false };
277
+ const distance = scrollbarWheelRows(this.#scrollbarSpeed());
278
+ this.#scroll = Math.max(0, this.#scroll + (event.kind === "wheel-down" ? distance : -distance));
279
+ return { consumed: true };
280
+ }
266
281
  const row = this.#frameRows.find(candidate => candidate.screenRow === event.row - 1);
267
282
  const previousKey = this.#hoverKey;
268
283
  const previousRegion = this.#hoverRegion;
@@ -277,7 +292,7 @@ export class SettingsApp {
277
292
  const rows = this.#rows();
278
293
  const index = rows.findIndex(candidate => rowKey(candidate) === row.key);
279
294
  if (index >= 0) {
280
- // The pointer acts where it points; the arrow belongs to the keyboard.
295
+ // Rationale: the pointer acts where it points; the arrow belongs to the keyboard.
281
296
  this.#notice = null;
282
297
  if (this.#hoverRegion === "minus")
283
298
  this.#cycle(rows, index, -1);
@@ -288,10 +303,6 @@ export class SettingsApp {
288
303
  }
289
304
  return { consumed: true };
290
305
  }
291
- if (event.kind === "wheel-up" || event.kind === "wheel-down") {
292
- this.#scroll = Math.max(0, this.#scroll + (event.kind === "wheel-down" ? 3 : -3));
293
- return { consumed: true };
294
- }
295
306
  const changed = previousKey !== this.#hoverKey || previousRegion !== this.#hoverRegion;
296
307
  return { consumed: event.kind !== "motion", render: changed };
297
308
  }
@@ -305,7 +316,7 @@ export class SettingsApp {
305
316
  return;
306
317
  }
307
318
  const shown = this.#shownValue(entry);
308
- // A number is stepped, not picked from a list: it has its own two controls,
319
+ // Rationale: a number is stepped, not picked from a list: it has its own two controls,
309
320
  // and pointing at it is not a request for anything else.
310
321
  if (typeof shown === "number")
311
322
  return;
@@ -314,16 +325,12 @@ export class SettingsApp {
314
325
  return;
315
326
  }
316
327
  const current = shown === null ? 0 : Math.max(0, entry.choices.indexOf(shown));
317
- // Nothing is highlighted until the pointer or a key picks a row, so opening
318
- // the menu does not flash a highlight the reader did not ask for.
319
- this.#menu = { entry, current, anchorKey: `${entry.backend}:${entry.id}`, choices: entry.choices, index: -1 };
328
+ // Compatibility: pinned SelectList opens on the value currently in effect.
329
+ this.#menu = { entry, current, anchorKey: `${entry.backend}:${entry.id}`, choices: entry.choices, index: current };
320
330
  }
321
- /**
322
- * A structured setting is a set of flags, so it opens as its own list rather
323
- * than as a value menu: each row names one flag and toggles it in place.
324
- */
331
+ // Rationale: a structured setting opens as its own flag list rather than a value menu.
325
332
  #openStructured(entry) {
326
- // The flags come from the declaration, not from the stored value: an unset
333
+ // Invariant: the flags come from the declaration, not from the stored value: an unset
327
334
  // flag still has a row, showing the default the source would apply.
328
335
  if (entry.flags.length === 0) {
329
336
  this.#notice = `${labelOf(entry)} has nothing to configure`;
@@ -337,7 +344,7 @@ export class SettingsApp {
337
344
  const value = stored[flag.key];
338
345
  record[flag.key] = typeof value === "boolean" ? value : flag.fallback;
339
346
  }
340
- // The dialog takes the screen: the row it was opened from stops being the
347
+ // Invariant: the dialog takes the screen: the row it was opened from stops being the
341
348
  // thing under the pointer, so it stops looking like it.
342
349
  this.#hoverKey = null;
343
350
  this.#hoverRegion = "label";
@@ -385,7 +392,7 @@ export class SettingsApp {
385
392
  return { consumed: true };
386
393
  }
387
394
  if (key === "up" || key === "down") {
388
- // The keyboard starts from the value in effect rather than from the top.
395
+ // Compatibility: the keyboard starts from the value in effect rather than from the top.
389
396
  menu.index = menu.index < 0
390
397
  ? menu.current
391
398
  : Math.min(menu.choices.length - 1, Math.max(0, menu.index + (key === "down" ? 1 : -1)));
@@ -403,9 +410,20 @@ export class SettingsApp {
403
410
  if (input === null)
404
411
  return { consumed: false };
405
412
  const key = KEYS[data];
413
+ if (key === "home" || key === "end") {
414
+ const rows = this.#rows();
415
+ const selectable = selectableIndexes(rows);
416
+ const target = key === "end" ? selectable.at(-1) : selectable[0];
417
+ if (target !== undefined) {
418
+ this.#select(rows, target);
419
+ if (key === "home")
420
+ this.#scroll = 0;
421
+ }
422
+ return { consumed: true };
423
+ }
406
424
  if (key === "up" || key === "down" || key === "shift+up" || key === "shift+down") {
407
425
  const rows = this.#rows();
408
- // Nothing found means nothing to move through; the key is still swallowed
426
+ // Rationale: nothing found means nothing to move through; the key is still swallowed
409
427
  // rather than typed into the search.
410
428
  if (selectableIndexes(rows).length === 0)
411
429
  return { consumed: true, render: false };
@@ -437,7 +455,7 @@ export class SettingsApp {
437
455
  }
438
456
  const shown = this.#shownValue(entry);
439
457
  if (typeof shown === "number") {
440
- // At the end of the range there is nothing to say: the arrow already reads
458
+ // Rationale: at the end of the range there is nothing to say: the arrow already reads
441
459
  // as unavailable, so a message would only repeat it.
442
460
  const next = steppedValue(rangeOf(entry), shown, delta);
443
461
  if (next !== null)
@@ -458,25 +476,38 @@ export class SettingsApp {
458
476
  }
459
477
  #apply(entry, value) {
460
478
  const key = `${entry.backend}:${entry.id}`;
461
- // Shown immediately so the row never lags a keypress, and so the next press
479
+ // Invariant: shown immediately so the row never lags a keypress, and so the next press
462
480
  // steps from here rather than from a value the source has not caught up to.
463
481
  this.#pending.set(key, value);
464
482
  void this.#session.change(entry.backend, entry.id, value).then(outcome => {
465
- if (outcome.failure !== null) {
483
+ if (outcome.failure !== null || outcome.status === "failed") {
466
484
  this.#pending.delete(key);
467
- this.#notice = `Could not save ${labelOf(entry)}: ${outcome.failure}`;
485
+ this.#notice = `Could not save ${labelOf(entry)}: ${outcome.failure ?? "the effect failed"}`;
468
486
  return;
469
487
  }
470
- // A later press may have moved on; only the last request clears itself.
488
+ if (outcome.status === "unavailable" || outcome.limitationReason !== null) {
489
+ this.#pending.delete(key);
490
+ this.#notice = outcome.limitationReason ?? `${labelOf(entry)} is unavailable`;
491
+ return;
492
+ }
493
+ // Concurrency: a later press may have moved on; only the last request clears itself.
471
494
  if (this.#pending.get(key) === value)
472
495
  this.#pending.delete(key);
473
- this.#notice = outcome.pendingRestart ? `${labelOf(entry)} applies on the next start` : null;
496
+ this.#notice = outcome.status === "deferred" && outcome.application !== null
497
+ ? `${labelOf(entry)} is stored and applies ${applicationLabel(outcome.application)}`
498
+ : null;
474
499
  });
475
500
  }
476
- /** What the row shows: the value asked for if one is outstanding, else the source's. */
477
501
  #shownValue(entry) {
478
502
  return this.#pending.get(`${entry.backend}:${entry.id}`) ?? entry.value;
479
503
  }
504
+ #scrollbarSpeed() {
505
+ const entry = this.#session.sections()
506
+ .flatMap(section => section.entries)
507
+ .find(candidate => candidate.backend === "a1" && candidate.id === "scrollbarSpeed");
508
+ const value = entry === undefined ? this.#session.value("scrollbarSpeed") : this.#shownValue(entry);
509
+ return isScrollbarSpeed(value) ? value : "normal";
510
+ }
480
511
  #jump(rows, target) {
481
512
  this.#select(rows, target);
482
513
  this.#reveal = blockRowSpan(rows, target);
@@ -485,6 +516,7 @@ export class SettingsApp {
485
516
  if (index < 0)
486
517
  return;
487
518
  this.#selectedKey = rowKey(rows[index]);
519
+ this.#selectionNeedsReveal = true;
488
520
  this.#notice = null;
489
521
  }
490
522
  #rows() {
@@ -494,7 +526,7 @@ export class SettingsApp {
494
526
  || labelOf(entry).toLowerCase().includes(needle);
495
527
  const rows = [];
496
528
  for (const section of this.#session.sections()) {
497
- // A section named by the search is what the reader asked for, so it arrives
529
+ // Rationale: a section named by the search is what the reader asked for, so it arrives
498
530
  // whole rather than narrowed to the entries that happen to repeat its name.
499
531
  const named = needle.length > 0 && section.title.toLowerCase().includes(needle);
500
532
  const entries = named ? section.entries : section.entries.filter(matches);
@@ -510,7 +542,7 @@ export class SettingsApp {
510
542
  if (section.readOnlyReason !== null && (needle.length === 0 || named)) {
511
543
  rows.push({ kind: "note", group: section.id, text: section.readOnlyReason });
512
544
  }
513
- // Presented in the order the source reports, which is the order the
545
+ // Invariant: presented in the order the source reports, which is the order the
514
546
  // pinned engine shows and is neither declaration order nor alphabetical.
515
547
  for (const entry of entries) {
516
548
  rows.push({
@@ -543,18 +575,18 @@ export class SettingsApp {
543
575
  const hovered = this.#hoverKey === key;
544
576
  return renderListRow(this.#viewRow(entry), { selected, hovered, region: this.#hoverRegion }, valueColumn, width, theme);
545
577
  }
546
- /** What the list view needs to draw a setting: its words, and where it can go. */
547
578
  #viewRow(entry) {
548
579
  const shown = this.#shownValue(entry);
549
580
  const value = entry.structured
550
581
  ? CONFIGURE
551
- : shown === null ? describeRaw(entry.rawValue) : displayValue(shown);
582
+ : shown === null
583
+ ? describeRaw(entry.rawValue)
584
+ : effectiveDisplay(entry, shown);
552
585
  const range = rangeOf(entry);
553
586
  return {
554
587
  key: `${entry.backend}:${entry.id}`,
555
588
  label: labelOf(entry),
556
589
  value,
557
- ...(entry.origin === "default" ? { suffix: "(default)" } : {}),
558
590
  ...(typeof shown === "number" && entry.editable ? { stepper: stepperEnds(range, shown) } : {}),
559
591
  };
560
592
  }
@@ -578,13 +610,12 @@ export class SettingsApp {
578
610
  this.#menuFrame = frame;
579
611
  return renderValueMenu(lines, state, frame, theme);
580
612
  }
581
- /** What the panel needs to present a structured setting's parts. */
582
613
  #dialogLines(open, width, theme) {
583
614
  const rows = open.flags.map(key => {
584
615
  const declared = open.entry.flags.find(flag => flag.key === key);
585
616
  return {
586
617
  label: declared?.label ?? humanizeLabel(key),
587
- // The engine writes these as the booleans they are rather than as yes/no.
618
+ // Protocol: the engine writes these as the booleans they are rather than as yes/no.
588
619
  value: (open.record[key] ?? false) ? "true" : "false",
589
620
  ...(declared?.description === undefined ? {} : { description: declared.description }),
590
621
  };
@@ -597,14 +628,12 @@ export class SettingsApp {
597
628
  const open = this.#structured;
598
629
  if (open !== null)
599
630
  return this.#dialogLines(open, width, theme);
600
- // The hint is the declarations, so a key cannot be described here and bound
601
- // to something else.
602
- const hint = this.#interruptArmed ? "press ctrl+c again to exit A1" : SETTINGS_SHORTCUTS.hint(SCOPE);
631
+ const hint = this.#interruptArmed ? "press ctrl+c again to exit a1" : SETTINGS_SHORTCUTS.hint(SCOPE);
603
632
  const status = renderStatusLine({ hint, report: this.#notice }, width, theme);
604
633
  const input = this.#filter;
605
634
  if (input === null)
606
635
  return [status];
607
- return [...renderInputRow(input, width, { placeholder: SEARCH_PLACEHOLDER }).lines, status];
636
+ return [...renderInputRow(input, width, { placeholder: SEARCH_PLACEHOLDER, theme }).lines, status];
608
637
  }
609
638
  }
610
639
  /** The source's own wording when it has one, otherwise the id made readable. */
@@ -624,6 +653,23 @@ function displayValue(value) {
624
653
  return value ? "yes" : "no";
625
654
  return String(value);
626
655
  }
656
+ function effectiveDisplay(entry, stored) {
657
+ const effective = entry.effectiveValue;
658
+ if (effective === stored)
659
+ return displayValue(stored);
660
+ const shownEffective = typeof effective === "string" || typeof effective === "number" || typeof effective === "boolean"
661
+ ? displayValue(effective)
662
+ : describeRaw(effective);
663
+ return `${displayValue(stored)} (effective ${shownEffective}; ${applicationLabel(entry.application)})`;
664
+ }
665
+ function applicationLabel(application) {
666
+ switch (application) {
667
+ case "live": return "live";
668
+ case "next-session": return "in the next session";
669
+ case "next-start": return "on the next start";
670
+ case "current-exit": return "when the current session exits";
671
+ }
672
+ }
627
673
  function describeRaw(value) {
628
674
  if (value === null || value === undefined)
629
675
  return "unset";
@@ -631,3 +677,6 @@ function describeRaw(value) {
631
677
  return Array.isArray(value) ? `${value.length} items` : "structured value";
632
678
  return String(value);
633
679
  }
680
+ function isScrollbarSpeed(value) {
681
+ return value === "normal" || value === "fast" || value === "high";
682
+ }
@@ -0,0 +1,32 @@
1
+ export interface PromptImageSidecarAttachment {
2
+ readonly type: "image";
3
+ readonly data: string;
4
+ readonly mimeType: string;
5
+ }
6
+ export interface PromptImageSidecarRecord {
7
+ readonly tag: string;
8
+ readonly data: string;
9
+ readonly mimeType: string;
10
+ readonly savedAt: string;
11
+ }
12
+ /** Extract every image chip identifier referenced by a recall text; identifiers are the hex bytes
13
+ * embedded in the tag by `PromptChipStore`. Ordering is left-to-right; duplicates are dropped. */
14
+ export declare function collectImageChipIdentifiers(text: string): string[];
15
+ /** Per-profile filesystem sidecar owning image chip payloads that survive a process restart.
16
+ * Writes are idempotent, reads are validated, and unlinks tolerate missing files. Callers must
17
+ * treat every failure as "the sidecar is unavailable"; that maps to the silent-strip contract. */
18
+ export declare class PromptImageSidecar {
19
+ #private;
20
+ constructor(directory: string);
21
+ get directory(): string;
22
+ write(id: string, record: PromptImageSidecarRecord): void;
23
+ read(id: string): PromptImageSidecarRecord | null;
24
+ readAttachment(id: string): PromptImageSidecarAttachment | null;
25
+ /** Enumerate every sidecar identifier that currently has a file on disk. Ignores unrelated
26
+ * files silently; corrupt payloads are still listed so a caller sweep can reclaim them. */
27
+ list(): string[];
28
+ unlink(id: string): void;
29
+ /** Delete sidecars whose identifier is not present in `keep`. Used both by retention pruning
30
+ * of a specific row and by the store-open orphan sweep against every surviving row. */
31
+ sweep(keep: Iterable<string>): void;
32
+ }
@@ -0,0 +1,130 @@
1
+ import { chmodSync, mkdirSync, readdirSync, readFileSync, renameSync, unlinkSync, writeFileSync, lstatSync } from "node:fs";
2
+ import { posix, win32 } from "node:path";
3
+ const IMAGE_TAG_PATTERN = /\[📷 screenshot-([a-f0-9]+)(?:-resized)?\]/gu;
4
+ const IMAGE_FILENAME_PATTERN = /^([a-f0-9]+)\.json$/u;
5
+ const MAX_SIDECAR_BYTES = 12 * 1024 * 1024;
6
+ /** Extract every image chip identifier referenced by a recall text; identifiers are the hex bytes
7
+ * embedded in the tag by `PromptChipStore`. Ordering is left-to-right; duplicates are dropped. */
8
+ export function collectImageChipIdentifiers(text) {
9
+ const seen = new Set();
10
+ IMAGE_TAG_PATTERN.lastIndex = 0;
11
+ for (;;) {
12
+ const match = IMAGE_TAG_PATTERN.exec(text);
13
+ if (match === null)
14
+ break;
15
+ seen.add(match[1]);
16
+ }
17
+ return [...seen];
18
+ }
19
+ /** Per-profile filesystem sidecar owning image chip payloads that survive a process restart.
20
+ * Writes are idempotent, reads are validated, and unlinks tolerate missing files. Callers must
21
+ * treat every failure as "the sidecar is unavailable"; that maps to the silent-strip contract. */
22
+ export class PromptImageSidecar {
23
+ #directory;
24
+ constructor(directory) {
25
+ this.#directory = directory;
26
+ }
27
+ get directory() { return this.#directory; }
28
+ write(id, record) {
29
+ if (!isValidId(id))
30
+ return;
31
+ this.#ensureDirectory();
32
+ const target = this.#pathFor(id);
33
+ try {
34
+ // Concurrency: another process may have written the same id; a subsequent overwrite is
35
+ // idempotent because sidecar payloads are keyed to a chip tag whose id already collided.
36
+ const temporary = `${target}.tmp`;
37
+ writeFileSync(temporary, JSON.stringify(record), { encoding: "utf8", mode: 0o600, flag: "w" });
38
+ try {
39
+ if (process.platform !== "win32")
40
+ chmodSync(temporary, 0o600);
41
+ }
42
+ catch { /* Compatibility: chmod is best-effort where the platform ignores it. */ }
43
+ renameSync(temporary, target);
44
+ }
45
+ catch {
46
+ // Security: sidecar write failures never propagate into shell diagnostics or history rows.
47
+ }
48
+ }
49
+ read(id) {
50
+ if (!isValidId(id))
51
+ return null;
52
+ try {
53
+ const target = this.#pathFor(id);
54
+ const status = lstatSync(target);
55
+ if (status.isSymbolicLink() || !status.isFile() || status.size > MAX_SIDECAR_BYTES)
56
+ return null;
57
+ const parsed = JSON.parse(readFileSync(target, "utf8"));
58
+ if (typeof parsed !== "object" || parsed === null)
59
+ return null;
60
+ const record = parsed;
61
+ if (typeof record.tag !== "string" || typeof record.data !== "string"
62
+ || typeof record.mimeType !== "string" || typeof record.savedAt !== "string"
63
+ || record.data.length === 0 || record.tag.length === 0 || record.mimeType.length === 0)
64
+ return null;
65
+ return { tag: record.tag, data: record.data, mimeType: record.mimeType, savedAt: record.savedAt };
66
+ }
67
+ catch {
68
+ return null;
69
+ }
70
+ }
71
+ readAttachment(id) {
72
+ const record = this.read(id);
73
+ if (record === null)
74
+ return null;
75
+ return Object.freeze({ type: "image", data: record.data, mimeType: record.mimeType });
76
+ }
77
+ /** Enumerate every sidecar identifier that currently has a file on disk. Ignores unrelated
78
+ * files silently; corrupt payloads are still listed so a caller sweep can reclaim them. */
79
+ list() {
80
+ try {
81
+ const entries = readdirSync(this.#directory, { withFileTypes: true });
82
+ const ids = [];
83
+ for (const entry of entries) {
84
+ if (!entry.isFile())
85
+ continue;
86
+ const match = IMAGE_FILENAME_PATTERN.exec(entry.name);
87
+ if (match !== null)
88
+ ids.push(match[1]);
89
+ }
90
+ return ids;
91
+ }
92
+ catch {
93
+ return [];
94
+ }
95
+ }
96
+ unlink(id) {
97
+ if (!isValidId(id))
98
+ return;
99
+ try {
100
+ unlinkSync(this.#pathFor(id));
101
+ }
102
+ catch { /* Compatibility: ENOENT / EBUSY is indistinguishable from an already-reaped sidecar. */ }
103
+ }
104
+ /** Delete sidecars whose identifier is not present in `keep`. Used both by retention pruning
105
+ * of a specific row and by the store-open orphan sweep against every surviving row. */
106
+ sweep(keep) {
107
+ const survivors = new Set(keep);
108
+ for (const id of this.list()) {
109
+ if (!survivors.has(id))
110
+ this.unlink(id);
111
+ }
112
+ }
113
+ #ensureDirectory() {
114
+ try {
115
+ mkdirSync(this.#directory, { recursive: true, mode: 0o700 });
116
+ if (process.platform !== "win32")
117
+ chmodSync(this.#directory, 0o700);
118
+ }
119
+ catch {
120
+ // Compatibility: the directory may already exist with a different mode we cannot change.
121
+ }
122
+ }
123
+ #pathFor(id) {
124
+ const paths = process.platform === "win32" ? win32 : posix;
125
+ return paths.join(this.#directory, `${id}.json`);
126
+ }
127
+ }
128
+ function isValidId(value) {
129
+ return typeof value === "string" && value.length > 0 && value.length <= 64 && /^[a-f0-9]+$/u.test(value);
130
+ }
@@ -0,0 +1,4 @@
1
+ export { PromptHistoryService } from "./service.js";
2
+ export { resolvePromptHistoryPath } from "./paths.js";
3
+ export { PromptImageSidecar, collectImageChipIdentifiers } from "./image-sidecar.js";
4
+ export type { PromptImageSidecarRecord, PromptImageSidecarAttachment } from "./image-sidecar.js";
@@ -0,0 +1,3 @@
1
+ export { PromptHistoryService } from "./service.js";
2
+ export { resolvePromptHistoryPath } from "./paths.js";
3
+ export { PromptImageSidecar, collectImageChipIdentifiers } from "./image-sidecar.js";
@@ -0,0 +1,5 @@
1
+ export declare function resolvePromptHistoryPath(dataDir: string, profileRoot: string, platform?: NodeJS.Platform): {
2
+ path: string;
3
+ profileId: string;
4
+ imagesDir: string;
5
+ };
@@ -0,0 +1,17 @@
1
+ import { createHash } from "node:crypto";
2
+ import { posix, win32 } from "node:path";
3
+ import { PRODUCT_IDENTITY } from "../../product-identity.js";
4
+ export function resolvePromptHistoryPath(dataDir, profileRoot, platform = process.platform) {
5
+ const paths = platform === "win32" ? win32 : posix;
6
+ if (!paths.isAbsolute(dataDir) || !paths.isAbsolute(profileRoot) || dataDir.includes("\0") || profileRoot.includes("\0"))
7
+ throw new TypeError("History requires absolute roots");
8
+ let normalized = paths.normalize(profileRoot);
9
+ if (normalized.length > paths.parse(normalized).root.length)
10
+ normalized = normalized.replace(/[\\/]+$/, "");
11
+ if (platform === "win32")
12
+ normalized = normalized.replaceAll("\\", "/").toLowerCase();
13
+ const digest = createHash("sha256").update(JSON.stringify([1, PRODUCT_IDENTITY.commandName, normalized])).digest("hex");
14
+ const profileId = `${PRODUCT_IDENTITY.filesystem.temporaryPrefix}${digest}`;
15
+ const historyDir = paths.join(dataDir, "history");
16
+ return { path: paths.join(historyDir, `${profileId}.sqlite3`), profileId, imagesDir: paths.join(historyDir, `${profileId}-images`) };
17
+ }