@timurproko/a1 0.2.6 → 0.2.7-dev.1222

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 (419) hide show
  1. package/README.md +41 -3
  2. package/bin/automatic-update.js +7 -0
  3. package/bin/cli.js +4 -0
  4. package/bin/guardian.js +5 -0
  5. package/bin/tab-launch-context.d.ts +27 -0
  6. package/bin/tab-launch-context.js +94 -0
  7. package/bin/ui.js +107 -59
  8. package/dist/app/session-shell/clipboard-diagnostics.js +1 -1
  9. package/dist/app/session-shell/dialog-coordinator.d.ts +42 -0
  10. package/dist/app/session-shell/dialog-coordinator.js +133 -0
  11. package/dist/app/session-shell/dock-chrome.d.ts +34 -0
  12. package/dist/app/session-shell/dock-chrome.js +109 -0
  13. package/dist/app/session-shell/exit-notice.d.ts +1 -1
  14. package/dist/app/session-shell/exit-notice.js +1 -1
  15. package/dist/app/session-shell/extension-surface.d.ts +30 -0
  16. package/dist/app/session-shell/extension-surface.js +105 -0
  17. package/dist/app/session-shell/helper-pool.d.ts +3 -5
  18. package/dist/app/session-shell/helper-pool.js +3 -5
  19. package/dist/app/session-shell/input-surface-switch.d.ts +36 -0
  20. package/dist/app/session-shell/input-surface-switch.js +85 -0
  21. package/dist/app/session-shell/login-interaction.d.ts +27 -0
  22. package/dist/app/session-shell/login-interaction.js +91 -0
  23. package/dist/app/session-shell/prompt-submission.d.ts +48 -0
  24. package/dist/app/session-shell/prompt-submission.js +276 -0
  25. package/dist/app/session-shell/resident-tab-coordinator.d.ts +38 -0
  26. package/dist/app/session-shell/resident-tab-coordinator.js +77 -0
  27. package/dist/app/session-shell/response-copy-helper.js +21 -6
  28. package/dist/app/session-shell/response-copy-protocol.d.ts +1 -1
  29. package/dist/app/session-shell/response-copy-transport.d.ts +16 -6
  30. package/dist/app/session-shell/response-copy-transport.js +69 -17
  31. package/dist/app/session-shell/session-concern.d.ts +22 -0
  32. package/dist/app/session-shell/session-concern.js +29 -0
  33. package/dist/app/session-shell/session-lifecycle.d.ts +29 -0
  34. package/dist/app/session-shell/session-lifecycle.js +49 -0
  35. package/dist/app/session-shell/session-shell-root.d.ts +42 -6
  36. package/dist/app/session-shell/session-shell-root.js +197 -908
  37. package/dist/app/session-shell/session-shell.d.ts +3 -8
  38. package/dist/app/session-shell/session-shell.js +327 -835
  39. package/dist/app/session-shell/session-viewport-controller.d.ts +2 -1
  40. package/dist/app/session-shell/session-viewport-controller.js +41 -38
  41. package/dist/app/session-shell/settings-bindings.d.ts +17 -0
  42. package/dist/app/session-shell/settings-bindings.js +91 -0
  43. package/dist/app/session-shell/shell-editor-factory.d.ts +27 -0
  44. package/dist/app/session-shell/shell-editor-factory.js +105 -0
  45. package/dist/app/session-shell/shell-host.d.ts +6 -0
  46. package/dist/app/session-shell/shell-host.js +34 -7
  47. package/dist/app/session-shell/shell-layout.d.ts +64 -0
  48. package/dist/app/session-shell/shell-layout.js +18 -0
  49. package/dist/app/session-shell/suggestion-surface.d.ts +25 -0
  50. package/dist/app/session-shell/suggestion-surface.js +63 -0
  51. package/dist/app/session-shell/transcript-document.d.ts +78 -0
  52. package/dist/app/session-shell/transcript-document.js +365 -0
  53. package/dist/app/session-shell/viewport-layout.d.ts +31 -0
  54. package/dist/app/session-shell/viewport-layout.js +160 -0
  55. package/dist/app/session-shell/workflow-output.d.ts +33 -0
  56. package/dist/app/session-shell/workflow-output.js +174 -0
  57. package/dist/app/session-shell/workflow-router.d.ts +25 -0
  58. package/dist/app/session-shell/workflow-router.js +39 -0
  59. package/dist/cli/dispatch.d.ts +11 -1
  60. package/dist/cli/dispatch.js +79 -5
  61. package/dist/cli/tabs-request.d.ts +7 -0
  62. package/dist/cli/tabs-request.js +1 -0
  63. package/dist/cli/tabs.d.ts +14 -0
  64. package/dist/cli/tabs.js +151 -0
  65. package/dist/cli/version-stats.js +38 -3
  66. package/dist/composition/owned-settings.d.ts +12 -0
  67. package/dist/composition/owned-settings.js +36 -0
  68. package/dist/composition/owned-ui.d.ts +27 -28
  69. package/dist/composition/owned-ui.js +207 -153
  70. package/dist/composition/reference-selection-options.d.ts +3 -0
  71. package/dist/composition/reference-selection-options.js +16 -0
  72. package/dist/composition/resident-tab-bridge.d.ts +25 -0
  73. package/dist/composition/resident-tab-bridge.js +180 -0
  74. package/dist/composition/session-backend.d.ts +19 -0
  75. package/dist/composition/session-backend.js +1 -0
  76. package/dist/composition/session-runtime-registry.d.ts +20 -0
  77. package/dist/composition/session-runtime-registry.js +85 -0
  78. package/dist/composition/settings-route-host.d.ts +16 -2
  79. package/dist/composition/settings-route-host.js +42 -17
  80. package/dist/composition/settings-search-input.d.ts +9 -0
  81. package/dist/composition/settings-search-input.js +61 -0
  82. package/dist/composition/startup-route.d.ts +32 -0
  83. package/dist/composition/startup-route.js +72 -0
  84. package/dist/composition/utility-tab.d.ts +28 -0
  85. package/dist/composition/utility-tab.js +244 -0
  86. package/dist/contracts/owned-ui/index.d.ts +1 -1
  87. package/dist/contracts/owned-ui/model.d.ts +3 -0
  88. package/dist/contracts/owned-ui/session-backend.d.ts +3 -0
  89. package/dist/contracts/owned-ui/session-workflows.d.ts +11 -4
  90. package/dist/contracts/presentation/index.d.ts +11 -0
  91. package/dist/contracts/presentation/index.js +12 -0
  92. package/dist/features/launch/development-launch.js +6 -0
  93. package/dist/features/launch/index.d.ts +1 -1
  94. package/dist/features/launch/intent.d.ts +3 -1
  95. package/dist/features/launch/intent.js +7 -4
  96. package/dist/features/launch/profile-paths.js +4 -0
  97. package/dist/features/owned-ui/plus-menu-dialog.d.ts +22 -0
  98. package/dist/features/owned-ui/plus-menu-dialog.js +84 -0
  99. package/dist/features/owned-ui/project-trust-dialog.d.ts +1 -1
  100. package/dist/features/owned-ui/project-trust-dialog.js +6 -8
  101. package/dist/features/owned-ui/project-trust-prompt.d.ts +1 -0
  102. package/dist/features/owned-ui/project-trust-prompt.js +7 -3
  103. package/dist/features/owned-ui/reference-document-selection.d.ts +30 -0
  104. package/dist/features/owned-ui/reference-document-selection.js +179 -0
  105. package/dist/features/owned-ui/reference-screen-app.d.ts +6 -1
  106. package/dist/features/owned-ui/reference-screen-app.js +51 -10
  107. package/dist/features/owned-ui/settings-app.d.ts +13 -2
  108. package/dist/features/owned-ui/settings-app.js +136 -97
  109. package/dist/features/owned-ui/settings-search-input.d.ts +29 -0
  110. package/dist/features/owned-ui/settings-search-input.js +1 -0
  111. package/dist/features/prompt-history/index.d.ts +1 -1
  112. package/dist/features/prompt-history/paths.d.ts +2 -1
  113. package/dist/features/prompt-history/paths.js +10 -2
  114. package/dist/features/prompt-history/service.d.ts +5 -0
  115. package/dist/features/prompt-history/service.js +1 -1
  116. package/dist/features/resident-tab/auto-name.d.ts +11 -0
  117. package/dist/features/resident-tab/auto-name.js +44 -0
  118. package/dist/features/resident-tab/index.d.ts +5 -0
  119. package/dist/features/resident-tab/index.js +7 -0
  120. package/dist/features/resident-tab/shortcut-bindings-file.d.ts +8 -0
  121. package/dist/features/resident-tab/shortcut-bindings-file.js +40 -0
  122. package/dist/features/resident-tab/shortcut-declarations.d.ts +13 -0
  123. package/dist/features/resident-tab/shortcut-declarations.js +26 -0
  124. package/dist/features/resident-tab/shortcut-projection.d.ts +29 -0
  125. package/dist/features/resident-tab/shortcut-projection.js +64 -0
  126. package/dist/features/resident-tab/status-deriver.d.ts +10 -0
  127. package/dist/features/resident-tab/status-deriver.js +12 -0
  128. package/dist/foundation/launch-context/index.d.ts +12 -0
  129. package/dist/foundation/launch-context/index.js +26 -0
  130. package/dist/foundation/launch-guardian/exit-watcher.d.ts +14 -0
  131. package/dist/foundation/launch-guardian/exit-watcher.js +94 -0
  132. package/dist/foundation/launch-guardian/main.d.ts +7 -1
  133. package/dist/foundation/launch-guardian/main.js +60 -7
  134. package/dist/foundation/lifecycle/session-repository-context.js +16 -2
  135. package/dist/foundation/process-containment/{native-guardian-containment.d.ts → addon-containment.d.ts} +7 -5
  136. package/dist/foundation/process-containment/addon-containment.js +139 -0
  137. package/dist/foundation/process-containment/addon-process-inspector.d.ts +11 -0
  138. package/dist/foundation/process-containment/addon-process-inspector.js +36 -0
  139. package/dist/foundation/process-containment/addon.d.ts +42 -0
  140. package/dist/foundation/process-containment/addon.js +57 -0
  141. package/dist/foundation/process-containment/artifact.d.ts +1 -1
  142. package/dist/foundation/process-containment/artifact.js +6 -5
  143. package/dist/foundation/process-containment/contracts.d.ts +2 -0
  144. package/dist/foundation/process-containment/index.d.ts +4 -4
  145. package/dist/foundation/process-containment/index.js +3 -3
  146. package/dist/foundation/process-containment/native-process-inspector.d.ts +2 -1
  147. package/dist/foundation/process-containment/native-process-inspector.js +10 -10
  148. package/dist/foundation/release/automatic-update.d.ts +37 -0
  149. package/dist/foundation/release/automatic-update.js +265 -0
  150. package/dist/foundation/release/bootstrap.d.ts +7 -9
  151. package/dist/foundation/release/bootstrap.js +107 -24
  152. package/dist/foundation/release/cohort-state.d.ts +1 -1
  153. package/dist/foundation/release/cohort-state.js +1 -1
  154. package/dist/foundation/release/dependency-certification.js +54 -19
  155. package/dist/foundation/release/early-accent.d.ts +12 -0
  156. package/dist/foundation/release/early-accent.js +59 -0
  157. package/dist/foundation/release/index.d.ts +2 -2
  158. package/dist/foundation/release/index.js +2 -2
  159. package/dist/foundation/release/latest-release.d.ts +24 -2
  160. package/dist/foundation/release/latest-release.js +51 -1
  161. package/dist/foundation/release/progress-palette.generated.d.ts +137 -3
  162. package/dist/foundation/release/progress-palette.generated.js +137 -3
  163. package/dist/foundation/release/release-gc.d.ts +3 -0
  164. package/dist/foundation/release/release-gc.js +59 -8
  165. package/dist/foundation/release/release-store.d.ts +12 -0
  166. package/dist/foundation/release/release-store.js +124 -2
  167. package/dist/foundation/release/update-execution-lease.d.ts +48 -0
  168. package/dist/foundation/release/update-execution-lease.js +161 -0
  169. package/dist/foundation/release/update.d.ts +12 -7
  170. package/dist/foundation/release/update.js +281 -196
  171. package/dist/foundation/resident-tabs/bounded-host-command.d.ts +18 -0
  172. package/dist/foundation/resident-tabs/bounded-host-command.js +39 -0
  173. package/dist/foundation/resident-tabs/bridge-client.d.ts +70 -0
  174. package/dist/foundation/resident-tabs/bridge-client.js +321 -0
  175. package/dist/foundation/resident-tabs/doctor.d.ts +28 -0
  176. package/dist/foundation/resident-tabs/doctor.js +166 -0
  177. package/dist/foundation/resident-tabs/draft-checkpoint.d.ts +27 -0
  178. package/dist/foundation/resident-tabs/draft-checkpoint.js +145 -0
  179. package/dist/foundation/resident-tabs/ensure-terminal-host.d.ts +36 -0
  180. package/dist/foundation/resident-tabs/ensure-terminal-host.js +151 -0
  181. package/dist/foundation/resident-tabs/fault-injection.d.ts +8 -0
  182. package/dist/foundation/resident-tabs/fault-injection.js +26 -0
  183. package/dist/foundation/resident-tabs/fixture-control.d.ts +7 -0
  184. package/dist/foundation/resident-tabs/fixture-control.js +35 -0
  185. package/dist/foundation/resident-tabs/host-entry.d.ts +1 -0
  186. package/dist/foundation/resident-tabs/host-entry.js +17 -0
  187. package/dist/foundation/resident-tabs/index.d.ts +12 -0
  188. package/dist/foundation/resident-tabs/index.js +6 -0
  189. package/dist/foundation/resident-tabs/maintenance.d.ts +39 -0
  190. package/dist/foundation/resident-tabs/maintenance.js +75 -0
  191. package/dist/foundation/resident-tabs/progress-observation-schema.d.ts +34 -0
  192. package/dist/foundation/resident-tabs/progress-observation-schema.js +1 -0
  193. package/dist/foundation/resident-tabs/progress-observation.d.ts +4 -0
  194. package/dist/foundation/resident-tabs/progress-observation.js +150 -0
  195. package/dist/foundation/resident-tabs/prompt-journal.d.ts +63 -0
  196. package/dist/foundation/resident-tabs/prompt-journal.js +213 -0
  197. package/dist/foundation/resident-tabs/protocol.d.ts +12 -0
  198. package/dist/foundation/resident-tabs/protocol.js +195 -0
  199. package/dist/foundation/resident-tabs/recovery.d.ts +26 -0
  200. package/dist/foundation/resident-tabs/recovery.js +205 -0
  201. package/dist/foundation/resident-tabs/release-holds.d.ts +28 -0
  202. package/dist/foundation/resident-tabs/release-holds.js +75 -0
  203. package/dist/foundation/resident-tabs/routes.d.ts +5 -0
  204. package/dist/foundation/resident-tabs/routes.js +5 -0
  205. package/dist/foundation/resident-tabs/routing.d.ts +11 -0
  206. package/dist/foundation/resident-tabs/routing.js +10 -0
  207. package/dist/foundation/resident-tabs/session-sync.d.ts +14 -0
  208. package/dist/foundation/resident-tabs/session-sync.js +37 -0
  209. package/dist/foundation/resident-tabs/settings.d.ts +12 -0
  210. package/dist/foundation/resident-tabs/settings.js +58 -0
  211. package/dist/foundation/resident-tabs/terminal-host-artifact.d.ts +14 -0
  212. package/dist/foundation/resident-tabs/terminal-host-artifact.js +78 -0
  213. package/dist/foundation/resident-tabs/zip-archive.d.ts +9 -0
  214. package/dist/foundation/resident-tabs/zip-archive.js +56 -0
  215. package/dist/foundation/session-writer-lock/index.d.ts +30 -0
  216. package/dist/foundation/session-writer-lock/index.js +203 -0
  217. package/dist/foundation/startup/startup-descriptor.js +2 -2
  218. package/dist/foundation/terminal-cleanup/index.d.ts +1 -1
  219. package/dist/foundation/terminal-cleanup/index.js +1 -1
  220. package/dist/foundation/terminal-cleanup/terminal-reset.d.ts +6 -0
  221. package/dist/foundation/terminal-cleanup/terminal-reset.js +6 -0
  222. package/dist/integrations/pi/components/editor-interaction.d.ts +2 -0
  223. package/dist/integrations/pi/components/modal-frame.d.ts +17 -1
  224. package/dist/integrations/pi/components/modal-frame.js +48 -9
  225. package/dist/integrations/pi/components/models-dialog.js +4 -52
  226. package/dist/integrations/pi/components/owned-editor-ux.d.ts +6 -1
  227. package/dist/integrations/pi/components/owned-editor-ux.js +138 -11
  228. package/dist/integrations/pi/components/resources/builtin-themes.d.ts +4 -4
  229. package/dist/integrations/pi/components/resources/builtin-themes.js +4 -4
  230. package/dist/integrations/pi/components/share-operation-dialog.d.ts +2 -0
  231. package/dist/integrations/pi/components/share-operation-dialog.js +2 -1
  232. package/dist/integrations/pi/components/shell-editor-autocomplete.js +58 -36
  233. package/dist/integrations/pi/components/shell-extension-ui.js +79 -60
  234. package/dist/integrations/pi/components/shell-footer-status.d.ts +1 -1
  235. package/dist/integrations/pi/components/shell-footer-status.js +21 -5
  236. package/dist/integrations/pi/components/shell-hotkey-sections.js +1 -1
  237. package/dist/integrations/pi/components/shell-presenters-info.d.ts +5 -2
  238. package/dist/integrations/pi/components/shell-presenters-info.js +18 -4
  239. package/dist/integrations/pi/components/shell-presenters-transcript.js +4 -1
  240. package/dist/integrations/pi/components/shell-selectors-dialogs.js +5 -1
  241. package/dist/integrations/pi/components/shell-shared-facade.d.ts +12 -1
  242. package/dist/integrations/pi/components/skills-dialog.js +2 -2
  243. package/dist/integrations/pi/components/upstream/adjacent/core/keybindings.d.ts +1 -1
  244. package/dist/integrations/pi/components/upstream/adjacent/core/keybindings.js +17 -4
  245. package/dist/integrations/pi/components/upstream/assets/earendil-image.json +2 -2
  246. package/dist/integrations/pi/components/upstream/components/countdown-timer.d.ts +1 -1
  247. package/dist/integrations/pi/components/upstream/components/earendil-announcement.js +1 -1
  248. package/dist/integrations/pi/components/upstream/components/extension-editor.d.ts +1 -1
  249. package/dist/integrations/pi/components/upstream/components/extension-editor.js +1 -1
  250. package/dist/integrations/pi/components/upstream/components/extension-input.js +1 -1
  251. package/dist/integrations/pi/components/upstream/components/extension-selector.js +1 -1
  252. package/dist/integrations/pi/components/upstream/components/mermaid.js +1 -1
  253. package/dist/integrations/pi/components/upstream/components/owned-editor.d.ts +8 -6
  254. package/dist/integrations/pi/components/upstream/components/owned-editor.js +16 -9
  255. package/dist/integrations/pi/components/upstream/components/pi-logo.js +1 -1
  256. package/dist/integrations/pi/components/upstream/components/scoped-models-selector.d.ts +4 -4
  257. package/dist/integrations/pi/components/upstream/components/scoped-models-selector.js +2 -2
  258. package/dist/integrations/pi/components/upstream/components/session-footer.d.ts +2 -1
  259. package/dist/integrations/pi/components/upstream/components/session-footer.js +31 -25
  260. package/dist/integrations/pi/components/upstream/components/session-selector-search.js +1 -1
  261. package/dist/integrations/pi/components/upstream/components/session-selector.js +8 -7
  262. package/dist/integrations/pi/components/upstream/components/skill-invocation-message.d.ts +1 -1
  263. package/dist/integrations/pi/components/upstream/components/skill-invocation-message.js +1 -1
  264. package/dist/integrations/pi/components/upstream/components/status-indicator.d.ts +2 -2
  265. package/dist/integrations/pi/components/upstream/components/status-indicator.js +3 -3
  266. package/dist/integrations/pi/components/upstream/components/themed-text.d.ts +1 -1
  267. package/dist/integrations/pi/components/upstream/components/themed-text.js +1 -1
  268. package/dist/integrations/pi/components/upstream/components/thinking-selector.d.ts +8 -7
  269. package/dist/integrations/pi/components/upstream/components/thinking-selector.js +10 -9
  270. package/dist/integrations/pi/components/upstream/components/tool-execution.d.ts +2 -6
  271. package/dist/integrations/pi/components/upstream/components/tool-execution.js +103 -101
  272. package/dist/integrations/pi/components/upstream/components/tree-selector.d.ts +9 -9
  273. package/dist/integrations/pi/components/upstream/components/tree-selector.js +13 -21
  274. package/dist/integrations/pi/components/upstream/components/trust-selector.js +1 -1
  275. package/dist/integrations/pi/components/upstream/external-editor.js +1 -1
  276. package/dist/integrations/pi/components/upstream/history/editor-core.d.ts +2 -2
  277. package/dist/integrations/pi/components/upstream/history/editor-core.js +7 -5
  278. package/dist/integrations/pi/components/upstream/history/kill-ring.d.ts +1 -1
  279. package/dist/integrations/pi/components/upstream/history/kill-ring.js +1 -1
  280. package/dist/integrations/pi/components/upstream/history/printable-key.js +1 -1
  281. package/dist/integrations/pi/components/upstream/history/text-helpers.js +1 -1
  282. package/dist/integrations/pi/components/upstream/history/undo-stack.d.ts +1 -1
  283. package/dist/integrations/pi/components/upstream/history/undo-stack.js +1 -1
  284. package/dist/integrations/pi/components/upstream/history/word-navigation.js +1 -1
  285. package/dist/integrations/pi/components/upstream/model-search.d.ts +1 -1
  286. package/dist/integrations/pi/components/upstream/program-status-reporter.d.ts +1 -1
  287. package/dist/integrations/pi/components/upstream/theme/theme-controller.d.ts +1 -1
  288. package/dist/integrations/pi/components/upstream/theme/theme.d.ts +5 -0
  289. package/dist/integrations/pi/components/upstream/theme/theme.js +29 -2
  290. package/dist/integrations/pi/engine/adapter.d.ts +5 -77
  291. package/dist/integrations/pi/engine/adapter.js +95 -394
  292. package/dist/integrations/pi/engine/command-dispatch.d.ts +13 -0
  293. package/dist/integrations/pi/engine/command-dispatch.js +57 -0
  294. package/dist/integrations/pi/engine/host.js +2 -2
  295. package/dist/integrations/pi/engine/offline-settings-port.d.ts +23 -0
  296. package/dist/integrations/pi/engine/offline-settings-port.js +53 -0
  297. package/dist/integrations/pi/engine/pi-settings-metadata.json +14 -2
  298. package/dist/integrations/pi/engine/ports.d.ts +56 -0
  299. package/dist/integrations/pi/engine/ports.js +93 -0
  300. package/dist/integrations/pi/engine/prompt-suggestions.d.ts +1 -0
  301. package/dist/integrations/pi/engine/prompt-suggestions.js +40 -0
  302. package/dist/integrations/pi/engine/resources/changelog.json +4 -4
  303. package/dist/integrations/pi/engine/runtime-integration.js +102 -29
  304. package/dist/integrations/pi/engine/session-runtime.d.ts +0 -6
  305. package/dist/integrations/pi/engine/session-runtime.js +13 -5
  306. package/dist/integrations/pi/engine/session-selection.d.ts +3 -0
  307. package/dist/integrations/pi/engine/session-selection.js +45 -9
  308. package/dist/integrations/pi/engine/settings-bridge.d.ts +5 -0
  309. package/dist/integrations/pi/engine/settings-bridge.js +15 -0
  310. package/dist/integrations/pi/engine/settings-port.js +11 -15
  311. package/dist/integrations/pi/engine/view-state.d.ts +42 -0
  312. package/dist/integrations/pi/engine/view-state.js +126 -0
  313. package/dist/integrations/pi/engine/workflow-contexts.js +10 -1
  314. package/dist/integrations/pi/engine/workflow-runner.js +74 -5
  315. package/dist/integrations/pi/engine/workflow-support.d.ts +12 -0
  316. package/dist/integrations/pi/engine/workflow-support.js +36 -0
  317. package/dist/integrations/pi/engine/workflows.d.ts +3 -1
  318. package/dist/integrations/pi/engine/workflows.js +1 -0
  319. package/dist/integrations/pi/startup-public.js +257 -310
  320. package/dist/integrations/pi/startup-public.manifest.json +564 -440
  321. package/dist/integrations/pi/tui-runtime/adapter.d.ts +6 -0
  322. package/dist/integrations/pi/tui-runtime/adapter.js +32 -1
  323. package/dist/integrations/pi/tui-runtime/contracts.d.ts +5 -0
  324. package/dist/integrations/pi/tui-runtime/damage-aware-terminal.d.ts +12 -1
  325. package/dist/integrations/pi/tui-runtime/damage-aware-terminal.js +31 -2
  326. package/dist/native/darwin-arm64/manifest.json +10 -7
  327. package/dist/native/darwin-arm64/process-guardian.node +0 -0
  328. package/dist/native/darwin-arm64/terminal-host-THIRD-PARTY-NOTICES.txt +10500 -0
  329. package/dist/native/darwin-arm64/terminal-host.manifest.json +46 -0
  330. package/dist/native/darwin-arm64/terminal-host.node +0 -0
  331. package/dist/native/darwin-x64/manifest.json +23 -0
  332. package/dist/native/darwin-x64/process-guardian.node +0 -0
  333. package/dist/native/darwin-x64/terminal-host-THIRD-PARTY-NOTICES.txt +10737 -0
  334. package/dist/native/darwin-x64/terminal-host.manifest.json +46 -0
  335. package/dist/native/darwin-x64/terminal-host.node +0 -0
  336. package/dist/native/linux-x64/manifest.json +10 -7
  337. package/dist/native/linux-x64/process-guardian.node +0 -0
  338. package/dist/native/linux-x64/terminal-host-THIRD-PARTY-NOTICES.txt +11226 -0
  339. package/dist/native/linux-x64/terminal-host.manifest.json +46 -0
  340. package/dist/native/linux-x64/terminal-host.node +0 -0
  341. package/dist/native/win32-x64/manifest.json +10 -7
  342. package/dist/native/win32-x64/process-guardian.node +0 -0
  343. package/dist/native/win32-x64/terminal-host-THIRD-PARTY-NOTICES.txt +10757 -0
  344. package/dist/native/win32-x64/terminal-host.manifest.json +46 -0
  345. package/dist/native/win32-x64/terminal-host.node +0 -0
  346. package/dist/product-identity.d.ts +3 -3
  347. package/dist/product-identity.js +4 -4
  348. package/dist/product-identity.json +16 -2
  349. package/dist/runtime-payload-inventory.json +6330 -6677
  350. package/dist/ui/apps/host.d.ts +2 -0
  351. package/dist/ui/apps/host.js +7 -1
  352. package/dist/ui/components/dialog-panel.d.ts +17 -8
  353. package/dist/ui/components/dialog-panel.js +117 -41
  354. package/dist/ui/components/index.d.ts +5 -5
  355. package/dist/ui/components/index.js +4 -4
  356. package/dist/ui/components/line-input.d.ts +4 -1
  357. package/dist/ui/components/line-input.js +3 -1
  358. package/dist/ui/components/prompt-input.d.ts +11 -8
  359. package/dist/ui/components/prompt-input.js +15 -13
  360. package/dist/ui/components/scrollbar.d.ts +1 -1
  361. package/dist/ui/components/scrollbar.js +1 -1
  362. package/dist/ui/components/selection-copy.d.ts +3 -3
  363. package/dist/ui/components/selection-copy.js +16 -1
  364. package/dist/ui/components/spans.js +2 -2
  365. package/dist/ui/components/submitted-prompt.d.ts +9 -6
  366. package/dist/ui/components/submitted-prompt.js +20 -12
  367. package/dist/ui/components/surface.js +4 -2
  368. package/dist/ui/components/text-selection.d.ts +1 -2
  369. package/dist/ui/components/text-selection.js +5 -2
  370. package/dist/ui/components/text.d.ts +3 -6
  371. package/dist/ui/components/text.js +6 -8
  372. package/dist/ui/components/transcript-viewport.d.ts +9 -2
  373. package/dist/ui/components/transcript-viewport.js +179 -58
  374. package/dist/ui/settings/declarations.d.ts +90 -16
  375. package/dist/ui/settings/declarations.js +67 -14
  376. package/dist/ui/settings/early-accent.d.ts +81 -0
  377. package/dist/ui/settings/early-accent.js +50 -0
  378. package/dist/ui/settings/index.d.ts +4 -2
  379. package/dist/ui/settings/index.js +2 -1
  380. package/dist/ui/settings/manager.d.ts +16 -3
  381. package/dist/ui/settings/manager.js +122 -33
  382. package/dist/ui/settings/migrations.d.ts +6 -0
  383. package/dist/ui/settings/migrations.js +73 -0
  384. package/dist/ui/settings/profile-document.d.ts +26 -0
  385. package/dist/ui/settings/profile-document.js +164 -0
  386. package/dist/ui/settings/progress-palette.generated.d.ts +139 -0
  387. package/dist/ui/settings/progress-palette.generated.js +139 -0
  388. package/dist/ui/settings/sections.d.ts +4 -0
  389. package/dist/ui/settings/sections.js +9 -3
  390. package/docs/architecture/boundaries.md +24 -9
  391. package/docs/architecture/evidence/resident-tabs/linux-x64.md +37 -0
  392. package/docs/architecture/evidence/resident-tabs/macos-arm64.md +36 -0
  393. package/docs/architecture/evidence/resident-tabs/macos-x64.md +35 -0
  394. package/docs/architecture/evidence/resident-tabs/windows-x64.md +36 -0
  395. package/docs/architecture/internal-naming.md +3 -1
  396. package/docs/architecture/process-guardian-provenance.md +18 -10
  397. package/docs/architecture/project-structure.md +8 -0
  398. package/docs/architecture/resident-tabs-requirements.md +18 -0
  399. package/docs/architecture/resident-tabs.md +649 -0
  400. package/docs/architecture/response-copy-delivery.md +1 -1
  401. package/docs/architecture/terminal-host-proof-gate.md +2 -0
  402. package/docs/architecture/terminal-host-provenance.md +16 -4
  403. package/docs/architecture/tool-image-presentation.md +2 -1
  404. package/docs/architecture/toolchain.md +11 -9
  405. package/docs/ci-release-runbook.md +14 -7
  406. package/docs/features/launch-profiles.md +11 -8
  407. package/docs/features/prompt-history.md +41 -20
  408. package/docs/manual-resident-tabs-acceptance.md +51 -0
  409. package/docs/openspec-archive-automation.md +49 -22
  410. package/docs/validation.md +49 -9
  411. package/package.json +19 -6
  412. package/dist/foundation/process-containment/darwin-process-inspector.d.ts +0 -5
  413. package/dist/foundation/process-containment/darwin-process-inspector.js +0 -7
  414. package/dist/foundation/process-containment/native-guardian-containment.js +0 -152
  415. package/dist/foundation/process-containment/windows-process-inspector.d.ts +0 -19
  416. package/dist/foundation/process-containment/windows-process-inspector.js +0 -56
  417. package/dist/native/darwin-arm64/process-guardian +0 -0
  418. package/dist/native/linux-x64/process-guardian +0 -0
  419. package/dist/native/win32-x64/process-guardian.exe +0 -0
