@timurproko/a1 0.2.6 → 0.2.7-dev.1222

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (419) hide show
  1. package/README.md +41 -3
  2. package/bin/automatic-update.js +7 -0
  3. package/bin/cli.js +4 -0
  4. package/bin/guardian.js +5 -0
  5. package/bin/tab-launch-context.d.ts +27 -0
  6. package/bin/tab-launch-context.js +94 -0
  7. package/bin/ui.js +107 -59
  8. package/dist/app/session-shell/clipboard-diagnostics.js +1 -1
  9. package/dist/app/session-shell/dialog-coordinator.d.ts +42 -0
  10. package/dist/app/session-shell/dialog-coordinator.js +133 -0
  11. package/dist/app/session-shell/dock-chrome.d.ts +34 -0
  12. package/dist/app/session-shell/dock-chrome.js +109 -0
  13. package/dist/app/session-shell/exit-notice.d.ts +1 -1
  14. package/dist/app/session-shell/exit-notice.js +1 -1
  15. package/dist/app/session-shell/extension-surface.d.ts +30 -0
  16. package/dist/app/session-shell/extension-surface.js +105 -0
  17. package/dist/app/session-shell/helper-pool.d.ts +3 -5
  18. package/dist/app/session-shell/helper-pool.js +3 -5
  19. package/dist/app/session-shell/input-surface-switch.d.ts +36 -0
  20. package/dist/app/session-shell/input-surface-switch.js +85 -0
  21. package/dist/app/session-shell/login-interaction.d.ts +27 -0
  22. package/dist/app/session-shell/login-interaction.js +91 -0
  23. package/dist/app/session-shell/prompt-submission.d.ts +48 -0
  24. package/dist/app/session-shell/prompt-submission.js +276 -0
  25. package/dist/app/session-shell/resident-tab-coordinator.d.ts +38 -0
  26. package/dist/app/session-shell/resident-tab-coordinator.js +77 -0
  27. package/dist/app/session-shell/response-copy-helper.js +21 -6
  28. package/dist/app/session-shell/response-copy-protocol.d.ts +1 -1
  29. package/dist/app/session-shell/response-copy-transport.d.ts +16 -6
  30. package/dist/app/session-shell/response-copy-transport.js +69 -17
  31. package/dist/app/session-shell/session-concern.d.ts +22 -0
  32. package/dist/app/session-shell/session-concern.js +29 -0
  33. package/dist/app/session-shell/session-lifecycle.d.ts +29 -0
  34. package/dist/app/session-shell/session-lifecycle.js +49 -0
  35. package/dist/app/session-shell/session-shell-root.d.ts +42 -6
  36. package/dist/app/session-shell/session-shell-root.js +197 -908
  37. package/dist/app/session-shell/session-shell.d.ts +3 -8
  38. package/dist/app/session-shell/session-shell.js +327 -835
  39. package/dist/app/session-shell/session-viewport-controller.d.ts +2 -1
  40. package/dist/app/session-shell/session-viewport-controller.js +41 -38
  41. package/dist/app/session-shell/settings-bindings.d.ts +17 -0
  42. package/dist/app/session-shell/settings-bindings.js +91 -0
  43. package/dist/app/session-shell/shell-editor-factory.d.ts +27 -0
  44. package/dist/app/session-shell/shell-editor-factory.js +105 -0
  45. package/dist/app/session-shell/shell-host.d.ts +6 -0
  46. package/dist/app/session-shell/shell-host.js +34 -7
  47. package/dist/app/session-shell/shell-layout.d.ts +64 -0
  48. package/dist/app/session-shell/shell-layout.js +18 -0
  49. package/dist/app/session-shell/suggestion-surface.d.ts +25 -0
  50. package/dist/app/session-shell/suggestion-surface.js +63 -0
  51. package/dist/app/session-shell/transcript-document.d.ts +78 -0
  52. package/dist/app/session-shell/transcript-document.js +365 -0
  53. package/dist/app/session-shell/viewport-layout.d.ts +31 -0
  54. package/dist/app/session-shell/viewport-layout.js +160 -0
  55. package/dist/app/session-shell/workflow-output.d.ts +33 -0
  56. package/dist/app/session-shell/workflow-output.js +174 -0
  57. package/dist/app/session-shell/workflow-router.d.ts +25 -0
  58. package/dist/app/session-shell/workflow-router.js +39 -0
  59. package/dist/cli/dispatch.d.ts +11 -1
  60. package/dist/cli/dispatch.js +79 -5
  61. package/dist/cli/tabs-request.d.ts +7 -0
  62. package/dist/cli/tabs-request.js +1 -0
  63. package/dist/cli/tabs.d.ts +14 -0
  64. package/dist/cli/tabs.js +151 -0
  65. package/dist/cli/version-stats.js +38 -3
  66. package/dist/composition/owned-settings.d.ts +12 -0
  67. package/dist/composition/owned-settings.js +36 -0
  68. package/dist/composition/owned-ui.d.ts +27 -28
  69. package/dist/composition/owned-ui.js +207 -153
  70. package/dist/composition/reference-selection-options.d.ts +3 -0
  71. package/dist/composition/reference-selection-options.js +16 -0
  72. package/dist/composition/resident-tab-bridge.d.ts +25 -0
  73. package/dist/composition/resident-tab-bridge.js +180 -0
  74. package/dist/composition/session-backend.d.ts +19 -0
  75. package/dist/composition/session-backend.js +1 -0
  76. package/dist/composition/session-runtime-registry.d.ts +20 -0
  77. package/dist/composition/session-runtime-registry.js +85 -0
  78. package/dist/composition/settings-route-host.d.ts +16 -2
  79. package/dist/composition/settings-route-host.js +42 -17
  80. package/dist/composition/settings-search-input.d.ts +9 -0
  81. package/dist/composition/settings-search-input.js +61 -0
  82. package/dist/composition/startup-route.d.ts +32 -0
  83. package/dist/composition/startup-route.js +72 -0
  84. package/dist/composition/utility-tab.d.ts +28 -0
  85. package/dist/composition/utility-tab.js +244 -0
  86. package/dist/contracts/owned-ui/index.d.ts +1 -1
  87. package/dist/contracts/owned-ui/model.d.ts +3 -0
  88. package/dist/contracts/owned-ui/session-backend.d.ts +3 -0
  89. package/dist/contracts/owned-ui/session-workflows.d.ts +11 -4
  90. package/dist/contracts/presentation/index.d.ts +11 -0
  91. package/dist/contracts/presentation/index.js +12 -0
  92. package/dist/features/launch/development-launch.js +6 -0
  93. package/dist/features/launch/index.d.ts +1 -1
  94. package/dist/features/launch/intent.d.ts +3 -1
  95. package/dist/features/launch/intent.js +7 -4
  96. package/dist/features/launch/profile-paths.js +4 -0
  97. package/dist/features/owned-ui/plus-menu-dialog.d.ts +22 -0
  98. package/dist/features/owned-ui/plus-menu-dialog.js +84 -0
  99. package/dist/features/owned-ui/project-trust-dialog.d.ts +1 -1
  100. package/dist/features/owned-ui/project-trust-dialog.js +6 -8
  101. package/dist/features/owned-ui/project-trust-prompt.d.ts +1 -0
  102. package/dist/features/owned-ui/project-trust-prompt.js +7 -3
  103. package/dist/features/owned-ui/reference-document-selection.d.ts +30 -0
  104. package/dist/features/owned-ui/reference-document-selection.js +179 -0
  105. package/dist/features/owned-ui/reference-screen-app.d.ts +6 -1
  106. package/dist/features/owned-ui/reference-screen-app.js +51 -10
  107. package/dist/features/owned-ui/settings-app.d.ts +13 -2
  108. package/dist/features/owned-ui/settings-app.js +136 -97
  109. package/dist/features/owned-ui/settings-search-input.d.ts +29 -0
  110. package/dist/features/owned-ui/settings-search-input.js +1 -0
  111. package/dist/features/prompt-history/index.d.ts +1 -1
  112. package/dist/features/prompt-history/paths.d.ts +2 -1
  113. package/dist/features/prompt-history/paths.js +10 -2
  114. package/dist/features/prompt-history/service.d.ts +5 -0
  115. package/dist/features/prompt-history/service.js +1 -1
  116. package/dist/features/resident-tab/auto-name.d.ts +11 -0
  117. package/dist/features/resident-tab/auto-name.js +44 -0
  118. package/dist/features/resident-tab/index.d.ts +5 -0
  119. package/dist/features/resident-tab/index.js +7 -0
  120. package/dist/features/resident-tab/shortcut-bindings-file.d.ts +8 -0
  121. package/dist/features/resident-tab/shortcut-bindings-file.js +40 -0
  122. package/dist/features/resident-tab/shortcut-declarations.d.ts +13 -0
  123. package/dist/features/resident-tab/shortcut-declarations.js +26 -0
  124. package/dist/features/resident-tab/shortcut-projection.d.ts +29 -0
  125. package/dist/features/resident-tab/shortcut-projection.js +64 -0
  126. package/dist/features/resident-tab/status-deriver.d.ts +10 -0
  127. package/dist/features/resident-tab/status-deriver.js +12 -0
  128. package/dist/foundation/launch-context/index.d.ts +12 -0
  129. package/dist/foundation/launch-context/index.js +26 -0
  130. package/dist/foundation/launch-guardian/exit-watcher.d.ts +14 -0
  131. package/dist/foundation/launch-guardian/exit-watcher.js +94 -0
  132. package/dist/foundation/launch-guardian/main.d.ts +7 -1
  133. package/dist/foundation/launch-guardian/main.js +60 -7
  134. package/dist/foundation/lifecycle/session-repository-context.js +16 -2
  135. package/dist/foundation/process-containment/{native-guardian-containment.d.ts → addon-containment.d.ts} +7 -5
  136. package/dist/foundation/process-containment/addon-containment.js +139 -0
  137. package/dist/foundation/process-containment/addon-process-inspector.d.ts +11 -0
  138. package/dist/foundation/process-containment/addon-process-inspector.js +36 -0
  139. package/dist/foundation/process-containment/addon.d.ts +42 -0
  140. package/dist/foundation/process-containment/addon.js +57 -0
  141. package/dist/foundation/process-containment/artifact.d.ts +1 -1
  142. package/dist/foundation/process-containment/artifact.js +6 -5
  143. package/dist/foundation/process-containment/contracts.d.ts +2 -0
  144. package/dist/foundation/process-containment/index.d.ts +4 -4
  145. package/dist/foundation/process-containment/index.js +3 -3
  146. package/dist/foundation/process-containment/native-process-inspector.d.ts +2 -1
  147. package/dist/foundation/process-containment/native-process-inspector.js +10 -10
  148. package/dist/foundation/release/automatic-update.d.ts +37 -0
  149. package/dist/foundation/release/automatic-update.js +265 -0
  150. package/dist/foundation/release/bootstrap.d.ts +7 -9
  151. package/dist/foundation/release/bootstrap.js +107 -24
  152. package/dist/foundation/release/cohort-state.d.ts +1 -1
  153. package/dist/foundation/release/cohort-state.js +1 -1
  154. package/dist/foundation/release/dependency-certification.js +54 -19
  155. package/dist/foundation/release/early-accent.d.ts +12 -0
  156. package/dist/foundation/release/early-accent.js +59 -0
  157. package/dist/foundation/release/index.d.ts +2 -2
  158. package/dist/foundation/release/index.js +2 -2
  159. package/dist/foundation/release/latest-release.d.ts +24 -2
  160. package/dist/foundation/release/latest-release.js +51 -1
  161. package/dist/foundation/release/progress-palette.generated.d.ts +137 -3
  162. package/dist/foundation/release/progress-palette.generated.js +137 -3
  163. package/dist/foundation/release/release-gc.d.ts +3 -0
  164. package/dist/foundation/release/release-gc.js +59 -8
  165. package/dist/foundation/release/release-store.d.ts +12 -0
  166. package/dist/foundation/release/release-store.js +124 -2
  167. package/dist/foundation/release/update-execution-lease.d.ts +48 -0
  168. package/dist/foundation/release/update-execution-lease.js +161 -0
  169. package/dist/foundation/release/update.d.ts +12 -7
  170. package/dist/foundation/release/update.js +281 -196
  171. package/dist/foundation/resident-tabs/bounded-host-command.d.ts +18 -0
  172. package/dist/foundation/resident-tabs/bounded-host-command.js +39 -0
  173. package/dist/foundation/resident-tabs/bridge-client.d.ts +70 -0
  174. package/dist/foundation/resident-tabs/bridge-client.js +321 -0
  175. package/dist/foundation/resident-tabs/doctor.d.ts +28 -0
  176. package/dist/foundation/resident-tabs/doctor.js +166 -0
  177. package/dist/foundation/resident-tabs/draft-checkpoint.d.ts +27 -0
  178. package/dist/foundation/resident-tabs/draft-checkpoint.js +145 -0
  179. package/dist/foundation/resident-tabs/ensure-terminal-host.d.ts +36 -0
  180. package/dist/foundation/resident-tabs/ensure-terminal-host.js +151 -0
  181. package/dist/foundation/resident-tabs/fault-injection.d.ts +8 -0
  182. package/dist/foundation/resident-tabs/fault-injection.js +26 -0
  183. package/dist/foundation/resident-tabs/fixture-control.d.ts +7 -0
  184. package/dist/foundation/resident-tabs/fixture-control.js +35 -0
  185. package/dist/foundation/resident-tabs/host-entry.d.ts +1 -0
  186. package/dist/foundation/resident-tabs/host-entry.js +17 -0
  187. package/dist/foundation/resident-tabs/index.d.ts +12 -0
  188. package/dist/foundation/resident-tabs/index.js +6 -0
  189. package/dist/foundation/resident-tabs/maintenance.d.ts +39 -0
  190. package/dist/foundation/resident-tabs/maintenance.js +75 -0
  191. package/dist/foundation/resident-tabs/progress-observation-schema.d.ts +34 -0
  192. package/dist/foundation/resident-tabs/progress-observation-schema.js +1 -0
  193. package/dist/foundation/resident-tabs/progress-observation.d.ts +4 -0
  194. package/dist/foundation/resident-tabs/progress-observation.js +150 -0
  195. package/dist/foundation/resident-tabs/prompt-journal.d.ts +63 -0
  196. package/dist/foundation/resident-tabs/prompt-journal.js +213 -0
  197. package/dist/foundation/resident-tabs/protocol.d.ts +12 -0
  198. package/dist/foundation/resident-tabs/protocol.js +195 -0
  199. package/dist/foundation/resident-tabs/recovery.d.ts +26 -0
  200. package/dist/foundation/resident-tabs/recovery.js +205 -0
  201. package/dist/foundation/resident-tabs/release-holds.d.ts +28 -0
  202. package/dist/foundation/resident-tabs/release-holds.js +75 -0
  203. package/dist/foundation/resident-tabs/routes.d.ts +5 -0
  204. package/dist/foundation/resident-tabs/routes.js +5 -0
  205. package/dist/foundation/resident-tabs/routing.d.ts +11 -0
  206. package/dist/foundation/resident-tabs/routing.js +10 -0
  207. package/dist/foundation/resident-tabs/session-sync.d.ts +14 -0
  208. package/dist/foundation/resident-tabs/session-sync.js +37 -0
  209. package/dist/foundation/resident-tabs/settings.d.ts +12 -0
  210. package/dist/foundation/resident-tabs/settings.js +58 -0
  211. package/dist/foundation/resident-tabs/terminal-host-artifact.d.ts +14 -0
  212. package/dist/foundation/resident-tabs/terminal-host-artifact.js +78 -0
  213. package/dist/foundation/resident-tabs/zip-archive.d.ts +9 -0
  214. package/dist/foundation/resident-tabs/zip-archive.js +56 -0
  215. package/dist/foundation/session-writer-lock/index.d.ts +30 -0
  216. package/dist/foundation/session-writer-lock/index.js +203 -0
  217. package/dist/foundation/startup/startup-descriptor.js +2 -2
  218. package/dist/foundation/terminal-cleanup/index.d.ts +1 -1
  219. package/dist/foundation/terminal-cleanup/index.js +1 -1
  220. package/dist/foundation/terminal-cleanup/terminal-reset.d.ts +6 -0
  221. package/dist/foundation/terminal-cleanup/terminal-reset.js +6 -0
  222. package/dist/integrations/pi/components/editor-interaction.d.ts +2 -0
  223. package/dist/integrations/pi/components/modal-frame.d.ts +17 -1
  224. package/dist/integrations/pi/components/modal-frame.js +48 -9
  225. package/dist/integrations/pi/components/models-dialog.js +4 -52
  226. package/dist/integrations/pi/components/owned-editor-ux.d.ts +6 -1
  227. package/dist/integrations/pi/components/owned-editor-ux.js +138 -11
  228. package/dist/integrations/pi/components/resources/builtin-themes.d.ts +4 -4
  229. package/dist/integrations/pi/components/resources/builtin-themes.js +4 -4
  230. package/dist/integrations/pi/components/share-operation-dialog.d.ts +2 -0
  231. package/dist/integrations/pi/components/share-operation-dialog.js +2 -1
  232. package/dist/integrations/pi/components/shell-editor-autocomplete.js +58 -36
  233. package/dist/integrations/pi/components/shell-extension-ui.js +79 -60
  234. package/dist/integrations/pi/components/shell-footer-status.d.ts +1 -1
  235. package/dist/integrations/pi/components/shell-footer-status.js +21 -5
  236. package/dist/integrations/pi/components/shell-hotkey-sections.js +1 -1
  237. package/dist/integrations/pi/components/shell-presenters-info.d.ts +5 -2
  238. package/dist/integrations/pi/components/shell-presenters-info.js +18 -4
  239. package/dist/integrations/pi/components/shell-presenters-transcript.js +4 -1
  240. package/dist/integrations/pi/components/shell-selectors-dialogs.js +5 -1
  241. package/dist/integrations/pi/components/shell-shared-facade.d.ts +12 -1
  242. package/dist/integrations/pi/components/skills-dialog.js +2 -2
  243. package/dist/integrations/pi/components/upstream/adjacent/core/keybindings.d.ts +1 -1
  244. package/dist/integrations/pi/components/upstream/adjacent/core/keybindings.js +17 -4
  245. package/dist/integrations/pi/components/upstream/assets/earendil-image.json +2 -2
  246. package/dist/integrations/pi/components/upstream/components/countdown-timer.d.ts +1 -1
  247. package/dist/integrations/pi/components/upstream/components/earendil-announcement.js +1 -1
  248. package/dist/integrations/pi/components/upstream/components/extension-editor.d.ts +1 -1
  249. package/dist/integrations/pi/components/upstream/components/extension-editor.js +1 -1
  250. package/dist/integrations/pi/components/upstream/components/extension-input.js +1 -1
  251. package/dist/integrations/pi/components/upstream/components/extension-selector.js +1 -1
  252. package/dist/integrations/pi/components/upstream/components/mermaid.js +1 -1
  253. package/dist/integrations/pi/components/upstream/components/owned-editor.d.ts +8 -6
  254. package/dist/integrations/pi/components/upstream/components/owned-editor.js +16 -9
  255. package/dist/integrations/pi/components/upstream/components/pi-logo.js +1 -1
  256. package/dist/integrations/pi/components/upstream/components/scoped-models-selector.d.ts +4 -4
  257. package/dist/integrations/pi/components/upstream/components/scoped-models-selector.js +2 -2
  258. package/dist/integrations/pi/components/upstream/components/session-footer.d.ts +2 -1
  259. package/dist/integrations/pi/components/upstream/components/session-footer.js +31 -25
  260. package/dist/integrations/pi/components/upstream/components/session-selector-search.js +1 -1
  261. package/dist/integrations/pi/components/upstream/components/session-selector.js +8 -7
  262. package/dist/integrations/pi/components/upstream/components/skill-invocation-message.d.ts +1 -1
  263. package/dist/integrations/pi/components/upstream/components/skill-invocation-message.js +1 -1
  264. package/dist/integrations/pi/components/upstream/components/status-indicator.d.ts +2 -2
  265. package/dist/integrations/pi/components/upstream/components/status-indicator.js +3 -3
  266. package/dist/integrations/pi/components/upstream/components/themed-text.d.ts +1 -1
  267. package/dist/integrations/pi/components/upstream/components/themed-text.js +1 -1
  268. package/dist/integrations/pi/components/upstream/components/thinking-selector.d.ts +8 -7
  269. package/dist/integrations/pi/components/upstream/components/thinking-selector.js +10 -9
  270. package/dist/integrations/pi/components/upstream/components/tool-execution.d.ts +2 -6
  271. package/dist/integrations/pi/components/upstream/components/tool-execution.js +103 -101
  272. package/dist/integrations/pi/components/upstream/components/tree-selector.d.ts +9 -9
  273. package/dist/integrations/pi/components/upstream/components/tree-selector.js +13 -21
  274. package/dist/integrations/pi/components/upstream/components/trust-selector.js +1 -1
  275. package/dist/integrations/pi/components/upstream/external-editor.js +1 -1
  276. package/dist/integrations/pi/components/upstream/history/editor-core.d.ts +2 -2
  277. package/dist/integrations/pi/components/upstream/history/editor-core.js +7 -5
  278. package/dist/integrations/pi/components/upstream/history/kill-ring.d.ts +1 -1
  279. package/dist/integrations/pi/components/upstream/history/kill-ring.js +1 -1
  280. package/dist/integrations/pi/components/upstream/history/printable-key.js +1 -1
  281. package/dist/integrations/pi/components/upstream/history/text-helpers.js +1 -1
  282. package/dist/integrations/pi/components/upstream/history/undo-stack.d.ts +1 -1
  283. package/dist/integrations/pi/components/upstream/history/undo-stack.js +1 -1
  284. package/dist/integrations/pi/components/upstream/history/word-navigation.js +1 -1
  285. package/dist/integrations/pi/components/upstream/model-search.d.ts +1 -1
  286. package/dist/integrations/pi/components/upstream/program-status-reporter.d.ts +1 -1
  287. package/dist/integrations/pi/components/upstream/theme/theme-controller.d.ts +1 -1
  288. package/dist/integrations/pi/components/upstream/theme/theme.d.ts +5 -0
  289. package/dist/integrations/pi/components/upstream/theme/theme.js +29 -2
  290. package/dist/integrations/pi/engine/adapter.d.ts +5 -77
  291. package/dist/integrations/pi/engine/adapter.js +95 -394
  292. package/dist/integrations/pi/engine/command-dispatch.d.ts +13 -0
  293. package/dist/integrations/pi/engine/command-dispatch.js +57 -0
  294. package/dist/integrations/pi/engine/host.js +2 -2
  295. package/dist/integrations/pi/engine/offline-settings-port.d.ts +23 -0
  296. package/dist/integrations/pi/engine/offline-settings-port.js +53 -0
  297. package/dist/integrations/pi/engine/pi-settings-metadata.json +14 -2
  298. package/dist/integrations/pi/engine/ports.d.ts +56 -0
  299. package/dist/integrations/pi/engine/ports.js +93 -0
  300. package/dist/integrations/pi/engine/prompt-suggestions.d.ts +1 -0
  301. package/dist/integrations/pi/engine/prompt-suggestions.js +40 -0
  302. package/dist/integrations/pi/engine/resources/changelog.json +4 -4
  303. package/dist/integrations/pi/engine/runtime-integration.js +102 -29
  304. package/dist/integrations/pi/engine/session-runtime.d.ts +0 -6
  305. package/dist/integrations/pi/engine/session-runtime.js +13 -5
  306. package/dist/integrations/pi/engine/session-selection.d.ts +3 -0
  307. package/dist/integrations/pi/engine/session-selection.js +45 -9
  308. package/dist/integrations/pi/engine/settings-bridge.d.ts +5 -0
  309. package/dist/integrations/pi/engine/settings-bridge.js +15 -0
  310. package/dist/integrations/pi/engine/settings-port.js +11 -15
  311. package/dist/integrations/pi/engine/view-state.d.ts +42 -0
  312. package/dist/integrations/pi/engine/view-state.js +126 -0
  313. package/dist/integrations/pi/engine/workflow-contexts.js +10 -1
  314. package/dist/integrations/pi/engine/workflow-runner.js +74 -5
  315. package/dist/integrations/pi/engine/workflow-support.d.ts +12 -0
  316. package/dist/integrations/pi/engine/workflow-support.js +36 -0
  317. package/dist/integrations/pi/engine/workflows.d.ts +3 -1
  318. package/dist/integrations/pi/engine/workflows.js +1 -0
  319. package/dist/integrations/pi/startup-public.js +257 -310
  320. package/dist/integrations/pi/startup-public.manifest.json +564 -440
  321. package/dist/integrations/pi/tui-runtime/adapter.d.ts +6 -0
  322. package/dist/integrations/pi/tui-runtime/adapter.js +32 -1
  323. package/dist/integrations/pi/tui-runtime/contracts.d.ts +5 -0
  324. package/dist/integrations/pi/tui-runtime/damage-aware-terminal.d.ts +12 -1
  325. package/dist/integrations/pi/tui-runtime/damage-aware-terminal.js +31 -2
  326. package/dist/native/darwin-arm64/manifest.json +10 -7
  327. package/dist/native/darwin-arm64/process-guardian.node +0 -0
  328. package/dist/native/darwin-arm64/terminal-host-THIRD-PARTY-NOTICES.txt +10500 -0
  329. package/dist/native/darwin-arm64/terminal-host.manifest.json +46 -0
  330. package/dist/native/darwin-arm64/terminal-host.node +0 -0
  331. package/dist/native/darwin-x64/manifest.json +23 -0
  332. package/dist/native/darwin-x64/process-guardian.node +0 -0
  333. package/dist/native/darwin-x64/terminal-host-THIRD-PARTY-NOTICES.txt +10737 -0
  334. package/dist/native/darwin-x64/terminal-host.manifest.json +46 -0
  335. package/dist/native/darwin-x64/terminal-host.node +0 -0
  336. package/dist/native/linux-x64/manifest.json +10 -7
  337. package/dist/native/linux-x64/process-guardian.node +0 -0
  338. package/dist/native/linux-x64/terminal-host-THIRD-PARTY-NOTICES.txt +11226 -0
  339. package/dist/native/linux-x64/terminal-host.manifest.json +46 -0
  340. package/dist/native/linux-x64/terminal-host.node +0 -0
  341. package/dist/native/win32-x64/manifest.json +10 -7
  342. package/dist/native/win32-x64/process-guardian.node +0 -0
  343. package/dist/native/win32-x64/terminal-host-THIRD-PARTY-NOTICES.txt +10757 -0
  344. package/dist/native/win32-x64/terminal-host.manifest.json +46 -0
  345. package/dist/native/win32-x64/terminal-host.node +0 -0
  346. package/dist/product-identity.d.ts +3 -3
  347. package/dist/product-identity.js +4 -4
  348. package/dist/product-identity.json +16 -2
  349. package/dist/runtime-payload-inventory.json +6330 -6677
  350. package/dist/ui/apps/host.d.ts +2 -0
  351. package/dist/ui/apps/host.js +7 -1
  352. package/dist/ui/components/dialog-panel.d.ts +17 -8
  353. package/dist/ui/components/dialog-panel.js +117 -41
  354. package/dist/ui/components/index.d.ts +5 -5
  355. package/dist/ui/components/index.js +4 -4
  356. package/dist/ui/components/line-input.d.ts +4 -1
  357. package/dist/ui/components/line-input.js +3 -1
  358. package/dist/ui/components/prompt-input.d.ts +11 -8
  359. package/dist/ui/components/prompt-input.js +15 -13
  360. package/dist/ui/components/scrollbar.d.ts +1 -1
  361. package/dist/ui/components/scrollbar.js +1 -1
  362. package/dist/ui/components/selection-copy.d.ts +3 -3
  363. package/dist/ui/components/selection-copy.js +16 -1
  364. package/dist/ui/components/spans.js +2 -2
  365. package/dist/ui/components/submitted-prompt.d.ts +9 -6
  366. package/dist/ui/components/submitted-prompt.js +20 -12
  367. package/dist/ui/components/surface.js +4 -2
  368. package/dist/ui/components/text-selection.d.ts +1 -2
  369. package/dist/ui/components/text-selection.js +5 -2
  370. package/dist/ui/components/text.d.ts +3 -6
  371. package/dist/ui/components/text.js +6 -8
  372. package/dist/ui/components/transcript-viewport.d.ts +9 -2
  373. package/dist/ui/components/transcript-viewport.js +179 -58
  374. package/dist/ui/settings/declarations.d.ts +90 -16
  375. package/dist/ui/settings/declarations.js +67 -14
  376. package/dist/ui/settings/early-accent.d.ts +81 -0
  377. package/dist/ui/settings/early-accent.js +50 -0
  378. package/dist/ui/settings/index.d.ts +4 -2
  379. package/dist/ui/settings/index.js +2 -1
  380. package/dist/ui/settings/manager.d.ts +16 -3
  381. package/dist/ui/settings/manager.js +122 -33
  382. package/dist/ui/settings/migrations.d.ts +6 -0
  383. package/dist/ui/settings/migrations.js +73 -0
  384. package/dist/ui/settings/profile-document.d.ts +26 -0
  385. package/dist/ui/settings/profile-document.js +164 -0
  386. package/dist/ui/settings/progress-palette.generated.d.ts +139 -0
  387. package/dist/ui/settings/progress-palette.generated.js +139 -0
  388. package/dist/ui/settings/sections.d.ts +4 -0
  389. package/dist/ui/settings/sections.js +9 -3
  390. package/docs/architecture/boundaries.md +24 -9
  391. package/docs/architecture/evidence/resident-tabs/linux-x64.md +37 -0
  392. package/docs/architecture/evidence/resident-tabs/macos-arm64.md +36 -0
  393. package/docs/architecture/evidence/resident-tabs/macos-x64.md +35 -0
  394. package/docs/architecture/evidence/resident-tabs/windows-x64.md +36 -0
  395. package/docs/architecture/internal-naming.md +3 -1
  396. package/docs/architecture/process-guardian-provenance.md +18 -10
  397. package/docs/architecture/project-structure.md +8 -0
  398. package/docs/architecture/resident-tabs-requirements.md +18 -0
  399. package/docs/architecture/resident-tabs.md +649 -0
  400. package/docs/architecture/response-copy-delivery.md +1 -1
  401. package/docs/architecture/terminal-host-proof-gate.md +2 -0
  402. package/docs/architecture/terminal-host-provenance.md +16 -4
  403. package/docs/architecture/tool-image-presentation.md +2 -1
  404. package/docs/architecture/toolchain.md +11 -9
  405. package/docs/ci-release-runbook.md +14 -7
  406. package/docs/features/launch-profiles.md +11 -8
  407. package/docs/features/prompt-history.md +41 -20
  408. package/docs/manual-resident-tabs-acceptance.md +51 -0
  409. package/docs/openspec-archive-automation.md +49 -22
  410. package/docs/validation.md +49 -9
  411. package/package.json +19 -6
  412. package/dist/foundation/process-containment/darwin-process-inspector.d.ts +0 -5
  413. package/dist/foundation/process-containment/darwin-process-inspector.js +0 -7
  414. package/dist/foundation/process-containment/native-guardian-containment.js +0 -152
  415. package/dist/foundation/process-containment/windows-process-inspector.d.ts +0 -19
  416. package/dist/foundation/process-containment/windows-process-inspector.js +0 -56
  417. package/dist/native/darwin-arm64/process-guardian +0 -0
  418. package/dist/native/linux-x64/process-guardian +0 -0
  419. package/dist/native/win32-x64/process-guardian.exe +0 -0
