@timurproko/a1 0.1.8-dev.472 → 0.1.8-dev.508

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 (370) hide show
  1. package/bin/cli.js +4 -5
  2. package/bin/guardian.js +5 -1
  3. package/bin/module-identity.js +53 -98
  4. package/bin/module-resolver.js +138 -0
  5. package/bin/pinned-pi-public.js +25 -6
  6. package/bin/ui.js +7 -2
  7. package/bin/update-recovery.js +76 -7
  8. package/bin/warmup.js +3 -0
  9. package/dist/{integrations/pi/session-ui → app/session-shell}/clipboard-diagnostics.d.ts +1 -1
  10. package/dist/{integrations/pi/session-ui → app/session-shell}/clipboard-image.js +1 -1
  11. package/dist/app/session-shell/helper-pool.d.ts +33 -0
  12. package/dist/app/session-shell/helper-pool.js +98 -0
  13. package/dist/{integrations/pi/session-ui → app/session-shell}/image-preparation-client.d.ts +1 -1
  14. package/dist/{integrations/pi/session-ui → app/session-shell}/image-preparation-client.js +1 -1
  15. package/dist/{integrations/pi/session-ui → app/session-shell}/image-preparation.js +1 -1
  16. package/dist/{integrations/pi/session-ui → app/session-shell}/image-source.js +1 -1
  17. package/dist/{integrations/pi/session-ui → app/session-shell}/image-worker.js +1 -1
  18. package/dist/app/session-shell/index.d.ts +7 -0
  19. package/dist/app/session-shell/index.js +4 -0
  20. package/dist/app/session-shell/paste-executor.d.ts +18 -0
  21. package/dist/{integrations/pi/session-ui → app/session-shell}/paste-executor.js +50 -29
  22. package/dist/{integrations/pi/session-ui → app/session-shell}/paste-helper.js +1 -1
  23. package/dist/app/session-shell/paste-preparation-client.d.ts +31 -0
  24. package/dist/{integrations/pi/session-ui → app/session-shell}/paste-preparation-client.js +19 -8
  25. package/dist/{integrations/pi/session-ui → app/session-shell}/paste-protocol.d.ts +1 -1
  26. package/dist/{integrations/pi/session-ui → app/session-shell}/paste-protocol.js +1 -1
  27. package/dist/app/session-shell/paste-text-preparation.d.ts +6 -0
  28. package/dist/{integrations/pi/session-ui/paste-text-preparation.d.ts → app/session-shell/paste-types.d.ts} +1 -4
  29. package/dist/{integrations/pi/session-ui → app/session-shell}/path-chip-presentation.d.ts +1 -1
  30. package/dist/{integrations/pi/session-ui → app/session-shell}/prompt-chips.d.ts +5 -1
  31. package/dist/{integrations/pi/session-ui → app/session-shell}/prompt-chips.js +6 -2
  32. package/dist/{integrations/pi/session-ui → app/session-shell}/prompt-history-controller.d.ts +2 -2
  33. package/dist/{integrations/pi/session-ui → app/session-shell}/prompt-history-controller.js +2 -2
  34. package/dist/{integrations/pi/session-ui → app/session-shell}/prompt-suggestion-controller.d.ts +1 -1
  35. package/dist/{integrations/pi/session-ui → app/session-shell}/prompt-suggestion-controller.js +2 -2
  36. package/dist/{integrations/pi/session-ui → app/session-shell}/quit-outro.js +1 -1
  37. package/dist/{integrations/pi/session-ui → app/session-shell}/response-copy-coordinator.d.ts +1 -1
  38. package/dist/{integrations/pi/session-ui → app/session-shell}/response-copy-coordinator.js +3 -5
  39. package/dist/{integrations/pi/session-ui → app/session-shell}/response-copy-helper.js +1 -1
  40. package/dist/{integrations/pi/session-ui → app/session-shell}/response-copy-protocol.d.ts +1 -1
  41. package/dist/{integrations/pi/session-ui → app/session-shell}/response-copy-transport.d.ts +10 -2
  42. package/dist/{integrations/pi/session-ui → app/session-shell}/response-copy-transport.js +45 -19
  43. package/dist/{integrations/pi/session-ui → app/session-shell}/session-shell-root.d.ts +75 -53
  44. package/dist/{integrations/pi/session-ui → app/session-shell}/session-shell-root.js +30 -20
  45. package/dist/{integrations/pi/session-ui → app/session-shell}/session-shell.d.ts +9 -8
  46. package/dist/{integrations/pi/session-ui → app/session-shell}/session-shell.js +108 -67
  47. package/dist/{integrations/pi/session-ui → app/session-shell}/session-viewport-controller.d.ts +5 -5
  48. package/dist/{integrations/pi/session-ui → app/session-shell}/session-viewport-controller.js +5 -5
  49. package/dist/{integrations/pi/session-ui → app/session-shell}/system-clipboard.d.ts +1 -1
  50. package/dist/{integrations/pi/session-ui → app/session-shell}/system-clipboard.js +1 -1
  51. package/dist/cli/index.d.ts +8 -5
  52. package/dist/cli/index.js +4 -5
  53. package/dist/composition/index.d.ts +0 -1
  54. package/dist/composition/index.js +0 -1
  55. package/dist/composition/owned-ui.d.ts +2 -2
  56. package/dist/composition/owned-ui.js +35 -36
  57. package/dist/composition/settings-route-host.d.ts +2 -2
  58. package/dist/contracts/agent-engine/domain.d.ts +6 -1
  59. package/dist/contracts/agent-engine/index.d.ts +11 -8
  60. package/dist/contracts/agent-engine/index.js +6 -8
  61. package/dist/contracts/owned-ui/extension-ui.d.ts +8 -0
  62. package/dist/contracts/owned-ui/index.d.ts +12 -8
  63. package/dist/contracts/owned-ui/index.js +8 -8
  64. package/dist/features/launch/index.d.ts +12 -6
  65. package/dist/features/launch/index.js +6 -6
  66. package/dist/features/launch/intent.d.ts +5 -5
  67. package/dist/features/launch/intent.js +2 -2
  68. package/dist/features/owned-ui/index.d.ts +6 -6
  69. package/dist/features/owned-ui/index.js +4 -6
  70. package/dist/features/owned-ui/run.d.ts +2 -2
  71. package/dist/features/owned-ui/settings-app.d.ts +2 -2
  72. package/dist/features/owned-ui/settings-app.js +18 -5
  73. package/dist/features/prompt-history/service.d.ts +1 -1
  74. package/dist/features/prompt-history/service.js +1 -1
  75. package/dist/features/prompt-history/store.js +3 -7
  76. package/dist/features/prompt-suggestions/diagnostics.js +1 -1
  77. package/dist/features/prompt-suggestions/index.d.ts +2 -1
  78. package/dist/features/prompt-suggestions/index.js +1 -1
  79. package/dist/foundation/launch-guardian/index.d.ts +2 -1
  80. package/dist/foundation/launch-guardian/index.js +1 -1
  81. package/dist/foundation/lifecycle/index.d.ts +11 -6
  82. package/dist/foundation/lifecycle/index.js +5 -6
  83. package/dist/foundation/process-containment/index.d.ts +8 -6
  84. package/dist/foundation/process-containment/index.js +6 -6
  85. package/dist/foundation/process-containment/native-guardian-containment.js +3 -3
  86. package/dist/foundation/protocol/index.d.ts +3 -2
  87. package/dist/foundation/protocol/index.js +2 -2
  88. package/dist/foundation/release/bootstrap.d.ts +0 -4
  89. package/dist/foundation/release/bootstrap.js +1 -82
  90. package/dist/foundation/release/dependency-layer.d.ts +2 -5
  91. package/dist/foundation/release/endpoints.d.ts +4 -0
  92. package/dist/foundation/release/endpoints.js +86 -2
  93. package/dist/foundation/release/index.d.ts +30 -16
  94. package/dist/foundation/release/index.js +16 -16
  95. package/dist/foundation/release/release.d.ts +1 -1
  96. package/dist/foundation/release/types.d.ts +11 -0
  97. package/dist/foundation/release/types.js +1 -0
  98. package/dist/foundation/release/update-transaction.d.ts +1 -1
  99. package/dist/foundation/release/update.d.ts +2 -1
  100. package/dist/foundation/release/update.js +3 -18
  101. package/dist/foundation/startup/index.d.ts +4 -2
  102. package/dist/foundation/startup/index.js +2 -2
  103. package/dist/foundation/startup/startup-descriptor.js +2 -2
  104. package/dist/foundation/storage/control-store.d.ts +1 -45
  105. package/dist/foundation/storage/control-store.js +54 -277
  106. package/dist/foundation/storage/index.d.ts +1 -1
  107. package/dist/foundation/storage/index.js +1 -1
  108. package/dist/foundation/supervision/index.d.ts +2 -2
  109. package/dist/foundation/supervision/index.js +2 -2
  110. package/dist/foundation/supervision/server.d.ts +5 -10
  111. package/dist/foundation/supervision/server.js +7 -7
  112. package/dist/foundation/terminal-cleanup/index.d.ts +3 -2
  113. package/dist/foundation/terminal-cleanup/index.js +2 -2
  114. package/dist/integrations/pi/components/editor-interaction.d.ts +1 -1
  115. package/dist/integrations/pi/components/history-editor-loader.d.ts +1 -1
  116. package/dist/integrations/pi/components/index.d.ts +20 -13
  117. package/dist/integrations/pi/components/index.js +12 -13
  118. package/dist/integrations/pi/components/owned-editor-ux.js +5 -8
  119. package/dist/integrations/pi/components/resources/builtin-themes.d.ts +7 -5
  120. package/dist/integrations/pi/components/resources/builtin-themes.js +7 -5
  121. package/dist/integrations/pi/components/shell-editor-autocomplete.js +1 -1
  122. package/dist/integrations/pi/components/shell-extension-ui.js +2 -1
  123. package/dist/integrations/pi/components/shell-footer-status.js +1 -1
  124. package/dist/integrations/pi/components/shell-presenters-info.d.ts +1 -1
  125. package/dist/integrations/pi/components/shell-presenters-info.js +1 -1
  126. package/dist/integrations/pi/components/shell-presenters-transcript.js +1 -1
  127. package/dist/integrations/pi/components/shell-selectors-dialogs.d.ts +9 -3
  128. package/dist/integrations/pi/components/shell-selectors-dialogs.js +9 -6
  129. package/dist/integrations/pi/components/shell-shared-facade.d.ts +3 -1
  130. package/dist/integrations/pi/components/shell-shared-facade.js +4 -2
  131. package/dist/integrations/pi/components/submitted-prompt-adapter.d.ts +1 -1
  132. package/dist/integrations/pi/components/submitted-prompt-adapter.js +1 -1
  133. package/dist/integrations/pi/components/tool-image-presentation.d.ts +1 -1
  134. package/dist/integrations/pi/components/tool-image-presentation.js +4 -7
  135. package/dist/integrations/pi/components/upstream/adjacent/core/keybindings.d.ts +36 -22
  136. package/dist/integrations/pi/components/upstream/adjacent/core/keybindings.js +43 -7
  137. package/dist/integrations/pi/components/upstream/assets/earendil-image.json +2 -2
  138. package/dist/integrations/pi/components/upstream/components/countdown-timer.d.ts +6 -3
  139. package/dist/integrations/pi/components/upstream/components/daxnuts.d.ts +8 -1
  140. package/dist/integrations/pi/components/upstream/components/daxnuts.js +7 -3
  141. package/dist/integrations/pi/components/upstream/components/earendil-announcement.d.ts +1 -1
  142. package/dist/integrations/pi/components/upstream/components/earendil-announcement.js +10 -4
  143. package/dist/integrations/pi/components/upstream/components/extension-editor.d.ts +7 -4
  144. package/dist/integrations/pi/components/upstream/components/extension-editor.js +7 -4
  145. package/dist/integrations/pi/components/upstream/components/mermaid.js +8 -4
  146. package/dist/integrations/pi/components/upstream/components/owned-editor.d.ts +9 -5
  147. package/dist/integrations/pi/components/upstream/components/owned-editor.js +10 -6
  148. package/dist/integrations/pi/components/upstream/components/scoped-models-selector.d.ts +8 -4
  149. package/dist/integrations/pi/components/upstream/components/scoped-models-selector.js +27 -25
  150. package/dist/integrations/pi/components/upstream/components/session-footer.d.ts +1 -1
  151. package/dist/integrations/pi/components/upstream/components/session-footer.js +8 -10
  152. package/dist/integrations/pi/components/upstream/components/session-selector-search.js +6 -4
  153. package/dist/integrations/pi/components/upstream/components/session-selector.d.ts +1 -1
  154. package/dist/integrations/pi/components/upstream/components/session-selector.js +8 -4
  155. package/dist/integrations/pi/components/upstream/components/skill-invocation-message.d.ts +7 -5
  156. package/dist/integrations/pi/components/upstream/components/skill-invocation-message.js +8 -6
  157. package/dist/integrations/pi/components/upstream/components/status-indicator.d.ts +9 -4
  158. package/dist/integrations/pi/components/upstream/components/status-indicator.js +15 -5
  159. package/dist/integrations/pi/components/upstream/components/tool-execution.d.ts +8 -2
  160. package/dist/integrations/pi/components/upstream/components/tool-execution.js +58 -37
  161. package/dist/integrations/pi/components/upstream/components/tree-selector.d.ts +7 -4
  162. package/dist/integrations/pi/components/upstream/components/tree-selector.js +7 -4
  163. package/dist/integrations/pi/components/upstream/components/trust-selector.d.ts +1 -1
  164. package/dist/integrations/pi/components/upstream/components/trust-selector.js +10 -5
  165. package/dist/integrations/pi/components/upstream/external-editor.js +8 -4
  166. package/dist/integrations/pi/components/upstream/history/editor-core.d.ts +13 -4
  167. package/dist/integrations/pi/components/upstream/history/editor-core.js +112 -30
  168. package/dist/integrations/pi/components/upstream/history/kill-ring.d.ts +6 -3
  169. package/dist/integrations/pi/components/upstream/history/kill-ring.js +6 -3
  170. package/dist/integrations/pi/components/upstream/history/printable-key.js +7 -4
  171. package/dist/integrations/pi/components/upstream/history/text-helpers.js +6 -3
  172. package/dist/integrations/pi/components/upstream/history/undo-stack.d.ts +6 -3
  173. package/dist/integrations/pi/components/upstream/history/undo-stack.js +6 -3
  174. package/dist/integrations/pi/components/upstream/history/word-navigation.js +6 -3
  175. package/dist/integrations/pi/components/upstream/model-search.d.ts +5 -2
  176. package/dist/integrations/pi/components/upstream/theme/theme-controller.d.ts +8 -0
  177. package/dist/integrations/pi/components/upstream/theme/theme-controller.js +0 -3
  178. package/dist/integrations/pi/components/upstream/theme/theme.d.ts +2 -2
  179. package/dist/integrations/pi/components/upstream/theme/theme.js +17 -6
  180. package/dist/integrations/pi/engine/adapter.d.ts +39 -138
  181. package/dist/integrations/pi/engine/adapter.js +338 -3226
  182. package/dist/integrations/pi/engine/command-dispatch.d.ts +41 -0
  183. package/dist/integrations/pi/engine/command-dispatch.js +125 -0
  184. package/dist/integrations/pi/engine/event-delivery.d.ts +100 -0
  185. package/dist/integrations/pi/engine/event-delivery.js +184 -0
  186. package/dist/integrations/pi/engine/extension-ui-binding.d.ts +35 -0
  187. package/dist/integrations/pi/engine/extension-ui-binding.js +81 -0
  188. package/dist/integrations/pi/engine/index.d.ts +18 -14
  189. package/dist/integrations/pi/engine/index.js +10 -14
  190. package/dist/integrations/pi/engine/message-values.d.ts +29 -0
  191. package/dist/integrations/pi/engine/message-values.js +168 -0
  192. package/dist/integrations/pi/engine/pending-delivery.d.ts +2 -2
  193. package/dist/integrations/pi/engine/pending-delivery.js +2 -4
  194. package/dist/integrations/pi/engine/pi-settings-metadata.json +382 -371
  195. package/dist/integrations/pi/engine/prompt-suggestions.d.ts +30 -0
  196. package/dist/integrations/pi/engine/prompt-suggestions.js +102 -0
  197. package/dist/integrations/pi/engine/provider-authentication.d.ts +34 -0
  198. package/dist/integrations/pi/engine/provider-authentication.js +209 -0
  199. package/dist/integrations/pi/engine/resource-catalog.d.ts +49 -0
  200. package/dist/integrations/pi/engine/resource-catalog.js +289 -0
  201. package/dist/integrations/pi/engine/resources/changelog.json +4 -4
  202. package/dist/integrations/pi/engine/session-events.d.ts +48 -0
  203. package/dist/integrations/pi/engine/session-events.js +223 -0
  204. package/dist/integrations/pi/engine/session-integration.js +2 -4
  205. package/dist/integrations/pi/engine/session-runtime.d.ts +84 -0
  206. package/dist/integrations/pi/engine/session-runtime.js +249 -0
  207. package/dist/integrations/pi/engine/{settings-effects.d.ts → settings-bridge.d.ts} +57 -2
  208. package/dist/integrations/pi/engine/settings-bridge.js +514 -0
  209. package/dist/integrations/pi/engine/settings-metadata.d.ts +31 -0
  210. package/dist/integrations/pi/engine/settings-metadata.js +67 -0
  211. package/dist/integrations/pi/engine/settings-port.d.ts +42 -0
  212. package/dist/integrations/pi/engine/settings-port.js +353 -0
  213. package/dist/integrations/pi/engine/transcript-projection.d.ts +39 -0
  214. package/dist/integrations/pi/engine/transcript-projection.js +405 -0
  215. package/dist/integrations/pi/engine/usage-view.d.ts +4 -0
  216. package/dist/integrations/pi/engine/usage-view.js +56 -0
  217. package/dist/integrations/pi/engine/workflow-contexts.d.ts +59 -0
  218. package/dist/integrations/pi/engine/workflow-contexts.js +316 -0
  219. package/dist/integrations/pi/engine/workflow-runner.d.ts +60 -0
  220. package/dist/integrations/pi/engine/workflow-runner.js +509 -0
  221. package/dist/integrations/pi/engine/workflow-support.d.ts +33 -0
  222. package/dist/integrations/pi/engine/workflow-support.js +352 -0
  223. package/dist/integrations/pi/engine/workflows.d.ts +63 -2
  224. package/dist/integrations/pi/engine/workflows.js +5 -2
  225. package/dist/integrations/pi/startup-public.js +576 -554
  226. package/dist/integrations/pi/startup-public.manifest.json +1730 -984
  227. package/dist/integrations/pi/tui-runtime/adapter.js +10 -13
  228. package/dist/integrations/pi/tui-runtime/contracts.d.ts +11 -1
  229. package/dist/integrations/pi/tui-runtime/damage-aware-terminal.d.ts +1 -1
  230. package/dist/integrations/pi/tui-runtime/damage-aware-terminal.js +4 -7
  231. package/dist/integrations/pi/tui-runtime/index.d.ts +8 -6
  232. package/dist/integrations/pi/tui-runtime/index.js +4 -6
  233. package/dist/integrations/pi/tui-runtime/mouse-report-input.js +2 -4
  234. package/dist/integrations/pi/tui-runtime/overlay-geometry.d.ts +2 -2
  235. package/dist/integrations/pi/tui-runtime/overlay-geometry.js +4 -5
  236. package/dist/integrations/pi/tui-runtime/presentation-adapter.js +1 -1
  237. package/dist/native/darwin-arm64/manifest.json +1 -1
  238. package/dist/native/linux-x64/manifest.json +1 -1
  239. package/dist/native/win32-x64/manifest.json +2 -2
  240. package/dist/native/win32-x64/process-guardian.exe +0 -0
  241. package/dist/runtime-payload-inventory.json +51320 -46509
  242. package/dist/ui/apps/index.d.ts +5 -3
  243. package/dist/ui/apps/index.js +3 -3
  244. package/dist/ui/components/index.d.ts +47 -25
  245. package/dist/ui/components/index.js +25 -25
  246. package/dist/ui/components/prompt-input.js +1 -4
  247. package/dist/ui/settings/declarations.d.ts +119 -0
  248. package/dist/ui/settings/declarations.js +20 -11
  249. package/dist/ui/settings/index.d.ts +10 -6
  250. package/dist/ui/settings/index.js +5 -6
  251. package/dist/ui/settings/manager.d.ts +54 -0
  252. package/dist/ui/settings/{session.js → manager.js} +101 -9
  253. package/dist/ui/settings/sections.d.ts +2 -7
  254. package/docs/architecture/boundaries.md +4 -4
  255. package/docs/architecture/history-editor-provenance.md +1 -1
  256. package/docs/architecture/project-structure.md +6 -6
  257. package/docs/architecture/prompt-suggestions.md +1 -1
  258. package/docs/architecture/terminal-host-proof-gate.md +1 -1
  259. package/docs/architecture/terminal-host-spike-evidence.md +1 -1
  260. package/docs/architecture/toolchain.md +8 -0
  261. package/docs/architecture/ui-reference-provenance.md +4 -4
  262. package/docs/ci-release-runbook.md +7 -1
  263. package/docs/features/modal-content-interaction.md +2 -2
  264. package/docs/local-worktree-cleanup.md +4 -2
  265. package/docs/validation.md +6 -4
  266. package/package.json +7 -11
  267. package/bin/pi-tui.d.ts +0 -6
  268. package/bin/pi-tui.js +0 -28
  269. package/bin/sync-pi-tui-proxy.js +0 -97
  270. package/dist/cli/version.d.ts +0 -2
  271. package/dist/cli/version.js +0 -23
  272. package/dist/composition/agent-engine-bridge.d.ts +0 -3
  273. package/dist/composition/agent-engine-bridge.js +0 -108
  274. package/dist/composition/process.d.ts +0 -16
  275. package/dist/composition/process.js +0 -45
  276. package/dist/contracts/workspace/index.d.ts +0 -2
  277. package/dist/contracts/workspace/index.js +0 -2
  278. package/dist/contracts/workspace/model.d.ts +0 -248
  279. package/dist/contracts/workspace/model.js +0 -2
  280. package/dist/contracts/workspace/validation.d.ts +0 -13
  281. package/dist/contracts/workspace/validation.js +0 -335
  282. package/dist/features/owned-ui/customization.d.ts +0 -40
  283. package/dist/features/owned-ui/customization.js +0 -110
  284. package/dist/features/owned-ui/diagnostics.d.ts +0 -34
  285. package/dist/features/owned-ui/diagnostics.js +0 -95
  286. package/dist/features/workspace/capabilities.d.ts +0 -31
  287. package/dist/features/workspace/capabilities.js +0 -75
  288. package/dist/features/workspace/index.d.ts +0 -6
  289. package/dist/features/workspace/index.js +0 -6
  290. package/dist/features/workspace/presentation.d.ts +0 -30
  291. package/dist/features/workspace/presentation.js +0 -70
  292. package/dist/features/workspace/reconciliation.d.ts +0 -15
  293. package/dist/features/workspace/reconciliation.js +0 -82
  294. package/dist/features/workspace/reducer.d.ts +0 -43
  295. package/dist/features/workspace/reducer.js +0 -214
  296. package/dist/features/workspace/router.d.ts +0 -32
  297. package/dist/features/workspace/router.js +0 -125
  298. package/dist/features/workspace/store.d.ts +0 -18
  299. package/dist/features/workspace/store.js +0 -55
  300. package/dist/foundation/native-host-protocol/codec.d.ts +0 -13
  301. package/dist/foundation/native-host-protocol/codec.js +0 -58
  302. package/dist/foundation/native-host-protocol/evidence.d.ts +0 -67
  303. package/dist/foundation/native-host-protocol/evidence.js +0 -141
  304. package/dist/foundation/native-host-protocol/index.d.ts +0 -4
  305. package/dist/foundation/native-host-protocol/index.js +0 -4
  306. package/dist/foundation/native-host-protocol/messages.d.ts +0 -56
  307. package/dist/foundation/native-host-protocol/messages.js +0 -149
  308. package/dist/foundation/native-host-protocol/proof-gate.d.ts +0 -13
  309. package/dist/foundation/native-host-protocol/proof-gate.js +0 -33
  310. package/dist/foundation/structured-agent-runtime/backpressure.d.ts +0 -47
  311. package/dist/foundation/structured-agent-runtime/backpressure.js +0 -119
  312. package/dist/foundation/structured-agent-runtime/commands.d.ts +0 -53
  313. package/dist/foundation/structured-agent-runtime/commands.js +0 -165
  314. package/dist/foundation/structured-agent-runtime/handshake.d.ts +0 -41
  315. package/dist/foundation/structured-agent-runtime/handshake.js +0 -151
  316. package/dist/foundation/structured-agent-runtime/index.d.ts +0 -5
  317. package/dist/foundation/structured-agent-runtime/index.js +0 -5
  318. package/dist/foundation/structured-agent-runtime/reconnection.d.ts +0 -38
  319. package/dist/foundation/structured-agent-runtime/reconnection.js +0 -130
  320. package/dist/foundation/structured-agent-runtime/state.d.ts +0 -57
  321. package/dist/foundation/structured-agent-runtime/state.js +0 -119
  322. package/dist/integrations/pi/components/upstream/components/custom-entry.d.ts +0 -17
  323. package/dist/integrations/pi/components/upstream/components/custom-entry.js +0 -51
  324. package/dist/integrations/pi/components/upstream/components/first-time-setup.d.ts +0 -24
  325. package/dist/integrations/pi/components/upstream/components/first-time-setup.js +0 -105
  326. package/dist/integrations/pi/components/upstream/components/markdown-transform.d.ts +0 -2
  327. package/dist/integrations/pi/components/upstream/components/markdown-transform.js +0 -18
  328. package/dist/integrations/pi/engine/model-auth-integration.d.ts +0 -31
  329. package/dist/integrations/pi/engine/model-auth-integration.js +0 -62
  330. package/dist/integrations/pi/engine/resource-extension-integration.d.ts +0 -32
  331. package/dist/integrations/pi/engine/resource-extension-integration.js +0 -81
  332. package/dist/integrations/pi/engine/settings-effects.js +0 -249
  333. package/dist/integrations/pi/engine/settings-integration.d.ts +0 -43
  334. package/dist/integrations/pi/engine/settings-integration.js +0 -227
  335. package/dist/integrations/pi/engine/workflow-controllers.d.ts +0 -21
  336. package/dist/integrations/pi/engine/workflow-controllers.js +0 -49
  337. package/dist/integrations/pi/session-ui/index.d.ts +0 -5
  338. package/dist/integrations/pi/session-ui/index.js +0 -5
  339. package/dist/integrations/pi/session-ui/paste-executor.d.ts +0 -10
  340. package/dist/integrations/pi/session-ui/paste-preparation-client.d.ts +0 -16
  341. package/dist/integrations/pi/session-ui/route-host.d.ts +0 -5
  342. package/dist/integrations/pi/tui-runtime/conformance.d.ts +0 -18
  343. package/dist/integrations/pi/tui-runtime/conformance.js +0 -145
  344. package/dist/ui/components/prompt-row.d.ts +0 -14
  345. package/dist/ui/components/prompt-row.js +0 -20
  346. package/dist/ui/settings/session.d.ts +0 -36
  347. package/dist/ui/settings/store.d.ts +0 -29
  348. package/dist/ui/settings/store.js +0 -91
  349. package/dist/{integrations/pi/session-ui → app/session-shell}/clipboard-diagnostics.js +2 -2
  350. package/dist/{integrations/pi/session-ui → app/session-shell}/clipboard-image.d.ts +0 -0
  351. package/dist/{integrations/pi/session-ui → app/session-shell}/editor-hyperlink-budget.d.ts +0 -0
  352. package/dist/{integrations/pi/session-ui → app/session-shell}/editor-hyperlink-budget.js +0 -0
  353. package/dist/{integrations/pi/session-ui → app/session-shell}/image-preparation.d.ts +0 -0
  354. package/dist/{integrations/pi/session-ui → app/session-shell}/image-source.d.ts +0 -0
  355. package/dist/{integrations/pi/session-ui → app/session-shell}/image-worker.d.ts +0 -0
  356. package/dist/{integrations/pi/session-ui → app/session-shell}/paste-helper.d.ts +0 -0
  357. package/dist/{integrations/pi/session-ui → app/session-shell}/paste-text-preparation.js +0 -0
  358. package/dist/{integrations/pi/session-ui → app/session-shell}/paste-text-worker.d.ts +0 -0
  359. package/dist/{integrations/pi/session-ui → app/session-shell}/paste-text-worker.js +0 -0
  360. package/dist/{integrations/pi/session-ui/response-copy-helper.d.ts → app/session-shell/paste-types.js} +0 -0
  361. package/dist/{integrations/pi/session-ui → app/session-shell}/path-chip-presentation.js +0 -0
  362. package/dist/{integrations/pi/session-ui → app/session-shell}/quit-outro-effects.d.ts +0 -0
  363. package/dist/{integrations/pi/session-ui → app/session-shell}/quit-outro-effects.js +0 -0
  364. package/dist/{integrations/pi/session-ui → app/session-shell}/quit-outro.d.ts +0 -0
  365. package/dist/{integrations/pi/session-ui/route-host.js → app/session-shell/response-copy-helper.d.ts} +0 -0
  366. package/dist/{integrations/pi/session-ui → app/session-shell}/response-copy-protocol.js +0 -0
  367. package/dist/{integrations/pi/session-ui → app/session-shell}/stream-presentation-coalescer.d.ts +0 -0
  368. package/dist/{integrations/pi/session-ui → app/session-shell}/stream-presentation-coalescer.js +3 -3
  369. /package/dist/{integrations/pi/session-ui → app/session-shell}/text-paste.d.ts +0 -0
  370. /package/dist/{integrations/pi/session-ui → app/session-shell}/text-paste.js +0 -0
