@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 type { PaneInputResult, PaneMouseEvent, PaneRect, UiTheme } from "../ui-components/index.js";
1
+ import type { PaneInputResult, PaneMouseEvent, PaneRect, RenderCacheContract, UiTheme } from "../components/index.js";
2
2
  export interface AppSize {
3
3
  readonly width: number;
4
4
  readonly height: number;
@@ -27,6 +27,8 @@ export interface AppHostServices {
27
27
  }
28
28
  export interface UiApp {
29
29
  readonly id: string;
30
+ /** Optional declared revisions used by the host's shared frame cache. */
31
+ readonly renderCache?: RenderCacheContract;
30
32
  render(rect: PaneRect, host: AppHostServices): readonly string[];
31
33
  onInput?(data: string, host: AppHostServices): PaneInputResult;
32
34
  onMouse?(event: PaneMouseEvent, host: AppHostServices): PaneInputResult;
@@ -39,4 +41,24 @@ export interface AppRegistration {
39
41
  readonly route: string;
40
42
  create(): UiApp;
41
43
  }
44
+ /** A neutral owned-app surface mounted by a surrounding presentation runtime. */
45
+ export interface UiRouteSurface {
46
+ readonly id: string;
47
+ /** Renders exactly `height` rows of at most `width` columns. */
48
+ render(width: number, height: number): readonly string[];
49
+ /** True when the key was consumed; false leaves it to the surrounding shell. */
50
+ handleInput(data: string): boolean;
51
+ /** Mouse report in surface-local coordinates. True when consumed. */
52
+ handleMouse(event: PaneMouseEvent): boolean;
53
+ isClosed(): boolean;
54
+ close(): void;
55
+ onRenderRequested(listener: () => void): void;
56
+ /** The surface asks to leave A1 entirely, not merely to close itself. */
57
+ onExitRequested(listener: () => void): void;
58
+ }
59
+ /** Route lookup seam shared by owned apps and any presentation runtime hosting them. */
60
+ export interface UiRouteHost {
61
+ claims(route: string): boolean;
62
+ open(route: string): UiRouteSurface | null;
63
+ }
42
64
  export declare function assertAppRegistration(registration: AppRegistration): void;
@@ -1,4 +1,4 @@
1
- import { type PaneInputResult, type PaneMouseEvent, type UiTheme } from "../ui-components/index.js";
1
+ import { type PaneInputResult, type PaneMouseEvent, type UiTheme } from "../components/index.js";
2
2
  import type { AppSize, UiApp } from "./contracts.js";
3
3
  import type { UiAppRegistry } from "./registry.js";
4
4
  export interface AppHostSurface {
@@ -1,5 +1,5 @@
1
- import { FrameCache, finalizeFrame, } from "../ui-components/index.js";
2
- // The interrupt byte, written as an escape: as a raw byte it is invisible to
1
+ import { FrameCache, finalizeFrame, } from "../components/index.js";
2
+ // Invariant: the interrupt byte is written as an escape: as a raw byte it is invisible to
3
3
  // every text tool, and this constant had already been emptied by one.
4
4
  const INTERRUPT = "";
5
5
  /** How long the first interrupt of the chord stays armed. */
@@ -14,8 +14,9 @@ export class UiAppHost {
14
14
  #surface;
15
15
  #closeOnInterrupt;
16
16
  #theme;
17
- /** When the first interrupt of a chord was seen, or null when disarmed. */
17
+ // Invariant: the first interrupt timestamp is null whenever the chord is disarmed.
18
18
  #interruptArmedAt = null;
19
+ #renderedInterruptArmed;
19
20
  #cache = new FrameCache();
20
21
  #app = null;
21
22
  constructor(options) {
@@ -58,7 +59,11 @@ export class UiAppHost {
58
59
  }
59
60
  const size = this.#surface.size();
60
61
  const rect = { width: Math.max(0, size.width), height: Math.max(0, size.height) };
61
- const lines = this.#guard(() => finalizeFrame(app.render(rect, this.#services()), rect, app.id));
62
+ const interruptArmed = this.interruptArmed;
63
+ if (this.#renderedInterruptArmed !== interruptArmed)
64
+ this.#cache.invalidate();
65
+ this.#renderedInterruptArmed = interruptArmed;
66
+ const lines = this.#guard(() => this.#cache.render(app, rect, () => finalizeFrame(app.render(rect, this.#services()), rect, app.id)));
62
67
  this.#surface.present(lines ?? null);
63
68
  }
64
69
  handleInput(data) {
@@ -86,11 +91,7 @@ export class UiAppHost {
86
91
  this.render();
87
92
  return result;
88
93
  }
89
- /**
90
- * Two interrupts leave A1, from any screen. One arms the chord and repaints so
91
- * the screen can say so; a second within the window exits rather than merely
92
- * closing the screen, which is what the chord means everywhere else.
93
- */
94
+ // Protocol: two interrupts within the chord window leave A1 from every screen.
94
95
  #interrupt() {
95
96
  const now = Date.now();
96
97
  const armed = this.#interruptArmedAt;
@@ -101,6 +102,9 @@ export class UiAppHost {
101
102
  return { consumed: true, render: true };
102
103
  }
103
104
  this.#interruptArmedAt = now;
105
+ // Invariant: host-owned state participates in the app's next frame independently of
106
+ // the app's own revision contract.
107
+ this.#cache.invalidate();
104
108
  return { consumed: true, render: true };
105
109
  }
106
110
  get interruptArmed() {
@@ -135,7 +139,7 @@ export class UiAppHost {
135
139
  ...(this.#theme === undefined ? {} : { theme: this.#theme }),
136
140
  };
137
141
  }
138
- /** Contains a failure: the app is closed and the surface restored, never left broken. */
142
+ // Security: an app failure closes its app and restores the surface.
139
143
  #guard(work) {
140
144
  try {
141
145
  return work();
@@ -1,4 +1,5 @@
1
1
  import { type AppRegistration } from "./contracts.js";
2
+ /** Registers owned applications under unique routes and unregisters only the matching definition. */
2
3
  export declare class UiAppRegistry {
3
4
  #private;
4
5
  /** Registering a known id replaces its definition rather than adding a second app. */
@@ -1,4 +1,5 @@
1
1
  import { assertAppRegistration } from "./contracts.js";
2
+ /** Registers owned applications under unique routes and unregisters only the matching definition. */
2
3
  export class UiAppRegistry {
3
4
  #byId = new Map();
4
5
  /** Registering a known id replaces its definition rather than adding a second app. */
@@ -17,9 +17,11 @@ export function renderDialogPanel(state, width, theme) {
17
17
  const padded = `${row.label}${" ".repeat(Math.max(0, labelColumn - displayWidth(row.label)))}`;
18
18
  const cursor = selected ? "→ " : " ";
19
19
  const raw = `${cursor}${padded} ${row.value}`;
20
- // An unselected label is left unpainted and its value quietened, both lifted
21
- // to the accent on the row the cursor is on as the engine paints its own.
22
- const painted = `${theme.fg("accent", cursor)}${selected ? theme.fg("accent", padded) : padded} ${theme.fg("muted", row.value)}`;
20
+ // Compatibility: match pinned SettingsList: selected cursor, label, and value all use the
21
+ // accent role; an unselected label is plain and its value is muted.
22
+ const painted = selected
23
+ ? `${theme.fg("accent", cursor)}${theme.fg("accent", padded)} ${theme.fg("accent", row.value)}`
24
+ : `${cursor}${padded} ${theme.fg("muted", row.value)}`;
23
25
  return pad(truncateToWidth(painted, width), width, raw);
24
26
  });
25
27
  const description = state.rows[state.index]?.description ?? "";
@@ -2,6 +2,7 @@ export interface PaneRect {
2
2
  readonly width: number;
3
3
  readonly height: number;
4
4
  }
5
+ /** Identifies the pane whose bounded frame geometry or rendered rows violated the contract. */
5
6
  export declare class FrameContractError extends Error {
6
7
  readonly pane: string;
7
8
  constructor(pane: string, message: string);
@@ -1,4 +1,5 @@
1
1
  import { displayWidth, truncateToWidth } from "./text.js";
2
+ /** Identifies the pane whose bounded frame geometry or rendered rows violated the contract. */
2
3
  export class FrameContractError extends Error {
3
4
  pane;
4
5
  constructor(pane, message) {
@@ -6,13 +6,17 @@ export * from "./list-block.js";
6
6
  export * from "./list-view.js";
7
7
  export * from "./mouse.js";
8
8
  export * from "./pane.js";
9
+ export * from "./progress-status.js";
9
10
  export * from "./revision.js";
10
11
  export * from "./scrollbar.js";
11
12
  export * from "./shortcuts.js";
12
13
  export * from "./spans.js";
13
14
  export * from "./status-line.js";
15
+ export * from "./submitted-prompt.js";
14
16
  export * from "./stepper.js";
17
+ export * from "./transcript-viewport.js";
15
18
  export * from "./surface.js";
16
19
  export * from "./text.js";
20
+ export * from "./text-selection.js";
17
21
  export * from "./theme.js";
18
22
  export * from "./value-menu.js";
@@ -6,13 +6,17 @@ export * from "./list-block.js";
6
6
  export * from "./list-view.js";
7
7
  export * from "./mouse.js";
8
8
  export * from "./pane.js";
9
+ export * from "./progress-status.js";
9
10
  export * from "./revision.js";
10
11
  export * from "./scrollbar.js";
11
12
  export * from "./shortcuts.js";
12
13
  export * from "./spans.js";
13
14
  export * from "./status-line.js";
15
+ export * from "./submitted-prompt.js";
14
16
  export * from "./stepper.js";
17
+ export * from "./transcript-viewport.js";
15
18
  export * from "./surface.js";
16
19
  export * from "./text.js";
20
+ export * from "./text-selection.js";
17
21
  export * from "./theme.js";
18
22
  export * from "./value-menu.js";
@@ -47,12 +47,7 @@ export declare class LineInput {
47
47
  }
48
48
  /** Applies one key to the input and reports whether the caller should commit. */
49
49
  export declare function handleLineInputKey(input: LineInput, data: string): LineInputOutcome;
50
- /**
51
- * The prompt the reference draws at the head of an input row, in the grey it
52
- * uses for one (#9AA0A6), painted foreground-only so anything drawn behind the
53
- * row survives.
54
- */
55
- /** A rule drawn in the prompt's own grey, as the reference rules an input row. */
50
+ /** Draws the reference prompt rule foreground-only so underlying cells survive. */
56
51
  export declare function promptRule(width: number): string;
57
52
  export declare const PROMPT_GLYPH = "\u001B[38;2;154;160;166m\u276F\u001B[39m ";
58
53
  /**
@@ -148,7 +148,7 @@ export function handleLineInputKey(input, data) {
148
148
  return { kind: "accepted", value: input.value };
149
149
  if (data === "\u001b" || data === "\u0003")
150
150
  return { kind: "cancelled" };
151
- // A word delete is decided before a plain one: on Windows Terminal the raw
151
+ // Platform: a word delete is decided before a plain one: on Windows Terminal the raw
152
152
  // backspace byte IS ctrl+backspace, and the plain branch would swallow it.
153
153
  if (data === "\b" || data === "\u001b\u007f" || data === "\u0017") {
154
154
  input.deleteWordBefore();
@@ -190,7 +190,7 @@ export function handleLineInputKey(input, data) {
190
190
  input.moveCaretToEnd();
191
191
  return { kind: "editing" };
192
192
  }
193
- // Any other escape sequence is a key this input has no answer for - a page
193
+ // Rationale: any other escape sequence is a key this input has no answer for - a page
194
194
  // key, a function key, a chord. It is swallowed rather than typed, because the
195
195
  // one thing it certainly is not is text the reader meant to enter.
196
196
  if (data.startsWith("\u001b"))
@@ -198,12 +198,7 @@ export function handleLineInputKey(input, data) {
198
198
  input.insert(data);
199
199
  return { kind: "editing" };
200
200
  }
201
- /**
202
- * The prompt the reference draws at the head of an input row, in the grey it
203
- * uses for one (#9AA0A6), painted foreground-only so anything drawn behind the
204
- * row survives.
205
- */
206
- /** A rule drawn in the prompt's own grey, as the reference rules an input row. */
201
+ /** Draws the reference prompt rule foreground-only so underlying cells survive. */
207
202
  export function promptRule(width) {
208
203
  return `\u001b[38;2;154;160;166m${"─".repeat(Math.max(0, width))}\u001b[39m`;
209
204
  }
@@ -224,7 +219,7 @@ export function renderInputRow(input, width, options = {}) {
224
219
  const before = view.text.slice(0, view.caretColumn);
225
220
  const under = view.text.slice(view.caretColumn, view.caretColumn + 1) || " ";
226
221
  const after = view.text.slice(view.caretColumn + 1);
227
- // Typed text is left unpainted, the caret reverses its cell, and the
222
+ // Rationale: typed text is left unpainted, the caret reverses its cell, and the
228
223
  // placeholder is quietened by weight rather than by a colour of its own.
229
224
  const body = empty
230
225
  ? `${caretCell(placeholder.slice(0, 1))}${faint(placeholder.slice(1))}`
@@ -1,10 +1,4 @@
1
1
  import type { UiTheme } from "./theme.js";
2
- /**
3
- * A list of things that each carry a label and a value. It owns where a value
4
- * starts, how a row reads when it is selected or pointed at, and which part of a
5
- * row the pointer is on — so a screen decides what a row means and this decides
6
- * how it looks and where it can be touched.
7
- */
8
2
  /** The part of a row the pointer is over. A label selects; a value acts. */
9
3
  export type ListRegion = "label" | "value" | "minus" | "plus";
10
4
  /** Columns a stepper's controls occupy on either side of the value. */
@@ -6,8 +6,8 @@ export const STEPPER_RESERVE = 2;
6
6
  * and with the stepper's columns reserved for every row when any row has one, so
7
7
  * a number does not shift its own value out of the column it shares.
8
8
  */
9
- export function valueColumnFor(rows, indent = 4, gap = 2) {
10
- const widest = Math.max(0, ...rows.map(row => displayWidth(row.label)));
9
+ export function valueColumnFor(rows, indent = 2, gap = 2) {
10
+ const widest = Math.min(30, Math.max(0, ...rows.map(row => displayWidth(row.label))));
11
11
  const stepper = rows.some(row => row.stepper !== undefined) ? STEPPER_RESERVE : 0;
12
12
  return indent + widest + gap + stepper;
13
13
  }
@@ -22,14 +22,21 @@ export function renderGroupHeader(title, width, theme) {
22
22
  */
23
23
  export function renderListRow(row, state, valueColumn, width, theme) {
24
24
  const cursor = state.selected ? "→ " : " ";
25
- const leftRaw = `${cursor} ${row.label}`;
26
- const left = `${theme.fg("accent", cursor)} ${state.selected ? theme.fg("accent", row.label) : theme.plain(row.label)}`;
25
+ const labelColumn = Math.max(displayWidth(row.label), valueColumn - 4 - (row.stepper === undefined ? 0 : STEPPER_RESERVE));
26
+ const labelPadded = `${row.label}${" ".repeat(Math.max(0, labelColumn - displayWidth(row.label)))}`;
27
+ const leftRaw = `${cursor}${labelPadded}`;
28
+ const left = state.selected
29
+ ? `${theme.fg("accent", cursor)}${theme.fg("accent", labelPadded)}`
30
+ : `${cursor}${theme.plain(labelPadded)}`;
27
31
  const gap = Math.max(2, valueColumn - displayWidth(leftRaw));
28
- // Pointing anywhere on the row is pointing at the item; pointing at the value
29
- // is what brightens it. The selection speaks through the label alone.
32
+ // Compatibility: pinned SettingsList gives the selected label and value the same accent
33
+ // role. Pointer hover may brighten an unselected value without changing the
34
+ // keyboard selection.
30
35
  const valueHovered = state.hovered && state.region !== "label";
31
36
  const stepper = row.stepper !== undefined && valueHovered;
32
- const value = valueHovered ? theme.plain(row.value) : theme.fg("muted", row.value);
37
+ const value = state.selected
38
+ ? theme.fg("accent", row.value)
39
+ : valueHovered ? theme.plain(row.value) : theme.fg("muted", row.value);
33
40
  const minus = stepper
34
41
  ? row.stepper?.lower === true
35
42
  ? state.region === "minus" ? theme.plain("- ") : theme.fg("dim", "- ")
@@ -13,3 +13,13 @@ export interface ParsedMouseInput {
13
13
  }
14
14
  /** Extracts SGR mouse reports, leaving any keyboard input untouched. */
15
15
  export declare function parseMouseInput(data: string): ParsedMouseInput;
16
+ export interface RoutedMouseInput {
17
+ /** Input left for the TUI after only claimed reports were removed. */
18
+ readonly data: string;
19
+ readonly consumed: boolean;
20
+ }
21
+ /**
22
+ * Routes every SGR report independently, preserving keyboard bytes and mouse
23
+ * reports the caller does not claim even when they share one physical chunk.
24
+ */
25
+ export declare function routeMouseInput(data: string, claim: (event: PaneMouseEvent) => boolean): RoutedMouseInput;
@@ -30,6 +30,29 @@ export function parseMouseInput(data) {
30
30
  rest += data.slice(index);
31
31
  return { events: Object.freeze(events), rest };
32
32
  }
33
+ /**
34
+ * Routes every SGR report independently, preserving keyboard bytes and mouse
35
+ * reports the caller does not claim even when they share one physical chunk.
36
+ */
37
+ export function routeMouseInput(data, claim) {
38
+ if (!data.includes("\u001b[<"))
39
+ return { data, consumed: false };
40
+ let output = "";
41
+ let index = 0;
42
+ let consumed = false;
43
+ SGR_PATTERN.lastIndex = 0;
44
+ for (let match = SGR_PATTERN.exec(data); match !== null; match = SGR_PATTERN.exec(data)) {
45
+ output += data.slice(index, match.index);
46
+ index = match.index + match[0].length;
47
+ const event = toEvent(Number.parseInt(match[1] ?? "", 10), Number.parseInt(match[2] ?? "", 10), Number.parseInt(match[3] ?? "", 10), match[4] === "m");
48
+ if (event !== null && claim(event))
49
+ consumed = true;
50
+ else
51
+ output += match[0];
52
+ }
53
+ output += data.slice(index);
54
+ return { data: output, consumed };
55
+ }
33
56
  function toEvent(code, column, row, released) {
34
57
  if ((code & 64) !== 0) {
35
58
  const kind = (code & 1) === 0 ? "wheel-up" : "wheel-down";
@@ -0,0 +1,2 @@
1
+ /** Returns spinner-backed status text with A1's canonical three-period marker. */
2
+ export declare function progressStatusText(message: string): string;
@@ -0,0 +1,4 @@
1
+ /** Returns spinner-backed status text with A1's canonical three-period marker. */
2
+ export function progressStatusText(message) {
3
+ return `${message.replace(/(?:…|\.+)$/u, "")}...`;
4
+ }
@@ -0,0 +1,14 @@
1
+ export interface TimestampedPromptRowsInput {
2
+ readonly width: number;
3
+ readonly sourceTimestamp: number | Date;
4
+ readonly render: (contentWidth: number) => readonly string[];
5
+ /** Styles the reserved suffix while keeping policy independent of a vendor theme. */
6
+ readonly decorateSuffix?: (text: string, firstRow: boolean) => string;
7
+ readonly minimumWidth?: number;
8
+ }
9
+ export declare function formatPromptTimestamp(source: number | Date): string | null;
10
+ /**
11
+ * Reserves timestamp columns before wrapping, so the clock never overwrites
12
+ * prompt content. At narrow widths the same renderer is used without a clock.
13
+ */
14
+ export declare function composeTimestampedPromptRows(input: TimestampedPromptRowsInput): readonly string[];
@@ -0,0 +1,20 @@
1
+ import { overlaySpan } from "./spans.js";
2
+ export function formatPromptTimestamp(source) {
3
+ const date = source instanceof Date ? source : new Date(source);
4
+ if (Number.isNaN(date.getTime()))
5
+ return null;
6
+ return `${String(date.getHours()).padStart(2, "0")}:${String(date.getMinutes()).padStart(2, "0")}`;
7
+ }
8
+ /**
9
+ * Reserves timestamp columns before wrapping, so the clock never overwrites
10
+ * prompt content. At narrow widths the same renderer is used without a clock.
11
+ */
12
+ export function composeTimestampedPromptRows(input) {
13
+ const timestamp = formatPromptTimestamp(input.sourceTimestamp);
14
+ if (timestamp === null || input.width < (input.minimumWidth ?? 20))
15
+ return input.render(input.width);
16
+ const suffixWidth = timestamp.length + 2;
17
+ const contentWidth = Math.max(1, input.width - suffixWidth);
18
+ const decorate = input.decorateSuffix ?? ((text) => text);
19
+ return input.render(contentWidth).map((row, index) => overlaySpan(row, contentWidth, input.width, decorate(index === 0 ? ` ${timestamp}` : " ".repeat(suffixWidth), index === 0)));
20
+ }
@@ -19,6 +19,30 @@ export interface ScrollbarInput {
19
19
  readonly scroll: number;
20
20
  readonly trackHeight: number;
21
21
  }
22
+ export type ScrollbarAppearance = "auto" | "always" | "hidden";
23
+ export type ScrollbarStyle = "thin" | "thick";
24
+ export type ScrollbarSpeed = "normal" | "fast" | "high";
25
+ /** Wheel distance: normal (3), fast (6), high as normal + fast (9). */
26
+ export declare function scrollbarWheelRows(speed: ScrollbarSpeed): number;
27
+ /** Selection edge distance uses the same configured rate as a wheel event. */
28
+ export declare function scrollbarSelectionRows(speed: ScrollbarSpeed): number;
29
+ export interface ScrollbarPresentationInput {
30
+ readonly geometry: ScrollbarGeometry | null;
31
+ readonly appearance: ScrollbarAppearance;
32
+ readonly style: ScrollbarStyle;
33
+ readonly hovered: boolean;
34
+ readonly dragging: boolean;
35
+ readonly activeUntil: number;
36
+ readonly now: number;
37
+ }
38
+ export interface ScrollbarPresentation {
39
+ readonly visible: boolean;
40
+ readonly reservesSpace: boolean;
41
+ readonly trackGlyph: "│" | "┃";
42
+ readonly thumbGlyph: "│" | "┃";
43
+ }
44
+ /** Pure appearance decision; activity time is supplied so tests own the clock. */
45
+ export declare function scrollbarPresentation(input: ScrollbarPresentationInput): ScrollbarPresentation;
22
46
  /** Null when the content fits: no scrollbar is drawn and no width is reserved. */
23
47
  export declare function scrollbarGeometry(input: ScrollbarInput): ScrollbarGeometry | null;
24
48
  export declare function scrollbarReservesSpace(geometry: ScrollbarGeometry | null): boolean;
@@ -48,6 +72,8 @@ export interface RailPointer {
48
72
  */
49
73
  export declare class ScrollbarRails {
50
74
  #private;
75
+ noteActivity(key: string, now: number, lingerMs?: number): void;
76
+ isRecentlyActive(key: string, now: number): boolean;
51
77
  isHovered(key: string): boolean;
52
78
  isDragging(key: string): boolean;
53
79
  get draggingKey(): string | null;
@@ -3,6 +3,33 @@
3
3
  * rail rather than to a global, because two scrollable surfaces can be visible
4
4
  * at once and a shared flag lights up the wrong one.
5
5
  */
6
+ /** Wheel distance: normal (3), fast (6), high as normal + fast (9). */
7
+ export function scrollbarWheelRows(speed) {
8
+ return speed === "high" ? 9 : speed === "fast" ? 6 : 3;
9
+ }
10
+ /** Selection edge distance uses the same configured rate as a wheel event. */
11
+ export function scrollbarSelectionRows(speed) {
12
+ return scrollbarWheelRows(speed);
13
+ }
14
+ /** Pure appearance decision; activity time is supplied so tests own the clock. */
15
+ export function scrollbarPresentation(input) {
16
+ const overflowing = input.geometry !== null;
17
+ // Invariant: auto/always reserve the final rail cell even while content fits.
18
+ // The blank gutter prevents prompt timestamps from touching the terminal edge
19
+ // and keeps later scrollbar appearance from reflowing the transcript.
20
+ const reservesSpace = input.appearance !== "hidden";
21
+ const visible = overflowing && reservesSpace && (input.appearance === "always"
22
+ || input.hovered
23
+ || input.dragging
24
+ || (input.activeUntil > 0 && input.now <= input.activeUntil));
25
+ const thick = input.style === "thick";
26
+ return {
27
+ visible,
28
+ reservesSpace,
29
+ trackGlyph: thick ? "┃" : "│",
30
+ thumbGlyph: thick || input.hovered || input.dragging ? "┃" : "│",
31
+ };
32
+ }
6
33
  /** Null when the content fits: no scrollbar is drawn and no width is reserved. */
7
34
  export function scrollbarGeometry(input) {
8
35
  const { contentLength, viewportHeight, trackHeight } = input;
@@ -51,7 +78,14 @@ export function scrollForTrackPage(geometry, trackRow, scroll, viewportHeight) {
51
78
  */
52
79
  export class ScrollbarRails {
53
80
  #hovered = new Set();
81
+ #activeUntil = new Map();
54
82
  #dragging;
83
+ noteActivity(key, now, lingerMs = 900) {
84
+ this.#activeUntil.set(key, Math.max(this.#activeUntil.get(key) ?? 0, now + Math.max(0, lingerMs)));
85
+ }
86
+ isRecentlyActive(key, now) {
87
+ return now <= (this.#activeUntil.get(key) ?? 0);
88
+ }
55
89
  isHovered(key) {
56
90
  return this.#hovered.has(key);
57
91
  }
@@ -97,6 +131,7 @@ export class ScrollbarRails {
97
131
  }
98
132
  clear() {
99
133
  this.#hovered.clear();
134
+ this.#activeUntil.clear();
100
135
  this.#dragging = undefined;
101
136
  }
102
137
  }
@@ -40,6 +40,7 @@ export interface ShortcutRegistryResult {
40
40
  */
41
41
  export declare function assembleShortcuts(declarations: readonly ShortcutDeclaration[]): ShortcutRegistryResult;
42
42
  export declare function assertNoShortcutConflicts(result: ShortcutRegistryResult): void;
43
+ /** Keeps shortcut dispatch and reader-facing listings derived from one ordered declaration set. */
43
44
  export declare class ShortcutRegistry<Action extends string = string> {
44
45
  #private;
45
46
  declare(declaration: ShortcutDeclaration, action: Action): void;
@@ -40,6 +40,7 @@ export function assertNoShortcutConflicts(result) {
40
40
  + `"${duplicate.descriptions[0]}" and "${duplicate.descriptions[1]}"`);
41
41
  }
42
42
  }
43
+ /** Keeps shortcut dispatch and reader-facing listings derived from one ordered declaration set. */
43
44
  export class ShortcutRegistry {
44
45
  #declarations = [];
45
46
  #actions = new Map();
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Replaces the visible columns `[from, to)` of `line` with `span`, preserving
3
+ * the styling before it and re-asserting whatever was still open afterwards, so
4
+ * the tail keeps the colour it had. A wide character straddling either edge is
5
+ * replaced by spaces rather than split.
6
+ */
7
+ export declare function overlaySpan(line: string, from: number, to: number, span: string): string;
8
+ /** Wraps visible columns `[from,to)` in an explicit OSC 8 hyperlink. */
9
+ export declare function hyperlinkSgrSpan(line: string, from: number, to: number, target: string, widthOf?: (text: string) => number): string;
10
+ /** Returns the OSC 8 target painted at a zero-based visible terminal column. */
11
+ export declare function hyperlinkTargetAtColumn(line: string, targetColumn: number, widthOf?: (text: string) => number): string | undefined;
12
+ /**
13
+ * Gives existing and bare web links explicit, tightly bounded OSC 8 regions so
14
+ * the terminal owns dotted-idle/solid-hover decoration without leaking hover
15
+ * state into cells repainted during scrolling.
16
+ */
17
+ export declare function nativeHyperlinkStyle(line: string, color?: (text: string, target: string) => string): string;
18
+ /**
19
+ * Held-button paint for terminal-native links. OSC 8 is removed so the terminal
20
+ * cannot switch a selected link to its solid hover underline. A dotted SGR
21
+ * underline preserves the idle appearance, and VS15 transiently breaks native
22
+ * plain-text URL detection without changing visible width.
23
+ */
24
+ export declare function heldNativeHyperlinkStyle(line: string): string;
25
+ export declare function backgroundSgrSpan(line: string, from: number, to: number, on?: string, off?: string, widthOf?: (text: string) => number): string;