@@ -1,4 +1,3 @@
1
- import { readFile } from "node:fs/promises";
2
1
  import { SuggestionDiagnosticCapture } from "../features/prompt-suggestions/diagnostics.js";
3
2
  import { PRODUCT_IDENTITY } from "../product-identity.js";
4
3
  import { PromptHistoryService } from "../features/prompt-history/service.js";
@@ -6,93 +5,62 @@ import { PromptImageSidecar } from "../features/prompt-history/image-sidecar.js"
6
5
  import { resolvePromptHistoryPath } from "../features/prompt-history/paths.js";
7
6
  import { resolvePromptHistoryDataDir } from "../features/launch/profile-paths.js";
8
7
  import { resolveProductPaths } from "../foundation/lifecycle/paths.js";
8
+ import { MAX_CLIPBOARD_TEXT_BYTES } from "../contracts/owned-ui/index.js";
9
9
  import { applyConfiguredPiTheme, getAvailablePiThemes, setPiAccentColor, setPiPackageBorderProjectionEnabled } from "../integrations/pi/components/upstream/theme/theme.js";
10
10
  import { createPiEngineHost } from "../integrations/pi/engine/host.js";
11
11
  import { createPiSessionPresenters } from "../integrations/pi/session-presenters/index.js";
12
12
  import { ClipboardDiagnosticCapture } from "../app/session-shell/clipboard-diagnostics.js";
