@timurproko/a1 0.1.8-dev.235df0e → 0.1.8-dev.260

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 (485) hide show
  1. package/README.md +107 -67
  2. package/bin/cli.js +28 -10
  3. package/bin/guardian.js +8 -3
  4. package/bin/module-identity.js +69 -35
  5. package/bin/pi-tui.d.ts +6 -0
  6. package/bin/pi-tui.js +28 -0
  7. package/bin/release-cleanup.js +8 -0
  8. package/bin/supervisor.js +2 -2
  9. package/bin/sync-pi-tui-proxy.js +97 -0
  10. package/bin/ui.js +47 -20
  11. package/bin/warmup.js +27 -0
  12. package/dist/cli/capabilities.d.ts +6 -0
  13. package/dist/{src/cli → cli}/capabilities.js +1 -1
  14. package/dist/{src/cli → cli}/dispatch.d.ts +15 -1
  15. package/dist/cli/dispatch.js +261 -0
  16. package/dist/cli/package-messages.d.ts +26 -0
  17. package/dist/cli/package-messages.js +71 -0
  18. package/dist/{src/cli → cli}/packages.d.ts +11 -2
  19. package/dist/{src/cli → cli}/packages.js +24 -27
  20. package/dist/{src/cli → cli}/version-stats.d.ts +6 -0
  21. package/dist/cli/version-stats.js +112 -0
  22. package/dist/composition/agent-engine-bridge.d.ts +3 -0
  23. package/dist/composition/agent-engine-bridge.js +108 -0
  24. package/dist/composition/index.d.ts +3 -0
  25. package/dist/composition/index.js +3 -0
  26. package/dist/composition/owned-ui.d.ts +31 -0
  27. package/dist/composition/owned-ui.js +66 -0
  28. package/dist/composition/process.d.ts +16 -0
  29. package/dist/composition/process.js +45 -0
  30. package/dist/composition/settings-route-host.d.ts +8 -0
  31. package/dist/composition/settings-route-host.js +75 -0
  32. package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/capability-ports.d.ts +2 -2
  33. package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/domain-validation.js +22 -4
  34. package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/domain.d.ts +17 -0
  35. package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/package-ports.d.ts +6 -0
  36. package/dist/{src/foundation/owned-ui-contracts → contracts/owned-ui}/model.d.ts +36 -0
  37. package/dist/{src/foundation/owned-ui-contracts → contracts/owned-ui}/validation.js +25 -0
  38. package/dist/{src/features → features}/launch/development-launch.js +11 -3
  39. package/dist/{src/features → features}/launch/index.d.ts +0 -1
  40. package/dist/{src/features → features}/launch/index.js +0 -1
  41. package/dist/features/launch/intent.d.ts +10 -0
  42. package/dist/features/launch/intent.js +8 -0
  43. package/dist/{src/features → features}/launch/prepare-launch.d.ts +0 -2
  44. package/dist/{src/features → features}/launch/prepare-launch.js +2 -9
  45. package/dist/{src/features → features}/launch/profile-paths.d.ts +1 -2
  46. package/dist/{src/features → features}/launch/profile-paths.js +2 -8
  47. package/dist/{src/features → features}/launch/runtime-selection.d.ts +2 -5
  48. package/dist/{src/features → features}/owned-ui/customization.d.ts +3 -1
  49. package/dist/{src/features → features}/owned-ui/customization.js +3 -1
  50. package/dist/{src/features → features}/owned-ui/diagnostics.d.ts +2 -1
  51. package/dist/{src/features → features}/owned-ui/diagnostics.js +1 -0
  52. package/dist/{src/features → features}/owned-ui/index.d.ts +2 -0
  53. package/dist/{src/features → features}/owned-ui/index.js +2 -0
  54. package/dist/features/owned-ui/project-trust-prompt.d.ts +25 -0
  55. package/dist/features/owned-ui/project-trust-prompt.js +149 -0
  56. package/dist/{src/features → features}/owned-ui/run.d.ts +2 -2
  57. package/dist/{src/features → features}/owned-ui/run.js +2 -0
  58. package/dist/features/owned-ui/session-fork-prompt.d.ts +8 -0
  59. package/dist/features/owned-ui/session-fork-prompt.js +34 -0
  60. package/dist/{src/features → features}/owned-ui/settings-app.d.ts +3 -3
  61. package/dist/{src/features → features}/owned-ui/settings-app.js +103 -54
  62. package/dist/{src/features → features}/workspace/capabilities.d.ts +1 -1
  63. package/dist/{src/features → features}/workspace/reducer.d.ts +2 -1
  64. package/dist/{src/features → features}/workspace/reducer.js +2 -1
  65. package/dist/{src/features → features}/workspace/router.d.ts +2 -1
  66. package/dist/{src/features → features}/workspace/router.js +1 -0
  67. package/dist/{src/features → features}/workspace/store.d.ts +2 -1
  68. package/dist/{src/features → features}/workspace/store.js +1 -0
  69. package/dist/{src/foundation → foundation}/launch-guardian/main.d.ts +2 -0
  70. package/dist/{src/foundation → foundation}/launch-guardian/main.js +18 -5
  71. package/dist/{src/foundation → foundation}/lifecycle/index.d.ts +2 -0
  72. package/dist/{src/foundation → foundation}/lifecycle/index.js +2 -0
  73. package/dist/{src/foundation → foundation}/lifecycle/model.d.ts +1 -1
  74. package/dist/{src/foundation → foundation}/lifecycle/model.js +1 -1
  75. package/dist/foundation/lifecycle/paths.d.ts +30 -0
  76. package/dist/{src/foundation → foundation}/lifecycle/paths.js +29 -1
  77. package/dist/foundation/lifecycle/session-selection.d.ts +9 -0
  78. package/dist/foundation/lifecycle/session-selection.js +39 -0
  79. package/dist/foundation/lifecycle/supervisor-startup.d.ts +30 -0
  80. package/dist/foundation/lifecycle/supervisor-startup.js +106 -0
  81. package/dist/{src/foundation → foundation}/native-host-protocol/codec.d.ts +2 -0
  82. package/dist/{src/foundation → foundation}/native-host-protocol/codec.js +2 -0
  83. package/dist/{src/foundation → foundation}/native-host-protocol/messages.d.ts +1 -1
  84. package/dist/{src/foundation → foundation}/native-host-protocol/messages.js +1 -1
  85. package/dist/foundation/process-containment/darwin-process-inspector.d.ts +5 -0
  86. package/dist/foundation/process-containment/darwin-process-inspector.js +7 -0
  87. package/dist/{src/foundation → foundation}/process-containment/index.d.ts +1 -0
  88. package/dist/{src/foundation → foundation}/process-containment/index.js +1 -0
  89. package/dist/{src/foundation → foundation}/process-containment/linux-process-inspector.d.ts +1 -0
  90. package/dist/{src/foundation → foundation}/process-containment/linux-process-inspector.js +1 -0
  91. package/dist/{src/foundation → foundation}/process-containment/native-guardian-containment.d.ts +1 -0
  92. package/dist/{src/foundation → foundation}/process-containment/native-guardian-containment.js +1 -0
  93. package/dist/{src/foundation → foundation}/process-containment/windows-process-inspector.d.ts +3 -1
  94. package/dist/{src/foundation → foundation}/process-containment/windows-process-inspector.js +5 -2
  95. package/dist/{src/foundation → foundation}/protocol/client.d.ts +1 -0
  96. package/dist/{src/foundation → foundation}/protocol/client.js +1 -0
  97. package/dist/{src/foundation → foundation}/protocol/messages.d.ts +1 -0
  98. package/dist/{src/foundation → foundation}/protocol/messages.js +1 -0
  99. package/dist/{src/foundation → foundation}/release/bootstrap.d.ts +25 -6
  100. package/dist/{src/foundation → foundation}/release/bootstrap.js +124 -34
  101. package/dist/foundation/release/cohort-state.d.ts +156 -0
  102. package/dist/foundation/release/cohort-state.js +471 -0
  103. package/dist/foundation/release/dependency-layer.d.ts +82 -0
  104. package/dist/foundation/release/dependency-layer.js +497 -0
  105. package/dist/foundation/release/endpoints.d.ts +20 -0
  106. package/dist/foundation/release/endpoints.js +50 -0
  107. package/dist/foundation/release/immutable-platform.d.ts +6 -0
  108. package/dist/foundation/release/immutable-platform.js +13 -0
  109. package/dist/{src/foundation → foundation}/release/index.d.ts +4 -0
  110. package/dist/{src/foundation → foundation}/release/index.js +4 -0
  111. package/dist/foundation/release/release-gc.d.ts +71 -0
  112. package/dist/foundation/release/release-gc.js +734 -0
  113. package/dist/{src/foundation → foundation}/release/release-store.d.ts +7 -3
  114. package/dist/{src/foundation → foundation}/release/release-store.js +65 -13
  115. package/dist/{src/foundation → foundation}/release/release.d.ts +4 -1
  116. package/dist/{src/foundation → foundation}/release/release.js +10 -3
  117. package/dist/foundation/release/restart-certification.d.ts +67 -0
  118. package/dist/foundation/release/restart-certification.js +211 -0
  119. package/dist/{src/foundation → foundation}/release/update-transaction.d.ts +1 -0
  120. package/dist/{src/foundation → foundation}/release/update-transaction.js +1 -0
  121. package/dist/{src/foundation → foundation}/release/update.d.ts +19 -3
  122. package/dist/{src/foundation → foundation}/release/update.js +116 -56
  123. package/dist/foundation/release/warmup.d.ts +3 -0
  124. package/dist/foundation/release/warmup.js +35 -0
  125. package/dist/foundation/startup/index.d.ts +1 -0
  126. package/dist/foundation/startup/index.js +1 -0
  127. package/dist/foundation/startup/startup-runtime.d.ts +36 -0
  128. package/dist/foundation/startup/startup-runtime.js +140 -0
  129. package/dist/{src/foundation → foundation}/storage/control-store.d.ts +2 -1
  130. package/dist/{src/foundation → foundation}/storage/control-store.js +39 -4
  131. package/dist/{src/foundation → foundation}/structured-agent-runtime/backpressure.d.ts +2 -1
  132. package/dist/{src/foundation → foundation}/structured-agent-runtime/backpressure.js +2 -1
  133. package/dist/{src/foundation → foundation}/structured-agent-runtime/commands.d.ts +2 -1
  134. package/dist/{src/foundation → foundation}/structured-agent-runtime/commands.js +2 -1
  135. package/dist/{src/foundation → foundation}/structured-agent-runtime/handshake.d.ts +1 -1
  136. package/dist/{src/foundation → foundation}/structured-agent-runtime/handshake.js +1 -1
  137. package/dist/{src/foundation → foundation}/structured-agent-runtime/reconnection.d.ts +2 -1
  138. package/dist/{src/foundation → foundation}/structured-agent-runtime/reconnection.js +2 -1
  139. package/dist/{src/foundation → foundation}/structured-agent-runtime/state.d.ts +2 -1
  140. package/dist/{src/foundation → foundation}/structured-agent-runtime/state.js +2 -1
  141. package/dist/foundation/supervision/index.d.ts +3 -0
  142. package/dist/foundation/supervision/index.js +3 -0
  143. package/dist/foundation/supervision/main.d.ts +1 -0
  144. package/dist/foundation/supervision/main.js +80 -0
  145. package/dist/foundation/supervision/paths.d.ts +1 -0
  146. package/dist/foundation/supervision/paths.js +1 -0
  147. package/dist/{src/foundation → foundation}/supervision/server.d.ts +19 -1
  148. package/dist/{src/foundation → foundation}/supervision/server.js +65 -3
  149. package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/components.d.ts +1 -1
  150. package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/conformance.d.ts +1 -0
  151. package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/conformance.js +3 -2
  152. package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/index.d.ts +1 -1
  153. package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/index.js +1 -1
  154. package/dist/integrations/pi/components/owned-editor-ux.d.ts +55 -0
  155. package/dist/integrations/pi/components/owned-editor-ux.js +778 -0
  156. package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/shell-components.d.ts +1 -0
  157. package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/shell-components.js +1 -0
  158. package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/shell-editor-autocomplete.js +54 -6
  159. package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/shell-extension-ui.d.ts +1 -1
  160. package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/shell-footer-status.d.ts +3 -3
  161. package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/shell-footer-status.js +49 -18
  162. package/dist/integrations/pi/components/shell-presenters-info.d.ts +36 -0
  163. package/dist/integrations/pi/components/shell-presenters-info.js +78 -0
  164. package/dist/integrations/pi/components/shell-presenters-transcript.d.ts +25 -0
  165. package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/shell-presenters-transcript.js +92 -131
  166. package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/shell-selectors-dialogs.d.ts +5 -2
  167. package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/shell-selectors-dialogs.js +2 -1
  168. package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/shell-shared-facade.d.ts +57 -8
  169. package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/shell-shared-facade.js +4 -2
  170. package/dist/integrations/pi/components/submitted-prompt-adapter.d.ts +13 -0
  171. package/dist/integrations/pi/components/submitted-prompt-adapter.js +27 -0
  172. package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/adjacent/core/keybindings.d.ts +10 -2
  173. package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/adjacent/core/keybindings.js +36 -3
  174. package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/session-footer.d.ts +1 -1
  175. package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/adapter.d.ts +28 -4
  176. package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/adapter.js +714 -127
  177. package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/conformance.d.ts +2 -0
  178. package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/conformance.js +4 -2
  179. package/dist/integrations/pi/engine/http-dispatcher.d.ts +4 -0
  180. package/dist/integrations/pi/engine/http-dispatcher.js +25 -0
  181. package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/index.d.ts +4 -0
  182. package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/index.js +4 -0
  183. package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/model-auth-integration.d.ts +2 -1
  184. package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/model-auth-integration.js +1 -0
  185. package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/package-integration.d.ts +1 -1
  186. package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/package-integration.js +32 -26
  187. package/dist/integrations/pi/engine/project-trust-preflight.d.ts +22 -0
  188. package/dist/integrations/pi/engine/project-trust-preflight.js +50 -0
  189. package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/resource-extension-integration.d.ts +2 -1
  190. package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/resource-extension-integration.js +1 -0
  191. package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/runtime-integration.d.ts +19 -1
  192. package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/runtime-integration.js +47 -5
  193. package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/session-integration.d.ts +4 -2
  194. package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/session-integration.js +19 -4
  195. package/dist/integrations/pi/engine/session-selection.d.ts +28 -0
  196. package/dist/integrations/pi/engine/session-selection.js +90 -0
  197. package/dist/integrations/pi/engine/settings-effects.d.ts +66 -0
  198. package/dist/integrations/pi/engine/settings-effects.js +249 -0
  199. package/dist/integrations/pi/engine/settings-integration.d.ts +43 -0
  200. package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/settings-integration.js +102 -108
  201. package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/workflow-controllers.d.ts +3 -2
  202. package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/workflow-controllers.js +1 -0
  203. package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/workflows.d.ts +18 -1
  204. package/dist/integrations/pi/session-ui/clipboard-image.d.ts +11 -0
  205. package/dist/integrations/pi/session-ui/clipboard-image.js +29 -0
  206. package/dist/{src/foundation/pi-owned-ui-integration → integrations/pi/session-ui}/index.d.ts +1 -0
  207. package/dist/{src/foundation/pi-owned-ui-integration → integrations/pi/session-ui}/index.js +1 -0
  208. package/dist/integrations/pi/session-ui/prompt-chips.d.ts +23 -0
  209. package/dist/integrations/pi/session-ui/prompt-chips.js +246 -0
  210. package/dist/integrations/pi/session-ui/route-host.d.ts +5 -0
  211. package/dist/integrations/pi/session-ui/session-shell-root.d.ts +141 -0
  212. package/dist/integrations/pi/session-ui/session-shell-root.js +1158 -0
  213. package/dist/integrations/pi/session-ui/session-shell.d.ts +55 -0
  214. package/dist/{src/foundation/pi-owned-ui-integration → integrations/pi/session-ui}/session-shell.js +479 -719
  215. package/dist/integrations/pi/session-ui/session-viewport-controller.d.ts +45 -0
  216. package/dist/integrations/pi/session-ui/session-viewport-controller.js +463 -0
  217. package/dist/integrations/pi/session-ui/stream-presentation-coalescer.d.ts +29 -0
  218. package/dist/integrations/pi/session-ui/stream-presentation-coalescer.js +79 -0
  219. package/dist/integrations/pi/session-ui/system-clipboard.d.ts +20 -0
  220. package/dist/integrations/pi/session-ui/system-clipboard.js +130 -0
  221. package/dist/{src/foundation/pi-tui-runtime-adapter → integrations/pi/tui-runtime}/adapter.d.ts +8 -1
  222. package/dist/{src/foundation/pi-tui-runtime-adapter → integrations/pi/tui-runtime}/adapter.js +216 -9
  223. package/dist/{src/foundation/pi-tui-runtime-adapter → integrations/pi/tui-runtime}/contracts.d.ts +29 -6
  224. package/dist/integrations/pi/tui-runtime/damage-aware-terminal.d.ts +74 -0
  225. package/dist/integrations/pi/tui-runtime/damage-aware-terminal.js +380 -0
  226. package/dist/{src/foundation/pi-tui-runtime-adapter → integrations/pi/tui-runtime}/index.d.ts +2 -0
  227. package/dist/{src/foundation/pi-tui-runtime-adapter → integrations/pi/tui-runtime}/index.js +2 -0
  228. package/dist/integrations/pi/tui-runtime/input-presentation-coordinator.d.ts +39 -0
  229. package/dist/integrations/pi/tui-runtime/input-presentation-coordinator.js +139 -0
  230. package/dist/{src/foundation/pi-tui-runtime-adapter → integrations/pi/tui-runtime}/presentation-adapter.d.ts +1 -1
  231. package/dist/native/darwin-arm64/manifest.json +4 -4
  232. package/dist/native/darwin-arm64/process-guardian +0 -0
  233. package/dist/native/linux-x64/manifest.json +3 -3
  234. package/dist/native/linux-x64/process-guardian +0 -0
  235. package/dist/native/win32-x64/manifest.json +3 -3
  236. package/dist/native/win32-x64/process-guardian.exe +0 -0
  237. package/dist/{src/product-identity.d.ts → product-identity.d.ts} +3 -3
  238. package/dist/{src/product-identity.js → product-identity.js} +7 -5
  239. package/dist/{src/product-identity.json → product-identity.json} +11 -6
  240. package/dist/runtime-payload-inventory.json +122328 -0
  241. package/dist/{src/foundation/ui-apps → ui/apps}/contracts.d.ts +23 -1
  242. package/dist/{src/foundation/ui-apps → ui/apps}/host.d.ts +1 -1
  243. package/dist/{src/foundation/ui-apps → ui/apps}/host.js +14 -10
  244. package/dist/{src/foundation/ui-apps → ui/apps}/registry.d.ts +1 -0
  245. package/dist/{src/foundation/ui-apps → ui/apps}/registry.js +1 -0
  246. package/dist/{src/foundation/ui-components → ui/components}/dialog-panel.js +5 -3
  247. package/dist/{src/foundation/ui-components → ui/components}/frame.d.ts +1 -0
  248. package/dist/{src/foundation/ui-components → ui/components}/frame.js +1 -0
  249. package/dist/{src/foundation/ui-components → ui/components}/index.d.ts +5 -0
  250. package/dist/{src/foundation/ui-components → ui/components}/index.js +5 -0
  251. package/dist/{src/foundation/ui-components → ui/components}/line-input.d.ts +1 -6
  252. package/dist/{src/foundation/ui-components → ui/components}/line-input.js +4 -9
  253. package/dist/{src/foundation/ui-components → ui/components}/list-view.d.ts +0 -6
  254. package/dist/{src/foundation/ui-components → ui/components}/list-view.js +14 -7
  255. package/dist/{src/foundation/ui-components → ui/components}/mouse.d.ts +10 -0
  256. package/dist/{src/foundation/ui-components → ui/components}/mouse.js +23 -0
  257. package/dist/ui/components/progress-status.d.ts +2 -0
  258. package/dist/ui/components/progress-status.js +4 -0
  259. package/dist/ui/components/prompt-row.d.ts +14 -0
  260. package/dist/ui/components/prompt-row.js +20 -0
  261. package/dist/{src/foundation/ui-components → ui/components}/scrollbar.d.ts +26 -0
  262. package/dist/{src/foundation/ui-components → ui/components}/scrollbar.js +35 -0
  263. package/dist/{src/foundation/ui-components → ui/components}/shortcuts.d.ts +1 -0
  264. package/dist/{src/foundation/ui-components → ui/components}/shortcuts.js +1 -0
  265. package/dist/ui/components/spans.d.ts +25 -0
  266. package/dist/ui/components/spans.js +257 -0
  267. package/dist/ui/components/submitted-prompt.d.ts +23 -0
  268. package/dist/ui/components/submitted-prompt.js +50 -0
  269. package/dist/{src/foundation/ui-components → ui/components}/surface.d.ts +0 -5
  270. package/dist/{src/foundation/ui-components → ui/components}/surface.js +1 -5
  271. package/dist/ui/components/text-selection.d.ts +62 -0
  272. package/dist/ui/components/text-selection.js +208 -0
  273. package/dist/{src/foundation/ui-components → ui/components}/text.d.ts +14 -0
  274. package/dist/{src/foundation/ui-components → ui/components}/text.js +66 -4
  275. package/dist/ui/components/transcript-viewport.d.ts +152 -0
  276. package/dist/ui/components/transcript-viewport.js +631 -0
  277. package/dist/ui/components/visible-hyperlinks.d.ts +19 -0
  278. package/dist/ui/components/visible-hyperlinks.js +64 -0
  279. package/dist/{src/foundation/owned-ui-settings → ui/settings}/declarations.d.ts +8 -1
  280. package/dist/{src/foundation/owned-ui-settings → ui/settings}/declarations.js +33 -5
  281. package/dist/{src/foundation/owned-ui-settings → ui/settings}/migrations.d.ts +1 -1
  282. package/dist/{src/foundation/owned-ui-settings → ui/settings}/migrations.js +21 -2
  283. package/dist/{src/foundation/owned-ui-settings → ui/settings}/sections.d.ts +6 -19
  284. package/dist/{src/foundation/owned-ui-settings → ui/settings}/sections.js +32 -23
  285. package/dist/{src/foundation/owned-ui-settings → ui/settings}/session.d.ts +9 -17
  286. package/dist/{src/foundation/owned-ui-settings → ui/settings}/session.js +65 -55
  287. package/dist/{src/foundation/owned-ui-settings → ui/settings}/store.d.ts +1 -0
  288. package/dist/{src/foundation/owned-ui-settings → ui/settings}/store.js +2 -1
  289. package/docs/architecture/boundaries.md +9 -9
  290. package/docs/architecture/code-documentation.md +77 -0
  291. package/docs/architecture/process-guardian-provenance.md +3 -1
  292. package/docs/architecture/project-structure.md +67 -30
  293. package/docs/architecture/resource-and-data-policy.md +1 -1
  294. package/docs/architecture/toolchain.md +10 -10
  295. package/docs/architecture/ui-reference-provenance.md +36 -5
  296. package/docs/ci-release-runbook.md +186 -79
  297. package/docs/features/launch-profiles.md +24 -17
  298. package/docs/manual-ghost-link-baseline.md +89 -0
  299. package/docs/manual-launch-instance-acceptance.md +12 -35
  300. package/docs/manual-owned-ui-checkpoint.md +78 -0
  301. package/docs/manual-pi-boundary-candidate.md +4 -5
  302. package/docs/manual-terminal-colour-check.md +4 -3
  303. package/docs/repository-governance-live-acceptance.md +77 -0
  304. package/package.json +37 -27
  305. package/dist/src/cli/capabilities.d.ts +0 -15
  306. package/dist/src/cli/dispatch.js +0 -177
  307. package/dist/src/cli/version-stats.js +0 -72
  308. package/dist/src/composition/index.d.ts +0 -48
  309. package/dist/src/composition/index.js +0 -258
  310. package/dist/src/features/launch/intent.d.ts +0 -7
  311. package/dist/src/features/launch/intent.js +0 -4
  312. package/dist/src/features/launch/profiles.d.ts +0 -12
  313. package/dist/src/features/launch/profiles.js +0 -26
  314. package/dist/src/foundation/lifecycle/paths.d.ts +0 -10
  315. package/dist/src/foundation/pi-component-adapter/shell-presenters-transcript.d.ts +0 -57
  316. package/dist/src/foundation/pi-engine-adapter/settings-integration.d.ts +0 -55
  317. package/dist/src/foundation/pi-owned-ui-integration/route-host.d.ts +0 -29
  318. package/dist/src/foundation/pi-owned-ui-integration/session-shell.d.ts +0 -106
  319. package/dist/src/foundation/release/cohort-state.d.ts +0 -70
  320. package/dist/src/foundation/release/cohort-state.js +0 -202
  321. package/dist/src/foundation/release/release-gc.d.ts +0 -5
  322. package/dist/src/foundation/release/release-gc.js +0 -16
  323. package/dist/src/foundation/supervision/index.d.ts +0 -3
  324. package/dist/src/foundation/supervision/index.js +0 -3
  325. package/dist/src/foundation/supervision/main.d.ts +0 -1
  326. package/dist/src/foundation/supervision/main.js +0 -41
  327. package/dist/src/foundation/supervision/paths.d.ts +0 -1
  328. package/dist/src/foundation/supervision/paths.js +0 -1
  329. package/dist/src/foundation/ui-components/spans.d.ts +0 -7
  330. package/dist/src/foundation/ui-components/spans.js +0 -59
  331. package/docs/manual-transparent-checkpoint.md +0 -53
  332. /package/dist/{src/cli → cli}/index.d.ts +0 -0
  333. /package/dist/{src/cli → cli}/index.js +0 -0
  334. /package/dist/{src/cli → cli}/version.d.ts +0 -0
  335. /package/dist/{src/cli → cli}/version.js +0 -0
  336. /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/capability-ports.js +0 -0
  337. /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/domain-validation.d.ts +0 -0
  338. /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/domain.js +0 -0
  339. /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/index.d.ts +0 -0
  340. /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/index.js +0 -0
  341. /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/model.d.ts +0 -0
  342. /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/model.js +0 -0
  343. /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/package-ports.js +0 -0
  344. /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/ports.d.ts +0 -0
  345. /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/ports.js +0 -0
  346. /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/serialization.d.ts +0 -0
  347. /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/serialization.js +0 -0
  348. /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/validation.d.ts +0 -0
  349. /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/validation.js +0 -0
  350. /package/dist/{src/foundation/owned-ui-contracts → contracts/owned-ui}/extension-ui.d.ts +0 -0
  351. /package/dist/{src/foundation/owned-ui-contracts → contracts/owned-ui}/extension-ui.js +0 -0
  352. /package/dist/{src/foundation/owned-ui-contracts → contracts/owned-ui}/index.d.ts +0 -0
  353. /package/dist/{src/foundation/owned-ui-contracts → contracts/owned-ui}/index.js +0 -0
  354. /package/dist/{src/foundation/owned-ui-contracts → contracts/owned-ui}/model.js +0 -0
  355. /package/dist/{src/foundation/owned-ui-contracts → contracts/owned-ui}/validation.d.ts +0 -0
  356. /package/dist/{src/foundation/presentation-contracts → contracts/presentation}/index.d.ts +0 -0
  357. /package/dist/{src/foundation/presentation-contracts → contracts/presentation}/index.js +0 -0
  358. /package/dist/{src/foundation/workspace-contracts → contracts/workspace}/index.d.ts +0 -0
  359. /package/dist/{src/foundation/workspace-contracts → contracts/workspace}/index.js +0 -0
  360. /package/dist/{src/foundation/workspace-contracts → contracts/workspace}/model.d.ts +0 -0
  361. /package/dist/{src/foundation/workspace-contracts → contracts/workspace}/model.js +0 -0
  362. /package/dist/{src/foundation/workspace-contracts → contracts/workspace}/validation.d.ts +0 -0
  363. /package/dist/{src/foundation/workspace-contracts → contracts/workspace}/validation.js +0 -0
  364. /package/dist/{src/features → features}/launch/development-launch.d.ts +0 -0
  365. /package/dist/{src/features → features}/launch/initialize-profile.d.ts +0 -0
  366. /package/dist/{src/features → features}/launch/initialize-profile.js +0 -0
  367. /package/dist/{src/features → features}/launch/runtime-selection.js +0 -0
  368. /package/dist/{src/features → features}/workspace/capabilities.js +0 -0
  369. /package/dist/{src/features → features}/workspace/index.d.ts +0 -0
  370. /package/dist/{src/features → features}/workspace/index.js +0 -0
  371. /package/dist/{src/features → features}/workspace/presentation.d.ts +0 -0
  372. /package/dist/{src/features → features}/workspace/presentation.js +0 -0
  373. /package/dist/{src/features → features}/workspace/reconciliation.d.ts +0 -0
  374. /package/dist/{src/features → features}/workspace/reconciliation.js +0 -0
  375. /package/dist/{src/foundation → foundation}/launch-guardian/index.d.ts +0 -0
  376. /package/dist/{src/foundation → foundation}/launch-guardian/index.js +0 -0
  377. /package/dist/{src/foundation → foundation}/lifecycle/commands.d.ts +0 -0
  378. /package/dist/{src/foundation → foundation}/lifecycle/commands.js +0 -0
  379. /package/dist/{src/foundation → foundation}/lifecycle/launch-instance.d.ts +0 -0
  380. /package/dist/{src/foundation → foundation}/lifecycle/launch-instance.js +0 -0
  381. /package/dist/{src/foundation → foundation}/native-host-protocol/evidence.d.ts +0 -0
  382. /package/dist/{src/foundation → foundation}/native-host-protocol/evidence.js +0 -0
  383. /package/dist/{src/foundation → foundation}/native-host-protocol/index.d.ts +0 -0
  384. /package/dist/{src/foundation → foundation}/native-host-protocol/index.js +0 -0
  385. /package/dist/{src/foundation → foundation}/native-host-protocol/proof-gate.d.ts +0 -0
  386. /package/dist/{src/foundation → foundation}/native-host-protocol/proof-gate.js +0 -0
  387. /package/dist/{src/foundation → foundation}/process-containment/artifact.d.ts +0 -0
  388. /package/dist/{src/foundation → foundation}/process-containment/artifact.js +0 -0
  389. /package/dist/{src/foundation → foundation}/process-containment/contracts.d.ts +0 -0
  390. /package/dist/{src/foundation → foundation}/process-containment/contracts.js +0 -0
  391. /package/dist/{src/foundation → foundation}/protocol/index.d.ts +0 -0
  392. /package/dist/{src/foundation → foundation}/protocol/index.js +0 -0
  393. /package/dist/{src/foundation → foundation}/release/cohort-selection.d.ts +0 -0
  394. /package/dist/{src/foundation → foundation}/release/cohort-selection.js +0 -0
  395. /package/dist/{src/foundation → foundation}/release/concurrency.d.ts +0 -0
  396. /package/dist/{src/foundation → foundation}/release/concurrency.js +0 -0
  397. /package/dist/{src/foundation → foundation}/release/process-cleanup.d.ts +0 -0
  398. /package/dist/{src/foundation → foundation}/release/process-cleanup.js +0 -0
  399. /package/dist/{src/foundation → foundation}/release/stable-release.d.ts +0 -0
  400. /package/dist/{src/foundation → foundation}/release/stable-release.js +0 -0
  401. /package/dist/{src/foundation → foundation}/storage/index.d.ts +0 -0
  402. /package/dist/{src/foundation → foundation}/storage/index.js +0 -0
  403. /package/dist/{src/foundation → foundation}/structured-agent-runtime/index.d.ts +0 -0
  404. /package/dist/{src/foundation → foundation}/structured-agent-runtime/index.js +0 -0
  405. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/components.js +0 -0
  406. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/resources/builtin-themes.d.ts +0 -0
  407. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/resources/builtin-themes.js +0 -0
  408. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/shell-editor-autocomplete.d.ts +0 -0
  409. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/shell-extension-ui.js +0 -0
  410. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/theme.d.ts +0 -0
  411. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/theme.js +0 -0
  412. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/countdown-timer.d.ts +0 -0
  413. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/countdown-timer.js +0 -0
  414. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/custom-entry.d.ts +0 -0
  415. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/custom-entry.js +0 -0
  416. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/daxnuts.d.ts +0 -0
  417. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/daxnuts.js +0 -0
  418. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/earendil-announcement.d.ts +0 -0
  419. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/earendil-announcement.js +0 -0
  420. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/extension-editor.d.ts +0 -0
  421. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/extension-editor.js +0 -0
  422. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/first-time-setup.d.ts +0 -0
  423. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/first-time-setup.js +0 -0
  424. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/markdown-transform.d.ts +0 -0
  425. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/markdown-transform.js +0 -0
  426. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/mermaid.d.ts +0 -0
  427. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/mermaid.js +0 -0
  428. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/owned-editor.d.ts +0 -0
  429. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/owned-editor.js +0 -0
  430. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/scoped-models-selector.d.ts +0 -0
  431. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/scoped-models-selector.js +0 -0
  432. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/session-footer.js +0 -0
  433. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/session-selector-search.d.ts +0 -0
  434. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/session-selector-search.js +0 -0
  435. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/session-selector.d.ts +0 -0
  436. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/session-selector.js +0 -0
  437. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/skill-invocation-message.d.ts +0 -0
  438. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/skill-invocation-message.js +0 -0
  439. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/status-indicator.d.ts +0 -0
  440. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/status-indicator.js +0 -0
  441. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/tree-selector.d.ts +0 -0
  442. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/tree-selector.js +0 -0
  443. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/trust-selector.d.ts +0 -0
  444. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/trust-selector.js +0 -0
  445. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/external-editor.d.ts +0 -0
  446. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/external-editor.js +0 -0
  447. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/model-search.d.ts +0 -0
  448. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/model-search.js +0 -0
  449. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/theme/theme-controller.d.ts +0 -0
  450. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/theme/theme-controller.js +0 -0
  451. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/theme/theme.d.ts +0 -0
  452. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/theme/theme.js +0 -0
  453. /package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/pi-settings-metadata.json +0 -0
  454. /package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/public-main-entry.d.ts +0 -0
  455. /package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/public-main-entry.js +0 -0
  456. /package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/workflows.js +0 -0
  457. /package/dist/{src/foundation/pi-owned-ui-integration → integrations/pi/session-ui}/route-host.js +0 -0
  458. /package/dist/{src/foundation/pi-tui-runtime-adapter → integrations/pi/tui-runtime}/conformance.d.ts +0 -0
  459. /package/dist/{src/foundation/pi-tui-runtime-adapter → integrations/pi/tui-runtime}/conformance.js +0 -0
  460. /package/dist/{src/foundation/pi-tui-runtime-adapter → integrations/pi/tui-runtime}/contracts.js +0 -0
  461. /package/dist/{src/foundation/pi-tui-runtime-adapter → integrations/pi/tui-runtime}/presentation-adapter.js +0 -0
  462. /package/dist/{src/foundation/ui-apps → ui/apps}/contracts.js +0 -0
  463. /package/dist/{src/foundation/ui-apps → ui/apps}/index.d.ts +0 -0
  464. /package/dist/{src/foundation/ui-apps → ui/apps}/index.js +0 -0
  465. /package/dist/{src/foundation/ui-components → ui/components}/dialog-panel.d.ts +0 -0
  466. /package/dist/{src/foundation/ui-components → ui/components}/label.d.ts +0 -0
  467. /package/dist/{src/foundation/ui-components → ui/components}/label.js +0 -0
  468. /package/dist/{src/foundation/ui-components → ui/components}/list-block.d.ts +0 -0
  469. /package/dist/{src/foundation/ui-components → ui/components}/list-block.js +0 -0
  470. /package/dist/{src/foundation/ui-components → ui/components}/pane.d.ts +0 -0
  471. /package/dist/{src/foundation/ui-components → ui/components}/pane.js +0 -0
  472. /package/dist/{src/foundation/ui-components → ui/components}/revision.d.ts +0 -0
  473. /package/dist/{src/foundation/ui-components → ui/components}/revision.js +0 -0
  474. /package/dist/{src/foundation/ui-components → ui/components}/status-line.d.ts +0 -0
  475. /package/dist/{src/foundation/ui-components → ui/components}/status-line.js +0 -0
  476. /package/dist/{src/foundation/ui-components → ui/components}/stepper.d.ts +0 -0
  477. /package/dist/{src/foundation/ui-components → ui/components}/stepper.js +0 -0
  478. /package/dist/{src/foundation/ui-components → ui/components}/theme.d.ts +0 -0
  479. /package/dist/{src/foundation/ui-components → ui/components}/theme.js +0 -0
  480. /package/dist/{src/foundation/ui-components → ui/components}/value-menu.d.ts +0 -0
  481. /package/dist/{src/foundation/ui-components → ui/components}/value-menu.js +0 -0
  482. /package/dist/{src/foundation/owned-ui-settings → ui/settings}/index.d.ts +0 -0
  483. /package/dist/{src/foundation/owned-ui-settings → ui/settings}/index.js +0 -0
  484. /package/dist/{src/foundation/owned-ui-settings → ui/settings}/resolution.d.ts +0 -0
  485. /package/dist/{src/foundation/owned-ui-settings → ui/settings}/resolution.js +0 -0