@@ -1,4 +1,5 @@
1
1
  import { EMERGENCY_TERMINAL_RESET } from "../../foundation/terminal-cleanup/terminal-reset.js";
2
+ import { preTrustPalette, preTrustTerminalAppearance, preTrustTerminalColorMode, readPreTrustAccent } from "../../ui/settings/early-accent.js";
2
3
  const ENTER_ALTERNATE_SCREEN = "\u001b[?1049h";
3
4
  const HIDE_CURSOR = "\u001b[?25l";
4
5
  const CLEAR_HOME = "\u001b[2J\u001b[H";
@@ -34,8 +35,8 @@ export function createConsoleProjectTrustPrompt(options = {}) {
34
35
  if (choices.length === 0)
35
36
  throw new Error("project trust choices are unavailable");
36
37
  const comparison = options.presentation === "comparison";
37
- const renderBareDialog = comparison
38
- ? undefined : (await import("./project-trust-dialog.js")).renderProjectTrustDialog;
38
+ const renderBareDialog = comparison ? undefined : (await import("./project-trust-dialog.js")).renderProjectTrustDialog;
39
+ const palette = comparison ? null : trustPaletteOptions(options.environment ?? process.env);
39
40
  const wasRaw = input.isRaw === true;
40
41
  let selected = 0;
41
42
  let restored = false;
@@ -66,7 +67,7 @@ export function createConsoleProjectTrustPrompt(options = {}) {
66
67
  const render = () => {
67
68
  const width = Math.max(renderBareDialog ? 1 : 20, output.columns ?? 80);
68
69
  const rows = Math.max(1, output.rows ?? 24);
69
- const lines = (renderBareDialog?.(cwd, choices.map(choice => choice.label), selected, width, rows) ?? [
70
+ const lines = (renderBareDialog?.(cwd, choices.map(choice => choice.label), selected, width, rows, palette.accent, palette.border) ?? [
70
71
  `${BOLD}${ACCENT}Trust project folder?${RESET_FG}${RESET_BOLD}`,
71
72
  cwd,
72
73
  "",
@@ -179,6 +180,9 @@ export function createConsoleProjectTrustPrompt(options = {}) {
179
180
  }
180
181
  };
181
182
  }
183
+ function trustPaletteOptions(environment) {
184
+ return preTrustPalette(readPreTrustAccent(environment), preTrustTerminalAppearance(environment), preTrustTerminalColorMode(environment));
185
+ }
182
186
  function optionRow(label, selected) {
183
187
  return selected
184
188
  ? `${ACCENT}→ ${label}${RESET_FG}`
@@ -0,0 +1,30 @@
1
+ import { type PaneMouseEvent, type UiTheme } from "../../ui/components/index.js";
2
+ export interface ReferenceDocumentSelectionOptions {
3
+ readonly copyOnSelect: () => boolean;
4
+ readonly copyText: (text: string) => boolean | void;
5
+ }
6
+ interface ReferenceSelectionFrame {
7
+ readonly bodyRowStart: number;
8
+ readonly contentWidth: number;
9
+ readonly documentRows: readonly string[];
10
+ readonly visibleDocumentRows: readonly (number | undefined)[];
11
+ }
12
+ /** Selection state for an opted-in read-only reference document. */
13
+ export declare class ReferenceDocumentSelection {
14
+ #private;
15
+ constructor(options: ReferenceDocumentSelectionOptions);
16
+ get selecting(): boolean;
17
+ get hasSelection(): boolean;
18
+ updateFrame(frame: ReferenceSelectionFrame): void;
19
+ paintVisibleRow(visibleRow: number, line: string, theme: UiTheme): string;
20
+ handleInput(data: string): {
21
+ readonly consumed: boolean;
22
+ readonly cleared: boolean;
23
+ };
24
+ handleMouse(event: PaneMouseEvent, requestRender?: () => void): {
25
+ readonly consumed: boolean;
26
+ readonly changed: boolean;
27
+ };
28
+ clear(): void;
29
+ }
30
+ export {};
@@ -0,0 +1,179 @@
1
+ import { COPY_ACKNOWLEDGEMENT_DURATION_MS, copyAcknowledgementText, displayWidth, extendTextSelection, orderedTextSelection, overlaySpan, paintTextSelection, padToWidth, pressTextSelection, releaseTextSelection, stripAnsi, textSelectionLineExtendColumn, textSelectionPointAt, textSelectionText, truncateToWidth, usefulTextLineContent, } from "../../ui/components/index.js";
2
+ const INTERRUPT = "\u0003";
3
+ class CopyAcknowledgement {
4
+ #message;
5
+ #timer;
6
+ paint(line, finalRow, width, theme) {
7
+ if (!finalRow || this.#message === undefined || width === 0)
8
+ return line;
9
+ const message = truncateToWidth(theme.fg("accent", this.#message), width);
10
+ return overlaySpan(line, width - displayWidth(message), width, message, { inheritStartStyle: true });
11
+ }
12
+ show(characters, requestRender) {
13
+ this.#message = copyAcknowledgementText(characters);
14
+ this.#clearTimer();
15
+ this.#timer = setTimeout(() => {
16
+ this.#timer = undefined;
17
+ this.#message = undefined;
18
+ requestRender();
19
+ }, COPY_ACKNOWLEDGEMENT_DURATION_MS);
20
+ this.#timer.unref?.();
21
+ requestRender();
22
+ }
23
+ clear() {
24
+ this.#clearTimer();
25
+ this.#message = undefined;
26
+ }
27
+ #clearTimer() {
28
+ if (this.#timer !== undefined)
29
+ clearTimeout(this.#timer);
30
+ this.#timer = undefined;
31
+ }
32
+ }
33
+ /** Selection state for an opted-in read-only reference document. */
34
+ export class ReferenceDocumentSelection {
35
+ #copyOnSelect;
36
+ #copyText;
37
+ #selection;
38
+ #click;
39
+ #frame;
40
+ #acknowledgement = new CopyAcknowledgement();
41
+ constructor(options) {
42
+ this.#copyOnSelect = options.copyOnSelect;
43
+ this.#copyText = options.copyText;
44
+ }
45
+ get selecting() {
46
+ return this.#selection?.selecting === true;
47
+ }
48
+ get hasSelection() {
49
+ return orderedTextSelection(this.#selection) !== undefined;
50
+ }
51
+ updateFrame(frame) {
52
+ const previous = this.#frame;
53
+ if (this.#selection !== undefined && previous !== undefined && !selectionStillMaps(this.#selection, previous.documentRows, frame.documentRows)) {
54
+ this.#selection = undefined;
55
+ this.#click = undefined;
56
+ }
57
+ this.#frame = frame;
58
+ }
59
+ paintVisibleRow(visibleRow, line, theme) {
60
+ const frame = this.#frame;
61
+ const documentRow = frame?.visibleDocumentRows[visibleRow];
62
+ const ordered = orderedTextSelection(this.#selection);
63
+ const width = frame?.contentWidth ?? 0;
64
+ let painted = padToWidth(line, width);
65
+ if (documentRow !== undefined && ordered !== undefined
66
+ && documentRow >= ordered.start.line && documentRow <= ordered.end.line) {
67
+ const from = documentRow === ordered.start.line ? ordered.start.column : 0;
68
+ const to = documentRow === ordered.end.line ? ordered.end.column : width;
69
+ painted = paintTextSelection(painted, Math.max(0, from), Math.min(width, to));
70
+ }
71
+ return this.#acknowledgement.paint(painted, visibleRow === (frame?.visibleDocumentRows.length ?? 0) - 1, width, theme);
72
+ }
73
+ handleInput(data) {
74
+ if (data === INTERRUPT && this.hasSelection) {
75
+ this.#submitSelection();
76
+ this.#selection = undefined;
77
+ this.#click = undefined;
78
+ return { consumed: true, cleared: true };
79
+ }
80
+ if (this.#selection === undefined)
81
+ return { consumed: false, cleared: false };
82
+ this.#selection = undefined;
83
+ this.#click = undefined;
84
+ return { consumed: false, cleared: true };
85
+ }
86
+ handleMouse(event, requestRender) {
87
+ const frame = this.#frame;
88
+ if (frame === undefined)
89
+ return { consumed: false, changed: false };
90
+ if (event.kind === "motion" && this.selecting) {
91
+ const row = documentRowAt(frame, event.row, true);
92
+ if (row === undefined)
93
+ return { consumed: true, changed: false };
94
+ this.#extend(row, event.column);
95
+ return { consumed: true, changed: true };
96
+ }
97
+ if (event.kind === "release" && this.selecting) {
98
+ this.#selection = releaseTextSelection(this.#selection);
99
+ const copiedCharacters = this.hasSelection && this.#copyOnSelect() ? this.#submitSelection() : undefined;
100
+ if (copiedCharacters !== undefined && requestRender !== undefined) {
101
+ this.#acknowledgement.show(copiedCharacters, requestRender);
102
+ }
103
+ return { consumed: true, changed: true };
104
+ }
105
+ if (event.kind !== "press" || event.button !== 0)
106
+ return { consumed: false, changed: false };
107
+ const row = documentRowAt(frame, event.row, false);
108
+ if (row === undefined || event.column < 1 || event.column > frame.contentWidth) {
109
+ const changed = this.#selection !== undefined;
110
+ this.#selection = undefined;
111
+ this.#click = undefined;
112
+ return { consumed: false, changed };
113
+ }
114
+ const source = frame.documentRows[row] ?? "";
115
+ const pressed = pressTextSelection({
116
+ line: row,
117
+ column: event.column,
118
+ contentWidth: frame.contentWidth,
119
+ lineText: source,
120
+ lineContent: usefulTextLineContent(source),
121
+ ...(this.#click === undefined ? {} : { previousClick: this.#click }),
122
+ });
123
+ this.#selection = pressed.selection;
124
+ this.#click = pressed.click;
125
+ return { consumed: true, changed: true };
126
+ }
127
+ clear() {
128
+ this.#selection = undefined;
129
+ this.#click = undefined;
130
+ this.#frame = undefined;
131
+ this.#acknowledgement.clear();
132
+ }
133
+ #extend(row, column) {
134
+ const selection = this.#selection;
135
+ const frame = this.#frame;
136
+ if (selection?.selecting !== true || frame === undefined)
137
+ return;
138
+ const targetColumn = selection.fullRow
139
+ ? textSelectionLineExtendColumn(selection, row, frame.contentWidth)
140
+ : Math.max(1, Math.min(column, frame.contentWidth));
141
+ this.#selection = extendTextSelection(selection, selection.fullRow
142
+ ? { line: row, column: targetColumn }
143
+ : textSelectionPointAt(row, targetColumn, frame.documentRows[row] ?? ""));
144
+ }
145
+ #submitSelection() {
146
+ const frame = this.#frame;
147
+ const ordered = orderedTextSelection(this.#selection);
148
+ if (frame === undefined || ordered === undefined)
149
+ return undefined;
150
+ const text = textSelectionText(ordered, frame.documentRows, line => usefulTextLineContent(frame.documentRows[line] ?? "")).trim();
151
+ if (text.length === 0 || this.#copyText(text) === false)
152
+ return undefined;
153
+ return text.length;
154
+ }
155
+ }
156
+ function documentRowAt(frame, screenRow, clampToDocument) {
157
+ const visible = frame.visibleDocumentRows;
158
+ let index = screenRow - frame.bodyRowStart;
159
+ if (!clampToDocument)
160
+ return visible[index];
161
+ index = Math.max(0, Math.min(index, visible.length - 1));
162
+ if (visible[index] !== undefined)
163
+ return visible[index];
164
+ const defined = visible.flatMap(row => row === undefined ? [] : [row]);
165
+ if (defined.length === 0)
166
+ return undefined;
167
+ return screenRow < frame.bodyRowStart ? defined[0] : defined.at(-1);
168
+ }
169
+ function selectionStillMaps(selection, previous, next) {
170
+ const first = Math.min(selection.anchor.line, selection.head.line);
171
+ const last = Math.max(selection.anchor.line, selection.head.line);
172
+ if (last >= previous.length || last >= next.length)
173
+ return false;
174
+ for (let line = first; line <= last; line += 1) {
175
+ if (stripAnsi(previous[line] ?? "") !== stripAnsi(next[line] ?? ""))
176
+ return false;
177
+ }
178
+ return true;
179
+ }
@@ -1,4 +1,5 @@
1
1
  import type { OwnedUiViewportSettings } from "../../contracts/owned-ui/index.js";
2
+ import { type ReferenceDocumentSelectionOptions } from "./reference-document-selection.js";
2
3
  import type { AppHostServices, UiApp } from "../../ui/apps/index.js";
3
4
  import { ShortcutRegistry, type PaneInputResult, type PaneMouseEvent, type PaneRect } from "../../ui/components/index.js";
4
5
  type Action = "up" | "down" | "page-up" | "page-down" | "first" | "last" | "close";
@@ -24,6 +25,10 @@ export interface ReferenceScreenOptions {
24
25
  readonly document: ReferenceDocumentProvider;
25
26
  /** The reader's scroll settings, read on every frame so a live change is honored. */
26
27
  readonly scrollSettings: () => OwnedUiViewportSettings;
28
+ /** The screen is a resident tab, such as the Changelog tab: it offers no screen-level close. */
29
+ readonly pinned?: boolean;
30
+ /** Enables owned text selection for document routes that explicitly opt in. */
31
+ readonly selection?: ReferenceDocumentSelectionOptions;
27
32
  }
28
33
  /**
29
34
  * Presents one read-only document full screen between two accent rules: the bold
@@ -40,6 +45,6 @@ export declare class ReferenceScreenApp implements UiApp {
40
45
  onClose(_host: AppHostServices): void;
41
46
  render(rect: PaneRect, host: AppHostServices): readonly string[];
42
47
  onInput(data: string, host: AppHostServices): PaneInputResult;
43
- onMouse(event: PaneMouseEvent, _host: AppHostServices): PaneInputResult;
48
+ onMouse(event: PaneMouseEvent, host: AppHostServices): PaneInputResult;
44
49
  }
45
50
  export {};
@@ -1,3 +1,4 @@
1
+ import { ReferenceDocumentSelection } from "./reference-document-selection.js";
1
2
  import { DIALOG_CLOSE_SHORTCUT_HINT } from "../../contracts/presentation/index.js";
2
3
  import { GLOBAL_SCOPE, PLAIN_THEME, RAIL_COLUMNS, ShortcutRegistry, ScrollbarRails, assertNoShortcutConflicts, displayWidth, layoutList, padToWidth, renderGroupHeader, renderShortcutHintsWithClose, scrollForTrackPage, scrollbarGeometry, scrollbarPresentation, scrollbarWheelRows, truncateToWidth, withScrollbarRail, } from "../../ui/components/index.js";
3
4
  const SCOPE = "reference-screen";
@@ -48,6 +49,8 @@ export class ReferenceScreenApp {
48
49
  #title;
49
50
  #document;
50
51
  #scrollSettings;
52
+ #pinned;
53
+ #selection;
51
54
  #scroll = 0;
52
55
  #interruptArmed = false;
53
56
  #failure = null;
@@ -57,7 +60,6 @@ export class ReferenceScreenApp {
57
60
  #rails = new ScrollbarRails();
58
61
  // Rationale: the rail as drawn in the last frame, or null when nothing can be pointed at.
59
62
  #railFrame = null;
60
- #bodyHeight = 0;
61
63
  // Invariant: a scroll lights the rail until this time; the timer repaints once it has passed.
62
64
  #activeUntil = 0;
63
65
  #activityTimer;
@@ -67,6 +69,8 @@ export class ReferenceScreenApp {
67
69
  this.#title = options.title;
68
70
  this.#document = options.document;
69
71
  this.#scrollSettings = options.scrollSettings;
72
+ this.#pinned = options.pinned === true;
73
+ this.#selection = options.selection === undefined ? undefined : new ReferenceDocumentSelection(options.selection);
70
74
  }
71
75
  onActivate(host) {
72
76
  const ready = this.#document.ready;
@@ -83,6 +87,7 @@ export class ReferenceScreenApp {
83
87
  onClose(_host) {
84
88
  this.#clearActivityTimer();
85
89
  this.#rails.clear();
90
+ this.#selection?.clear();
86
91
  }
87
92
  render(rect, host) {
88
93
  const theme = host.theme ?? PLAIN_THEME;
@@ -91,9 +96,9 @@ export class ReferenceScreenApp {
91
96
  const reservesRail = settings.scrollbarAppearance !== "hidden";
92
97
  const contentWidth = reservesRail ? Math.max(0, rect.width - RAIL_COLUMNS) : rect.width;
93
98
  const bodyHeight = Math.max(0, rect.height - HEADER_ROWS - FOOTER_ROWS);
94
- this.#bodyHeight = bodyHeight;
95
99
  const content = this.#content(contentWidth, theme);
96
100
  const body = [];
101
+ const visibleDocumentRows = [];
97
102
  let contentLength;
98
103
  let viewportLength = bodyHeight;
99
104
  if (content.kind === "sections") {
@@ -113,10 +118,22 @@ export class ReferenceScreenApp {
113
118
  for (let index = this.#scroll; index < this.#scroll + bodyHeight; index++) {
114
119
  const row = content.rows[index] ?? "";
115
120
  body.push(displayWidth(row) > contentWidth ? truncateToWidth(row, contentWidth) : row);
121
+ visibleDocumentRows.push(index < content.rows.length ? index : undefined);
116
122
  }
117
123
  }
118
124
  while (body.length < bodyHeight)
119
125
  body.push("");
126
+ while (visibleDocumentRows.length < bodyHeight)
127
+ visibleDocumentRows.push(undefined);
128
+ this.#selection?.updateFrame({
129
+ bodyRowStart: HEADER_ROWS + 1,
130
+ contentWidth,
131
+ documentRows: content.kind === "flat" ? content.rows : [],
132
+ visibleDocumentRows,
133
+ });
134
+ const paintedBody = this.#selection === undefined
135
+ ? body
136
+ : body.map((row, index) => this.#selection.paintVisibleRow(index, row, theme));
120
137
  const now = Date.now();
121
138
  // Rationale: every way of scrolling ends in this frame, so a moved document is noticed here
122
139
  // once rather than at each wheel, drag, and key branch.
@@ -136,10 +153,10 @@ export class ReferenceScreenApp {
136
153
  this.#railFrame = reservesRail && geometry !== null
137
154
  ? { rail: { key: this.id, column: rect.width, rowStart: HEADER_ROWS, trackHeight: geometry.trackHeight }, geometry, page: viewportLength }
138
155
  : null;
139
- const withRail = withScrollbarRail(body.slice(0, bodyHeight), geometry, contentWidth, theme, { presentation });
156
+ const withRail = withScrollbarRail(paintedBody.slice(0, bodyHeight), geometry, contentWidth, theme, { presentation });
140
157
  const hint = this.#interruptArmed
141
158
  ? theme.fg("dim", " press ctrl+c again to exit a1")
142
- : renderShortcutHintsWithClose(REFERENCE_SCREEN_SHORTCUTS.hintEntries(SCOPE), theme, rect.width, 1);
159
+ : renderShortcutHintsWithClose(this.#hintEntries(), theme, rect.width, 1);
143
160
  // Compatibility: the v2 reference screen frames its document between two border-coloured rules.
144
161
  const rule = theme.fg("border", "─".repeat(rect.width));
145
162
  // Invariant: dialog chrome shares the title's one-cell inset; document content keeps its own layout.
@@ -148,12 +165,21 @@ export class ReferenceScreenApp {
148
165
  return frame.slice(0, rect.height).concat(Array(Math.max(0, rect.height - frame.length)).fill(""));
149
166
  }
150
167
  onInput(data, host) {
168
+ const explicitCopy = data === "\u0003" ? this.#selection?.handleInput(data) : undefined;
169
+ if (explicitCopy?.consumed === true)
170
+ return { consumed: true };
151
171
  const action = REFERENCE_SCREEN_SHORTCUTS.resolve(KEYS[data] ?? data, SCOPE);
152
- if (action === null)
172
+ if (action === null) {
173
+ const cleared = explicitCopy?.cleared ?? (this.#selection?.handleInput(data).cleared === true);
174
+ if (cleared)
175
+ host.requestRender();
153
176
  return { consumed: false };
177
+ }
154
178
  switch (action) {
155
179
  case "close":
156
- host.close();
180
+ this.#selection?.handleInput(data);
181
+ if (!this.#pinned)
182
+ host.close();
157
183
  return { consumed: true };
158
184
  case "up":
159
185
  this.#scrollBy(-1);
@@ -162,10 +188,10 @@ export class ReferenceScreenApp {
162
188
  this.#scrollBy(1);
163
189
  return { consumed: true };
164
190
  case "page-up":
165
- this.#scrollBy(-Math.max(1, this.#bodyHeight));
191
+ this.#scrollBy(-Math.max(1, host.getSize().height - HEADER_ROWS - FOOTER_ROWS));
166
192
  return { consumed: true };
167
193
  case "page-down":
168
- this.#scrollBy(Math.max(1, this.#bodyHeight));
194
+ this.#scrollBy(Math.max(1, host.getSize().height - HEADER_ROWS - FOOTER_ROWS));
169
195
  return { consumed: true };
170
196
  case "first":
171
197
  this.#scroll = 0;
@@ -175,17 +201,25 @@ export class ReferenceScreenApp {
175
201
  return { consumed: true };
176
202
  }
177
203
  }
178
- onMouse(event, _host) {
204
+ onMouse(event, host) {
179
205
  if (event.kind === "wheel-up" || event.kind === "wheel-down") {
180
206
  // Invariant: the whole screen owns wheel scrolling; it must not depend on the pointer's row.
181
207
  const distance = scrollbarWheelRows(this.#scrollSettings().scrollbarSpeed);
182
208
  this.#scrollBy(event.kind === "wheel-down" ? distance : -distance);
183
209
  return { consumed: true };
184
210
  }
211
+ if (this.#selection?.selecting === true) {
212
+ const selection = this.#selection.handleMouse(event, () => host.requestRender());
213
+ if (selection.consumed)
214
+ return { consumed: true, render: selection.changed };
215
+ }
185
216
  const rail = this.#railPointer(event);
186
217
  if (rail.owned)
187
218
  return { consumed: true };
188
- return { consumed: event.kind !== "motion", render: rail.changed };
219
+ const selection = this.#selection?.handleMouse(event, () => host.requestRender());
220
+ if (selection?.consumed === true)
221
+ return { consumed: true, render: selection.changed || rail.changed };
222
+ return { consumed: event.kind !== "motion", render: selection?.changed === true || rail.changed };
189
223
  }
190
224
  // Rationale: the rail takes its share of a pointer report first: hover, a thumb drag, or a
191
225
  // track page. Owned means the document must not see the report; changed means the rail looks different.
@@ -216,6 +250,13 @@ export class ReferenceScreenApp {
216
250
  }
217
251
  return { owned: true, changed: true };
218
252
  }
253
+ // Invariant: a pinned screen is its tab and `Esc` does not close it, so it shows no close hint.
254
+ #hintEntries() {
255
+ const entries = REFERENCE_SCREEN_SHORTCUTS.hintEntries(SCOPE);
256
+ if (!this.#pinned)
257
+ return entries;
258
+ return entries.filter(entry => entry.key !== DIALOG_CLOSE_SHORTCUT_HINT.key || entry.action !== DIALOG_CLOSE_SHORTCUT_HINT.action);
259
+ }
219
260
  // Invariant: the title is the first document row, as in v2, so it scrolls with the document.
220
261
  #content(width, theme) {
221
262
  // Compatibility: one leading space, so the title lines up with the padded Markdown rows as in v2.
@@ -1,8 +1,9 @@
1
1
  import type { AppHostServices, UiApp } from "../../ui/apps/index.js";
2
2
  import { ShortcutRegistry, type PaneInputResult, type PaneMouseEvent, type PaneRect } from "../../ui/components/index.js";
3
3
  import type { OwnedSettingsManager } from "../../ui/settings/index.js";
4
+ import type { SettingsSearchInputFactory } from "./settings-search-input.js";
4
5
  export { SETTINGS_APP_ID, SETTINGS_ROUTE } from "./settings-route.js";
5
- type Action = "move-up" | "move-down" | "block-up" | "block-down" | "first" | "last" | "page-up" | "page-down" | "previous-value" | "next-value" | "activate" | "open-filter" | "close" | "undo" | "part-previous" | "part-next" | "part-change";
6
+ type Action = "move-up" | "move-down" | "block-up" | "block-down" | "first" | "last" | "page-up" | "page-down" | "previous-value" | "next-value" | "activate" | "edit-filter" | "close" | "undo" | "part-previous" | "part-next" | "part-change";
6
7
  export declare const SETTINGS_SHORTCUTS: ShortcutRegistry<Action>;
7
8
  /**
8
9
  * The settings screen. Rows, sticky headers, scrolling, and the keymap come from
@@ -12,7 +13,17 @@ export declare const SETTINGS_SHORTCUTS: ShortcutRegistry<Action>;
12
13
  export declare class SettingsApp implements UiApp {
13
14
  #private;
14
15
  readonly id = "settings";
15
- constructor(session: OwnedSettingsManager);
16
+ /**
17
+ * `pinned` presents the screen as a resident Settings tab, which offers no screen-level close;
18
+ * `configurePlusMenu` opens the tab bar's Plus Menu dialog in place of this screen's own.
19
+ */
20
+ constructor(session: OwnedSettingsManager, options: {
21
+ readonly pinned?: boolean;
22
+ readonly searchInputFactory: SettingsSearchInputFactory;
23
+ readonly copyText?: (text: string) => void;
24
+ readonly configurePlusMenu?: (() => boolean) | null;
25
+ readonly dialogPanel?: (text: string) => string;
26
+ });
16
27
  onActivate(host: AppHostServices): void;
17
28
  onClose(_host: AppHostServices): void;
18
29
  render(rect: PaneRect, host: AppHostServices): readonly string[];