@timurproko/a1 0.2.6 → 0.2.7-dev.1221

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 (410) 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 +196 -908
  37. package/dist/app/session-shell/session-shell.d.ts +3 -8
  38. package/dist/app/session-shell/session-shell.js +324 -835
  39. package/dist/app/session-shell/session-viewport-controller.d.ts +2 -2
  40. package/dist/app/session-shell/session-viewport-controller.js +29 -15
  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 +102 -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 +205 -153
  70. package/dist/composition/resident-tab-bridge.d.ts +25 -0
  71. package/dist/composition/resident-tab-bridge.js +180 -0
  72. package/dist/composition/session-backend.d.ts +19 -0
  73. package/dist/composition/session-backend.js +1 -0
  74. package/dist/composition/session-runtime-registry.d.ts +20 -0
  75. package/dist/composition/session-runtime-registry.js +85 -0
  76. package/dist/composition/settings-route-host.d.ts +16 -1
  77. package/dist/composition/settings-route-host.js +29 -10
  78. package/dist/composition/settings-search-input.d.ts +9 -0
  79. package/dist/composition/settings-search-input.js +58 -0
  80. package/dist/composition/startup-route.d.ts +32 -0
  81. package/dist/composition/startup-route.js +72 -0
  82. package/dist/composition/utility-tab.d.ts +28 -0
  83. package/dist/composition/utility-tab.js +242 -0
  84. package/dist/contracts/owned-ui/index.d.ts +1 -1
  85. package/dist/contracts/owned-ui/model.d.ts +3 -0
  86. package/dist/contracts/owned-ui/session-backend.d.ts +3 -0
  87. package/dist/contracts/owned-ui/session-workflows.d.ts +11 -4
  88. package/dist/contracts/presentation/index.d.ts +11 -0
  89. package/dist/contracts/presentation/index.js +12 -0
  90. package/dist/features/launch/development-launch.js +6 -0
  91. package/dist/features/launch/index.d.ts +1 -1
  92. package/dist/features/launch/intent.d.ts +3 -1
  93. package/dist/features/launch/intent.js +7 -4
  94. package/dist/features/launch/profile-paths.js +4 -0
  95. package/dist/features/owned-ui/plus-menu-dialog.d.ts +22 -0
  96. package/dist/features/owned-ui/plus-menu-dialog.js +76 -0
  97. package/dist/features/owned-ui/project-trust-dialog.d.ts +1 -1
  98. package/dist/features/owned-ui/project-trust-dialog.js +6 -8
  99. package/dist/features/owned-ui/project-trust-prompt.d.ts +1 -0
  100. package/dist/features/owned-ui/project-trust-prompt.js +7 -3
  101. package/dist/features/owned-ui/reference-screen-app.d.ts +2 -0
  102. package/dist/features/owned-ui/reference-screen-app.js +12 -2
  103. package/dist/features/owned-ui/settings-app.d.ts +12 -2
  104. package/dist/features/owned-ui/settings-app.js +116 -81
  105. package/dist/features/owned-ui/settings-search-input.d.ts +29 -0
  106. package/dist/features/owned-ui/settings-search-input.js +1 -0
  107. package/dist/features/prompt-history/index.d.ts +1 -1
  108. package/dist/features/prompt-history/paths.d.ts +2 -1
  109. package/dist/features/prompt-history/paths.js +10 -2
  110. package/dist/features/prompt-history/service.d.ts +5 -0
  111. package/dist/features/prompt-history/service.js +1 -1
  112. package/dist/features/resident-tab/auto-name.d.ts +11 -0
  113. package/dist/features/resident-tab/auto-name.js +44 -0
  114. package/dist/features/resident-tab/index.d.ts +5 -0
  115. package/dist/features/resident-tab/index.js +7 -0
  116. package/dist/features/resident-tab/shortcut-bindings-file.d.ts +8 -0
  117. package/dist/features/resident-tab/shortcut-bindings-file.js +40 -0
  118. package/dist/features/resident-tab/shortcut-declarations.d.ts +13 -0
  119. package/dist/features/resident-tab/shortcut-declarations.js +26 -0
  120. package/dist/features/resident-tab/shortcut-projection.d.ts +29 -0
  121. package/dist/features/resident-tab/shortcut-projection.js +64 -0
  122. package/dist/features/resident-tab/status-deriver.d.ts +10 -0
  123. package/dist/features/resident-tab/status-deriver.js +12 -0
  124. package/dist/foundation/launch-context/index.d.ts +12 -0
  125. package/dist/foundation/launch-context/index.js +26 -0
  126. package/dist/foundation/launch-guardian/exit-watcher.d.ts +14 -0
  127. package/dist/foundation/launch-guardian/exit-watcher.js +94 -0
  128. package/dist/foundation/launch-guardian/main.d.ts +7 -1
  129. package/dist/foundation/launch-guardian/main.js +60 -7
  130. package/dist/foundation/lifecycle/session-repository-context.js +16 -2
  131. package/dist/foundation/process-containment/{native-guardian-containment.d.ts → addon-containment.d.ts} +7 -5
  132. package/dist/foundation/process-containment/addon-containment.js +139 -0
  133. package/dist/foundation/process-containment/addon-process-inspector.d.ts +11 -0
  134. package/dist/foundation/process-containment/addon-process-inspector.js +36 -0
  135. package/dist/foundation/process-containment/addon.d.ts +42 -0
  136. package/dist/foundation/process-containment/addon.js +57 -0
  137. package/dist/foundation/process-containment/artifact.d.ts +1 -1
  138. package/dist/foundation/process-containment/artifact.js +6 -5
  139. package/dist/foundation/process-containment/contracts.d.ts +2 -0
  140. package/dist/foundation/process-containment/index.d.ts +4 -4
  141. package/dist/foundation/process-containment/index.js +3 -3
  142. package/dist/foundation/process-containment/native-process-inspector.d.ts +2 -1
  143. package/dist/foundation/process-containment/native-process-inspector.js +10 -10
  144. package/dist/foundation/release/automatic-update.d.ts +37 -0
  145. package/dist/foundation/release/automatic-update.js +265 -0
  146. package/dist/foundation/release/bootstrap.d.ts +7 -9
  147. package/dist/foundation/release/bootstrap.js +107 -24
  148. package/dist/foundation/release/cohort-state.d.ts +1 -1
  149. package/dist/foundation/release/cohort-state.js +1 -1
  150. package/dist/foundation/release/dependency-certification.js +54 -19
  151. package/dist/foundation/release/early-accent.d.ts +12 -0
  152. package/dist/foundation/release/early-accent.js +59 -0
  153. package/dist/foundation/release/index.d.ts +2 -2
  154. package/dist/foundation/release/index.js +2 -2
  155. package/dist/foundation/release/latest-release.d.ts +24 -2
  156. package/dist/foundation/release/latest-release.js +51 -1
  157. package/dist/foundation/release/progress-palette.generated.d.ts +137 -3
  158. package/dist/foundation/release/progress-palette.generated.js +137 -3
  159. package/dist/foundation/release/release-gc.d.ts +3 -0
  160. package/dist/foundation/release/release-gc.js +59 -8
  161. package/dist/foundation/release/release-store.d.ts +12 -0
  162. package/dist/foundation/release/release-store.js +124 -2
  163. package/dist/foundation/release/update-execution-lease.d.ts +48 -0
  164. package/dist/foundation/release/update-execution-lease.js +161 -0
  165. package/dist/foundation/release/update.d.ts +12 -7
  166. package/dist/foundation/release/update.js +281 -196
  167. package/dist/foundation/resident-tabs/bounded-host-command.d.ts +18 -0
  168. package/dist/foundation/resident-tabs/bounded-host-command.js +39 -0
  169. package/dist/foundation/resident-tabs/bridge-client.d.ts +70 -0
  170. package/dist/foundation/resident-tabs/bridge-client.js +321 -0
  171. package/dist/foundation/resident-tabs/doctor.d.ts +28 -0
  172. package/dist/foundation/resident-tabs/doctor.js +166 -0
  173. package/dist/foundation/resident-tabs/draft-checkpoint.d.ts +27 -0
  174. package/dist/foundation/resident-tabs/draft-checkpoint.js +145 -0
  175. package/dist/foundation/resident-tabs/ensure-terminal-host.d.ts +36 -0
  176. package/dist/foundation/resident-tabs/ensure-terminal-host.js +151 -0
  177. package/dist/foundation/resident-tabs/fault-injection.d.ts +8 -0
  178. package/dist/foundation/resident-tabs/fault-injection.js +26 -0
  179. package/dist/foundation/resident-tabs/fixture-control.d.ts +7 -0
  180. package/dist/foundation/resident-tabs/fixture-control.js +35 -0
  181. package/dist/foundation/resident-tabs/host-entry.d.ts +1 -0
  182. package/dist/foundation/resident-tabs/host-entry.js +17 -0
  183. package/dist/foundation/resident-tabs/index.d.ts +12 -0
  184. package/dist/foundation/resident-tabs/index.js +6 -0
  185. package/dist/foundation/resident-tabs/maintenance.d.ts +39 -0
  186. package/dist/foundation/resident-tabs/maintenance.js +75 -0
  187. package/dist/foundation/resident-tabs/progress-observation-schema.d.ts +34 -0
  188. package/dist/foundation/resident-tabs/progress-observation-schema.js +1 -0
  189. package/dist/foundation/resident-tabs/progress-observation.d.ts +4 -0
  190. package/dist/foundation/resident-tabs/progress-observation.js +150 -0
  191. package/dist/foundation/resident-tabs/prompt-journal.d.ts +63 -0
  192. package/dist/foundation/resident-tabs/prompt-journal.js +213 -0
  193. package/dist/foundation/resident-tabs/protocol.d.ts +12 -0
  194. package/dist/foundation/resident-tabs/protocol.js +195 -0
  195. package/dist/foundation/resident-tabs/recovery.d.ts +26 -0
  196. package/dist/foundation/resident-tabs/recovery.js +205 -0
  197. package/dist/foundation/resident-tabs/release-holds.d.ts +28 -0
  198. package/dist/foundation/resident-tabs/release-holds.js +75 -0
  199. package/dist/foundation/resident-tabs/routes.d.ts +5 -0
  200. package/dist/foundation/resident-tabs/routes.js +5 -0
  201. package/dist/foundation/resident-tabs/routing.d.ts +11 -0
  202. package/dist/foundation/resident-tabs/routing.js +10 -0
  203. package/dist/foundation/resident-tabs/session-sync.d.ts +14 -0
  204. package/dist/foundation/resident-tabs/session-sync.js +37 -0
  205. package/dist/foundation/resident-tabs/settings.d.ts +12 -0
  206. package/dist/foundation/resident-tabs/settings.js +58 -0
  207. package/dist/foundation/resident-tabs/terminal-host-artifact.d.ts +14 -0
  208. package/dist/foundation/resident-tabs/terminal-host-artifact.js +78 -0
  209. package/dist/foundation/resident-tabs/zip-archive.d.ts +9 -0
  210. package/dist/foundation/resident-tabs/zip-archive.js +56 -0
  211. package/dist/foundation/session-writer-lock/index.d.ts +30 -0
  212. package/dist/foundation/session-writer-lock/index.js +203 -0
  213. package/dist/foundation/startup/startup-descriptor.js +2 -2
  214. package/dist/foundation/terminal-cleanup/index.d.ts +1 -1
  215. package/dist/foundation/terminal-cleanup/index.js +1 -1
  216. package/dist/foundation/terminal-cleanup/terminal-reset.d.ts +6 -0
  217. package/dist/foundation/terminal-cleanup/terminal-reset.js +6 -0
  218. package/dist/integrations/pi/components/editor-interaction.d.ts +2 -0
  219. package/dist/integrations/pi/components/modal-frame.d.ts +17 -1
  220. package/dist/integrations/pi/components/modal-frame.js +48 -9
  221. package/dist/integrations/pi/components/models-dialog.js +4 -52
  222. package/dist/integrations/pi/components/owned-editor-ux.d.ts +6 -1
  223. package/dist/integrations/pi/components/owned-editor-ux.js +90 -6
  224. package/dist/integrations/pi/components/resources/builtin-themes.d.ts +4 -4
  225. package/dist/integrations/pi/components/resources/builtin-themes.js +4 -4
  226. package/dist/integrations/pi/components/share-operation-dialog.d.ts +2 -0
  227. package/dist/integrations/pi/components/share-operation-dialog.js +2 -1
  228. package/dist/integrations/pi/components/shell-editor-autocomplete.js +58 -36
  229. package/dist/integrations/pi/components/shell-extension-ui.js +79 -60
  230. package/dist/integrations/pi/components/shell-footer-status.d.ts +1 -1
  231. package/dist/integrations/pi/components/shell-footer-status.js +21 -5
  232. package/dist/integrations/pi/components/shell-hotkey-sections.js +1 -1
  233. package/dist/integrations/pi/components/shell-presenters-info.d.ts +5 -2
  234. package/dist/integrations/pi/components/shell-presenters-info.js +18 -4
  235. package/dist/integrations/pi/components/shell-presenters-transcript.js +4 -1
  236. package/dist/integrations/pi/components/shell-selectors-dialogs.js +5 -1
  237. package/dist/integrations/pi/components/shell-shared-facade.d.ts +12 -1
  238. package/dist/integrations/pi/components/skills-dialog.js +2 -2
  239. package/dist/integrations/pi/components/upstream/adjacent/core/keybindings.d.ts +1 -1
  240. package/dist/integrations/pi/components/upstream/adjacent/core/keybindings.js +17 -4
  241. package/dist/integrations/pi/components/upstream/assets/earendil-image.json +2 -2
  242. package/dist/integrations/pi/components/upstream/components/countdown-timer.d.ts +1 -1
  243. package/dist/integrations/pi/components/upstream/components/earendil-announcement.js +1 -1
  244. package/dist/integrations/pi/components/upstream/components/extension-editor.d.ts +1 -1
  245. package/dist/integrations/pi/components/upstream/components/extension-editor.js +1 -1
  246. package/dist/integrations/pi/components/upstream/components/extension-input.js +1 -1
  247. package/dist/integrations/pi/components/upstream/components/extension-selector.js +1 -1
  248. package/dist/integrations/pi/components/upstream/components/mermaid.js +1 -1
  249. package/dist/integrations/pi/components/upstream/components/owned-editor.d.ts +8 -6
  250. package/dist/integrations/pi/components/upstream/components/owned-editor.js +16 -9
  251. package/dist/integrations/pi/components/upstream/components/pi-logo.js +1 -1
  252. package/dist/integrations/pi/components/upstream/components/scoped-models-selector.d.ts +4 -4
  253. package/dist/integrations/pi/components/upstream/components/scoped-models-selector.js +2 -2
  254. package/dist/integrations/pi/components/upstream/components/session-footer.d.ts +2 -1
  255. package/dist/integrations/pi/components/upstream/components/session-footer.js +31 -25
  256. package/dist/integrations/pi/components/upstream/components/session-selector-search.js +1 -1
  257. package/dist/integrations/pi/components/upstream/components/session-selector.js +8 -7
  258. package/dist/integrations/pi/components/upstream/components/skill-invocation-message.d.ts +1 -1
  259. package/dist/integrations/pi/components/upstream/components/skill-invocation-message.js +1 -1
  260. package/dist/integrations/pi/components/upstream/components/status-indicator.d.ts +2 -2
  261. package/dist/integrations/pi/components/upstream/components/status-indicator.js +3 -3
  262. package/dist/integrations/pi/components/upstream/components/themed-text.d.ts +1 -1
  263. package/dist/integrations/pi/components/upstream/components/themed-text.js +1 -1
  264. package/dist/integrations/pi/components/upstream/components/thinking-selector.d.ts +8 -7
  265. package/dist/integrations/pi/components/upstream/components/thinking-selector.js +10 -9
  266. package/dist/integrations/pi/components/upstream/components/tool-execution.d.ts +2 -6
  267. package/dist/integrations/pi/components/upstream/components/tool-execution.js +103 -101
  268. package/dist/integrations/pi/components/upstream/components/tree-selector.d.ts +9 -9
  269. package/dist/integrations/pi/components/upstream/components/tree-selector.js +13 -21
  270. package/dist/integrations/pi/components/upstream/components/trust-selector.js +1 -1
  271. package/dist/integrations/pi/components/upstream/external-editor.js +1 -1
  272. package/dist/integrations/pi/components/upstream/history/editor-core.d.ts +2 -2
  273. package/dist/integrations/pi/components/upstream/history/editor-core.js +7 -5
  274. package/dist/integrations/pi/components/upstream/history/kill-ring.d.ts +1 -1
  275. package/dist/integrations/pi/components/upstream/history/kill-ring.js +1 -1
  276. package/dist/integrations/pi/components/upstream/history/printable-key.js +1 -1
  277. package/dist/integrations/pi/components/upstream/history/text-helpers.js +1 -1
  278. package/dist/integrations/pi/components/upstream/history/undo-stack.d.ts +1 -1
  279. package/dist/integrations/pi/components/upstream/history/undo-stack.js +1 -1
  280. package/dist/integrations/pi/components/upstream/history/word-navigation.js +1 -1
  281. package/dist/integrations/pi/components/upstream/model-search.d.ts +1 -1
  282. package/dist/integrations/pi/components/upstream/program-status-reporter.d.ts +1 -1
  283. package/dist/integrations/pi/components/upstream/theme/theme-controller.d.ts +1 -1
  284. package/dist/integrations/pi/components/upstream/theme/theme.d.ts +5 -0
  285. package/dist/integrations/pi/components/upstream/theme/theme.js +29 -2
  286. package/dist/integrations/pi/engine/adapter.d.ts +5 -77
  287. package/dist/integrations/pi/engine/adapter.js +95 -394
  288. package/dist/integrations/pi/engine/command-dispatch.d.ts +13 -0
  289. package/dist/integrations/pi/engine/command-dispatch.js +57 -0
  290. package/dist/integrations/pi/engine/host.js +2 -2
  291. package/dist/integrations/pi/engine/offline-settings-port.d.ts +23 -0
  292. package/dist/integrations/pi/engine/offline-settings-port.js +53 -0
  293. package/dist/integrations/pi/engine/pi-settings-metadata.json +14 -2
  294. package/dist/integrations/pi/engine/ports.d.ts +56 -0
  295. package/dist/integrations/pi/engine/ports.js +93 -0
  296. package/dist/integrations/pi/engine/prompt-suggestions.d.ts +1 -0
  297. package/dist/integrations/pi/engine/prompt-suggestions.js +40 -0
  298. package/dist/integrations/pi/engine/resources/changelog.json +4 -4
  299. package/dist/integrations/pi/engine/runtime-integration.js +102 -29
  300. package/dist/integrations/pi/engine/session-runtime.d.ts +0 -6
  301. package/dist/integrations/pi/engine/session-runtime.js +13 -5
  302. package/dist/integrations/pi/engine/session-selection.d.ts +3 -0
  303. package/dist/integrations/pi/engine/session-selection.js +45 -9
  304. package/dist/integrations/pi/engine/settings-bridge.d.ts +5 -0
  305. package/dist/integrations/pi/engine/settings-bridge.js +15 -0
  306. package/dist/integrations/pi/engine/settings-port.js +11 -15
  307. package/dist/integrations/pi/engine/view-state.d.ts +42 -0
  308. package/dist/integrations/pi/engine/view-state.js +126 -0
  309. package/dist/integrations/pi/engine/workflow-contexts.js +10 -1
  310. package/dist/integrations/pi/engine/workflow-runner.js +73 -4
  311. package/dist/integrations/pi/engine/workflow-support.d.ts +12 -0
  312. package/dist/integrations/pi/engine/workflow-support.js +36 -0
  313. package/dist/integrations/pi/engine/workflows.d.ts +3 -1
  314. package/dist/integrations/pi/engine/workflows.js +1 -0
  315. package/dist/integrations/pi/startup-public.js +257 -310
  316. package/dist/integrations/pi/startup-public.manifest.json +564 -440
  317. package/dist/integrations/pi/tui-runtime/adapter.d.ts +6 -0
  318. package/dist/integrations/pi/tui-runtime/adapter.js +32 -1
  319. package/dist/integrations/pi/tui-runtime/contracts.d.ts +5 -0
  320. package/dist/integrations/pi/tui-runtime/damage-aware-terminal.d.ts +12 -1
  321. package/dist/integrations/pi/tui-runtime/damage-aware-terminal.js +31 -2
  322. package/dist/native/darwin-arm64/manifest.json +10 -7
  323. package/dist/native/darwin-arm64/process-guardian.node +0 -0
  324. package/dist/native/darwin-arm64/terminal-host-THIRD-PARTY-NOTICES.txt +10500 -0
  325. package/dist/native/darwin-arm64/terminal-host.manifest.json +46 -0
  326. package/dist/native/darwin-arm64/terminal-host.node +0 -0
  327. package/dist/native/darwin-x64/manifest.json +23 -0
  328. package/dist/native/darwin-x64/process-guardian.node +0 -0
  329. package/dist/native/darwin-x64/terminal-host-THIRD-PARTY-NOTICES.txt +10737 -0
  330. package/dist/native/darwin-x64/terminal-host.manifest.json +46 -0
  331. package/dist/native/darwin-x64/terminal-host.node +0 -0
  332. package/dist/native/linux-x64/manifest.json +10 -7
  333. package/dist/native/linux-x64/process-guardian.node +0 -0
  334. package/dist/native/linux-x64/terminal-host-THIRD-PARTY-NOTICES.txt +11226 -0
  335. package/dist/native/linux-x64/terminal-host.manifest.json +46 -0
  336. package/dist/native/linux-x64/terminal-host.node +0 -0
  337. package/dist/native/win32-x64/manifest.json +10 -7
  338. package/dist/native/win32-x64/process-guardian.node +0 -0
  339. package/dist/native/win32-x64/terminal-host-THIRD-PARTY-NOTICES.txt +10757 -0
  340. package/dist/native/win32-x64/terminal-host.manifest.json +46 -0
  341. package/dist/native/win32-x64/terminal-host.node +0 -0
  342. package/dist/product-identity.d.ts +3 -3
  343. package/dist/product-identity.js +4 -4
  344. package/dist/product-identity.json +16 -2
  345. package/dist/runtime-payload-inventory.json +6330 -6677
  346. package/dist/ui/apps/host.d.ts +2 -0
  347. package/dist/ui/apps/host.js +7 -1
  348. package/dist/ui/components/dialog-panel.js +35 -30
  349. package/dist/ui/components/index.d.ts +2 -2
  350. package/dist/ui/components/index.js +1 -1
  351. package/dist/ui/components/line-input.d.ts +4 -1
  352. package/dist/ui/components/line-input.js +3 -1
  353. package/dist/ui/components/prompt-input.d.ts +11 -8
  354. package/dist/ui/components/prompt-input.js +15 -13
  355. package/dist/ui/components/selection-copy.d.ts +2 -0
  356. package/dist/ui/components/selection-copy.js +13 -0
  357. package/dist/ui/components/spans.js +2 -2
  358. package/dist/ui/components/submitted-prompt.d.ts +9 -6
  359. package/dist/ui/components/submitted-prompt.js +20 -12
  360. package/dist/ui/components/surface.js +4 -2
  361. package/dist/ui/components/text.d.ts +3 -6
  362. package/dist/ui/components/text.js +6 -8
  363. package/dist/ui/components/transcript-viewport.d.ts +9 -2
  364. package/dist/ui/components/transcript-viewport.js +176 -55
  365. package/dist/ui/settings/declarations.d.ts +90 -16
  366. package/dist/ui/settings/declarations.js +67 -14
  367. package/dist/ui/settings/early-accent.d.ts +81 -0
  368. package/dist/ui/settings/early-accent.js +50 -0
  369. package/dist/ui/settings/index.d.ts +4 -2
  370. package/dist/ui/settings/index.js +2 -1
  371. package/dist/ui/settings/manager.d.ts +16 -3
  372. package/dist/ui/settings/manager.js +122 -33
  373. package/dist/ui/settings/migrations.d.ts +6 -0
  374. package/dist/ui/settings/migrations.js +73 -0
  375. package/dist/ui/settings/profile-document.d.ts +26 -0
  376. package/dist/ui/settings/profile-document.js +164 -0
  377. package/dist/ui/settings/progress-palette.generated.d.ts +139 -0
  378. package/dist/ui/settings/progress-palette.generated.js +139 -0
  379. package/dist/ui/settings/sections.d.ts +4 -0
  380. package/dist/ui/settings/sections.js +9 -3
  381. package/docs/architecture/boundaries.md +24 -9
  382. package/docs/architecture/evidence/resident-tabs/linux-x64.md +37 -0
  383. package/docs/architecture/evidence/resident-tabs/macos-arm64.md +36 -0
  384. package/docs/architecture/evidence/resident-tabs/macos-x64.md +35 -0
  385. package/docs/architecture/evidence/resident-tabs/windows-x64.md +36 -0
  386. package/docs/architecture/internal-naming.md +3 -1
  387. package/docs/architecture/process-guardian-provenance.md +18 -10
  388. package/docs/architecture/project-structure.md +8 -0
  389. package/docs/architecture/resident-tabs-requirements.md +18 -0
  390. package/docs/architecture/resident-tabs.md +648 -0
  391. package/docs/architecture/response-copy-delivery.md +1 -1
  392. package/docs/architecture/terminal-host-proof-gate.md +2 -0
  393. package/docs/architecture/terminal-host-provenance.md +16 -4
  394. package/docs/architecture/tool-image-presentation.md +2 -1
  395. package/docs/architecture/toolchain.md +11 -9
  396. package/docs/ci-release-runbook.md +14 -7
  397. package/docs/features/launch-profiles.md +11 -8
  398. package/docs/features/prompt-history.md +41 -20
  399. package/docs/manual-resident-tabs-acceptance.md +51 -0
  400. package/docs/openspec-archive-automation.md +49 -22
  401. package/docs/validation.md +49 -9
  402. package/package.json +19 -6
  403. package/dist/foundation/process-containment/darwin-process-inspector.d.ts +0 -5
  404. package/dist/foundation/process-containment/darwin-process-inspector.js +0 -7
  405. package/dist/foundation/process-containment/native-guardian-containment.js +0 -152
  406. package/dist/foundation/process-containment/windows-process-inspector.d.ts +0 -19
  407. package/dist/foundation/process-containment/windows-process-inspector.js +0 -56
  408. package/dist/native/darwin-arm64/process-guardian +0 -0
  409. package/dist/native/linux-x64/process-guardian +0 -0
  410. package/dist/native/win32-x64/process-guardian.exe +0 -0
