@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
@@ -20,6 +20,8 @@ export interface AppHostOptions {
20
20
  readonly closeOnInterrupt: boolean;
21
21
  /** Colours handed to every presented app. Absent renders plain text. */
22
22
  readonly theme?: UiTheme;
23
+ /** Lets a focused app claim the first interrupt for an editor selection before host close/exit policy. */
24
+ readonly appInputBeforeInterrupt?: boolean;
23
25
  }
24
26
  /**
25
27
  * Presents at most one app. An opted-in interrupt closes at the host boundary;
@@ -15,6 +15,7 @@ export class UiAppHost {
15
15
  #surface;
16
16
  #closeOnInterrupt;
17
17
  #theme;
18
+ #appInputBeforeInterrupt;
18
19
  // Invariant: the first interrupt timestamp is null whenever the chord is disarmed.
19
20
  #interruptArmedAt = null;
20
21
  #renderedInterruptArmed;
@@ -25,6 +26,7 @@ export class UiAppHost {
25
26
  this.#surface = options.surface;
26
27
  this.#closeOnInterrupt = options.closeOnInterrupt;
27
28
  this.#theme = options.theme;
29
+ this.#appInputBeforeInterrupt = options.appInputBeforeInterrupt === true;
28
30
  }
29
31
  get presented() {
30
32
  return this.#app;
@@ -71,7 +73,7 @@ export class UiAppHost {
71
73
  const app = this.#app;
72
74
  if (app === null)
73
75
  return { consumed: false };
74
- if (data === INTERRUPT && this.#closeOnInterrupt) {
76
+ if (data === INTERRUPT && this.#closeOnInterrupt && !this.#appInputBeforeInterrupt) {
75
77
  this.close();
76
78
  return { consumed: true, render: true };
77
79
  }
@@ -83,6 +85,10 @@ export class UiAppHost {
83
85
  this.render();
84
86
  return result;
85
87
  }
88
+ if (data === INTERRUPT && this.#closeOnInterrupt) {
89
+ this.close();
90
+ return { consumed: true, render: true };
91
+ }
86
92
  if (data === INTERRUPT)
87
93
  return this.#interrupt();
88
94
  return { consumed: false };
@@ -1,10 +1,10 @@
1
+ import type { PaneRect } from "./frame.js";
1
2
  import { LineInput } from "./line-input.js";
2
3
  import { type ShortcutHintEntry } from "./shortcut-hints.js";
3
4
  import type { UiTheme } from "./theme.js";
4
5
  /**
5
- * The panel a value with parts is edited in: at the foot of the screen, over the
6
- * surface it was opened from, ruled off above and below. It shows every part,
7
- * marks the one in hand, says what that part does, and says how to change it.
6
+ * Semantic content and overlay composition for Settings configure dialogs. The setting supplies
7
+ * rows and behavior; this component owns compact geometry, backdrop dimming, and panel placement.
8
8
  */
