@timurproko/a1 0.1.8-dev.21b95d6 → 0.1.8-dev.226

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 (461) hide show
  1. package/README.md +107 -67
  2. package/bin/cli.js +28 -10
  3. package/bin/guardian.js +4 -1
  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 +1 -1
  9. package/bin/sync-pi-tui-proxy.js +97 -0
  10. package/bin/ui.js +25 -6
  11. package/bin/warmup.js +18 -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 +6 -0
  15. package/dist/cli/dispatch.js +202 -0
  16. package/dist/{src/cli → cli}/packages.d.ts +10 -2
  17. package/dist/{src/cli → cli}/packages.js +24 -20
  18. package/dist/{src/cli → cli}/version-stats.d.ts +6 -0
  19. package/dist/cli/version-stats.js +112 -0
  20. package/dist/composition/agent-engine-bridge.d.ts +3 -0
  21. package/dist/composition/agent-engine-bridge.js +108 -0
  22. package/dist/composition/index.d.ts +3 -0
  23. package/dist/composition/index.js +3 -0
  24. package/dist/composition/owned-ui.d.ts +28 -0
  25. package/dist/composition/owned-ui.js +64 -0
  26. package/dist/composition/process.d.ts +16 -0
  27. package/dist/composition/process.js +45 -0
  28. package/dist/composition/settings-route-host.d.ts +8 -0
  29. package/dist/composition/settings-route-host.js +75 -0
  30. package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/capability-ports.d.ts +2 -2
  31. package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/domain-validation.js +22 -4
  32. package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/domain.d.ts +17 -0
  33. package/dist/{src/foundation/owned-ui-contracts → contracts/owned-ui}/model.d.ts +36 -0
  34. package/dist/{src/foundation/owned-ui-contracts → contracts/owned-ui}/validation.js +25 -0
  35. package/dist/{src/features → features}/launch/development-launch.js +11 -3
  36. package/dist/{src/features → features}/launch/index.d.ts +0 -1
  37. package/dist/{src/features → features}/launch/index.js +0 -1
  38. package/dist/{src/features → features}/launch/intent.d.ts +3 -2
  39. package/dist/features/launch/intent.js +3 -0
  40. package/dist/{src/features → features}/launch/prepare-launch.d.ts +0 -2
  41. package/dist/{src/features → features}/launch/prepare-launch.js +2 -9
  42. package/dist/{src/features → features}/launch/profile-paths.d.ts +1 -2
  43. package/dist/{src/features → features}/launch/profile-paths.js +2 -8
  44. package/dist/{src/features → features}/launch/runtime-selection.d.ts +2 -5
  45. package/dist/{src/features → features}/owned-ui/customization.d.ts +3 -1
  46. package/dist/{src/features → features}/owned-ui/customization.js +3 -1
  47. package/dist/{src/features → features}/owned-ui/diagnostics.d.ts +2 -1
  48. package/dist/{src/features → features}/owned-ui/diagnostics.js +1 -0
  49. package/dist/{src/features → features}/owned-ui/index.d.ts +1 -0
  50. package/dist/{src/features → features}/owned-ui/index.js +1 -0
  51. package/dist/features/owned-ui/project-trust-prompt.d.ts +25 -0
  52. package/dist/features/owned-ui/project-trust-prompt.js +149 -0
  53. package/dist/{src/features → features}/owned-ui/run.d.ts +2 -2
  54. package/dist/{src/features → features}/owned-ui/run.js +2 -0
  55. package/dist/{src/features → features}/owned-ui/settings-app.d.ts +3 -3
  56. package/dist/{src/features → features}/owned-ui/settings-app.js +103 -54
  57. package/dist/{src/features → features}/workspace/capabilities.d.ts +1 -1
  58. package/dist/{src/features → features}/workspace/reducer.d.ts +2 -1
  59. package/dist/{src/features → features}/workspace/reducer.js +2 -1
  60. package/dist/{src/features → features}/workspace/router.d.ts +2 -1
  61. package/dist/{src/features → features}/workspace/router.js +1 -0
  62. package/dist/{src/features → features}/workspace/store.d.ts +2 -1
  63. package/dist/{src/features → features}/workspace/store.js +1 -0
  64. package/dist/{src/foundation → foundation}/launch-guardian/main.js +10 -2
  65. package/dist/{src/foundation → foundation}/lifecycle/model.d.ts +1 -1
  66. package/dist/{src/foundation → foundation}/lifecycle/model.js +1 -1
  67. package/dist/foundation/lifecycle/paths.d.ts +28 -0
  68. package/dist/{src/foundation → foundation}/lifecycle/paths.js +21 -0
  69. package/dist/{src/foundation → foundation}/native-host-protocol/codec.d.ts +2 -0
  70. package/dist/{src/foundation → foundation}/native-host-protocol/codec.js +2 -0
  71. package/dist/{src/foundation → foundation}/native-host-protocol/messages.d.ts +1 -1
  72. package/dist/{src/foundation → foundation}/native-host-protocol/messages.js +1 -1
  73. package/dist/{src/foundation → foundation}/process-containment/linux-process-inspector.d.ts +1 -0
  74. package/dist/{src/foundation → foundation}/process-containment/linux-process-inspector.js +1 -0
  75. package/dist/{src/foundation → foundation}/process-containment/native-guardian-containment.d.ts +1 -0
  76. package/dist/{src/foundation → foundation}/process-containment/native-guardian-containment.js +1 -0
  77. package/dist/{src/foundation → foundation}/process-containment/windows-process-inspector.d.ts +1 -0
  78. package/dist/{src/foundation → foundation}/process-containment/windows-process-inspector.js +1 -0
  79. package/dist/{src/foundation → foundation}/protocol/client.d.ts +1 -0
  80. package/dist/{src/foundation → foundation}/protocol/client.js +1 -0
  81. package/dist/{src/foundation → foundation}/protocol/messages.d.ts +1 -0
  82. package/dist/{src/foundation → foundation}/protocol/messages.js +1 -0
  83. package/dist/{src/foundation → foundation}/release/bootstrap.d.ts +14 -4
  84. package/dist/{src/foundation → foundation}/release/bootstrap.js +66 -13
  85. package/dist/foundation/release/cohort-state.d.ts +156 -0
  86. package/dist/foundation/release/cohort-state.js +471 -0
  87. package/dist/foundation/release/dependency-layer.d.ts +78 -0
  88. package/dist/foundation/release/dependency-layer.js +487 -0
  89. package/dist/foundation/release/endpoints.d.ts +20 -0
  90. package/dist/foundation/release/endpoints.js +50 -0
  91. package/dist/{src/foundation → foundation}/release/index.d.ts +3 -0
  92. package/dist/{src/foundation → foundation}/release/index.js +3 -0
  93. package/dist/foundation/release/release-gc.d.ts +71 -0
  94. package/dist/foundation/release/release-gc.js +734 -0
  95. package/dist/{src/foundation → foundation}/release/release-store.d.ts +3 -1
  96. package/dist/{src/foundation → foundation}/release/release-store.js +60 -10
  97. package/dist/{src/foundation → foundation}/release/release.d.ts +4 -1
  98. package/dist/{src/foundation → foundation}/release/release.js +10 -3
  99. package/dist/{src/foundation → foundation}/release/update-transaction.d.ts +1 -0
  100. package/dist/{src/foundation → foundation}/release/update-transaction.js +1 -0
  101. package/dist/{src/foundation → foundation}/release/update.d.ts +19 -3
  102. package/dist/{src/foundation → foundation}/release/update.js +114 -54
  103. package/dist/foundation/release/warmup.d.ts +3 -0
  104. package/dist/foundation/release/warmup.js +35 -0
  105. package/dist/foundation/startup/index.d.ts +1 -0
  106. package/dist/foundation/startup/index.js +1 -0
  107. package/dist/foundation/startup/startup-runtime.d.ts +36 -0
  108. package/dist/foundation/startup/startup-runtime.js +140 -0
  109. package/dist/{src/foundation → foundation}/storage/control-store.d.ts +2 -1
  110. package/dist/{src/foundation → foundation}/storage/control-store.js +39 -4
  111. package/dist/{src/foundation → foundation}/structured-agent-runtime/backpressure.d.ts +2 -1
  112. package/dist/{src/foundation → foundation}/structured-agent-runtime/backpressure.js +2 -1
  113. package/dist/{src/foundation → foundation}/structured-agent-runtime/commands.d.ts +2 -1
  114. package/dist/{src/foundation → foundation}/structured-agent-runtime/commands.js +2 -1
  115. package/dist/{src/foundation → foundation}/structured-agent-runtime/handshake.d.ts +1 -1
  116. package/dist/{src/foundation → foundation}/structured-agent-runtime/handshake.js +1 -1
  117. package/dist/{src/foundation → foundation}/structured-agent-runtime/reconnection.d.ts +2 -1
  118. package/dist/{src/foundation → foundation}/structured-agent-runtime/reconnection.js +2 -1
  119. package/dist/{src/foundation → foundation}/structured-agent-runtime/state.d.ts +2 -1
  120. package/dist/{src/foundation → foundation}/structured-agent-runtime/state.js +2 -1
  121. package/dist/foundation/supervision/index.d.ts +3 -0
  122. package/dist/foundation/supervision/index.js +3 -0
  123. package/dist/{src/foundation → foundation}/supervision/main.js +11 -5
  124. package/dist/foundation/supervision/paths.d.ts +1 -0
  125. package/dist/foundation/supervision/paths.js +1 -0
  126. package/dist/{src/foundation → foundation}/supervision/server.d.ts +19 -1
  127. package/dist/{src/foundation → foundation}/supervision/server.js +51 -2
  128. package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/components.d.ts +1 -1
  129. package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/conformance.d.ts +1 -0
  130. package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/conformance.js +3 -2
  131. package/dist/integrations/pi/components/owned-editor-ux.d.ts +55 -0
  132. package/dist/integrations/pi/components/owned-editor-ux.js +778 -0
  133. package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/shell-components.d.ts +1 -0
  134. package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/shell-components.js +1 -0
  135. package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/shell-editor-autocomplete.js +54 -6
  136. package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/shell-extension-ui.d.ts +1 -1
  137. package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/shell-footer-status.d.ts +3 -3
  138. package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/shell-footer-status.js +32 -17
  139. package/dist/integrations/pi/components/shell-presenters-info.d.ts +36 -0
  140. package/dist/integrations/pi/components/shell-presenters-info.js +78 -0
  141. package/dist/integrations/pi/components/shell-presenters-transcript.d.ts +25 -0
  142. package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/shell-presenters-transcript.js +92 -131
  143. package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/shell-selectors-dialogs.d.ts +1 -1
  144. package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/shell-shared-facade.d.ts +52 -8
  145. package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/shell-shared-facade.js +4 -2
  146. package/dist/integrations/pi/components/submitted-prompt-adapter.d.ts +13 -0
  147. package/dist/integrations/pi/components/submitted-prompt-adapter.js +27 -0
  148. package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/adjacent/core/keybindings.d.ts +10 -2
  149. package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/adjacent/core/keybindings.js +36 -3
  150. package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/session-footer.d.ts +1 -1
  151. package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/adapter.d.ts +22 -4
  152. package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/adapter.js +289 -68
  153. package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/conformance.d.ts +2 -0
  154. package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/conformance.js +4 -2
  155. package/dist/integrations/pi/engine/http-dispatcher.d.ts +4 -0
  156. package/dist/integrations/pi/engine/http-dispatcher.js +25 -0
  157. package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/index.d.ts +3 -0
  158. package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/index.js +3 -0
  159. package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/model-auth-integration.d.ts +2 -1
  160. package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/model-auth-integration.js +1 -0
  161. package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/package-integration.d.ts +1 -1
  162. package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/package-integration.js +2 -2
  163. package/dist/integrations/pi/engine/project-trust-preflight.d.ts +22 -0
  164. package/dist/integrations/pi/engine/project-trust-preflight.js +50 -0
  165. package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/resource-extension-integration.d.ts +2 -1
  166. package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/resource-extension-integration.js +1 -0
  167. package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/runtime-integration.d.ts +16 -1
  168. package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/runtime-integration.js +39 -4
  169. package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/session-integration.d.ts +4 -2
  170. package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/session-integration.js +19 -4
  171. package/dist/integrations/pi/engine/settings-effects.d.ts +66 -0
  172. package/dist/integrations/pi/engine/settings-effects.js +249 -0
  173. package/dist/integrations/pi/engine/settings-integration.d.ts +43 -0
  174. package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/settings-integration.js +102 -108
  175. package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/workflow-controllers.d.ts +3 -2
  176. package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/workflow-controllers.js +1 -0
  177. package/dist/integrations/pi/session-ui/clipboard-image.d.ts +11 -0
  178. package/dist/integrations/pi/session-ui/clipboard-image.js +29 -0
  179. package/dist/{src/foundation/pi-owned-ui-integration → integrations/pi/session-ui}/index.d.ts +1 -0
  180. package/dist/{src/foundation/pi-owned-ui-integration → integrations/pi/session-ui}/index.js +1 -0
  181. package/dist/integrations/pi/session-ui/prompt-chips.d.ts +23 -0
  182. package/dist/integrations/pi/session-ui/prompt-chips.js +246 -0
  183. package/dist/integrations/pi/session-ui/route-host.d.ts +5 -0
  184. package/dist/integrations/pi/session-ui/session-shell-root.d.ts +137 -0
  185. package/dist/integrations/pi/session-ui/session-shell-root.js +1106 -0
  186. package/dist/integrations/pi/session-ui/session-shell.d.ts +55 -0
  187. package/dist/{src/foundation/pi-owned-ui-integration → integrations/pi/session-ui}/session-shell.js +415 -775
  188. package/dist/integrations/pi/session-ui/session-viewport-controller.d.ts +44 -0
  189. package/dist/integrations/pi/session-ui/session-viewport-controller.js +434 -0
  190. package/dist/integrations/pi/session-ui/stream-presentation-coalescer.d.ts +29 -0
  191. package/dist/integrations/pi/session-ui/stream-presentation-coalescer.js +79 -0
  192. package/dist/integrations/pi/session-ui/system-clipboard.d.ts +20 -0
  193. package/dist/integrations/pi/session-ui/system-clipboard.js +130 -0
  194. package/dist/{src/foundation/pi-tui-runtime-adapter → integrations/pi/tui-runtime}/adapter.d.ts +8 -1
  195. package/dist/{src/foundation/pi-tui-runtime-adapter → integrations/pi/tui-runtime}/adapter.js +216 -9
  196. package/dist/{src/foundation/pi-tui-runtime-adapter → integrations/pi/tui-runtime}/contracts.d.ts +29 -6
  197. package/dist/integrations/pi/tui-runtime/damage-aware-terminal.d.ts +63 -0
  198. package/dist/integrations/pi/tui-runtime/damage-aware-terminal.js +240 -0
  199. package/dist/{src/foundation/pi-tui-runtime-adapter → integrations/pi/tui-runtime}/index.d.ts +2 -0
  200. package/dist/{src/foundation/pi-tui-runtime-adapter → integrations/pi/tui-runtime}/index.js +2 -0
  201. package/dist/integrations/pi/tui-runtime/input-presentation-coordinator.d.ts +39 -0
  202. package/dist/integrations/pi/tui-runtime/input-presentation-coordinator.js +139 -0
  203. package/dist/{src/foundation/pi-tui-runtime-adapter → integrations/pi/tui-runtime}/presentation-adapter.d.ts +1 -1
  204. package/dist/native/darwin-arm64/manifest.json +1 -1
  205. package/dist/native/linux-x64/manifest.json +3 -3
  206. package/dist/native/linux-x64/process-guardian +0 -0
  207. package/dist/native/win32-x64/manifest.json +3 -3
  208. package/dist/native/win32-x64/process-guardian.exe +0 -0
  209. package/dist/{src/product-identity.d.ts → product-identity.d.ts} +3 -3
  210. package/dist/{src/product-identity.js → product-identity.js} +7 -5
  211. package/dist/{src/product-identity.json → product-identity.json} +11 -6
  212. package/dist/runtime-payload-inventory.json +122328 -0
  213. package/dist/{src/foundation/ui-apps → ui/apps}/contracts.d.ts +23 -1
  214. package/dist/{src/foundation/ui-apps → ui/apps}/host.d.ts +1 -1
  215. package/dist/{src/foundation/ui-apps → ui/apps}/host.js +14 -10
  216. package/dist/{src/foundation/ui-apps → ui/apps}/registry.d.ts +1 -0
  217. package/dist/{src/foundation/ui-apps → ui/apps}/registry.js +1 -0
  218. package/dist/{src/foundation/ui-components → ui/components}/dialog-panel.js +5 -3
  219. package/dist/{src/foundation/ui-components → ui/components}/frame.d.ts +1 -0
  220. package/dist/{src/foundation/ui-components → ui/components}/frame.js +1 -0
  221. package/dist/{src/foundation/ui-components → ui/components}/index.d.ts +4 -0
  222. package/dist/{src/foundation/ui-components → ui/components}/index.js +4 -0
  223. package/dist/{src/foundation/ui-components → ui/components}/line-input.d.ts +1 -6
  224. package/dist/{src/foundation/ui-components → ui/components}/line-input.js +4 -9
  225. package/dist/{src/foundation/ui-components → ui/components}/list-view.d.ts +0 -6
  226. package/dist/{src/foundation/ui-components → ui/components}/list-view.js +14 -7
  227. package/dist/{src/foundation/ui-components → ui/components}/mouse.d.ts +10 -0
  228. package/dist/{src/foundation/ui-components → ui/components}/mouse.js +23 -0
  229. package/dist/ui/components/progress-status.d.ts +2 -0
  230. package/dist/ui/components/progress-status.js +4 -0
  231. package/dist/ui/components/prompt-row.d.ts +14 -0
  232. package/dist/ui/components/prompt-row.js +20 -0
  233. package/dist/{src/foundation/ui-components → ui/components}/scrollbar.d.ts +26 -0
  234. package/dist/{src/foundation/ui-components → ui/components}/scrollbar.js +35 -0
  235. package/dist/{src/foundation/ui-components → ui/components}/shortcuts.d.ts +1 -0
  236. package/dist/{src/foundation/ui-components → ui/components}/shortcuts.js +1 -0
  237. package/dist/ui/components/spans.d.ts +25 -0
  238. package/dist/ui/components/spans.js +257 -0
  239. package/dist/ui/components/submitted-prompt.d.ts +23 -0
  240. package/dist/ui/components/submitted-prompt.js +50 -0
  241. package/dist/{src/foundation/ui-components → ui/components}/surface.d.ts +0 -5
  242. package/dist/{src/foundation/ui-components → ui/components}/surface.js +1 -5
  243. package/dist/ui/components/text-selection.d.ts +62 -0
  244. package/dist/ui/components/text-selection.js +235 -0
  245. package/dist/{src/foundation/ui-components → ui/components}/text.d.ts +14 -0
  246. package/dist/{src/foundation/ui-components → ui/components}/text.js +66 -4
  247. package/dist/ui/components/transcript-viewport.d.ts +146 -0
  248. package/dist/ui/components/transcript-viewport.js +629 -0
  249. package/dist/{src/foundation/owned-ui-settings → ui/settings}/declarations.d.ts +8 -1
  250. package/dist/{src/foundation/owned-ui-settings → ui/settings}/declarations.js +33 -5
  251. package/dist/{src/foundation/owned-ui-settings → ui/settings}/migrations.d.ts +1 -1
  252. package/dist/{src/foundation/owned-ui-settings → ui/settings}/migrations.js +21 -2
  253. package/dist/{src/foundation/owned-ui-settings → ui/settings}/sections.d.ts +6 -19
  254. package/dist/{src/foundation/owned-ui-settings → ui/settings}/sections.js +32 -23
  255. package/dist/{src/foundation/owned-ui-settings → ui/settings}/session.d.ts +9 -17
  256. package/dist/{src/foundation/owned-ui-settings → ui/settings}/session.js +65 -55
  257. package/dist/{src/foundation/owned-ui-settings → ui/settings}/store.d.ts +1 -0
  258. package/dist/{src/foundation/owned-ui-settings → ui/settings}/store.js +2 -1
  259. package/docs/architecture/boundaries.md +9 -9
  260. package/docs/architecture/code-documentation.md +77 -0
  261. package/docs/architecture/project-structure.md +67 -30
  262. package/docs/architecture/resource-and-data-policy.md +1 -1
  263. package/docs/architecture/toolchain.md +10 -10
  264. package/docs/architecture/ui-reference-provenance.md +34 -5
  265. package/docs/ci-release-runbook.md +186 -79
  266. package/docs/features/launch-profiles.md +10 -19
  267. package/docs/manual-launch-instance-acceptance.md +12 -35
  268. package/docs/manual-owned-ui-checkpoint.md +78 -0
  269. package/docs/manual-pi-boundary-candidate.md +4 -5
  270. package/docs/manual-terminal-colour-check.md +4 -3
  271. package/docs/repository-governance-live-acceptance.md +77 -0
  272. package/package.json +37 -27
  273. package/dist/src/cli/capabilities.d.ts +0 -15
  274. package/dist/src/cli/dispatch.js +0 -177
  275. package/dist/src/cli/version-stats.js +0 -72
  276. package/dist/src/composition/index.d.ts +0 -48
  277. package/dist/src/composition/index.js +0 -258
  278. package/dist/src/features/launch/intent.js +0 -4
  279. package/dist/src/features/launch/profiles.d.ts +0 -12
  280. package/dist/src/features/launch/profiles.js +0 -26
  281. package/dist/src/foundation/lifecycle/paths.d.ts +0 -10
  282. package/dist/src/foundation/pi-component-adapter/shell-presenters-transcript.d.ts +0 -57
  283. package/dist/src/foundation/pi-engine-adapter/settings-integration.d.ts +0 -55
  284. package/dist/src/foundation/pi-owned-ui-integration/route-host.d.ts +0 -29
  285. package/dist/src/foundation/pi-owned-ui-integration/session-shell.d.ts +0 -112
  286. package/dist/src/foundation/release/cohort-state.d.ts +0 -70
  287. package/dist/src/foundation/release/cohort-state.js +0 -202
  288. package/dist/src/foundation/release/release-gc.d.ts +0 -5
  289. package/dist/src/foundation/release/release-gc.js +0 -16
  290. package/dist/src/foundation/supervision/index.d.ts +0 -3
  291. package/dist/src/foundation/supervision/index.js +0 -3
  292. package/dist/src/foundation/supervision/paths.d.ts +0 -1
  293. package/dist/src/foundation/supervision/paths.js +0 -1
  294. package/dist/src/foundation/ui-components/spans.d.ts +0 -7
  295. package/dist/src/foundation/ui-components/spans.js +0 -59
  296. package/docs/manual-transparent-checkpoint.md +0 -53
  297. /package/dist/{src/cli → cli}/index.d.ts +0 -0
  298. /package/dist/{src/cli → cli}/index.js +0 -0
  299. /package/dist/{src/cli → cli}/version.d.ts +0 -0
  300. /package/dist/{src/cli → cli}/version.js +0 -0
  301. /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/capability-ports.js +0 -0
  302. /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/domain-validation.d.ts +0 -0
  303. /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/domain.js +0 -0
  304. /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/index.d.ts +0 -0
  305. /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/index.js +0 -0
  306. /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/model.d.ts +0 -0
  307. /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/model.js +0 -0
  308. /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/package-ports.d.ts +0 -0
  309. /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/package-ports.js +0 -0
  310. /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/ports.d.ts +0 -0
  311. /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/ports.js +0 -0
  312. /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/serialization.d.ts +0 -0
  313. /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/serialization.js +0 -0
  314. /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/validation.d.ts +0 -0
  315. /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/validation.js +0 -0
  316. /package/dist/{src/foundation/owned-ui-contracts → contracts/owned-ui}/extension-ui.d.ts +0 -0
  317. /package/dist/{src/foundation/owned-ui-contracts → contracts/owned-ui}/extension-ui.js +0 -0
  318. /package/dist/{src/foundation/owned-ui-contracts → contracts/owned-ui}/index.d.ts +0 -0
  319. /package/dist/{src/foundation/owned-ui-contracts → contracts/owned-ui}/index.js +0 -0
  320. /package/dist/{src/foundation/owned-ui-contracts → contracts/owned-ui}/model.js +0 -0
  321. /package/dist/{src/foundation/owned-ui-contracts → contracts/owned-ui}/validation.d.ts +0 -0
  322. /package/dist/{src/foundation/presentation-contracts → contracts/presentation}/index.d.ts +0 -0
  323. /package/dist/{src/foundation/presentation-contracts → contracts/presentation}/index.js +0 -0
  324. /package/dist/{src/foundation/workspace-contracts → contracts/workspace}/index.d.ts +0 -0
  325. /package/dist/{src/foundation/workspace-contracts → contracts/workspace}/index.js +0 -0
  326. /package/dist/{src/foundation/workspace-contracts → contracts/workspace}/model.d.ts +0 -0
  327. /package/dist/{src/foundation/workspace-contracts → contracts/workspace}/model.js +0 -0
  328. /package/dist/{src/foundation/workspace-contracts → contracts/workspace}/validation.d.ts +0 -0
  329. /package/dist/{src/foundation/workspace-contracts → contracts/workspace}/validation.js +0 -0
  330. /package/dist/{src/features → features}/launch/development-launch.d.ts +0 -0
  331. /package/dist/{src/features → features}/launch/initialize-profile.d.ts +0 -0
  332. /package/dist/{src/features → features}/launch/initialize-profile.js +0 -0
  333. /package/dist/{src/features → features}/launch/runtime-selection.js +0 -0
  334. /package/dist/{src/features → features}/workspace/capabilities.js +0 -0
  335. /package/dist/{src/features → features}/workspace/index.d.ts +0 -0
  336. /package/dist/{src/features → features}/workspace/index.js +0 -0
  337. /package/dist/{src/features → features}/workspace/presentation.d.ts +0 -0
  338. /package/dist/{src/features → features}/workspace/presentation.js +0 -0
  339. /package/dist/{src/features → features}/workspace/reconciliation.d.ts +0 -0
  340. /package/dist/{src/features → features}/workspace/reconciliation.js +0 -0
  341. /package/dist/{src/foundation → foundation}/launch-guardian/index.d.ts +0 -0
  342. /package/dist/{src/foundation → foundation}/launch-guardian/index.js +0 -0
  343. /package/dist/{src/foundation → foundation}/launch-guardian/main.d.ts +0 -0
  344. /package/dist/{src/foundation → foundation}/lifecycle/commands.d.ts +0 -0
  345. /package/dist/{src/foundation → foundation}/lifecycle/commands.js +0 -0
  346. /package/dist/{src/foundation → foundation}/lifecycle/index.d.ts +0 -0
  347. /package/dist/{src/foundation → foundation}/lifecycle/index.js +0 -0
  348. /package/dist/{src/foundation → foundation}/lifecycle/launch-instance.d.ts +0 -0
  349. /package/dist/{src/foundation → foundation}/lifecycle/launch-instance.js +0 -0
  350. /package/dist/{src/foundation → foundation}/native-host-protocol/evidence.d.ts +0 -0
  351. /package/dist/{src/foundation → foundation}/native-host-protocol/evidence.js +0 -0
  352. /package/dist/{src/foundation → foundation}/native-host-protocol/index.d.ts +0 -0
  353. /package/dist/{src/foundation → foundation}/native-host-protocol/index.js +0 -0
  354. /package/dist/{src/foundation → foundation}/native-host-protocol/proof-gate.d.ts +0 -0
  355. /package/dist/{src/foundation → foundation}/native-host-protocol/proof-gate.js +0 -0
  356. /package/dist/{src/foundation → foundation}/process-containment/artifact.d.ts +0 -0
  357. /package/dist/{src/foundation → foundation}/process-containment/artifact.js +0 -0
  358. /package/dist/{src/foundation → foundation}/process-containment/contracts.d.ts +0 -0
  359. /package/dist/{src/foundation → foundation}/process-containment/contracts.js +0 -0
  360. /package/dist/{src/foundation → foundation}/process-containment/index.d.ts +0 -0
  361. /package/dist/{src/foundation → foundation}/process-containment/index.js +0 -0
  362. /package/dist/{src/foundation → foundation}/protocol/index.d.ts +0 -0
  363. /package/dist/{src/foundation → foundation}/protocol/index.js +0 -0
  364. /package/dist/{src/foundation → foundation}/release/cohort-selection.d.ts +0 -0
  365. /package/dist/{src/foundation → foundation}/release/cohort-selection.js +0 -0
  366. /package/dist/{src/foundation → foundation}/release/concurrency.d.ts +0 -0
  367. /package/dist/{src/foundation → foundation}/release/concurrency.js +0 -0
  368. /package/dist/{src/foundation → foundation}/release/process-cleanup.d.ts +0 -0
  369. /package/dist/{src/foundation → foundation}/release/process-cleanup.js +0 -0
  370. /package/dist/{src/foundation → foundation}/release/stable-release.d.ts +0 -0
  371. /package/dist/{src/foundation → foundation}/release/stable-release.js +0 -0
  372. /package/dist/{src/foundation → foundation}/storage/index.d.ts +0 -0
  373. /package/dist/{src/foundation → foundation}/storage/index.js +0 -0
  374. /package/dist/{src/foundation → foundation}/structured-agent-runtime/index.d.ts +0 -0
  375. /package/dist/{src/foundation → foundation}/structured-agent-runtime/index.js +0 -0
  376. /package/dist/{src/foundation → foundation}/supervision/main.d.ts +0 -0
  377. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/components.js +0 -0
  378. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/index.d.ts +0 -0
  379. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/index.js +0 -0
  380. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/resources/builtin-themes.d.ts +0 -0
  381. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/resources/builtin-themes.js +0 -0
  382. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/shell-editor-autocomplete.d.ts +0 -0
  383. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/shell-extension-ui.js +0 -0
  384. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/shell-selectors-dialogs.js +0 -0
  385. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/theme.d.ts +0 -0
  386. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/theme.js +0 -0
  387. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/countdown-timer.d.ts +0 -0
  388. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/countdown-timer.js +0 -0
  389. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/custom-entry.d.ts +0 -0
  390. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/custom-entry.js +0 -0
  391. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/daxnuts.d.ts +0 -0
  392. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/daxnuts.js +0 -0
  393. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/earendil-announcement.d.ts +0 -0
  394. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/earendil-announcement.js +0 -0
  395. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/extension-editor.d.ts +0 -0
  396. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/extension-editor.js +0 -0
  397. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/first-time-setup.d.ts +0 -0
  398. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/first-time-setup.js +0 -0
  399. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/markdown-transform.d.ts +0 -0
  400. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/markdown-transform.js +0 -0
  401. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/mermaid.d.ts +0 -0
  402. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/mermaid.js +0 -0
  403. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/owned-editor.d.ts +0 -0
  404. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/owned-editor.js +0 -0
  405. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/scoped-models-selector.d.ts +0 -0
  406. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/scoped-models-selector.js +0 -0
  407. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/session-footer.js +0 -0
  408. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/session-selector-search.d.ts +0 -0
  409. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/session-selector-search.js +0 -0
  410. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/session-selector.d.ts +0 -0
  411. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/session-selector.js +0 -0
  412. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/skill-invocation-message.d.ts +0 -0
  413. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/skill-invocation-message.js +0 -0
  414. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/status-indicator.d.ts +0 -0
  415. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/status-indicator.js +0 -0
  416. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/tree-selector.d.ts +0 -0
  417. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/tree-selector.js +0 -0
  418. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/trust-selector.d.ts +0 -0
  419. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/trust-selector.js +0 -0
  420. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/external-editor.d.ts +0 -0
  421. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/external-editor.js +0 -0
  422. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/model-search.d.ts +0 -0
  423. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/model-search.js +0 -0
  424. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/theme/theme-controller.d.ts +0 -0
  425. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/theme/theme-controller.js +0 -0
  426. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/theme/theme.d.ts +0 -0
  427. /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/theme/theme.js +0 -0
  428. /package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/pi-settings-metadata.json +0 -0
  429. /package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/public-main-entry.d.ts +0 -0
  430. /package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/public-main-entry.js +0 -0
  431. /package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/workflows.d.ts +0 -0
  432. /package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/workflows.js +0 -0
  433. /package/dist/{src/foundation/pi-owned-ui-integration → integrations/pi/session-ui}/route-host.js +0 -0
  434. /package/dist/{src/foundation/pi-tui-runtime-adapter → integrations/pi/tui-runtime}/conformance.d.ts +0 -0
  435. /package/dist/{src/foundation/pi-tui-runtime-adapter → integrations/pi/tui-runtime}/conformance.js +0 -0
  436. /package/dist/{src/foundation/pi-tui-runtime-adapter → integrations/pi/tui-runtime}/contracts.js +0 -0
  437. /package/dist/{src/foundation/pi-tui-runtime-adapter → integrations/pi/tui-runtime}/presentation-adapter.js +0 -0
  438. /package/dist/{src/foundation/ui-apps → ui/apps}/contracts.js +0 -0
  439. /package/dist/{src/foundation/ui-apps → ui/apps}/index.d.ts +0 -0
  440. /package/dist/{src/foundation/ui-apps → ui/apps}/index.js +0 -0
  441. /package/dist/{src/foundation/ui-components → ui/components}/dialog-panel.d.ts +0 -0
  442. /package/dist/{src/foundation/ui-components → ui/components}/label.d.ts +0 -0
  443. /package/dist/{src/foundation/ui-components → ui/components}/label.js +0 -0
  444. /package/dist/{src/foundation/ui-components → ui/components}/list-block.d.ts +0 -0
  445. /package/dist/{src/foundation/ui-components → ui/components}/list-block.js +0 -0
  446. /package/dist/{src/foundation/ui-components → ui/components}/pane.d.ts +0 -0
  447. /package/dist/{src/foundation/ui-components → ui/components}/pane.js +0 -0
  448. /package/dist/{src/foundation/ui-components → ui/components}/revision.d.ts +0 -0
  449. /package/dist/{src/foundation/ui-components → ui/components}/revision.js +0 -0
  450. /package/dist/{src/foundation/ui-components → ui/components}/status-line.d.ts +0 -0
  451. /package/dist/{src/foundation/ui-components → ui/components}/status-line.js +0 -0
  452. /package/dist/{src/foundation/ui-components → ui/components}/stepper.d.ts +0 -0
  453. /package/dist/{src/foundation/ui-components → ui/components}/stepper.js +0 -0
  454. /package/dist/{src/foundation/ui-components → ui/components}/theme.d.ts +0 -0
  455. /package/dist/{src/foundation/ui-components → ui/components}/theme.js +0 -0
  456. /package/dist/{src/foundation/ui-components → ui/components}/value-menu.d.ts +0 -0
  457. /package/dist/{src/foundation/ui-components → ui/components}/value-menu.js +0 -0
  458. /package/dist/{src/foundation/owned-ui-settings → ui/settings}/index.d.ts +0 -0
  459. /package/dist/{src/foundation/owned-ui-settings → ui/settings}/index.js +0 -0
  460. /package/dist/{src/foundation/owned-ui-settings → ui/settings}/resolution.d.ts +0 -0
  461. /package/dist/{src/foundation/owned-ui-settings → ui/settings}/resolution.js +0 -0
