@timurproko/a1 0.2.6-dev.736 → 0.2.7-dev.1221

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (423) hide show
  1. package/README.md +41 -3
  2. package/bin/automatic-update.js +7 -0
  3. package/bin/cli.js +4 -0
  4. package/bin/guardian.js +5 -0
  5. package/bin/tab-launch-context.d.ts +27 -0
  6. package/bin/tab-launch-context.js +94 -0
  7. package/bin/ui.js +107 -59
  8. package/dist/app/session-shell/clipboard-diagnostics.js +1 -1
  9. package/dist/app/session-shell/dialog-coordinator.d.ts +42 -0
  10. package/dist/app/session-shell/dialog-coordinator.js +133 -0
  11. package/dist/app/session-shell/dock-chrome.d.ts +34 -0
  12. package/dist/app/session-shell/dock-chrome.js +109 -0
  13. package/dist/app/session-shell/exit-notice.d.ts +1 -1
  14. package/dist/app/session-shell/exit-notice.js +1 -1
  15. package/dist/app/session-shell/extension-surface.d.ts +30 -0
  16. package/dist/app/session-shell/extension-surface.js +105 -0
  17. package/dist/app/session-shell/helper-pool.d.ts +3 -5
  18. package/dist/app/session-shell/helper-pool.js +3 -5
  19. package/dist/app/session-shell/input-surface-switch.d.ts +36 -0
  20. package/dist/app/session-shell/input-surface-switch.js +85 -0
  21. package/dist/app/session-shell/login-interaction.d.ts +27 -0
  22. package/dist/app/session-shell/login-interaction.js +91 -0
  23. package/dist/app/session-shell/prompt-submission.d.ts +48 -0
  24. package/dist/app/session-shell/prompt-submission.js +276 -0
  25. package/dist/app/session-shell/resident-tab-coordinator.d.ts +38 -0
  26. package/dist/app/session-shell/resident-tab-coordinator.js +77 -0
  27. package/dist/app/session-shell/response-copy-helper.js +21 -6
  28. package/dist/app/session-shell/response-copy-protocol.d.ts +1 -1
  29. package/dist/app/session-shell/response-copy-transport.d.ts +16 -6
  30. package/dist/app/session-shell/response-copy-transport.js +69 -17
  31. package/dist/app/session-shell/session-concern.d.ts +22 -0
  32. package/dist/app/session-shell/session-concern.js +29 -0
  33. package/dist/app/session-shell/session-lifecycle.d.ts +29 -0
  34. package/dist/app/session-shell/session-lifecycle.js +49 -0
  35. package/dist/app/session-shell/session-shell-root.d.ts +42 -6
  36. package/dist/app/session-shell/session-shell-root.js +196 -908
  37. package/dist/app/session-shell/session-shell.d.ts +3 -8
  38. package/dist/app/session-shell/session-shell.js +324 -835
  39. package/dist/app/session-shell/session-viewport-controller.d.ts +2 -2
  40. package/dist/app/session-shell/session-viewport-controller.js +29 -15
  41. package/dist/app/session-shell/settings-bindings.d.ts +17 -0
  42. package/dist/app/session-shell/settings-bindings.js +91 -0
  43. package/dist/app/session-shell/shell-editor-factory.d.ts +27 -0
  44. package/dist/app/session-shell/shell-editor-factory.js +102 -0
  45. package/dist/app/session-shell/shell-host.d.ts +6 -0
  46. package/dist/app/session-shell/shell-host.js +34 -7
  47. package/dist/app/session-shell/shell-layout.d.ts +64 -0
  48. package/dist/app/session-shell/shell-layout.js +18 -0
  49. package/dist/app/session-shell/suggestion-surface.d.ts +25 -0
  50. package/dist/app/session-shell/suggestion-surface.js +63 -0
  51. package/dist/app/session-shell/transcript-document.d.ts +78 -0
  52. package/dist/app/session-shell/transcript-document.js +365 -0
  53. package/dist/app/session-shell/viewport-layout.d.ts +31 -0
  54. package/dist/app/session-shell/viewport-layout.js +160 -0
  55. package/dist/app/session-shell/workflow-output.d.ts +33 -0
  56. package/dist/app/session-shell/workflow-output.js +174 -0
  57. package/dist/app/session-shell/workflow-router.d.ts +25 -0
  58. package/dist/app/session-shell/workflow-router.js +39 -0
  59. package/dist/cli/dispatch.d.ts +11 -1
  60. package/dist/cli/dispatch.js +79 -5
  61. package/dist/cli/tabs-request.d.ts +7 -0
  62. package/dist/cli/tabs-request.js +1 -0
  63. package/dist/cli/tabs.d.ts +14 -0
  64. package/dist/cli/tabs.js +151 -0
  65. package/dist/cli/version-stats.js +38 -3
  66. package/dist/composition/owned-settings.d.ts +12 -0
  67. package/dist/composition/owned-settings.js +36 -0
  68. package/dist/composition/owned-ui.d.ts +27 -28
  69. package/dist/composition/owned-ui.js +205 -153
  70. package/dist/composition/resident-tab-bridge.d.ts +25 -0
  71. package/dist/composition/resident-tab-bridge.js +180 -0
  72. package/dist/composition/session-backend.d.ts +19 -0
  73. package/dist/composition/session-backend.js +1 -0
  74. package/dist/composition/session-runtime-registry.d.ts +20 -0
  75. package/dist/composition/session-runtime-registry.js +85 -0
  76. package/dist/composition/settings-route-host.d.ts +16 -1
  77. package/dist/composition/settings-route-host.js +29 -10
  78. package/dist/composition/settings-search-input.d.ts +9 -0
  79. package/dist/composition/settings-search-input.js +58 -0
  80. package/dist/composition/startup-route.d.ts +32 -0
  81. package/dist/composition/startup-route.js +72 -0
  82. package/dist/composition/utility-tab.d.ts +28 -0
  83. package/dist/composition/utility-tab.js +242 -0
  84. package/dist/contracts/owned-ui/index.d.ts +1 -1
  85. package/dist/contracts/owned-ui/model.d.ts +3 -0
  86. package/dist/contracts/owned-ui/session-backend.d.ts +3 -0
  87. package/dist/contracts/owned-ui/session-workflows.d.ts +11 -4
  88. package/dist/contracts/presentation/index.d.ts +11 -0
  89. package/dist/contracts/presentation/index.js +12 -0
  90. package/dist/features/launch/development-launch.js +6 -0
  91. package/dist/features/launch/index.d.ts +1 -1
  92. package/dist/features/launch/intent.d.ts +3 -1
  93. package/dist/features/launch/intent.js +7 -4
  94. package/dist/features/launch/profile-paths.js +4 -0
  95. package/dist/features/owned-ui/plus-menu-dialog.d.ts +22 -0
  96. package/dist/features/owned-ui/plus-menu-dialog.js +76 -0
  97. package/dist/features/owned-ui/project-trust-dialog.d.ts +1 -1
  98. package/dist/features/owned-ui/project-trust-dialog.js +6 -8
  99. package/dist/features/owned-ui/project-trust-prompt.d.ts +1 -0
  100. package/dist/features/owned-ui/project-trust-prompt.js +7 -3
  101. package/dist/features/owned-ui/reference-screen-app.d.ts +2 -0
  102. package/dist/features/owned-ui/reference-screen-app.js +12 -2
  103. package/dist/features/owned-ui/resources/release-notes.json +4 -0
  104. package/dist/features/owned-ui/settings-app.d.ts +12 -2
  105. package/dist/features/owned-ui/settings-app.js +119 -84
  106. package/dist/features/owned-ui/settings-search-input.d.ts +29 -0
  107. package/dist/features/owned-ui/settings-search-input.js +1 -0
  108. package/dist/features/prompt-history/index.d.ts +1 -1
  109. package/dist/features/prompt-history/paths.d.ts +2 -1
  110. package/dist/features/prompt-history/paths.js +10 -2
  111. package/dist/features/prompt-history/service.d.ts +5 -0
  112. package/dist/features/prompt-history/service.js +1 -1
  113. package/dist/features/resident-tab/auto-name.d.ts +11 -0
  114. package/dist/features/resident-tab/auto-name.js +44 -0
  115. package/dist/features/resident-tab/index.d.ts +5 -0
  116. package/dist/features/resident-tab/index.js +7 -0
  117. package/dist/features/resident-tab/shortcut-bindings-file.d.ts +8 -0
  118. package/dist/features/resident-tab/shortcut-bindings-file.js +40 -0
  119. package/dist/features/resident-tab/shortcut-declarations.d.ts +13 -0
  120. package/dist/features/resident-tab/shortcut-declarations.js +26 -0
  121. package/dist/features/resident-tab/shortcut-projection.d.ts +29 -0
  122. package/dist/features/resident-tab/shortcut-projection.js +64 -0
  123. package/dist/features/resident-tab/status-deriver.d.ts +10 -0
  124. package/dist/features/resident-tab/status-deriver.js +12 -0
  125. package/dist/foundation/launch-context/index.d.ts +12 -0
  126. package/dist/foundation/launch-context/index.js +26 -0
  127. package/dist/foundation/launch-guardian/exit-watcher.d.ts +14 -0
  128. package/dist/foundation/launch-guardian/exit-watcher.js +94 -0
  129. package/dist/foundation/launch-guardian/main.d.ts +7 -1
  130. package/dist/foundation/launch-guardian/main.js +60 -7
  131. package/dist/foundation/lifecycle/session-repository-context.js +16 -2
  132. package/dist/foundation/process-containment/{native-guardian-containment.d.ts → addon-containment.d.ts} +7 -5
  133. package/dist/foundation/process-containment/addon-containment.js +139 -0
  134. package/dist/foundation/process-containment/addon-process-inspector.d.ts +11 -0
  135. package/dist/foundation/process-containment/addon-process-inspector.js +36 -0
  136. package/dist/foundation/process-containment/addon.d.ts +42 -0
  137. package/dist/foundation/process-containment/addon.js +57 -0
  138. package/dist/foundation/process-containment/artifact.d.ts +1 -1
  139. package/dist/foundation/process-containment/artifact.js +6 -5
  140. package/dist/foundation/process-containment/contracts.d.ts +2 -0
  141. package/dist/foundation/process-containment/index.d.ts +4 -4
  142. package/dist/foundation/process-containment/index.js +3 -3
  143. package/dist/foundation/process-containment/native-process-inspector.d.ts +2 -1
  144. package/dist/foundation/process-containment/native-process-inspector.js +10 -10
  145. package/dist/foundation/release/automatic-update.d.ts +37 -0
  146. package/dist/foundation/release/automatic-update.js +265 -0
  147. package/dist/foundation/release/bootstrap.d.ts +7 -9
  148. package/dist/foundation/release/bootstrap.js +107 -24
  149. package/dist/foundation/release/cohort-state.d.ts +1 -1
  150. package/dist/foundation/release/cohort-state.js +6 -3
  151. package/dist/foundation/release/dependency-certification.js +54 -19
  152. package/dist/foundation/release/early-accent.d.ts +12 -0
  153. package/dist/foundation/release/early-accent.js +59 -0
  154. package/dist/foundation/release/index.d.ts +2 -2
  155. package/dist/foundation/release/index.js +2 -2
  156. package/dist/foundation/release/latest-release.d.ts +24 -2
  157. package/dist/foundation/release/latest-release.js +51 -1
  158. package/dist/foundation/release/progress-palette.generated.d.ts +137 -3
  159. package/dist/foundation/release/progress-palette.generated.js +137 -3
  160. package/dist/foundation/release/release-gc.d.ts +3 -0
  161. package/dist/foundation/release/release-gc.js +59 -8
  162. package/dist/foundation/release/release-store.d.ts +12 -0
  163. package/dist/foundation/release/release-store.js +124 -2
  164. package/dist/foundation/release/update-execution-lease.d.ts +48 -0
  165. package/dist/foundation/release/update-execution-lease.js +161 -0
  166. package/dist/foundation/release/update.d.ts +12 -7
  167. package/dist/foundation/release/update.js +281 -196
  168. package/dist/foundation/resident-tabs/bounded-host-command.d.ts +18 -0
  169. package/dist/foundation/resident-tabs/bounded-host-command.js +39 -0
  170. package/dist/foundation/resident-tabs/bridge-client.d.ts +70 -0
  171. package/dist/foundation/resident-tabs/bridge-client.js +321 -0
  172. package/dist/foundation/resident-tabs/doctor.d.ts +28 -0
  173. package/dist/foundation/resident-tabs/doctor.js +166 -0
  174. package/dist/foundation/resident-tabs/draft-checkpoint.d.ts +27 -0
  175. package/dist/foundation/resident-tabs/draft-checkpoint.js +145 -0
  176. package/dist/foundation/resident-tabs/ensure-terminal-host.d.ts +36 -0
  177. package/dist/foundation/resident-tabs/ensure-terminal-host.js +151 -0
  178. package/dist/foundation/resident-tabs/fault-injection.d.ts +8 -0
  179. package/dist/foundation/resident-tabs/fault-injection.js +26 -0
  180. package/dist/foundation/resident-tabs/fixture-control.d.ts +7 -0
  181. package/dist/foundation/resident-tabs/fixture-control.js +35 -0
  182. package/dist/foundation/resident-tabs/host-entry.d.ts +1 -0
  183. package/dist/foundation/resident-tabs/host-entry.js +17 -0
  184. package/dist/foundation/resident-tabs/index.d.ts +12 -0
  185. package/dist/foundation/resident-tabs/index.js +6 -0
  186. package/dist/foundation/resident-tabs/maintenance.d.ts +39 -0
  187. package/dist/foundation/resident-tabs/maintenance.js +75 -0
  188. package/dist/foundation/resident-tabs/progress-observation-schema.d.ts +34 -0
  189. package/dist/foundation/resident-tabs/progress-observation-schema.js +1 -0
  190. package/dist/foundation/resident-tabs/progress-observation.d.ts +4 -0
  191. package/dist/foundation/resident-tabs/progress-observation.js +150 -0
  192. package/dist/foundation/resident-tabs/prompt-journal.d.ts +63 -0
  193. package/dist/foundation/resident-tabs/prompt-journal.js +213 -0
  194. package/dist/foundation/resident-tabs/protocol.d.ts +12 -0
  195. package/dist/foundation/resident-tabs/protocol.js +195 -0
  196. package/dist/foundation/resident-tabs/recovery.d.ts +26 -0
  197. package/dist/foundation/resident-tabs/recovery.js +205 -0
  198. package/dist/foundation/resident-tabs/release-holds.d.ts +28 -0
  199. package/dist/foundation/resident-tabs/release-holds.js +75 -0
  200. package/dist/foundation/resident-tabs/routes.d.ts +5 -0
  201. package/dist/foundation/resident-tabs/routes.js +5 -0
  202. package/dist/foundation/resident-tabs/routing.d.ts +11 -0
  203. package/dist/foundation/resident-tabs/routing.js +10 -0
  204. package/dist/foundation/resident-tabs/session-sync.d.ts +14 -0
  205. package/dist/foundation/resident-tabs/session-sync.js +37 -0
  206. package/dist/foundation/resident-tabs/settings.d.ts +12 -0
  207. package/dist/foundation/resident-tabs/settings.js +58 -0
  208. package/dist/foundation/resident-tabs/terminal-host-artifact.d.ts +14 -0
  209. package/dist/foundation/resident-tabs/terminal-host-artifact.js +78 -0
  210. package/dist/foundation/resident-tabs/zip-archive.d.ts +9 -0
  211. package/dist/foundation/resident-tabs/zip-archive.js +56 -0
  212. package/dist/foundation/session-writer-lock/index.d.ts +30 -0
  213. package/dist/foundation/session-writer-lock/index.js +203 -0
  214. package/dist/foundation/startup/startup-descriptor.js +2 -2
  215. package/dist/foundation/terminal-cleanup/index.d.ts +1 -1
  216. package/dist/foundation/terminal-cleanup/index.js +1 -1
  217. package/dist/foundation/terminal-cleanup/terminal-reset.d.ts +6 -0
  218. package/dist/foundation/terminal-cleanup/terminal-reset.js +6 -0
  219. package/dist/integrations/pi/components/editor-interaction.d.ts +2 -0
  220. package/dist/integrations/pi/components/modal-frame.d.ts +17 -1
  221. package/dist/integrations/pi/components/modal-frame.js +48 -9
  222. package/dist/integrations/pi/components/models-dialog.js +4 -52
  223. package/dist/integrations/pi/components/owned-editor-ux.d.ts +6 -1
  224. package/dist/integrations/pi/components/owned-editor-ux.js +90 -6
  225. package/dist/integrations/pi/components/resources/builtin-themes.d.ts +4 -4
  226. package/dist/integrations/pi/components/resources/builtin-themes.js +4 -4
  227. package/dist/integrations/pi/components/share-operation-dialog.d.ts +2 -0
  228. package/dist/integrations/pi/components/share-operation-dialog.js +2 -1
  229. package/dist/integrations/pi/components/shell-editor-autocomplete.js +58 -36
  230. package/dist/integrations/pi/components/shell-extension-ui.js +79 -60
  231. package/dist/integrations/pi/components/shell-footer-status.d.ts +1 -1
  232. package/dist/integrations/pi/components/shell-footer-status.js +21 -5
  233. package/dist/integrations/pi/components/shell-hotkey-sections.js +1 -1
  234. package/dist/integrations/pi/components/shell-presenters-info.d.ts +5 -2
  235. package/dist/integrations/pi/components/shell-presenters-info.js +18 -4
  236. package/dist/integrations/pi/components/shell-presenters-transcript.js +4 -1
  237. package/dist/integrations/pi/components/shell-selectors-dialogs.js +5 -1
  238. package/dist/integrations/pi/components/shell-shared-facade.d.ts +12 -1
  239. package/dist/integrations/pi/components/skills-dialog.js +2 -2
  240. package/dist/integrations/pi/components/upstream/adjacent/core/keybindings.d.ts +1 -1
  241. package/dist/integrations/pi/components/upstream/adjacent/core/keybindings.js +17 -4
  242. package/dist/integrations/pi/components/upstream/assets/earendil-image.json +2 -2
  243. package/dist/integrations/pi/components/upstream/components/countdown-timer.d.ts +1 -1
  244. package/dist/integrations/pi/components/upstream/components/earendil-announcement.js +1 -1
  245. package/dist/integrations/pi/components/upstream/components/extension-editor.d.ts +1 -1
  246. package/dist/integrations/pi/components/upstream/components/extension-editor.js +1 -1
  247. package/dist/integrations/pi/components/upstream/components/extension-input.js +1 -1
  248. package/dist/integrations/pi/components/upstream/components/extension-selector.js +1 -1
  249. package/dist/integrations/pi/components/upstream/components/mermaid.js +1 -1
  250. package/dist/integrations/pi/components/upstream/components/owned-editor.d.ts +8 -6
  251. package/dist/integrations/pi/components/upstream/components/owned-editor.js +16 -9
  252. package/dist/integrations/pi/components/upstream/components/pi-logo.js +1 -1
  253. package/dist/integrations/pi/components/upstream/components/scoped-models-selector.d.ts +4 -4
  254. package/dist/integrations/pi/components/upstream/components/scoped-models-selector.js +2 -2
  255. package/dist/integrations/pi/components/upstream/components/session-footer.d.ts +2 -1
  256. package/dist/integrations/pi/components/upstream/components/session-footer.js +31 -25
  257. package/dist/integrations/pi/components/upstream/components/session-selector-search.js +1 -1
  258. package/dist/integrations/pi/components/upstream/components/session-selector.js +8 -7
  259. package/dist/integrations/pi/components/upstream/components/skill-invocation-message.d.ts +1 -1
  260. package/dist/integrations/pi/components/upstream/components/skill-invocation-message.js +1 -1
  261. package/dist/integrations/pi/components/upstream/components/status-indicator.d.ts +2 -2
  262. package/dist/integrations/pi/components/upstream/components/status-indicator.js +3 -3
  263. package/dist/integrations/pi/components/upstream/components/themed-text.d.ts +1 -1
  264. package/dist/integrations/pi/components/upstream/components/themed-text.js +1 -1
  265. package/dist/integrations/pi/components/upstream/components/thinking-selector.d.ts +8 -7
  266. package/dist/integrations/pi/components/upstream/components/thinking-selector.js +10 -9
  267. package/dist/integrations/pi/components/upstream/components/tool-execution.d.ts +2 -6
  268. package/dist/integrations/pi/components/upstream/components/tool-execution.js +103 -101
  269. package/dist/integrations/pi/components/upstream/components/tree-selector.d.ts +9 -9
  270. package/dist/integrations/pi/components/upstream/components/tree-selector.js +13 -21
  271. package/dist/integrations/pi/components/upstream/components/trust-selector.js +1 -1
  272. package/dist/integrations/pi/components/upstream/external-editor.js +1 -1
  273. package/dist/integrations/pi/components/upstream/history/editor-core.d.ts +2 -2
  274. package/dist/integrations/pi/components/upstream/history/editor-core.js +7 -5
  275. package/dist/integrations/pi/components/upstream/history/kill-ring.d.ts +1 -1
  276. package/dist/integrations/pi/components/upstream/history/kill-ring.js +1 -1
  277. package/dist/integrations/pi/components/upstream/history/printable-key.js +1 -1
  278. package/dist/integrations/pi/components/upstream/history/text-helpers.js +1 -1
  279. package/dist/integrations/pi/components/upstream/history/undo-stack.d.ts +1 -1
  280. package/dist/integrations/pi/components/upstream/history/undo-stack.js +1 -1
  281. package/dist/integrations/pi/components/upstream/history/word-navigation.js +1 -1
  282. package/dist/integrations/pi/components/upstream/model-search.d.ts +1 -1
  283. package/dist/integrations/pi/components/upstream/program-status-reporter.d.ts +1 -1
  284. package/dist/integrations/pi/components/upstream/theme/theme-controller.d.ts +1 -1
  285. package/dist/integrations/pi/components/upstream/theme/theme.d.ts +5 -0
  286. package/dist/integrations/pi/components/upstream/theme/theme.js +29 -2
  287. package/dist/integrations/pi/engine/adapter.d.ts +5 -77
  288. package/dist/integrations/pi/engine/adapter.js +95 -394
  289. package/dist/integrations/pi/engine/command-dispatch.d.ts +13 -0
  290. package/dist/integrations/pi/engine/command-dispatch.js +57 -0
  291. package/dist/integrations/pi/engine/host.js +2 -2
  292. package/dist/integrations/pi/engine/offline-settings-port.d.ts +23 -0
  293. package/dist/integrations/pi/engine/offline-settings-port.js +53 -0
  294. package/dist/integrations/pi/engine/pi-settings-metadata.json +14 -2
  295. package/dist/integrations/pi/engine/ports.d.ts +56 -0
  296. package/dist/integrations/pi/engine/ports.js +93 -0
  297. package/dist/integrations/pi/engine/prompt-suggestions.d.ts +1 -0
  298. package/dist/integrations/pi/engine/prompt-suggestions.js +40 -0
  299. package/dist/integrations/pi/engine/resources/changelog.json +4 -4
  300. package/dist/integrations/pi/engine/runtime-integration.js +102 -29
  301. package/dist/integrations/pi/engine/session-runtime.d.ts +0 -6
  302. package/dist/integrations/pi/engine/session-runtime.js +13 -5
  303. package/dist/integrations/pi/engine/session-selection.d.ts +3 -0
  304. package/dist/integrations/pi/engine/session-selection.js +45 -9
  305. package/dist/integrations/pi/engine/settings-bridge.d.ts +5 -0
  306. package/dist/integrations/pi/engine/settings-bridge.js +15 -0
  307. package/dist/integrations/pi/engine/settings-port.js +11 -15
  308. package/dist/integrations/pi/engine/view-state.d.ts +42 -0
  309. package/dist/integrations/pi/engine/view-state.js +126 -0
  310. package/dist/integrations/pi/engine/workflow-contexts.js +10 -1
  311. package/dist/integrations/pi/engine/workflow-runner.js +73 -4
  312. package/dist/integrations/pi/engine/workflow-support.d.ts +12 -0
  313. package/dist/integrations/pi/engine/workflow-support.js +36 -0
  314. package/dist/integrations/pi/engine/workflows.d.ts +3 -1
  315. package/dist/integrations/pi/engine/workflows.js +1 -0
  316. package/dist/integrations/pi/startup-public.js +257 -310
  317. package/dist/integrations/pi/startup-public.manifest.json +564 -440
  318. package/dist/integrations/pi/tui-runtime/adapter.d.ts +6 -0
  319. package/dist/integrations/pi/tui-runtime/adapter.js +32 -1
  320. package/dist/integrations/pi/tui-runtime/contracts.d.ts +5 -0
  321. package/dist/integrations/pi/tui-runtime/damage-aware-terminal.d.ts +12 -1
  322. package/dist/integrations/pi/tui-runtime/damage-aware-terminal.js +31 -2
  323. package/dist/native/darwin-arm64/manifest.json +10 -7
  324. package/dist/native/darwin-arm64/process-guardian.node +0 -0
  325. package/dist/native/darwin-arm64/terminal-host-THIRD-PARTY-NOTICES.txt +10500 -0
  326. package/dist/native/darwin-arm64/terminal-host.manifest.json +46 -0
  327. package/dist/native/darwin-arm64/terminal-host.node +0 -0
  328. package/dist/native/darwin-x64/manifest.json +23 -0
  329. package/dist/native/darwin-x64/process-guardian.node +0 -0
  330. package/dist/native/darwin-x64/terminal-host-THIRD-PARTY-NOTICES.txt +10737 -0
  331. package/dist/native/darwin-x64/terminal-host.manifest.json +46 -0
  332. package/dist/native/darwin-x64/terminal-host.node +0 -0
  333. package/dist/native/linux-x64/manifest.json +10 -7
  334. package/dist/native/linux-x64/process-guardian.node +0 -0
  335. package/dist/native/linux-x64/terminal-host-THIRD-PARTY-NOTICES.txt +11226 -0
  336. package/dist/native/linux-x64/terminal-host.manifest.json +46 -0
  337. package/dist/native/linux-x64/terminal-host.node +0 -0
  338. package/dist/native/win32-x64/manifest.json +10 -7
  339. package/dist/native/win32-x64/process-guardian.node +0 -0
  340. package/dist/native/win32-x64/terminal-host-THIRD-PARTY-NOTICES.txt +10757 -0
  341. package/dist/native/win32-x64/terminal-host.manifest.json +46 -0
  342. package/dist/native/win32-x64/terminal-host.node +0 -0
  343. package/dist/product-identity.d.ts +3 -3
  344. package/dist/product-identity.js +4 -4
  345. package/dist/product-identity.json +16 -2
  346. package/dist/runtime-payload-inventory.json +6330 -6677
  347. package/dist/ui/apps/host.d.ts +2 -0
  348. package/dist/ui/apps/host.js +7 -1
  349. package/dist/ui/components/dialog-panel.js +35 -30
  350. package/dist/ui/components/index.d.ts +2 -2
  351. package/dist/ui/components/index.js +1 -1
  352. package/dist/ui/components/line-input.d.ts +4 -1
  353. package/dist/ui/components/line-input.js +3 -1
  354. package/dist/ui/components/prompt-input.d.ts +11 -8
  355. package/dist/ui/components/prompt-input.js +15 -13
  356. package/dist/ui/components/selection-copy.d.ts +2 -0
  357. package/dist/ui/components/selection-copy.js +13 -0
  358. package/dist/ui/components/spans.js +2 -2
  359. package/dist/ui/components/submitted-prompt.d.ts +9 -6
  360. package/dist/ui/components/submitted-prompt.js +20 -12
  361. package/dist/ui/components/surface.js +4 -2
  362. package/dist/ui/components/text.d.ts +3 -6
  363. package/dist/ui/components/text.js +6 -8
  364. package/dist/ui/components/transcript-viewport.d.ts +9 -2
  365. package/dist/ui/components/transcript-viewport.js +176 -55
  366. package/dist/ui/components/value-menu.d.ts +6 -3
  367. package/dist/ui/components/value-menu.js +6 -5
  368. package/dist/ui/settings/declarations.d.ts +90 -16
  369. package/dist/ui/settings/declarations.js +67 -14
  370. package/dist/ui/settings/early-accent.d.ts +81 -0
  371. package/dist/ui/settings/early-accent.js +50 -0
  372. package/dist/ui/settings/index.d.ts +4 -2
  373. package/dist/ui/settings/index.js +2 -1
  374. package/dist/ui/settings/manager.d.ts +16 -3
  375. package/dist/ui/settings/manager.js +122 -33
  376. package/dist/ui/settings/migrations.d.ts +6 -0
  377. package/dist/ui/settings/migrations.js +73 -0
  378. package/dist/ui/settings/profile-document.d.ts +26 -0
  379. package/dist/ui/settings/profile-document.js +164 -0
  380. package/dist/ui/settings/progress-palette.generated.d.ts +139 -0
  381. package/dist/ui/settings/progress-palette.generated.js +139 -0
  382. package/dist/ui/settings/sections.d.ts +4 -0
  383. package/dist/ui/settings/sections.js +9 -3
  384. package/docs/architecture/boundaries.md +25 -10
  385. package/docs/architecture/evidence/resident-tabs/linux-x64.md +37 -0
  386. package/docs/architecture/evidence/resident-tabs/macos-arm64.md +36 -0
  387. package/docs/architecture/evidence/resident-tabs/macos-x64.md +35 -0
  388. package/docs/architecture/evidence/resident-tabs/windows-x64.md +36 -0
  389. package/docs/architecture/evidence/terminal-host-spike/manual-one-pane-terminal-host.md +70 -0
  390. package/docs/architecture/evidence/terminal-host-spike/manual-two-by-two-basic-terminal-host.md +32 -0
  391. package/docs/architecture/evidence/terminal-host-spike/milestone-baseline.json +115 -0
  392. package/docs/architecture/evidence/terminal-host-spike/owned-ui-foundation-prerequisite.json +48 -0
  393. package/docs/architecture/evidence/terminal-host-spike/terminal-host-provenance.json +125 -0
  394. package/docs/architecture/evidence/terminal-host-spike/terminal-host-task-5-1.json +56 -0
  395. package/docs/architecture/evidence/terminal-host-spike/terminal-host-task-5-3.json +174 -0
  396. package/docs/architecture/evidence/terminal-host-spike/terminal-spike-acceptance-record.json +18 -0
  397. package/docs/architecture/internal-naming.md +3 -1
  398. package/docs/architecture/process-guardian-provenance.md +18 -10
  399. package/docs/architecture/project-structure.md +8 -0
  400. package/docs/architecture/resident-tabs-requirements.md +18 -0
  401. package/docs/architecture/resident-tabs.md +648 -0
  402. package/docs/architecture/response-copy-delivery.md +1 -1
  403. package/docs/architecture/terminal-host-proof-gate.md +3 -1
  404. package/docs/architecture/terminal-host-provenance.md +16 -4
  405. package/docs/architecture/terminal-host-spike-evidence.md +1 -1
  406. package/docs/architecture/tool-image-presentation.md +2 -1
  407. package/docs/architecture/toolchain.md +11 -9
  408. package/docs/ci-release-runbook.md +14 -7
  409. package/docs/features/launch-profiles.md +11 -8
  410. package/docs/features/prompt-history.md +41 -20
  411. package/docs/manual-resident-tabs-acceptance.md +51 -0
  412. package/docs/openspec-archive-automation.md +49 -22
  413. package/docs/releases/0.2.6.md +44 -0
  414. package/docs/validation.md +49 -9
  415. package/package.json +19 -6
  416. package/dist/foundation/process-containment/darwin-process-inspector.d.ts +0 -5
  417. package/dist/foundation/process-containment/darwin-process-inspector.js +0 -7
  418. package/dist/foundation/process-containment/native-guardian-containment.js +0 -152
  419. package/dist/foundation/process-containment/windows-process-inspector.d.ts +0 -19
  420. package/dist/foundation/process-containment/windows-process-inspector.js +0 -56
  421. package/dist/native/darwin-arm64/process-guardian +0 -0
  422. package/dist/native/linux-x64/process-guardian +0 -0
  423. package/dist/native/win32-x64/process-guardian.exe +0 -0
