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

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 +131 -0
  86. package/dist/foundation/release/cohort-state.js +384 -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 +60 -0
  94. package/dist/foundation/release/release-gc.js +538 -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
@@ -0,0 +1,249 @@
1
+ /**
2
+ * Reviewed effect authority for every generated Pi setting. Presentation remains
3
+ * generated; this table states who must make each accepted value observable.
4
+ */
5
+ export const PI_SETTING_EFFECTS = Object.freeze({
6
+ autoCompact: effect("live", "agent", "transcript", "compaction status, summary, completion, and failure rows", "pinned-transcript-lifecycle-parity"),
7
+ showImages: effect("live", "shell", "transcript", "pinned inline image and textual fallback components", "pinned-transcript-image-parity"),
8
+ imageWidthCells: effect("live", "shell", "transcript-geometry", "pinned image component width and clipping", "pinned-transcript-image-parity"),
9
+ autoResizeImages: effect("live", "agent", "none", "provider image preparation and pinned warning row", "settings-effects-provider-parity"),
10
+ blockImages: effect("live", "agent", "none", "provider context conversion and pinned blocked-image notice", "settings-effects-provider-parity"),
11
+ enableSkillCommands: effect("live", "shell", "editor-menu", "pinned command autocomplete list", "pinned-editor-input-parity"),
12
+ steeringMode: effect("live", "agent", "queue-transcript", "pinned steering queue and submitted prompt rows", "pinned-status-indicator-parity"),
13
+ followUpMode: effect("live", "agent", "queue-transcript", "pinned follow-up queue and submitted prompt rows", "pinned-status-indicator-parity"),
14
+ transport: effect("live", "agent", "status-error", "pinned provider request status and failure rows", "settings-effects-provider-parity"),
15
+ httpIdleTimeoutMs: effect("live", "agent", "retry-error", "pinned timeout, retry, and terminal failure rows", "pinned-transcript-lifecycle-parity"),
16
+ thinkingLevel: effect("live", "agent", "footer-transcript", "pinned footer indicator, thinking rows, and clamp notice", "pinned-status-indicator-parity"),
17
+ theme: hiddenEffect("live", "shell", "pinned theme selector and complete themed shell", "pinned-theme-parity"),
18
+ hideThinkingBlock: effect("live", "shell", "transcript", "pinned thinking block presence and spacing", "pinned-transcript-lifecycle-parity"),
19
+ mermaidRenderingMode: effect("live", "shell", "markdown", "pinned Mermaid Markdown transformation", "pinned-assistant-content-parity"),
20
+ showCacheMissNotices: effect("live", "shell", "transcript-notice", "pinned cache-miss transcript notice", "pinned-transcript-lifecycle-parity"),
21
+ collapseChangelog: effect("next-start", "startup", "startup-transcript", "pinned startup and command changelog components", "pi-startup-composition-parity"),
22
+ enableInstallTelemetry: effect("next-start", "installation", "none", "install lifecycle and its pinned failure diagnostic", "settings-effects-installation-parity"),
23
+ quietStartup: hiddenEffect("next-start", "startup", "pinned startup suppression lifecycle", "pi-startup-composition-parity"),
24
+ defaultProjectTrust: effect("next-start", "startup", "startup-selector", "pinned pre-resource project trust selector", "project-trust-startup-parity"),
25
+ doubleEscapeAction: effect("live", "shell", "selector", "pinned tree or fork selector", "pinned-selector-parity"),
26
+ treeFilterMode: effect("live", "shell", "selector", "pinned tree selector filter, rows, and hints", "pinned-selector-parity"),
27
+ showHardwareCursor: effect("live", "terminal", "terminal-cursor", "pinned editor, overlay, blur, failure, and exit cursor operations", "pi-terminal-operation-parity"),
28
+ editorPaddingX: effect("live", "shell", "editor-geometry", "pinned editor border, padding, wrapping, and cursor column", "pinned-editor-input-parity"),
29
+ outputPad: effect("live", "shell", "transcript-geometry", "pinned transcript, tool, status, and error horizontal padding", "pinned-transcript-lifecycle-parity"),
30
+ autocompleteMaxVisible: effect("live", "shell", "menu-geometry", "pinned autocomplete clipping and editor anchoring", "pinned-editor-input-parity"),
31
+ clearOnShrink: effect("live", "terminal", "terminal-frame", "pinned resize clearing and resulting terminal frame", "pi-terminal-operation-parity"),
32
+ showTerminalProgress: effect("live", "terminal", "terminal-status", "pinned OSC progress lifecycle", "pi-terminal-operation-parity"),
33
+ tuiMode: hiddenEffect("next-session", "shell", "pinned regular/fullscreen selector and terminal lifecycle", "pi-terminal-operation-parity"),
34
+ fullscreenExitOutput: effect("current-exit", "shutdown", "restored-parent-output", "pinned styled transcript and compact dim resume hint", "pinned-fullscreen-exit-parity"),
35
+ fullscreenScrollbar: hiddenEffect("live", "shell", "pinned fullscreen scrollbar reservation", "pi-terminal-operation-parity"),
36
+ warnings: effect("live", "agent", "transcript-notice", "pinned warning rows by warning part", "pinned-transcript-lifecycle-parity"),
37
+ });
38
+ function effect(application, owner, visualClass, pinnedSurface, evidence) {
39
+ return { application, owner, visual: { class: visualClass, pinnedSurface, evidence } };
40
+ }
41
+ function hiddenEffect(application, owner, pinnedSurface, evidence) {
42
+ return { application, owner, hiddenInBare: true, visual: { class: "hidden", pinnedSurface, evidence } };
43
+ }
44
+ /**
45
+ * One transactional authority for Pi setting validation, active effects,
46
+ * persistence, durability, rollback, and owner lifecycle.
47
+ */
48
+ export class PiSettingsCoordinator {
49
+ #operations;
50
+ #handlers = new Map();
51
+ #state = new Map();
52
+ #productMode;
53
+ #flushStorage;
54
+ #drainErrors;
55
+ constructor(operations, options) {
56
+ this.#operations = new Map(operations.map(operation => [operation.key, operation]));
57
+ this.#productMode = options.productMode ?? "bare";
58
+ this.#flushStorage = options.flush;
59
+ this.#drainErrors = options.drainErrors;
60
+ for (const operation of operations) {
61
+ const stored = operation.read();
62
+ this.#state.set(operation.key, { stored, effective: stored, inconsistentReason: null });
63
+ }
64
+ }
65
+ bindOwner(owner, handlers) {
66
+ const bound = [];
67
+ for (const [candidate, handler] of Object.entries(handlers)) {
68
+ if (handler === undefined)
69
+ continue;
70
+ const key = candidate;
71
+ const definition = PI_SETTING_EFFECTS[key];
72
+ if (definition === undefined)
73
+ throw new Error(`unknown Pi setting effect: ${key}`);
74
+ if (definition.owner !== owner)
75
+ throw new Error(`${key} belongs to ${definition.owner}, not ${owner}`);
76
+ if (this.#productMode === "bare" && definition.hiddenInBare === true) {
77
+ throw new Error(`${key} is hidden in bare A1`);
78
+ }
79
+ this.#handlers.set(key, handler);
80
+ bound.push(key);
81
+ }
82
+ return () => this.unbindOwner(owner, bound);
83
+ }
84
+ unbindOwner(owner, keys) {
85
+ const candidates = keys ?? [...this.#handlers.keys()];
86
+ for (const key of candidates)
87
+ if (PI_SETTING_EFFECTS[key].owner === owner)
88
+ this.#handlers.delete(key);
89
+ }
90
+ definition(key) {
91
+ return PI_SETTING_EFFECTS[key];
92
+ }
93
+ storedValue(key) {
94
+ const operation = this.#requireOperation(key);
95
+ const stored = operation.read();
96
+ const state = this.#requireState(key);
97
+ state.stored = stored;
98
+ return stored;
99
+ }
100
+ effectiveValue(key) {
101
+ return this.#requireState(key).effective;
102
+ }
103
+ limitationReason(key) {
104
+ const definition = PI_SETTING_EFFECTS[key];
105
+ if (this.#productMode === "bare" && definition.hiddenInBare === true)
106
+ return "setting is not available in the active product mode";
107
+ const inconsistent = this.#requireState(key).inconsistentReason;
108
+ if (inconsistent !== null)
109
+ return inconsistent;
110
+ if (!this.#handlers.has(key))
111
+ return `${definition.owner} effect is not bound for ${definition.application} application`;
112
+ return null;
113
+ }
114
+ available(key) {
115
+ return this.limitationReason(key) === null;
116
+ }
117
+ validate(key, value) {
118
+ this.#requireOperation(key).validate(value);
119
+ }
120
+ async apply(key, value) {
121
+ const operation = this.#requireOperation(key);
122
+ operation.validate(value);
123
+ const definition = PI_SETTING_EFFECTS[key];
124
+ const previousStored = operation.read();
125
+ const state = this.#requireState(key);
126
+ const previousEffective = state.effective;
127
+ const limitationReason = this.limitationReason(key);
128
+ if (limitationReason !== null) {
129
+ return outcome("unavailable", definition.application, previousStored, previousEffective, null, limitationReason);
130
+ }
131
+ const handler = this.#handlers.get(key);
132
+ if (definition.application !== "live") {
133
+ try {
134
+ operation.write(value);
135
+ await this.flush();
136
+ state.stored = value;
137
+ return outcome("deferred", definition.application, value, previousEffective, null, null);
138
+ }
139
+ catch (error) {
140
+ const failure = await this.#restorePersistence(operation, previousStored, error);
141
+ state.stored = operation.read();
142
+ return outcome("failed", definition.application, state.stored, previousEffective, failure, null);
143
+ }
144
+ }
145
+ try {
146
+ await handler.apply(value);
147
+ }
148
+ catch (error) {
149
+ return outcome("failed", definition.application, previousStored, previousEffective, describe(error), null);
150
+ }
151
+ state.effective = value;
152
+ try {
153
+ operation.write(value);
154
+ await this.flush();
155
+ state.stored = value;
156
+ state.inconsistentReason = null;
157
+ return outcome("applied", definition.application, value, value, null, null);
158
+ }
159
+ catch (error) {
160
+ const persistenceFailure = await this.#restorePersistence(operation, previousStored, error);
161
+ try {
162
+ await handler.apply(previousEffective);
163
+ state.effective = previousEffective;
164
+ state.stored = operation.read();
165
+ return outcome("failed", definition.application, state.stored, previousEffective, persistenceFailure, null);
166
+ }
167
+ catch (rollbackError) {
168
+ state.stored = operation.read();
169
+ state.inconsistentReason = `rollback failed after ${persistenceFailure}: ${describe(rollbackError)}`;
170
+ return outcome("failed", definition.application, state.stored, state.effective, state.inconsistentReason, state.inconsistentReason);
171
+ }
172
+ }
173
+ }
174
+ async flush() {
175
+ await this.#flushStorage();
176
+ const errors = this.#drainErrors?.() ?? [];
177
+ if (errors.length > 0)
178
+ throw new Error(errors.map(value => value.error.message).join("; "));
179
+ }
180
+ async rollback(key, value) {
181
+ const handler = this.#handlers.get(key);
182
+ if (handler === undefined)
183
+ throw new Error(`cannot roll back unbound setting: ${key}`);
184
+ await handler.apply(value);
185
+ this.#requireState(key).effective = value;
186
+ }
187
+ async #restorePersistence(operation, previous, cause) {
188
+ const original = describe(cause);
189
+ try {
190
+ operation.write(previous);
191
+ await this.flush();
192
+ return original;
193
+ }
194
+ catch (rollbackError) {
195
+ return `${original}; persistence rollback failed: ${describe(rollbackError)}`;
196
+ }
197
+ }
198
+ #requireOperation(key) {
199
+ const operation = this.#operations.get(key);
200
+ if (operation === undefined)
201
+ throw new Error(`setting is unavailable: ${key}`);
202
+ return operation;
203
+ }
204
+ #requireState(key) {
205
+ const state = this.#state.get(key);
206
+ if (state === undefined)
207
+ throw new Error(`setting state is unavailable: ${key}`);
208
+ return state;
209
+ }
210
+ }
211
+ export function settingsEffectInventoryDrift(presented, reviewed = Object.keys(PI_SETTING_EFFECTS)) {
212
+ const reviewedSet = new Set(reviewed);
213
+ const presentedSet = new Set(presented);
214
+ const counts = new Map();
215
+ for (const key of reviewed)
216
+ counts.set(key, (counts.get(key) ?? 0) + 1);
217
+ return {
218
+ unmapped: presented.filter(key => !reviewedSet.has(key)),
219
+ stale: reviewed.filter(key => !presentedSet.has(key)),
220
+ duplicated: [...counts].filter(([, count]) => count > 1).map(([key]) => key),
221
+ };
222
+ }
223
+ export function settingsVisualInventoryViolations(presented, reviewed = PI_SETTING_EFFECTS) {
224
+ const violations = [];
225
+ for (const candidate of presented) {
226
+ const key = candidate;
227
+ const definition = reviewed[key];
228
+ if (definition === undefined) {
229
+ violations.push(`${candidate}: missing visual classification`);
230
+ continue;
231
+ }
232
+ const visual = definition.visual;
233
+ if (!visual || visual.pinnedSurface.trim().length === 0)
234
+ violations.push(`${candidate}: missing pinned visual source`);
235
+ if (!visual || visual.evidence.trim().length === 0)
236
+ violations.push(`${candidate}: missing independent visual evidence`);
237
+ if (definition.hiddenInBare === true && visual?.class !== "hidden")
238
+ violations.push(`${candidate}: hidden setting declares a visible frame`);
239
+ if (definition.hiddenInBare !== true && visual?.class === "hidden")
240
+ violations.push(`${candidate}: visible setting declares hidden evidence`);
241
+ }
242
+ return violations;
243
+ }
244
+ function outcome(status, application, storedValue, effectiveValue, failure, limitationReason) {
245
+ return { status, application, storedValue, effectiveValue, failure, limitationReason };
246
+ }
247
+ function describe(error) {
248
+ return error instanceof Error ? error.message : String(error);
249
+ }
@@ -0,0 +1,43 @@
1
+ import type { SettingsManager } from "@earendil-works/pi-coding-agent";
2
+ import type { AgentJsonValue, AgentSettingChangeOutcome, AgentSettingDescriptor, AgentSettingOwner, AgentSettingsPort } from "../../../contracts/agent-engine/index.js";
3
+ import { type PiSettingOwnerHandlers } from "./settings-effects.js";
4
+ /** Values only the running engine knows. */
5
+ export interface PiSettingsProviders {
6
+ readonly themes?: () => readonly string[];
7
+ readonly thinkingLevels?: () => readonly string[];
8
+ readonly productMode?: "bare" | "comparison";
9
+ }
10
+ export declare const AUTOMATIC_THEME = "automatic";
11
+ interface AutomaticTheme {
12
+ readonly light: string;
13
+ readonly dark: string;
14
+ }
15
+ export declare function parseAutomaticTheme(stored: string): AutomaticTheme | null;
16
+ export declare const EXPOSED_SETTING_KEYS: readonly string[];
17
+ export declare function settingsInventoryDrift(presented: readonly string[], mapped: readonly string[]): {
18
+ readonly unmapped: readonly string[];
19
+ readonly stale: readonly string[];
20
+ };
21
+ /**
22
+ * Pi settings boundary backed by the transactional settings coordinator. The
23
+ * generated metadata owns presentation while the reviewed effect registry owns
24
+ * timing, availability, and active behavior.
25
+ */
26
+ export declare class PiSettingsIntegration implements AgentSettingsPort {
27
+ #private;
28
+ private readonly settings;
29
+ readonly capabilities: {
30
+ write: boolean;
31
+ flush: boolean;
32
+ };
33
+ constructor(settings: SettingsManager, providers?: PiSettingsProviders);
34
+ bindOwner(owner: AgentSettingOwner, handlers: PiSettingOwnerHandlers): () => void;
35
+ unbindOwner(owner: AgentSettingOwner): void;
36
+ listSettings(): Promise<readonly AgentSettingDescriptor[]>;
37
+ readSetting(key: string): Promise<AgentJsonValue | undefined>;
38
+ writeSetting(key: string, value: AgentJsonValue): Promise<AgentSettingChangeOutcome>;
39
+ /** Shared route used by the pinned selector and owned settings surface. */
40
+ writeSettingNow(key: string, value: AgentJsonValue): Promise<AgentSettingChangeOutcome>;
41
+ flush(): Promise<void>;
42
+ }
43
+ export {};
@@ -1,18 +1,10 @@
1
1
  import piSettingsMetadata from "./pi-settings-metadata.json" with { type: "json" };