@@ -0,0 +1,405 @@
1
+ import { toolRenderingInput } from "./tool-rendering.js";
2
+ import { TranscriptImageAssets } from "./transcript-image-assets.js";
3
+ import { acceptsTranscriptUpdate, transcriptToolState } from "../../../contracts/owned-ui/index.js";
4
+ import { assistantContent, contentImageCount, isRecord, jsonSummary, messageFallbackKey, retainCompletedArguments, sameBlockContent, sanitizeJson, stringValue, textFromContent } from "./message-values.js";
5
+ /**
6
+ * The transcript as the owned UI sees it: Pi's session messages and tool events projected into
7
+ * ordered, revisioned blocks. The projection owns block identity (message and tool ids that stay
8
+ * stable across streaming, settlement, and rebuilds), revision numbering, image asset retention,
9
+ * and the reconciliation rules that keep late or duplicate events from disturbing a settled
10
+ * block. It never touches delivery: the adapter seals pending snapshots before a replacement and
11
+ * receives each changed block through the ports.
12
+ */
13
+ export class PiTranscriptProjection {
14
+ assets = new TranscriptImageAssets();
15
+ #transcript = [];
16
+ #transcriptIndex = new Map();
17
+ #transcriptSnapshot;
18
+ #messageBlockIds = new WeakMap();
19
+ #messageFallbackIds = new Map();
20
+ #toolBlockIds = new Map();
21
+ #nextBlockSequence = 0;
22
+ #ports;
23
+ constructor(ports) {
24
+ this.#ports = ports;
25
+ }
26
+ /** The current blocks in transcript order; not a copy. */
27
+ get blocks() {
28
+ return this.#transcript;
29
+ }
30
+ /** A frozen copy that stays identical until the next change, so views can share it. */
31
+ snapshot() {
32
+ return this.#transcriptSnapshot ??= Object.freeze([...this.#transcript]);
33
+ }
34
+ // Performance: replacing the transcript rebuilds its index so block lookup stays constant-time.
35
+ /** Replace every block; the caller has already sealed pending delivery snapshots. */
36
+ replace(blocks) {
37
+ for (const block of blocks)
38
+ this.assets.retain(block);
39
+ for (const block of this.#transcript)
40
+ this.assets.release(block);
41
+ this.#transcript = blocks;
42
+ this.#transcriptIndex.clear();
43
+ for (const [index, block] of blocks.entries())
44
+ this.#transcriptIndex.set(block.id, index);
45
+ this.assets.discardUnowned();
46
+ this.#transcriptSnapshot = undefined;
47
+ }
48
+ block(id) {
49
+ const index = this.#transcriptIndex.get(id);
50
+ return index === undefined ? undefined : this.#transcript[index];
51
+ }
52
+ // Invariant: run-local completion may restate messages, but never owns transcript membership.
53
+ /** Fold a finished run's messages into the transcript without replacing session-authoritative scope. */
54
+ mergeRun(messages, sessionMessages) {
55
+ const positions = new Map();
56
+ const sessionOccurrences = new Map();
57
+ for (const [index, message] of sessionMessages.entries()) {
58
+ const key = messageFallbackKey(message, index);
59
+ const occurrence = sessionOccurrences.get(key) ?? 0;
60
+ sessionOccurrences.set(key, occurrence + 1);
61
+ positions.set(message, { index, occurrence });
62
+ }
63
+ const runOccurrences = new Map();
64
+ for (const [index, message] of messages.entries()) {
65
+ const key = messageFallbackKey(message, index);
66
+ const occurrence = runOccurrences.get(key) ?? 0;
67
+ runOccurrences.set(key, occurrence + 1);
68
+ const position = positions.get(message) ?? { index, occurrence };
69
+ for (const block of this.messageBlocks(message, "finalized", position.index, position.occurrence)) {
70
+ this.upsert(block);
71
+ }
72
+ this.settleFailedDeclarations(message);
73
+ }
74
+ }
75
+ // Invariant: full replacement is reserved for session-authoritative scope (bind/settlement).
76
+ /** Build the authoritative block list for `messages`, reusing unchanged blocks so their rendered rows survive. */
77
+ rebuild(messages, status) {
78
+ const blocks = [];
79
+ const blockIndexes = new Map();
80
+ const occurrences = new Map();
81
+ for (const [index, message] of messages.entries()) {
82
+ const key = messageFallbackKey(message, index);
83
+ const occurrence = occurrences.get(key) ?? 0;
84
+ occurrences.set(key, occurrence + 1);
85
+ for (const block of this.messageBlocks(message, status, index, occurrence, id => blocks[blockIndexes.get(id) ?? -1] ?? this.block(id))) {
86
+ const existingIndex = blockIndexes.get(block.id);
87
+ if (existingIndex === undefined) {
88
+ blockIndexes.set(block.id, blocks.length);
89
+ blocks.push(block);
90
+ continue;
91
+ }
92
+ const existing = blocks[existingIndex];
93
+ if (existing !== undefined) {
94
+ blocks[existingIndex] = {
95
+ ...block,
96
+ payload: {
97
+ ...(isRecord(existing.payload) ? existing.payload : {}),
98
+ ...(isRecord(block.payload) ? block.payload : {}),
99
+ },
100
+ };
101
+ }
102
+ }
103
+ }
104
+ // Performance: an authoritative rebuild restates most of what is already there. Reusing the block
105
+ // that already says it keeps its revision, and with it the rows the shell rendered for
106
+ // it — otherwise every turn that ends re-renders the whole session.
107
+ return blocks.map(block => {
108
+ const existing = this.block(block.id);
109
+ const next = existing === undefined ? block : retainCompletedArguments(existing, block);
110
+ return existing !== undefined && sameBlockContent(existing, next) ? existing : next;
111
+ });
112
+ }
113
+ upsertMessage(message, status) {
114
+ const blocks = this.messageBlocks(message, status, this.#transcript.length);
115
+ const first = blocks[0];
116
+ for (const block of blocks)
117
+ this.upsert(block);
118
+ return first;
119
+ }
120
+ messageBlocks(message, status, fallbackIndex, occurrence, currentBlock = id => this.block(id)) {
121
+ if (!isRecord(message) || typeof message.role !== "string")
122
+ return [];
123
+ const baseId = this.#messageBlockId(message, fallbackIndex, status, occurrence);
124
+ if (message.role === "user") {
125
+ return [{
126
+ id: baseId,
127
+ kind: "user",
128
+ status,
129
+ revision: this.nextRevision(baseId),
130
+ title: "User",
131
+ text: textFromContent(message.content),
132
+ imageReferences: this.imageReferences(message.content, "user"),
133
+ payload: {
134
+ role: "user",
135
+ imageCount: contentImageCount(message.content),
136
+ timestamp: typeof message.timestamp === "number" && Number.isFinite(message.timestamp) ? message.timestamp : null,
137
+ },
138
+ }];
139
+ }
140
+ if (message.role === "bashExecution") {
141
+ return [{
142
+ id: baseId,
143
+ kind: "bash",
144
+ status,
145
+ revision: this.nextRevision(baseId),
146
+ title: stringValue(message.command) ?? "Bash",
147
+ text: stringValue(message.output) ?? "",
148
+ payload: {
149
+ role: "bashExecution",
150
+ command: stringValue(message.command) ?? "",
151
+ exitCode: typeof message.exitCode === "number" ? message.exitCode : null,
152
+ cancelled: message.cancelled === true,
153
+ truncated: message.truncated === true,
154
+ fullOutputPath: stringValue(message.fullOutputPath) ?? null,
155
+ excludeFromContext: message.excludeFromContext === true,
156
+ },
157
+ }];
158
+ }
159
+ if (message.role === "custom") {
160
+ if (message.display === false)
161
+ return [];
162
+ return [{
163
+ id: baseId,
164
+ kind: "custom",
165
+ status,
166
+ revision: this.nextRevision(baseId),
167
+ title: stringValue(message.customType) ?? "Custom",
168
+ text: textFromContent(message.content),
169
+ payload: {
170
+ role: "custom",
171
+ customType: stringValue(message.customType) ?? "custom",
172
+ display: true,
173
+ details: message.details,
174
+ timestamp: typeof message.timestamp === "number" ? message.timestamp : 0,
175
+ },
176
+ }];
177
+ }
178
+ if (message.role === "compactionSummary" || message.role === "branchSummary") {
179
+ return [{
180
+ id: baseId,
181
+ kind: "compaction",
182
+ status,
183
+ revision: this.nextRevision(baseId),
184
+ title: message.role === "branchSummary" ? "Branch summary" : "Compaction summary",
185
+ text: stringValue(message.summary) ?? "",
186
+ payload: {
187
+ role: message.role,
188
+ tokensBefore: typeof message.tokensBefore === "number" ? message.tokensBefore : 0,
189
+ fromId: stringValue(message.fromId) ?? null,
190
+ timestamp: typeof message.timestamp === "number" ? message.timestamp : 0,
191
+ },
192
+ }];
193
+ }
194
+ if (message.role === "toolResult") {
195
+ const toolCallId = stringValue(message.toolCallId);
196
+ const blockId = toolCallId === undefined
197
+ ? baseId
198
+ : this.#toolBlockIds.get(toolCallId) ?? `tool-${toolCallId}`;
199
+ if (toolCallId !== undefined)
200
+ this.#toolBlockIds.set(toolCallId, blockId);
201
+ const existing = currentBlock(blockId);
202
+ const existingPayload = isRecord(existing?.payload) ? existing.payload : undefined;
203
+ const payload = {
204
+ role: "toolResult", toolCallId: toolCallId ?? null,
205
+ toolName: stringValue(message.toolName) ?? stringValue(existingPayload?.toolName) ?? "unknown",
206
+ argsComplete: true, partialResult: status === "live", isError: message.isError === true,
207
+ };
208
+ const rendering = toolRenderingInput({ args: undefined, previousArgs: existing?.toolRendering,
209
+ result: message, payload, image: part => this.imageReferences([part], "tool-result")[0] });
210
+ return [{
211
+ id: blockId,
212
+ kind: "tool-result",
213
+ status,
214
+ toolState: { argsComplete: true, execution: status === "live" ? "running" : message.isError === true ? "failed" : "succeeded" },
215
+ revision: this.nextRevision(blockId),
216
+ title: stringValue(message.toolName) ?? existing?.title ?? "Tool result",
217
+ ...rendering,
218
+ payload,
219
+ }];
220
+ }
221
+ if (message.role !== "assistant" || !Array.isArray(message.content))
222
+ return [];
223
+ const blocks = [{
224
+ id: baseId,
225
+ kind: "assistant",
226
+ status,
227
+ revision: this.nextRevision(baseId),
228
+ title: "Assistant",
229
+ text: textFromContent(message.content),
230
+ payload: {
231
+ role: "assistant",
232
+ content: assistantContent(message.content),
233
+ provider: stringValue(message.provider) ?? null,
234
+ model: stringValue(message.model) ?? null,
235
+ api: stringValue(message.api) ?? null,
236
+ usage: sanitizeJson(message.usage),
237
+ stopReason: stringValue(message.stopReason) ?? null,
238
+ errorMessage: stringValue(message.errorMessage) ?? null,
239
+ timestamp: typeof message.timestamp === "number" ? message.timestamp : 0,
240
+ },
241
+ }];
242
+ for (const item of message.content) {
243
+ if (!isRecord(item) || item.type !== "toolCall")
244
+ continue;
245
+ const toolCallId = stringValue(item.id) ?? `${baseId}:${blocks.length}`;
246
+ const blockId = this.#toolBlockIds.get(toolCallId) ?? `tool-${toolCallId}`;
247
+ this.#toolBlockIds.set(toolCallId, blockId);
248
+ const failure = status === "finalized" ? this.#declarationFailure(message) : undefined;
249
+ const payload = { toolCallId, toolName: stringValue(item.name) ?? "unknown",
250
+ argsComplete: failure === undefined && status === "finalized",
251
+ ...(failure === undefined ? {} : { isError: true }) };
252
+ const rendering = toolRenderingInput({ args: item.arguments, payload,
253
+ ...(failure === undefined ? {} : { result: { content: [{ type: "text", text: failure.text }] } }),
254
+ image: () => undefined });
255
+ blocks.push({
256
+ id: blockId,
257
+ kind: failure === undefined ? "tool-call" : "tool-result",
258
+ status: failure === undefined ? "live" : "finalized",
259
+ toolState: {
260
+ argsComplete: failure === undefined && status === "finalized",
261
+ execution: failure?.execution ?? "pending",
262
+ },
263
+ revision: this.nextRevision(blockId),
264
+ title: stringValue(item.name) ?? "Tool",
265
+ ...rendering,
266
+ text: failure?.text ?? jsonSummary(item.arguments).summary,
267
+ payload,
268
+ });
269
+ }
270
+ return blocks;
271
+ }
272
+ #declarationFailure(message) {
273
+ // Provenance: pinned interactive-mode message_end and history reconstruction settle pending tools.
274
+ if (message.role !== "assistant")
275
+ return undefined;
276
+ if (message.stopReason === "aborted") {
277
+ const attempts = this.#ports.retryAttempt();
278
+ return { execution: "aborted", text: attempts > 0
279
+ ? `Aborted after ${attempts} retry attempt${attempts > 1 ? "s" : ""}` : "Operation aborted" };
280
+ }
281
+ return message.stopReason === "error"
282
+ ? { execution: "failed", text: stringValue(message.errorMessage) || "Error" } : undefined;
283
+ }
284
+ settleFailedDeclarations(message) {
285
+ if (!isRecord(message))
286
+ return;
287
+ const failure = this.#declarationFailure(message);
288
+ if (failure === undefined)
289
+ return;
290
+ for (const block of this.#transcript) {
291
+ const state = transcriptToolState(block);
292
+ if (state === undefined || state.execution !== "pending" && state.execution !== "running")
293
+ continue;
294
+ const payload = { ...(isRecord(block.payload) ? block.payload : {}), partialResult: false, isError: true };
295
+ this.upsert({
296
+ ...block, kind: "tool-result", status: "finalized", revision: block.revision + 1,
297
+ ...toolRenderingInput({ args: undefined, previousArgs: block.toolRendering, payload,
298
+ result: { content: [{ type: "text", text: failure.text }] }, image: () => undefined }),
299
+ toolState: { ...state, execution: failure.execution }, payload,
300
+ });
301
+ }
302
+ }
303
+ imageReferences(content, source) {
304
+ if (!Array.isArray(content))
305
+ return [];
306
+ const references = [];
307
+ for (const item of content) {
308
+ if (references.length >= 16)
309
+ break;
310
+ const reference = this.assets.reference(item, source);
311
+ if (reference !== undefined)
312
+ references.push(reference);
313
+ }
314
+ return references;
315
+ }
316
+ upsertToolExecution(event) {
317
+ const toolCallId = stringValue(event.toolCallId);
318
+ if (!toolCallId)
319
+ return;
320
+ const blockId = this.#toolBlockIds.get(toolCallId) ?? `tool-${toolCallId}`;
321
+ this.#toolBlockIds.set(toolCallId, blockId);
322
+ const ended = event.type === "tool_execution_end";
323
+ const existing = this.block(blockId);
324
+ const state = existing === undefined ? undefined : transcriptToolState(existing);
325
+ // Invariant: duplicate starts cannot blank accumulated output; late events cannot reopen a settled invocation.
326
+ if (state !== undefined && (state.execution !== "pending" && state.execution !== "running"
327
+ || event.type === "tool_execution_start" && state.execution === "running"))
328
+ return;
329
+ const source = ended ? event.result : event.partialResult;
330
+ const payload = { toolCallId, toolName: stringValue(event.toolName) ?? "unknown",
331
+ partialResult: event.type === "tool_execution_update", argsComplete: true, isError: event.isError === true };
332
+ const rendering = toolRenderingInput({ args: event.args, previousArgs: existing?.toolRendering, result: source,
333
+ payload, image: part => this.imageReferences([part], "tool-result")[0] });
334
+ this.upsert({
335
+ id: blockId,
336
+ kind: ended ? "tool-result" : "tool-call",
337
+ status: ended ? "finalized" : "live",
338
+ toolState: { argsComplete: true, execution: ended ? event.isError === true ? "failed" : "succeeded" : "running" },
339
+ revision: this.nextRevision(blockId),
340
+ title: stringValue(event.toolName) ?? "Tool",
341
+ ...rendering,
342
+ payload,
343
+ });
344
+ }
345
+ upsert(block) {
346
+ const index = this.#transcriptIndex.get(block.id);
347
+ if (index !== undefined) {
348
+ const existing = this.#transcript[index];
349
+ // Invariant: argument completion is not execution finality; stale phases still stay rejected.
350
+ if (existing !== undefined && !acceptsTranscriptUpdate(existing, block))
351
+ return;
352
+ if (existing !== undefined)
353
+ block = retainCompletedArguments(existing, block);
354
+ // Performance: nothing is emitted for a block that repeats itself, and keeping the
355
+ // revision keeps the rows it already rendered.
356
+ if (existing !== undefined && sameBlockContent(existing, block))
357
+ return;
358
+ this.assets.retain(block);
359
+ if (existing !== undefined)
360
+ this.assets.release(existing);
361
+ this.#transcript[index] = block;
362
+ }
363
+ else {
364
+ this.assets.retain(block);
365
+ this.#transcriptIndex.set(block.id, this.#transcript.length);
366
+ this.#transcript.push(block);
367
+ }
368
+ this.#transcriptSnapshot = undefined;
369
+ this.#ports.blockChanged(block);
370
+ }
371
+ #messageBlockId(message, fallbackIndex, status, occurrence) {
372
+ const existing = this.#messageBlockIds.get(message);
373
+ if (existing)
374
+ return existing;
375
+ const fallback = messageFallbackKey(message, fallbackIndex);
376
+ const cached = this.#messageFallbackIds.get(fallback) ?? [];
377
+ let id;
378
+ if (occurrence !== undefined) {
379
+ id = cached[occurrence];
380
+ if (id === undefined) {
381
+ id = `${fallback}-${occurrence}`;
382
+ cached[occurrence] = id;
383
+ }
384
+ }
385
+ else {
386
+ id = [...cached].reverse().find(candidate => this.block(candidate)?.status === "live");
387
+ if (id === undefined && status === "finalized")
388
+ id = cached.at(-1);
389
+ if (id === undefined) {
390
+ id = `${fallback}-${cached.length}`;
391
+ cached.push(id);
392
+ }
393
+ }
394
+ this.#messageFallbackIds.set(fallback, cached);
395
+ this.#messageBlockIds.set(message, id);
396
+ return id;
397
+ }
398
+ nextRevision(id) {
399
+ const existing = this.block(id);
400
+ if (existing)
401
+ return existing.revision + 1;
402
+ this.#nextBlockSequence += 1;
403
+ return this.#nextBlockSequence;
404
+ }
405
+ }
@@ -0,0 +1,4 @@
1
+ import type { AgentSession, AgentSessionRuntime } from "../startup-public.js";
2
+ import type { OwnedUiModelInfo, OwnedUiUsageView } from "../../../contracts/owned-ui/index.js";
3
+ /** Token, cost, cache, and context usage summed from the session's entries for the status footer. */
4
+ export declare function readUsageView(session: AgentSession | undefined, runtime: AgentSessionRuntime | undefined, activeModel: OwnedUiModelInfo | null): OwnedUiUsageView;
@@ -0,0 +1,56 @@
1
+ import { finiteNumber, isRecord } from "./message-values.js";
2
+ /** Token, cost, cache, and context usage summed from the session's entries for the status footer. */
3
+ export function readUsageView(session, runtime, activeModel) {
4
+ let input = 0;
5
+ let output = 0;
6
+ let cacheRead = 0;
7
+ let cacheWrite = 0;
8
+ let cost = 0;
9
+ let latestCacheHitRate = null;
10
+ let latestPrompt = null;
11
+ const entries = session?.sessionManager?.getEntries?.()
12
+ ?? (session?.messages ?? []).map(message => ({ type: "message", message }));
13
+ for (const entry of entries) {
14
+ if (!isRecord(entry))
15
+ continue;
16
+ const message = entry.type === "message" && isRecord(entry.message) ? entry.message : undefined;
17
+ const usage = message !== undefined && isRecord(message.usage)
18
+ ? message.usage
19
+ : (entry.type === "branch_summary" || entry.type === "compaction") && isRecord(entry.usage) ? entry.usage : undefined;
20
+ if (usage === undefined)
21
+ continue;
22
+ input += finiteNumber(usage.input);
23
+ output += finiteNumber(usage.output);
24
+ cacheRead += finiteNumber(usage.cacheRead);
25
+ cacheWrite += finiteNumber(usage.cacheWrite);
26
+ cost += isRecord(usage.cost) ? finiteNumber(usage.cost.total) : 0;
27
+ if (message?.role === "assistant") {
28
+ latestPrompt = {
29
+ input: finiteNumber(usage.input),
30
+ cacheRead: finiteNumber(usage.cacheRead),
31
+ cacheWrite: finiteNumber(usage.cacheWrite),
32
+ };
33
+ const promptTokens = latestPrompt.input + latestPrompt.cacheRead + latestPrompt.cacheWrite;
34
+ latestCacheHitRate = promptTokens > 0 ? (latestPrompt.cacheRead / promptTokens) * 100 : null;
35
+ }
36
+ }
37
+ const context = session?.getContextUsage?.();
38
+ const providerId = activeModel?.providerId;
39
+ const usingSubscription = providerId === "kimi-coding"
40
+ || (providerId !== undefined && runtime?.services.modelRuntime.isUsingSubscription?.(providerId) === true);
41
+ return {
42
+ input,
43
+ output,
44
+ cacheRead,
45
+ cacheWrite,
46
+ cost,
47
+ latestCacheHitRate,
48
+ latestPrompt,
49
+ contextAvailable: context !== undefined,
50
+ contextTokens: context?.tokens ?? null,
51
+ contextWindow: context?.contextWindow ?? 0,
52
+ contextPercent: context?.percent ?? null,
53
+ usingSubscription,
54
+ autoCompactEnabled: runtime?.services.settingsManager?.getCompactionEnabled?.() ?? true,
55
+ };
56
+ }
@@ -0,0 +1,59 @@
1
+ import { type AgentSession, type AgentSessionRuntime } from "../startup-public.js";
2
+ import type { OwnedUiModelInfo } from "../../../contracts/owned-ui/index.js";
3
+ import type { PiAuthenticationProviderOption, PiProjectTrustContext, PiProjectTrustUpdate, PiScopedModelsContext, PiScopedModelsRefreshResult, PiSessionSelectorContext, PiTreeSelectorContext, PiWorkflowOption } from "./workflows.js";
4
+ type PiSessionApi = AgentSession;
5
+ type PiRuntimeApi = AgentSessionRuntime;
6
+ export interface PiWorkflowContextPorts {
7
+ /** The working directory the runtime settled on; it can change when a session is resumed elsewhere. */
8
+ cwd(): string;
9
+ session(): PiSessionApi | undefined;
10
+ runtime(): PiRuntimeApi | undefined;
11
+ disposed(): boolean;
12
+ activeModel(): OwnedUiModelInfo | null;
13
+ emitView(): void;
14
+ }
15
+ /**
16
+ * The selector contexts and option lists the owned UI's workflow dialogs read from pinned Pi:
17
+ * model, scoped-model, session, tree, fork, project-trust, and provider-authentication state,
18
+ * shaped for the owned controllers. Everything here is a read of the current session and runtime
19
+ * plus the few writes the selectors commit directly (scoped models, project trust); running a
20
+ * workflow belongs to the runner.
21
+ */
22
+ export declare class PiWorkflowContexts {
23
+ #private;
24
+ constructor(options: {
25
+ readonly agentDir: string;
26
+ }, ports: PiWorkflowContextPorts);
27
+ pinnedModelSelectorContext(): {
28
+ readonly currentModel: unknown;
29
+ readonly modelRuntime: unknown;
30
+ readonly scopedModels: readonly unknown[];
31
+ readonly defaultModel?: {
32
+ readonly provider: string;
33
+ readonly id: string;
34
+ };
35
+ };
36
+ pinnedProjectTrustContext(): PiProjectTrustContext;
37
+ persistProjectTrust(updates: readonly PiProjectTrustUpdate[]): void;
38
+ pinnedSessionSelectorContext(): PiSessionSelectorContext;
39
+ pinnedScopedModelsContext(): PiScopedModelsContext;
40
+ updateScopedModels(enabledModelIds: readonly string[] | null): void;
41
+ persistScopedModels(enabledModelIds: readonly string[] | null): void;
42
+ refreshScopedModels(signal: AbortSignal): Promise<PiScopedModelsRefreshResult>;
43
+ pinnedLoginMethodOptions(providerReference: string): {
44
+ readonly title: string;
45
+ readonly options: readonly PiWorkflowOption[];
46
+ };
47
+ pinnedAmbientAuthentication(selection: string): {
48
+ readonly providerId: string;
49
+ readonly providerName: string;
50
+ readonly title: string;
51
+ readonly message: string;
52
+ } | null;
53
+ pinnedForkOptions(): readonly PiWorkflowOption[];
54
+ pinnedTreeSelectorContext(): PiTreeSelectorContext;
55
+ modelOptions(): readonly PiWorkflowOption[];
56
+ loginOptions(authType?: "oauth" | "api_key"): readonly PiAuthenticationProviderOption[];
57
+ logoutOptions(): Promise<readonly PiAuthenticationProviderOption[]>;
58
+ }
59
+ export {};