@@ -1,5 +1,7 @@
1
1
  import { type OwnedUiCommand, type OwnedUiCommandResult, type OwnedUiDiagnostics } from "../../../contracts/owned-ui/index.js";
2
2
  import type { PiEmittedEvent } from "./event-delivery.js";
3
+ import type { PiEngineRuntime } from "./session-runtime.js";
4
+ import type { EngineViewState } from "./view-state.js";
3
5
  export type AdapterCommandResult = OwnedUiCommandResult;
4
6
  export interface PiCommandDispatchPorts {
5
7
  sessionId(): string;
@@ -36,3 +38,14 @@ export declare class PiCommandDispatch {
36
38
  reset(): void;
37
39
  execute(command: OwnedUiCommand): Promise<AdapterCommandResult>;
38
40
  }
41
+ /** What carrying out a command reaches: the running engine, the view state it updates, and disposal. */
42
+ export interface EngineCommandContext {
43
+ readonly engine: Pick<PiEngineRuntime, "runtime" | "session" | "generation" | "sessionCommands">;
44
+ readonly state: Pick<EngineViewState, "activeModel" | "thinkingLevel" | "setTerminal" | "terminal">;
45
+ /** False while delivery is overloaded or admission is stopped; a late model change then stays unpublished. */
46
+ admissionOpen(): boolean;
47
+ emit(value: PiEmittedEvent): void;
48
+ dispose(): Promise<void>;
49
+ }
50
+ /** Carries out one admitted command against the running engine; throws when no session runs or the command fails. */
51
+ export declare function performEngineCommand(command: OwnedUiCommand, context: EngineCommandContext): Promise<void>;
@@ -123,3 +123,60 @@ export class PiCommandDispatch {
123
123
  return { outcome, diagnostic };
124
124
  }
125
125
  }
