@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
package/README.md CHANGED
@@ -57,6 +57,12 @@ Launch A1 (profile: `~/.a1/agent`):
57
57
  a1
58
58
  ```
59
59
 
60
+ Launch A1 in single agent mode:
61
+
62
+ ```text
63
+ a1 solo
64
+ ```
65
+
60
66
  Show all commands:
61
67
 
62
68
  ```text
@@ -77,6 +83,30 @@ a1 pi
77
83
 
78
84
  <p align="center"><picture><source media="(prefers-color-scheme: dark)" srcset="docs/assets/readme/separator-dark.svg"><img src="docs/assets/readme/separator.svg" alt="" width="280"></picture></p>
79
85
 
86
+ ## Tabs
87
+
88
+ Tabs keep running after their terminal closes. List them, or stop one; its session stays resumable:
89
+
90
+ ```text
91
+ a1 tabs
92
+ a1 tabs stop <id>
93
+ ```
94
+
95
+ Stop every tab and the resident host, for example before going back to single agent mode with `a1 solo`:
96
+
97
+ ```text
98
+ a1 tabs host stop
99
+ ```
100
+
101
+ Show host health, or write a redacted diagnostic bundle:
102
+
103
+ ```text
104
+ a1 tabs host status
105
+ a1 tabs doctor
106
+ ```
107
+
108
+ <p align="center"><picture><source media="(prefers-color-scheme: dark)" srcset="docs/assets/readme/separator-dark.svg"><img src="docs/assets/readme/separator.svg" alt="" width="280"></picture></p>
109
+
80
110
  ## Update
81
111
 
82
112
  Install the release:
@@ -115,7 +145,13 @@ Stuck on `0.2.2` and `a1 update` fails? Run the installer once, then use `a1 upd
115
145
  npm x -y -- @timurproko/a1-install
116
146
  ```
117
147
 
118
- A1 shows an `Update Available` notice at most once a day and never installs anything by itself. Turn it off in Settings (`Update check`) or with `A1_SKIP_VERSION_CHECK=1`.
148
+ The **Update** setting controls the at-most-daily startup check:
149
+
150
+ - **Auto** (default) silently installs a verified update for the running channel, then shows `Update installed · Restart to update`.
151
+ - **Notify** keeps the `Update Available` notice and leaves installation manual.
152
+ - **No** performs no startup update check; updates remain available through the commands above.
153
+
154
+ `A1_SKIP_VERSION_CHECK=1` also disables the startup check. Manual stable, development, and exact-version update commands remain available in every mode.
119
155
 
120
156
  <p align="center"><picture><source media="(prefers-color-scheme: dark)" srcset="docs/assets/readme/separator-dark.svg"><img src="docs/assets/readme/separator.svg" alt="" width="280"></picture></p>
121
157
 
@@ -155,13 +191,15 @@ a1 update npm:pi-mcp-adapter
155
191
 
156
192
  ## Develop
157
193
 
194
+ A source build needs Node.js, npm, git, and Rustup. Windows additionally needs Visual Studio or Visual Studio Build Tools with the **Desktop development with C++** workload, MSVC x64/x86 tools, and a Windows SDK; Visual Studio Code is not required. A1 discovers installed Rustup and Visual Studio tools and initializes them for build children, so Git Bash and ordinary PowerShell do not need manual `PATH` or developer-shell setup. It never installs these tools or accepts their licenses automatically.
195
+
158
196
  Install exact locked dependencies:
159
197
 
160
198
  ```text
161
199
  npm ci
162
200
  ```
163
201
 
164
- Compile TypeScript and the process guardian into `dist`:
202
+ Compile TypeScript and the native addons into `dist`:
165
203
 
166
204
  ```text
167
205
  npm run build
@@ -191,7 +229,7 @@ Complete non-physical suite:
191
229
  npm run test:full
192
230
  ```
193
231
 
194
- Report Node, npm, git, Rust, and dependency readiness:
232
+ Report Node, npm, git, Rust, dependency, and Windows C++ readiness. Missing Windows tools are listed in setup order; after installing them, rerun the same build command:
195
233
 