@@ -1,4 +1,4 @@
1
- import { GLOBAL_SCOPE, LineInput, PLAIN_THEME, ShortcutRegistry, PROMPT_GLYPH, blockJumpTarget, dialogValueColumn, numericValues, RAIL_COLUMNS, renderDialogPanel, renderEmptyState, renderGroupHeader, renderInputRow, renderStatusLine, renderListRow, renderNote, dialogRowAt, menuRowAt, regionAt, renderValueMenu, withScrollbarRail, stepperEnds, steppedValue, valueColumnFor, valueMenuFrame, promptRule, caretCell, blockRowSpan, displayWidth, faint, handleLineInputKey, humanizeLabel, humanizeTitle, indexOfKey, isThumbRow, layoutList, moveSelection, rowKey, scrollForSelection, scrollbarGeometry, selectableIndexes, } from "../../foundation/ui-components/index.js";
1
+ import { GLOBAL_SCOPE, LineInput, PLAIN_THEME, ShortcutRegistry, assertNoShortcutConflicts, blockJumpTarget, dialogValueColumn, numericValues, RAIL_COLUMNS, renderDialogPanel, renderEmptyState, renderGroupHeader, renderInputRow, renderListRow, renderNote, renderStatusLine, dialogRowAt, menuRowAt, regionAt, renderValueMenu, withScrollbarRail, stepperEnds, steppedValue, valueColumnFor, valueMenuFrame, blockRowSpan, displayWidth, handleLineInputKey, humanizeLabel, humanizeTitle, indexOfKey, isThumbRow, layoutList, moveSelection, rowKey, scrollForSelection, scrollbarGeometry, scrollbarWheelRows, selectableIndexes, } from "../../ui/components/index.js";
2
2
  export const SETTINGS_APP_ID = "settings";