126
+ // Invariant: prompt input and session controls run through the engine's own session commands, which own queuing and images.
127
+ async function runSessionCommand(request, context) {
128
+ const result = await context.engine.sessionCommands?.execute(request);
129
+ if (!result || result.outcome === "rejected" || result.outcome === "failed") {
130
+ throw new Error(request.type === "retry" ? "no previous prompt is available to retry" : `Pi session command failed: ${request.type}`);
131
+ }
132
+ }
133
+ function runPromptCommand(command, context) {
134
+ return runSessionCommand({
135
+ type: command.type,
136
+ text: command.text,
137
+ ...(command.images === undefined ? {} : { images: [...command.images] }),
138
+ }, context);
139
+ }
140
+ const ownedUiStateCommand = () => {
141
+ throw new Error("owned UI state commands belong to the owned UI layer, not the Pi engine adapter");
142
+ };
143
+ // Invariant: one handler per command type; the table is exhaustive, so a new command type cannot be silently ignored.
144
+ const ENGINE_COMMANDS = {
145
+ "prompt": (command, context) => runPromptCommand(command, context),
146
+ "steer": (command, context) => runPromptCommand(command, context),
147
+ "follow-up": (command, context) => runPromptCommand(command, context),
148
+ "abort": (_command, context) => runSessionCommand({ type: "abort" }, context),
149
+ "retry": (_command, context) => runSessionCommand({ type: "retry" }, context),
150
+ "compact": (_command, context) => runSessionCommand({ type: "compact" }, context),
151
+ "set-model": async (command, context, { runtime, session, generation }) => {
152
+ const model = runtime.services.modelRuntime.getModel(command.model.providerId, command.model.modelId);
153
+ if (!model)
154
+ throw new Error(`model is unavailable: ${command.model.providerId}/${command.model.modelId}`);
155
+ await session.setModel(model);
156
+ if (generation === context.engine.generation && context.admissionOpen())
157
+ context.state.activeModel = { ...command.model };
158
+ },
159
+ "set-thinking-level": (command, context, { session }) => {
160
+ session.setThinkingLevel(command.thinkingLevel);
161
+ context.state.thinkingLevel = command.thinkingLevel;
162
+ },
163
+ "new-session": async (_command, _context, { runtime }) => { await runtime.newSession(); },
164
+ "resume-session": async (command, _context, { runtime }) => { await runtime.switchSession(command.sessionPath); },
165
+ "resize-surface": (command, context) => {
166
+ context.state.setTerminal(command.surface);
167
+ context.emit({ type: "terminal-surface", surface: context.state.terminal });
168
+ },
169
+ "shutdown": (_command, context) => context.dispose(),
170
+ "set-setting": ownedUiStateCommand,
171
+ "apply-customization": ownedUiStateCommand,
172
+ "remove-customization": ownedUiStateCommand,
173
+ };
174
+ /** Carries out one admitted command against the running engine; throws when no session runs or the command fails. */
175
+ export async function performEngineCommand(command, context) {
176
+ const { runtime, session, generation } = context.engine;
177
+ if (!runtime || !session)
178
+ throw new Error("engine session is unavailable");
179
+ // Invariant: the table maps each type to the handler for exactly that command, so the command fits its own handler.
180
+ const handler = ENGINE_COMMANDS[command.type];
181
+ await handler(command, context, { runtime, session, generation });
182
+ }
@@ -86,7 +86,7 @@ class ProcessPiEngineHost {
86
86
  return;
87
87
  this.#disposed = true;
88
88
  this.#abort.abort();
89
- const live = [...this.#sessions.values()].filter(session => !session.disposed);
89
+ const live = [...this.#sessions.values()].filter(session => !session.identity.disposed);
90
90
  this.#sessions.clear();
91
91
  await Promise.all(live.map(session => session.dispose()));
92
92
  }
@@ -107,7 +107,7 @@ class ProcessPiEngineHost {
107
107
  }
108
108
  #forgetDisposedSessions() {
109
109
  for (const [sessionId, session] of this.#sessions)
110
- if (session.disposed)
110
+ if (session.identity.disposed)
111
111
  this.#sessions.delete(sessionId);
112
112
  }
113
113
  // Rationale: the profile's timeout is installed once, by whichever session loads it first; a written
@@ -0,0 +1,23 @@
1
+ import { resolvePiProjectTrustPreflight } from "./project-trust-preflight.js";
2
+ import { PiSettingsBridge, type PiSettingKey } from "./settings-bridge.js";
3
+ import { ModelRuntime, SettingsManager } from "../startup-public.js";
4
+ export interface OfflinePiSettingsPortOptions {
5
+ readonly cwd: string;
6
+ readonly agentDir: string;
7
+ readonly resolveTrust?: typeof resolvePiProjectTrustPreflight;
8
+ readonly createSettingsManager?: (cwd: string, agentDir: string, projectTrusted: boolean) => SettingsManager;
9
+ readonly createModelRuntime?: (options: Parameters<typeof ModelRuntime.create>[0]) => Promise<Pick<ModelRuntime, "getAvailableSnapshot">>;
10
+ }
11
+ export interface OfflinePiSettingsPort {
12
+ readonly port: PiSettingsBridge;
13
+ readonly manager: SettingsManager;
14
+ /** Resolves after the local auth/model catalog has populated the per-model choices. */
15
+ readonly modelsReady: Promise<void>;
16
+ }
17
+ /**
18
+ * Pi settings for the resident Settings utility tab. It reads the same persisted manager as an
19
+ * Agent, but every bound live effect is persistence-only because each Agent process owns its effect.
20
+ */
21
+ export declare function createOfflinePiSettingsPort(options: OfflinePiSettingsPortOptions): Promise<OfflinePiSettingsPort>;
22
+ /** Keys the slim Settings port intentionally binds and exposes in bare mode. */
23
+ export declare function offlinePiSettingKeys(): readonly PiSettingKey[];
@@ -0,0 +1,53 @@
1
+ import { join } from "node:path";
2
+ import { resolvePiProjectTrustPreflight } from "./project-trust-preflight.js";
3
+ import { PI_SETTING_EFFECTS, PiSettingsBridge, supportedThinkingLevels, } from "./settings-bridge.js";
4
+ import { ModelRuntime, SettingsManager } from "../startup-public.js";
5
+ const PERSIST_ONLY_OWNERS = ["shell", "startup", "agent", "terminal"];
6
+ /**
7
+ * Pi settings for the resident Settings utility tab. It reads the same persisted manager as an
8
+ * Agent, but every bound live effect is persistence-only because each Agent process owns its effect.
9
+ */
10
+ export async function createOfflinePiSettingsPort(options) {
11
+ let modelRuntime = null;
12
+ const createModelRuntime = options.createModelRuntime ?? (input => ModelRuntime.create(input));
13
+ const modelsReady = createModelRuntime({
14
+ authPath: join(options.agentDir, "auth.json"),
15
+ modelsPath: join(options.agentDir, "models.json"),
16
+ allowModelNetwork: false,
17
+ }).then(runtime => { modelRuntime = runtime; }, () => undefined);
18
+ const trust = await (options.resolveTrust ?? resolvePiProjectTrustPreflight)({
19
+ cwd: options.cwd,
20
+ agentDir: options.agentDir,
21
+ });
22
+ const manager = (options.createSettingsManager
23
+ ?? ((cwd, agentDir, projectTrusted) => SettingsManager.create(cwd, agentDir, { projectTrusted })))(options.cwd, options.agentDir, trust.trusted);
24
+ const port = new PiSettingsBridge(manager, {
25
+ productMode: "bare",
26
+ models: () => modelChoices(modelRuntime?.getAvailableSnapshot() ?? [], manager.getAllModelThinkingLevels?.() ?? {}),
27
+ });
28
+ for (const owner of PERSIST_ONLY_OWNERS)
29
+ port.bindOwner(owner, persistOnlyHandlers(owner));
30
+ return { port, manager, modelsReady };
31
+ }
32
+ function persistOnlyHandlers(owner) {
33
+ return Object.fromEntries(Object.entries(PI_SETTING_EFFECTS)
34
+ .filter(([, definition]) => definition.owner === owner && definition.hiddenInBare !== true)
35
+ .map(([key]) => [key, { apply() { } }]));
36
+ }
37
+ function modelChoices(models, overrides) {
38
+ return models.map(model => {
39
+ const key = `${model.provider}/${model.id}`;
40
+ return {
41
+ key,
42
+ label: `${model.id} [${model.provider}]`,
43
+ description: overrides[key] === undefined ? "global default" : `override: ${overrides[key]}`,
44
+ levels: supportedThinkingLevels(model),
45
+ };
46
+ });
47
+ }
48
+ /** Keys the slim Settings port intentionally binds and exposes in bare mode. */
49
+ export function offlinePiSettingKeys() {
50
+ return Object.entries(PI_SETTING_EFFECTS)
51
+ .filter(([, definition]) => PERSIST_ONLY_OWNERS.includes(definition.owner) && definition.hiddenInBare !== true)
52
+ .map(([key]) => key);
53
+ }
@@ -15,6 +15,7 @@
15
15
  "steeringMode",
16
16
  "followUpMode",
17
17
  "transport",
18
+ "sessionShareDestination",
18
19
  "httpIdleTimeoutMs",
19
20
  "cacheWarmingMode",
20
21
  "hideThinkingBlock",
@@ -51,6 +52,7 @@
51
52
  "steeringMode",
52
53
  "followUpMode",
53
54
  "transport",
55
+ "sessionShareDestination",
54
56
  "httpIdleTimeoutMs",
55
57
  "cacheWarmingMode",
56
58
  "hideThinkingBlock",
@@ -129,7 +131,7 @@
129
131
  },
130
132
  "showHardwareCursor": {
131
133
  "label": "Show hardware cursor",
132
- "description": "Show the terminal cursor while still positioning it for IME support",
134
+ "description": "Use the terminal cursor instead of Pi's drawn cursor",
133
135
  "opensDialog": false,
134
136
  "values": [
135
137
  "true",
@@ -297,6 +299,16 @@
297
299
  "never"
298
300
  ]
299
301
  },
302
+ "sessionShareDestination": {
303
+ "label": "Session share destination",
304
+ "description": "Where to upload sessions with /share (auto prefers Radius when authenticated, otherwise GitHub Gist)",
305
+ "opensDialog": false,
306
+ "values": [
307
+ "auto",
308
+ "gist",
309
+ "radius"
310
+ ]
311
+ },
300
312
  "doubleEscapeAction": {
301
313
  "label": "Double-escape action",
302
314
  "description": "Action when pressing Escape twice with empty editor",
@@ -388,7 +400,7 @@
388
400
  "label": "Anthropic extra usage",
389
401
  "description": "Warn when Anthropic subscription auth may use paid extra usage",
390
402
  "key": "anthropicExtraUsage",
391
- "fallback": true
403
+ "fallback": false
392
404
  }
393
405
  ]
