@timurproko/a1 0.2.6 → 0.2.7-dev.1222

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (419) hide show
  1. package/README.md +41 -3
  2. package/bin/automatic-update.js +7 -0
  3. package/bin/cli.js +4 -0
  4. package/bin/guardian.js +5 -0
  5. package/bin/tab-launch-context.d.ts +27 -0
  6. package/bin/tab-launch-context.js +94 -0
  7. package/bin/ui.js +107 -59
  8. package/dist/app/session-shell/clipboard-diagnostics.js +1 -1
  9. package/dist/app/session-shell/dialog-coordinator.d.ts +42 -0
  10. package/dist/app/session-shell/dialog-coordinator.js +133 -0
  11. package/dist/app/session-shell/dock-chrome.d.ts +34 -0
  12. package/dist/app/session-shell/dock-chrome.js +109 -0
  13. package/dist/app/session-shell/exit-notice.d.ts +1 -1
  14. package/dist/app/session-shell/exit-notice.js +1 -1
  15. package/dist/app/session-shell/extension-surface.d.ts +30 -0
  16. package/dist/app/session-shell/extension-surface.js +105 -0
  17. package/dist/app/session-shell/helper-pool.d.ts +3 -5
  18. package/dist/app/session-shell/helper-pool.js +3 -5
  19. package/dist/app/session-shell/input-surface-switch.d.ts +36 -0
  20. package/dist/app/session-shell/input-surface-switch.js +85 -0
  21. package/dist/app/session-shell/login-interaction.d.ts +27 -0
  22. package/dist/app/session-shell/login-interaction.js +91 -0
  23. package/dist/app/session-shell/prompt-submission.d.ts +48 -0
  24. package/dist/app/session-shell/prompt-submission.js +276 -0
  25. package/dist/app/session-shell/resident-tab-coordinator.d.ts +38 -0
  26. package/dist/app/session-shell/resident-tab-coordinator.js +77 -0
  27. package/dist/app/session-shell/response-copy-helper.js +21 -6
  28. package/dist/app/session-shell/response-copy-protocol.d.ts +1 -1
  29. package/dist/app/session-shell/response-copy-transport.d.ts +16 -6
  30. package/dist/app/session-shell/response-copy-transport.js +69 -17
  31. package/dist/app/session-shell/session-concern.d.ts +22 -0
  32. package/dist/app/session-shell/session-concern.js +29 -0
  33. package/dist/app/session-shell/session-lifecycle.d.ts +29 -0
  34. package/dist/app/session-shell/session-lifecycle.js +49 -0
  35. package/dist/app/session-shell/session-shell-root.d.ts +42 -6
  36. package/dist/app/session-shell/session-shell-root.js +197 -908
  37. package/dist/app/session-shell/session-shell.d.ts +3 -8
  38. package/dist/app/session-shell/session-shell.js +327 -835
  39. package/dist/app/session-shell/session-viewport-controller.d.ts +2 -1
  40. package/dist/app/session-shell/session-viewport-controller.js +41 -38
  41. package/dist/app/session-shell/settings-bindings.d.ts +17 -0
  42. package/dist/app/session-shell/settings-bindings.js +91 -0
  43. package/dist/app/session-shell/shell-editor-factory.d.ts +27 -0
  44. package/dist/app/session-shell/shell-editor-factory.js +105 -0
  45. package/dist/app/session-shell/shell-host.d.ts +6 -0
  46. package/dist/app/session-shell/shell-host.js +34 -7
  47. package/dist/app/session-shell/shell-layout.d.ts +64 -0
  48. package/dist/app/session-shell/shell-layout.js +18 -0
  49. package/dist/app/session-shell/suggestion-surface.d.ts +25 -0
  50. package/dist/app/session-shell/suggestion-surface.js +63 -0
  51. package/dist/app/session-shell/transcript-document.d.ts +78 -0
  52. package/dist/app/session-shell/transcript-document.js +365 -0
  53. package/dist/app/session-shell/viewport-layout.d.ts +31 -0
  54. package/dist/app/session-shell/viewport-layout.js +160 -0
  55. package/dist/app/session-shell/workflow-output.d.ts +33 -0
  56. package/dist/app/session-shell/workflow-output.js +174 -0
  57. package/dist/app/session-shell/workflow-router.d.ts +25 -0
  58. package/dist/app/session-shell/workflow-router.js +39 -0
  59. package/dist/cli/dispatch.d.ts +11 -1
  60. package/dist/cli/dispatch.js +79 -5
  61. package/dist/cli/tabs-request.d.ts +7 -0
  62. package/dist/cli/tabs-request.js +1 -0
  63. package/dist/cli/tabs.d.ts +14 -0
  64. package/dist/cli/tabs.js +151 -0
  65. package/dist/cli/version-stats.js +38 -3
  66. package/dist/composition/owned-settings.d.ts +12 -0
  67. package/dist/composition/owned-settings.js +36 -0
  68. package/dist/composition/owned-ui.d.ts +27 -28
  69. package/dist/composition/owned-ui.js +207 -153
  70. package/dist/composition/reference-selection-options.d.ts +3 -0
  71. package/dist/composition/reference-selection-options.js +16 -0
  72. package/dist/composition/resident-tab-bridge.d.ts +25 -0
  73. package/dist/composition/resident-tab-bridge.js +180 -0
  74. package/dist/composition/session-backend.d.ts +19 -0
  75. package/dist/composition/session-backend.js +1 -0
  76. package/dist/composition/session-runtime-registry.d.ts +20 -0
  77. package/dist/composition/session-runtime-registry.js +85 -0
  78. package/dist/composition/settings-route-host.d.ts +16 -2
  79. package/dist/composition/settings-route-host.js +42 -17
  80. package/dist/composition/settings-search-input.d.ts +9 -0
  81. package/dist/composition/settings-search-input.js +61 -0
  82. package/dist/composition/startup-route.d.ts +32 -0
  83. package/dist/composition/startup-route.js +72 -0
  84. package/dist/composition/utility-tab.d.ts +28 -0
  85. package/dist/composition/utility-tab.js +244 -0
  86. package/dist/contracts/owned-ui/index.d.ts +1 -1
  87. package/dist/contracts/owned-ui/model.d.ts +3 -0
  88. package/dist/contracts/owned-ui/session-backend.d.ts +3 -0
  89. package/dist/contracts/owned-ui/session-workflows.d.ts +11 -4
  90. package/dist/contracts/presentation/index.d.ts +11 -0
  91. package/dist/contracts/presentation/index.js +12 -0
  92. package/dist/features/launch/development-launch.js +6 -0
  93. package/dist/features/launch/index.d.ts +1 -1
  94. package/dist/features/launch/intent.d.ts +3 -1
  95. package/dist/features/launch/intent.js +7 -4
  96. package/dist/features/launch/profile-paths.js +4 -0
  97. package/dist/features/owned-ui/plus-menu-dialog.d.ts +22 -0
  98. package/dist/features/owned-ui/plus-menu-dialog.js +84 -0
  99. package/dist/features/owned-ui/project-trust-dialog.d.ts +1 -1
  100. package/dist/features/owned-ui/project-trust-dialog.js +6 -8
  101. package/dist/features/owned-ui/project-trust-prompt.d.ts +1 -0
  102. package/dist/features/owned-ui/project-trust-prompt.js +7 -3
  103. package/dist/features/owned-ui/reference-document-selection.d.ts +30 -0
  104. package/dist/features/owned-ui/reference-document-selection.js +179 -0
  105. package/dist/features/owned-ui/reference-screen-app.d.ts +6 -1
  106. package/dist/features/owned-ui/reference-screen-app.js +51 -10
  107. package/dist/features/owned-ui/settings-app.d.ts +13 -2
  108. package/dist/features/owned-ui/settings-app.js +136 -97
  109. package/dist/features/owned-ui/settings-search-input.d.ts +29 -0
  110. package/dist/features/owned-ui/settings-search-input.js +1 -0
  111. package/dist/features/prompt-history/index.d.ts +1 -1
  112. package/dist/features/prompt-history/paths.d.ts +2 -1
  113. package/dist/features/prompt-history/paths.js +10 -2
  114. package/dist/features/prompt-history/service.d.ts +5 -0
  115. package/dist/features/prompt-history/service.js +1 -1
  116. package/dist/features/resident-tab/auto-name.d.ts +11 -0
  117. package/dist/features/resident-tab/auto-name.js +44 -0
  118. package/dist/features/resident-tab/index.d.ts +5 -0
  119. package/dist/features/resident-tab/index.js +7 -0
  120. package/dist/features/resident-tab/shortcut-bindings-file.d.ts +8 -0
  121. package/dist/features/resident-tab/shortcut-bindings-file.js +40 -0
  122. package/dist/features/resident-tab/shortcut-declarations.d.ts +13 -0
  123. package/dist/features/resident-tab/shortcut-declarations.js +26 -0
  124. package/dist/features/resident-tab/shortcut-projection.d.ts +29 -0
  125. package/dist/features/resident-tab/shortcut-projection.js +64 -0
  126. package/dist/features/resident-tab/status-deriver.d.ts +10 -0
  127. package/dist/features/resident-tab/status-deriver.js +12 -0
  128. package/dist/foundation/launch-context/index.d.ts +12 -0
  129. package/dist/foundation/launch-context/index.js +26 -0
  130. package/dist/foundation/launch-guardian/exit-watcher.d.ts +14 -0
  131. package/dist/foundation/launch-guardian/exit-watcher.js +94 -0
  132. package/dist/foundation/launch-guardian/main.d.ts +7 -1
  133. package/dist/foundation/launch-guardian/main.js +60 -7
  134. package/dist/foundation/lifecycle/session-repository-context.js +16 -2
  135. package/dist/foundation/process-containment/{native-guardian-containment.d.ts → addon-containment.d.ts} +7 -5
  136. package/dist/foundation/process-containment/addon-containment.js +139 -0
  137. package/dist/foundation/process-containment/addon-process-inspector.d.ts +11 -0
  138. package/dist/foundation/process-containment/addon-process-inspector.js +36 -0
  139. package/dist/foundation/process-containment/addon.d.ts +42 -0
  140. package/dist/foundation/process-containment/addon.js +57 -0
  141. package/dist/foundation/process-containment/artifact.d.ts +1 -1
  142. package/dist/foundation/process-containment/artifact.js +6 -5
  143. package/dist/foundation/process-containment/contracts.d.ts +2 -0
  144. package/dist/foundation/process-containment/index.d.ts +4 -4
  145. package/dist/foundation/process-containment/index.js +3 -3
  146. package/dist/foundation/process-containment/native-process-inspector.d.ts +2 -1
  147. package/dist/foundation/process-containment/native-process-inspector.js +10 -10
  148. package/dist/foundation/release/automatic-update.d.ts +37 -0
  149. package/dist/foundation/release/automatic-update.js +265 -0
  150. package/dist/foundation/release/bootstrap.d.ts +7 -9
  151. package/dist/foundation/release/bootstrap.js +107 -24
  152. package/dist/foundation/release/cohort-state.d.ts +1 -1
  153. package/dist/foundation/release/cohort-state.js +1 -1
  154. package/dist/foundation/release/dependency-certification.js +54 -19
  155. package/dist/foundation/release/early-accent.d.ts +12 -0
  156. package/dist/foundation/release/early-accent.js +59 -0
  157. package/dist/foundation/release/index.d.ts +2 -2
  158. package/dist/foundation/release/index.js +2 -2
  159. package/dist/foundation/release/latest-release.d.ts +24 -2
  160. package/dist/foundation/release/latest-release.js +51 -1
  161. package/dist/foundation/release/progress-palette.generated.d.ts +137 -3
  162. package/dist/foundation/release/progress-palette.generated.js +137 -3
  163. package/dist/foundation/release/release-gc.d.ts +3 -0
  164. package/dist/foundation/release/release-gc.js +59 -8
  165. package/dist/foundation/release/release-store.d.ts +12 -0
  166. package/dist/foundation/release/release-store.js +124 -2
  167. package/dist/foundation/release/update-execution-lease.d.ts +48 -0
  168. package/dist/foundation/release/update-execution-lease.js +161 -0
  169. package/dist/foundation/release/update.d.ts +12 -7
  170. package/dist/foundation/release/update.js +281 -196
  171. package/dist/foundation/resident-tabs/bounded-host-command.d.ts +18 -0
  172. package/dist/foundation/resident-tabs/bounded-host-command.js +39 -0
  173. package/dist/foundation/resident-tabs/bridge-client.d.ts +70 -0
  174. package/dist/foundation/resident-tabs/bridge-client.js +321 -0
  175. package/dist/foundation/resident-tabs/doctor.d.ts +28 -0
  176. package/dist/foundation/resident-tabs/doctor.js +166 -0
  177. package/dist/foundation/resident-tabs/draft-checkpoint.d.ts +27 -0
  178. package/dist/foundation/resident-tabs/draft-checkpoint.js +145 -0
  179. package/dist/foundation/resident-tabs/ensure-terminal-host.d.ts +36 -0
  180. package/dist/foundation/resident-tabs/ensure-terminal-host.js +151 -0
  181. package/dist/foundation/resident-tabs/fault-injection.d.ts +8 -0
  182. package/dist/foundation/resident-tabs/fault-injection.js +26 -0
  183. package/dist/foundation/resident-tabs/fixture-control.d.ts +7 -0
  184. package/dist/foundation/resident-tabs/fixture-control.js +35 -0
  185. package/dist/foundation/resident-tabs/host-entry.d.ts +1 -0
  186. package/dist/foundation/resident-tabs/host-entry.js +17 -0
  187. package/dist/foundation/resident-tabs/index.d.ts +12 -0
  188. package/dist/foundation/resident-tabs/index.js +6 -0
  189. package/dist/foundation/resident-tabs/maintenance.d.ts +39 -0
  190. package/dist/foundation/resident-tabs/maintenance.js +75 -0
  191. package/dist/foundation/resident-tabs/progress-observation-schema.d.ts +34 -0
  192. package/dist/foundation/resident-tabs/progress-observation-schema.js +1 -0
  193. package/dist/foundation/resident-tabs/progress-observation.d.ts +4 -0
  194. package/dist/foundation/resident-tabs/progress-observation.js +150 -0
  195. package/dist/foundation/resident-tabs/prompt-journal.d.ts +63 -0
  196. package/dist/foundation/resident-tabs/prompt-journal.js +213 -0
  197. package/dist/foundation/resident-tabs/protocol.d.ts +12 -0
  198. package/dist/foundation/resident-tabs/protocol.js +195 -0
  199. package/dist/foundation/resident-tabs/recovery.d.ts +26 -0
  200. package/dist/foundation/resident-tabs/recovery.js +205 -0
  201. package/dist/foundation/resident-tabs/release-holds.d.ts +28 -0
  202. package/dist/foundation/resident-tabs/release-holds.js +75 -0
  203. package/dist/foundation/resident-tabs/routes.d.ts +5 -0
  204. package/dist/foundation/resident-tabs/routes.js +5 -0
  205. package/dist/foundation/resident-tabs/routing.d.ts +11 -0
  206. package/dist/foundation/resident-tabs/routing.js +10 -0
  207. package/dist/foundation/resident-tabs/session-sync.d.ts +14 -0
  208. package/dist/foundation/resident-tabs/session-sync.js +37 -0
  209. package/dist/foundation/resident-tabs/settings.d.ts +12 -0
  210. package/dist/foundation/resident-tabs/settings.js +58 -0
  211. package/dist/foundation/resident-tabs/terminal-host-artifact.d.ts +14 -0
  212. package/dist/foundation/resident-tabs/terminal-host-artifact.js +78 -0
  213. package/dist/foundation/resident-tabs/zip-archive.d.ts +9 -0
  214. package/dist/foundation/resident-tabs/zip-archive.js +56 -0
  215. package/dist/foundation/session-writer-lock/index.d.ts +30 -0
  216. package/dist/foundation/session-writer-lock/index.js +203 -0
  217. package/dist/foundation/startup/startup-descriptor.js +2 -2
  218. package/dist/foundation/terminal-cleanup/index.d.ts +1 -1
  219. package/dist/foundation/terminal-cleanup/index.js +1 -1
  220. package/dist/foundation/terminal-cleanup/terminal-reset.d.ts +6 -0
  221. package/dist/foundation/terminal-cleanup/terminal-reset.js +6 -0
  222. package/dist/integrations/pi/components/editor-interaction.d.ts +2 -0
  223. package/dist/integrations/pi/components/modal-frame.d.ts +17 -1
  224. package/dist/integrations/pi/components/modal-frame.js +48 -9
  225. package/dist/integrations/pi/components/models-dialog.js +4 -52
  226. package/dist/integrations/pi/components/owned-editor-ux.d.ts +6 -1
  227. package/dist/integrations/pi/components/owned-editor-ux.js +138 -11
  228. package/dist/integrations/pi/components/resources/builtin-themes.d.ts +4 -4
  229. package/dist/integrations/pi/components/resources/builtin-themes.js +4 -4
  230. package/dist/integrations/pi/components/share-operation-dialog.d.ts +2 -0
  231. package/dist/integrations/pi/components/share-operation-dialog.js +2 -1
  232. package/dist/integrations/pi/components/shell-editor-autocomplete.js +58 -36
  233. package/dist/integrations/pi/components/shell-extension-ui.js +79 -60
  234. package/dist/integrations/pi/components/shell-footer-status.d.ts +1 -1
  235. package/dist/integrations/pi/components/shell-footer-status.js +21 -5
  236. package/dist/integrations/pi/components/shell-hotkey-sections.js +1 -1
  237. package/dist/integrations/pi/components/shell-presenters-info.d.ts +5 -2
  238. package/dist/integrations/pi/components/shell-presenters-info.js +18 -4
  239. package/dist/integrations/pi/components/shell-presenters-transcript.js +4 -1
  240. package/dist/integrations/pi/components/shell-selectors-dialogs.js +5 -1
  241. package/dist/integrations/pi/components/shell-shared-facade.d.ts +12 -1
  242. package/dist/integrations/pi/components/skills-dialog.js +2 -2
  243. package/dist/integrations/pi/components/upstream/adjacent/core/keybindings.d.ts +1 -1
  244. package/dist/integrations/pi/components/upstream/adjacent/core/keybindings.js +17 -4
  245. package/dist/integrations/pi/components/upstream/assets/earendil-image.json +2 -2
  246. package/dist/integrations/pi/components/upstream/components/countdown-timer.d.ts +1 -1
  247. package/dist/integrations/pi/components/upstream/components/earendil-announcement.js +1 -1
  248. package/dist/integrations/pi/components/upstream/components/extension-editor.d.ts +1 -1
  249. package/dist/integrations/pi/components/upstream/components/extension-editor.js +1 -1
  250. package/dist/integrations/pi/components/upstream/components/extension-input.js +1 -1
  251. package/dist/integrations/pi/components/upstream/components/extension-selector.js +1 -1
  252. package/dist/integrations/pi/components/upstream/components/mermaid.js +1 -1
  253. package/dist/integrations/pi/components/upstream/components/owned-editor.d.ts +8 -6
  254. package/dist/integrations/pi/components/upstream/components/owned-editor.js +16 -9
  255. package/dist/integrations/pi/components/upstream/components/pi-logo.js +1 -1
  256. package/dist/integrations/pi/components/upstream/components/scoped-models-selector.d.ts +4 -4
  257. package/dist/integrations/pi/components/upstream/components/scoped-models-selector.js +2 -2
  258. package/dist/integrations/pi/components/upstream/components/session-footer.d.ts +2 -1
  259. package/dist/integrations/pi/components/upstream/components/session-footer.js +31 -25
  260. package/dist/integrations/pi/components/upstream/components/session-selector-search.js +1 -1
  261. package/dist/integrations/pi/components/upstream/components/session-selector.js +8 -7
  262. package/dist/integrations/pi/components/upstream/components/skill-invocation-message.d.ts +1 -1
  263. package/dist/integrations/pi/components/upstream/components/skill-invocation-message.js +1 -1
  264. package/dist/integrations/pi/components/upstream/components/status-indicator.d.ts +2 -2
  265. package/dist/integrations/pi/components/upstream/components/status-indicator.js +3 -3
  266. package/dist/integrations/pi/components/upstream/components/themed-text.d.ts +1 -1
  267. package/dist/integrations/pi/components/upstream/components/themed-text.js +1 -1
  268. package/dist/integrations/pi/components/upstream/components/thinking-selector.d.ts +8 -7
  269. package/dist/integrations/pi/components/upstream/components/thinking-selector.js +10 -9
  270. package/dist/integrations/pi/components/upstream/components/tool-execution.d.ts +2 -6
  271. package/dist/integrations/pi/components/upstream/components/tool-execution.js +103 -101
  272. package/dist/integrations/pi/components/upstream/components/tree-selector.d.ts +9 -9
  273. package/dist/integrations/pi/components/upstream/components/tree-selector.js +13 -21
  274. package/dist/integrations/pi/components/upstream/components/trust-selector.js +1 -1
  275. package/dist/integrations/pi/components/upstream/external-editor.js +1 -1
  276. package/dist/integrations/pi/components/upstream/history/editor-core.d.ts +2 -2
  277. package/dist/integrations/pi/components/upstream/history/editor-core.js +7 -5
  278. package/dist/integrations/pi/components/upstream/history/kill-ring.d.ts +1 -1
  279. package/dist/integrations/pi/components/upstream/history/kill-ring.js +1 -1
  280. package/dist/integrations/pi/components/upstream/history/printable-key.js +1 -1
  281. package/dist/integrations/pi/components/upstream/history/text-helpers.js +1 -1
  282. package/dist/integrations/pi/components/upstream/history/undo-stack.d.ts +1 -1
  283. package/dist/integrations/pi/components/upstream/history/undo-stack.js +1 -1
  284. package/dist/integrations/pi/components/upstream/history/word-navigation.js +1 -1
  285. package/dist/integrations/pi/components/upstream/model-search.d.ts +1 -1
  286. package/dist/integrations/pi/components/upstream/program-status-reporter.d.ts +1 -1
  287. package/dist/integrations/pi/components/upstream/theme/theme-controller.d.ts +1 -1
  288. package/dist/integrations/pi/components/upstream/theme/theme.d.ts +5 -0
  289. package/dist/integrations/pi/components/upstream/theme/theme.js +29 -2
  290. package/dist/integrations/pi/engine/adapter.d.ts +5 -77
  291. package/dist/integrations/pi/engine/adapter.js +95 -394
  292. package/dist/integrations/pi/engine/command-dispatch.d.ts +13 -0
  293. package/dist/integrations/pi/engine/command-dispatch.js +57 -0
  294. package/dist/integrations/pi/engine/host.js +2 -2
  295. package/dist/integrations/pi/engine/offline-settings-port.d.ts +23 -0
  296. package/dist/integrations/pi/engine/offline-settings-port.js +53 -0
  297. package/dist/integrations/pi/engine/pi-settings-metadata.json +14 -2
  298. package/dist/integrations/pi/engine/ports.d.ts +56 -0
  299. package/dist/integrations/pi/engine/ports.js +93 -0
  300. package/dist/integrations/pi/engine/prompt-suggestions.d.ts +1 -0
  301. package/dist/integrations/pi/engine/prompt-suggestions.js +40 -0
  302. package/dist/integrations/pi/engine/resources/changelog.json +4 -4
  303. package/dist/integrations/pi/engine/runtime-integration.js +102 -29
  304. package/dist/integrations/pi/engine/session-runtime.d.ts +0 -6
  305. package/dist/integrations/pi/engine/session-runtime.js +13 -5
  306. package/dist/integrations/pi/engine/session-selection.d.ts +3 -0
  307. package/dist/integrations/pi/engine/session-selection.js +45 -9
  308. package/dist/integrations/pi/engine/settings-bridge.d.ts +5 -0
  309. package/dist/integrations/pi/engine/settings-bridge.js +15 -0
  310. package/dist/integrations/pi/engine/settings-port.js +11 -15
  311. package/dist/integrations/pi/engine/view-state.d.ts +42 -0
  312. package/dist/integrations/pi/engine/view-state.js +126 -0
  313. package/dist/integrations/pi/engine/workflow-contexts.js +10 -1
  314. package/dist/integrations/pi/engine/workflow-runner.js +74 -5
  315. package/dist/integrations/pi/engine/workflow-support.d.ts +12 -0
  316. package/dist/integrations/pi/engine/workflow-support.js +36 -0
  317. package/dist/integrations/pi/engine/workflows.d.ts +3 -1
  318. package/dist/integrations/pi/engine/workflows.js +1 -0
  319. package/dist/integrations/pi/startup-public.js +257 -310
  320. package/dist/integrations/pi/startup-public.manifest.json +564 -440
  321. package/dist/integrations/pi/tui-runtime/adapter.d.ts +6 -0
  322. package/dist/integrations/pi/tui-runtime/adapter.js +32 -1
  323. package/dist/integrations/pi/tui-runtime/contracts.d.ts +5 -0
  324. package/dist/integrations/pi/tui-runtime/damage-aware-terminal.d.ts +12 -1
  325. package/dist/integrations/pi/tui-runtime/damage-aware-terminal.js +31 -2
  326. package/dist/native/darwin-arm64/manifest.json +10 -7
  327. package/dist/native/darwin-arm64/process-guardian.node +0 -0
  328. package/dist/native/darwin-arm64/terminal-host-THIRD-PARTY-NOTICES.txt +10500 -0
  329. package/dist/native/darwin-arm64/terminal-host.manifest.json +46 -0
  330. package/dist/native/darwin-arm64/terminal-host.node +0 -0
  331. package/dist/native/darwin-x64/manifest.json +23 -0
  332. package/dist/native/darwin-x64/process-guardian.node +0 -0
  333. package/dist/native/darwin-x64/terminal-host-THIRD-PARTY-NOTICES.txt +10737 -0
  334. package/dist/native/darwin-x64/terminal-host.manifest.json +46 -0
  335. package/dist/native/darwin-x64/terminal-host.node +0 -0
  336. package/dist/native/linux-x64/manifest.json +10 -7
  337. package/dist/native/linux-x64/process-guardian.node +0 -0
  338. package/dist/native/linux-x64/terminal-host-THIRD-PARTY-NOTICES.txt +11226 -0
  339. package/dist/native/linux-x64/terminal-host.manifest.json +46 -0
  340. package/dist/native/linux-x64/terminal-host.node +0 -0
  341. package/dist/native/win32-x64/manifest.json +10 -7
  342. package/dist/native/win32-x64/process-guardian.node +0 -0
  343. package/dist/native/win32-x64/terminal-host-THIRD-PARTY-NOTICES.txt +10757 -0
  344. package/dist/native/win32-x64/terminal-host.manifest.json +46 -0
  345. package/dist/native/win32-x64/terminal-host.node +0 -0
  346. package/dist/product-identity.d.ts +3 -3
  347. package/dist/product-identity.js +4 -4
  348. package/dist/product-identity.json +16 -2
  349. package/dist/runtime-payload-inventory.json +6330 -6677
  350. package/dist/ui/apps/host.d.ts +2 -0
  351. package/dist/ui/apps/host.js +7 -1
  352. package/dist/ui/components/dialog-panel.d.ts +17 -8
  353. package/dist/ui/components/dialog-panel.js +117 -41
  354. package/dist/ui/components/index.d.ts +5 -5
  355. package/dist/ui/components/index.js +4 -4
  356. package/dist/ui/components/line-input.d.ts +4 -1
  357. package/dist/ui/components/line-input.js +3 -1
  358. package/dist/ui/components/prompt-input.d.ts +11 -8
  359. package/dist/ui/components/prompt-input.js +15 -13
  360. package/dist/ui/components/scrollbar.d.ts +1 -1
  361. package/dist/ui/components/scrollbar.js +1 -1
  362. package/dist/ui/components/selection-copy.d.ts +3 -3
  363. package/dist/ui/components/selection-copy.js +16 -1
  364. package/dist/ui/components/spans.js +2 -2
  365. package/dist/ui/components/submitted-prompt.d.ts +9 -6
  366. package/dist/ui/components/submitted-prompt.js +20 -12
  367. package/dist/ui/components/surface.js +4 -2
  368. package/dist/ui/components/text-selection.d.ts +1 -2
  369. package/dist/ui/components/text-selection.js +5 -2
  370. package/dist/ui/components/text.d.ts +3 -6
  371. package/dist/ui/components/text.js +6 -8
  372. package/dist/ui/components/transcript-viewport.d.ts +9 -2
  373. package/dist/ui/components/transcript-viewport.js +179 -58
  374. package/dist/ui/settings/declarations.d.ts +90 -16
  375. package/dist/ui/settings/declarations.js +67 -14
  376. package/dist/ui/settings/early-accent.d.ts +81 -0
  377. package/dist/ui/settings/early-accent.js +50 -0
  378. package/dist/ui/settings/index.d.ts +4 -2
  379. package/dist/ui/settings/index.js +2 -1
  380. package/dist/ui/settings/manager.d.ts +16 -3
  381. package/dist/ui/settings/manager.js +122 -33
  382. package/dist/ui/settings/migrations.d.ts +6 -0
  383. package/dist/ui/settings/migrations.js +73 -0
  384. package/dist/ui/settings/profile-document.d.ts +26 -0
  385. package/dist/ui/settings/profile-document.js +164 -0
  386. package/dist/ui/settings/progress-palette.generated.d.ts +139 -0
  387. package/dist/ui/settings/progress-palette.generated.js +139 -0
  388. package/dist/ui/settings/sections.d.ts +4 -0
  389. package/dist/ui/settings/sections.js +9 -3
  390. package/docs/architecture/boundaries.md +24 -9
  391. package/docs/architecture/evidence/resident-tabs/linux-x64.md +37 -0
  392. package/docs/architecture/evidence/resident-tabs/macos-arm64.md +36 -0
  393. package/docs/architecture/evidence/resident-tabs/macos-x64.md +35 -0
  394. package/docs/architecture/evidence/resident-tabs/windows-x64.md +36 -0
  395. package/docs/architecture/internal-naming.md +3 -1
  396. package/docs/architecture/process-guardian-provenance.md +18 -10
  397. package/docs/architecture/project-structure.md +8 -0
  398. package/docs/architecture/resident-tabs-requirements.md +18 -0
  399. package/docs/architecture/resident-tabs.md +649 -0
  400. package/docs/architecture/response-copy-delivery.md +1 -1
  401. package/docs/architecture/terminal-host-proof-gate.md +2 -0
  402. package/docs/architecture/terminal-host-provenance.md +16 -4
  403. package/docs/architecture/tool-image-presentation.md +2 -1
  404. package/docs/architecture/toolchain.md +11 -9
  405. package/docs/ci-release-runbook.md +14 -7
  406. package/docs/features/launch-profiles.md +11 -8
  407. package/docs/features/prompt-history.md +41 -20
  408. package/docs/manual-resident-tabs-acceptance.md +51 -0
  409. package/docs/openspec-archive-automation.md +49 -22
  410. package/docs/validation.md +49 -9
  411. package/package.json +19 -6
  412. package/dist/foundation/process-containment/darwin-process-inspector.d.ts +0 -5
  413. package/dist/foundation/process-containment/darwin-process-inspector.js +0 -7
  414. package/dist/foundation/process-containment/native-guardian-containment.js +0 -152
  415. package/dist/foundation/process-containment/windows-process-inspector.d.ts +0 -19
  416. package/dist/foundation/process-containment/windows-process-inspector.js +0 -56
  417. package/dist/native/darwin-arm64/process-guardian +0 -0
  418. package/dist/native/linux-x64/process-guardian +0 -0
  419. package/dist/native/win32-x64/process-guardian.exe +0 -0