@@ -13,6 +13,7 @@ export declare const REQUIRED_PI_CAPABILITY_OPERATIONS: Readonly<{
13
13
  readonly workflows: readonly ["workflow.route", "workflow.validate", "workflow.diagnostics"];
14
14
  readonly disposal: readonly ["subscription.dispose", "session.dispose", "services.cleanup"];
15
15
  }>;
16
+ /** Identifies one required Pi capability operation that differs from the accepted integration contract. */
16
17
  export declare class PiCapabilityCompatibilityError extends Error {
17
18
  readonly packageVersion: string;
18
19
  readonly capability: string;
@@ -29,6 +30,7 @@ export interface PiUpgradeConformanceReport {
29
30
  readonly commandSurface: readonly string[];
30
31
  readonly capabilities: readonly PiCapabilityConformanceResult[];
31
32
  }
33
+ /** Identifies the public Pi SDK stage that failed during upgrade conformance. */
32
34
  export declare class PiUpgradeConformanceError extends Error {
33
35
  readonly stage: "exports" | "services" | "session";
34
36
  constructor(stage: "exports" | "services" | "session", cause: unknown);
@@ -2,8 +2,8 @@ import { mkdtemp, rm } from "node:fs/promises";
2
2
  import { tmpdir } from "node:os";
3
3
  import { join } from "node:path";
4
4
  import { createAgentSessionFromServices, createAgentSessionRuntime, createAgentSessionServices, ModelRuntime, SessionManager, VERSION, } from "@earendil-works/pi-coding-agent";
5
- import { OWNED_UI_CONTRACT_VERSION } from "../owned-ui-contracts/index.js";
6
- import { PRODUCT_IDENTITY } from "../../product-identity.js";
5
+ import { OWNED_UI_CONTRACT_VERSION } from "../../../contracts/owned-ui/index.js";
6
+ import { PRODUCT_IDENTITY } from "../../../product-identity.js";
7
7
  export const REQUIRED_PI_CAPABILITY_OPERATIONS = Object.freeze({
8
8
  "public-exports": ["services.create", "session.create", "runtime.create"],
9
9
  "session-lifecycle": ["session.new", "session.resume", "session.rebind", "session.dispose"],
@@ -14,6 +14,7 @@ export const REQUIRED_PI_CAPABILITY_OPERATIONS = Object.freeze({
14
14
  workflows: ["workflow.route", "workflow.validate", "workflow.diagnostics"],
15
15
  disposal: ["subscription.dispose", "session.dispose", "services.cleanup"],
16
16
  });
17
+ /** Identifies one required Pi capability operation that differs from the accepted integration contract. */
17
18
  export class PiCapabilityCompatibilityError extends Error {
18
19
  packageVersion;
19
20
  capability;
@@ -26,6 +27,7 @@ export class PiCapabilityCompatibilityError extends Error {
26
27
  this.name = "PiCapabilityCompatibilityError";
27
28
  }
28
29
  }
30
+ /** Identifies the public Pi SDK stage that failed during upgrade conformance. */
29
31
  export class PiUpgradeConformanceError extends Error {
30
32
  stage;
31
33
  constructor(stage, cause) {
@@ -0,0 +1,4 @@
1
+ /** Apply the profile's HTTP timeout to npm undici and its fetch globals. */
2
+ export declare function configureOwnedHttpDispatcher(timeoutMs: number): void;
3
+ /** Test and diagnostics seam; reports configured semantics, not the max-int implementation detail. */
4
+ export declare function configuredOwnedHttpIdleTimeoutMs(): number | null;
@@ -0,0 +1,25 @@
1
+ // Provenance: mechanically adapted from Pi commit 914cf14
2
+ // packages/coding-agent/src/core/http-dispatcher.ts (MIT).
3
+ // Local modifications: expose only A1's owned timeout seam and retain no private Pi imports.
4
+ import { EnvHttpProxyAgent, install, setGlobalDispatcher } from "undici";
5
+ const MAX_DISABLED_TIMEOUT_MS = 2_147_483_647;
6
+ let configuredTimeoutMs = null;
7
+ /** Apply the profile's HTTP timeout to npm undici and its fetch globals. */
8
+ export function configureOwnedHttpDispatcher(timeoutMs) {
9
+ if (!Number.isSafeInteger(timeoutMs) || timeoutMs < 0)
10
+ throw new TypeError("HTTP idle timeout is invalid");
11
+ const effectiveTimeoutMs = timeoutMs === 0 ? MAX_DISABLED_TIMEOUT_MS : timeoutMs;
12
+ const dispatcher = new EnvHttpProxyAgent({
13
+ allowH2: false,
14
+ bodyTimeout: effectiveTimeoutMs,
15
+ headersTimeout: effectiveTimeoutMs,
16
+ connect: { autoSelectFamilyAttemptTimeout: 2_000 },
17
+ });
18
+ setGlobalDispatcher(dispatcher);
19
+ install?.();
20
+ configuredTimeoutMs = timeoutMs;
21
+ }
22
+ /** Test and diagnostics seam; reports configured semantics, not the max-int implementation detail. */
23
+ export function configuredOwnedHttpIdleTimeoutMs() {
24
+ return configuredTimeoutMs;
25
+ }
@@ -1,9 +1,13 @@
1
1
  export * from "./adapter.js";
2
2
  export * from "./conformance.js";
3
3
  export * from "./runtime-integration.js";
4
+ export * from "./session-selection.js";
4
5
  export * from "./session-integration.js";
5
6
  export * from "./model-auth-integration.js";
6
7
  export * from "./settings-integration.js";
8
+ export * from "./settings-effects.js";
9
+ export * from "./project-trust-preflight.js";
10
+ export * from "./http-dispatcher.js";
7
11
  export * from "./package-integration.js";
8
12
  export * from "./resource-extension-integration.js";
9
13
  export * from "./workflow-controllers.js";
@@ -1,9 +1,13 @@
1
1
  export * from "./adapter.js";
2
2
  export * from "./conformance.js";
3
3
  export * from "./runtime-integration.js";
4
+ export * from "./session-selection.js";
4
5
  export * from "./session-integration.js";
5
6
  export * from "./model-auth-integration.js";
6
7
  export * from "./settings-integration.js";
8
+ export * from "./settings-effects.js";
9
+ export * from "./project-trust-preflight.js";
10
+ export * from "./http-dispatcher.js";
7
11
  export * from "./package-integration.js";
8
12
  export * from "./resource-extension-integration.js";
9
13
  export * from "./workflow-controllers.js";
@@ -1,5 +1,5 @@
1
1
  import type { ModelRuntime } from "@earendil-works/pi-coding-agent";
2
- import type { AgentAuthenticationPort, AgentModelDescriptor, AgentModelPort } from "../agent-engine-contracts/index.js";
2
+ import type { AgentAuthenticationPort, AgentModelDescriptor, AgentModelPort } from "../../../contracts/agent-engine/index.js";
3
3
  export type PiDocumentedModelRuntime = Pick<ModelRuntime, "getAvailableSnapshot" | "getModel" | "getProvider" | "hasConfiguredAuth" | "refresh" | "logout">;
4
4
  export interface PiModelAuthenticationOptions {
5
5
  readonly runtime: PiDocumentedModelRuntime;
@@ -9,6 +9,7 @@ export interface PiModelAuthenticationOptions {
9
9
  readonly timeoutMs?: number;
10
10
  readonly scopedModelIds?: () => readonly string[] | undefined;
11
11
  }
12
+ /** Adapts the pinned model runtime to neutral model selection and authentication operations. */
12
13
  export declare class PiModelAuthenticationIntegration implements AgentModelPort, AgentAuthenticationPort {
13
14
  #private;
14
15
  private readonly options;
@@ -1,3 +1,4 @@
1
+ /** Adapts the pinned model runtime to neutral model selection and authentication operations. */
1
2
  export class PiModelAuthenticationIntegration {
2
3
  options;
3
4
  capabilities = { selection: true, refresh: true, scopedCatalog: true, login: true, logout: true };
@@ -1,4 +1,4 @@
1
- import { type AgentPackagesPort, type AgentPackagesPortInput } from "../agent-engine-contracts/index.js";
1
+ import { type AgentPackagesPort, type AgentPackagesPortInput } from "../../../contracts/agent-engine/index.js";
2
2
  /**
3
3
  * Pinned Pi's package manager already takes the profile root as an argument, so
4
4
  * this binds it to the root A1 chose rather than to whatever the configuration-root
@@ -1,6 +1,6 @@
1
1
  import { join } from "node:path";
2
2
  import { DefaultPackageManager, ModelRuntime, SettingsManager } from "@earendil-works/pi-coding-agent";
3
- import { agentPackageOutcome, } from "../agent-engine-contracts/index.js";
3
+ import { agentPackageOutcome, } from "../../../contracts/agent-engine/index.js";
4
4
  const MODEL_REFRESH_TIMEOUT_MS = 15_000;
5
5
  /**
6
6
  * Pinned Pi's package manager already takes the profile root as an argument, so
@@ -15,21 +15,33 @@ const MODEL_REFRESH_TIMEOUT_MS = 15_000;
15
15
  */
16
16
  export function createPiPackagesPort(input) {
17
17
  const { profileRoot, cwd } = input;
18
- const settingsManager = SettingsManager.create(cwd, profileRoot, { projectTrusted: false });
19
- const packageManager = new DefaultPackageManager({ cwd, agentDir: profileRoot, settingsManager });
20
- packageManager.setProgressCallback(event => {
21
- if (event.type !== "start" || !event.message)
22
- return;
23
- input.onProgress?.({ operation: operationFor(event.action), message: event.message });
24
- });
25
- const configured = () => packageManager.listConfiguredPackages()
18
+ // Compatibility: model-only refresh bypasses package settings and their diagnostics, as Pi does.
19
+ let packageManager;
20
+ const manager = () => {
21
+ if (packageManager)
22
+ return packageManager;
23
+ const settingsManager = SettingsManager.create(cwd, profileRoot, { projectTrusted: false });
24
+ for (const { scope, error } of settingsManager.drainErrors()) {
25
+ input.onDiagnostic?.({
26
+ message: `Warning (package command, ${scope} settings): ${error.message}`,
27
+ ...(error.stack ? { detail: error.stack } : {}),
28
+ });
29
+ }
30
+ packageManager = new DefaultPackageManager({ cwd, agentDir: profileRoot, settingsManager });
31
+ packageManager.setProgressCallback(event => {
32
+ if (event.type !== "start")
33
+ return;
34
+ input.onProgress?.({ operation: operationFor(event.action), message: String(event.message) });
35
+ });
36
+ return packageManager;
37
+ };
38
+ const configured = () => manager().listConfiguredPackages()
26
39
  .filter(entry => entry.scope === "user")
27
40
  .map(entry => Object.freeze({
28
41
  source: entry.source,
29
42
  installedPath: entry.installedPath ?? null,
30
43
  filtered: entry.filtered,
31
44
  }));
32
- const isConfigured = (source) => configured().some(entry => entry.source === source || entry.source.startsWith(`${source}@`));
33
45
  return Object.freeze({
34
46
  capabilities: Object.freeze({ install: true, remove: true, update: true, refreshModels: true }),
35
47
  profileRoot,
@@ -38,13 +50,13 @@ export function createPiPackagesPort(input) {
38
50
  },
39
51
  async install(source) {
40
52
  return await attempt("install", source, async () => {
41
- await packageManager.installAndPersist(source);
53
+ await manager().installAndPersist(source);
42
54
  return agentPackageOutcome("install", "completed", null, source, configured());
43
55
  });
44
56
  },
45
57
  async remove(source) {
46
58
  return await attempt("remove", source, async () => {
47
- const removed = await packageManager.removeAndPersist(source);
59
+ const removed = await manager().removeAndPersist(source);
48
60
  if (!removed)
49
61
  return agentPackageOutcome("remove", "not-found", null, source);
50
62
  return agentPackageOutcome("remove", "completed", null, source, configured());
@@ -52,11 +64,8 @@ export function createPiPackagesPort(input) {
52
64
  },
53
65
  async update(source) {
54
66
  return await attempt("update", source ?? null, async () => {
55
- // Asking first keeps "that package is not installed here" a structural
56
- // answer rather than a string a caller would have to recognize.
57
- if (source !== undefined && !isConfigured(source))
58
- return agentPackageOutcome("update", "not-found", null, source);
59
- await packageManager.update(source);
67
+ // Compatibility: Pi owns source identity and its contextual no-match suggestions.
68
+ await manager().update(source);
60
69
  return agentPackageOutcome("update", "completed", null, source ?? null, configured());
61
70
  });
62
71
  },
@@ -73,7 +82,9 @@ async function attempt(operation, source, run) {
73
82
  return await run();
74
83
  }
75
84
  catch (error) {
76
- return agentPackageOutcome(operation, "failed", describe(error), source);
85
+ const detail = error instanceof Error ? error.message : operation === "refresh-models"
86
+ ? "Unknown model catalog refresh error" : "Unknown package command error";
87
+ return agentPackageOutcome(operation, "failed", detail, source);
77
88
  }
78
89
  }
79
90
  async function refreshModelCatalogs(profileRoot) {
@@ -88,9 +99,10 @@ async function refreshModelCatalogs(profileRoot) {
88
99
  });
89
100
  const result = await modelRuntime.refresh({ allowNetwork: true, force: true, signal: controller.signal });
90
101
  if (result.aborted)
91
- throw new Error(`model catalog refresh timed out after ${MODEL_REFRESH_TIMEOUT_MS}ms`);
102
+ throw new Error("Model catalog refresh timed out.");
92
103
  if (result.errors.size > 0) {
93
- throw new Error(Array.from(result.errors, ([provider, error]) => `${provider}: ${error.message}`).join("; "));
104
+ const details = Array.from(result.errors, ([provider, error]) => `${provider}: ${error.message}`).join("; ");
105
+ throw new Error(`Could not refresh model catalogs: ${details}`);
94
106
  }
95
107
  }
96
108
  finally {
@@ -104,9 +116,3 @@ function operationFor(action) {
104
116
  return "remove";
105
117
  return "update";
106
118
  }
107
- function describe(error) {
108
- const message = (error instanceof Error ? error.message : String(error)).replace(/\s+/g, " ").trim();
109
- if (message.length === 0)
110
- return "unknown package failure";
111
- return message.length > 600 ? `${message.slice(0, 597)}...` : message;
112
- }
@@ -0,0 +1,22 @@
1
+ export interface PiProjectTrustPreflightRequest {
2
+ readonly cwd: string;
3
+ readonly defaultDecision: "ask" | "always" | "never";
4
+ }
5
+ export type PiProjectTrustPreflightPrompt = (request: PiProjectTrustPreflightRequest) => Promise<boolean | null>;
6
+ export interface PiProjectTrustPreflightResult {
7
+ readonly trusted: boolean;
8
+ readonly source: "no-project-resources" | "saved" | "default" | "interactive" | "fail-closed";
9
+ readonly diagnostic: string | null;
10
+ }
11
+ export interface ResolvePiProjectTrustPreflightOptions {
12
+ readonly cwd: string;
13
+ readonly agentDir: string;
14
+ readonly prompt?: PiProjectTrustPreflightPrompt;
15
+ readonly hasProjectResources?: (cwd: string) => boolean;
16
+ }
17
+ /**
18
+ * Resolves trust from global state only. It never constructs a project-trusted
19
+ * settings manager or resource loader; callers may do that only after this
20
+ * result exists.
21
+ */
22
+ export declare function resolvePiProjectTrustPreflight(options: ResolvePiProjectTrustPreflightOptions): Promise<PiProjectTrustPreflightResult>;
@@ -0,0 +1,50 @@
1
+ import { hasTrustRequiringProjectResources, ProjectTrustStore, SettingsManager, } from "@earendil-works/pi-coding-agent";
2
+ /**
3
+ * Resolves trust from global state only. It never constructs a project-trusted
4
+ * settings manager or resource loader; callers may do that only after this
5
+ * result exists.
6
+ */
7
+ export async function resolvePiProjectTrustPreflight(options) {
8
+ const hasProjectResources = options.hasProjectResources ?? hasTrustRequiringProjectResources;
9
+ if (!hasProjectResources(options.cwd)) {
10
+ return { trusted: true, source: "no-project-resources", diagnostic: null };
11
+ }
12
+ const trustStore = new ProjectTrustStore(options.agentDir);
13
+ const saved = trustStore.get(options.cwd);
14
+ if (saved !== null)
15
+ return { trusted: saved, source: "saved", diagnostic: null };
16
+ // Security: projectTrusted:false is the boundary: this read may see global
17
+ // settings but cannot consume project settings or construct project resources.
18
+ const globalSettings = SettingsManager.create(options.cwd, options.agentDir, { projectTrusted: false });
19
+ const fallback = globalSettings.getDefaultProjectTrust();
20
+ if (fallback === "always")
21
+ return { trusted: true, source: "default", diagnostic: null };
22
+ if (fallback === "never")
23
+ return { trusted: false, source: "default", diagnostic: null };
24
+ if (options.prompt === undefined) {
25
+ return {
26
+ trusted: false,
27
+ source: "fail-closed",
28
+ diagnostic: `Project resources in ${options.cwd} were withheld because trust requires interaction`,
29
+ };
30
+ }
31
+ try {
32
+ const decision = await options.prompt({ cwd: options.cwd, defaultDecision: fallback });
33
+ if (decision === null) {
34
+ return {
35
+ trusted: false,
36
+ source: "fail-closed",
37
+ diagnostic: `Project resources in ${options.cwd} were withheld because trust selection was cancelled`,
38
+ };
39
+ }
40
+ trustStore.set(options.cwd, decision);
41
+ return { trusted: decision, source: "interactive", diagnostic: null };
42
+ }
43
+ catch (error) {
44
+ return {
45
+ trusted: false,
46
+ source: "fail-closed",
47
+ diagnostic: `Project resources in ${options.cwd} were withheld because trust resolution failed: ${error instanceof Error ? error.message : String(error)}`,
48
+ };
49
+ }
50
+ }
@@ -1,10 +1,11 @@
1
1
  import type { AgentSession } from "@earendil-works/pi-coding-agent";
2
- import type { AgentExtensionBinding, AgentExtensionFailure, AgentExtensionPort, AgentResourceDescriptor, AgentResourcesPort, AgentSessionMetadata } from "../agent-engine-contracts/index.js";
2
+ import type { AgentExtensionBinding, AgentExtensionFailure, AgentExtensionPort, AgentResourceDescriptor, AgentResourcesPort, AgentSessionMetadata } from "../../../contracts/agent-engine/index.js";
3
3
  export interface PiResourceExtensionOptions {
4
4
  readonly session: AgentSession;
5
5
  readonly bindUi: () => Promise<void>;
6
6
  readonly unbindUi: () => Promise<void>;
7
7
  }
8
+ /** Adapts Pi resource discovery and extension binding while containing extension failures at the port. */
8
9
  export declare class PiResourceExtensionIntegration implements AgentResourcesPort, AgentExtensionPort {
9
10
  #private;
10
11
  private readonly options;
@@ -1,3 +1,4 @@
1
+ /** Adapts Pi resource discovery and extension binding while containing extension failures at the port. */
1
2
  export class PiResourceExtensionIntegration {
2
3
  options;
3
4
  capabilities = { reload: true, extensionBinding: true, binding: true, renderers: true };
@@ -1,8 +1,20 @@
1
- import { type AgentSession, type AgentSessionRuntime, type AgentSessionServices, type ScopedModel } from "@earendil-works/pi-coding-agent";
1
+ import { createAgentSessionServices, SettingsManager, type AgentSession, type AgentSessionRuntime, type AgentSessionServices, type ScopedModel } from "@earendil-works/pi-coding-agent";
2
+ import { resolvePiProjectTrustPreflight, type PiProjectTrustPreflightPrompt } from "./project-trust-preflight.js";
3
+ import { type PiSessionForkPrompt, type PiSessionSelection } from "./session-selection.js";
2
4
  export interface PiRuntimeIntegrationOptions {
3
5
  readonly cwd: string;
4
6
  readonly agentDir: string;
5
7
  readonly sessionDir?: string;
8
+ readonly sessionPath?: string;
9
+ readonly sessionSelection?: PiSessionSelection;
10
+ readonly sessionForkPrompt?: PiSessionForkPrompt;
11
+ readonly projectTrustPrompt?: PiProjectTrustPreflightPrompt;
12
+ readonly preflightDependencies?: PiRuntimePreflightDependencies;
13
+ }
14
+ export interface PiRuntimePreflightDependencies {
15
+ readonly resolveTrust?: typeof resolvePiProjectTrustPreflight;
16
+ readonly createSettingsManager?: (cwd: string, agentDir: string, projectTrusted: boolean) => SettingsManager;
17
+ readonly createServices?: typeof createAgentSessionServices;
6
18
  }
7
19
  export type PiSessionReplacement = {
8
20
  readonly kind: "new";
@@ -26,6 +38,12 @@ interface ConfiguredModelScope {
26
38
  * saved default when it is in scope, otherwise the first scoped model.
27
39
  */
28
40
  export declare function resolveConfiguredModelScope(services: Pick<AgentSessionServices, "settingsManager" | "modelRuntime">): Promise<ConfiguredModelScope>;
41
+ export declare function createPiRuntimeServicesAfterTrust(options: Pick<PiRuntimeIntegrationOptions, "agentDir" | "projectTrustPrompt" | "preflightDependencies"> & {
42
+ readonly cwd: string;
43
+ }): Promise<{
44
+ readonly services: AgentSessionServices;
45
+ readonly trust: Awaited<ReturnType<typeof resolvePiProjectTrustPreflight>>;
46
+ }>;
29
47
  export declare function createPiRuntimeIntegration(options: PiRuntimeIntegrationOptions): Promise<AgentSessionRuntime>;
30
48
  export declare function bindPiRuntimeSession(runtime: AgentSessionRuntime, rebind: (session: AgentSession) => Promise<void>): () => void;
31
49
  export declare function replacePiRuntimeSession(runtime: AgentSessionRuntime, replacement: PiSessionReplacement): Promise<{
@@ -1,4 +1,7 @@
1
- import { createAgentSessionFromServices, createAgentSessionRuntime, createAgentSessionServices, resolveModelScopeWithDiagnostics, SessionManager, } from "@earendil-works/pi-coding-agent";
1
+ import { createAgentSessionFromServices, createAgentSessionRuntime, createAgentSessionServices, resolveModelScopeWithDiagnostics, SessionManager, SettingsManager, } from "@earendil-works/pi-coding-agent";
2
+ import { resolvePiProjectTrustPreflight, } from "./project-trust-preflight.js";
3
+ import { openSelectedPiSession, resolveSessionArgumentPath } from "./session-selection.js";
4
+ import { markStartupPhase } from "../../../foundation/startup/index.js";
2
5
  /**
3
6
  * Mirrors pinned Pi's CLI startup: resolve the `models` patterns from settings
4
7
  * into a scoped model list, keep the resolver's warnings (e.g. "No models match
@@ -29,10 +32,41 @@ export async function resolveConfiguredModelScope(services) {
29
32
  diagnostics: diagnostics.map(diagnostic => ({ type: diagnostic.type, message: diagnostic.message })),
30
33
  };
31
34
  }
35
+ export async function createPiRuntimeServicesAfterTrust(options) {
36
+ const resolveTrust = options.preflightDependencies?.resolveTrust ?? resolvePiProjectTrustPreflight;
37
+ const createSettingsManager = options.preflightDependencies?.createSettingsManager
38
+ ?? ((targetCwd, agentDir, projectTrusted) => SettingsManager.create(targetCwd, agentDir, { projectTrusted }));
39
+ const createServices = options.preflightDependencies?.createServices ?? createAgentSessionServices;
40
+ const trust = await resolveTrust({
41
+ cwd: options.cwd,
42
+ agentDir: options.agentDir,
43
+ ...(options.projectTrustPrompt === undefined ? {} : { prompt: options.projectTrustPrompt }),
44
+ });
45
+ const settingsManager = createSettingsManager(options.cwd, options.agentDir, trust.trusted);
46
+ await markStartupPhase(process.env, "settings-loaded");
47
+ const services = await createServices({ cwd: options.cwd, agentDir: options.agentDir, settingsManager });
48
+ await markStartupPhase(process.env, "pi-services");
49
+ await markStartupPhase(process.env, "resource-discovery");
50
+ return { services, trust };
51
+ }
32
52
  export async function createPiRuntimeIntegration(options) {
33
- const sessionManager = SessionManager.create(options.cwd, options.sessionDir ?? process.env.PI_CODING_AGENT_SESSION_DIR);
53
+ const directory = options.sessionDir ?? process.env.PI_CODING_AGENT_SESSION_DIR;
54
+ const sessionDir = directory === undefined ? undefined : resolveSessionArgumentPath(directory, options.cwd);
55
+ const selection = options.sessionSelection ?? (options.sessionPath === undefined ? undefined : { target: resolveSessionArgumentPath(options.sessionPath, options.cwd) });
56
+ const sessionManager = selection === undefined
57
+ ? SessionManager.create(options.cwd, sessionDir)
58
+ : await openSelectedPiSession({
59
+ cwd: options.cwd, selection,
60
+ ...(sessionDir === undefined ? {} : { sessionDir }),
61
+ ...(options.sessionForkPrompt === undefined ? {} : { forkPrompt: options.sessionForkPrompt }),
62
+ });
34
63
  const createRuntime = async ({ cwd, sessionManager: targetSessionManager, sessionStartEvent, }) => {
35
- const services = await createAgentSessionServices({ cwd, agentDir: options.agentDir });
64
+ const { services, trust } = await createPiRuntimeServicesAfterTrust({
65
+ cwd,
66
+ agentDir: options.agentDir,
67
+ ...(options.projectTrustPrompt === undefined ? {} : { projectTrustPrompt: options.projectTrustPrompt }),
68
+ ...(options.preflightDependencies === undefined ? {} : { preflightDependencies: options.preflightDependencies }),
69
+ });
36
70
  const modelScope = await resolveConfiguredModelScope(services);
37
71
  const hasExistingSession = targetSessionManager.buildSessionContext().messages.length > 0;
38
72
  const created = await createAgentSessionFromServices({
@@ -43,10 +77,18 @@ export async function createPiRuntimeIntegration(options) {
43
77
  ...(modelScope.thinkingLevel && !hasExistingSession ? { thinkingLevel: modelScope.thinkingLevel } : {}),
44
78
  ...(modelScope.scopedModels.length > 0 ? { scopedModels: [...modelScope.scopedModels] } : {}),
45
79
  });
46
- return { ...created, services, diagnostics: [...modelScope.diagnostics] };
80
+ await markStartupPhase(process.env, "session-created");
81
+ return {
82
+ ...created,
83
+ services,
84
+ diagnostics: [
85
+ ...(trust.diagnostic === null ? [] : [{ type: "warning", message: trust.diagnostic }]),
86
+ ...modelScope.diagnostics,
87
+ ],
88
+ };
47
89
  };
48
90
  return createAgentSessionRuntime(createRuntime, {
49
- cwd: options.cwd,
91
+ cwd: sessionManager.getCwd(),
50
92
  agentDir: options.agentDir,
51
93
  sessionManager,
52
94
  });
@@ -1,5 +1,5 @@
1
- import type { AgentSession, AgentSessionEvent } from "@earendil-works/pi-coding-agent";
2
- import { type AgentCommandOutcome, type AgentEvent } from "../agent-engine-contracts/index.js";
1
+ import type { AgentSession, AgentSessionEvent, PromptOptions } from "@earendil-works/pi-coding-agent";
2
+ import { type AgentCommandOutcome, type AgentEvent } from "../../../contracts/agent-engine/index.js";
3
3
  export interface PiDocumentedSessionCommands {
4
4
  readonly isStreaming: AgentSession["isStreaming"];
5
5
  readonly isRetrying: AgentSession["isRetrying"];
@@ -18,6 +18,7 @@ export interface PiDocumentedSessionCommands {
18
18
  export type PiSessionCommand = {
19
19
  readonly type: "prompt" | "steer" | "follow-up";
20
20
  readonly text: string;
21
+ readonly images?: NonNullable<PromptOptions["images"]>;
21
22
  } | {
22
23
  readonly type: "abort" | "retry" | "compact";
23
24
  } | {
@@ -30,6 +31,7 @@ export interface PiSessionCommandResult {
30
31
  readonly outcome: AgentCommandOutcome;
31
32
  readonly value?: unknown;
32
33
  }
34
+ /** Routes neutral session commands to Pi while preserving Pi streaming and retry semantics. */
33
35
  export declare class PiSessionCommandIntegration {
34
36
  #private;
35
37
  private readonly session;
@@ -1,4 +1,5 @@
1
- import { AGENT_ENGINE_CONTRACT_VERSION, } from "../agent-engine-contracts/index.js";
1
+ import { AGENT_ENGINE_CONTRACT_VERSION, } from "../../../contracts/agent-engine/index.js";
2
+ /** Routes neutral session commands to Pi while preserving Pi streaming and retry semantics. */
2
3
  export class PiSessionCommandIntegration {
3
4
  session;
4
5
  #lastPrompt = null;
@@ -9,15 +10,29 @@ export class PiSessionCommandIntegration {
9
10
  switch (command.type) {
10
11
  case "prompt":
11
12
  this.#lastPrompt = command.text;
12
- await this.session.prompt(command.text, this.session.isStreaming ? { streamingBehavior: "followUp" } : undefined);
13
+ await this.session.prompt(command.text, command.images === undefined
14
+ ? this.session.isStreaming ? { streamingBehavior: "followUp" } : undefined
15
+ : {
16
+ ...(this.session.isStreaming ? { streamingBehavior: "followUp" } : {}),
17
+ images: [...command.images],
18
+ });
13
19
  return { outcome: "completed" };
14
20
  case "steer":
15
21
  this.#lastPrompt = command.text;
16
- await this.session.steer(command.text);
22
+ // Compatibility: match interactive Pi: prompt() owns template/extension expansion and
23
+ // turns the accepted steering message into the visible user row while
24
+ // later messages remain in the pending queue.
25
+ await this.session.prompt(command.text, {
26
+ streamingBehavior: "steer",
27
+ ...(command.images === undefined ? {} : { images: [...command.images] }),
28
+ });
17
29
  return { outcome: "completed" };
18
30
  case "follow-up":
19
31
  this.#lastPrompt = command.text;
20
- await this.session.followUp(command.text);
32
+ await this.session.prompt(command.text, {
33
+ streamingBehavior: "followUp",
34
+ ...(command.images === undefined ? {} : { images: [...command.images] }),
35
+ });
21
36
  return { outcome: "completed" };
22
37
  case "abort":
23
38
  if (this.session.isRetrying)
@@ -0,0 +1,28 @@
1
+ import { SessionManager, type SessionInfo } from "@earendil-works/pi-coding-agent";
2
+ export interface PiSessionSelection {
3
+ readonly target: string;
4
+ readonly sessionDir?: string;
5
+ }
6
+ export type PiSessionForkPrompt = (request: {
7
+ readonly sourceCwd: string;
8
+ }) => Promise<boolean>;
9
+ /** Expected resume outcomes are concise CLI diagnostics, not engine crashes. */
10
+ export declare class PiSessionSelectionError extends Error {
11
+ readonly exitCode: number;
12
+ constructor(message: string, exitCode?: number);
13
+ }
14
+ interface SessionSelectionOptions {
15
+ readonly cwd: string;
16
+ readonly selection: PiSessionSelection;
17
+ readonly sessionDir?: string;
18
+ readonly forkPrompt?: PiSessionForkPrompt;
19
+ /** Public API seam for deterministic lookup/open race and listing-order evidence. */
20
+ readonly sessions?: Pick<typeof SessionManager, "list" | "open" | "forkFrom"> & {
21
+ readonly listAll: (sessionDir?: string) => Promise<SessionInfo[]>;
22
+ };
23
+ }
24
+ /** Pinned Pi 0.84.2 main.ts policy, using SDK APIs rather than importing the CLI. */
25
+ export declare function openSelectedPiSession(options: SessionSelectionOptions): Promise<SessionManager>;
26
+ /** Resolve before switching effective cwd, including quoted home-relative paths. */
27
+ export declare function resolveSessionArgumentPath(path: string, cwd: string): string;
28
+ export {};
@@ -0,0 +1,90 @@
1
+ import { accessSync, constants, existsSync, realpathSync, statSync } from "node:fs";
2
+ import { homedir } from "node:os";
3
+ import { resolve } from "node:path";
4
+ import { SessionManager } from "@earendil-works/pi-coding-agent";
5
+ /** Expected resume outcomes are concise CLI diagnostics, not engine crashes. */
6
+ export class PiSessionSelectionError extends Error {
7
+ exitCode;
8
+ constructor(message, exitCode = 1) {
9
+ super(message);
10
+ this.exitCode = exitCode;
11
+ this.name = "PiSessionSelectionError";
12
+ }
13
+ }
14
+ /** Pinned Pi 0.84.2 main.ts policy, using SDK APIs rather than importing the CLI. */
15
+ export async function openSelectedPiSession(options) {
16
+ try {
17
+ const sessions = options.sessions ?? SessionManager;
18
+ const cwd = resolve(options.cwd);
19
+ const directory = options.selection.sessionDir ?? options.sessionDir ?? process.env.PI_CODING_AGENT_SESSION_DIR;
20
+ const sessionDir = directory === undefined ? undefined : resolveSessionArgumentPath(directory, cwd);
21
+ const target = options.selection.target;
22
+ let path;
23
+ let global;
24
+ if (target.includes("/") || target.includes("\\") || target.endsWith(".jsonl")) {
25
+ path = resolveSessionArgumentPath(target, cwd);
26
+ }
27
+ else {
28
+ const local = matchSession(await sessions.list(cwd, sessionDir), target);
29
+ const globalMatch = local ? undefined : matchSession(await sessions.listAll(sessionDir), target);
30
+ // Compatibility: macOS may expose one temporary directory as /var to one process
31
+ // and /private/var to another. Physical path identity must not turn that alias into
32
+ // a cross-project fork prompt.
33
+ global = globalMatch && !sameProjectDirectory(globalMatch.cwd, cwd) ? globalMatch : undefined;
34
+ const matched = local ?? globalMatch;
35
+ if (!matched)
36
+ throw new PiSessionSelectionError(`No session found matching '${target}'`);
37
+ path = matched.path;
38
+ }
39
+ assertResumeFile(path);
40
+ if (global) {
41
+ if (!options.forkPrompt || !await options.forkPrompt({ sourceCwd: global.cwd })) {
42
+ throw new PiSessionSelectionError("Session resume cancelled.", 0);
43
+ }
44
+ assertResumeFile(path);
45
+ assertCwd(cwd);
46
+ return sessions.forkFrom(path, cwd, sessionDir);
47
+ }
48
+ // Invariant: no await between the final guard and SDK open. A disappeared target
49
+ // can otherwise produce a new in-memory header instead of an existing session.
50
+ const manager = sessions.open(path, sessionDir);
51
+ assertResumeFile(path);
52
+ assertCwd(manager.getCwd());
53
+ return manager;
54
+ }
55
+ catch (error) {
56
+ if (error instanceof PiSessionSelectionError)
57
+ throw error;
58
+ throw new PiSessionSelectionError(`Could not resume session: ${error instanceof Error ? error.message : String(error)}`);
59
+ }
60
+ }
61
+ function sameProjectDirectory(left, right) {
62
+ try {
63
+ const first = realpathSync.native(resolve(left));
64
+ const second = realpathSync.native(resolve(right));
65
+ return process.platform === "win32" ? first.toLowerCase() === second.toLowerCase() : first === second;
66
+ }
67
+ catch {
68
+ return resolve(left) === resolve(right);
69
+ }
70
+ }
71
+ function matchSession(sessions, target) {
72
+ return sessions.find(session => session.id === target) ?? sessions.find(session => session.id.startsWith(target));
73
+ }
74
+ /** Resolve before switching effective cwd, including quoted home-relative paths. */
75
+ export function resolveSessionArgumentPath(path, cwd) {
76
+ const expanded = path === "~" ? homedir() : /^~[/\\]/.test(path) ? resolve(homedir(), path.slice(2)) : path;
77
+ return resolve(cwd, expanded);
78
+ }
79
+ function assertResumeFile(path) {
80
+ if (!existsSync(path))
81
+ throw new PiSessionSelectionError(`Session file does not exist: ${path}`);
82
+ const metadata = statSync(path);
83
+ if (!metadata.isFile() || metadata.size === 0)
84
+ throw new PiSessionSelectionError(`Session file is empty or not a regular file: ${path}`);
85
+ accessSync(path, constants.R_OK);
86
+ }
87
+ function assertCwd(cwd) {
88
+ if (!existsSync(cwd) || !statSync(cwd).isDirectory())
89
+ throw new PiSessionSelectionError(`Session working directory does not exist: ${cwd}`);
90
+ }