394
406
  },
@@ -0,0 +1,56 @@
1
+ import type { AgentSession } from "../startup-public.js";
2
+ import type { OwnedUiExtensionPort, OwnedUiImageAttachment, OwnedUiReleaseUpdate, OwnedUiSessionCatalogPort, OwnedUiSessionIdentityPort, OwnedUiSessionPort, OwnedUiSessionSettingsPort, OwnedUiWorkflowPort } from "../../../contracts/owned-ui/index.js";
3
+ import type { PiPinnedSettingsCallback, PiPinnedSettingsSnapshot, PiSessionSelectorContext, PiTreeSelectorContext, PiWorkflowInteractionHost, PiWorkflowRequest, PiWorkflowResult } from "./workflows.js";
4
+ import type { PiExtensionUiBinding } from "./extension-ui-binding.js";
5
+ import type { PiResourceCatalog } from "./resource-catalog.js";
6
+ import type { PiEngineRuntime } from "./session-runtime.js";
7
+ import type { PiEngineSettings } from "./settings-port.js";
8
+ import type { PiWorkflowContexts } from "./workflow-contexts.js";
9
+ import type { PiWorkflowRunner } from "./workflow-runner.js";
10
+ /**
11
+ * The Pi objects pinned selectors and transcript renderers are built from. They are not part of the
12
+ * session backend contract; only the session presenters owner reads them.
13
+ */
14
+ export interface PiSessionPresentationSource {
15
+ pinnedModelSelectorContext(): ReturnType<PiWorkflowContexts["pinnedModelSelectorContext"]>;
16
+ pinnedSessionSelectorContext(): PiSessionSelectorContext;
17
+ pinnedTreeSelectorContext(): PiTreeSelectorContext;
18
+ pinnedMessageRenderer(customType: string): unknown;
19
+ pinnedToolRenderers(toolName: string): unknown;
20
+ pinnedShortcutDescriptions(bindings: Parameters<AgentSession["extensionRunner"]["getShortcuts"]>[0]): readonly {
21
+ readonly key: string;
22
+ readonly description: string;
23
+ }[];
24
+ pinnedSettingsModels(): Pick<PiPinnedSettingsSnapshot, "currentModel" | "availableDefaultModels">;
25
+ applyPinnedSettingValue(callback: PiPinnedSettingsCallback, value: unknown): Promise<PiWorkflowResult>;
26
+ }
27
+ export interface PiEngineAdapterPorts {
28
+ readonly identity: OwnedUiSessionIdentityPort;
29
+ readonly session: OwnedUiSessionPort;
30
+ readonly workflows: OwnedUiWorkflowPort;
31
+ readonly settings: OwnedUiSessionSettingsPort;
32
+ readonly catalog: OwnedUiSessionCatalogPort;
33
+ readonly extensions: OwnedUiExtensionPort;
34
+ readonly presentation: PiSessionPresentationSource;
35
+ }
36
+ /** The adapter's collaborators and its own session operations, which every port member reaches at call time. */
37
+ export interface EnginePortParts {
38
+ readonly sessionId: string;
39
+ readonly agentDir: string;
40
+ readonly engine: Pick<PiEngineRuntime, "cwd" | "generation" | "bindingGeneration" | "currentSessionResumeMetadata" | "currentSessionFile" | "session">;
41
+ readonly contexts: PiWorkflowContexts;
42
+ readonly workflows: PiWorkflowRunner;
43
+ readonly settings: PiEngineSettings;
44
+ readonly resources: PiResourceCatalog;
45
+ readonly extensions: PiExtensionUiBinding;
46
+ readonly session: OwnedUiSessionPort;
47
+ disposed(): boolean;
48
+ executeWorkflow(request: PiWorkflowRequest): Promise<PiWorkflowResult>;
49
+ clearQueuedWorkflows(): readonly string[];
50
+ setWorkflowInteractionHost(interaction: PiWorkflowInteractionHost): void;
51
+ announceReleaseUpdate(release: OwnedUiReleaseUpdate): void;
52
+ resolveTranscriptImage(assetId: string): OwnedUiImageAttachment | null;
53
+ /** The running session's extension runner; throws when no session runs. */
54
+ extensionRunner(): AgentSession["extensionRunner"] | undefined;
55
+ }
56
+ export declare function createEnginePorts(parts: EnginePortParts): PiEngineAdapterPorts;
@@ -0,0 +1,93 @@
1
+ // Invariant: every port member delegates at call time, so ports built once follow session replacement.
2
+ export function createEnginePorts(parts) {
3
+ const { engine, contexts, workflows, settings, resources, extensions } = parts;
4
+ return {
5
+ identity: {
6
+ sessionId: parts.sessionId,
7
+ agentDir: parts.agentDir,
8
+ get cwd() { return engine.cwd; },
9
+ get sessionGeneration() { return engine.generation; },
10
+ get sessionBindingGeneration() { return engine.bindingGeneration; },
11
+ get disposed() { return parts.disposed(); },
12
+ currentSessionResumeMetadata: () => engine.currentSessionResumeMetadata(),
13
+ currentSessionFile: () => engine.currentSessionFile(),
14
+ currentHistorySessionId: () => {
15
+ const id = engine.session?.sessionManager?.getSessionId?.();
16
+ return typeof id === "string" && id.length > 0 && id.length <= 256 && !id.includes("\0") ? id : null;
17
+ },
18
+ },
19
+ session: parts.session,
20
+ workflows: {
21
+ executeWorkflow: request => parts.executeWorkflow(request),
22
+ executeBashWorkflow: (command, excludeFromContext) => workflows.executeBashWorkflow(command, excludeFromContext),
23
+ cycleModelWorkflow: direction => workflows.cycleModelWorkflow(direction),
24
+ workflowAutocompleteCommands: () => resources.workflowAutocompleteCommands(),
25
+ clearQueuedWorkflows: () => parts.clearQueuedWorkflows(),
26
+ reloadBlockedResult: () => workflows.reloadBlockedResult(),
27
+ copyWorkflowText: text => workflows.copyWorkflowText(text),
28
+ setWorkflowInteractionHost: interaction => { parts.setWorkflowInteractionHost(interaction); },
29
+ },
30
+ settings: {
31
+ get productMode() { return settings.productMode; },
32
+ snapshot: () => {
33
+ // Invariant: the selector-only model values travel on the presentation source, not in the neutral snapshot.
34
+ const { currentModel: _currentModel, availableDefaultModels: _availableDefaultModels, ...snapshot } = settings.pinnedSettingsSnapshot();
35
+ return snapshot;
36
+ },
37
+ bindOwner: (owner, handlers) => settings.bindSettingsOwner(owner, handlers),
38
+ setDefaultThinkingLevel: level => { settings.setDefaultThinkingLevel(level); },
39
+ configuredTheme: () => settings.configuredTheme(),
40
+ },
41
+ catalog: {
42
+ modelsContext: () => contexts.modelsContext(),
43
+ setSessionModelScope: scopeIds => { contexts.setSessionModelScope(scopeIds); },
44
+ persistModelScope: scopeIds => { contexts.persistModelScope(scopeIds); },
45
+ refreshModels: signal => contexts.refreshModels(signal),
46
+ pinnedScopedModelsContext: () => contexts.pinnedScopedModelsContext(),
47
+ updateScopedModels: enabledModelIds => { contexts.updateScopedModels(enabledModelIds); },
48
+ persistScopedModels: enabledModelIds => { contexts.persistScopedModels(enabledModelIds); },
49
+ refreshScopedModels: signal => contexts.refreshScopedModels(signal),
50
+ pinnedProjectTrustContext: () => contexts.pinnedProjectTrustContext(),
51
+ persistProjectTrust: updates => { contexts.persistProjectTrust(updates); },
52
+ pinnedLoginOptions: authType => contexts.loginOptions(authType),
53
+ pinnedLoginMethodOptions: providerReference => contexts.pinnedLoginMethodOptions(providerReference),
54
+ pinnedAmbientAuthentication: selection => contexts.pinnedAmbientAuthentication(selection),
55
+ pinnedLogoutOptions: () => contexts.logoutOptions(),
56
+ pinnedForkOptions: () => contexts.pinnedForkOptions(),
57
+ },
58
+ extensions: {
59
+ nonVisualResources: () => resources.nonVisualResources(),
60
+ extensionResources: () => resources.extensionResources(),
61
+ resolveTranscriptImage: assetId => parts.resolveTranscriptImage(assetId),
62
+ visualExtensionSupport: () => extensions.support(),
63
+ bindExtensionUi: (ui, shutdown) => extensions.bind(ui, shutdown),
64
+ unbindExtensionUi: () => extensions.unbind(),
65
+ bindClipboardWriter: writer => workflows.bindClipboardWriter(writer),
66
+ announceReleaseUpdate: release => { parts.announceReleaseUpdate(release); },
67
+ },
68
+ presentation: {
69
+ pinnedModelSelectorContext: () => contexts.pinnedModelSelectorContext(),
70
+ pinnedSessionSelectorContext: () => contexts.pinnedSessionSelectorContext(),
71
+ pinnedTreeSelectorContext: () => contexts.pinnedTreeSelectorContext(),
72
+ pinnedMessageRenderer: customType => parts.extensionRunner()?.getMessageRenderer?.(customType),
73
+ pinnedToolRenderers: toolName => {
74
+ const runner = parts.extensionRunner();
75
+ if (runner === undefined)
76
+ return undefined;
77
+ if (typeof runner.resolveToolRenderers === "function") {
78
+ return runner.resolveToolRenderers(toolName, () => runner.getToolDefinition?.(toolName));
79
+ }
80
+ return runner.getToolDefinition?.(toolName);
81
+ },
82
+ pinnedShortcutDescriptions: bindings => {
83
+ const shortcuts = parts.extensionRunner()?.getShortcuts?.(bindings);
84
+ return shortcuts === undefined ? [] : [...shortcuts].map(([key, shortcut]) => ({ key, description: shortcut.description ?? shortcut.extensionPath }));
85
+ },
86
+ pinnedSettingsModels: () => {
87
+ const { currentModel, availableDefaultModels } = settings.pinnedSettingsSnapshot();
88
+ return { ...(currentModel === undefined ? {} : { currentModel }), availableDefaultModels };
89
+ },
90
+ applyPinnedSettingValue: (callback, value) => settings.applyPinnedSettingValue(callback, value),
91
+ },
92
+ };
93
+ }
@@ -26,5 +26,6 @@ export declare class PiPromptSuggestions implements OwnedUiPromptSuggestionGener
26
26
  #private;