9
9
  export interface DialogRow {
10
10
  readonly label: string;
@@ -39,14 +39,23 @@ export interface SteppedDialogPanelState {
39
39
  readonly index: number;
40
40
  readonly hint: readonly ShortcutHintEntry[];
41
41
  }
42
+ /** Canonical native-matching background for every owned floating dialog surface. */
43
+ export declare function renderFloatingDialogSurface(text: string, mode: "truecolor" | "256color"): string;
44
+ /** Existing raised-menu background, centralized beside the darker dialog surface. */
45
+ export declare function renderFloatingMenuSurface(text: string, mode: "truecolor" | "256color"): string;
46
+ /** The shared compact width used by Settings configure dialogs and native tab dialogs. */
47
+ export declare function configureDialogWidth(width: number): number;
48
+ /** Rows available to a selector after retaining its title, description, control, and guidance. */
49
+ export declare function configureDialogChoiceCapacity(height: number, hasInput: boolean, descriptionRows?: number): number;
50
+ /** Number of modal rows a plain description occupies at the shared content width. */
51
+ export declare function configureDialogTextRows(text: string, width: number): number;
52
+ /** Dims a completed screen and overlays one full-intensity panel without disturbing ANSI tails. */
53
+ export declare function renderCenteredDialogOverlay(frame: readonly string[], dialogRows: readonly string[], rect: PaneRect, theme: UiTheme): readonly string[];
42
54
  /** The column values start at: past the widest label, capped so one long name cannot push them off. */
43
55
  export declare function dialogValueColumn(rows: readonly DialogRow[]): number;
44
- /**
45
- * The panel's lines. The first line is its rule, so the row at index N is drawn
46
- * one line below the panel's top.
47
- */
56
+ /** The semantic rows for one generic configure modal. */
48
57
  export declare function renderDialogPanel(state: DialogPanelState, width: number, theme: UiTheme): readonly string[];
49
- /** Owned stepped-selector composition for structured settings with nested choices. */
58
+ /** Owned stepped-selector content for structured settings with nested choices. */
50
59
  export declare function renderSteppedDialogPanel(state: SteppedDialogPanelState, width: number, theme: UiTheme): readonly string[];
51
60
  /** The row a pointer report lands on, or null when it is not on one. */
52
61
  export declare function dialogRowAt(frame: DialogPanelFrame, row: number, column: number, valueWidth: number): number | null;
@@ -1,24 +1,77 @@
1
1
  import { LineInput, renderInputRow } from "./line-input.js";
2
- import { renderShortcutHints, renderShortcutHintsWithClose, shortcutHintsText } from "./shortcut-hints.js";
3
- import { displayWidth, truncateToWidth } from "./text.js";
2
+ import { renderShortcutHintsWithClose } from "./shortcut-hints.js";
3
+ import { overlaySpan } from "./spans.js";
4
+ import { displayWidth, padToWidth, truncateToWidth } from "./text.js";
4
5
  const LABEL_COLUMN_CAP = 30;
5
6
  const STEPPED_LABEL_COLUMN_CAP = 46;
7
+ const CONFIGURE_MODAL_MAX_WIDTH = 60;
8
+ const CONFIGURE_MODAL_PADDING_X = 2;
9
+ const SGR = /\u001b\[[0-9;]*m/gu;
10
+ /** Canonical native-matching background for every owned floating dialog surface. */
11
+ export function renderFloatingDialogSurface(text, mode) {
12
+ const background = mode === "truecolor" ? "\u001b[48;2;38;38;38m" : "\u001b[48;5;235m";
13
+ return `${background}${text}\u001b[49m`;
14
+ }
15
+ /** Existing raised-menu background, centralized beside the darker dialog surface. */
16
+ export function renderFloatingMenuSurface(text, mode) {
17
+ const background = mode === "truecolor" ? "\u001b[48;2;55;55;55m" : "\u001b[48;5;237m";
18
+ return `${background}${text}\u001b[49m`;
19
+ }
20
+ /** The shared compact width used by Settings configure dialogs and native tab dialogs. */
21
+ export function configureDialogWidth(width) {
22
+ return Math.min(CONFIGURE_MODAL_MAX_WIDTH, Math.max(0, width));
23
+ }
24
+ /** Rows available to a selector after retaining its title, description, control, and guidance. */
25
+ export function configureDialogChoiceCapacity(height, hasInput, descriptionRows = 1) {
26
+ const wrappedDescriptionRows = Math.max(1, descriptionRows);
27
+ return Math.max(1, Math.max(0, height) - (hasInput ? 9 : 7) - (wrappedDescriptionRows - 1));
28
+ }
29
+ /** Number of modal rows a plain description occupies at the shared content width. */
30
+ export function configureDialogTextRows(text, width) {
31
+ return wrapText(text, Math.max(0, configureDialogWidth(width) - CONFIGURE_MODAL_PADDING_X * 2)).length;
32
+ }
33
+ /** One frame path for every semantic row, regardless of which configure dialog supplies content. */
34
+ function dialogPanelLayout(width, theme) {
35
+ const frameWidth = Math.max(0, width);
36
+ const left = Math.min(CONFIGURE_MODAL_PADDING_X, frameWidth);
37
+ const right = Math.min(CONFIGURE_MODAL_PADDING_X, frameWidth - left);
38
+ const contentWidth = Math.max(0, frameWidth - left - right);
39
+ return {
40
+ blank: " ".repeat(frameWidth),
41
+ contentWidth,
42
+ contentRow: (painted, raw = painted, selected = false) => {
43
+ const content = pad(truncateToWidth(painted, contentWidth), contentWidth, raw);
44
+ const rightPadding = " ".repeat(right);
45
+ return `${" ".repeat(left)}${selected ? theme.highlight(content) : content}${selected ? theme.panel(rightPadding) : rightPadding}`;
46
+ },
47
+ };
48
+ }
49
+ /** Dims a completed screen and overlays one full-intensity panel without disturbing ANSI tails. */
50
+ export function renderCenteredDialogOverlay(frame, dialogRows, rect, theme) {
51
+ const width = Math.max(0, rect.width);
52
+ const height = Math.max(0, rect.height);
53
+ const panelWidth = configureDialogWidth(width);
54
+ const visibleDialog = dialogRows.slice(0, height);
55
+ const top = Math.max(0, Math.floor((height - visibleDialog.length) / 2));
56
+ const left = Math.max(0, Math.floor((width - panelWidth) / 2));
57
+ return Array.from({ length: height }, (_, row) => {
58
+ const backdrop = dimStyledLine(frame[row] ?? "", width);
59
+ const dialogRow = visibleDialog[row - top];
60
+ if (dialogRow === undefined || panelWidth === 0)
61
+ return backdrop;
62
+ const panel = `\u001b[22;39;49m${theme.panel(padToWidth(dialogRow, panelWidth))}`;
63
+ return overlaySpan(backdrop, left, left + panelWidth, panel);
64
+ });
65
+ }
6
66
  /** The column values start at: past the widest label, capped so one long name cannot push them off. */
7
67
  export function dialogValueColumn(rows) {
8
68
  const widest = Math.min(LABEL_COLUMN_CAP, Math.max(0, ...rows.map(row => displayWidth(row.label))));
9
69
  return 2 + widest + 2;
10
70
  }
11
- /**
12
- * The panel's lines. The first line is its rule, so the row at index N is drawn
13
- * one line below the panel's top.
14
- */
71
+ /** The semantic rows for one generic configure modal. */
15
72
  export function renderDialogPanel(state, width, theme) {
16
73
  const labelColumn = Math.min(LABEL_COLUMN_CAP, Math.max(0, ...state.rows.map(row => displayWidth(row.label))));
17
- const rule = theme.fg("border", "─".repeat(Math.max(0, width)));
18
- const contentPadding = Math.min(1, Math.max(0, width));
19
- const contentWidth = Math.max(0, width - contentPadding);
20
- const inset = " ".repeat(contentPadding);
21
- const contentRow = (painted, raw) => `${inset}${pad(truncateToWidth(painted, contentWidth), contentWidth, raw)}`;
74
+ const layout = dialogPanelLayout(width, theme);
22
75
  const rows = state.rows.map((row, index) => {
23
76
  const selected = index === state.index;
24
77
  const padded = `${row.label}${" ".repeat(Math.max(0, labelColumn - displayWidth(row.label)))}`;
@@ -27,32 +80,28 @@ export function renderDialogPanel(state, width, theme) {
27
80
  const content = selected
28
81
  ? `${theme.fg("accent", cursor)}${theme.fg("text", padded)} ${theme.fg("muted", row.value)}`
29
82
  : `${cursor}${padded} ${theme.fg("muted", row.value)}`;
30
- const painted = selected ? theme.highlight(content) : content;
31
- return contentRow(painted, raw);
83
+ return layout.contentRow(content, raw, selected);
32
84
  });
33
85
  const description = state.rows[state.index]?.description ?? "";
86
+ const descriptionRows = wrapText(description, layout.contentWidth);
34
87
  const hint = typeof state.hint === "string"
35
88
  ? theme.fg("dim", state.hint)
36
- : renderShortcutHintsWithClose(state.hint, theme, contentWidth, 0);
89
+ : renderShortcutHintsWithClose(state.hint, theme, layout.contentWidth, 0);
37
90
  const plainHint = typeof state.hint === "string" ? state.hint : " ".repeat(displayWidth(hint));
38
91
  return [
39
- rule,
40
- contentRow(theme.bold(theme.fg("accent", state.title)), state.title),
41
- contentRow(theme.fg("dim", description), description),
42
- "",
92
+ layout.blank,
93
+ layout.contentRow(theme.bold(theme.fg("accent", state.title)), state.title),
94
+ ...descriptionRows.map(line => layout.contentRow(theme.fg("dim", line), line)),
95
+ layout.blank,
43
96
  ...rows,
44
- "",
45
- contentRow(hint, plainHint),
46
- rule,
97
+ layout.blank,
98
+ layout.contentRow(hint, plainHint),
99
+ layout.blank,
47
100
  ];
48
101
  }
49
- /** Owned stepped-selector composition for structured settings with nested choices. */
102
+ /** Owned stepped-selector content for structured settings with nested choices. */
50
103
  export function renderSteppedDialogPanel(state, width, theme) {
51
- const rule = theme.fg("border", "─".repeat(Math.max(0, width)));
52
- const contentPadding = Math.min(1, Math.max(0, width));
53
- const contentWidth = Math.max(0, width - contentPadding);
54
- const inset = " ".repeat(contentPadding);
55
- const contentRow = (painted, raw) => `${inset}${pad(truncateToWidth(painted, contentWidth), contentWidth, raw)}`;
104
+ const layout = dialogPanelLayout(width, theme);
56
105
  const labelColumn = Math.min(STEPPED_LABEL_COLUMN_CAP, Math.max(0, ...state.rows.map(row => displayWidth(`${row.label}${row.labelSuffix ?? ""}`))));
57
106
  const rows = state.rows.map((row, index) => {
58
107
  const selected = index === state.index;
@@ -65,31 +114,35 @@ export function renderSteppedDialogPanel(state, width, theme) {
65
114
  const content = selected
66
115
  ? `${theme.fg("accent", cursor)}${label}${theme.fg("muted", suffix)}`
67
116
  : `${cursor}${label}${theme.fg("muted", suffix)}`;
68
- return contentRow(selected ? theme.highlight(content) : content, raw);
117
+ return layout.contentRow(content, raw, selected);
69
118
  });
70
119
  const input = state.input === undefined
71
120
  ? []
72
- : [...renderInputRow(state.input, width, { ruled: false, promptGlyph: "> ", theme }).lines, ""];
121
+ : [
122
+ ...renderInputRow(state.input, layout.contentWidth, {
123
+ ruled: false,
124
+ promptGlyph: "> ",
125
+ promptRole: "accent",
126
+ theme,
127
+ }).lines.map(row => layout.contentRow(row)),
128
+ layout.blank,
129
+ ];
130
+ const descriptionRows = wrapText(state.description, layout.contentWidth);
73
131
  const step = `(step ${state.step}/${state.steps})`;
74
132
  const title = `${state.title} ${step}`;
75
133
  const paintedTitle = `${theme.bold(theme.fg("accent", state.title))} ${theme.fg("dim", step)}`;
76
134
  return [
77
- rule,
78
- contentRow(paintedTitle, title),
79
- contentRow(theme.fg("dim", state.description), state.description),
80
- "",
135
+ layout.blank,
136
+ layout.contentRow(paintedTitle, title),
137
+ ...descriptionRows.map(line => layout.contentRow(theme.fg("dim", line), line)),
138
+ layout.blank,
81
139
  ...input,
82
140
  ...rows,
83
- "",
84
- renderSteppedHint(state.hint, width, theme),
85
- rule,
141
+ layout.blank,
142
+ layout.contentRow(renderShortcutHintsWithClose(state.hint, theme, layout.contentWidth)),
143
+ layout.blank,
86
144
  ];
87
145
  }
88
- function renderSteppedHint(entries, width, theme) {
89
- const raw = shortcutHintsText(entries, 1, " · ");
90
- const painted = renderShortcutHints(entries, theme, 1, theme.fg("dim", " · "));
91
- return `${truncateToWidth(painted, width)}${" ".repeat(Math.max(0, width - displayWidth(raw)))}`;
92
- }
93
146
  /** The row a pointer report lands on, or null when it is not on one. */
94
147
  export function dialogRowAt(frame, row, column, valueWidth) {
95
148
  const at = row - frame.firstRow;
@@ -102,3 +155,26 @@ function pad(line, width, raw) {
102
155
  const visible = displayWidth(raw);
103
156
  return visible >= width ? line : line + " ".repeat(width - visible);
104
157
  }
158
+ function dimStyledLine(line, width) {
159
+ const padded = padToWidth(line, width);
160
+ return `\u001b[2m${padded.replace(SGR, sequence => `${sequence}\u001b[2m`)}\u001b[22m`;
161
+ }
162
+ function wrapText(text, width) {
163
+ if (text.length === 0 || width <= 0)
164
+ return [""];
165
+ const lines = [];
166
+ let line = "";
167
+ for (const word of text.split(/\s+/u)) {
168
+ const candidate = `${line}${line.length === 0 ? "" : " "}${word}`;
169
+ if (line.length > 0 && displayWidth(candidate) > width) {
170
+ lines.push(line);
171
+ line = word;
172
+ }
173
+ else {
174
+ line = candidate;
175
+ }
176
+ }
177
+ if (line.length > 0)
178
+ lines.push(truncateToWidth(line, width));
179
+ return lines.length === 0 ? [""] : lines;
180
+ }
@@ -1,4 +1,4 @@
1
- export { dialogRowAt, dialogValueColumn, renderDialogPanel, renderSteppedDialogPanel } from "./dialog-panel.js";
1
+ export { configureDialogChoiceCapacity, configureDialogTextRows, configureDialogWidth, dialogRowAt, dialogValueColumn, renderCenteredDialogOverlay, renderDialogPanel, renderSteppedDialogPanel, } from "./dialog-panel.js";
2
2
  export type { DialogPanelFrame, DialogPanelState, DialogRow, SteppedDialogPanelState } from "./dialog-panel.js";
3
3
  export { FrameContractError, assertPaneRect, finalizeFrame, validateFrame } from "./frame.js";
4
4
  export type { PaneRect } from "./frame.js";
@@ -19,7 +19,7 @@ export { progressStatusFrame, progressStatusText } from "./progress-status.js";
19
19
  export type { ProgressStatusFrameStyles, ProgressStatusMarker } from "./progress-status.js";
20
20
  export { FrameCache, RENDER_REVISION_KINDS, RenderRevisionTracker, ZERO_REVISIONS, normalizeRevisions, revisionsEqual } from "./revision.js";
21
21
  export type { RenderCacheContract, RenderRevisionKind, RenderRevisions } from "./revision.js";
22
- export { MAX_COPY_ROWS, MAX_COPY_SOURCE_UNITS, selectionCopyLineContent, selectionCopyRowText } from "./selection-copy.js";
22
+ export { COPY_ACKNOWLEDGEMENT_DURATION_MS, MAX_COPY_ROWS, MAX_COPY_SOURCE_UNITS, copyAcknowledgementText, selectionCopyLineContent, selectionCopyRowText } from "./selection-copy.js";
23
23
  export type { SelectionCopyPrompt, SelectionCopyRow, SelectionCopySnapshot } from "./selection-copy.js";
24
24
  export { ScrollbarRails, isThumbRow, scrollForThumbRow, scrollForTrackPage, scrollbarGeometry, scrollbarPresentation, scrollbarReservesSpace, scrollbarSelectionRows, scrollbarWheelRows, } from "./scrollbar.js";
25
25
  export type { RailPointer, RailPosition, ScrollbarAppearance, ScrollbarGeometry, ScrollbarInput, ScrollbarPresentation, ScrollbarPresentationInput, ScrollbarSpeed, ScrollbarStyle, } from "./scrollbar.js";
@@ -32,8 +32,8 @@ export { readVisibleHyperlinks } from "./visible-hyperlinks.js";
32
32
  export type { VisibleHyperlinkRange, VisibleHyperlinkRow } from "./visible-hyperlinks.js";
33
33
  export { renderStatusLine, statusText } from "./status-line.js";
34
34
  export type { StatusLineInput } from "./status-line.js";
35
- export { SUBMITTED_PROMPT_PREFIX_WIDTH, composeSubmittedPromptRows, formatSubmittedPromptTime, submittedPromptLayout } from "./submitted-prompt.js";
36
- export type { SubmittedPromptLayout, SubmittedPromptStyle } from "./submitted-prompt.js";
35
+ export { SUBMITTED_PROMPT_PREFIX_WIDTH, composeSubmittedPromptRows, formatLocalTime, formatSubmittedPromptTime, submittedPromptLayout } from "./submitted-prompt.js";
36
+ export type { SubmittedPromptLayout, SubmittedPromptStyle, UiTimeFormat } from "./submitted-prompt.js";
37
37
  export { numericValues, steppedValue, stepperEnds } from "./stepper.js";
38
38
  export type { NumericRange } from "./stepper.js";
39
39
  export { TranscriptViewport, assertTranscriptViewportFrameDescriptor } from "./transcript-viewport.js";
@@ -42,7 +42,7 @@ export { RAIL_COLUMNS, renderEmptyState, withScrollbarRail } from "./surface.js"
42
42
  export type { RailOptions } from "./surface.js";
43
43
  export { displayColumnSlice, displayWidth, displayWordColumnRange, faint, padToWidth, stripAnsi, truncateToWidth } from "./text.js";
44
44
  export type { DisplayColumnRange, DisplayColumnSlice } from "./text.js";
45
- export { TEXT_SELECTION_MULTI_CLICK_MS, extendTextSelection, orderedTextSelection, plainTextBetweenColumns, pressTextSelection, releaseTextSelection, textSelectionLineExtendColumn, textSelectionPointAt, textSelectionText, usefulTextLineContent, } from "./text-selection.js";
45
+ export { TEXT_SELECTION_MULTI_CLICK_MS, extendTextSelection, orderedTextSelection, paintTextSelection, plainTextBetweenColumns, pressTextSelection, releaseTextSelection, textSelectionLineExtendColumn, textSelectionPointAt, textSelectionText, usefulTextLineContent, } from "./text-selection.js";
46
46
  export type { OrderedTextSelection, TextSelection, TextSelectionClick, TextSelectionLineContent, TextSelectionPoint, TextSelectionPressInput, } from "./text-selection.js";
47
47
  export { PLAIN_THEME } from "./theme.js";
48
48
  export type { UiTheme, UiThemeToken } from "./theme.js";
@@ -1,4 +1,4 @@
1
- export { dialogRowAt, dialogValueColumn, renderDialogPanel, renderSteppedDialogPanel } from "./dialog-panel.js";
1
+ export { configureDialogChoiceCapacity, configureDialogTextRows, configureDialogWidth, dialogRowAt, dialogValueColumn, renderCenteredDialogOverlay, renderDialogPanel, renderSteppedDialogPanel, } from "./dialog-panel.js";
2
2
  export { FrameContractError, assertPaneRect, finalizeFrame, validateFrame } from "./frame.js";
3
3
  export { humanizeLabel, humanizeTitle } from "./label.js";
4
4
  export { LineInput, caretCell, handleLineInputKey, renderInputRow, wordLeft, wordRight } from "./line-input.js";
@@ -9,18 +9,18 @@ export { MOUSE_TRACKING_OFF, MOUSE_TRACKING_ON, parseMouseInput, routeMouseInput
9
9
  export { isInsidePane, toPaneLocalMouse } from "./pane.js";
10
10
  export { progressStatusFrame, progressStatusText } from "./progress-status.js";
11
11
  export { FrameCache, RENDER_REVISION_KINDS, RenderRevisionTracker, ZERO_REVISIONS, normalizeRevisions, revisionsEqual } from "./revision.js";
12
- export { MAX_COPY_ROWS, MAX_COPY_SOURCE_UNITS, selectionCopyLineContent, selectionCopyRowText } from "./selection-copy.js";
12
+ export { COPY_ACKNOWLEDGEMENT_DURATION_MS, MAX_COPY_ROWS, MAX_COPY_SOURCE_UNITS, copyAcknowledgementText, selectionCopyLineContent, selectionCopyRowText } from "./selection-copy.js";
13
13
  export { ScrollbarRails, isThumbRow, scrollForThumbRow, scrollForTrackPage, scrollbarGeometry, scrollbarPresentation, scrollbarReservesSpace, scrollbarSelectionRows, scrollbarWheelRows, } from "./scrollbar.js";
14
14
  export { assertOwnedShortcutHintConventions, renderShortcutHints, renderShortcutHintsWithClose, shortcutHintsText } from "./shortcut-hints.js";
15
15
  export { GLOBAL_SCOPE, ShortcutRegistry, assembleShortcuts, assertNoShortcutConflicts } from "./shortcuts.js";
16
16
  export { backgroundSgrSpan, heldNativeHyperlinkStyle, hyperlinkSgrSpan, hyperlinkTargetAtColumn, nativeHyperlinkStyle, overlaySpan } from "./spans.js";
17
17
  export { readVisibleHyperlinks } from "./visible-hyperlinks.js";
18
18
  export { renderStatusLine, statusText } from "./status-line.js";
19
- export { SUBMITTED_PROMPT_PREFIX_WIDTH, composeSubmittedPromptRows, formatSubmittedPromptTime, submittedPromptLayout } from "./submitted-prompt.js";
19
+ export { SUBMITTED_PROMPT_PREFIX_WIDTH, composeSubmittedPromptRows, formatLocalTime, formatSubmittedPromptTime, submittedPromptLayout } from "./submitted-prompt.js";
20
20
  export { numericValues, steppedValue, stepperEnds } from "./stepper.js";
21
21
  export { TranscriptViewport, assertTranscriptViewportFrameDescriptor } from "./transcript-viewport.js";
22
22
  export { RAIL_COLUMNS, renderEmptyState, withScrollbarRail } from "./surface.js";
23
23
  export { displayColumnSlice, displayWidth, displayWordColumnRange, faint, padToWidth, stripAnsi, truncateToWidth } from "./text.js";
24
- export { TEXT_SELECTION_MULTI_CLICK_MS, extendTextSelection, orderedTextSelection, plainTextBetweenColumns, pressTextSelection, releaseTextSelection, textSelectionLineExtendColumn, textSelectionPointAt, textSelectionText, usefulTextLineContent, } from "./text-selection.js";
24
+ export { TEXT_SELECTION_MULTI_CLICK_MS, extendTextSelection, orderedTextSelection, paintTextSelection, plainTextBetweenColumns, pressTextSelection, releaseTextSelection, textSelectionLineExtendColumn, textSelectionPointAt, textSelectionText, usefulTextLineContent, } from "./text-selection.js";
25
25
  export { PLAIN_THEME } from "./theme.js";
26
26
  export { menuRowAt, renderValueMenu, valueMenuFrame } from "./value-menu.js";
@@ -1,3 +1,4 @@
1
+ import { type PromptMarkerRole } from "./prompt-input.js";
1
2
  import type { UiTheme } from "./theme.js";
2
3
  export type LineInputOutcome = {
3
4
  readonly kind: "editing";
@@ -56,10 +57,12 @@ export declare function caretCell(text: string): string;
56
57
  export interface InputRowOptions {
57
58
  /** Shown quietly while nothing has been typed, with the caret on its first cell. */
58
59
  readonly placeholder?: string;
59
- /** Rules above and below, in the prompt's own grey. Default true. */
60
+ /** Theme-border rules. */
60
61
  readonly ruled?: boolean;
61
62
  /** Prompt marker including any following spacing. Defaults to the shared prompt glyph. */
62
63
  readonly promptGlyph?: string;
64
+ /** Semantic foreground for a configured prompt marker. */
65
+ readonly promptRole?: PromptMarkerRole;
63
66
  readonly theme?: Pick<UiTheme, "fg">;
64
67
  }
65
68
  export interface InputRow {
@@ -220,5 +220,7 @@ export function renderInputRow(input, width, options = {}) {
220
220
  const body = empty
221
221
  ? `${caretCell(placeholder.slice(0, 1))}${faint(placeholder.slice(1))}`
222
222
  : `${before}${caretCell(under)}${after}`;
223
- return { lines: presentation.render(width, () => ({ rows: [body] }), options.ruled, 0, options.promptGlyph) };
223
+ return {
224
+ lines: presentation.render(width, () => ({ rows: [body] }), options.ruled, 0, options.promptGlyph, options.promptRole),
225
+ };
224
226
  }
@@ -1,9 +1,11 @@
1
1
  import { type UiTheme } from "./theme.js";
2
- export declare const PROMPT_GLYPH = "\u276F ";
3
- export declare const PROMPT_PREFIX_WIDTH = 2;
4
- export declare function promptRuleText(text: string): string;
5
- export declare function promptRule(width: number): string;
6
- export declare function promptArrow(text: string, theme: Pick<UiTheme, "fg">): string;
2
+ export declare const PROMPT_GLYPH = "";
3
+ export declare const PROMPT_PREFIX_WIDTH = 0;
4
+ type RuleTheme = Pick<UiTheme, "fg">;
5
+ export declare function promptRuleText(text: string, theme: RuleTheme): string;
6
+ export declare function promptRule(width: number, theme: RuleTheme): string;
7
+ export type PromptMarkerRole = "muted" | "accent";
8
+ export declare function promptArrow(text: string, theme: RuleTheme, role?: PromptMarkerRole): string;
7
9
  export interface PromptInputBody {
8
10
  readonly rows: readonly string[];
9
11
  /** Semantic border fragments retain editor history and scroll annotations. */
@@ -19,9 +21,9 @@ export interface PromptInputMetrics {
19
21
  }
20
22
  /** Composes shared input chrome around controller-owned body rows without owning editing state. */
21
23
  export declare class PromptInput {
22
- readonly theme: Pick<UiTheme, "fg">;
24
+ readonly theme: RuleTheme;
23
25
  readonly metrics: PromptInputMetrics;
24
- constructor(theme?: Pick<UiTheme, "fg">, metrics?: PromptInputMetrics);
26
+ constructor(theme?: RuleTheme, metrics?: PromptInputMetrics);
25
27
  styleRule(text: string): string;
26
28
  geometry(width: number, padding?: number, promptGlyph?: string): {
27
29
  prefixWidth: number;
@@ -30,5 +32,6 @@ export declare class PromptInput {
30
32
  contentWidth: number;
31
33
  layoutWidth: number;
32
34
  };
33
- render(width: number, renderBody: (innerWidth: number) => PromptInputBody, ruled?: boolean, padding?: number, promptGlyph?: string): string[];
35
+ render(width: number, renderBody: (innerWidth: number) => PromptInputBody, ruled?: boolean, padding?: number, promptGlyph?: string, promptRole?: PromptMarkerRole): string[];
34
36
  }
37
+ export {};
@@ -1,22 +1,24 @@
1
1
  import { displayWidth, truncateToWidth } from "./text.js";
2
2
  import { PLAIN_THEME } from "./theme.js";
3
- export const PROMPT_GLYPH = "❯ ";
4
- export const PROMPT_PREFIX_WIDTH = 2;
5
- export function promptRuleText(text) {
6
- return `\u001b[38;2;154;160;166m${text}\u001b[39m`;
3
+ export const PROMPT_GLYPH = "";
4
+ export const PROMPT_PREFIX_WIDTH = 0;
5
+ export function promptRuleText(text, theme) {
6
+ return theme.fg("border", text);
7
7
  }
8
- export function promptRule(width) {
9
- return promptRuleText("─".repeat(Math.max(0, width)));
8
+ export function promptRule(width, theme) {
9
+ return promptRuleText("─".repeat(Math.max(0, width)), theme);
10
10
  }
11
- export function promptArrow(text, theme) {
12
- return theme.fg("muted", text);
11
+ export function promptArrow(text, theme, role = "muted") {
12
+ if (role === "accent" && text.startsWith(">"))
13
+ return `${theme.fg(role, ">")}${text.slice(1)}`;
14
+ return theme.fg(role, text);
13
15
  }
14
16
  /** Composes shared input chrome around controller-owned body rows without owning editing state. */
15
17
  export class PromptInput {
16
18
  theme;
17
19
  metrics;
18
20
  constructor(theme = PLAIN_THEME, metrics = { measure: displayWidth, truncate: truncateToWidth }) { this.theme = theme; this.metrics = metrics; }
19
- styleRule(text) { return promptRuleText(text); }
21
+ styleRule(text) { return promptRuleText(text, this.theme); }
20
22
  geometry(width, padding = 0, promptGlyph = PROMPT_GLYPH) {
21
23
  const prefixWidth = Math.min(this.metrics.measure(promptGlyph), Math.max(0, width));
22
24
  // Compatibility: editor wrapping needs room for a two-cell grapheme plus its cursor cell.
@@ -26,7 +28,7 @@ export class PromptInput {
26
28
  const contentWidth = Math.max(1, innerWidth - paddingX * 2);
27
29
  return { prefixWidth, innerWidth, paddingX, contentWidth, layoutWidth: Math.max(1, contentWidth - (paddingX ? 0 : 1)) };
28
30
  }
29
- render(width, renderBody, ruled = true, padding = 0, promptGlyph = PROMPT_GLYPH) {
31
+ render(width, renderBody, ruled = true, padding = 0, promptGlyph = PROMPT_GLYPH, promptRole = "muted") {
30
32
  if (width <= 0)
31
33
  return [];
32
34
  const { prefixWidth, innerWidth } = this.geometry(width, padding, promptGlyph);
@@ -40,11 +42,11 @@ export class PromptInput {
40
42
  return clipped + " ".repeat(Math.max(0, width - this.metrics.measure(clipped)));
41
43
  };
42
44
  const rows = body.rows.map((row, index) => fit(`${index === 0
43
- ? promptArrow(promptGlyph, this.theme)
45
+ ? promptArrow(promptGlyph, this.theme, promptRole)
44
46
  : " ".repeat(prefixWidth)}${row}`));
45
47
  const rule = (fragment) => fragment === undefined
46
- ? promptRule(width)
47
- : fit(fragment + promptRule(Math.max(0, width - this.metrics.measure(fragment))));
48
+ ? promptRule(width, this.theme)
49
+ : fit(fragment + promptRule(Math.max(0, width - this.metrics.measure(fragment)), this.theme));
48
50
  return [
49
51
  ...(ruled ? [rule(body.topRule)] : []),
50
52
  ...rows,
@@ -6,7 +6,7 @@
6
6
  export interface ScrollbarGeometry {
7
7
  /** Rows in the track. */
8
8
  readonly trackHeight: number;
9
- /** Thumb height in rows, at least one. */
9
+ /** Thumb height in rows, at least two when the track permits. */
10
10
  readonly thumbHeight: number;
11
11
  /** Zero-based row of the thumb's top within the track. */
12
12
  readonly thumbTop: number;
@@ -39,7 +39,7 @@ export function scrollbarGeometry(input) {
39
39
  return null;
40
40
  const maxScroll = contentLength - viewportHeight;
41
41
  const scroll = Math.min(Math.max(input.scroll, 0), maxScroll);
42
- const thumbHeight = Math.max(1, Math.min(trackHeight, Math.round(trackHeight * viewportHeight / contentLength)));
42
+ const thumbHeight = Math.min(trackHeight, Math.max(2, Math.round(trackHeight * viewportHeight / contentLength)));
43
43
  const travel = trackHeight - thumbHeight;
44
44
  const thumbTop = maxScroll === 0 ? 0 : Math.min(travel, Math.round(travel * scroll / maxScroll));
45
45
  return { trackHeight, thumbHeight, thumbTop, maxScroll };
@@ -2,23 +2,23 @@ import { type OrderedTextSelection, type TextSelectionLineContent } from "./text
2
2
  /** Bound selected-source retention independently of history length and encoded payload size. */
3
3
  export declare const MAX_COPY_SOURCE_UNITS: number;
4
4
  export declare const MAX_COPY_ROWS = 65536;
5
+ export declare const COPY_ACKNOWLEDGEMENT_DURATION_MS = 1000;
6
+ export declare function copyAcknowledgementText(characters: number): string;
5
7
  export type SelectionCopyPrompt = "first" | "continuation" | undefined;
6
8
  export interface SelectionCopyRow {
7
9
  readonly text: string;
8
10
  readonly prompt?: "first" | "continuation";
9
11
  }
10
- /** Immutable selected rows only; safe to transfer to an isolated text preparer. */
11
12
  export interface SelectionCopySnapshot {
12
13
  readonly selection: OrderedTextSelection;
13
14
  readonly revision: number;
14
- /** Prompt copy/cut already supplies exact expanded text; do not apply transcript chrome stripping. */
15
15
  readonly literal?: boolean;
16
16
  readonly rows: readonly SelectionCopyRow[];
17
17
  readonly sourceUnits: number;
18
18
  readonly captureMs?: number;
19
19
  readonly rejected?: "size";
20
20
  }
21
- /** Shares the viewport's semantic chrome exclusions with isolated copy preparation. */
22
21
  export declare function selectionCopyLineContent(text: string, prompt: SelectionCopyPrompt): TextSelectionLineContent;
22
+ export declare function literalSelectionCopySnapshot(text: string, revision?: number): SelectionCopySnapshot | null;
23
23
  /** Extracts one snapshot row with the existing grapheme/newline policy; run expensive rows off-thread. */
24
24
  export declare function selectionCopyRowText(snapshot: Pick<SelectionCopySnapshot, "selection" | "literal">, row: SelectionCopyRow, index: number): string;
@@ -3,7 +3,10 @@ import { stripAnsi } from "./text.js";
3
3
  /** Bound selected-source retention independently of history length and encoded payload size. */
4
4
  export const MAX_COPY_SOURCE_UNITS = 32 * 1024 * 1024;
5
5
  export const MAX_COPY_ROWS = 65_536;
6
- /** Shares the viewport's semantic chrome exclusions with isolated copy preparation. */
6
+ export const COPY_ACKNOWLEDGEMENT_DURATION_MS = 1_000;
7
+ export function copyAcknowledgementText(characters) {
8
+ return `copied ${characters} chars to clipboard`;
9
+ }
7
10
  export function selectionCopyLineContent(text, prompt) {
8
11
  const plain = stripAnsi(text);
9
12
  if (prompt !== undefined) {
@@ -19,6 +22,18 @@ export function selectionCopyLineContent(text, prompt) {
19
22
  return { from, to: from + 1 };
20
23
  return usefulTextLineContent(plain, from);
21
24
  }
25
+ export function literalSelectionCopySnapshot(text, revision = 0) {
26
+ if (text.trim().length === 0)
27
+ return null;
28
+ const selection = {
29
+ start: { line: 0, column: 0 },
30
+ end: { line: 0, column: Number.MAX_SAFE_INTEGER },
31
+ };
32
+ if (text.length > MAX_COPY_SOURCE_UNITS) {
33
+ return { literal: true, selection, revision, rows: [], sourceUnits: 0, rejected: "size" };
34
+ }
35
+ return { literal: true, selection, revision, rows: [{ text }], sourceUnits: text.length };
36
+ }
22
37
  /** Extracts one snapshot row with the existing grapheme/newline policy; run expensive rows off-thread. */
23
38
  export function selectionCopyRowText(snapshot, row, index) {
24
39
  if (snapshot.literal)
@@ -1,4 +1,4 @@
1
- import { displayWidth } from "./text.js";
1
+ import { displayWidth, graphemeWidth } from "./text.js";
2
2
  /**
3
3
  * Ported from the A1 UI reference implementation (`core/presentation/spans.ts`).
4
4
  * Writing over part of a rendered row is not string slicing: the row carries
@@ -53,7 +53,7 @@ export function overlaySpan(line, from, to, span, options = {}) {
53
53
  continue;
54
54
  }
55
55
  for (const { segment } of GRAPHEMES.segment(token)) {
56
- const width = displayWidth(segment);
56
+ const width = graphemeWidth(segment);
57
57
  if (column + width <= from)
58
58
  head += segment;
59
59
  else if (column >= to)
@@ -1,5 +1,8 @@
1
- /** Visible width of the submitted-prompt prefix (`❯ `). */
2
- export declare const SUBMITTED_PROMPT_PREFIX_WIDTH = 2;
1
+ export type UiTimeFormat = "20:00" | "8:00 PM";
2
+ /** Deterministic local hour/minute presentation shared by A1-owned time labels. */
3
+ export declare function formatLocalTime(source: Date | number, format?: UiTimeFormat): string | null;
4
+ /** Visible width of the submitted-prompt prefix (` ❯ `). */
5
+ export declare const SUBMITTED_PROMPT_PREFIX_WIDTH = 3;
3
6
  export interface SubmittedPromptStyle {
4
7
  readonly prefix?: (text: string) => string;
5
8
  readonly timestamp?: (text: string) => string;
@@ -8,16 +11,16 @@ export interface SubmittedPromptLayout {
8
11
  readonly contentWidth: number;
9
12
  readonly timestamp: string | null;
10
13
  }
11
- /** Formats transcript metadata, never render time, as local 24-hour HH:mm. */
12
- export declare function formatSubmittedPromptTime(source: Date | number): string | null;
14
+ /** Formats transcript metadata, never render time, in the active A1 time format. */
15
+ export declare function formatSubmittedPromptTime(source: Date | number, format?: UiTimeFormat): string | null;
13
16
  /**
14
17
  * Computes the width at which the prompt's Markdown body must be rendered.
15
18
  * The timestamp is omitted rather than allowing it to crowd useful content.
16
19
  */
17
- export declare function submittedPromptLayout(width: number, source?: Date | number | null): SubmittedPromptLayout;
20
+ export declare function submittedPromptLayout(width: number, source?: Date | number | null, format?: UiTimeFormat): SubmittedPromptLayout;
18
21
  /**
19
22
  * Composes already-rendered prompt content into the compact submitted bar.
20
23
  * Continuations align below the content, not below the prefix, and no row can
21
24
  * exceed the supplied terminal width even when the content renderer misbehaves.
22
25
  */
23
- export declare function composeSubmittedPromptRows(contentRows: readonly string[], width: number, source?: Date | number | null, style?: SubmittedPromptStyle): readonly string[];
26
+ export declare function composeSubmittedPromptRows(contentRows: readonly string[], width: number, source?: Date | number | null, style?: SubmittedPromptStyle, format?: UiTimeFormat): readonly string[];