196
234
  ```text
197
235
  npm run doctor
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env node
2
+
3
+ import("../dist/foundation/release/automatic-update.js").then(async ({ runAutomaticUpdateWorker }) => {
4
+ process.exitCode = await runAutomaticUpdateWorker(process.argv.slice(2));
5
+ }).catch(() => {
6
+ process.exitCode = 1;
7
+ });
package/bin/cli.js CHANGED
@@ -69,6 +69,10 @@ process.exitCode = await dispatchCli(process.argv.slice(2), {
69
69
  },
70
70
  });
71
71
  },
72
+ tabs: async request => {
73
+ const { runTabsCommand } = await import("../dist/cli/tabs.js");
74
+ return await runTabsCommand(request, { packageRoot: fileURLToPath(packageRoot) });
75
+ },
72
76
  }, {
73
77
  stdout: message => process.stdout.write(message),
74
78
  stderr: message => process.stderr.write(message),
package/bin/guardian.js CHANGED
@@ -16,8 +16,13 @@ const profileId = readLaunchContext(process.env, "profile").launchProfile;
16
16
  if (releaseRoot === undefined || profileId === undefined) throw new Error("A1 launch context is incomplete");
17
17
 
18
18
  const sessionSelection = parseSessionSelection(process.argv.slice(2));
19
+ const rootCommand = launchContext.residentRootExecutable === undefined ? undefined : {
20
+ executable: launchContext.residentRootExecutable,
21
+ arguments: JSON.parse(launchContext.residentRootArguments ?? "[]"),
22
+ };
19
23
  Promise.resolve().then(() => runLaunchGuardian({
20
24
  ...(sessionSelection === undefined ? {} : { sessionSelection }),
25
+ ...(rootCommand === undefined ? {} : { rootCommand }),
21
26
  profileId,
22
27
  releaseRoot,
23
28
  uiEntry: resolve(releaseRoot, "bin", "ui.js"),
@@ -0,0 +1,27 @@
1
+ export interface TabLaunchCredentials {
2
+ readonly tabId: string;
3
+ readonly token: string;
4
+ readonly endpoint: string;
5
+ readonly releaseId?: string;
6
+ }
7
+
8
+ export function formatResidentFallbackNotice(reason: string): string;
9
+
10
+ export function assignFreshSessionRuntimeId(
11
+ environment: Record<string, string | undefined>,
12
+ name: string,
13
+ createId: () => string,
14
+ ): string;
15
+
16
+ export function waitForStandbyPromotion(input: NodeJS.ReadStream, promotionFile?: string): Promise<void>;
17
+
18
+ export function consumeTabLaunchContext(
19
+ arguments_: readonly string[],
20
+ environment: Record<string, string | undefined>,
21
+ ): {
22
+ readonly uiArguments: string[];
23
+ readonly tabCredentials: TabLaunchCredentials | undefined;
24
+ readonly tabDataDir?: string;
25
+ readonly tabIncarnation?: number;
26
+ readonly tabStandby: boolean;
27
+ };
@@ -0,0 +1,94 @@
1
+ import { existsSync } from "node:fs";
2
+
3
+ const TAB_ENVIRONMENT_NAMES = ["A1_TAB_ID", "A1_TAB_TOKEN", "A1_TAB_ENDPOINT", "A1_TAB_RELEASE_ID"];
4
+
5
+ /** @param {string} reason */
6
+ export function formatResidentFallbackNotice(reason) {
7
+ // Protocol: a host of another generation is never replaced automatically; only the user stops it.
8
+ if (reason === "incompatible generation") {
9
+ return "A1 normal mode unavailable (running tabs use another version); running in single agent mode. Run `a1 tabs host stop` to restart them on this version.";
10
+ }
11
+ return `A1 normal mode unavailable (${reason}); running in single agent mode.`;
12
+ }
13
+
14
+ /**
15
+ * @param {Record<string, string | undefined>} environment
16
+ * @param {string} name
17
+ * @param {() => string} createId
18
+ */
19
+ export function assignFreshSessionRuntimeId(environment, name, createId) {
20
+ const id = createId();
21
+ if (typeof id !== "string" || id.length === 0 || id.includes("\0")) throw new Error("Session runtime identity generation failed");
22
+ environment[name] = id;
23
+ return id;
24
+ }
25
+
26
+ /**
27
+ * Keep the standby below the session/runtime boundary until its authenticated holder promotes it.
28
+ * Platform: Windows ConPTY may drop the in-band marker, so the holder also creates the promotion
29
+ * file inside the tab's private data directory; whichever arrives first promotes the standby.
30
+ * @param {NodeJS.ReadStream} input
31
+ * @param {string} [promotionFile]
32
+ */
33
+ export function waitForStandbyPromotion(input, promotionFile) {
34
+ return /** @type {Promise<void>} */ (new Promise((resolve, reject) => {
35
+ const marker = Buffer.from("\x1b]a1;standby-promote\x07");
36
+ let buffered = Buffer.alloc(0);
37
+ /** @type {NodeJS.Timeout | undefined} */
38
+ let poll;
39
+ const cleanup = () => {
40
+ if (poll !== undefined) clearInterval(poll);
41
+ input.off("data", onData);
42
+ input.off("error", onError);
43
+ input.pause();
44
+ if (input.isTTY) input.setRawMode(false);
45
+ };
46
+ /** @param {Error} error */
47
+ const onError = error => { cleanup(); reject(error); };
48
+ /** @param {Buffer | string} chunk */
49
+ const onData = chunk => {
50
+ const bytes = typeof chunk === "string" ? Buffer.from(chunk) : chunk;
51
+ buffered = Buffer.concat([buffered, bytes]).subarray(-marker.length);
52
+ if (buffered.equals(marker)) { cleanup(); resolve(undefined); }
53
+ };
54
+ if (input.isTTY) input.setRawMode(true);
55
+ input.on("data", onData);
56
+ input.on("error", onError);
57
+ input.resume();
58
+ if (promotionFile !== undefined) {
59
+ poll = setInterval(() => {
60
+ if (existsSync(promotionFile)) { cleanup(); resolve(undefined); }
61
+ }, 10);
62
+ }
63
+ }));
64
+ }
65
+
66
+ /**
67
+ * Security: consume bridge credentials into caller-private memory and erase their inheritable
68
+ * environment entries before any extension-capable module loads.
69
+ * @param {readonly string[]} arguments_
70
+ * @param {Record<string, string | undefined>} environment
71
+ */
72
+ export function consumeTabLaunchContext(arguments_, environment) {
73
+ const uiArguments = [...arguments_];
74
+ const tabArgument = uiArguments.indexOf("--tab");
75
+ const tabMode = tabArgument !== -1;
76
+ if (tabMode) uiArguments.splice(tabArgument, 1);
77
+ const standbyArgument = uiArguments.indexOf("--tab-standby");
78
+ const tabStandby = standbyArgument !== -1;
79
+ if (tabStandby) uiArguments.splice(standbyArgument, 1);
80
+ const dataArgument = uiArguments.indexOf("--tab-data-dir");
81
+ const tabDataDir = dataArgument === -1 ? undefined : uiArguments[dataArgument + 1];
82
+ if (dataArgument !== -1) uiArguments.splice(dataArgument, 2);
83
+ const incarnationArgument = uiArguments.indexOf("--tab-incarnation");
84
+ const tabIncarnation = incarnationArgument === -1 ? undefined : Number(uiArguments[incarnationArgument + 1]);
85
+ if (incarnationArgument !== -1) uiArguments.splice(incarnationArgument, 2);
86
+ const [tabId, token, endpoint, releaseId] = TAB_ENVIRONMENT_NAMES.map(name => environment[name]);
87
+ for (const name of TAB_ENVIRONMENT_NAMES) delete environment[name];
88
+ if (!tabMode) return { uiArguments, tabCredentials: undefined, tabStandby: false };
89
+ if (!tabId || !token || !endpoint || !tabDataDir || tabDataDir.includes("\0")
90
+ || typeof tabIncarnation !== "number" || !Number.isSafeInteger(tabIncarnation) || tabIncarnation < 1) {
91
+ throw new Error("A1 tab mode requires bridge credentials, recovery directory, and incarnation");
92
+ }
93
+ return { uiArguments, tabCredentials: { tabId, token, endpoint, ...(releaseId === undefined ? {} : { releaseId }) }, tabDataDir, tabIncarnation, tabStandby };
94
+ }
package/bin/ui.js CHANGED
@@ -1,11 +1,18 @@
1
1
  #!/usr/bin/env node
2
2
 
3
+ // Security: this helper has no A1, Pi, tool, or extension dependency and erases credentials before those modules load.
4
+ const { assignFreshSessionRuntimeId, consumeTabLaunchContext, formatResidentFallbackNotice, waitForStandbyPromotion } = await import("./tab-launch-context.js");
5
+ const { uiArguments, tabCredentials, tabDataDir, tabIncarnation, tabStandby } = consumeTabLaunchContext(process.argv.slice(2), process.env);
6
+
3
7
  // Invariant: one terminal module identity per process, decided before any A1 or Pi module loads.
4
8
  const { installPinnedPiTuiResolver } = await import("./module-resolver.js");
5
9
  installPinnedPiTuiResolver(new URL("..", import.meta.url).pathname.replace(/^\/(.:)/, "$1").replace(/\/$/, ""));
10
+ const utilityRoute = tabCredentials === undefined
11
+ ? null
12
+ : (await import("../dist/foundation/resident-tabs/routes.js")).residentUtilityRoute(tabCredentials.tabId);
6
13
  const startup = await import("../dist/foundation/startup/startup-runtime.js");
7
14
  startup.enableEnvironmentCompileCache(process.env);
8
- const { readLaunchContext } = await import("../dist/foundation/launch-context/index.js");
15
+ const { hidesTabSettings, readLaunchContext } = await import("../dist/foundation/launch-context/index.js");
9
16
  const launchContext = readLaunchContext(process.env, "profile");
10
17
  const profile = launchContext.launchProfile;
11
18
  if (profile === undefined) throw new Error("A1 launch profile is missing");
@@ -14,78 +21,119 @@ if (profile === "a1") {
14
21
  import("node:crypto"),
15
22
  import("../dist/product-identity.js"),
16
23
  ]);
17
- process.env[PRODUCT_IDENTITY.environment.sessionRuntimeId] = randomUUID();
24
+ assignFreshSessionRuntimeId(process.env, PRODUCT_IDENTITY.environment.sessionRuntimeId, randomUUID);
18
25
  }
19
26
  const { installFatalExit } = await import("../dist/foundation/terminal-cleanup/fatal-exit.js");
20
27
  const { resolveProductPaths } = await import("../dist/foundation/lifecycle/paths.js");
21
- const { join } = await import("node:path");
28
+ const { dirname, join } = await import("node:path");
22
29
  /** @type {{ dispose(): void | Promise<unknown> } | undefined} */
23
30
  let runningApplication;
24
31
  const fatal = profile === "a1" ? installFatalExit({
25
- directory: join(resolveProductPaths().runtimeDir, "crashes"),
32
+ directory: tabDataDir === undefined
33
+ ? join(resolveProductPaths().runtimeDir, "crashes")
34
+ : join(dirname(tabDataDir), "diagnostics"),
26
35
  ...(launchContext.releaseId === undefined ? {} : { releaseId: launchContext.releaseId }),
27
36
  dispose: () => runningApplication?.dispose(),
28
37
  }) : undefined;
29
- const [{ fileURLToPath }, identity, descriptor] = await Promise.all([
38
+ const [{ fileURLToPath }, identity] = await Promise.all([
30
39
  import("node:url"),
31
40
  import("./module-identity.js"),
32
- import("../dist/foundation/startup/startup-descriptor.js"),
33
41
  ]);
34
42
  const packageRootPath = fileURLToPath(new URL("..", import.meta.url));
35
43
  identity.configurePinnedPiPublicPackage(packageRootPath);
36
- // Performance: begin the exact launch graph together while the trace write is pending.
37
- // Direct owned-module entries avoid evaluating unrelated barrel exports before first paint.
38
- const modules = descriptor.loadDeclaredStartupGraph();
39
- await startup.markStartupPhase(process.env, "ui-entry");
40
- const [
41
- { runSelectedInteractiveRuntime },
42
- { parseSessionSelection },
43
- { createConsoleProjectTrustPrompt },
44
- { createConsoleSessionForkPrompt },
45
- { runOwnedUi, terminateOwnedUiProcess },
46
- { composeOwnedUi },
47
- ] = await modules;
48
44
 
49
- // Compatibility: before the composition uses pinned Pi's terminal stack: confirm A1 and Pi
50
- // resolve it to the same copy, so extensions and the owned UI share one module identity.
51
- identity.assertSinglePiTuiModuleAtLaunch(packageRootPath, (/** @type {string} */ message) => process.stderr.write(message));
52
- await startup.markStartupPhase(process.env, "ui-modules-loaded");
45
+ // Compatibility: before either composition uses pinned Pi's terminal stack, confirm A1 and Pi
46
+ // resolve it to the same copy so every owned screen shares one module identity.
47
+ const assertPiTuiIdentity = () => identity.assertSinglePiTuiModuleAtLaunch(
48
+ packageRootPath,
49
+ (/** @type {string} */ message) => process.stderr.write(message),
50
+ );
51
+
52
+ if (utilityRoute !== null) {
53
+ if (profile !== "a1" || tabCredentials === undefined) throw new Error("utility tabs require the normal A1 tab profile");
54
+ await startup.markStartupPhase(process.env, "ui-entry");
55
+ assertPiTuiIdentity();
56
+ const utility = await import("../dist/composition/utility-tab.js");
57
+ await startup.markStartupPhase(process.env, "ui-modules-loaded");
58
+ const bridge = new (await import("../dist/foundation/resident-tabs/bridge-client.js")).TabBridgeClient({ credentials: tabCredentials });
59
+ completeRun(utility.runUtilityTab({
60
+ route: utilityRoute,
61
+ bridge,
62
+ cwd: process.cwd(),
63
+ profileId: profile,
64
+ onApplication: application => { runningApplication = application; },
65
+ }), utility.terminateOwnedUiProcess);
66
+ } else {
67
+ const descriptor = await import("../dist/foundation/startup/startup-descriptor.js");
68
+ // Performance: begin the exact Agent launch graph together while the trace write is pending.
69
+ // Direct owned-module entries avoid evaluating unrelated barrel exports before first paint.
70
+ const modules = descriptor.loadDeclaredStartupGraph();
71
+ await startup.markStartupPhase(process.env, "ui-entry");
72
+ const [
73
+ { runSelectedInteractiveRuntime },
74
+ { parseSessionSelection },
75
+ { createConsoleProjectTrustPrompt },
76
+ { createConsoleSessionForkPrompt },
77
+ { runOwnedUi, terminateOwnedUiProcess },
78
+ { composeOwnedUi },
79
+ ] = await modules;
53
80
 
54
- const sessionSelection = parseSessionSelection(process.argv.slice(2));
55
- Promise.resolve().then(() => {
56
- if (sessionSelection && profile !== "a1") throw new Error("session selection requires the normal A1 profile");
57
- return runSelectedInteractiveRuntime(profile, {
58
- ownedUi: async (profileId, ownedSurfaces) => {
59
- const processInspector = ownedSurfaces
60
- ? await import("../dist/foundation/process-containment/native-process-inspector.js")
61
- .then(module => module.createNativeProcessInspector(process.env, process.platform, launchContext.releaseRoot))
62
- .catch(() => null)
63
- : null;
64
- const { application, settings } = await composeOwnedUi({
65
- cwd: process.cwd(),
66
- profileId,
67
- ownedSurfaces,
68
- ...(processInspector === null ? {} : { inspectProcess: pid => processInspector.observe(pid) }),
69
- projectTrustPrompt: createConsoleProjectTrustPrompt({ presentation: profile === "a1" ? "bare" : "comparison" }),
70
- sessionForkPrompt: createConsoleSessionForkPrompt(),
71
- ...(sessionSelection === undefined ? {} : { sessionSelection }),
72
- });
73
- runningApplication = application;
74
- return await runOwnedUi({ application, ...(settings === null ? {} : { settings }) });
81
+ if (tabStandby) await waitForStandbyPromotion(process.stdin, tabDataDir === undefined ? undefined : join(tabDataDir, "standby-promote"));
82
+ assertPiTuiIdentity();
83
+ await startup.markStartupPhase(process.env, "ui-modules-loaded");
84
+
85
+ const sessionSelection = parseSessionSelection(uiArguments);
86
+ completeRun(Promise.resolve().then(async () => {
87
+ const tab = tabCredentials === undefined ? undefined : {
88
+ bridge: new (await import("../dist/foundation/resident-tabs/bridge-client.js")).TabBridgeClient({ credentials: tabCredentials }),
89
+ dataDir: /** @type {string} */ (tabDataDir),
90
+ incarnation: /** @type {number} */ (tabIncarnation),
91
+ };
92
+ if (sessionSelection && profile !== "a1") throw new Error("session selection requires the normal A1 profile");
93
+ return runSelectedInteractiveRuntime(profile, {
94
+ ownedUi: async (profileId, ownedSurfaces) => {
95
+ const processInspector = ownedSurfaces
96
+ ? await import("../dist/foundation/process-containment/native-process-inspector.js")
97
+ .then(module => module.createNativeProcessInspector(process.env, process.platform, launchContext.releaseRoot))
98
+ .catch(() => null)
99
+ : null;
100
+ const { application, settings } = await composeOwnedUi({
101
+ cwd: process.cwd(),
102
+ profileId,
103
+ ownedSurfaces,
104
+ notificationVersion: launchContext.updateVersion,
105
+ ...(hidesTabSettings(launchContext) ? { hideTabSettings: true } : {}),
106
+ ...(processInspector === null ? {} : { inspectProcess: pid => processInspector.observe(pid) }),
107
+ projectTrustPrompt: createConsoleProjectTrustPrompt({ presentation: profile === "a1" ? "bare" : "comparison" }),
108
+ sessionForkPrompt: createConsoleSessionForkPrompt(),
109
+ ...(sessionSelection === undefined ? {} : { sessionSelection }),
110
+ ...(tab === undefined ? {} : { tab }),
111
+ ...(launchContext.residentFallback === undefined ? {} : {
112
+ residentFallbackNotice: formatResidentFallbackNotice(launchContext.residentFallback),
113
+ }),
114
+ });
115
+ runningApplication = application;
116
+ return await runOwnedUi({ application, ...(settings === null ? {} : { settings }) });
117
+ },
118
+ });
119
+ }), terminateOwnedUiProcess);
120
+ }
121
+
122
+ /** @param {Promise<number>} run @param {(code: number) => Promise<never>} terminate */
123
+ function completeRun(run, terminate) {
124
+ run.then(
125
+ code => {
126
+ fatal?.remove();
127
+ return terminate(code);
75
128
  },
76
- });
77
- }).then(
78
- code => {
79
- fatal?.remove();
80
- return terminateOwnedUiProcess(code);
81
- },
82
- error => {
83
- const sessionSelectionError = error?.name === "PiSessionSelectionError";
84
- const trustExit = error?.name === "ProjectTrustPromptExitError";
85
- if (fatal && !sessionSelectionError && !trustExit) { fatal.fail(error); return; }
86
- fatal?.remove();
87
- if (trustExit) return terminateOwnedUiProcess(error.exitCode);
88
- console.error(error instanceof Error ? error.message : String(error));
89
- process.exitCode = sessionSelectionError ? error.exitCode : 1;
90
- },
91
- );
129
+ error => {
130
+ const sessionSelectionError = error?.name === "PiSessionSelectionError";
131
+ const trustExit = error?.name === "ProjectTrustPromptExitError";
132
+ if (fatal && !sessionSelectionError && !trustExit) { fatal.fail(error); return; }
133
+ fatal?.remove();
134
+ if (trustExit) return terminate(error.exitCode);
135
+ console.error(error instanceof Error ? error.message : String(error));
136
+ process.exitCode = sessionSelectionError ? error.exitCode : 1;
137
+ },
138
+ );
139
+ }
@@ -39,7 +39,7 @@ export class ClipboardDiagnosticCapture {
39
39
  // Security: project only declared scalar fields. Never serialize the supplied event object or raw errors.
40
40
  this.#records.push({ source, phase: event.phase, atMs: scalar(event.atMs), request: event.request !== undefined && event.request < 0 ? -scalar(-event.request) : scalar(event.request), pending: scalar(event.pending), bytes: scalar(event.bytes), elapsedMs: scalar(event.elapsedMs),
41
41
  sourceUnits: scalar(event.sourceUnits), pendingBytes,
42
- transport: ["native", "terminal", "provided", "injected"].includes(event.transport ?? "") ? event.transport : "none",
42
+ transport: ["native", "terminal", "platform", "provided", "injected"].includes(event.transport ?? "") ? event.transport : "none",
43
43
  outcome: ["ready", "failed", "canceled", "delivered", "submitted-unverified", "timed-out", "superseded"].includes(event.outcome ?? "") ? event.outcome : "none" });
44
44
  if (this.#records.length > 128)
45
45
  this.#records.shift();
@@ -0,0 +1,42 @@
1
+ import type { OwnedUiCommandResult, OwnedUiDialog } from "../../contracts/owned-ui/index.js";
2
+ import type { UiRouteHost, UiRouteInput } from "../../ui/apps/contracts.js";
3
+ import type { PiShellSelectorOption } from "../../integrations/pi/components/shell-shared-facade.js";
4
+ import type { PiTuiOverlayHandle } from "../../integrations/pi/tui-runtime/contracts.js";
5
+ import type { OwnedUiPresenterTerminal } from "./shell-host.js";
6
+ import type { OwnedUiSessionShellOptions, OwnedUiSessionShellRoot } from "./session-shell-root.js";
7
+ type StartupRoute = NonNullable<OwnedUiSessionShellOptions["engine"]["startupRoute"]>;
8
+ export interface SessionDialogPorts {
9
+ readonly terminal: Pick<OwnedUiPresenterTerminal, "running" | "hasOverlay" | "showOverlay" | "openRoute" | "requestRender">;
10
+ readonly root: Pick<OwnedUiSessionShellRoot, "dismissNotice" | "setInputSurface" | "usesDefaultInputSurface">;
11
+ readonly routeHost: UiRouteHost | null;
12
+ readonly disposed: () => boolean;
13
+ /** A route, or the interrupt chord over it, asked to leave A1. */
14
+ readonly exit: () => void;
15
+ /** A rendered route closed itself. */
16
+ readonly routeClosed?: (route: string) => void;
17
+ readonly startupRoute?: StartupRoute;
18
+ }
19
+ /**
20
+ * Owns the one modal overlay a session shows at a time, whichever source opened it: an owned route,
21
+ * a local selector, or a backend dialog. Opening one hides the previous one, and every close path
22
+ * clears the same state.
23
+ */
24
+ export declare class SessionDialogCoordinator {
25
+ #private;
26
+ constructor(ports: SessionDialogPorts);
27
+ /** Clears the replacement input surface a selector put in the dock; the shared close action of every dock selector. */
28
+ readonly closeInputSurface: () => void;
29
+ showSelector(title: string, options: readonly PiShellSelectorOption[], onSelect: (id: string) => void, onCancel?: () => void): PiTuiOverlayHandle;
30
+ /** Mirrors the backend's pending dialog; locally owned routes and selectors are left alone when it has none. */
31
+ syncBackend(dialog: OwnedUiDialog | null): void;
32
+ openRoute(route: string, input?: UiRouteInput, onClosed?: () => void | Promise<void>): OwnedUiCommandResult;
33
+ claimsRoute(name: string): boolean;
34
+ /** Retains a route requested before the runtime runs; the latest request wins. */
35
+ retainStartupRoute(route: string): void;
36
+ /** Opens the retained startup route once no overlay or replacement input surface holds the screen. */
37
+ presentStartupRoute(): void;
38
+ /** A replaced session takes its dialog with it; a retained startup route still opens. */
39
+ onSessionReplaced(): void;
40
+ dispose(): void;
41
+ }
42
+ export {};
@@ -0,0 +1,133 @@
1
+ import { createPiShellDialog, createPiShellSelector } from "../../integrations/pi/components/shell-selectors-dialogs.js";
2
+ const OVERLAY_OPTIONS = { width: "70%", maxHeight: "80%", anchor: "center", inputCoordination: "owned" };
3
+ const STARTUP_ROUTE_RETRY_MS = 25;
4
+ /**
5
+ * Owns the one modal overlay a session shows at a time, whichever source opened it: an owned route,
6
+ * a local selector, or a backend dialog. Opening one hides the previous one, and every close path
7
+ * clears the same state.
8
+ */
9
+ export class SessionDialogCoordinator {
10
+ #ports;
11
+ #handle;
12
+ #id;
13
+ #source;
14
+ #startupRoute;
15
+ #startupRouteTimer;
16
+ constructor(ports) {
17
+ this.#ports = ports;
18
+ this.#startupRoute = ports.startupRoute;
19
+ }
20
+ /** Clears the replacement input surface a selector put in the dock; the shared close action of every dock selector. */
21
+ closeInputSurface = () => {
22
+ this.#ports.root.setInputSurface(null);
23
+ this.#ports.terminal.requestRender();
24
+ };
25
+ showSelector(title, options, onSelect, onCancel) {
26
+ this.#handle?.hide();
27
+ this.#source = "local";
28
+ this.#id = undefined;
29
+ const component = createPiShellSelector({
30
+ title,
31
+ options,
32
+ onSelect: id => {
33
+ onSelect(id);
34
+ this.#close();
35
+ },
36
+ onCancel: () => {
37
+ this.#close();
38
+ onCancel?.();
39
+ },
40
+ });
41
+ const handle = this.#ports.terminal.showOverlay(component, OVERLAY_OPTIONS);
42
+ this.#handle = handle;
43
+ return handle;
44
+ }
45
+ /** Mirrors the backend's pending dialog; locally owned routes and selectors are left alone when it has none. */
46
+ syncBackend(dialog) {
47
+ if (!this.#ports.terminal.running)
48
+ return;
49
+ if (dialog === null) {
50
+ // Invariant: locally owned routes (notably /settings) are independent of backend
51
+ // lifecycle/status events and remain open while an agent is working.
52
+ if (this.#source === "backend")
53
+ this.#close();
54
+ return;
55
+ }
56
+ if (this.#source === "backend" && this.#id === dialog.id)
57
+ return;
58
+ this.#handle?.hide();
59
+ this.#source = "backend";
60
+ const component = createPiShellDialog(dialog, { onSelect: () => this.#close(), onCancel: () => this.#close() });
61
+ this.#handle = this.#ports.terminal.showOverlay(component, OVERLAY_OPTIONS);
62
+ this.#id = dialog.id;
63
+ }
64
+ openRoute(route, input, onClosed) {
65
+ const surface = this.#ports.routeHost?.open(route, input) ?? null;
66
+ if (surface === null)
67
+ return { outcome: "failed", diagnostic: `route is unavailable: ${route}` };
68
+ if (!this.#ports.terminal.running)
69
+ return { outcome: "failed", diagnostic: "runtime is not active" };
70
+ this.#ports.root.dismissNotice();
71
+ this.#handle?.hide();
72
+ this.#source = "route";
73
+ const handle = this.#ports.terminal.openRoute(surface, {
74
+ exit: () => this.#ports.exit(),
75
+ closed: rendered => {
76
+ if (this.#handle === handle)
77
+ this.#clear();
78
+ if (rendered) {
79
+ try {
80
+ void onClosed?.()?.catch(() => undefined);
81
+ }
82
+ catch { /* Rationale: a failed acknowledgement stays pending. */ }
83
+ this.#ports.routeClosed?.(route);
84
+ }
85
+ },
86
+ });
87
+ this.#handle = handle;
88
+ this.#id = surface.id;
89
+ return { outcome: "completed", diagnostic: null };
90
+ }
91
+ claimsRoute(name) {
92
+ return this.#ports.routeHost?.claims(name) ?? false;
93
+ }
94
+ /** Retains a route requested before the runtime runs; the latest request wins. */
95
+ retainStartupRoute(route) {
96
+ this.#startupRoute = { route };
97
+ }
98
+ /** Opens the retained startup route once no overlay or replacement input surface holds the screen. */
99
+ presentStartupRoute() {
100
+ const pending = this.#startupRoute;
101
+ if (pending === undefined || this.#ports.disposed() || !this.#ports.terminal.running)
102
+ return;
103
+ if (this.#ports.terminal.hasOverlay() || !this.#ports.root.usesDefaultInputSurface()) {
104
+ this.#startupRouteTimer = setTimeout(() => {
105
+ this.#startupRouteTimer = undefined;
106
+ this.presentStartupRoute();
107
+ }, STARTUP_ROUTE_RETRY_MS);
108
+ this.#startupRouteTimer.unref?.();
109
+ return;
110
+ }
111
+ this.#startupRoute = undefined;
112
+ this.openRoute(pending.route, pending.input, pending.onClosed);
113
+ }
114
+ /** A replaced session takes its dialog with it; a retained startup route still opens. */
115
+ onSessionReplaced() {
116
+ this.#close();
117
+ }
118
+ dispose() {
119
+ if (this.#startupRouteTimer !== undefined)
120
+ clearTimeout(this.#startupRouteTimer);
121
+ this.#startupRouteTimer = undefined;
122
+ this.#handle?.hide();
123
+ }
124
+ #close() {
125
+ this.#handle?.hide();
126
+ this.#clear();
127
+ }
128
+ #clear() {
129
+ this.#handle = undefined;
130
+ this.#id = undefined;
131
+ this.#source = undefined;
132
+ }
133
+ }