2
- /**
3
- * The engine stores a theme as one string with two forms: a theme's name, or a
4
- * `light/dark` pair meaning "follow the terminal". That grammar is the engine's,
5
- * so it is parsed and composed here and reaches the surfaces above as ordinary
6
- * settings — a theme entry that offers `automatic`, and, while automatic, one
7
- * entry per terminal appearance.
8
- */
2
+ import { PI_SETTING_EFFECTS, PiSettingsCoordinator, settingsEffectInventoryDrift, } from "./settings-effects.js";
9
3
  export const AUTOMATIC_THEME = "automatic";
10
- /** The themes an automatic setting names for each terminal appearance. */
11
4
  const LIGHT_APPEARANCE_THEME = "light";
12
5
  const DARK_APPEARANCE_THEME = "dark";
13
6
  const THEME_KEY = "theme";
14
7
  const THINKING_KEY = "thinkingLevel";
15
- /** A stored theme is automatic when it names one theme per terminal appearance. */
16
8
  export function parseAutomaticTheme(stored) {
17
9
  const at = stored.indexOf("/");
18
10
  if (at < 0 || stored.indexOf("/", at + 1) >= 0)
@@ -21,24 +13,8 @@ export function parseAutomaticTheme(stored) {
21
13
  const dark = stored.slice(at + 1).trim();
22
14
  return light.length > 0 && dark.length > 0 ? { light, dark } : null;
23
15
  }
24
- /**
25
- * How the engine presents these settings — wording, order, and the flags a
26
- * dialog-backed setting offers — generated from its own source by
27
- * `npm run update:pi-settings-metadata` and verified by a governance test, so a
28
- * Pi upgrade cannot silently reword or reorder what A1 shows.
29
- */
30
16
  const PRESENTATION = piSettingsMetadata;
31
- /**
32
- * The settings A1 exposes: the ones the engine presents. Kept as the engine's
33
- * own inventory rather than a list beside it, so a setting it adds or renames
34
- * shows up as a named test failure instead of quietly going missing.
35
- */
36
17
  export const EXPOSED_SETTING_KEYS = PRESENTATION.presented;
37
- /**
38
- * What has drifted between the settings the engine presents and the settings A1
39
- * maps to its API: the ones A1 has not caught up with, and the ones it kept
40
- * after the engine dropped them. Either is a build failure with a name in it.
41
- */
42
18
  export function settingsInventoryDrift(presented, mapped) {
43
19
  const has = new Set(mapped);
44
20
  const engine = new Set(presented);
@@ -47,62 +23,87 @@ export function settingsInventoryDrift(presented, mapped) {
47
23
  stale: mapped.filter(key => !engine.has(key)),
48
24
  };
49
25
  }
50
- /** What the engine offers for a setting, as the strings it words them with. */
51
26
  function offered(key) {
52
27
  return PRESENTATION.settings[key]?.values ?? [];
53
28
  }
54
- /**
55
- * The same, read as the numbers a numeric setting stores. Only for a setting
56
- * whose list is its whole domain: where the engine offers a few numbers but
57
- * accepts any within a range, the range governs and the list is only shortcuts.
58
- */
59
29
  function offeredNumbers(key) {
60
30
  return offered(key).map(value => Number.parseInt(value, 10)).filter(value => Number.isSafeInteger(value));
61
31
  }
32
+ /**
33
+ * Pi settings boundary backed by the transactional settings coordinator. The
34
+ * generated metadata owns presentation while the reviewed effect registry owns
35
+ * timing, availability, and active behavior.
36
+ */
62
37
  export class PiSettingsIntegration {
63
38
  settings;
64
39
  capabilities = { write: true, flush: true };
65
40
  #operations;
66
41
  #providers;
42
+ #coordinator;
67
43
  constructor(settings, providers = {}) {
68
44
  this.settings = settings;
69
45
  this.#providers = providers;
70
- this.#operations = new Map(operations(settings).map(operation => [operation.descriptor.key, operation]));
71
- if (this.#operations.size !== EXPOSED_SETTING_KEYS.length || EXPOSED_SETTING_KEYS.some(key => !this.#operations.has(key))) {
72
- throw new Error("Pi settings integration does not cover every A1-exposed setting");
46
+ const mapped = operations(settings, providers);
47
+ this.#operations = new Map(mapped.map(operation => [operation.key, operation]));
48
+ const presentationDrift = settingsInventoryDrift(EXPOSED_SETTING_KEYS, mapped.map(operation => operation.key));
49
+ const effectDrift = settingsEffectInventoryDrift(EXPOSED_SETTING_KEYS);
50
+ if (presentationDrift.unmapped.length > 0 || presentationDrift.stale.length > 0
51
+ || effectDrift.unmapped.length > 0 || effectDrift.stale.length > 0 || effectDrift.duplicated.length > 0) {
52
+ throw new Error([
53
+ `unmapped operations: ${presentationDrift.unmapped.join(", ")}`,
54
+ `stale operations: ${presentationDrift.stale.join(", ")}`,
55
+ `unmapped effects: ${effectDrift.unmapped.join(", ")}`,
56
+ `stale effects: ${effectDrift.stale.join(", ")}`,
57
+ `duplicated effects: ${effectDrift.duplicated.join(", ")}`,
58
+ ].join("; "));
73
59
  }
60
+ this.#coordinator = new PiSettingsCoordinator(mapped, {
61
+ productMode: providers.productMode ?? "bare",
62
+ flush: () => settings.flush(),
63
+ drainErrors: () => settings.drainErrors(),
64
+ });
65
+ }
66
+ bindOwner(owner, handlers) {
67
+ return this.#coordinator.bindOwner(owner, handlers);
68
+ }
69
+ unbindOwner(owner) {
70
+ this.#coordinator.unbindOwner(owner);
74
71
  }
75
72
  async listSettings() {
76
73
  const rank = (key) => {
77
74
  const at = PRESENTATION.order.indexOf(key);
78
75
  return at < 0 ? PRESENTATION.order.length : at;
79
76
  };
80
- const listed = [...this.#operations.values()]
77
+ return [...this.#operations.values()]
78
+ .filter(operation => this.#coordinator.available(operation.key))
81
79
  .map(operation => {
82
- const key = operation.descriptor.key;
80
+ const key = operation.key;
83
81
  const wording = PRESENTATION.settings[key];
84
82
  const flags = PRESENTATION.dialogs[key];
85
83
  const bounds = PRESENTATION.bounds[key];
86
- return {
84
+ const descriptor = {
87
85
  ...operation.descriptor,
86
+ application: PI_SETTING_EFFECTS[key].application,
87
+ owner: PI_SETTING_EFFECTS[key].owner,
88
+ available: true,
89
+ limitationReason: null,
90
+ writable: true,
91
+ storedValue: this.#coordinator.storedValue(key),
92
+ effectiveValue: this.#coordinator.effectiveValue(key),
88
93
  ...(bounds === undefined ? {} : bounds),
89
94
  ...(wording === undefined ? {} : { label: wording.label, description: wording.description }),
90
95
  ...(flags === undefined ? {} : { flags }),
91
96
  };
97
+ return this.#resolved(descriptor);
92
98
  })
93
- .map(descriptor => this.#resolved(descriptor))
94
99
  .sort((left, right) => rank(left.key) - rank(right.key));
95
- // Following the terminal is one choice on the theme itself, not two further
96
- // settings: the pair behind it is the engine's grammar, not a reader's task.
97
- return listed;
98
100
  }
99
- /** Overlays the values a setting can only offer once something is running. */
100
101
  #resolved(descriptor) {
101
102
  if (descriptor.key === THEME_KEY) {
102
103
  const themes = this.#themes();
103
104
  if (themes.length === 0)
104
105
  return descriptor;
105
- return { ...descriptor, valueType: "enum", writable: true, resolvedWhenRead: true, choices: [AUTOMATIC_THEME, ...themes] };
106
+ return { ...descriptor, valueType: "enum", resolvedWhenRead: true, choices: [AUTOMATIC_THEME, ...themes] };
106
107
  }
107
108
  if (descriptor.key === THINKING_KEY) {
108
109
  const levels = this.#providers.thinkingLevels?.() ?? [];
@@ -115,53 +116,24 @@ export class PiSettingsIntegration {
115
116
  #themes() {
116
117
  return this.#providers.themes?.() ?? [];
117
118
  }
118
- #storedTheme() {
119
- const stored = this.#operations.get(THEME_KEY)?.read();
120
- return typeof stored === "string" ? stored : "";
121
- }
122
119
  async readSetting(key) {
123
- if (key === THEME_KEY) {
124
- const pair = parseAutomaticTheme(this.#storedTheme());
125
- return pair === null ? this.#operations.get(key)?.read() : AUTOMATIC_THEME;
126
- }
127
- return this.#operations.get(key)?.read();
120
+ return isPiSettingKey(key) && this.#operations.has(key) ? this.#coordinator.storedValue(key) : undefined;
128
121
  }
129
- async writeSetting(key, value) { this.writeSettingNow(key, value); }
130
- writeSettingNow(key, value) {
131
- if (typeof value === "string" && key === THEME_KEY) {
132
- this.#writeTheme(value);
133
- return;
134
- }
135
- const operation = this.#operations.get(key);
136
- if (!operation)
122
+ async writeSetting(key, value) {
123
+ if (!isPiSettingKey(key) || !this.#operations.has(key))
137
124
  throw new Error(`setting is unavailable: ${key}`);
138
- operation.write(value);
125
+ return await this.#coordinator.apply(key, value);
139
126
  }
140
- /**
141
- * Writes the theme in the engine's own grammar. Following the terminal is
142
- * stored as the pair the engine reads for it, made of the themes named for
143
- * each appearance when they are installed; where they are not, the theme
144
- * already in use stands for both, so the setting still round-trips.
145
- */
146
- #writeTheme(value) {
147
- const theme = this.#operations.get(THEME_KEY);
148
- if (!theme)
149
- throw new Error(`setting is unavailable: ${THEME_KEY}`);
150
- if (value !== AUTOMATIC_THEME) {
151
- theme.write(value);
152
- return;
153
- }
154
- if (parseAutomaticTheme(this.#storedTheme()) !== null)
155
- return;
156
- const installed = this.#themes();
157
- const current = this.#storedTheme();
158
- const light = installed.includes(LIGHT_APPEARANCE_THEME) ? LIGHT_APPEARANCE_THEME : current;
159
- const dark = installed.includes(DARK_APPEARANCE_THEME) ? DARK_APPEARANCE_THEME : current;
160
- theme.write(`${light}/${dark}`);
127
+ /** Shared route used by the pinned selector and owned settings surface. */
128
+ async writeSettingNow(key, value) {
129
+ return await this.writeSetting(key, value);
130
+ }
131
+ async flush() {
132
+ await this.#coordinator.flush();
161
133
  }
162
- async flush() { await this.settings.flush(); }
163
134
  }
164
- function operations(settings) {
135
+ function operations(settings, providers) {
136
+ const themes = () => providers.themes?.() ?? [];
165
137
  return [
166
138
  bool("autoCompact", () => settings.getCompactionEnabled(), value => settings.setCompactionEnabled(value)),
167
139
  bool("showImages", () => settings.getShowImages(), value => settings.setShowImages(value)),
@@ -173,12 +145,8 @@ function operations(settings) {
173
145
  choice("followUpMode", offered("followUpMode"), () => settings.getFollowUpMode(), value => settings.setFollowUpMode(value)),
174
146
  choice("transport", offered("transport"), () => settings.getTransport(), value => settings.setTransport(value)),
175
147
  numberSetting("httpIdleTimeoutMs", () => settings.getHttpIdleTimeoutMs(), value => settings.setHttpIdleTimeoutMs(value), 0),
176
- // The engine reads these from the running session rather than declaring them,
177
- // so they arrive through the runtime provider rather than from its source.
178
148
  choice("thinkingLevel", ["off", "minimal", "low", "medium", "high", "xhigh"], () => settings.getDefaultThinkingLevel() ?? "medium", value => settings.setDefaultThinkingLevel(value)),
179
- // The raw setting, not the resolved theme: the engine hides the automatic
180
- // pair behind getTheme, and the pair is the thing A1 presents parts of.
181
- stringSetting("theme", () => settings.getThemeSetting() ?? "default", value => settings.setTheme(value)),
149
+ themeSetting(settings, themes),
182
150
  bool("hideThinkingBlock", () => settings.getHideThinkingBlock(), value => settings.setHideThinkingBlock(value)),
183
151
  choice("mermaidRenderingMode", offered("mermaidRenderingMode"), () => settings.getMermaidRenderingMode(), value => settings.setMermaidRenderingMode(value)),
184
152
  bool("showCacheMissNotices", () => settings.getShowCacheMissNotices(), value => settings.setShowCacheMissNotices(value)),
@@ -201,33 +169,59 @@ function operations(settings) {
201
169
  ];
202
170
  }
203
171
  function bool(key, read, write) {
204
- return { descriptor: { key, valueType: "boolean", writable: true }, read, write(value) { if (typeof value !== "boolean")
205
- invalid(key); write(value); } };
172
+ return operation(key, "boolean", read, value => { if (typeof value !== "boolean")
173
+ invalid(key); }, value => write(value));
206
174
  }
207
175
  function numberSetting(key, read, write, minimum) {
208
176
  const declared = PRESENTATION.bounds[key];
209
177
  const low = declared?.minimum ?? minimum;
210
178
  const high = declared?.maximum;
179
+ return operation(key, "number", read, value => {
180
+ if (typeof value !== "number" || !Number.isSafeInteger(value) || value < low || (high !== undefined && value > high))
181
+ invalid(key);
182
+ }, value => write(value));
183
+ }
184
+ function jsonObject(key, read, write) {
185
+ const boundedRead = () => Object.fromEntries(Object.entries(read()).filter((entry) => typeof entry[1] === "boolean"));
186
+ return operation(key, "json", boundedRead, value => {
187
+ if (!value || typeof value !== "object" || Array.isArray(value))
188
+ invalid(key);
189
+ }, write);
190
+ }
191
+ function choice(key, choices, read, write) {
211
192
  return {
212
- descriptor: { key, valueType: "number", writable: true },
213
- read,
214
- write(value) {
215
- if (typeof value !== "number" || !Number.isSafeInteger(value) || value < low || (high !== undefined && value > high))
216
- invalid(key);
217
- write(value);
218
- },
193
+ ...operation(key, "enum", read, value => { if (!choices.includes(value))
194
+ invalid(key); }, write),
195
+ descriptor: { key, valueType: "enum", choices },
219
196
  };
220
197
  }
221
- function stringSetting(key, read, write) {
222
- return { descriptor: { key, valueType: "string", writable: true }, read, write(value) { if (typeof value !== "string" || value.length === 0)
223
- invalid(key); write(value); } };
198
+ function themeSetting(settings, themes) {
199
+ const raw = () => settings.getThemeSetting() ?? "default";
200
+ const read = () => parseAutomaticTheme(raw()) === null ? raw() : AUTOMATIC_THEME;
201
+ return operation(THEME_KEY, "string", read, value => {
202
+ if (typeof value !== "string" || value.length === 0)
203
+ invalid(THEME_KEY);
204
+ }, value => {
205
+ const selected = value;
206
+ if (selected !== AUTOMATIC_THEME) {
207
+ settings.setTheme(selected);
208
+ return;
209
+ }
210
+ if (parseAutomaticTheme(raw()) !== null)
211
+ return;
212
+ const installed = themes();
213
+ const current = raw();
214
+ const light = installed.includes(LIGHT_APPEARANCE_THEME) ? LIGHT_APPEARANCE_THEME : current;
215
+ const dark = installed.includes(DARK_APPEARANCE_THEME) ? DARK_APPEARANCE_THEME : current;
216
+ settings.setTheme(`${light}/${dark}`);
217
+ });
224
218
  }
225
- function jsonObject(key, read, write) {
226
- return { descriptor: { key, valueType: "json", writable: true }, read: () => Object.fromEntries(Object.entries(read()).filter((entry) => typeof entry[1] === "boolean")), write(value) { if (!value || typeof value !== "object" || Array.isArray(value))
227
- invalid(key); write(value); } };
219
+ function operation(key, valueType, read, validate, write) {
220
+ return { key, descriptor: { key, valueType }, read, validate, write };
228
221
  }
229
- function choice(key, choices, read, write) {
230
- return { descriptor: { key, valueType: "enum", writable: true, choices }, read, write(value) { if (!choices.includes(value))
231
- invalid(key); write(value); } };
222
+ function isPiSettingKey(key) {
223
+ return Object.hasOwn(PI_SETTING_EFFECTS, key);
224
+ }
225
+ function invalid(key) {
226
+ throw new TypeError(`setting value is invalid: ${key}`);
232
227
  }
233
- function invalid(key) { throw new TypeError(`setting value is invalid: ${key}`); }
@@ -1,4 +1,4 @@
1
- import type { AgentJsonValue, AgentWorkflowDescriptor, AgentWorkflowPort } from "../agent-engine-contracts/index.js";
1
+ import type { AgentJsonValue, AgentWorkflowDescriptor, AgentWorkflowPort } from "../../../contracts/agent-engine/index.js";
2
2
  import { type PiWorkflowRoute } from "./workflows.js";
3
3
  export type WorkflowCapability = "prompt" | "abort" | "compact" | "bash" | "models.read" | "models.write" | "auth.login" | "auth.logout" | "settings.read" | "settings.write" | "resources.read" | "resources.reload" | "session.read" | "session.new" | "session.resume" | "session.fork" | "session.tree" | "session.import" | "clipboard.write" | "export.write" | "share.write" | "process.quit" | "diagnostics.read";
4
4
  export interface WorkflowControllerResult {
@@ -6,6 +6,7 @@ export interface WorkflowControllerResult {
6
6
  readonly message: string;
7
7
  readonly value?: AgentJsonValue;
8
8
  }
9
+ /** Capability-gates pinned Pi workflows before delegating execution through the neutral workflow port. */
9
10
  export declare class PiWorkflowControllerPort implements AgentWorkflowPort {
10
11
  #private;
11
12
  private readonly execute;
@@ -16,5 +17,5 @@ export declare class PiWorkflowControllerPort implements AgentWorkflowPort {
16
17
  listWorkflows(): Promise<readonly AgentWorkflowDescriptor[]>;
17
18
  executeWorkflow(workflowId: string, input: AgentJsonValue, signal?: AbortSignal): Promise<AgentJsonValue>;
18
19
  }
19
- export declare const PI_BUILTIN_WORKFLOW_ROUTES: readonly ("name" | "share" | "model" | "login" | "logout" | "settings" | "reload" | "compact" | "new" | "resume" | "scoped-models" | "export" | "import" | "copy" | "session" | "changelog" | "hotkeys" | "fork" | "clone" | "tree" | "trust" | "quit" | "debug" | "arminsayshi" | "dementedelves")[];
20
+ export declare const PI_BUILTIN_WORKFLOW_ROUTES: readonly ("name" | "share" | "model" | "login" | "logout" | "settings" | "reload" | "compact" | "new" | "resume" | "session" | "scoped-models" | "export" | "import" | "copy" | "changelog" | "hotkeys" | "fork" | "clone" | "tree" | "trust" | "quit" | "debug" | "arminsayshi" | "dementedelves")[];
20
21
  export declare const PI_WORKFLOW_CAPABILITIES: readonly WorkflowCapability[];
@@ -8,6 +8,7 @@ const DEFINITIONS = [
8
8
  define("new", "session.new"), define("compact", "compact"), define("resume", "session.resume"), define("reload", "resources.reload"),
9
9
  define("quit", "process.quit"), define("debug", "diagnostics.read"), define("arminsayshi", "resources.read"), define("dementedelves", "resources.read"),
10
10
  ];
11
+ /** Capability-gates pinned Pi workflows before delegating execution through the neutral workflow port. */
11
12
  export class PiWorkflowControllerPort {
12
13
  execute;
13
14
  capabilities = { execute: true };
@@ -0,0 +1,11 @@
1
+ export interface ClipboardImageData {
2
+ readonly data: string;
3
+ readonly mimeType: string;
4
+ }
5
+ /**
6
+ * Converts valid padded or unpadded standard base64 into its unique padded form.
7
+ * Clipboard adapters are untrusted at this boundary, so reject representations
8
+ * that Node's permissive base64 decoder would otherwise partially accept.
9
+ */
10
+ export declare function canonicalizeClipboardImage(image: ClipboardImageData): ClipboardImageData | null;
11
+ export declare function canonicalizeStandardBase64(value: string): string | null;