3
3
  export const SETTINGS_ROUTE = "settings";
4
4
  const SCOPE = SETTINGS_APP_ID;
@@ -29,6 +29,7 @@ SETTINGS_SHORTCUTS.declare({ key: "left", scope: DIALOG_SCOPE, description: "Cha
29
29
  SETTINGS_SHORTCUTS.declare({ key: "right", scope: DIALOG_SCOPE, description: "Change this part", section: "Parts" }, "part-change");
30
30
  SETTINGS_SHORTCUTS.declare({ key: "up", scope: DIALOG_SCOPE, description: "Previous part", section: "Parts" }, "part-previous");
31
31
  SETTINGS_SHORTCUTS.declare({ key: "down", scope: DIALOG_SCOPE, description: "Next part", section: "Parts" }, "part-next");
32
+ assertNoShortcutConflicts(SETTINGS_SHORTCUTS.assemble());
32
33
  const KEYS = {
33
34
  "\u001b[A": "up",
34
35
  "\u001b[B": "down",
@@ -56,6 +57,8 @@ export class SettingsApp {
56
57
  #session;
57
58
  #selectedKey;
58
59
  #scroll = 0;
60
+ // Invariant: keyboard navigation requests visibility once; pointer scrolling then stays free.
61
+ #selectionNeedsReveal = true;
59
62
  #reveal;
60
63
  #notice = null;
61
64
  #filter = null;
@@ -63,19 +66,15 @@ export class SettingsApp {
63
66
  #structured = null;
64
67
  #loading = true;
65
68
  #interruptArmed = false;
66
- /** Values requested but not yet reflected by the source, keyed by entry. */
69
+ // Invariant: pending values remain visible until the source reflects them.
67
70
  #pending = new Map();
68
71
  #footerHeight = 1;
69
- /** Column the dialog's values start at, so a label stays a label. */
70
72
  #dialogValueColumn = 0;
71
- /** Screen row the dialog panel starts on, for pointer hits. */
72
73
  #panelTop = 0;
73
74
  #panelTopForFrame = 0;
74
- /** Row key under the pointer, and where each row was drawn last frame. */
75
75
  #hoverKey = null;
76
76
  #hoverRegion = "label";
77
77
  #frameRows = [];
78
- /** Where the value menu was drawn last frame, for hit testing. */
79
78
  #menuFrame = null;
80
79
  constructor(session) {
81
80
  this.#session = session;
@@ -90,15 +89,19 @@ export class SettingsApp {
90
89
  const theme = host.theme ?? PLAIN_THEME;
91
90
  this.#interruptArmed = host.interruptArmed;
92
91
  const rows = this.#rows();
92
+ const selected = indexOfKey(rows, this.#selectedKey);
93
93
  const footer = this.#footerLines(rect.width, theme);
94
94
  this.#footerHeight = footer.length;
95
95
  this.#panelTopForFrame = Math.max(0, rect.height - footer.length);
96
96
  this.#panelTop = this.#panelTopForFrame;
97
97
  const bodyHeight = Math.max(0, rect.height - footer.length);
98
- const selected = indexOfKey(rows, this.#selectedKey);
99
- this.#scroll = scrollForSelection(rows, bodyHeight, this.#scroll, selected, this.#reveal);
98
+ if (this.#selectionNeedsReveal) {
99
+ this.#scroll = scrollForSelection(rows, bodyHeight, this.#scroll, selected, this.#reveal);
100
+ this.#selectionNeedsReveal = false;
101
+ }
100
102
  this.#reveal = undefined;
101
103
  const layout = layoutList(rows, bodyHeight, this.#scroll);
104
+ this.#scroll = layout.scroll;
102
105
  const contentWidth = Math.max(0, rect.width - RAIL_COLUMNS);
103
106
  const valueColumn = this.#valueColumn(rows);
104
107
  const geometry = scrollbarGeometry({
@@ -121,14 +124,13 @@ export class SettingsApp {
121
124
  for (const index of layout.rowIndexes) {
122
125
  const row = rows[index];
123
126
  if (row !== undefined && row.kind === "element") {
127
+ const view = this.#viewRow(row.value);
124
128
  this.#frameRows.push({
125
- key: `${row.value.backend}:${row.value.id}`,
129
+ key: view.key,
126
130
  screenRow: body.length,
127
131
  valueColumn,
128
- valueWidth: row.value.structured
129
- ? CONFIGURE.length
130
- : row.value.value === null ? 0 : displayWidth(displayValue(row.value.value)),
131
- stepper: isStepper(row.value),
132
+ valueWidth: displayWidth(view.value),
133
+ stepper: view.stepper !== undefined,
132
134
  });
133
135
  }
134
136
  body.push(this.#renderRow(row, index === selected, contentWidth, valueColumn, theme));
@@ -148,7 +150,8 @@ export class SettingsApp {
148
150
  return this.#menuKey(data);
149
151
  if (this.#filter !== null)
150
152
  return this.#filterKey(data);
151
- const action = SETTINGS_SHORTCUTS.resolve(KEYS[data] ?? data, SCOPE);
153
+ const key = KEYS[data] ?? data;
154
+ const action = SETTINGS_SHORTCUTS.resolve(key, SCOPE);
152
155
  if (action === null)
153
156
  return { consumed: false };
154
157
  const rows = this.#rows();
@@ -186,11 +189,14 @@ export class SettingsApp {
186
189
  }
187
190
  case "first":
188
191
  case "last": {
189
- // End lands on the very last setting, not on the head of its section.
192
+ // Invariant: End lands on the very last setting, not on the head of its section.
190
193
  const selectable = selectableIndexes(rows);
191
194
  const target = action === "last" ? selectable.at(-1) : selectable[0];
192
- if (target !== undefined)
193
- this.#jump(rows, target);
195
+ if (target !== undefined) {
196
+ this.#select(rows, target);
197
+ if (action === "first")
198
+ this.#scroll = 0;
199
+ }
194
200
  return { consumed: true };
195
201
  }
196
202
  case "previous-value":
@@ -208,7 +214,7 @@ export class SettingsApp {
208
214
  const overRow = menuRowAt(frame, event.row - 1, event.column);
209
215
  const overMenu = overRow !== null;
210
216
  if (event.kind === "motion") {
211
- // The menu owns the pointer, but the row it came from is still the thing
217
+ // Invariant: the menu owns the pointer, but the row it came from is still the thing
212
218
  // being changed, so its value keeps reading as the one under the pointer.
213
219
  // Only a dialog that takes the screen puts that out.
214
220
  const hadHover = this.#hoverKey !== menu.anchorKey || this.#hoverRegion !== "value";
@@ -227,7 +233,7 @@ export class SettingsApp {
227
233
  if (event.kind !== "press")
228
234
  return { consumed: true, render: false };
229
235
  if (overRow === null) {
230
- // A press anywhere else dismisses the menu rather than acting through it.
236
+ // Invariant: a press anywhere else dismisses the menu rather than acting through it.
231
237
  this.#menu = null;
232
238
  return { consumed: true };
233
239
  }
@@ -239,7 +245,7 @@ export class SettingsApp {
239
245
  }
240
246
  const open = this.#structured;
241
247
  if (open !== null) {
242
- // The panel owns the pointer while it is open; its flag rows are the targets.
248
+ // Invariant: the panel owns the pointer while it is open; its flag rows are the targets.
243
249
  // The panel's rows begin one line below its rule.
244
250
  const panel = { firstRow: this.#panelTop + 1, rows: open.flags.length, valueColumn: this.#dialogValueColumn };
245
251
  const row = event.row - 1 - panel.firstRow;
@@ -253,7 +259,7 @@ export class SettingsApp {
253
259
  }
254
260
  if (event.kind === "press") {
255
261
  open.index = row;
256
- // Pointing at the label picks the row; the value is what changes it,
262
+ // Rationale: pointing at the label picks the row; the value is what changes it,
257
263
  // exactly as in the list behind the dialog.
258
264
  const key = open.flags[row] ?? "";
259
265
  const width = displayWidth((open.record[key] ?? false) ? "true" : "false");
@@ -263,6 +269,15 @@ export class SettingsApp {
263
269
  }
264
270
  return { consumed: true, render: false };
265
271
  }
272
+ if (event.kind === "wheel-up" || event.kind === "wheel-down") {
273
+ // Invariant: the whole list pane owns wheel scrolling, including blank space beside
274
+ // short labels. It must not depend on finding an item under the pointer.
275
+ if (event.row < 1 || event.row > this.#panelTopForFrame)
276
+ return { consumed: false };
277
+ const distance = scrollbarWheelRows(this.#scrollbarSpeed());
278
+ this.#scroll = Math.max(0, this.#scroll + (event.kind === "wheel-down" ? distance : -distance));
279
+ return { consumed: true };
280
+ }
266
281
  const row = this.#frameRows.find(candidate => candidate.screenRow === event.row - 1);
267
282
  const previousKey = this.#hoverKey;
268
283
  const previousRegion = this.#hoverRegion;
@@ -277,7 +292,7 @@ export class SettingsApp {
277
292
  const rows = this.#rows();
278
293
  const index = rows.findIndex(candidate => rowKey(candidate) === row.key);
279
294
  if (index >= 0) {
280
- // The pointer acts where it points; the arrow belongs to the keyboard.
295
+ // Rationale: the pointer acts where it points; the arrow belongs to the keyboard.
281
296
  this.#notice = null;
282
297
  if (this.#hoverRegion === "minus")
283
298
  this.#cycle(rows, index, -1);
@@ -288,10 +303,6 @@ export class SettingsApp {
288
303
  }
289
304
  return { consumed: true };
290
305
  }
291
- if (event.kind === "wheel-up" || event.kind === "wheel-down") {
292
- this.#scroll = Math.max(0, this.#scroll + (event.kind === "wheel-down" ? 3 : -3));
293
- return { consumed: true };
294
- }
295
306
  const changed = previousKey !== this.#hoverKey || previousRegion !== this.#hoverRegion;
296
307
  return { consumed: event.kind !== "motion", render: changed };
297
308
  }
@@ -305,7 +316,7 @@ export class SettingsApp {
305
316
  return;
306
317
  }
307
318
  const shown = this.#shownValue(entry);
308
- // A number is stepped, not picked from a list: it has its own two controls,
319
+ // Rationale: a number is stepped, not picked from a list: it has its own two controls,
309
320
  // and pointing at it is not a request for anything else.
310
321
  if (typeof shown === "number")
311
322
  return;
@@ -314,16 +325,12 @@ export class SettingsApp {
314
325
  return;
315
326
  }
316
327
  const current = shown === null ? 0 : Math.max(0, entry.choices.indexOf(shown));
317
- // Nothing is highlighted until the pointer or a key picks a row, so opening
318
- // the menu does not flash a highlight the reader did not ask for.
319
- this.#menu = { entry, current, anchorKey: `${entry.backend}:${entry.id}`, choices: entry.choices, index: -1 };
328
+ // Compatibility: pinned SelectList opens on the value currently in effect.
329
+ this.#menu = { entry, current, anchorKey: `${entry.backend}:${entry.id}`, choices: entry.choices, index: current };
320
330
  }
321
- /**
322
- * A structured setting is a set of flags, so it opens as its own list rather
323
- * than as a value menu: each row names one flag and toggles it in place.
324
- */
331
+ // Rationale: a structured setting opens as its own flag list rather than a value menu.
325
332
  #openStructured(entry) {
326
- // The flags come from the declaration, not from the stored value: an unset
333
+ // Invariant: the flags come from the declaration, not from the stored value: an unset
327
334
  // flag still has a row, showing the default the source would apply.
328
335
  if (entry.flags.length === 0) {
329
336
  this.#notice = `${labelOf(entry)} has nothing to configure`;
@@ -337,7 +344,7 @@ export class SettingsApp {
337
344
  const value = stored[flag.key];
338
345
  record[flag.key] = typeof value === "boolean" ? value : flag.fallback;
339
346
  }
340
- // The dialog takes the screen: the row it was opened from stops being the
347
+ // Invariant: the dialog takes the screen: the row it was opened from stops being the
341
348
  // thing under the pointer, so it stops looking like it.
342
349
  this.#hoverKey = null;
343
350
  this.#hoverRegion = "label";
@@ -385,7 +392,7 @@ export class SettingsApp {
385
392
  return { consumed: true };
386
393
  }
387
394
  if (key === "up" || key === "down") {
388
- // The keyboard starts from the value in effect rather than from the top.
395
+ // Compatibility: the keyboard starts from the value in effect rather than from the top.
389
396
  menu.index = menu.index < 0
390
397
  ? menu.current
391
398
  : Math.min(menu.choices.length - 1, Math.max(0, menu.index + (key === "down" ? 1 : -1)));
@@ -403,9 +410,20 @@ export class SettingsApp {
403
410
  if (input === null)
404
411
  return { consumed: false };
405
412
  const key = KEYS[data];
413
+ if (key === "home" || key === "end") {
414
+ const rows = this.#rows();
415
+ const selectable = selectableIndexes(rows);
416
+ const target = key === "end" ? selectable.at(-1) : selectable[0];
417
+ if (target !== undefined) {
418
+ this.#select(rows, target);
419
+ if (key === "home")
420
+ this.#scroll = 0;
421
+ }
422
+ return { consumed: true };
423
+ }
406
424
  if (key === "up" || key === "down" || key === "shift+up" || key === "shift+down") {
407
425
  const rows = this.#rows();
408
- // Nothing found means nothing to move through; the key is still swallowed
426
+ // Rationale: nothing found means nothing to move through; the key is still swallowed
409
427
  // rather than typed into the search.
410
428
  if (selectableIndexes(rows).length === 0)
411
429
  return { consumed: true, render: false };
@@ -437,7 +455,7 @@ export class SettingsApp {
437
455
  }
438
456
  const shown = this.#shownValue(entry);
439
457
  if (typeof shown === "number") {
440
- // At the end of the range there is nothing to say: the arrow already reads
458
+ // Rationale: at the end of the range there is nothing to say: the arrow already reads
441
459
  // as unavailable, so a message would only repeat it.
442
460
  const next = steppedValue(rangeOf(entry), shown, delta);
443
461
  if (next !== null)
@@ -458,25 +476,38 @@ export class SettingsApp {
458
476
  }
459
477
  #apply(entry, value) {
460
478
  const key = `${entry.backend}:${entry.id}`;
461
- // Shown immediately so the row never lags a keypress, and so the next press
479
+ // Invariant: shown immediately so the row never lags a keypress, and so the next press
462
480
  // steps from here rather than from a value the source has not caught up to.
463
481
  this.#pending.set(key, value);
464
482
  void this.#session.change(entry.backend, entry.id, value).then(outcome => {
465
- if (outcome.failure !== null) {
483
+ if (outcome.failure !== null || outcome.status === "failed") {
466
484
  this.#pending.delete(key);
467
- this.#notice = `Could not save ${labelOf(entry)}: ${outcome.failure}`;
485
+ this.#notice = `Could not save ${labelOf(entry)}: ${outcome.failure ?? "the effect failed"}`;
468
486
  return;
469
487
  }
470
- // A later press may have moved on; only the last request clears itself.
488
+ if (outcome.status === "unavailable" || outcome.limitationReason !== null) {
489
+ this.#pending.delete(key);
490
+ this.#notice = outcome.limitationReason ?? `${labelOf(entry)} is unavailable`;
491
+ return;
492
+ }
493
+ // Concurrency: a later press may have moved on; only the last request clears itself.
471
494
  if (this.#pending.get(key) === value)
472
495
  this.#pending.delete(key);
473
- this.#notice = outcome.pendingRestart ? `${labelOf(entry)} applies on the next start` : null;
496
+ this.#notice = outcome.status === "deferred" && outcome.application !== null
497
+ ? `${labelOf(entry)} is stored and applies ${applicationLabel(outcome.application)}`
498
+ : null;
474
499
  });
475
500
  }
476
- /** What the row shows: the value asked for if one is outstanding, else the source's. */
477
501
  #shownValue(entry) {
478
502
  return this.#pending.get(`${entry.backend}:${entry.id}`) ?? entry.value;
479
503
  }
504
+ #scrollbarSpeed() {
505
+ const entry = this.#session.sections()
506
+ .flatMap(section => section.entries)
507
+ .find(candidate => candidate.backend === "a1" && candidate.id === "scrollbarSpeed");
508
+ const value = entry === undefined ? this.#session.value("scrollbarSpeed") : this.#shownValue(entry);
509
+ return isScrollbarSpeed(value) ? value : "normal";
510
+ }
480
511
  #jump(rows, target) {
481
512
  this.#select(rows, target);
482
513
  this.#reveal = blockRowSpan(rows, target);
@@ -485,6 +516,7 @@ export class SettingsApp {
485
516
  if (index < 0)
486
517
  return;
487
518
  this.#selectedKey = rowKey(rows[index]);
519
+ this.#selectionNeedsReveal = true;
488
520
  this.#notice = null;
489
521
  }
490
522
  #rows() {
@@ -494,7 +526,7 @@ export class SettingsApp {
494
526
  || labelOf(entry).toLowerCase().includes(needle);
495
527
  const rows = [];
496
528
  for (const section of this.#session.sections()) {
497
- // A section named by the search is what the reader asked for, so it arrives
529
+ // Rationale: a section named by the search is what the reader asked for, so it arrives
498
530
  // whole rather than narrowed to the entries that happen to repeat its name.
499
531
  const named = needle.length > 0 && section.title.toLowerCase().includes(needle);
500
532
  const entries = named ? section.entries : section.entries.filter(matches);
@@ -510,7 +542,7 @@ export class SettingsApp {
510
542
  if (section.readOnlyReason !== null && (needle.length === 0 || named)) {
511
543
  rows.push({ kind: "note", group: section.id, text: section.readOnlyReason });
512
544
  }
513
- // Presented in the order the source reports, which is the order the
545
+ // Invariant: presented in the order the source reports, which is the order the
514
546
  // pinned engine shows and is neither declaration order nor alphabetical.
515
547
  for (const entry of entries) {
516
548
  rows.push({
@@ -543,18 +575,18 @@ export class SettingsApp {
543
575
  const hovered = this.#hoverKey === key;
544
576
  return renderListRow(this.#viewRow(entry), { selected, hovered, region: this.#hoverRegion }, valueColumn, width, theme);
545
577
  }
546
- /** What the list view needs to draw a setting: its words, and where it can go. */
547
578
  #viewRow(entry) {
548
579
  const shown = this.#shownValue(entry);
549
580
  const value = entry.structured
550
581
  ? CONFIGURE
551
- : shown === null ? describeRaw(entry.rawValue) : displayValue(shown);
582
+ : shown === null
583
+ ? describeRaw(entry.rawValue)
584
+ : effectiveDisplay(entry, shown);
552
585
  const range = rangeOf(entry);
553
586
  return {
554
587
  key: `${entry.backend}:${entry.id}`,
555
588
  label: labelOf(entry),
556
589
  value,
557
- ...(entry.origin === "default" ? { suffix: "(default)" } : {}),
558
590
  ...(typeof shown === "number" && entry.editable ? { stepper: stepperEnds(range, shown) } : {}),
559
591
  };
560
592
  }
@@ -578,13 +610,12 @@ export class SettingsApp {
578
610
  this.#menuFrame = frame;
579
611
  return renderValueMenu(lines, state, frame, theme);
580
612
  }
581
- /** What the panel needs to present a structured setting's parts. */
582
613
  #dialogLines(open, width, theme) {
583
614
  const rows = open.flags.map(key => {
584
615
  const declared = open.entry.flags.find(flag => flag.key === key);
585
616
  return {
586
617
  label: declared?.label ?? humanizeLabel(key),
587
- // The engine writes these as the booleans they are rather than as yes/no.
618
+ // Protocol: the engine writes these as the booleans they are rather than as yes/no.
588
619
  value: (open.record[key] ?? false) ? "true" : "false",
589
620
  ...(declared?.description === undefined ? {} : { description: declared.description }),
590
621
  };
@@ -597,8 +628,6 @@ export class SettingsApp {
597
628
  const open = this.#structured;
598
629
  if (open !== null)
599
630
  return this.#dialogLines(open, width, theme);
600
- // The hint is the declarations, so a key cannot be described here and bound
601
- // to something else.
602
631
  const hint = this.#interruptArmed ? "press ctrl+c again to exit A1" : SETTINGS_SHORTCUTS.hint(SCOPE);
603
632
  const status = renderStatusLine({ hint, report: this.#notice }, width, theme);
604
633
  const input = this.#filter;
@@ -624,6 +653,23 @@ function displayValue(value) {
624
653
  return value ? "yes" : "no";
625
654
  return String(value);
626
655
  }
656
+ function effectiveDisplay(entry, stored) {
657
+ const effective = entry.effectiveValue;
658
+ if (effective === stored)
659
+ return displayValue(stored);
660
+ const shownEffective = typeof effective === "string" || typeof effective === "number" || typeof effective === "boolean"
661
+ ? displayValue(effective)
662
+ : describeRaw(effective);
663
+ return `${displayValue(stored)} (effective ${shownEffective}; ${applicationLabel(entry.application)})`;
664
+ }
665
+ function applicationLabel(application) {
666
+ switch (application) {
667
+ case "live": return "live";
668
+ case "next-session": return "in the next session";
669
+ case "next-start": return "on the next start";
670
+ case "current-exit": return "when the current session exits";
671
+ }
672
+ }
627
673
  function describeRaw(value) {
628
674
  if (value === null || value === undefined)
629
675
  return "unset";
@@ -631,3 +677,6 @@ function describeRaw(value) {
631
677
  return Array.isArray(value) ? `${value.length} items` : "structured value";
632
678
  return String(value);
633
679
  }
680
+ function isScrollbarSpeed(value) {
681
+ return value === "normal" || value === "fast" || value === "high";
682
+ }
@@ -1,4 +1,4 @@
1
- import type { ManagedAgentDescriptor } from "../../foundation/workspace-contracts/index.js";
1
+ import type { ManagedAgentDescriptor } from "../../contracts/workspace/index.js";
2
2
  export type WorkspaceCapabilityAction = {
3
3
  readonly type: "structured-command";
4
4
  readonly command: string;
@@ -1,4 +1,4 @@
1
- import { type ManagedAgentDescriptor } from "../../foundation/workspace-contracts/index.js";
1
+ import { type ManagedAgentDescriptor } from "../../contracts/workspace/index.js";
2
2
  export interface WorkspaceAgentFailure {
3
3
  readonly code: string;
4
4
  readonly message: string;
@@ -23,6 +23,7 @@ export type WorkspaceReducerResult<T = undefined> = {
23
23
  readonly code: string;
24
24
  readonly diagnostic: string;
25
25
  };
26
+ /** Applies validated workspace mutations and advances the revision only when observable state changes. */
26
27
  export declare class WorkspaceReducer {
27
28
  #private;
28
29
  readonly workspaceId: string;
@@ -1,5 +1,6 @@
1
- import { assertManagedAgentDescriptor, } from "../../foundation/workspace-contracts/index.js";
1
+ import { assertManagedAgentDescriptor, } from "../../contracts/workspace/index.js";
2
2
  const REMOVABLE_STATES = new Set(["stopped", "failed", "discontinuous"]);
3
+ /** Applies validated workspace mutations and advances the revision only when observable state changes. */
3
4
  export class WorkspaceReducer {
4
5
  workspaceId;
5
6
  #agents = new Map();
@@ -1,5 +1,5 @@
1
1
  import { type StructuredCommandRecord } from "../../foundation/structured-agent-runtime/index.js";
2
- import type { ManagedAgentDescriptor } from "../../foundation/workspace-contracts/index.js";
2
+ import type { ManagedAgentDescriptor } from "../../contracts/workspace/index.js";
3
3
  import { WorkspaceReducer, type WorkspaceAgentState, type WorkspaceView } from "./reducer.js";
4
4
  export interface RoutedStructuredCommand {
5
5
  readonly agentId: string;
@@ -16,6 +16,7 @@ export type WorkspaceRouterResult<T = undefined> = {
16
16
  readonly code: string;
17
17
  readonly diagnostic: string;
18
18
  };
19
+ /** Serializes workspace actions and capability-gates structured commands at the selected-agent boundary. */
19
20
  export declare class WorkspaceRouter {
20
21
  #private;
21
22
  readonly reducer: WorkspaceReducer;
@@ -1,6 +1,7 @@
1
1
  import { StructuredCommandTracker, } from "../../foundation/structured-agent-runtime/index.js";
2
2
  import { gateWorkspaceAction } from "./capabilities.js";
3
3
  import { WorkspaceReducer } from "./reducer.js";
4
+ /** Serializes workspace actions and capability-gates structured commands at the selected-agent boundary. */
4
5
  export class WorkspaceRouter {
5
6
  reducer;
6
7
  #trackers = new Map();
@@ -1,5 +1,6 @@
1
- import type { AgentRecoveryAuthority, RecoveryReferenceId } from "../../foundation/workspace-contracts/index.js";
1
+ import type { AgentRecoveryAuthority, RecoveryReferenceId } from "../../contracts/workspace/index.js";
2
2
  import { WorkspaceReducer, type WorkspaceView } from "./reducer.js";
3
+ /** Persists complete workspace views and recovery references through the control-store boundary. */
3
4
  export declare class WorkspaceStore {
4
5
  #private;
5
6
  constructor(path: string);
@@ -1,5 +1,6 @@
1
1
  import { ControlStore, DEFAULT_WORKSPACE_ID, } from "../../foundation/storage/index.js";
2
2
  import { WorkspaceReducer } from "./reducer.js";
3
+ /** Persists complete workspace views and recovery references through the control-store boundary. */
3
4
  export class WorkspaceStore {
4
5
  #store;
5
6
  constructor(path) {
@@ -4,7 +4,8 @@ import { resolve } from "node:path";
4
4
  import { assertLaunchProfileId } from "../lifecycle/index.js";
5
5
  import { closeVerifiedContainment, LinuxNativeProcessInspector, NativeGuardianContainment, resolveProcessGuardianPath, verifyProcessGuardianArtifact, WindowsNativeProcessInspector, } from "../process-containment/index.js";
6
6
  import { SupervisorClient } from "../protocol/index.js";
7
- import { resolveProductPaths } from "../supervision/index.js";
7
+ import { resolveCohortEndpoint, resolveProductPaths } from "../supervision/index.js";
8
+ import { markStartupPhase } from "../startup/index.js";
8
9
  export async function runLaunchGuardian(options) {
9
10
  assertLaunchProfileId(options.profileId);
10
11
  const environment = { ...(options.environment ?? process.env) };
@@ -17,7 +18,14 @@ export async function runLaunchGuardian(options) {
17
18
  if (!guardianIdentity)
18
19
  throw diagnosticError("launch guardian cannot verify its own native process identity", "PROCESS_IDENTITY_UNAVAILABLE");
19
20
  const client = options.control ?? new SupervisorClient(environment[PRODUCT_IDENTITY.environment.releaseId]);
20
- await client.connect(paths.endpoint);
21
+ // Invariant: an instance belongs to the cohort that launched it and talks to that cohort's endpoint
22
+ // for its whole life, whatever release becomes the active one meanwhile.
23
+ const releaseId = environment[PRODUCT_IDENTITY.environment.releaseId];
24
+ const endpoint = releaseId
25
+ ? resolveCohortEndpoint(paths, releaseId, environment).endpoint
26
+ : paths.endpoint;
27
+ await client.connect(endpoint);
28
+ await markStartupPhase(environment, "guardian-connected");
21
29
  const containment = options.containment ?? new NativeGuardianContainment(instanceId, helperPath, resolve(paths.runtimeDir, "launch-instances", `${instanceId}.ready.json`));
22
30
  const stop = stopRequests(client, instanceId);
23
31
  let rootIdentity = null;
@@ -1,4 +1,4 @@
1
- export type LaunchProfileId = "a1" | "pi" | "sandbox";
1
+ export type LaunchProfileId = "a1" | "pi";
2
2
  export type GenerationId = string;
3
3
  export type DriverProfileId = string;
4
4
  export type RequestId = string;
@@ -1,6 +1,6 @@
1
1
  import { PRODUCT_TEXT } from "../../product-identity.js";
2
2
  export function assertLaunchProfileId(value) {
3
- if (value !== "a1" && value !== "pi" && value !== "sandbox")
3
+ if (value !== "a1" && value !== "pi")
4
4
  throw new TypeError(PRODUCT_TEXT.diagnostic(`launch profile is invalid: ${String(value)}`));
5
5
  }
6
6
  export function assertDimensions(dimensions) {
@@ -0,0 +1,28 @@
1
+ export interface ProductPaths {
2
+ readonly configDir: string;
3
+ readonly dataDir: string;
4
+ readonly runtimeDir: string;
5
+ readonly databasePath: string;
6
+ /** The endpoint written by releases that predate cohort-scoped identity. */
7
+ readonly endpoint: string;
8
+ /** The metadata written by releases that predate cohort-scoped identity. */
9
+ readonly endpointMetadataPath: string;
10
+ readonly endpointsDir: string;
11
+ readonly supervisorLogPath: string;
12
+ }
13
+ /** Where one cohort listens, and where it records that it is listening. */
14
+ export interface CohortEndpointPaths {
15
+ readonly endpoint: string;
16
+ readonly endpointMetadataPath: string;
17
+ }
18
+ /**
19
+ * Endpoint identity for one release cohort. Two cohorts can be live at once — an update
20
+ * leaves a working session on the release it started on — so the name a supervisor listens
21
+ * on has to name the release as well as the runtime directory, or the two contend for one
22
+ * endpoint and replacing one means ending the other.
23
+ *
24
+ * An explicit endpoint override keeps its single endpoint: it is how an isolated run pins
25
+ * the address it is going to talk to.
26
+ */
27
+ export declare function resolveCohortEndpoint(paths: ProductPaths, releaseId: string, environment?: NodeJS.ProcessEnv, hostPlatform?: NodeJS.Platform): CohortEndpointPaths;
28
+ export declare function resolveProductPaths(environment?: NodeJS.ProcessEnv, hostPlatform?: NodeJS.Platform, fallbackHome?: string): ProductPaths;
@@ -2,6 +2,26 @@ import { createHash } from "node:crypto";
2
2
  import { homedir, platform } from "node:os";
3
3
  import { posix, win32 } from "node:path";
4
4
  import { PRODUCT_IDENTITY } from "../../product-identity.js";
5
+ /**
6
+ * Endpoint identity for one release cohort. Two cohorts can be live at once — an update
7
+ * leaves a working session on the release it started on — so the name a supervisor listens
8
+ * on has to name the release as well as the runtime directory, or the two contend for one
9
+ * endpoint and replacing one means ending the other.
10
+ *
11
+ * An explicit endpoint override keeps its single endpoint: it is how an isolated run pins
12
+ * the address it is going to talk to.
13
+ */
14
+ export function resolveCohortEndpoint(paths, releaseId, environment = process.env, hostPlatform = platform()) {
15
+ if (environment[PRODUCT_IDENTITY.environment.endpoint]) {
16
+ return { endpoint: paths.endpoint, endpointMetadataPath: paths.endpointMetadataPath };
17
+ }
18
+ const path = hostPlatform === "win32" ? win32 : posix;
19
+ const token = createHash("sha256").update(releaseId).digest("hex").slice(0, 16);
20
+ const endpoint = hostPlatform === "win32"
21
+ ? `${paths.endpoint}-${token}`
22
+ : path.join(paths.runtimeDir, `${token}-${PRODUCT_IDENTITY.endpoint.unixSocketFilename}`);
23
+ return { endpoint, endpointMetadataPath: path.join(paths.endpointsDir, `${token}.json`) };
24
+ }
5
25
  export function resolveProductPaths(environment = process.env, hostPlatform = platform(), fallbackHome = homedir()) {
6
26
  const windows = hostPlatform === "win32";
7
27
  const path = windows ? win32 : posix;
@@ -37,6 +57,7 @@ export function resolveProductPaths(environment = process.env, hostPlatform = pl
37
57
  databasePath: path.resolve(databaseOverride ?? path.join(dataDir, PRODUCT_IDENTITY.endpoint.databaseFilename)),
38
58
  endpoint,
39
59
  endpointMetadataPath: path.join(runtimeDir, PRODUCT_IDENTITY.endpoint.metadataFilename),
60
+ endpointsDir: path.join(runtimeDir, "endpoints"),
40
61
  supervisorLogPath: path.join(runtimeDir, PRODUCT_IDENTITY.endpoint.supervisorLogFilename),
41
62
  };
42
63
  }
@@ -1,8 +1,10 @@
1
1
  import { type NativeHostProofMessage } from "./messages.js";
2
+ /** Identifies a bounded native-host framing or message-contract failure. */
2
3
  export declare class NativeHostProtocolError extends Error {
3
4
  readonly code: "frame-too-large" | "malformed-frame" | "invalid-message";
4
5
  constructor(code: "frame-too-large" | "malformed-frame" | "invalid-message", message: string);
5
6
  }
7
+ /** Encodes and incrementally decodes size-bounded newline-delimited native-host proof messages. */
6
8
  export declare class NativeHostFrameCodec {
7
9
  #private;
8
10
  encode(message: NativeHostProofMessage): string;
@@ -1,4 +1,5 @@
1
1
  import { MAX_NATIVE_HOST_MESSAGE_BYTES, assertNativeHostProofMessage, } from "./messages.js";
2
+ /** Identifies a bounded native-host framing or message-contract failure. */
2
3
  export class NativeHostProtocolError extends Error {
3
4
  code;
4
5
  constructor(code, message) {
@@ -7,6 +8,7 @@ export class NativeHostProtocolError extends Error {
7
8
  this.name = "NativeHostProtocolError";
8
9
  }
9
10
  }
11
+ /** Encodes and incrementally decodes size-bounded newline-delimited native-host proof messages. */
10
12
  export class NativeHostFrameCodec {
11
13
  #buffer = "";
12
14
  encode(message) {
@@ -1,4 +1,4 @@
1
- import { type CorrelationId, type NativeHostCommand, type NativeHostEvent, type NativeHostHello, type PaneId, type TerminalSessionLaunch } from "../workspace-contracts/index.js";
1
+ import { type CorrelationId, type NativeHostCommand, type NativeHostEvent, type NativeHostHello, type PaneId, type TerminalSessionLaunch } from "../../contracts/workspace/index.js";
2
2
  export declare const NATIVE_HOST_PROTOCOL_NAME: string;
3
3
  export declare const MAX_NATIVE_HOST_MESSAGE_BYTES: number;
4
4
  export type NativeHostProofMessage = {
@@ -1,4 +1,4 @@
1
- import { NATIVE_HOST_PROTOCOL_VERSION, assertNativeHostCommand, assertTerminalSessionLaunch, } from "../workspace-contracts/index.js";
1
+ import { NATIVE_HOST_PROTOCOL_VERSION, assertNativeHostCommand, assertTerminalSessionLaunch, } from "../../contracts/workspace/index.js";
2
2
  import { PRODUCT_IDENTITY } from "../../product-identity.js";
3
3
  export const NATIVE_HOST_PROTOCOL_NAME = PRODUCT_IDENTITY.protocol.nativeHostSchema;
4
4
  export const MAX_NATIVE_HOST_MESSAGE_BYTES = 1024 * 1024;
@@ -1,5 +1,6 @@
1
1
  import type { NativeProcessIdentity } from "../lifecycle/index.js";
2
2
  import type { NativeProcessInspector } from "./contracts.js";
3
+ /** Verifies Linux process identity from the PID and kernel start-time field in procfs. */
3
4
  export declare class LinuxNativeProcessInspector implements NativeProcessInspector {
4
5
  observe(pid: number): Promise<NativeProcessIdentity | null>;
5
6
  matches(identity: NativeProcessIdentity): Promise<boolean>;
@@ -1,4 +1,5 @@
1
1
  import { readFile } from "node:fs/promises";
2
+ /** Verifies Linux process identity from the PID and kernel start-time field in procfs. */
2
3
  export class LinuxNativeProcessInspector {
3
4
  async observe(pid) {
4
5
  if (!Number.isSafeInteger(pid) || pid <= 0)