@@ -0,0 +1,30 @@
1
+ import { existsSync } from "node:fs";
2
+ export interface NativeLock {
3
+ readonly bound: boolean;
4
+ bindCreated(path: string): void;
5
+ release(): void;
6
+ }
7
+ export interface LockBackend {
8
+ acquire(path: string): NativeLock;
9
+ }
10
+ /** Reports that a canonical session identity already has a live writer. */
11
+ export declare class SessionWriterConflict extends Error {
12
+ readonly path: string;
13
+ readonly holderKind: string;
14
+ constructor(path: string, holderKind?: string);
15
+ }
16
+ export interface SessionWriterHandle {
17
+ readonly path: string;
18
+ readonly bound: boolean;
19
+ bind(createdPath?: string): void;
20
+ release(): void;
21
+ }
22
+ /** Security: a release that carries its own terminal-host addon never loads one chosen by cwd. */
23
+ export declare function nativeCandidates(moduleUrl?: string, env?: NodeJS.ProcessEnv, cwd?: string, exists?: typeof existsSync): string[];
24
+ export declare function acquireExisting(path: string): SessionWriterHandle;
25
+ export declare function reserveNew(parent: string, name: string): SessionWriterHandle;
26
+ export declare function acquireSessionWriter(path: string): SessionWriterHandle;
27
+ export declare function bind(handle: SessionWriterHandle, createdPath?: string): void;
28
+ export declare function release(handle: SessionWriterHandle): void;
29
+ /** Test-only backend seam; passing undefined restores native discovery. */
30
+ export declare function setSessionWriterLockBackendForTest(value: LockBackend | undefined): void;
@@ -0,0 +1,203 @@
1
+ import { closeSync, existsSync, mkdirSync, openSync, readFileSync, realpathSync, rmSync, statSync, writeFileSync } from "node:fs";
2
+ import { createRequire } from "node:module";
3
+ import { tmpdir } from "node:os";
4
+ import { basename, dirname, join, resolve } from "node:path";
5
+ import { fileURLToPath } from "node:url";
6
+ import { createHash } from "node:crypto";
7
+ import { PRODUCT_IDENTITY } from "../../product-identity.js";
8
+ /** Reports that a canonical session identity already has a live writer. */
9
+ export class SessionWriterConflict extends Error {
10
+ path;
11
+ holderKind;
12
+ constructor(path, holderKind = "another A1 process") {
13
+ super(`session is open in ${holderKind}`);
14
+ this.name = "SessionWriterConflict";
15
+ this.path = path;
16
+ this.holderKind = holderKind;
17
+ }
18
+ }
19
+ let backendOverride;
20
+ let cachedBackend;
21
+ /** Security: a release that carries its own terminal-host addon never loads one chosen by cwd. */
22
+ export function nativeCandidates(moduleUrl = import.meta.url, env = process.env, cwd = process.cwd(), exists = existsSync) {
23
+ const addon = `${PRODUCT_IDENTITY.artifacts.terminalHostAddon}.node`;
24
+ // Invariant: this module sits at dist/foundation/session-writer-lock/ inside the release root.
25
+ const own = resolve(fileURLToPath(new URL("../../../", moduleUrl)), "dist", "native", `${process.platform}-${process.arch}`, addon);
26
+ const override = env[PRODUCT_IDENTITY.environment.developmentInstanceId]
27
+ ? env[PRODUCT_IDENTITY.environment.terminalHostPath]?.trim() || undefined
28
+ : undefined;
29
+ const local = exists(own)
30
+ ? [own]
31
+ : [resolve(cwd, "dist", "native", `${process.platform}-${process.arch}`, addon), resolve(cwd, ".artifacts", "terminal-host", addon)];
32
+ return override ? [override, ...local] : local;
33
+ }
34
+ function loadNativeBackend() {
35
+ const require = createRequire(import.meta.url);
36
+ for (const candidate of nativeCandidates()) {
37
+ if (!existsSync(candidate))
38
+ continue;
39
+ try {
40
+ const loaded = require(candidate);
41
+ if (loaded.SessionLock?.acquire)
42
+ return loaded.SessionLock;
43
+ }
44
+ catch {
45
+ // Compatibility: an addon for another Node ABI is unusable; try the next location.
46
+ }
47
+ }
48
+ return undefined;
49
+ }
50
+ function processIsLive(pid) {
51
+ try {
52
+ process.kill(pid, 0);
53
+ return true;
54
+ }
55
+ catch {
56
+ return false;
57
+ }
58
+ }
59
+ /** Development fallback. Installed releases carry the verified Node-API lock resolved above. */
60
+ function portableBackend() {
61
+ const root = join(tmpdir(), "a1-session-writer-locks");
62
+ mkdirSync(root, { recursive: true, mode: 0o700 });
63
+ const authorityPath = (kind, key) => join(root, `${createHash("sha256").update(`${kind}\0${key}`).digest("hex")}.lock`);
64
+ const locationKey = (path) => `${realpathSync.native(dirname(path))}\0${process.platform === "win32" ? basename(path).toLowerCase() : basename(path)}`;
65
+ const identityKey = (path) => {
66
+ const physical = realpathSync.native(path);
67
+ const metadata = statSync(physical, { bigint: true });
68
+ return `${metadata.dev}:${metadata.ino}`;
69
+ };
70
+ const acquireAuthority = (path) => {
71
+ for (let attempt = 0; attempt < 2; attempt += 1) {
72
+ try {
73
+ const descriptor = openSync(path, "wx", 0o600);
74
+ writeFileSync(descriptor, JSON.stringify({ pid: process.pid, kind: process.env.A1_TAB_ID ? "resident tab" : "another A1 process" }));
75
+ closeSync(descriptor);
76
+ return;
77
+ }
78
+ catch (error) {
79
+ if (attempt === 0) {
80
+ try {
81
+ const record = JSON.parse(readFileSync(path, "utf8"));
82
+ if (typeof record.pid === "number" && !processIsLive(record.pid)) {
83
+ rmSync(path, { force: true });
84
+ continue;
85
+ }
86
+ }
87
+ catch {
88
+ // Security: malformed or racing lock evidence remains authoritative and fails closed.
89
+ }
90
+ }
91
+ throw error;
92
+ }
93
+ }
94
+ };
95
+ return {
96
+ acquire(requested) {
97
+ const absolute = resolve(requested);
98
+ const location = authorityPath("location", locationKey(absolute));
99
+ acquireAuthority(location);
100
+ let identity;
101
+ let identityAcquired = false;
102
+ let bound = false;
103
+ try {
104
+ if (existsSync(absolute)) {
105
+ const key = identityKey(absolute);
106
+ identity = authorityPath("identity", key);
107
+ acquireAuthority(identity);
108
+ identityAcquired = true;
109
+ if (identityKey(absolute) !== key) {
110
+ throw new Error("session identity changed while its writer lock was acquired");
111
+ }
112
+ rmSync(location, { force: true });
113
+ bound = true;
114
+ }
115
+ }
116
+ catch (error) {
117
+ rmSync(location, { force: true });
118
+ if (identityAcquired && identity !== undefined)
119
+ rmSync(identity, { force: true });
120
+ throw error;
121
+ }
122
+ let released = false;
123
+ return {
124
+ get bound() { return bound; },
125
+ bindCreated(created) {
126
+ if (bound || resolve(created) !== absolute || !existsSync(absolute)) {
127
+ throw new Error("created session does not match its reservation");
128
+ }
129
+ const key = identityKey(absolute);
130
+ identity = authorityPath("identity", key);
131
+ acquireAuthority(identity);
132
+ if (identityKey(absolute) !== key) {
133
+ rmSync(identity, { force: true });
134
+ identity = undefined;
135
+ throw new Error("created session identity changed during bind");
136
+ }
137
+ rmSync(location, { force: true });
138
+ bound = true;
139
+ },
140
+ release() {
141
+ if (released)
142
+ throw new Error("session lock was already released");
143
+ released = true;
144
+ rmSync(bound ? identity : location, { force: true });
145
+ },
146
+ };
147
+ },
148
+ };
149
+ }
150
+ function backend() {
151
+ return backendOverride ?? (cachedBackend ??= loadNativeBackend() ?? portableBackend());
152
+ }
153
+ function acquire(path) {
154
+ const absolute = resolve(path);
155
+ let lock;
156
+ try {
157
+ lock = backend().acquire(absolute);
158
+ }
159
+ catch {
160
+ throw new SessionWriterConflict(absolute, process.env.A1_TAB_ID ? "a resident tab" : "another A1 process");
161
+ }
162
+ let released = false;
163
+ return {
164
+ path: absolute,
165
+ get bound() { return lock.bound; },
166
+ bind(createdPath = absolute) {
167
+ if (released)
168
+ throw new Error("session writer lock was released");
169
+ if (!lock.bound)
170
+ lock.bindCreated(resolve(createdPath));
171
+ },
172
+ release() {
173
+ if (released)
174
+ return;
175
+ released = true;
176
+ lock.release();
177
+ },
178
+ };
179
+ }
180
+ export function acquireExisting(path) {
181
+ if (!existsSync(path))
182
+ throw new Error(`session file does not exist: ${path}`);
183
+ return acquire(path);
184
+ }
185
+ export function reserveNew(parent, name) {
186
+ if (!name || basename(name) !== name)
187
+ throw new Error("session reservation requires one file name");
188
+ return acquire(join(parent, name));
189
+ }
190
+ export function acquireSessionWriter(path) {
191
+ return acquire(path);
192
+ }
193
+ export function bind(handle, createdPath) {
194
+ handle.bind(createdPath);
195
+ }
196
+ export function release(handle) {
197
+ handle.release();
198
+ }
199
+ /** Test-only backend seam; passing undefined restores native discovery. */
200
+ export function setSessionWriterLockBackendForTest(value) {
201
+ backendOverride = value;
202
+ cachedBackend = undefined;
203
+ }
@@ -10,7 +10,7 @@ export const STARTUP_DESCRIPTOR = Object.freeze({
10
10
  ],
11
11
  "generatedArtifact": {
12
12
  "path": "dist/integrations/pi/startup-public.js",
13
- "sha256": "62906f5056fabed7a83b97843e3a407c955103ab2bb7849e6713026fe7c760a9"
13
+ "sha256": "e065933fe374d7953c5aac0ff1735fa47d119ab97551e955c2a65e8c2df667eb"
14
14
  },
15
15
  "dependencyLayerIdentity": {
16
16
  "source": "A1_RELEASE_LAYERS",
@@ -19,7 +19,7 @@ export const STARTUP_DESCRIPTOR = Object.freeze({
19
19
  "compileCacheNamespace": {
20
20
  "strategy": "node-abi-version-and-ordered-layer-sha256-v1"
21
21
  },
22
- "identity": "089bcfdc784e7d61cd028ede3b5546864ab49e6329e1296ed55afacb16bcb077"
22
+ "identity": "5c1afab4657c251b840e042279290bd1fa03ce608bc81bc6e7eaf8d332486eef"
23
23
  });
24
24
 
25
25
  export function loadDeclaredStartupGraph() {
@@ -1,3 +1,3 @@
1
- export { EMERGENCY_TERMINAL_RESET, boundedCleanup, restoreAfterOwnedExit, restoreProcessTerminal } from "./terminal-reset.js";
1
+ export { CLEAR_EXIT_INTERVAL_MS, EMERGENCY_TERMINAL_RESET, RESIDENT_DETACH_INTERVAL_MS, boundedCleanup, restoreAfterOwnedExit, restoreProcessTerminal } from "./terminal-reset.js";
2
2
  export { installFatalExit, writeFatalDiagnostic } from "./fatal-exit.js";
3
3
  export type { FatalExitOptions } from "./fatal-exit.js";
@@ -1,2 +1,2 @@
1
- export { EMERGENCY_TERMINAL_RESET, boundedCleanup, restoreAfterOwnedExit, restoreProcessTerminal } from "./terminal-reset.js";
1
+ export { CLEAR_EXIT_INTERVAL_MS, EMERGENCY_TERMINAL_RESET, RESIDENT_DETACH_INTERVAL_MS, boundedCleanup, restoreAfterOwnedExit, restoreProcessTerminal } from "./terminal-reset.js";
2
2
  export { installFatalExit, writeFatalDiagnostic } from "./fatal-exit.js";
@@ -1,3 +1,9 @@
1
+ export declare const CLEAR_EXIT_INTERVAL_MS = 500;
2
+ /**
3
+ * How long a first `Ctrl+C` keeps the resident attach client's detach chord armed. It matches the
4
+ * owned dialogs' interrupt chord so an unhurried double press leaves resident tabs from any tab.
5
+ */
6
+ export declare const RESIDENT_DETACH_INTERVAL_MS = 1500;
1
7
  export declare const EMERGENCY_TERMINAL_RESET: string;
2
8
  export declare function restoreProcessTerminal(): void;
3
9
  export declare function restoreAfterOwnedExit(ownsTerminal: boolean, code: number | null, signal: string | null, restore?: () => void): number;
@@ -1,4 +1,10 @@
1
1
  import { writeSync } from "node:fs";
2
+ export const CLEAR_EXIT_INTERVAL_MS = 500;
3
+ /**
4
+ * How long a first `Ctrl+C` keeps the resident attach client's detach chord armed. It matches the
5
+ * owned dialogs' interrupt chord so an unhurried double press leaves resident tabs from any tab.
6
+ */
7
+ export const RESIDENT_DETACH_INTERVAL_MS = 1_500;
2
8
  // Protocol: reset modes on both screens; setting keyboard flags to zero is idempotent,
3
9
  // unlike repeatedly popping a keyboard-protocol stack owned by a parent application.
4
10
  // Resetting parent-screen margins homes the cursor, so preserve its restored position.
@@ -25,6 +25,8 @@ export interface EditorRecallPort {
25
25
  };
26
26
  observe(listener: () => void): () => void;
27
27
  reset(): void;
28
+ /** Exit a recall browse cycle by restoring the unsent draft rather than keeping the recalled entry. */
29
+ restoreDraft?(): void;
28
30
  }
29
31
  export interface EditorSurface extends Pick<Editor, Exclude<keyof Editor, "setText" | "render" | "handleInput">> {
30
32
  setText(text: string): void;
@@ -1,5 +1,21 @@
1
- import { Container, type Component, type TUI } from "@earendil-works/pi-tui";
1
+ import { Container, Input, type Component, type Focusable, type TUI, type TuiMouseEvent, type TuiMouseEventResult } from "@earendil-works/pi-tui";
2
2
  export declare const PI_MODAL_CONTENT_PADDING_X = 1;
3
+ /** Paints the standard Pi Input prompt as a live-themed dialog-search marker. */
4
+ export declare function renderPiModalSearchInput(input: Input, width: number): string[];
5
+ /** Keeps Pi Input behavior and geometry while owning only its standard dialog-search presentation. */
6
+ export declare class PiModalSearchInput implements Component, Focusable {
7
+ #private;
8
+ constructor(input: Input);
9
+ get focused(): boolean;
10
+ set focused(value: boolean);
11
+ invalidate(): void;
12
+ render(width: number): string[];
13
+ handleMouse(event: TuiMouseEvent): TuiMouseEventResult | undefined;
14
+ }
15
+ /** Replaces one explicitly identified direct Input child with the standard search presentation. */
16
+ export declare function adoptPiModalSearchInput(container: Container, input: Component): PiModalSearchInput;
17
+ /** Adds one standard dialog-search presentation while callers retain the Input controller. */
18
+ export declare function addPiModalSearchInput(container: Container, input: Input): PiModalSearchInput;
3
19
  /** Adds the standard navigation/select/close footer before a dependency component's bottom rule. */
4
20
  export declare function addPiModalSelectFooter(container: Container): void;
5
21
  /** Owned cancellable operation frame with the canonical dialog close guidance. */
@@ -1,7 +1,47 @@
1
- import { CancellableLoader, Container, Spacer, Text } from "@earendil-works/pi-tui";
1
+ import { CancellableLoader, Container, Input, Spacer, Text, } from "@earendil-works/pi-tui";
2
+ import { DIALOG_CONTENT_PADDING_X, dialogFrameGeometry, insetDialogContent } from "../../../contracts/presentation/index.js";
2
3
  import { DynamicBorder } from "../startup-public.js";
3
4
  import { DIALOG_CLOSE_SHORTCUT_HINT, paintPiBorder, piTheme, renderPiModalShortcutHints } from "./theme.js";
4
- export const PI_MODAL_CONTENT_PADDING_X = 1;
5
+ export const PI_MODAL_CONTENT_PADDING_X = DIALOG_CONTENT_PADDING_X;
6
+ /** Paints the standard Pi Input prompt as a live-themed dialog-search marker. */
7
+ export function renderPiModalSearchInput(input, width) {
8
+ return input.render(width).map(row => {
9
+ if (row.length === 0)
10
+ return row;
11
+ if (!row.startsWith(">"))
12
+ throw new TypeError("modal search input does not use the standard prompt");
13
+ return `${piTheme().fg("accent", ">")}${row.slice(1)}`;
14
+ });
15
+ }
16
+ /** Keeps Pi Input behavior and geometry while owning only its standard dialog-search presentation. */
17
+ export class PiModalSearchInput {
18
+ #input;
19
+ constructor(input) {
20
+ this.#input = input;
21
+ }
22
+ get focused() { return this.#input.focused; }
23
+ set focused(value) { this.#input.focused = value; }
24
+ invalidate() { this.#input.invalidate(); }
25
+ render(width) { return renderPiModalSearchInput(this.#input, width); }
26
+ handleMouse(event) { return this.#input.handleMouse(event); }
27
+ }
28
+ /** Replaces one explicitly identified direct Input child with the standard search presentation. */
29
+ export function adoptPiModalSearchInput(container, input) {
30
+ if (!(input instanceof Input))
31
+ throw new TypeError("modal search component is not an Input");
32
+ const index = container.children.indexOf(input);
33
+ if (index === -1)
34
+ throw new TypeError("modal search Input is not a direct child");
35
+ const presentation = new PiModalSearchInput(input);
36
+ container.children.splice(index, 1, presentation);
37
+ return presentation;
38
+ }
39
+ /** Adds one standard dialog-search presentation while callers retain the Input controller. */
40
+ export function addPiModalSearchInput(container, input) {
41
+ const presentation = new PiModalSearchInput(input);
42
+ container.addChild(presentation);
43
+ return presentation;
44
+ }
5
45
  /** Adds the standard navigation/select/close footer before a dependency component's bottom rule. */
6
46
  export function addPiModalSelectFooter(container) {
7
47
  container.children.splice(container.children.length - 1, 0, new Text(renderPiModalShortcutHints([
@@ -67,21 +107,20 @@ export class PiModalFrame {
67
107
  this.#bottomRule.invalidate();
68
108
  }
69
109
  render(width) {
70
- const padding = Math.min(PI_MODAL_CONTENT_PADDING_X, Math.max(0, width));
71
- const contentWidth = Math.max(0, width - padding);
72
- const rows = [...this.#topRule.render(width)];
110
+ const geometry = dialogFrameGeometry(width);
111
+ const rows = [...this.#topRule.render(geometry.frameWidth)];
73
112
  for (const component of this.#content) {
74
113
  if (this.#fullWidthContent.has(component) || this.#preInsetContent.has(component)) {
75
- rows.push(...component.render(width));
114
+ rows.push(...component.render(geometry.frameWidth));
76
115
  }
77
116
  else if (component instanceof Spacer) {
78
- rows.push(...component.render(contentWidth));
117
+ rows.push(...component.render(geometry.contentWidth));
79
118
  }
80
119
  else {
81
- rows.push(...component.render(contentWidth).map(row => `${" ".repeat(padding)}${row}`));
120
+ rows.push(...component.render(geometry.contentWidth).map(row => insetDialogContent(row, geometry)));
82
121
  }
83
122
  }
84
- rows.push(...this.#bottomRule.render(width));
123
+ rows.push(...this.#bottomRule.render(geometry.frameWidth));
85
124
  return rows;
86
125
  }
87
126
  }
@@ -1,6 +1,6 @@
1
1
  import { Input, getKeybindings, matchesKey, truncateToWidth, visibleWidth, } from "@earendil-works/pi-tui";
2
2
  import { DynamicBorder } from "../startup-public.js";
3
- import { PiModalFrame } from "./modal-frame.js";
3
+ import { PiModalFrame, renderPiModalSearchInput } from "./modal-frame.js";
4
4
  import { DIALOG_CLOSE_SHORTCUT_HINT, paintPiBorder, piTheme, renderPiModalListRow, renderPiModalShortcutHints, } from "./theme.js";
5
5
  function renderHintsWithClose(entries, width) {
6
6
  const body = renderPiModalShortcutHints(entries.slice(0, -1));
@@ -13,7 +13,6 @@ function renderHintsWithClose(entries, width) {
13
13
  }
14
14
  const MAX_VISIBLE_ROWS = 10;
15
15
  const MODELS_TITLE = "Models";
16
- const REFRESHING_TITLE_MIN_DURATION_MS = 1_000;
17
16
  class ModalTitleLine {
18
17
  #text = "";
19
18
  setText(text) { this.#text = text; }
@@ -60,9 +59,6 @@ export class ModelsDialogComponent {
60
59
  #selectedIndex = 0;
61
60
  #preferredId;
62
61
  #refreshStatus;
63
- #refreshing = false;
64
- #refreshStartedAt;
65
- #refreshOutcomeTimer;
66
62
  #disposed = false;
67
63
  #focused = false;
68
64
  constructor(config, callbacks) {
@@ -71,10 +67,6 @@ export class ModelsDialogComponent {
71
67
  this.#scopeIds = [...config.scopeIds];
72
68
  this.#savedScopeIds = [...config.savedScopeIds];
73
69
  this.#filter = config.initialFilter ?? "all";
74
- if (config.refreshStatus !== undefined) {
75
- this.#refreshing = true;
76
- this.#refreshStartedAt = Date.now();
77
- }
78
70
  if (config.initialQuery)
79
71
  this.#input.setValue(config.initialQuery);
80
72
  this.#replaceModels(config.models);
@@ -114,38 +106,10 @@ export class ModelsDialogComponent {
114
106
  setRefreshStatus(message, kind) {
115
107
  if (this.#disposed)
116
108
  return;
117
- if (kind === "muted") {
118
- this.#clearRefreshOutcome();
119
- this.#refreshStatus = undefined;
120
- this.#refreshing = true;
121
- this.#refreshStartedAt = Date.now();
122
- return;
123
- }
124
- const visibleMs = this.#refreshStartedAt === undefined ? REFRESHING_TITLE_MIN_DURATION_MS : Date.now() - this.#refreshStartedAt;
125
- const remainingMs = Math.max(0, REFRESHING_TITLE_MIN_DURATION_MS - visibleMs);
126
- if (this.#refreshing && remainingMs > 0) {
127
- this.#clearRefreshOutcome();
128
- const timer = setTimeout(() => {
129
- if (this.#refreshOutcomeTimer !== timer)
130
- return;
131
- this.#refreshOutcomeTimer = undefined;
132
- if (this.#disposed)
133
- return;
134
- this.#applyRefreshOutcome(message, kind);
135
- this.#callbacks.requestRender();
136
- }, remainingMs);
137
- timer.unref?.();
138
- this.#refreshOutcomeTimer = timer;
139
- return;
140
- }
141
- this.#clearRefreshOutcome();
142
- this.#applyRefreshOutcome(message, kind);
109
+ this.#refreshStatus = kind === "warning" ? { message, kind } : undefined;
143
110
  }
144
111
  dispose() {
145
112
  this.#disposed = true;
146
- this.#clearRefreshOutcome();
147
- this.#refreshing = false;
148
- this.#refreshStartedAt = undefined;
149
113
  }
150
114
  invalidate() {
151
115
  this.#input.invalidate();
@@ -235,21 +199,9 @@ export class ModelsDialogComponent {
235
199
  render(width) {
236
200
  const theme = piTheme();
237
201
  this.#title.setText(theme.fg("accent", theme.bold(MODELS_TITLE))
238
- + (this.dirty ? theme.fg("warning", " (unsaved)") : "")
239
- + (this.#refreshing ? theme.fg("muted", " (refreshing)") : ""));
202
+ + (this.dirty ? theme.fg("warning", " (unsaved)") : ""));
240
203
  return this.#frame.render(width);
241
204
  }
242
- #applyRefreshOutcome(message, kind) {
243
- this.#refreshing = false;
244
- this.#refreshStartedAt = undefined;
245
- this.#refreshStatus = kind === "warning" ? { message, kind } : undefined;
246
- }
247
- #clearRefreshOutcome() {
248
- if (this.#refreshOutcomeTimer === undefined)
249
- return;
250
- clearTimeout(this.#refreshOutcomeTimer);
251
- this.#refreshOutcomeTimer = undefined;
252
- }
253
205
  #renderBody(width) {
254
206
  const theme = piTheme();
255
207
  const lines = [];
@@ -261,7 +213,7 @@ export class ModelsDialogComponent {
261
213
  + theme.fg("dim", " | ")
262
214
  + theme.fg(this.#filter === "scoped" ? "mdHeading" : "dim", "scoped"));
263
215
  push();
264
- for (const line of this.#input.render(width))
216
+ for (const line of renderPiModalSearchInput(this.#input, width))
265
217
  push(line);
266
218
  push();
267
219
  if (rows.length === 0) {
@@ -13,6 +13,7 @@ export interface OwnedEditorUxInterceptor {
13
13
  reset(): void;
14
14
  handlePointer?(event: OwnedEditorPointerEvent): boolean;
15
15
  hasSelection?(): boolean;
16
+ selectedText?(): string | undefined;
16
17
  ownsPointer?(): boolean;
17
18
  pasteClipboard?(): boolean;
18
19
  cancelPendingPastes?(): void;
@@ -40,15 +41,18 @@ export declare class OwnedEditorUxInterception {
40
41
  cancelPendingPastes(): void;
41
42
  handlePointer(event: OwnedEditorPointerEvent): boolean;
42
43
  hasSelection(): boolean;
44
+ selectedText(): string | undefined;
43
45
  ownsPointer(): boolean;
44
46
  pasteClipboard(): boolean;
45
47
  }
46
48
  export interface PromptSelectionUxOptions {
47
- readonly copyText: (text: string) => void;
49
+ readonly copyText: (text: string, cut: boolean) => void;
48
50
  readonly readClipboardContent: () => Promise<PiShellClipboardContent | null>;
49
51
  readonly beginClipboardPaste?: () => PiShellPasteReservation;
50
52
  readonly beginTextPaste?: (text: string) => PiShellPasteReservation;
51
53
  readonly deferTextPaste?: (text: string) => boolean;
54
+ /** False consumes every paste transport without changing editor text. */
55
+ readonly pasteEnabled?: boolean;
52
56
  readonly onPasteRejected?: (error: unknown) => void;
53
57
  readonly onPasteInput?: (bytes: number, phase: "framing" | "inserting" | "settled") => void;
54
58
  readonly transformPastedContent: (content: PiShellClipboardContent) => string;
@@ -70,5 +74,6 @@ export interface PromptSelectionUxOptions {
70
74
  };
71
75
  }
72
76
  export declare function createPromptSelectionInterceptor(editor: Editor, keybindings: KeybindingsManager, options: PromptSelectionUxOptions): OwnedEditorUxInterceptor;
77
+ export declare function editorInsertedText(data: string): string | undefined;
73
78
  /** Shares the existing atomic-aware body layout with prompt/menu composition. */
74
79
  export declare function editorVisualLineCount(editor: Editor, width: number): number | undefined;