@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
@@ -2,7 +2,7 @@ import { PiTranscriptProjection } from "./transcript-projection.js";
2
2
  import { isRecord, readModel, readStringArray, readThinkingLevel, stringProperty } from "./message-values.js";
3
3
  import { getAgentDir } from "../startup-public.js";
4
4
  import { assertOwnedUiSnapshot, } from "../../../contracts/owned-ui/index.js";
5
- import { PiCommandDispatch } from "./command-dispatch.js";
5
+ import { PiCommandDispatch, performEngineCommand } from "./command-dispatch.js";
6
6
  import { PiEventDelivery } from "./event-delivery.js";
7
7
  import { PiExtensionUiBinding } from "./extension-ui-binding.js";
8
8
  import { PiPromptSuggestions } from "./prompt-suggestions.js";
@@ -15,16 +15,12 @@ import { readUsageView } from "./usage-view.js";
15
15
  import { PiWorkflowContexts } from "./workflow-contexts.js";
16
16
  import { PiWorkflowRunner } from "./workflow-runner.js";
17
17
  import { defaultWorkflowHost } from "./workflow-support.js";
18
+ import { EngineViewState } from "./view-state.js";
19
+ import { createEnginePorts } from "./ports.js";
18
20
  /** Explicit flush failure when required delivery was interrupted rather than completed. */
19
21
  export class EngineDeliveryError extends Error {
20
22
  constructor() { super("Engine delivery did not complete"); this.name = "EngineDeliveryError"; }
21
23
  }
22
- const DEFAULT_SURFACE = {
23
- columns: 100,
24
- rows: 32,
25
- focusedRegion: "editor",
26
- hardwareCursor: false,
27
- };
28
24
  /** Owns the pinned Pi session lifecycle and serves it to the owned shell as the neutral session backend. */
29
25
  export class PiEngineAdapter {
30
26
  #agentDir;
@@ -38,31 +34,11 @@ export class PiEngineAdapter {
38
34
  #resources;
39
35
  #settings;
40
36
  #suggestions;
41
- #viewRevision = 0;
42
- #lifecycle = "starting";
43
- #editor = {
44
- text: "",
45
- queuedSubmissions: [],
46
- selection: null,
47
- cursorOffset: 0,
48
- historyRevision: 0,
49
- submitEnabled: false,
50
- };
51
- #status = {
52
- title: "Pi",
53
- workingMessage: null,
54
- diagnostics: [],
55
- badges: [],
56
- };
57
- #terminal = DEFAULT_SURFACE;
58
- #activeModel = null;
59
- #thinkingLevel = "medium";
37
+ #state = new EngineViewState();
60
38
  #projection = new PiTranscriptProjection({
61
39
  retryAttempt: () => this.#engine.session?.retryAttempt ?? 0,
62
40
  blockChanged: block => this.#emitEvent({ type: "transcript-block", block }),
63
41
  });
64
- #usageCache;
65
- #diagnostics = [];
66
42
  // Invariant: every port closes over adapter state read at call time, so delivery is built before a session binds.
67
43
  #delivery = new PiEventDelivery({
68
44
  sessionId: () => this.#sessionId,