27
27
  constructor(ports: PiPromptSuggestionPorts);
28
28
  reasoningPolicy(): OwnedUiPromptSuggestionReasoning;
29
+ completeInstruction(instruction: string, maxTokens: number, signal: AbortSignal): Promise<string | null>;
29
30
  generate(request: OwnedUiPromptSuggestionRequest): Promise<OwnedUiPromptSuggestionResult>;
30
31
  }
@@ -20,6 +20,46 @@ export class PiPromptSuggestions {
20
20
  // Performance: the run's own level keeps the provider's thinking parameters, and the cached prefix, identical.
21
21
  return readSuggestionReasoning(session.thinkingLevel);
22
22
  }
23
+ async completeInstruction(instruction, maxTokens, signal) {
24
+ const session = this.#ports.session();
25
+ const runtime = this.#ports.runtime();
26
+ if (this.#ports.unavailable() || session === undefined || runtime === undefined || signal.aborted
27
+ || session.model === undefined || typeof runtime.services.modelRuntime.completeSimple !== "function")
28
+ return null;
29
+ const agent = session.agent;
30
+ try {
31
+ const transformed = typeof agent.transformContext === "function"
32
+ ? await agent.transformContext(agent.state.messages, signal)
33
+ : agent.state.messages;
34
+ const messages = typeof agent.convertToLlm === "function"
35
+ ? await agent.convertToLlm(transformed)
36
+ : transformed.filter(message => message.role === "user" || message.role === "assistant" || message.role === "toolResult");
37
+ const response = await runtime.services.modelRuntime.completeSimple(session.model, {
38
+ systemPrompt: agent.state.systemPrompt,
39
+ messages: [...messages, { role: "user", content: instruction, timestamp: Date.now() }],
40
+ tools: [],
41
+ }, {
42
+ signal,
43
+ maxTokens,
44
+ ...(agent.sessionId === undefined ? {} : { sessionId: agent.sessionId }),
45
+ ...(agent.transport === undefined ? {} : { transport: agent.transport }),
46
+ ...(agent.onPayload === undefined ? {} : { onPayload: agent.onPayload }),
47
+ });
48
+ if (signal.aborted || !isRecord(response) || response.stopReason === "aborted"
49
+ || response.stopReason === "error" || response.stopReason === "length"
50
+ || stringValue(response.errorMessage) !== undefined)
51
+ return null;
52
+ const content = Array.isArray(response.content) ? response.content : [];
53
+ if (content.some(block => isRecord(block) && block.type === "toolCall"))
54
+ return null;
55
+ const text = content.filter(block => isRecord(block) && block.type === "text")
56
+ .map(block => stringValue(block.text) ?? "").join("\n").trim();
57
+ return text || null;
58
+ }
59
+ catch {
60
+ return null;
61
+ }
62
+ }
23
63
  async generate(request) {
24
64
  assertOwnedUiPromptSuggestionRequest(request);
25
65
  const identity = request.identity;