13
13
  import { createOwnedUiClipboardServices } from "../app/session-shell/clipboard-services.js";
14
+ import { writeSystemClipboardText } from "../app/session-shell/system-clipboard.js";
14
15
  import { createPiKeybindingsHost } from "../integrations/pi/components/shell-shared-facade.js";
15
16
  import { OwnedUiSessionPresenter, OwnedUiTerminalHost, sessionTerminalHostOptions, } from "../app/session-shell/session-shell.js";
16
- import { OwnedSettingsManager } from "../ui/settings/manager.js";
17
17
  import { createPiTerminalBridge } from "../integrations/pi/tui-runtime/presentation-adapter.js";
18
18
  import { createOwnedRouteHost } from "./settings-route-host.js";
19
19
  import { renderPiShellChangelogLines } from "../integrations/pi/components/shell-presenters-info.js";
20
20
  import { nativeHyperlinkStyle } from "../ui/components/spans.js";
21
- const SESSION_RUNTIME_REFRESH_MS = 30_000;
21
+ import { ResidentTabRecovery } from "../foundation/resident-tabs/recovery.js";
22
+ import { bindResidentTabBridge, closeResidentUtilityRoute, correlateResidentTabSubmission, currentBackendSessionFile, residentRouteHostOptions, residentTabKeybindings } from "./resident-tab-bridge.js";
23
+ import { SessionRuntimeRegistry } from "./session-runtime-registry.js";
24
+ import { readPackageVersion, StartupReleaseNote } from "./startup-route.js";
25
+ import { createOwnedSettingsManager, watchSharedSettings } from "./owned-settings.js";
26
+ export { bindResidentTabBridge, correlateResidentTabSubmission } from "./resident-tab-bridge.js";
27
+ export function residentStartupPresentation(resident, fallbackNotice) {
28
+ if (resident)
29
+ return { startup: { quiet: true } };
30
+ return fallbackNotice === undefined ? {} : { startup: { notices: [{ kind: "warning", message: fallbackNotice }] } };
31
+ }
22
32
  export async function composeOwnedUiApplication(options = {}) {
23
33
  return (await composeOwnedUi(options)).application;
24
34
  }