@@ -1,8 +1,63 @@
1
+ import { closeSync, mkdirSync, openSync, writeFileSync } from "node:fs";
2
+ import { dirname } from "node:path";
1
3
  import { createAgentSessionFromServices, createAgentSessionRuntime, createAgentSessionServices, resolveModelScopeWithDiagnostics, SessionManager, SettingsManager, } from "../startup-public.js";
2
4
  import { resolvePiProjectTrustPreflight, } from "./project-trust-preflight.js";
3
- import { openSelectedPiSession, resolveSessionArgumentPath } from "./session-selection.js";
5
+ import { openSelectedPiSession, resolveSessionArgumentPath, takeSelectedSessionWriter } from "./session-selection.js";
4
6
  import { markStartupPhase } from "../../../foundation/startup/startup-runtime.js";
5
7
  import { createWindowsNulCleanupExtension } from "./windows-filesystem-hygiene.js";
8
+ import { acquireSessionWriter, } from "../../../foundation/session-writer-lock/index.js";
9
+ class SessionWriterCoordinator {
10
+ #current;
11
+ prepare(manager) {
12
+ const selected = takeSelectedSessionWriter(manager);
13
+ if (selected !== undefined)
14
+ return { handle: selected, alreadyCurrent: false };
15
+ const path = manager.getSessionFile();
16
+ if (path === undefined)
17
+ return undefined;
18
+ if (this.#current?.path === path)
19
+ return { handle: this.#current, alreadyCurrent: true };
20
+ const handle = acquireSessionWriter(path);
21
+ try {
22
+ if (!handle.bound) {
23
+ const header = manager.getHeader();
24
+ if (header === null)
25
+ throw new Error("new session is missing its generated header");
26
+ mkdirSync(dirname(path), { recursive: true });
27
+ const descriptor = openSync(path, "wx", 0o600);
28
+ try {
29
+ handle.bind(path);
30
+ writeFileSync(descriptor, `${JSON.stringify(header)}\n`);
31
+ }
32
+ finally {
33
+ closeSync(descriptor);
34
+ }
35
+ manager.setSessionFile(path);
36
+ }
37
+ return { handle, alreadyCurrent: false };
38
+ }
39
+ catch (error) {
40
+ handle.release();
41
+ throw error;
42
+ }
43
+ }
44
+ activate(pending) {
45
+ if (pending === undefined || pending.alreadyCurrent)
46
+ return;
47
+ const previous = this.#current;
48
+ this.#current = pending.handle;
49
+ previous?.release();
50
+ }
51
+ abandon(pending) {
52
+ if (pending !== undefined && !pending.alreadyCurrent)
53
+ pending.handle.release();
54
+ }
55
+ release() {
56
+ this.#current?.release();
57
+ this.#current = undefined;
58
+ }
59
+ }
60
+ const runtimeSessionWriters = new WeakMap();
6
61
  /**
7
62
  * Mirrors pinned Pi's CLI startup: resolve the `models` patterns from settings
8
63
  * into a scoped model list, keep the resolver's warnings (e.g. "No models match
@@ -69,40 +124,52 @@ export async function createPiRuntimeIntegration(options) {
69
124
  cwd: options.cwd, selection,
70
125
  ...(sessionDir === undefined ? {} : { sessionDir }),
71
126
  ...(options.sessionForkPrompt === undefined ? {} : { forkPrompt: options.sessionForkPrompt }),
127
+ guardWriter: true,
72
128
  });
129
+ const sessionWriters = new SessionWriterCoordinator();
73
130
  const createRuntime = async ({ cwd, sessionManager: targetSessionManager, sessionStartEvent, }) => {
74
- const { services, trust } = await createPiRuntimeServicesAfterTrust({
75
- cwd,
76
- agentDir: options.agentDir,
77
- ...(options.projectTrustPrompt === undefined ? {} : { projectTrustPrompt: options.projectTrustPrompt }),
78
- ...(options.preflightDependencies === undefined ? {} : { preflightDependencies: options.preflightDependencies }),
79
- ...(options.markStartupPhase === undefined ? {} : { markStartupPhase: options.markStartupPhase }),
80
- });
81
- const modelScope = await resolveConfiguredModelScope(services, options.signal);
82
- const hasExistingSession = targetSessionManager.buildSessionContext().messages.length > 0;
83
- const created = await createAgentSessionFromServices({
84
- services,
85
- sessionManager: targetSessionManager,
86
- ...(sessionStartEvent ? { sessionStartEvent } : {}),
87
- ...(modelScope.model && !hasExistingSession ? { model: modelScope.model } : {}),
88
- ...(modelScope.thinkingLevel && !hasExistingSession ? { thinkingLevel: modelScope.thinkingLevel } : {}),
89
- ...(modelScope.scopedModels.length > 0 ? { scopedModels: [...modelScope.scopedModels] } : {}),
90
- });
91
- await (options.markStartupPhase ?? defaultStartupPhaseMarker)("session-created");
92
- return {
93
- ...created,
94
- services,
95
- diagnostics: [
96
- ...(trust.diagnostic === null ? [] : [{ type: "warning", code: "project-trust", message: trust.diagnostic }]),
97
- ...modelScope.diagnostics,
98
- ],
99
- };
131
+ const pendingWriter = sessionWriters.prepare(targetSessionManager);
132
+ try {
133
+ const { services, trust } = await createPiRuntimeServicesAfterTrust({
134
+ cwd,
135
+ agentDir: options.agentDir,
136
+ ...(options.projectTrustPrompt === undefined ? {} : { projectTrustPrompt: options.projectTrustPrompt }),
137
+ ...(options.preflightDependencies === undefined ? {} : { preflightDependencies: options.preflightDependencies }),
138
+ ...(options.markStartupPhase === undefined ? {} : { markStartupPhase: options.markStartupPhase }),
139
+ });
140
+ const modelScope = await resolveConfiguredModelScope(services, options.signal);
141
+ const hasExistingSession = targetSessionManager.buildSessionContext().messages.length > 0;
142
+ const created = await createAgentSessionFromServices({
143
+ services,
144
+ sessionManager: targetSessionManager,
145
+ ...(sessionStartEvent ? { sessionStartEvent } : {}),
146
+ ...(modelScope.model && !hasExistingSession ? { model: modelScope.model } : {}),
147
+ ...(modelScope.thinkingLevel && !hasExistingSession ? { thinkingLevel: modelScope.thinkingLevel } : {}),
148
+ ...(modelScope.scopedModels.length > 0 ? { scopedModels: [...modelScope.scopedModels] } : {}),
149
+ });
150
+ sessionWriters.activate(pendingWriter);
151
+ await (options.markStartupPhase ?? defaultStartupPhaseMarker)("session-created");
152
+ return {
153
+ ...created,
154
+ services,
155
+ diagnostics: [
156
+ ...(trust.diagnostic === null ? [] : [{ type: "warning", code: "project-trust", message: trust.diagnostic }]),
157
+ ...modelScope.diagnostics,
158
+ ],
159
+ };
160
+ }
161
+ catch (error) {
162
+ sessionWriters.abandon(pendingWriter);
163
+ throw error;
164
+ }
100
165
  };
101
- return createAgentSessionRuntime(createRuntime, {
166
+ const runtime = await createAgentSessionRuntime(createRuntime, {
102
167
  cwd: sessionManager.getCwd(),
103
168
  agentDir: options.agentDir,
104
169
  sessionManager,
105
170
  });
171
+ runtimeSessionWriters.set(runtime, sessionWriters);
172
+ return runtime;
106
173
  }
107
174
  function defaultStartupPhaseMarker(phase) {
108
175
  return markStartupPhase(process.env, phase);
@@ -119,5 +186,11 @@ export async function replacePiRuntimeSession(runtime, replacement) {
119
186
  export async function disposePiRuntimeIntegration(runtime) {
120
187
  runtime.setRebindSession(undefined);
121
188
  runtime.setBeforeSessionInvalidate(undefined);
122
- await runtime.dispose();
189
+ try {
190
+ await runtime.dispose();
191
+ }
192
+ finally {
193
+ runtimeSessionWriters.get(runtime)?.release();
194
+ runtimeSessionWriters.delete(runtime);
195
+ }
123
196
  }
@@ -64,12 +64,6 @@ export interface PiEngineRuntimePorts {
64
64
  diagnostic(severity: OwnedUiDiagnostics["severity"], code: string, message: string, recoverable: boolean): void;
65
65
  emitView(): void;
66
66
  }
67
- /**
68
- * The pinned Pi runtime and the session bound to it: creation through the runtime factory, the
69
- * session generation that stamps and invalidates events, the subscription that forwards session
70
- * events, compaction progress observation, the queued-input integration, and disposal order. The
71
- * adapter derives its view state from the session it is handed and never touches these directly.
72
- */
73
67
  export declare class PiEngineRuntime {
74
68
  #private;
75
69
  constructor(options: PiEngineRuntimeOptions, ports: PiEngineRuntimePorts);
@@ -2,6 +2,7 @@ import { execFile } from "node:child_process";
2
2
  import { existsSync } from "node:fs";
3
3
  import { promisify } from "node:util";
4
4
  import { PRODUCT_IDENTITY } from "../../../product-identity.js";
5
+ import { residentProgressObserver } from "../../../foundation/resident-tabs/progress-observation.js";
5
6
  import { observeCompactionProgress } from "./compaction-progress.js";
6
7
  import { createPiRuntimeIntegration } from "./runtime-integration.js";
7
8
  import { PiSessionCommandIntegration } from "./session-integration.js";
@@ -18,6 +19,9 @@ const GIT_BRANCH_MAX_BUFFER_BYTES = 4 * 1024;
18
19
  * events, compaction progress observation, the queued-input integration, and disposal order. The
19
20
  * adapter derives its view state from the session it is handed and never touches these directly.
20
21
  */
22
+ function hasSessionContent(path, session) {
23
+ return path !== null && existsSync(path) && session.messages.length > 0;
24
+ }
21
25
  export class PiEngineRuntime {
22
26
  #options;
23
27
  #ports;
@@ -154,14 +158,16 @@ export class PiEngineRuntime {
154
158
  return typeof value === "string" && value.length > 0 ? value : null;
155
159
  }
156
160
  currentSessionResumeMetadata() {
157
- const manager = this.#session?.sessionManager;
158
- if (manager === undefined
161
+ const session = this.#session;
162
+ const manager = session?.sessionManager;
163
+ if (session === undefined
164
+ || manager === undefined
159
165
  || typeof manager.isPersisted !== "function"
160
166
  || typeof manager.getSessionId !== "function"
161
167
  || typeof manager.getSessionDir !== "function"
162
168
  || typeof manager.usesDefaultSessionDir !== "function"
163
169
  || manager.isPersisted() !== true
164
- || !existsSync(this.currentSessionFile() ?? ""))
170
+ || !hasSessionContent(this.currentSessionFile(), session))
165
171
  return null;
166
172
  const sessionId = manager.getSessionId();
167
173
  const sessionDir = manager.getSessionDir();
@@ -364,8 +370,10 @@ export class PiEngineRuntime {
364
370
  return;
365
371
  const generation = this.#sessionGeneration;
366
372
  this.#unsubscribe = session.subscribe(event => {
367
- if (generation === this.#sessionGeneration && !this.#ports.disposed())
368
- this.#ports.event(event);
373
+ if (generation !== this.#sessionGeneration || this.#ports.disposed())
374
+ return;
375
+ residentProgressObserver()?.engineDelivery(event);
376
+ this.#ports.event(event);
369
377
  });
370
378
  }
371
379
  /**
@@ -1,4 +1,5 @@
1
1
  import { SessionManager, type SessionInfo } from "../startup-public.js";
2
+ import { type SessionWriterHandle } from "../../../foundation/session-writer-lock/index.js";
2
3
  export interface PiSessionSelection {
3
4
  readonly target: string;
4
5
  readonly sessionDir?: string;
@@ -16,11 +17,13 @@ interface SessionSelectionOptions {
16
17
  readonly selection: PiSessionSelection;
17
18
  readonly sessionDir?: string;
18
19
  readonly forkPrompt?: PiSessionForkPrompt;
20
+ readonly guardWriter?: boolean;
19
21
  /** Public API seam for deterministic lookup/open race and listing-order evidence. */
20
22
  readonly sessions?: Pick<typeof SessionManager, "list" | "open" | "forkFrom"> & {
21
23
  readonly listAll: (sessionDir?: string) => Promise<SessionInfo[]>;
22
24
  };
23
25
  }
26
+ export declare function takeSelectedSessionWriter(manager: SessionManager): SessionWriterHandle | undefined;
24
27
  /** Pinned Pi 0.84.2 main.ts policy, using SDK APIs rather than importing the CLI. */
25
28
  export declare function openSelectedPiSession(options: SessionSelectionOptions): Promise<SessionManager>;
26
29
  /** Resolve before switching effective cwd, including quoted home-relative paths. */
@@ -2,6 +2,7 @@ import { accessSync, constants, existsSync, realpathSync, statSync } from "node:
2
2
  import { homedir } from "node:os";
3
3
  import { resolve } from "node:path";
4
4
  import { SessionManager } from "../startup-public.js";
5
+ import { acquireExisting, acquireSessionWriter, SessionWriterConflict, } from "../../../foundation/session-writer-lock/index.js";
5
6
  /** Expected resume outcomes are concise CLI diagnostics, not engine crashes. */
6
7
  export class PiSessionSelectionError extends Error {
7
8
  exitCode;
@@ -11,13 +12,23 @@ export class PiSessionSelectionError extends Error {
11
12
  this.name = "PiSessionSelectionError";
12
13
  }
13
14
  }
15
+ const selectedSessionWriters = new WeakMap();
16
+ export function takeSelectedSessionWriter(manager) {
17
+ const writer = selectedSessionWriters.get(manager);
18
+ selectedSessionWriters.delete(manager);
19
+ return writer;
20
+ }
21
+ function holdSelectedWriter(manager, writer) {
22
+ selectedSessionWriters.set(manager, writer);
23
+ return manager;
24
+ }
14
25
  /** Pinned Pi 0.84.2 main.ts policy, using SDK APIs rather than importing the CLI. */
15
26
  export async function openSelectedPiSession(options) {
27
+ const sessions = options.sessions ?? SessionManager;
28
+ const cwd = resolve(options.cwd);
29
+ const directory = options.selection.sessionDir ?? options.sessionDir ?? process.env.PI_CODING_AGENT_SESSION_DIR;
30
+ const sessionDir = directory === undefined ? undefined : resolveSessionArgumentPath(directory, cwd);
16
31
  try {
17
- const sessions = options.sessions ?? SessionManager;
18
- const cwd = resolve(options.cwd);
19
- const directory = options.selection.sessionDir ?? options.sessionDir ?? process.env.PI_CODING_AGENT_SESSION_DIR;
20
- const sessionDir = directory === undefined ? undefined : resolveSessionArgumentPath(directory, cwd);
21
32
  const target = options.selection.target;
22
33
  let path;
23
34
  let global;
@@ -43,18 +54,43 @@ export async function openSelectedPiSession(options) {
43
54
  }
44
55
  assertResumeFile(path);
45
56
  assertCwd(cwd);
46
- return sessions.forkFrom(path, cwd, sessionDir);
57
+ const manager = sessions.forkFrom(path, cwd, sessionDir);
58
+ if (!options.guardWriter)
59
+ return manager;
60
+ const target = manager.getSessionFile();
61
+ if (target === undefined)
62
+ throw new PiSessionSelectionError("Fork did not create a session file");
63
+ return holdSelectedWriter(manager, acquireSessionWriter(target));
47
64
  }
48
65
  // Invariant: no await between the final guard and SDK open. A disappeared target
49
66
  // can otherwise produce a new in-memory header instead of an existing session.
50
- const manager = sessions.open(path, sessionDir);
51
- assertResumeFile(path);
52
- assertCwd(manager.getCwd());
53
- return manager;
67
+ const writer = options.guardWriter ? acquireExisting(path) : undefined;
68
+ try {
69
+ const manager = sessions.open(path, sessionDir);
70
+ assertResumeFile(path);
71
+ assertCwd(manager.getCwd());
72
+ return writer === undefined ? manager : holdSelectedWriter(manager, writer);
73
+ }
74
+ catch (error) {
75
+ writer?.release();
76
+ throw error;
77
+ }
54
78
  }
55
79
  catch (error) {
56
80
  if (error instanceof PiSessionSelectionError)
57
81
  throw error;
82
+ if (error instanceof SessionWriterConflict) {
83
+ if (options.forkPrompt && await options.forkPrompt({ sourceCwd: cwd })) {
84
+ const manager = sessions.forkFrom(error.path, cwd, sessionDir);
85
+ if (!options.guardWriter)
86
+ return manager;
87
+ const target = manager.getSessionFile();
88
+ if (target === undefined)
89
+ throw new PiSessionSelectionError("Fork did not create a session file");
90
+ return holdSelectedWriter(manager, acquireSessionWriter(target));
91
+ }
92
+ throw new PiSessionSelectionError("session is open in another A1 process");
93
+ }
58
94
  throw new PiSessionSelectionError(`Could not resume session: ${error instanceof Error ? error.message : String(error)}`);
59
95
  }
60
96
  }
@@ -80,6 +80,11 @@ export interface PiSettingsModelChoice {
80
80
  readonly description: string;
81
81
  readonly levels: readonly string[];
82
82
  }
83
+ /** The engine's rule: no reasoning means "off" only; xhigh and max exist only where the model maps them. */
84
+ export declare function supportedThinkingLevels(model: {
85
+ readonly reasoning?: boolean;
86
+ readonly thinkingLevelMap?: Readonly<Record<string, unknown>>;
87
+ }): readonly string[];
83
88
  /** The choice that clears a per-model override; the engine then applies its global default. */
84
89
  export declare const MODEL_THINKING_DEFAULT = "default";
85
90
  export declare const AUTOMATIC_THEME = "automatic";
@@ -24,6 +24,7 @@ export const PI_SETTING_EFFECTS = Object.freeze({
24
24
  enableInstallTelemetry: effect("next-start", "installation", "none", "install lifecycle and its pinned failure diagnostic", "settings-effects-installation-parity"),
25
25
  quietStartup: hiddenEffect("next-start", "startup", "pinned startup suppression lifecycle", "pi-startup-composition-parity"),
26
26
  defaultProjectTrust: effect("next-start", "startup", "startup-selector", "pinned pre-resource project trust selector", "project-trust-startup-parity"),
27
+ sessionShareDestination: effect("live", "agent", "none", "pinned /share Radius or gist upload and its status rows", "pinned-share-destination-parity"),
27
28
  doubleEscapeAction: effect("live", "shell", "selector", "pinned tree or fork selector", "pinned-selector-parity"),
28
29
  treeFilterMode: effect("live", "shell", "selector", "pinned tree selector filter, rows, and hints", "pinned-selector-parity"),
29
30
  showHardwareCursor: effect("live", "terminal", "terminal-cursor", "pinned editor, overlay, blur, failure, and exit cursor operations", "pi-terminal-operation-parity"),
@@ -251,6 +252,19 @@ function outcome(status, application, storedValue, effectiveValue, failure, limi
251
252
  function describe(error) {
252
253
  return error instanceof Error ? error.message : String(error);
253
254
  }
255
+ /** The engine's rule: no reasoning means "off" only; xhigh and max exist only where the model maps them. */
256
+ export function supportedThinkingLevels(model) {
257
+ if (!model.reasoning)
258
+ return ["off"];
259
+ return ["off", "minimal", "low", "medium", "high", "xhigh", "max"].filter(level => {
260
+ const mapped = model.thinkingLevelMap?.[level];
261
+ if (mapped === null)
262
+ return false;
263
+ if (level === "xhigh" || level === "max")
264
+ return mapped !== undefined;
265
+ return true;
266
+ });
267
+ }
254
268
  /** The choice that clears a per-model override; the engine then applies its global default. */
255
269
  export const MODEL_THINKING_DEFAULT = "default";
256
270
  export const AUTOMATIC_THEME = "automatic";
@@ -411,6 +425,7 @@ function operations(settings, providers) {
411
425
  bool("enableInstallTelemetry", () => settings.getEnableInstallTelemetry(), value => settings.setEnableInstallTelemetry(value)),
412
426
  quietStartupSetting(settings),
413
427
  choice("defaultProjectTrust", offered("defaultProjectTrust"), () => settings.getDefaultProjectTrust(), value => settings.setDefaultProjectTrust(value)),
428
+ choice("sessionShareDestination", offered("sessionShareDestination"), () => settings.getSessionShareDestination(), value => settings.setSessionShareDestination(value)),
414
429
  choice("doubleEscapeAction", offered("doubleEscapeAction"), () => settings.getDoubleEscapeAction(), value => settings.setDoubleEscapeAction(value)),
415
430
  choice("treeFilterMode", offered("treeFilterMode"), () => settings.getTreeFilterMode(), value => settings.setTreeFilterMode(value)),
416
431
  bool("showHardwareCursor", () => settings.getShowHardwareCursor(), value => settings.setShowHardwareCursor(value)),
@@ -1,6 +1,6 @@
1
1
  import { isRecord, readThinkingLevel, stringProperty } from "./message-values.js";
2
2
  import { collectionResult } from "./resource-catalog.js";
3
- import { MODEL_THINKING_DEFAULT, PiSettingsBridge } from "./settings-bridge.js";
3
+ import { MODEL_THINKING_DEFAULT, PiSettingsBridge, supportedThinkingLevels } from "./settings-bridge.js";
4
4
  import { workflowResult } from "./workflow-support.js";
5
5
  import { PINNED_PI_SETTINGS_CALLBACKS } from "./workflows.js";
6
6
  /**
@@ -142,6 +142,12 @@ export class PiEngineSettings {
142
142
  session.setThinkingLevel(level);
143
143
  this.#ports.thinkingLevelChanged(readThinkingLevel(session.thinkingLevel));
144
144
  } },
145
+ sessionShareDestination: { apply: value => {
146
+ if (value !== "auto" && value !== "gist" && value !== "radius")
147
+ throw new TypeError("Session share destination is invalid");
148
+ // Invariant: `/share` reads the manager per run, so persisting is the whole live effect.
149
+ settings.setSessionShareDestination(value);
150
+ } },
145
151
  warnings: { apply: value => {
146
152
  if (!isRecord(value) || Object.values(value).some(flag => typeof flag !== "boolean"))
147
153
  throw new TypeError("Warnings setting is invalid");
@@ -222,6 +228,7 @@ export class PiEngineSettings {
222
228
  autocompleteMaxVisible: setting(settings?.getAutocompleteMaxVisible, 5),
223
229
  quietStartup: setting(settings?.getQuietStartup, false),
224
230
  defaultProjectTrust: setting(settings?.getDefaultProjectTrust, "ask"),
231
+ sessionShareDestination: setting(settings?.getSessionShareDestination, "auto"),
225
232
  clearOnShrink: setting(settings?.getClearOnShrink, false),
226
233
  showTerminalProgress: setting(settings?.getShowTerminalProgress, false),
227
234
  tuiMode: setting(settings?.getTuiMode, "regular"),
@@ -274,6 +281,7 @@ export class PiEngineSettings {
274
281
  onEnableInstallTelemetryChange: snapshot.enableInstallTelemetry,
275
282
  onQuietStartupChange: snapshot.quietStartup,
276
283
  onDefaultProjectTrustChange: snapshot.defaultProjectTrust,
284
+ onSessionShareDestinationChange: snapshot.sessionShareDestination,
277
285
  onDoubleEscapeActionChange: snapshot.doubleEscapeAction,
278
286
  onTreeFilterModeChange: snapshot.treeFilterMode,
279
287
  onShowHardwareCursorChange: snapshot.showHardwareCursor,
@@ -331,7 +339,8 @@ function settingKeyForCallback(callback) {
331
339
  onHideThinkingBlockChange: "hideThinkingBlock", onMermaidRenderingModeChange: "mermaidRenderingMode",
332
340
  onShowCacheMissNoticesChange: "showCacheMissNotices", onCollapseChangelogChange: "collapseChangelog",
333
341
  onEnableInstallTelemetryChange: "enableInstallTelemetry", onQuietStartupChange: "quietStartup",
334
- onDefaultProjectTrustChange: "defaultProjectTrust", onDoubleEscapeActionChange: "doubleEscapeAction",
342
+ onDefaultProjectTrustChange: "defaultProjectTrust", onSessionShareDestinationChange: "sessionShareDestination",
343
+ onDoubleEscapeActionChange: "doubleEscapeAction",
335
344
  onTreeFilterModeChange: "treeFilterMode", onShowHardwareCursorChange: "showHardwareCursor",
336
345
  onEditorPaddingXChange: "editorPaddingX", onOutputPadChange: "outputPad", onAutocompleteMaxVisibleChange: "autocompleteMaxVisible",
337
346
  onClearOnShrinkChange: "clearOnShrink", onShowTerminalProgressChange: "showTerminalProgress", onTuiModeChange: "tuiMode",
@@ -352,19 +361,6 @@ function agentJsonValue(value) {
352
361
  function isThinkingLevel(value) {
353
362
  return typeof value === "string" && ["off", "minimal", "low", "medium", "high", "xhigh", "max"].includes(value);
354
363
  }
355
- /** The engine's own rule: no reasoning means "off" only; xhigh and max exist only where the model maps them. */
356
- function supportedThinkingLevels(model) {
357
- if (!model.reasoning)
358
- return ["off"];
359
- return ["off", "minimal", "low", "medium", "high", "xhigh", "max"].filter(level => {
360
- const mapped = model.thinkingLevelMap?.[level];
361
- if (mapped === null)
362
- return false;
363
- if (level === "xhigh" || level === "max")
364
- return mapped !== undefined;
365
- return true;
366
- });
367
- }
368
364
  function settingLabel(callback) {
369
365
  return callback
370
366
  .replace(/^on/, "")
@@ -0,0 +1,42 @@
1
+ import type { OwnedUiDiagnostics, OwnedUiEditorState, OwnedUiModelInfo, OwnedUiSessionViewModel, OwnedUiStatusView, OwnedUiTerminalSurface, OwnedUiThinkingLevel, OwnedUiUsageView } from "../../../contracts/owned-ui/index.js";
2
+ /**
3
+ * The engine adapter's own view-model state: lifecycle, editor, status, terminal surface, active
4
+ * model, thinking level, the usage cache, diagnostics, and the view revision. Every change that
5
+ * touches more than one field is one named mutator, so the adapter and its collaborators never
6
+ * rebuild these objects inline.
7
+ */
8
+ export declare class EngineViewState {
9
+ #private;
10
+ lifecycle: OwnedUiSessionViewModel["lifecycle"];
11
+ activeModel: OwnedUiModelInfo | null;
12
+ thinkingLevel: OwnedUiThinkingLevel;
13
+ get revision(): number;
14
+ get editor(): OwnedUiEditorState;
15
+ get status(): OwnedUiStatusView;
16
+ get terminal(): OwnedUiTerminalSurface;
17
+ get diagnostics(): readonly OwnedUiDiagnostics[];
18
+ /** Any emitted event advances the revision. */
19
+ advance(): void;
20
+ /** A full view is about to be published: usage is recomputed and the revision advances. */
21
+ invalidate(): void;
22
+ invalidateUsage(): void;
23
+ /** The cached usage view, computed once per published view. */
24
+ usage(read: () => OwnedUiUsageView): OwnedUiUsageView;
25
+ /** The engine started: the session is ready and accepts submissions. */
26
+ markReady(): void;
27
+ /** A run started with `message` as its working status; true when the session was already busy. */
28
+ enterWork(message: string): boolean;
29
+ leaveWork(): void;
30
+ /** Records compaction or retry progress; false when it did not change. */
31
+ setWorkProgress(percent: Exclude<OwnedUiStatusView["workingProgress"], undefined>): boolean;
32
+ setQueuedSubmissions(queuedSubmissions: readonly string[]): void;
33
+ /** Fills an empty editor with `text`, as tree navigation does for the selected branch's prompt. */
34
+ offerEditorText(text: string): void;
35
+ setHardwareCursor(hardwareCursor: boolean): void;
36
+ setTerminal(surface: OwnedUiTerminalSurface): void;
37
+ /** A replaced session starts with an empty editor that accepts submissions and no working status. */
38
+ replaceSession(): void;
39
+ /** Delivery overload ended the run: ready when it can resume, stopped once disposed, otherwise failed. */
40
+ settleOverload(canResume: boolean, disposed: boolean): void;
41
+ recordDiagnostic(severity: OwnedUiDiagnostics["severity"], code: string, message: string, recoverable: boolean): OwnedUiDiagnostics;
42
+ }
@@ -0,0 +1,126 @@
1
+ const DEFAULT_SURFACE = {
2
+ columns: 100,
3
+ rows: 32,
4
+ focusedRegion: "editor",
5
+ hardwareCursor: false,
6
+ };
7
+ const MAX_DIAGNOSTICS = 100;
8
+ const MAX_STATUS_DIAGNOSTICS = 8;
9
+ /**
10
+ * The engine adapter's own view-model state: lifecycle, editor, status, terminal surface, active
11
+ * model, thinking level, the usage cache, diagnostics, and the view revision. Every change that
12
+ * touches more than one field is one named mutator, so the adapter and its collaborators never
13
+ * rebuild these objects inline.
14
+ */
15
+ export class EngineViewState {
16
+ #revision = 0;
17
+ #editor = {
18
+ text: "",
19
+ queuedSubmissions: [],
20
+ selection: null,
21
+ cursorOffset: 0,
22
+ historyRevision: 0,
23
+ submitEnabled: false,
24
+ };
25
+ #status = {
26
+ title: "Pi",
27
+ workingMessage: null,
28
+ diagnostics: [],
29
+ badges: [],
30
+ };
31
+ #terminal = DEFAULT_SURFACE;
32
+ lifecycle = "starting";
33
+ activeModel = null;
34
+ thinkingLevel = "medium";
35
+ #usage;
36
+ #diagnostics = [];
37
+ get revision() { return this.#revision; }
38
+ get editor() { return this.#editor; }
39
+ get status() { return this.#status; }
40
+ get terminal() { return this.#terminal; }
41
+ get diagnostics() { return this.#diagnostics; }
42
+ /** Any emitted event advances the revision. */
43
+ advance() {
44
+ this.#revision += 1;
45
+ }
46
+ /** A full view is about to be published: usage is recomputed and the revision advances. */
47
+ invalidate() {
48
+ this.#usage = undefined;
49
+ this.#revision += 1;
50
+ }
51
+ invalidateUsage() {
52
+ this.#usage = undefined;
53
+ }
54
+ /** The cached usage view, computed once per published view. */
55
+ usage(read) {
56
+ return this.#usage ??= read();
57
+ }
58
+ /** The engine started: the session is ready and accepts submissions. */
59
+ markReady() {
60
+ this.lifecycle = "ready";
61
+ this.#editor = { ...this.#editor, submitEnabled: true };
62
+ }
63
+ /** A run started with `message` as its working status; true when the session was already busy. */
64
+ enterWork(message) {
65
+ const wasBusy = this.lifecycle === "busy";
66
+ this.lifecycle = "busy";
67
+ this.#status = { ...this.#status, workingMessage: message, workingProgress: null };
68
+ return wasBusy;
69
+ }
70
+ leaveWork() {
71
+ this.lifecycle = "ready";
72
+ this.#status = { ...this.#status, workingMessage: null, workingProgress: null };
73
+ }
74
+ /** Records compaction or retry progress; false when it did not change. */
75
+ setWorkProgress(percent) {
76
+ if (this.#status.workingProgress === percent)
77
+ return false;
78
+ this.#status = { ...this.#status, workingProgress: percent };
79
+ return true;
80
+ }
81
+ setQueuedSubmissions(queuedSubmissions) {
82
+ this.#editor = { ...this.#editor, queuedSubmissions: [...queuedSubmissions], historyRevision: this.#editor.historyRevision + 1 };
83
+ }
84
+ /** Fills an empty editor with `text`, as tree navigation does for the selected branch's prompt. */
85
+ offerEditorText(text) {
86
+ if (!this.#editor.text.trim()) {
87
+ this.#editor = { ...this.#editor, text, selection: null, cursorOffset: text.length };
88
+ }
89
+ }
90
+ setHardwareCursor(hardwareCursor) {
91
+ this.#terminal = { ...this.#terminal, hardwareCursor };
92
+ }
93
+ setTerminal(surface) {
94
+ this.#terminal = { ...surface };
95
+ }
96
+ /** A replaced session starts with an empty editor that accepts submissions and no working status. */
97
+ replaceSession() {
98
+ this.#editor = {
99
+ text: "",
100
+ queuedSubmissions: [],
101
+ selection: null,
102
+ cursorOffset: 0,
103
+ historyRevision: this.#editor.historyRevision + 1,
104
+ submitEnabled: true,
105
+ };
106
+ this.#status = { ...this.#status, workingMessage: null, workingProgress: null, badges: [] };
107
+ }
108
+ /** Delivery overload ended the run: ready when it can resume, stopped once disposed, otherwise failed. */
109
+ settleOverload(canResume, disposed) {
110
+ this.#status = { ...this.#status, workingMessage: null, workingProgress: null };
111
+ this.lifecycle = disposed ? "stopped" : canResume ? "ready" : "failed";
112
+ this.#editor = { ...this.#editor, submitEnabled: canResume && !disposed };
113
+ this.#revision += 1;
114
+ }
115
+ recordDiagnostic(severity, code, message, recoverable) {
116
+ const diagnostic = { sequence: this.#diagnostics.length, code, severity, message, recoverable };
117
+ this.#diagnostics.push(diagnostic);
118
+ if (this.#diagnostics.length > MAX_DIAGNOSTICS)
119
+ this.#diagnostics.shift();
120
+ this.#status = {
121
+ ...this.#status,
122
+ diagnostics: [...this.#status.diagnostics, message].slice(-MAX_STATUS_DIAGNOSTICS),
123
+ };
124
+ return diagnostic;
125
+ }
126
+ }
@@ -3,6 +3,7 @@ import { dirname, resolve } from "node:path";
3
3
  import { dynamicObject, isRecord, requireCapability, stringProperty } from "./message-values.js";
4
4
  import { ProjectTrustStore, SessionManager } from "../startup-public.js";
5
5
  import { resolveConfiguredModelIds, scopedModelRecords, scopedModelReference, workflowOptions } from "./workflow-support.js";
6
+ import { acquireExisting } from "../../../foundation/session-writer-lock/index.js";
6
7
  /**
7
8
  * The selector contexts and option lists the owned UI's workflow dialogs read from pinned Pi:
8
9
  * model, scoped-model, session, tree, fork, project-trust, and provider-authentication state,
@@ -102,7 +103,15 @@ export class PiWorkflowContexts {
102
103
  const next = (nextName ?? "").trim();
103
104
  if (!next)
104
105
  return;
105
- SessionManager.open(sessionFilePath).appendSessionInfo(next);
106
+ const isCurrent = typeof currentSessionFilePath === "string"
107
+ && resolve(currentSessionFilePath) === resolve(sessionFilePath);
108
+ const writer = isCurrent ? undefined : acquireExisting(sessionFilePath);
109
+ try {
110
+ SessionManager.open(sessionFilePath).appendSessionInfo(next);
111
+ }
112
+ finally {
113
+ writer?.release();
114
+ }
106
115
  },
107
116
  };
108
117
  }