@@ -80,36 +56,30 @@ export class PiEngineAdapter {
80
56
  #events = new PiSessionEvents(this.#projection, {
81
57
  sessionGeneration: () => this.#engine.generation,
82
58
  sessionMessages: () => this.#engine.session?.messages ?? [],
83
- activeModel: () => this.#activeModel,
59
+ activeModel: () => this.#state.activeModel,
84
60
  replaceTranscript: blocks => { this.#setTranscript(blocks); },
85
61
  emit: value => { this.#emitEvent(value); },
86
62
  emitView: () => { this.#emitView(); },
87
63
  enterWork: message => {
88
- const wasBusy = this.#lifecycle === "busy";
89
- this.#lifecycle = "busy";
90
- this.#status = { ...this.#status, workingMessage: message, workingProgress: null };
91
- if (!wasBusy)
64
+ if (!this.#state.enterWork(message))
92
65
  this.#emitEvent({ type: "session-lifecycle", lifecycle: "busy", reason: null });
93
- this.#emitEvent({ type: "status", status: this.#status });
66
+ this.#emitEvent({ type: "status", status: this.#state.status });
94
67
  },
95
68
  leaveWork: () => {
96
- this.#lifecycle = "ready";
97
- this.#status = { ...this.#status, workingMessage: null, workingProgress: null };
69
+ this.#state.leaveWork();
98
70
  this.#emitEvent({ type: "session-lifecycle", lifecycle: "ready", reason: null });
99
- this.#emitEvent({ type: "status", status: this.#status });
71
+ this.#emitEvent({ type: "status", status: this.#state.status });
100
72
  },
101
73
  workProgress: percent => {
102
- if (this.#status.workingProgress === percent)
103
- return;
104
- this.#status = { ...this.#status, workingProgress: percent };
105
- this.#emitEvent({ type: "status", status: this.#status });
74
+ if (this.#state.setWorkProgress(percent))
75
+ this.#emitEvent({ type: "status", status: this.#state.status });
106
76
  },
107
77
  queueChanged: queuedSubmissions => {
108
- this.#editor = { ...this.#editor, queuedSubmissions: [...queuedSubmissions], historyRevision: this.#editor.historyRevision + 1 };
109
- this.#emitEvent({ type: "editor-state", editor: this.#editor });
78
+ this.#state.setQueuedSubmissions(queuedSubmissions);
79
+ this.#emitEvent({ type: "editor-state", editor: this.#state.editor });
110
80
  },
111
- thinkingLevelChanged: level => { this.#thinkingLevel = level; },
112
- usageInvalidated: () => { this.#usageCache = undefined; },
81
+ thinkingLevelChanged: level => { this.#state.thinkingLevel = level; },
82
+ usageInvalidated: () => { this.#state.invalidateUsage(); },
113
83
  compactionStarted: () => { this.#engine.compactionStarted(); },
114
84
  compactionEnded: () => { this.#engine.compactionEnded(); },
115
85
  deliverQueuedAfterCompaction: () => { this.#engine.deliverQueuedAfterCompaction(); },
@@ -146,10 +116,7 @@ export class PiEngineAdapter {
146
116
  }, {
147
117
  disposed: () => this.#disposed,
148
118
  started: runtime => {
149
- this.#terminal = {
150
- ...this.#terminal,
151
- hardwareCursor: runtime.services.settingsManager?.getShowHardwareCursor?.() ?? this.#terminal.hardwareCursor,
152
- };
119
+ this.#state.setHardwareCursor(runtime.services.settingsManager?.getShowHardwareCursor?.() ?? this.#state.terminal.hardwareCursor);
153
120
  const httpIdleTimeoutMs = runtime.services.settingsManager?.getHttpIdleTimeoutMs?.();
154
121
  if (typeof httpIdleTimeoutMs === "number")
155
122
  this.#engineHost.httpPolicyLoaded(httpIdleTimeoutMs, this.#sessionId);
@@ -168,7 +135,7 @@ export class PiEngineAdapter {
168
135
  session: () => this.#engine.session,
169
136
  runtime: () => this.#engine.runtime,
170
137
  disposed: () => this.#disposed,
171
- activeModel: () => this.#activeModel,
138
+ activeModel: () => this.#state.activeModel,
172
139
  emitView: () => { this.#emitView(); },
173
140
  });
174
141
  this.#workflows = new PiWorkflowRunner({ agentDir: this.#agentDir, host: this.#workflowHost, contexts: this.#contexts }, {
@@ -181,10 +148,10 @@ export class PiEngineAdapter {
181
148
  pendingCommandCount: () => this.#commands.pendingCount,
182
149
  beginRunning: () => { this.#runningCommands++; },
183
150
  endRunning: () => { this.#runningCommands--; },
184
- activeModel: () => this.#activeModel,
185
- setActiveModel: model => { this.#activeModel = model; },
186
- thinkingLevel: () => this.#thinkingLevel,
187
- setThinkingLevel: level => { this.#thinkingLevel = level; },
151
+ activeModel: () => this.#state.activeModel,
152
+ setActiveModel: model => { this.#state.activeModel = model; },
153
+ thinkingLevel: () => this.#state.thinkingLevel,
154
+ setThinkingLevel: level => { this.#state.thinkingLevel = level; },
188
155
  emitView: () => { this.#emitView(); },
189
156
  reconcileActiveModelAvailability: () => { this.#reconcileActiveModelAvailability(); },
190
157
  bindExtensionUiToSession: () => this.#extensions.rebind(),
@@ -200,7 +167,7 @@ export class PiEngineAdapter {
200
167
  sessionGeneration: () => this.#engine.generation,
201
168
  beginRunning: () => { this.#runningCommands++; },
202
169
  endRunning: () => { this.#runningCommands--; },
203
- perform: command => this.#perform(command),
170
+ perform: command => performEngineCommand(command, this.#commandContext()),
204
171
  emit: value => { this.#emitEvent(value); },
205
172
  emitView: () => { this.#emitView(); },
206
173
  diagnostic: (severity, code, message, recoverable) => { this.#addDiagnostic(severity, code, message, recoverable); },
@@ -212,14 +179,14 @@ export class PiEngineAdapter {
212
179
  this.#settings = new PiEngineSettings({ availableThemes: options.availableThemes ?? null, productMode: options.settingsProductMode ?? "bare" }, {
213
180
  runtime: () => this.#engine.runtime,
214
181
  requireSession: () => this.#requireWorkflowSession(),
215
- thinkingLevelChanged: level => { this.#thinkingLevel = level; this.#emitView(); },
182
+ thinkingLevelChanged: level => { this.#state.thinkingLevel = level; this.#emitView(); },
216
183
  httpPolicyChanged: timeoutMs => { this.#engineHost.httpPolicyChanged(timeoutMs, this.#sessionId); },
217
184
  emitView: () => { this.#emitView(); },
218
185
  });
219
186
  this.#suggestions = new PiPromptSuggestions({
220
187
  session: () => this.#engine.session,
221
188
  runtime: () => this.#engine.runtime,
222
- activeModel: () => this.#activeModel,
189
+ activeModel: () => this.#state.activeModel,
223
190
  identity: () => ({ sessionId: this.#sessionId, sessionGeneration: this.#engine.generation, runSequence: this.#events.runSequence, responseSequence: this.#events.responseSequence }),
224
191
  unavailable: () => this.#disposed || this.#delivery.overloaded || this.#admissionStopped,
225
192
  });
@@ -236,42 +203,21 @@ export class PiEngineAdapter {
236
203
  setWorkflowInteractionHost(interaction) {
237
204
  this.#workflowInteraction = interaction;
238
205
  }
239
- get sessionId() {
240
- return this.#sessionId;
241
- }
242
- get sessionGeneration() {
243
- return this.#engine.generation;
244
- }
245
- /** Actual session replacements, excluding delivery-only invalidation of callbacks. */
246
- get sessionBindingGeneration() { return this.#engine.bindingGeneration; }
247
- get cwd() {
248
- return this.#engine.cwd;
249
- }
250
- get agentDir() {
251
- return this.#agentDir;
252
- }
253
- resolveTranscriptImage(assetId) {
206
+ #resolveTranscriptImage(assetId) {
254
207
  return this.#projection.assets.resolve(assetId);
255
208
  }
256
- currentSessionFile() {
257
- return this.#engine.currentSessionFile();
258
- }
259
- currentSessionResumeMetadata() {
260
- return this.#engine.currentSessionResumeMetadata();
261
- }
262
- get disposed() {
263
- return this.#disposed;
264
- }
265
- /**
266
- * Report a newer A1 release found by the startup check. The shell renders the diagnostic as
267
- * pinned Pi's `Update Available` notice; it arrives whenever the check resolves, so a late
268
- * result is appended to the transcript like Pi's own fire-and-forget version check.
269
- */
270
- announceReleaseUpdate(release) {
209
+ // Rationale: the startup check's newer release becomes pinned Pi's `Update Available` notice; it arrives
210
+ // whenever the check resolves, so a late result is appended like Pi's own fire-and-forget version check.
211
+ #announceReleaseUpdate(release) {
271
212
  if (this.#disposed)
272
213
  return;
273
- const changelog = release.changelogUrl === null ? "" : `\nChangelog: ${release.changelogUrl}`;
274
- this.#addDiagnostic("info", "release-update", `New version ${release.version} is available. Run ${release.command}${changelog}`, true);
214
+ if (release.status === "installed") {
215
+ this.#addDiagnostic("info", "release-update-installed", `Update ${release.version} installed; restart to update.`, true);
216
+ }
217
+ else {
218
+ const changelog = release.changelogUrl === null ? "" : `\nChangelog: ${release.changelogUrl}`;
219
+ this.#addDiagnostic("info", "release-update", `New version ${release.version} is available. Run ${release.command}${changelog}`, true);
220
+ }
275
221
  this.#emitView();
276
222
  }
277
223
  suggestionReasoningPolicy() {
@@ -280,16 +226,18 @@ export class PiEngineAdapter {
280
226
  generate(request) {
281
227
  return this.#suggestions.generate(request);
282
228
  }
229
+ generateResidentTabName(instruction, maxTokens, signal) {
230
+ return this.#suggestions.completeInstruction(instruction, maxTokens, signal);
231
+ }
283
232
  async start() {
284
233
  if (this.#engine.started)
285
234
  return this.view();
286
235
  await this.#engine.start().catch(error => {
287
- this.#lifecycle = "failed";
236
+ this.#state.lifecycle = "failed";
288
237
  this.#addDiagnostic("error", "engine-startup", error instanceof Error ? error.message : String(error), false);
289
238
  throw error;
290
239
  });
291
- this.#lifecycle = "ready";
292
- this.#editor = { ...this.#editor, submitEnabled: true };
240
+ this.#state.markReady();
293
241
  this.#emitEvent({ type: "session-lifecycle", lifecycle: "ready", reason: null });
294
242
  this.#emitView();
295
243
  return this.view();
@@ -312,94 +260,14 @@ export class PiEngineAdapter {
312
260
  async flushEvents() {
313
261
  const failed = this.#delivery.failed;
314
262
  await this.#delivery.settle();
315
- if (failed || this.#delivery.failed || this.#disposed && this.#lifecycle !== "stopped") {
263
+ if (failed || this.#delivery.failed || this.#disposed && this.#state.lifecycle !== "stopped") {
316
264
  this.#delivery.clearFailure();
317
265
  throw new EngineDeliveryError();
318
266
  }
319
267
  }
320
- nonVisualResources() {
321
- return this.#resources.nonVisualResources();
322
- }
323
- extensionResources() {
324
- return this.#resources.extensionResources();
325
- }
326
- workflowAutocompleteCommands() {
327
- return this.#resources.workflowAutocompleteCommands();
328
- }
329
- visualExtensionSupport() {
330
- return this.#extensions.support();
331
- }
332
- bindExtensionUi(ui, shutdown) {
333
- return this.#extensions.bind(ui, shutdown);
334
- }
335
- unbindExtensionUi() {
336
- return this.#extensions.unbind();
337
- }
338
- async cycleModelWorkflow(direction) {
339
- return this.#workflows.cycleModelWorkflow(direction);
340
- }
341
- pinnedProjectTrustContext() {
342
- return this.#contexts.pinnedProjectTrustContext();
343
- }
344
- persistProjectTrust(updates) {
345
- this.#contexts.persistProjectTrust(updates);
346
- }
347
- pinnedScopedModelsContext() {
348
- return this.#contexts.pinnedScopedModelsContext();
349
- }
350
- updateScopedModels(enabledModelIds) {
351
- this.#contexts.updateScopedModels(enabledModelIds);
352
- }
353
- persistScopedModels(enabledModelIds) {
354
- this.#contexts.persistScopedModels(enabledModelIds);
355
- }
356
- refreshScopedModels(signal) {
357
- return this.#contexts.refreshScopedModels(signal);
358
- }
359
- modelsContext() {
360
- return this.#contexts.modelsContext();
361
- }
362
- setSessionModelScope(scopeIds) {
363
- this.#contexts.setSessionModelScope(scopeIds);
364
- }
365
- persistModelScope(scopeIds) {
366
- this.#contexts.persistModelScope(scopeIds);
367
- }
368
- refreshModels(signal) {
369
- return this.#contexts.refreshModels(signal);
370
- }
371
- pinnedLoginOptions(authType) {
372
- return this.#contexts.loginOptions(authType);
373
- }
374
- pinnedLoginMethodOptions(providerReference) {
375
- return this.#contexts.pinnedLoginMethodOptions(providerReference);
376
- }
377
- pinnedAmbientAuthentication(selection) {
378
- return this.#contexts.pinnedAmbientAuthentication(selection);
379
- }
380
- pinnedLogoutOptions() {
381
- return this.#contexts.logoutOptions();
382
- }
383
- pinnedForkOptions() {
384
- return this.#contexts.pinnedForkOptions();
385
- }
386
- /** Bind the owned UI's clipboard lifecycle without changing the comparison host. True means acknowledged delivery. */
387
- bindClipboardWriter(writer) {
388
- return this.#workflows.bindClipboardWriter(writer);
389
- }
390
- /** Workflow and tree copying share the active owner's write fence and delivery acknowledgment. */
391
- copyWorkflowText(text) {
392
- return this.#workflows.copyWorkflowText(text);
393
- }
394
268
  abortBashWorkflow() {
395
269
  this.#workflows.abortBashWorkflow();
396
270
  }
397
- executeBashWorkflow(command, excludeFromContext) {
398
- return this.#workflows.executeBashWorkflow(command, excludeFromContext);
399
- }
400
- reloadBlockedResult() {
401
- return this.#workflows.reloadBlockedResult();
402
- }
403
271
  async executeWorkflow(request) {
404
272
  const result = await this.#workflows.executeWorkflow(request);
405
273
  if (request.command === "tree" && result.outcome === "completed" && request.selection !== undefined) {
@@ -414,40 +282,13 @@ export class PiEngineAdapter {
414
282
  configuredTheme() {
415
283
  return this.#settings.configuredTheme();
416
284
  }
417
- /** Persist the global thinking default without changing the live session level. */
418
- setDefaultThinkingLevel(level) {
419
- this.#settings.setDefaultThinkingLevel(level);
420
- }
421
285
  /** Settings port for the live runtime, or null before the runtime is available. */
422
286
  settingsPort() {
423
287
  return this.#settings.settingsPort();
424
288
  }
425
- /** Which settings surface this adapter serves; hidden-in-bare effects are unbindable in bare mode. */
426
- get settingsProductMode() {
427
- return this.#settings.productMode;
428
- }
429
- bindSettingsOwner(owner, handlers) {
430
- return this.#settings.bindSettingsOwner(owner, handlers);
431
- }
432
289
  pinnedSettingsSnapshot() {
433
290
  return this.#settings.pinnedSettingsSnapshot();
434
291
  }
435
- #pinnedMessageRenderer(customType) {
436
- return this.#requireWorkflowSession().extensionRunner?.getMessageRenderer?.(customType);
437
- }
438
- #pinnedShortcutDescriptions(bindings) {
439
- const shortcuts = this.#requireWorkflowSession().extensionRunner?.getShortcuts?.(bindings);
440
- return shortcuts === undefined ? [] : [...shortcuts].map(([key, shortcut]) => ({ key, description: shortcut.description ?? shortcut.extensionPath }));
441
- }
442
- #pinnedToolRenderers(toolName) {
443
- const runner = this.#requireWorkflowSession().extensionRunner;
444
- if (runner === undefined)
445
- return undefined;
446
- if (typeof runner.resolveToolRenderers === "function") {
447
- return runner.resolveToolRenderers(toolName, () => runner.getToolDefinition?.(toolName));
448
- }
449
- return runner.getToolDefinition?.(toolName);
450
- }
451
292
  clearQueuedWorkflows() {
452
293
  const session = this.#requireWorkflowSession();
453
294
  const result = session.clearQueue?.();
@@ -462,15 +303,15 @@ export class PiEngineAdapter {
462
303
  return {
463
304
  contractVersion: 1,
464
305
  sessionId: this.#sessionId,
465
- revision: this.#viewRevision,
466
- lifecycle: this.#lifecycle,
306
+ revision: this.#state.revision,
307
+ lifecycle: this.#state.lifecycle,
467
308
  transcript: this.#projection.snapshot(),
468
- editor: { ...this.#editor, queuedSubmissions: [...this.#editor.queuedSubmissions] },
309
+ editor: { ...this.#state.editor, queuedSubmissions: [...this.#state.editor.queuedSubmissions] },
469
310
  status: {
470
- ...this.#status,
471
- diagnostics: [...this.#status.diagnostics],
472
- badges: [...this.#status.badges],
473
- usage: this.#usageCache ??= readUsageView(this.#engine.session, this.#engine.runtime, this.#activeModel),
311
+ ...this.#state.status,
312
+ diagnostics: [...this.#state.status.diagnostics],
313
+ badges: [...this.#state.status.badges],
314
+ usage: this.#state.usage(() => readUsageView(this.#engine.session, this.#engine.runtime, this.#state.activeModel)),
474
315
  footer: {
475
316
  branch: this.#engine.gitBranch,
476
317
  repositoryPath: this.#engine.repositoryCwd,
@@ -480,24 +321,24 @@ export class PiEngineAdapter {
480
321
  extensionStatuses: [],
481
322
  },
482
323
  },
483
- terminal: { ...this.#terminal },
484
- activeModel: this.#activeModel === null ? null : { ...this.#activeModel },
324
+ terminal: { ...this.#state.terminal },
325
+ activeModel: this.#state.activeModel === null ? null : { ...this.#state.activeModel },
485
326
  routedModel: routedModel === null ? null : {
486
327
  model: routedModel,
487
328
  ...(routed?.thinkingLevel === undefined ? {} : { thinkingLevel: readThinkingLevel(routed.thinkingLevel) }),
488
329
  },
489
- thinkingLevel: this.#thinkingLevel,
330
+ thinkingLevel: this.#state.thinkingLevel,
490
331
  activeCommandIds: [...this.#commands.activeCommandIds],
491
332
  dialog: null,
492
333
  overlay: null,
493
334
  customizations: [],
494
- diagnostics: this.#diagnostics.map(diagnostic => ({ ...diagnostic })),
335
+ diagnostics: this.#state.diagnostics.map(diagnostic => ({ ...diagnostic })),
495
336
  };
496
337
  }
497
338
  snapshot() {
498
339
  const snapshot = {
499
340
  contractVersion: 1,
500
- snapshotId: `snapshot-${this.#viewRevision}`,
341
+ snapshotId: `snapshot-${this.#state.revision}`,
501
342
  sessionId: this.#sessionId,
502
343
  sequence: this.#delivery.sequence,
503
344
  view: this.view(),
@@ -517,10 +358,10 @@ export class PiEngineAdapter {
517
358
  this.#workflows.cancelPending("quit");
518
359
  this.#projection.assets.clear();
519
360
  await this.#extensions.unbind();
520
- this.#lifecycle = "stopping";
361
+ this.#state.lifecycle = "stopping";
521
362
  this.#emitEvent({ type: "session-lifecycle", lifecycle: "stopping", reason: null });
522
363
  await this.#engine.dispose();
523
- this.#lifecycle = "stopped";
364
+ this.#state.lifecycle = "stopped";
524
365
  this.#emitEvent({ type: "session-lifecycle", lifecycle: "stopped", reason: null });
525
366
  this.#emitView();
526
367
  try {
@@ -531,27 +372,17 @@ export class PiEngineAdapter {
531
372
  throw error;
532
373
  }
533
374
  }
534
- // Invariant: every sub-port member delegates at call time, so ports built once follow session replacement.
375
+ // Invariant: every port member delegates at call time, so ports built once follow session replacement.
535
376
  #createPorts() {
536
- const engine = this.#engine;
537
- const contexts = this.#contexts;
538
- const workflows = this.#workflows;
539
- const settings = this.#settings;
540
- const resources = this.#resources;
541
- const extensions = this.#extensions;
542
- const isDisposed = () => this.#disposed;
543
- const sessionId = this.#sessionId;
544
- const agentDir = this.#agentDir;
545
- return {
546
- identity: {
547
- sessionId,
548
- agentDir,
549
- get cwd() { return engine.cwd; },
550
- get sessionGeneration() { return engine.generation; },
551
- get sessionBindingGeneration() { return engine.bindingGeneration; },
552
- get disposed() { return isDisposed(); },
553
- currentSessionResumeMetadata: () => engine.currentSessionResumeMetadata(),
554
- },
377
+ return createEnginePorts({
378
+ sessionId: this.#sessionId,
379
+ agentDir: this.#agentDir,
380
+ engine: this.#engine,
381
+ contexts: this.#contexts,
382
+ workflows: this.#workflows,
383
+ settings: this.#settings,
384
+ resources: this.#resources,
385
+ extensions: this.#extensions,
555
386
  session: {
556
387
  start: () => this.start(),
557
388
  view: () => this.view(),
@@ -561,67 +392,22 @@ export class PiEngineAdapter {
561
392
  flushEvents: () => this.flushEvents(),
562
393
  dispose: () => this.dispose(),
563
394
  },
564
- workflows: {
565
- executeWorkflow: request => this.executeWorkflow(request),
566
- executeBashWorkflow: (command, excludeFromContext) => workflows.executeBashWorkflow(command, excludeFromContext),
567
- cycleModelWorkflow: direction => workflows.cycleModelWorkflow(direction),
568
- workflowAutocompleteCommands: () => resources.workflowAutocompleteCommands(),
569
- clearQueuedWorkflows: () => this.clearQueuedWorkflows(),
570
- reloadBlockedResult: () => workflows.reloadBlockedResult(),
571
- copyWorkflowText: text => workflows.copyWorkflowText(text),
572
- setWorkflowInteractionHost: interaction => { this.setWorkflowInteractionHost(interaction); },
573
- },
574
- settings: {
575
- get productMode() { return settings.productMode; },
576
- snapshot: () => {
577
- // Invariant: the selector-only model values travel on the presentation source, not in the neutral snapshot.
578
- const { currentModel: _currentModel, availableDefaultModels: _availableDefaultModels, ...snapshot } = settings.pinnedSettingsSnapshot();
579
- return snapshot;
580
- },
581
- bindOwner: (owner, handlers) => settings.bindSettingsOwner(owner, handlers),
582
- setDefaultThinkingLevel: level => { settings.setDefaultThinkingLevel(level); },
583
- configuredTheme: () => settings.configuredTheme(),
584
- },
585
- catalog: {
586
- modelsContext: () => contexts.modelsContext(),
587
- setSessionModelScope: scopeIds => { contexts.setSessionModelScope(scopeIds); },
588
- persistModelScope: scopeIds => { contexts.persistModelScope(scopeIds); },
589
- refreshModels: signal => contexts.refreshModels(signal),
590
- pinnedScopedModelsContext: () => contexts.pinnedScopedModelsContext(),
591
- updateScopedModels: enabledModelIds => { contexts.updateScopedModels(enabledModelIds); },
592
- persistScopedModels: enabledModelIds => { contexts.persistScopedModels(enabledModelIds); },
593
- refreshScopedModels: signal => contexts.refreshScopedModels(signal),
594
- pinnedProjectTrustContext: () => contexts.pinnedProjectTrustContext(),
595
- persistProjectTrust: updates => { contexts.persistProjectTrust(updates); },
596
- pinnedLoginOptions: authType => contexts.loginOptions(authType),
597
- pinnedLoginMethodOptions: providerReference => contexts.pinnedLoginMethodOptions(providerReference),
598
- pinnedAmbientAuthentication: selection => contexts.pinnedAmbientAuthentication(selection),
599
- pinnedLogoutOptions: () => contexts.logoutOptions(),
600
- pinnedForkOptions: () => contexts.pinnedForkOptions(),
601
- },
602
- extensions: {
603
- nonVisualResources: () => resources.nonVisualResources(),
604
- extensionResources: () => resources.extensionResources(),
605
- resolveTranscriptImage: assetId => this.resolveTranscriptImage(assetId),
606
- visualExtensionSupport: () => extensions.support(),
607
- bindExtensionUi: (ui, shutdown) => extensions.bind(ui, shutdown),
608
- unbindExtensionUi: () => extensions.unbind(),
609
- bindClipboardWriter: writer => workflows.bindClipboardWriter(writer),
610
- announceReleaseUpdate: release => { this.announceReleaseUpdate(release); },
611
- },
612
- presentation: {
613
- pinnedModelSelectorContext: () => contexts.pinnedModelSelectorContext(),
614
- pinnedSessionSelectorContext: () => contexts.pinnedSessionSelectorContext(),
615
- pinnedTreeSelectorContext: () => contexts.pinnedTreeSelectorContext(),
616
- pinnedMessageRenderer: customType => this.#pinnedMessageRenderer(customType),
617
- pinnedToolRenderers: toolName => this.#pinnedToolRenderers(toolName),
618
- pinnedShortcutDescriptions: bindings => this.#pinnedShortcutDescriptions(bindings),
619
- pinnedSettingsModels: () => {
620
- const { currentModel, availableDefaultModels } = settings.pinnedSettingsSnapshot();
621
- return { ...(currentModel === undefined ? {} : { currentModel }), availableDefaultModels };
622
- },
623
- applyPinnedSettingValue: (callback, value) => settings.applyPinnedSettingValue(callback, value),
624
- },
395
+ disposed: () => this.#disposed,
396
+ executeWorkflow: request => this.executeWorkflow(request),
397
+ clearQueuedWorkflows: () => this.clearQueuedWorkflows(),
398
+ setWorkflowInteractionHost: interaction => { this.setWorkflowInteractionHost(interaction); },
399
+ announceReleaseUpdate: release => { this.#announceReleaseUpdate(release); },
400
+ resolveTranscriptImage: assetId => this.#resolveTranscriptImage(assetId),
401
+ extensionRunner: () => this.#requireWorkflowSession().extensionRunner,
402
+ });
403
+ }
404
+ #commandContext() {
405
+ return {
406
+ engine: this.#engine,
407
+ state: this.#state,
408
+ admissionOpen: () => !this.#delivery.overloaded && !this.#admissionStopped,
409
+ emit: value => { this.#emitEvent(value); },
410
+ dispose: () => this.dispose(),
625
411
  };
626
412
  }
627
413
  #requireWorkflowSession() {
@@ -629,75 +415,16 @@ export class PiEngineAdapter {
629
415
  throw new Error("engine adapter is not running");
630
416
  return this.#engine.session;
631
417
  }
632
- async #perform(command) {
633
- const runtime = this.#engine.runtime;
634
- const session = this.#engine.session;
635
- const generation = this.#engine.generation;
636
- if (!runtime || !session)
637
- throw new Error("engine session is unavailable");
638
- switch (command.type) {
639
- case "prompt":
640
- case "steer":
641
- case "follow-up":
642
- case "abort":
643
- case "retry":
644
- case "compact": {
645
- const result = await this.#engine.sessionCommands?.execute(command.type === "prompt" || command.type === "steer" || command.type === "follow-up"
646
- ? {
647
- type: command.type,
648
- text: command.text,
649
- ...(command.images === undefined ? {} : { images: [...command.images] }),
650
- }
651
- : { type: command.type });
652
- if (!result || result.outcome === "rejected" || result.outcome === "failed") {
653
- throw new Error(command.type === "retry" ? "no previous prompt is available to retry" : `Pi session command failed: ${command.type}`);
654
- }
655
- return;
656
- }
657
- case "set-model": {
658
- const model = runtime.services.modelRuntime.getModel(command.model.providerId, command.model.modelId);
659
- if (!model) {
660
- throw new Error(`model is unavailable: ${command.model.providerId}/${command.model.modelId}`);
661
- }
662
- await session.setModel(model);
663
- if (generation === this.#engine.generation && !this.#delivery.overloaded && !this.#admissionStopped)
664
- this.#activeModel = { ...command.model };
665
- return;
666
- }
667
- case "set-thinking-level":
668
- session.setThinkingLevel(command.thinkingLevel);
669
- this.#thinkingLevel = command.thinkingLevel;
670
- return;
671
- case "new-session":
672
- await runtime.newSession();
673
- return;
674
- case "resume-session":
675
- await runtime.switchSession(command.sessionPath);
676
- return;
677
- case "resize-surface":
678
- this.#terminal = { ...command.surface };
679
- this.#emitEvent({ type: "terminal-surface", surface: this.#terminal });
680
- return;
681
- case "shutdown":
682
- await this.dispose();
683
- return;
684
- case "set-setting":
685
- case "apply-customization":
686
- case "remove-customization":
687
- throw new Error("owned UI state commands belong to the owned UI layer, not the Pi engine adapter");
688
- }
689
- }
690
418
  // Invariant: in-place tree navigation rebuilds derived content without clearing the editor draft.
691
419
  #refreshNavigatedSession(editorText) {
692
420
  const session = this.#engine.session;
693
421
  if (!session)
694
422
  return;
695
- if (editorText && !this.#editor.text.trim()) {
696
- this.#editor = { ...this.#editor, text: editorText, selection: null, cursorOffset: editorText.length };
697
- }
698
- this.#activeModel = readModel(session.model);
423
+ if (editorText)
424
+ this.#state.offerEditorText(editorText);
425
+ this.#state.activeModel = readModel(session.model);
699
426
  this.#reconcileActiveModelAvailability();
700
- this.#thinkingLevel = readThinkingLevel(session.thinkingLevel);
427
+ this.#state.thinkingLevel = readThinkingLevel(session.thinkingLevel);
701
428
  this.#projection.assets.clear();
702
429
  this.#setTranscript(this.#projection.rebuild(session.messages, "finalized"));
703
430
  this.#emitView();
@@ -706,19 +433,11 @@ export class PiEngineAdapter {
706
433
  #sessionReplaced(session) {
707
434
  this.#delivery.discardObsolete(this.#engine.generation);
708
435
  this.#commands.reset();
709
- this.#editor = {
710
- text: "",
711
- queuedSubmissions: [],
712
- selection: null,
713
- cursorOffset: 0,
714
- historyRevision: this.#editor.historyRevision + 1,
715
- submitEnabled: true,
716
- };
717
- this.#status = { ...this.#status, workingMessage: null, workingProgress: null, badges: [] };
436
+ this.#state.replaceSession();
718
437
  this.#events.reset();
719
- this.#activeModel = readModel(session.model);
438
+ this.#state.activeModel = readModel(session.model);
720
439
  this.#reconcileActiveModelAvailability();
721
- this.#thinkingLevel = readThinkingLevel(session.thinkingLevel);
440
+ this.#state.thinkingLevel = readThinkingLevel(session.thinkingLevel);
722
441
  this.#projection.assets.clear();
723
442
  // Invariant: a new binding cannot inherit arguments/results from a reused invocation id.
724
443
  this.#setTranscript([]);
@@ -729,17 +448,17 @@ export class PiEngineAdapter {
729
448
  #reconcileActiveModelAvailability() {
730
449
  const modelRuntime = this.#engine.runtime?.services.modelRuntime;
731
450
  if (!modelRuntime) {
732
- this.#activeModel = null;
451
+ this.#state.activeModel = null;
733
452
  return;
734
453
  }
735
454
  const available = modelRuntime.getAvailableSnapshot?.() ?? [];
736
455
  const sessionModel = readModel(this.#engine.session?.model);
737
- const authoritative = this.#activeModel ?? sessionModel;
456
+ const authoritative = this.#state.activeModel ?? sessionModel;
738
457
  if (authoritative === null)
739
458
  return;
740
459
  const remainsAvailable = available.some(model => stringProperty(model, "provider") === authoritative.providerId
741
460
  && stringProperty(model, "id") === authoritative.modelId);
742
- this.#activeModel = remainsAvailable ? authoritative : null;
461
+ this.#state.activeModel = remainsAvailable ? authoritative : null;
743
462
  }
744
463
  #setTranscript(blocks) {
745
464
  // Invariant: lazy delivery snapshots must freeze before their authoritative source can be removed.
@@ -754,13 +473,12 @@ export class PiEngineAdapter {
754
473
  this.#emitEvent({ type: "diagnostic", diagnostic });
755
474
  }
756
475
  #emitView() {
757
- this.#usageCache = undefined;
758
- this.#viewRevision += 1;
476
+ this.#state.invalidate();
759
477
  this.#emitEvent({ type: "session-view", view: this.view() });
760
478
  }
761
479
  #emitEvent(value) {
762
480
  if (value.type !== "session-view")
763
- this.#viewRevision += 1;
481
+ this.#state.advance();
764
482
  this.#delivery.emit(value);
765
483
  }
766
484
  // Concurrency: cancellation runs synchronously so the overload reservation already guards reentrant outcomes.
@@ -775,10 +493,7 @@ export class PiEngineAdapter {
775
493
  this.#admissionStopped = !canResume;
776
494
  this.#engine.suspend();
777
495
  this.#events.abandonRun();
778
- this.#status = { ...this.#status, workingMessage: null, workingProgress: null };
779
- this.#lifecycle = this.#disposed ? "stopped" : canResume ? "ready" : "failed";
780
- this.#editor = { ...this.#editor, submitEnabled: canResume && !this.#disposed };
781
- this.#viewRevision += 1;
496
+ this.#state.settleOverload(canResume, this.#disposed);
782
497
  // Invariant: overload publishes one authoritative view; settle tool phases before finalizing other live blocks.
783
498
  this.#projection.settleFailedDeclarations({ role: "assistant", stopReason: cancelled ? "aborted" : "error",
784
499
  errorMessage: "Tool result unavailable after UI delivery overload" });
@@ -795,21 +510,7 @@ export class PiEngineAdapter {
795
510
  this.#engine.resume();
796
511
  }
797
512
  #recordDiagnostic(severity, code, message, recoverable) {
798
- const diagnostic = {
799
- sequence: this.#diagnostics.length,
800
- code,
801
- severity,
802
- message,
803
- recoverable,
804
- };
805
- this.#diagnostics.push(diagnostic);
806
- if (this.#diagnostics.length > 100)
807
- this.#diagnostics.shift();
808
- this.#status = {
809
- ...this.#status,
810
- diagnostics: [...this.#status.diagnostics, message].slice(-8),
811
- };
812
- return diagnostic;
513
+ return this.#state.recordDiagnostic(severity, code, message, recoverable);
813
514
  }
814
515
  }
815
516
  export async function createPiEngineAdapter(options) {