25
35
  export async function composeOwnedUi(options = {}) {
26
36
  const cwd = options.cwd ?? process.cwd();
27
37
  const ownedSurfaces = options.ownedSurfaces !== "off";
28
- const sessionRuntimeId = ownedSurfaces ? process.env[PRODUCT_IDENTITY.environment.sessionRuntimeId] : undefined;
29
- const inspectSessionProcess = options.inspectProcess;
30
- let sessionRuntimeIdentity = null;
31
- // Invariant: one entry per agent of this runtime; each agent holds its own claim, and the runtime's exit releases all.
32
- const activeSessionIdentities = new Map();
33
- let sessionRuntimeRefreshTimer = null;
34
- let sessionRuntimeRefresh = Promise.resolve();
35
- let sessionRuntimeDisposed = false;
36
- const runtimeIdentity = async () => {
37
- if (sessionRuntimeId === undefined || inspectSessionProcess === undefined)
38
- return null;
39
- sessionRuntimeIdentity ??= inspectSessionProcess(process.pid).catch(() => null);
40
- return await sessionRuntimeIdentity;
41
- };
42
- const queueSessionRuntimeRefresh = () => {
43
- if (sessionRuntimeDisposed || activeSessionIdentities.size === 0 || sessionRuntimeId === undefined || inspectSessionProcess === undefined)
44
- return;
45
- sessionRuntimeRefresh = sessionRuntimeRefresh.then(async () => {
46
- if (sessionRuntimeDisposed)
47
- return;
48
- const owner = await runtimeIdentity();
49
- if (owner === null)
50
- return;
51
- const { registerSessionRepositoryRuntime } = await import("../foundation/lifecycle/session-repository-context.js");
52
- for (const [agentId, identity] of activeSessionIdentities) {
53
- if (sessionRuntimeDisposed)
54
- return;
55
- await registerSessionRepositoryRuntime(identity, sessionRuntimeId, owner, {
56
- inspectProcess: inspectSessionProcess,
57
- ...(agentId === undefined ? {} : { agentId }),
58
- }).catch(() => undefined);
59
- }
60
- }).catch(() => undefined);
61
- };
62
- /** The repository context reader for one agent; undefined names the primary agent, the only one composed today. */
63
- const repositoryContextReaderFor = (agentId) => async (sessionId, sessionFile, signal) => {
64
- const owner = await runtimeIdentity();
65
- if (owner === null || sessionRuntimeId === undefined || inspectSessionProcess === undefined)
66
- return null;
67
- const identity = { sessionId, sessionFile };
68
- activeSessionIdentities.set(agentId, identity);
69
- const { activateSessionRepositoryContext } = await import("../foundation/lifecycle/session-repository-context.js");
70
- const context = await activateSessionRepositoryContext(identity, sessionRuntimeId, owner, {
71
- signal,
72
- inspectProcess: inspectSessionProcess,
73
- ...(agentId === undefined ? {} : { agentId }),
74
- });
75
- armSessionRuntimeRefresh();
76
- return context;
77
- };
78
- const armSessionRuntimeRefresh = () => {
79
- if (sessionRuntimeRefreshTimer !== null)
80
- return;
81
- sessionRuntimeRefreshTimer = setInterval(queueSessionRuntimeRefresh, SESSION_RUNTIME_REFRESH_MS);
82
- sessionRuntimeRefreshTimer.unref();
83
- };
38
+ const sessionRuntimes = new SessionRuntimeRegistry({
39
+ runtimeId: ownedSurfaces ? process.env[PRODUCT_IDENTITY.environment.sessionRuntimeId] : undefined,
40
+ inspectProcess: options.inspectProcess,
41
+ });
84
42
  const productPaths = resolveProductPaths();
85
43
  // Rationale: the manager reads the engine's settings port lazily, after the session exists.
86
44
  let backend;
87
45
  const settings = options.profileId === undefined
88
46
  ? null
89
- : new OwnedSettingsManager({
90
- configDir: resolveProductPaths().configDir,
47
+ : createOwnedSettingsManager({
91
48
  profileId: options.profileId,
92
49
  agentProvider: () => backend.settingsPort(),
93
- hiddenAgentSettingIds: ["fullscreenWheelScrollLines"],
94
- agentSettingLabelOverrides: { fullscreenCopyOnSelect: "Copy on select" },
50
+ ...(options.hideTabSettings ? { hideTabSettings: true } : {}),
95
51
  });
52
+ const tabBridge = options.tab?.bridge ?? null;
53
+ if (tabBridge !== null)
54
+ await tabBridge.start().catch(() => false);
55
+ const projectTrustPrompt = options.projectTrustPrompt === undefined ? undefined : async (request) => {
56
+ tabBridge?.status("needs-input", false, 1, 0);
57
+ try {
58
+ return await options.projectTrustPrompt(request);
59
+ }
60
+ finally {
61
+ tabBridge?.status("starting");
62
+ }
63
+ };
96
64
  // Invariant: process-wide engine state has one owner. The host installs the HTTP dispatcher, applies
97
65
  // the theme singletons, and announces startup notices once; every session is created through it.
98
66
  const host = await (options.createEngineHost ?? (async (hostOptions) => createPiEngineHost(hostOptions)))({
@@ -105,50 +73,73 @@ export async function composeOwnedUi(options = {}) {
105
73
  packageBorderProjection: ownedSurfaces,
106
74
  apply: { base: applyConfiguredPiTheme, accentColor: setPiAccentColor, packageBorderProjection: setPiPackageBorderProjectionEnabled },
107
75
  },
108
- ...(options.projectTrustPrompt === undefined ? {} : { projectTrustPrompt: options.projectTrustPrompt }),
76
+ ...(projectTrustPrompt === undefined ? {} : { projectTrustPrompt }),
109
77
  });
78
+ const sessionForkPrompt = options.sessionForkPrompt === undefined ? undefined : async (request) => {
79
+ tabBridge?.status("needs-input", false, 1, 0);
80
+ try {
81
+ return await options.sessionForkPrompt(request);
82
+ }
83
+ finally {
84
+ tabBridge?.status("starting");
85
+ }
86
+ };
110
87
  try {
111
88
  backend = await host.create({
112
89
  cwd,
113
- ...(ownedSurfaces ? { repositoryContextReader: repositoryContextReaderFor(undefined) } : {}),
90
+ ...(ownedSurfaces ? { repositoryContextReader: sessionRuntimes.readerFor(undefined) } : {}),
114
91
  ...(options.sessionPath === undefined ? {} : { sessionPath: options.sessionPath }),
115
92
  ...(options.sessionSelection === undefined ? {} : { sessionSelection: options.sessionSelection }),
116
- ...(options.sessionForkPrompt === undefined ? {} : { sessionForkPrompt: options.sessionForkPrompt }),
93
+ ...(sessionForkPrompt === undefined ? {} : { sessionForkPrompt }),
117
94
  });
118
95
  }
119
96
  catch (error) {
120
97
  await host.dispose();
121
98
  throw error;
122
99
  }
123
- let releaseNotes = null;
124
- let releaseNotesFailure;
125
- if (ownedSurfaces) {
126
- try {
127
- releaseNotes = options.releaseNotes
128
- ?? await import("../features/owned-ui/release-notes.js").then(module => module.readPackagedReleaseNotes());
129
- }
130
- catch (error) {
131
- releaseNotesFailure = error;
132
- }
133
- }
134
- const packageVersion = ownedSurfaces
135
- ? options.packageVersion ?? await readPackageVersion()
136
- : null;
137
- const currentReleaseNote = packageVersion === null ? null : releaseNotes?.current(packageVersion) ?? null;
138
- const releaseNoteClaim = currentReleaseNote === null || options.profileId === undefined
139
- ? null
140
- : await import("../features/owned-ui/release-note-state.js").then(module => module.claimReleaseNote({
141
- configDir: productPaths.configDir, profileId: options.profileId, version: currentReleaseNote.version,
142
- }));
143
- const unsubscribeAccent = settings === null || !ownedSurfaces
100
+ let recoveryDegraded = false;
101
+ let presentRecoveryDegraded = (_degraded) => { };
102
+ const tabRecovery = options.tab === undefined ? null : new ResidentTabRecovery(options.tab.dataDir, {
103
+ onDegraded: degraded => {
104
+ recoveryDegraded = degraded;
105
+ options.tab.bridge.degraded(degraded);
106
+ presentRecoveryDegraded(degraded);
107
+ },
108
+ });
109
+ const recoveredTabInput = await tabRecovery?.initialize(currentBackendSessionFile(backend), backend.identity.sessionId);
110
+ if (tabBridge !== null && settings !== null && ownedSurfaces)
111
+ tabBridge.accent(settings.value("accentColor"));
112
+ let removeControllerBoundaryInput = () => { };
113
+ let unsubscribeTabBridge = () => { };
114
+ const releaseNote = await StartupReleaseNote.load({
115
+ ownedSurfaces,
116
+ configDir: productPaths.configDir,
117
+ ...(options.releaseNotes === undefined ? {} : { releaseNotes: options.releaseNotes }),
118
+ ...(options.packageVersion === undefined ? {} : { packageVersion: options.packageVersion }),
119
+ ...(options.profileId === undefined ? {} : { profileId: options.profileId }),
120
+ });
121
+ const unsubscribeAccentChange = settings === null || !ownedSurfaces
144
122
  ? () => { }
145
- : settings.onChange(current => host.setAccentColor(current.value("accentColor")));
123
+ : settings.onChange(current => {
124
+ const accent = current.value("accentColor");
125
+ host.setAccentColor(accent);
126
+ tabBridge?.accent(accent);
127
+ });
128
+ // Rationale: resident tabs and separate solo agents share a settings document; a live scope
129
+ // change saved in either reaches the others only by rereading that document.
130
+ const unwatchSharedSettings = settings === null || !ownedSurfaces
131
+ ? () => { }
132
+ : watchSharedSettings(settings);
133
+ const unsubscribeAccent = () => { unwatchSharedSettings(); unsubscribeAccentChange(); };
134
+ // Invariant: the Settings search and agent prompt borrow the same resolved Pi keybindings.
135
+ const keybindingsHost = createPiKeybindingsHost({ profile: ownedSurfaces ? "a1" : "pi", agentDir: backend.identity.agentDir });
136
+ const keybindings = residentTabKeybindings(tabBridge, backend.identity.agentDir, keybindingsHost);
146
137
  // Rationale: Routes open only after shell construction.
147
138
  const references = {
148
139
  changelog: async (input) => {
149
- if (input?.document === undefined && releaseNotesFailure !== undefined)
150
- throw releaseNotesFailure;
151
- const markdown = input?.document ?? releaseNotes?.completeMarkdown ?? "No A1 release notes found.";
140
+ if (input?.document === undefined && releaseNote.failure !== undefined)
141
+ throw releaseNote.failure;
142
+ const markdown = input?.document ?? releaseNote.catalog?.completeMarkdown ?? "No A1 release notes found.";
152
143
  return { rows: width => renderPiShellChangelogLines(markdown, width).map(row => nativeHyperlinkStyle(row)) };
153
144
  },
154
145
  hotkeys: async () => {
@@ -158,7 +149,8 @@ export async function composeOwnedUi(options = {}) {
158
149
  },
159
150
  session: () => import("./session-info-reference.js").then(m => m.loadSessionInfoReference(backend)),
160
151
  };
161
- const routeHost = settings === null || !ownedSurfaces ? null : createOwnedRouteHost(settings, references);
152
+ const routeHost = settings === null || !ownedSurfaces ? null
153
+ : createOwnedRouteHost(settings, references, settingsRouteOptions(tabBridge, keybindings, backend.identity.agentDir, cwd));
162
154
  const viewportSettings = settings === null || !ownedSurfaces ? null : {
163
155
  snapshot: () => viewportSettingsSnapshot(settings),
164
156
  onChange: listener => settings.onChange(() => listener(viewportSettingsSnapshot(settings))),
@@ -186,30 +178,15 @@ export async function composeOwnedUi(options = {}) {
186
178
  // Rationale: one listener covers both the A1 presentation choice and the engine skill-command toggle.
187
179
  onChange: (listener) => settings.onChange(() => listener()),
188
180
  };
189
- const historyLimit = settings?.value("promptHistoryMaxItems");
190
- const historyProfileLocation = settings === null || !ownedSurfaces || !settings.value("promptHistoryEnabled")
191
- ? null
192
- : resolvePromptHistoryPath(resolvePromptHistoryDataDir(), backend.identity.agentDir);
193
- const promptHistory = historyProfileLocation === null ? null : {
194
- limit: typeof historyLimit === "number" ? historyLimit : 100,
195
- store: new PromptHistoryService({
196
- dataDir: resolvePromptHistoryDataDir(),
197
- profileRoot: backend.identity.agentDir,
198
- limit: typeof historyLimit === "number" ? historyLimit : 100,
199
- }),
200
- imageSidecar: new PromptImageSidecar(historyProfileLocation.imagesDir),
201
- };
181
+ const promptHistory = createPromptHistoryConfiguration(settings, backend, ownedSurfaces);
202
182
  const clipboardDestination = options.clipboardDiagnosticsPath ?? process.env[PRODUCT_IDENTITY.environment.clipboardDiagnostics];
203
183
  const clipboardDiagnostics = settings !== null && ownedSurfaces && clipboardDestination?.trim()
204
184
  ? new ClipboardDiagnosticCapture(clipboardDestination) : null;
205
- // Invariant: process-wide services are created once here and borrowed by every session shell. The
206
- // keybinding registry is applied before any presenter is built, so none of them reads Pi's defaults.
207
- const keybindings = createPiKeybindingsHost({ profile: ownedSurfaces ? "a1" : "pi", agentDir: backend.identity.agentDir });
185
+ // Invariant: process-wide services are created once here and borrowed by every session shell.
208
186
  const clipboardServices = ownedSurfaces ? createOwnedUiClipboardServices() : null;
209
187
  let createdTerminalHost;
210
188
  let terminalHost;
211
189
  let presenter;
212
- let releaseNoteAcknowledgement = null;
213
190
  try {
214
191
  const presenterOptions = {
215
192
  presenters: createPiSessionPresenters(backend),
@@ -217,24 +194,27 @@ export async function composeOwnedUi(options = {}) {
217
194
  backend,
218
195
  cwd: backend.identity.cwd,
219
196
  ...(routeHost === null ? {} : { routeHost }),
220
- ...(currentReleaseNote === null || releaseNoteClaim === null ? {} : {
221
- startupRoute: {
222
- route: "changelog",
223
- input: { document: currentReleaseNote.markdown },
224
- onClosed: () => {
225
- releaseNoteAcknowledgement ??= releaseNoteClaim.acknowledge();
226
- return releaseNoteAcknowledgement;
227
- },
228
- },
229
- }),
197
+ ...(releaseNote.startupRoute === undefined ? {} : { startupRoute: releaseNote.startupRoute }),
230
198
  ...(ownedSurfaces ? { sessionLayout: "custom-viewport" } : {}),
199
+ ...(tabBridge === null || tabRecovery === null ? {} : { residentTab: {
200
+ requestDetach: () => tabBridge.requestDetach(),
201
+ closeOwnedRoute: route => closeResidentUtilityRoute(tabBridge, route),
202
+ reportStatus: status => tabBridge.status(status),
203
+ admit: input => tabRecovery.admit({ ...input, incarnation: options.tab.incarnation }),
204
+ dispatched: () => tabRecovery.dispatched(),
205
+ correlated: (submissionId, entryId) => correlateResidentTabSubmission(tabRecovery, backend, submissionId, entryId),
206
+ checkpoint: text => tabRecovery.checkpoint(text),
207
+ gracefulStop: sessionFile => tabRecovery.gracefulStop(sessionFile),
208
+ ...(recoveredTabInput === undefined ? {} : { recovered: recoveredTabInput }),
209
+ } }),
231
210
  },
232
211
  presentation: {
233
212
  ...(options.terminal === undefined ? {} : { terminal: createPiTerminalBridge(options.terminal) }),
213
+ ...residentStartupPresentation(tabBridge !== null, options.residentFallbackNotice),
234
214
  ...(clipboardDiagnostics === null ? {} : { input: { onEvent: event => clipboardDiagnostics.runtime(event) } }),
235
215
  ...(viewportSettings === null ? {} : { viewportSettings }),
236
216
  ...(backgroundSettings === null ? {} : { backgroundSettings }),
237
- ...(settings === null || !ownedSurfaces ? {} : {
217
+ ...(settings === null || !ownedSurfaces || tabBridge !== null ? {} : {
238
218
  quitOutro: { snapshot: () => quitOutroSettingsSnapshot(settings), interactive: process.stdout.isTTY === true },
239
219
  }),
240
220
  },
@@ -254,13 +234,32 @@ export async function composeOwnedUi(options = {}) {
254
234
  // Invariant: one terminal host owns the process terminal; the session presenter reaches it only through
255
235
  // the host and paints once attached.
256
236
  terminalHost = createdTerminalHost = new OwnedUiTerminalHost(sessionTerminalHostOptions(presenterOptions));
237
+ if (tabBridge !== null) {
238
+ removeControllerBoundaryInput = terminalHost.runtime.addPreInputListener(data => ({
239
+ data: tabBridge.consumeControllerBoundaryInput(data),
240
+ }));
241
+ }
257
242
  presenter = new OwnedUiSessionPresenter(terminalHost, presenterOptions);
243
+ presentRecoveryDegraded = degraded => {
244
+ if (!degraded)
245
+ return;
246
+ presenter.root.appendWorkflowStatus("draft recovery degraded");
247
+ terminalHost.runtime.requestRender();
248
+ };
249
+ if (recoveryDegraded)
250
+ presentRecoveryDegraded(true);
258
251
  terminalHost.attach(presenter);
252
+ if (tabBridge !== null) {
253
+ unsubscribeTabBridge = await bindResidentTabBridge(tabBridge, backend, tabRecovery, {
254
+ autoName: settings?.value("tabsAutoName") ?? true,
255
+ openRoute: route => presenter.openOwnedRoute(route),
256
+ });
257
+ }
259
258
  }
260
259
  catch (error) {
261
260
  await createdTerminalHost?.dispose().catch(() => undefined);
262
261
  unsubscribeAccent();
263
- await releaseNoteClaim?.release();
262
+ await releaseNote.releaseClaim();
264
263
  clipboardDiagnostics?.dispose();
265
264
  suggestionDiagnostics?.dispose();
266
265
  clipboardServices?.dispose();
@@ -270,18 +269,13 @@ export async function composeOwnedUi(options = {}) {
270
269
  // Rationale: pinned Pi's version check is unreachable because the owned shell never runs its
271
270
  // InteractiveMode, so A1 checks its own channel. The result is never awaited on the startup path;
272
271
  // settings are read here because the runner resolves them only just before start.
273
- const announceNewerRelease = async () => {
274
- const check = options.checkForNewerRelease
275
- ?? (await import("../foundation/release/latest-release.js")).checkForNewerRelease;
276
- const release = await check({
277
- runningVersion: packageVersion ?? await readPackageVersion(),
278
- configDir: productPaths.configDir,
279
- interactive: process.stdout.isTTY === true,
280
- ...(settings === null || !ownedSurfaces ? {} : { settingEnabled: settings.value("updateCheck") }),
281
- });
282
- if (release !== null)
283
- backend.extensions.announceReleaseUpdate(release);
284
- };
272
+ const releaseUpdates = createStartupReleaseUpdateObservation({
273
+ backend,
274
+ configDir: productPaths.configDir,
275
+ mode: settings === null || !ownedSurfaces ? "auto" : settings.value("updateCheck"),
276
+ packageVersion: releaseNote.packageVersion, notificationVersion: options.notificationVersion,
277
+ checkForNewerRelease: options.checkForNewerRelease,
278
+ });
285
279
  const exitNoticePath = process.env[PRODUCT_IDENTITY.environment.exitNoticePath];
286
280
  // Security: tools the agent runs must never see, or rewrite, this instance's notice.
287
281
  delete process.env[PRODUCT_IDENTITY.environment.exitNoticePath];
@@ -294,35 +288,29 @@ export async function composeOwnedUi(options = {}) {
294
288
  exitNotice = import("../app/session-shell/exit-notice.js")
295
289
  .then(module => module.armExitNotice(backend, exitNoticePath), () => null);
296
290
  presenter.start();
297
- void announceNewerRelease().catch(() => undefined);
291
+ releaseUpdates.start();
298
292
  },
299
293
  flush: () => backend.session.flushEvents(),
300
294
  waitUntilStopped: () => presenter.waitUntilStopped(),
301
295
  dispose: async () => {
296
+ releaseUpdates.stop();
302
297
  try {
303
298
  await terminalHost.dispose();
304
299
  // Invariant: cleared only once the terminal is restored; a failed dispose leaves it armed.
305
300
  (await exitNotice)?.clear();
306
- await releaseNoteAcknowledgement?.catch(() => undefined);
301
+ await releaseNote.settleAcknowledgement();
307
302
  }
308
303
  finally {
309
304
  // Invariant: the shared spares outlive every shell and stop only after the last one is disposed.
310
305
  clipboardServices?.dispose();
306
+ removeControllerBoundaryInput();
311
307
  unsubscribeAccent();
312
- sessionRuntimeDisposed = true;
313
- if (sessionRuntimeRefreshTimer !== null)
314
- clearInterval(sessionRuntimeRefreshTimer);
315
- sessionRuntimeRefreshTimer = null;
316
- await sessionRuntimeRefresh;
317
- const owner = await runtimeIdentity();
318
- if (sessionRuntimeId !== undefined && owner !== null) {
319
- await import("../foundation/lifecycle/session-repository-context.js")
320
- .then(module => module.releaseSessionRepositoryRuntime(sessionRuntimeId, owner))
321
- .catch(() => undefined);
322
- }
323
- await releaseNoteClaim?.release();
308
+ await sessionRuntimes.dispose();
309
+ await releaseNote.releaseClaim();
324
310
  suggestionDiagnostics?.dispose();
325
311
  clipboardDiagnostics?.dispose();
312
+ unsubscribeTabBridge();
313
+ tabBridge?.close();
326
314
  // Invariant: the host outlives the application; disposing it cancels host-level probes last.
327
315
  await host.dispose();
328
316
  }
@@ -330,12 +318,77 @@ export async function composeOwnedUi(options = {}) {
330
318
  };
331
319
  return { application, settings };
332
320
  }
333
- async function readPackageVersion() {
334
- const manifest = JSON.parse(await readFile(new URL("../../package.json", import.meta.url), "utf8"));
335
- const version = manifest?.version;
336
- if (typeof version !== "string")
337
- throw new Error("A1 package version is unavailable");
338
- return version;
321
+ function createPromptHistoryConfiguration(settings, backend, ownedSurfaces) {
322
+ const limit = settings?.value("promptHistoryMaxItems") ?? 100;
323
+ const scope = settings?.value("promptHistoryScope") ?? "unique";
324
+ const enabled = settings !== null && ownedSurfaces && settings.value("promptHistoryEnabled");
325
+ const sessionId = enabled ? backend.identity.currentHistorySessionId() : null;
326
+ if (settings === null || !enabled || (scope === "unique" && sessionId === null))
327
+ return null;
328
+ const dataDir = resolvePromptHistoryDataDir();
329
+ const forScope = (selected, id) => {
330
+ if (selected === "unique" && id === null)
331
+ return null;
332
+ const location = resolvePromptHistoryPath(dataDir, backend.identity.agentDir, process.platform, selected, id ?? "");
333
+ return {
334
+ store: new PromptHistoryService({ dataDir, profileRoot: backend.identity.agentDir, limit, scope: selected, sessionId: id ?? "" }),
335
+ imageSidecar: new PromptImageSidecar(location.imagesDir),
336
+ };
337
+ };
338
+ return {
339
+ limit, scope,
340
+ ...(sessionId === null ? {} : { sessionId }),
341
+ forScope,
342
+ onScopeChange: (listener) => settings.onChange(() => listener(settings.value("promptHistoryScope"))),
343
+ ...forScope(scope, sessionId),
344
+ };
345
+ }
346
+ function createStartupReleaseUpdateObservation(input) {
347
+ const controller = new AbortController();
348
+ const observe = async () => {
349
+ const check = input.checkForNewerRelease
350
+ ?? (await import("../foundation/release/latest-release.js")).checkForNewerRelease;
351
+ const runningVersion = input.packageVersion ?? await readPackageVersion();
352
+ const discoveryVersion = input.mode === "notify" ? input.notificationVersion ?? runningVersion : runningVersion;
353
+ const release = await check({
354
+ runningVersion: discoveryVersion,
355
+ configDir: input.configDir,
356
+ interactive: process.stdout.isTTY === true,
357
+ settingMode: input.mode,
358
+ });
359
+ if (release === null || controller.signal.aborted)
360
+ return;
361
+ if (input.mode === "notify") {
362
+ input.backend.extensions.announceReleaseUpdate(release);
363
+ return;
364
+ }
365
+ if (input.mode === "auto") {
366
+ const installed = await import("../foundation/release/automatic-update.js")
367
+ .then(module => module.requestAutomaticUpdate({ release, runningVersion, signal: controller.signal }));
368
+ if (installed !== null && !controller.signal.aborted) {
369
+ input.backend.extensions.announceReleaseUpdate({ status: "installed", version: installed });
370
+ }
371
+ }
372
+ };
373
+ return {
374
+ start() { void observe().catch(() => undefined); },
375
+ stop() { controller.abort(); },
376
+ };
377
+ }
378
+ export { watchSharedSettings } from "./owned-settings.js";
379
+ function settingsRouteOptions(tabBridge, keybindings, agentDir, cwd) {
380
+ return {
381
+ ...residentRouteHostOptions(tabBridge),
382
+ keybindings,
383
+ agentDir,
384
+ cwd,
385
+ copyText: text => {
386
+ if (Buffer.byteLength(text) > MAX_CLIPBOARD_TEXT_BYTES)
387
+ return false;
388
+ void writeSystemClipboardText(text).catch(() => { });
389
+ return true;
390
+ },
391
+ };
339
392
  }
340
393
  function quitOutroSettingsSnapshot(settings) {
341
394
  return {
@@ -344,6 +397,7 @@ function quitOutroSettingsSnapshot(settings) {
344
397
  }
345
398
  function viewportSettingsSnapshot(settings) {
346
399
  return {
400
+ timeFormat: settings.value("timeFormat"),
347
401
  scrollbarAppearance: settings.value("scrollbarAppearance"),
348
402
  scrollbarStyle: settings.value("scrollbarStyle"),
349
403
  scrollbarSpeed: settings.value("scrollbarSpeed"),
@@ -0,0 +1,3 @@
1
+ import type { ReferenceDocumentSelectionOptions } from "../features/owned-ui/reference-document-selection.js";
2
+ /** Builds the Changelog selection clipboard policy without loading Pi's engine in a utility tab. */
3
+ export declare function createReferenceSelectionOptions(settingsFile: string, copyText: ((text: string) => boolean | void) | undefined): ReferenceDocumentSelectionOptions;
@@ -0,0 +1,16 @@
1
+ import { readFileSync } from "node:fs";
2
+ /** Builds the Changelog selection clipboard policy without loading Pi's engine in a utility tab. */
3
+ export function createReferenceSelectionOptions(settingsFile, copyText) {
4
+ return {
5
+ copyOnSelect: () => {
6
+ try {
7
+ const document = JSON.parse(readFileSync(settingsFile, "utf8"));
8
+ return typeof document.fullscreenCopyOnSelect === "boolean" ? document.fullscreenCopyOnSelect : true;
9
+ }
10
+ catch {
11
+ return true;
12
+ }
13
+ },
14
+ copyText: copyText ?? (() => false),
15
+ };
16
+ }
@@ -0,0 +1,25 @@
1
+ import type { TabBridgeClient } from "../foundation/resident-tabs/bridge-client.js";
2
+ import { type ResidentTabRoute } from "../foundation/resident-tabs/routes.js";
3
+ import type { ResidentTabRecovery } from "../foundation/resident-tabs/recovery.js";
4
+ import type { PiKeybindingsHost } from "../integrations/pi/components/shell-shared-facade.js";
5
+ import type { ComposedSessionBackend } from "./session-backend.js";
6
+ import type { OwnedRouteHostOptions } from "./settings-route-host.js";
7
+ /**
8
+ * The keybindings the shells borrow. Inside a resident tab the host dispatches and labels the tab
9
+ * shortcuts this child projects from its effective declarations, so the projection is published now
10
+ * and again after every customization reload.
11
+ */
12
+ export declare function residentTabKeybindings(tabBridge: TabBridgeClient | null, agentDir: string, keybindingsHost: PiKeybindingsHost): PiKeybindingsHost;
13
+ /**
14
+ * How owned screens are presented in a resident tab: a Settings or Changelog tab's screen is the tab, and the Plus menu entry opens
15
+ * the tab bar's own Plus Menu dialog while this tab's controlling client can show it.
16
+ */
17
+ export declare function residentRouteHostOptions(tabBridge: TabBridgeClient | null): OwnedRouteHostOptions;
18
+ /** Closes a utility tab when its own screen closes. Invariant: a utility tab's screen is the tab. */
19
+ export declare function closeResidentUtilityRoute(tabBridge: Pick<TabBridgeClient, "tabId" | "requestClose">, route: string): void;
20
+ export declare function bindResidentTabBridge(tabBridge: TabBridgeClient, backend: Pick<ComposedSessionBackend, "identity" | "session" | "workflows" | "generateResidentTabName">, recovery?: Pick<ResidentTabRecovery, "settled"> | null, options?: {
21
+ readonly autoName?: boolean;
22
+ readonly openRoute?: (route: ResidentTabRoute) => void;
23
+ }): Promise<() => void>;
24
+ export declare function correlateResidentTabSubmission(recovery: Pick<ResidentTabRecovery, "correlated" | "settled">, backend: Pick<ComposedSessionBackend, "identity" | "session">, submissionId: string, entryId: string): Promise<void>;
25
+ export declare function currentBackendSessionFile(backend: Pick<ComposedSessionBackend, "identity">): string | null;