@timurproko/a1 0.2.7-dev.1249 → 0.2.7-dev.1255

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 (524) hide show
  1. package/README.md +11 -36
  2. package/bin/cli.js +2 -17
  3. package/bin/ui.js +10 -51
  4. package/dist/app/session-shell/clipboard-diagnostics.d.ts +2 -2
  5. package/dist/app/session-shell/clipboard-image.d.ts +0 -1
  6. package/dist/app/session-shell/clipboard-image.js +1 -1
  7. package/dist/app/session-shell/dialog-coordinator.d.ts +6 -5
  8. package/dist/app/session-shell/dialog-coordinator.js +3 -4
  9. package/dist/app/session-shell/dock-chrome.d.ts +11 -6
  10. package/dist/app/session-shell/dock-chrome.js +5 -8
  11. package/dist/app/session-shell/editor-hyperlink-budget.d.ts +0 -2
  12. package/dist/app/session-shell/editor-hyperlink-budget.js +1 -1
  13. package/dist/app/session-shell/exit-notice.d.ts +3 -3
  14. package/dist/app/session-shell/exit-notice.js +10 -10
  15. package/dist/app/session-shell/extension-surface.d.ts +8 -7
  16. package/dist/app/session-shell/helper-pool.d.ts +3 -4
  17. package/dist/app/session-shell/helper-pool.js +1 -1
  18. package/dist/app/session-shell/image-preparation-client.d.ts +4 -3
  19. package/dist/app/session-shell/image-preparation.d.ts +0 -2
  20. package/dist/app/session-shell/image-preparation.js +2 -2
  21. package/dist/app/session-shell/image-source.d.ts +2 -3
  22. package/dist/app/session-shell/image-source.js +2 -2
  23. package/dist/app/session-shell/input-surface-switch.d.ts +9 -7
  24. package/dist/app/session-shell/input-surface-switch.js +1 -2
  25. package/dist/app/session-shell/login-interaction.d.ts +5 -4
  26. package/dist/app/session-shell/login-interaction.js +2 -3
  27. package/dist/app/session-shell/paste-executor.d.ts +4 -8
  28. package/dist/app/session-shell/paste-executor.js +2 -2
  29. package/dist/app/session-shell/paste-protocol.d.ts +2 -2
  30. package/dist/app/session-shell/path-chip-presentation.d.ts +0 -5
  31. package/dist/app/session-shell/path-chip-presentation.js +3 -3
  32. package/dist/app/session-shell/prompt-chips.d.ts +8 -7
  33. package/dist/app/session-shell/prompt-history-controller.d.ts +3 -3
  34. package/dist/app/session-shell/prompt-submission.d.ts +7 -6
  35. package/dist/app/session-shell/prompt-submission.js +7 -28
  36. package/dist/app/session-shell/quit-outro-effects.d.ts +3 -3
  37. package/dist/app/session-shell/quit-outro-effects.js +1 -4
  38. package/dist/app/session-shell/quit-outro.d.ts +9 -12
  39. package/dist/app/session-shell/quit-outro.js +11 -11
  40. package/dist/app/session-shell/response-copy-protocol.d.ts +3 -2
  41. package/dist/app/session-shell/response-copy-transport.d.ts +2 -14
  42. package/dist/app/session-shell/response-copy-transport.js +2 -3
  43. package/dist/app/session-shell/session-lifecycle.d.ts +3 -3
  44. package/dist/app/session-shell/session-lifecycle.js +2 -4
  45. package/dist/app/session-shell/session-shell-root.d.ts +74 -120
  46. package/dist/app/session-shell/session-shell-root.js +82 -115
  47. package/dist/app/session-shell/session-shell.d.ts +13 -16
  48. package/dist/app/session-shell/session-shell.js +149 -314
  49. package/dist/app/session-shell/session-viewport-controller.d.ts +7 -6
  50. package/dist/app/session-shell/session-viewport-controller.js +5 -8
  51. package/dist/app/session-shell/settings-bindings.d.ts +24 -2
  52. package/dist/app/session-shell/settings-bindings.js +24 -0
  53. package/dist/app/session-shell/share-operation.d.ts +3 -3
  54. package/dist/app/session-shell/share-operation.js +4 -6
  55. package/dist/app/session-shell/shell-clipboard.d.ts +59 -0
  56. package/dist/app/session-shell/shell-clipboard.js +119 -0
  57. package/dist/app/session-shell/shell-editor-factory.d.ts +8 -4
  58. package/dist/app/session-shell/shell-editor-factory.js +13 -15
  59. package/dist/app/session-shell/shell-host.d.ts +16 -17
  60. package/dist/app/session-shell/shell-host.js +20 -37
  61. package/dist/app/session-shell/shell-layout.d.ts +2 -2
  62. package/dist/app/session-shell/shell-prompt-suggestions.d.ts +26 -0
  63. package/dist/app/session-shell/shell-prompt-suggestions.js +48 -0
  64. package/dist/app/session-shell/suggestion-surface.d.ts +1 -6
  65. package/dist/app/session-shell/suggestion-surface.js +1 -1
  66. package/dist/app/session-shell/system-clipboard.d.ts +2 -14
  67. package/dist/app/session-shell/system-clipboard.js +2 -7
  68. package/dist/app/session-shell/transcript-document.d.ts +12 -10
  69. package/dist/app/session-shell/transcript-document.js +15 -41
  70. package/dist/app/session-shell/viewport-layout.d.ts +2 -2
  71. package/dist/app/session-shell/workflow-output.d.ts +5 -3
  72. package/dist/app/session-shell/workflow-output.js +13 -15
  73. package/dist/app/session-shell/workflow-router.d.ts +1 -3
  74. package/dist/app/session-shell/workflow-router.js +1 -4
  75. package/dist/cli/dispatch.d.ts +1 -11
  76. package/dist/cli/dispatch.js +5 -92
  77. package/dist/cli/package-messages.d.ts +0 -1
  78. package/dist/cli/package-messages.js +1 -1
  79. package/dist/cli/session-context.d.ts +1 -1
  80. package/dist/cli/session-context.js +5 -7
  81. package/dist/cli/uninstall.d.ts +4 -7
  82. package/dist/cli/uninstall.js +6 -35
  83. package/dist/cli/version-stats.js +4 -7
  84. package/dist/composition/owned-settings.d.ts +2 -2
  85. package/dist/composition/owned-settings.js +0 -4
  86. package/dist/composition/owned-ui.d.ts +3 -25
  87. package/dist/composition/owned-ui.js +37 -113
  88. package/dist/composition/reference-selection-options.d.ts +1 -1
  89. package/dist/composition/reference-selection-options.js +1 -1
  90. package/dist/composition/release-update-observation.d.ts +4 -4
  91. package/dist/composition/release-update-observation.js +17 -47
  92. package/dist/composition/session-backend.d.ts +0 -1
  93. package/dist/composition/session-runtime-registry.d.ts +5 -4
  94. package/dist/composition/settings-route-host.d.ts +0 -7
  95. package/dist/composition/settings-route-host.js +7 -20
  96. package/dist/composition/settings-search-input.d.ts +2 -1
  97. package/dist/composition/startup-route.d.ts +2 -3
  98. package/dist/composition/startup-route.js +2 -3
  99. package/dist/contracts/owned-ui/extension-ui.d.ts +2 -1
  100. package/dist/contracts/owned-ui/index.d.ts +2 -1
  101. package/dist/contracts/owned-ui/model.d.ts +0 -3
  102. package/dist/contracts/owned-ui/session-presenters.d.ts +3 -0
  103. package/dist/contracts/owned-ui/session-workflows.d.ts +1 -4
  104. package/dist/contracts/owned-ui/shell-components.d.ts +543 -0
  105. package/dist/contracts/presentation/component.d.ts +17 -0
  106. package/dist/contracts/presentation/component.js +8 -0
  107. package/dist/contracts/presentation/index.d.ts +6 -15
  108. package/dist/contracts/presentation/index.js +2 -0
  109. package/dist/contracts/presentation/terminal.d.ts +290 -0
  110. package/dist/contracts/presentation/theme.d.ts +46 -0
  111. package/dist/features/launch/development-launch.js +1 -2
  112. package/dist/features/launch/index.d.ts +1 -1
  113. package/dist/features/launch/intent.d.ts +1 -3
  114. package/dist/features/launch/intent.js +2 -4
  115. package/dist/features/launch/runtime-selection.d.ts +2 -2
  116. package/dist/features/launch/runtime-selection.js +2 -2
  117. package/dist/features/launch/session-context.d.ts +2 -2
  118. package/dist/features/owned-ui/project-trust-prompt.d.ts +2 -2
  119. package/dist/features/owned-ui/project-trust-prompt.js +1 -1
  120. package/dist/features/owned-ui/reference-screen-app.d.ts +0 -2
  121. package/dist/features/owned-ui/reference-screen-app.js +2 -9
  122. package/dist/features/owned-ui/release-note-state.d.ts +2 -1
  123. package/dist/features/owned-ui/settings-app.d.ts +0 -6
  124. package/dist/features/owned-ui/settings-app.js +42 -254
  125. package/dist/features/owned-ui/settings-edits.d.ts +31 -0
  126. package/dist/features/owned-ui/settings-edits.js +139 -0
  127. package/dist/features/owned-ui/settings-scroll-rail.d.ts +29 -0
  128. package/dist/features/owned-ui/settings-scroll-rail.js +79 -0
  129. package/dist/features/owned-ui/settings-search-input.d.ts +2 -1
  130. package/dist/features/prompt-history/service.d.ts +3 -2
  131. package/dist/foundation/launch-context/index.d.ts +0 -12
  132. package/dist/foundation/launch-context/index.js +0 -26
  133. package/dist/foundation/lifecycle/claim-gate.d.ts +9 -0
  134. package/dist/foundation/lifecycle/claim-gate.js +37 -0
  135. package/dist/foundation/lifecycle/index.d.ts +5 -9
  136. package/dist/foundation/lifecycle/index.js +3 -4
  137. package/dist/foundation/lifecycle/model.d.ts +2 -59
  138. package/dist/foundation/lifecycle/model.js +0 -35
  139. package/dist/foundation/lifecycle/paths.d.ts +0 -24
  140. package/dist/foundation/lifecycle/paths.js +0 -40
  141. package/dist/foundation/lifecycle/process-liveness.d.ts +8 -0
  142. package/dist/foundation/lifecycle/process-liveness.js +18 -0
  143. package/dist/foundation/lifecycle/session-claim-lock.d.ts +1 -1
  144. package/dist/foundation/lifecycle/session-claim-lock.js +2 -2
  145. package/dist/foundation/lifecycle/session-repository-context.d.ts +6 -6
  146. package/dist/foundation/lifecycle/session-repository-context.js +2 -3
  147. package/dist/foundation/release/automatic-update.d.ts +6 -17
  148. package/dist/foundation/release/automatic-update.js +23 -44
  149. package/dist/foundation/release/bootstrap.d.ts +2 -25
  150. package/dist/foundation/release/bootstrap.js +37 -348
  151. package/dist/foundation/release/dependency-certification.d.ts +1 -2
  152. package/dist/foundation/release/dependency-certification.js +1 -1
  153. package/dist/foundation/release/early-accent.d.ts +2 -2
  154. package/dist/foundation/release/early-accent.js +1 -1
  155. package/dist/foundation/release/index.d.ts +10 -17
  156. package/dist/foundation/release/index.js +7 -11
  157. package/dist/foundation/release/latest-release.d.ts +3 -19
  158. package/dist/foundation/release/latest-release.js +11 -12
  159. package/dist/foundation/release/ordinary-launch-selection.d.ts +1 -1
  160. package/dist/foundation/release/ordinary-launch-selection.js +1 -1
  161. package/dist/foundation/release/process-liveness.d.ts +2 -0
  162. package/dist/foundation/release/process-liveness.js +12 -0
  163. package/dist/foundation/release/release-gc.d.ts +13 -10
  164. package/dist/foundation/release/release-gc.js +37 -101
  165. package/dist/foundation/release/{cohort-state.d.ts → release-state.d.ts} +44 -69
  166. package/dist/foundation/release/{cohort-state.js → release-state.js} +38 -70
  167. package/dist/foundation/release/release-store.d.ts +2 -2
  168. package/dist/foundation/release/release-store.js +2 -2
  169. package/dist/foundation/release/restart-certification.js +1 -1
  170. package/dist/foundation/release/update-activation.d.ts +2 -9
  171. package/dist/foundation/release/update-activation.js +30 -45
  172. package/dist/foundation/release/update-execution-lease.d.ts +2 -3
  173. package/dist/foundation/release/update-execution-lease.js +2 -2
  174. package/dist/foundation/release/update-launch.d.ts +2 -4
  175. package/dist/foundation/release/update-launch.js +0 -7
  176. package/dist/foundation/release/update-recovery.js +1 -1
  177. package/dist/foundation/release/update-transaction.d.ts +1 -1
  178. package/dist/foundation/release/update-transaction.js +5 -2
  179. package/dist/foundation/release/update.d.ts +2 -12
  180. package/dist/foundation/release/update.js +37 -214
  181. package/dist/foundation/session-writer-lock/index.d.ts +14 -6
  182. package/dist/foundation/session-writer-lock/index.js +48 -103
  183. package/dist/foundation/startup/startup-budget.d.ts +5 -5
  184. package/dist/foundation/startup/startup-budget.js +2 -2
  185. package/dist/foundation/startup/startup-runtime.d.ts +1 -1
  186. package/dist/foundation/terminal-cleanup/exit-notice.d.ts +6 -0
  187. package/dist/foundation/terminal-cleanup/exit-notice.js +36 -0
  188. package/dist/foundation/terminal-cleanup/index.d.ts +2 -1
  189. package/dist/foundation/terminal-cleanup/index.js +2 -1
  190. package/dist/foundation/terminal-cleanup/terminal-reset.d.ts +0 -5
  191. package/dist/foundation/terminal-cleanup/terminal-reset.js +0 -5
  192. package/dist/integrations/pi/components/editor-interaction.d.ts +4 -12
  193. package/dist/integrations/pi/components/index.d.ts +15 -9
  194. package/dist/integrations/pi/components/index.js +9 -5
  195. package/dist/integrations/pi/components/lazy-selectors.d.ts +2 -10
  196. package/dist/integrations/pi/components/lazy-selectors.js +1 -1
  197. package/dist/integrations/pi/components/modal-frame.d.ts +5 -22
  198. package/dist/integrations/pi/components/modal-frame.js +3 -23
  199. package/dist/integrations/pi/components/owned-editor-ux.d.ts +4 -3
  200. package/dist/integrations/pi/components/prompt-input-port.d.ts +2 -19
  201. package/dist/integrations/pi/components/resources/builtin-themes.d.ts +2 -1
  202. package/dist/integrations/pi/components/shell-editor-autocomplete.d.ts +3 -2
  203. package/dist/integrations/pi/components/shell-editor-autocomplete.js +1 -4
  204. package/dist/integrations/pi/components/shell-footer-status.d.ts +3 -3
  205. package/dist/integrations/pi/components/shell-footer-status.js +5 -4
  206. package/dist/integrations/pi/components/shell-hotkey-sections.js +1 -1
  207. package/dist/integrations/pi/components/shell-presenters-info.d.ts +6 -8
  208. package/dist/integrations/pi/components/shell-presenters-info.js +6 -19
  209. package/dist/integrations/pi/components/shell-presenters-transcript.d.ts +1 -1
  210. package/dist/integrations/pi/components/shell-presenters-transcript.js +1 -1
  211. package/dist/integrations/pi/components/shell-session-info-reference.d.ts +2 -1
  212. package/dist/integrations/pi/components/shell-shared-facade.d.ts +33 -229
  213. package/dist/integrations/pi/components/shell-shared-facade.js +8 -1
  214. package/dist/integrations/pi/components/skills-command.d.ts +1 -9
  215. package/dist/integrations/pi/components/skills-command.js +5 -5
  216. package/dist/integrations/pi/components/submitted-prompt-adapter.d.ts +2 -5
  217. package/dist/integrations/pi/components/submitted-prompt-adapter.js +2 -16
  218. package/dist/integrations/pi/components/theme.d.ts +9 -2
  219. package/dist/integrations/pi/components/theme.js +17 -2
  220. package/dist/integrations/pi/components/thinking-selector-dialog.d.ts +2 -1
  221. package/dist/integrations/pi/components/upstream/adjacent/core/keybindings.d.ts +2 -2
  222. package/dist/integrations/pi/components/upstream/components/session-footer.d.ts +1 -2
  223. package/dist/integrations/pi/components/upstream/components/session-footer.js +6 -8
  224. package/dist/integrations/pi/engine/adapter.d.ts +3 -6
  225. package/dist/integrations/pi/engine/adapter.js +4 -28
  226. package/dist/integrations/pi/engine/changelog.d.ts +2 -2
  227. package/dist/integrations/pi/engine/changelog.js +3 -3
  228. package/dist/integrations/pi/engine/compaction-progress.d.ts +2 -3
  229. package/dist/integrations/pi/engine/compaction-progress.js +1 -1
  230. package/dist/integrations/pi/engine/conformance.d.ts +2 -1
  231. package/dist/integrations/pi/engine/default-model-setting.d.ts +0 -2
  232. package/dist/integrations/pi/engine/default-model-setting.js +1 -2
  233. package/dist/integrations/pi/engine/diagnostics-state.d.ts +0 -1
  234. package/dist/integrations/pi/engine/diagnostics-state.js +0 -14
  235. package/dist/integrations/pi/engine/event-delivery.d.ts +2 -1
  236. package/dist/integrations/pi/engine/extension-ui-binding.d.ts +2 -1
  237. package/dist/integrations/pi/engine/host.js +2 -2
  238. package/dist/integrations/pi/engine/message-values.d.ts +0 -1
  239. package/dist/integrations/pi/engine/message-values.js +1 -1
  240. package/dist/integrations/pi/engine/pending-delivery.d.ts +0 -4
  241. package/dist/integrations/pi/engine/pending-delivery.js +3 -3
  242. package/dist/integrations/pi/engine/ports.d.ts +7 -1
  243. package/dist/integrations/pi/engine/ports.js +4 -0
  244. package/dist/integrations/pi/engine/project-trust-preflight.d.ts +2 -1
  245. package/dist/integrations/pi/engine/prompt-suggestions.d.ts +3 -3
  246. package/dist/integrations/pi/engine/prompt-suggestions.js +0 -40
  247. package/dist/integrations/pi/engine/provider-authentication.d.ts +1 -1
  248. package/dist/integrations/pi/engine/public-main-entry.d.ts +1 -5
  249. package/dist/integrations/pi/engine/public-main-entry.js +1 -1
  250. package/dist/integrations/pi/engine/repository-pr-rest.d.ts +1 -9
  251. package/dist/integrations/pi/engine/repository-pr-rest.js +2 -2
  252. package/dist/integrations/pi/engine/repository-pr.d.ts +1 -3
  253. package/dist/integrations/pi/engine/repository-pr.js +1 -1
  254. package/dist/integrations/pi/engine/resource-catalog.d.ts +2 -1
  255. package/dist/integrations/pi/engine/session-integration.d.ts +1 -1
  256. package/dist/integrations/pi/engine/session-runtime.d.ts +4 -3
  257. package/dist/integrations/pi/engine/session-runtime.js +0 -2
  258. package/dist/integrations/pi/engine/settings-bridge.d.ts +0 -2
  259. package/dist/integrations/pi/engine/settings-bridge.js +1 -1
  260. package/dist/integrations/pi/engine/settings-port.d.ts +3 -2
  261. package/dist/integrations/pi/engine/transcript-projection.d.ts +2 -1
  262. package/dist/integrations/pi/engine/workflow-contexts.d.ts +1 -1
  263. package/dist/integrations/pi/engine/workflow-runner.d.ts +1 -1
  264. package/dist/integrations/pi/engine/workflow-runner.js +1 -1
  265. package/dist/integrations/pi/engine/workflow-support.d.ts +0 -6
  266. package/dist/integrations/pi/engine/workflow-support.js +4 -18
  267. package/dist/integrations/pi/engine/workflows.d.ts +5 -5
  268. package/dist/integrations/pi/session-presenters/components.d.ts +3 -0
  269. package/dist/integrations/pi/session-presenters/components.js +75 -0
  270. package/dist/integrations/pi/session-presenters/index.d.ts +1 -0
  271. package/dist/integrations/pi/session-presenters/index.js +1 -0
  272. package/dist/integrations/pi/session-presenters/presentation.d.ts +3 -0
  273. package/dist/integrations/pi/session-presenters/presentation.js +10 -0
  274. package/dist/integrations/pi/session-presenters/presenters.d.ts +2 -1
  275. package/dist/integrations/pi/session-presenters/presenters.js +3 -1
  276. package/dist/integrations/pi/tui-runtime/adapter.d.ts +2 -2
  277. package/dist/integrations/pi/tui-runtime/adapter.js +23 -32
  278. package/dist/integrations/pi/tui-runtime/contracts.d.ts +22 -166
  279. package/dist/integrations/pi/tui-runtime/damage-aware-terminal.d.ts +5 -40
  280. package/dist/integrations/pi/tui-runtime/index.d.ts +1 -0
  281. package/dist/integrations/pi/tui-runtime/index.js +1 -0
  282. package/dist/integrations/pi/tui-runtime/input-presentation-coordinator.d.ts +4 -6
  283. package/dist/integrations/pi/tui-runtime/overlay-geometry.d.ts +2 -8
  284. package/dist/integrations/pi/tui-runtime/overlay-geometry.js +3 -9
  285. package/dist/integrations/pi/tui-runtime/runtime-factory.d.ts +3 -0
  286. package/dist/integrations/pi/tui-runtime/runtime-factory.js +11 -0
  287. package/dist/product-identity.d.ts +4 -6
  288. package/dist/product-identity.js +6 -11
  289. package/dist/product-identity.json +1 -40
  290. package/dist/runtime-payload-inventory.json +0 -3
  291. package/dist/ui/components/index.d.ts +4 -4
  292. package/dist/ui/components/index.js +2 -2
  293. package/dist/ui/components/selection-copy.d.ts +0 -1
  294. package/dist/ui/components/selection-copy.js +0 -12
  295. package/dist/ui/components/submitted-prompt.d.ts +3 -13
  296. package/dist/ui/components/submitted-prompt.js +8 -41
  297. package/dist/ui/components/theme.d.ts +4 -19
  298. package/dist/ui/components/theme.js +6 -0
  299. package/dist/ui/components/transcript-viewport.d.ts +1 -3
  300. package/dist/ui/components/transcript-viewport.js +1 -4
  301. package/dist/ui/settings/declarations.d.ts +2 -97
  302. package/dist/ui/settings/declarations.js +2 -78
  303. package/dist/ui/settings/early-accent.js +1 -1
  304. package/dist/ui/settings/index.d.ts +3 -5
  305. package/dist/ui/settings/index.js +2 -3
  306. package/dist/ui/settings/manager.d.ts +0 -4
  307. package/dist/ui/settings/manager.js +6 -62
  308. package/dist/ui/settings/resolution.d.ts +6 -18
  309. package/dist/ui/settings/resolution.js +4 -103
  310. package/dist/ui/settings/sections.d.ts +0 -4
  311. package/dist/ui/settings/sections.js +1 -1
  312. package/docs/architecture/boundaries.md +23 -40
  313. package/docs/architecture/code-documentation.md +2 -2
  314. package/docs/architecture/internal-naming.md +11 -17
  315. package/docs/architecture/project-structure.md +13 -16
  316. package/docs/architecture/resource-and-data-policy.md +16 -31
  317. package/docs/architecture/toolchain.md +14 -19
  318. package/docs/architecture/ui-reference-provenance.md +2 -2
  319. package/docs/ci-release-runbook.md +5 -5
  320. package/docs/features/launch-profiles.md +11 -17
  321. package/docs/features/prompt-history.md +10 -11
  322. package/docs/local-worktree-cleanup.md +28 -1
  323. package/docs/manual-owned-ui-checkpoint.md +0 -1
  324. package/docs/validation.md +5 -11
  325. package/docs/worktree-link-recovery.md +6 -6
  326. package/package.json +7 -20
  327. package/bin/guardian.js +0 -42
  328. package/bin/supervisor.js +0 -7
  329. package/bin/tab-launch-context.d.ts +0 -27
  330. package/bin/tab-launch-context.js +0 -94
  331. package/dist/app/session-shell/resident-tab-coordinator.d.ts +0 -38
  332. package/dist/app/session-shell/resident-tab-coordinator.js +0 -77
  333. package/dist/cli/tabs-request.d.ts +0 -7
  334. package/dist/cli/tabs.d.ts +0 -14
  335. package/dist/cli/tabs.js +0 -151
  336. package/dist/composition/resident-tab-bridge.d.ts +0 -41
  337. package/dist/composition/resident-tab-bridge.js +0 -209
  338. package/dist/composition/utility-tab.d.ts +0 -28
  339. package/dist/composition/utility-tab.js +0 -244
  340. package/dist/features/owned-ui/plus-menu-dialog.d.ts +0 -28
  341. package/dist/features/owned-ui/plus-menu-dialog.js +0 -89
  342. package/dist/features/resident-tab/auto-name.d.ts +0 -11
  343. package/dist/features/resident-tab/auto-name.js +0 -44
  344. package/dist/features/resident-tab/index.d.ts +0 -5
  345. package/dist/features/resident-tab/index.js +0 -7
  346. package/dist/features/resident-tab/shortcut-bindings-file.d.ts +0 -8
  347. package/dist/features/resident-tab/shortcut-bindings-file.js +0 -40
  348. package/dist/features/resident-tab/shortcut-declarations.d.ts +0 -13
  349. package/dist/features/resident-tab/shortcut-declarations.js +0 -26
  350. package/dist/features/resident-tab/shortcut-projection.d.ts +0 -29
  351. package/dist/features/resident-tab/shortcut-projection.js +0 -64
  352. package/dist/features/resident-tab/status-deriver.d.ts +0 -10
  353. package/dist/features/resident-tab/status-deriver.js +0 -12
  354. package/dist/foundation/launch-guardian/exit-watcher.d.ts +0 -14
  355. package/dist/foundation/launch-guardian/exit-watcher.js +0 -103
  356. package/dist/foundation/launch-guardian/index.d.ts +0 -2
  357. package/dist/foundation/launch-guardian/index.js +0 -1
  358. package/dist/foundation/launch-guardian/main.d.ts +0 -39
  359. package/dist/foundation/launch-guardian/main.js +0 -232
  360. package/dist/foundation/lifecycle/commands.d.ts +0 -40
  361. package/dist/foundation/lifecycle/launch-instance.d.ts +0 -46
  362. package/dist/foundation/lifecycle/launch-instance.js +0 -134
  363. package/dist/foundation/lifecycle/native-claim-gate.d.ts +0 -5
  364. package/dist/foundation/lifecycle/native-claim-gate.js +0 -41
  365. package/dist/foundation/lifecycle/supervisor-startup.d.ts +0 -30
  366. package/dist/foundation/lifecycle/supervisor-startup.js +0 -106
  367. package/dist/foundation/process-containment/addon-containment.d.ts +0 -20
  368. package/dist/foundation/process-containment/addon-containment.js +0 -139
  369. package/dist/foundation/process-containment/addon-process-inspector.d.ts +0 -11
  370. package/dist/foundation/process-containment/addon-process-inspector.js +0 -36
  371. package/dist/foundation/process-containment/addon.d.ts +0 -47
  372. package/dist/foundation/process-containment/addon.js +0 -57
  373. package/dist/foundation/process-containment/artifact.d.ts +0 -1
  374. package/dist/foundation/process-containment/artifact.js +0 -35
  375. package/dist/foundation/process-containment/contracts.d.ts +0 -33
  376. package/dist/foundation/process-containment/contracts.js +0 -35
  377. package/dist/foundation/process-containment/index.d.ts +0 -9
  378. package/dist/foundation/process-containment/index.js +0 -7
  379. package/dist/foundation/process-containment/linux-process-inspector.d.ts +0 -7
  380. package/dist/foundation/process-containment/linux-process-inspector.js +0 -27
  381. package/dist/foundation/process-containment/native-process-inspector.d.ts +0 -4
  382. package/dist/foundation/process-containment/native-process-inspector.js +0 -21
  383. package/dist/foundation/protocol/client.d.ts +0 -18
  384. package/dist/foundation/protocol/client.js +0 -130
  385. package/dist/foundation/protocol/index.d.ts +0 -3
  386. package/dist/foundation/protocol/index.js +0 -2
  387. package/dist/foundation/protocol/messages.d.ts +0 -90
  388. package/dist/foundation/protocol/messages.js +0 -100
  389. package/dist/foundation/release/cohort-selection.d.ts +0 -33
  390. package/dist/foundation/release/cohort-selection.js +0 -67
  391. package/dist/foundation/release/endpoint-lock.d.ts +0 -2
  392. package/dist/foundation/release/endpoint-lock.js +0 -37
  393. package/dist/foundation/release/endpoint-recovery.d.ts +0 -10
  394. package/dist/foundation/release/endpoint-recovery.js +0 -45
  395. package/dist/foundation/release/endpoints.d.ts +0 -32
  396. package/dist/foundation/release/endpoints.js +0 -152
  397. package/dist/foundation/release/prepared-update-activation.d.ts +0 -3
  398. package/dist/foundation/release/prepared-update-activation.js +0 -27
  399. package/dist/foundation/release/process-cleanup.d.ts +0 -14
  400. package/dist/foundation/release/process-cleanup.js +0 -76
  401. package/dist/foundation/release/supervisor-identity.d.ts +0 -15
  402. package/dist/foundation/release/supervisor-identity.js +0 -63
  403. package/dist/foundation/resident-tabs/boot-identity.d.ts +0 -6
  404. package/dist/foundation/resident-tabs/boot-identity.js +0 -16
  405. package/dist/foundation/resident-tabs/bounded-host-command.d.ts +0 -20
  406. package/dist/foundation/resident-tabs/bounded-host-command.js +0 -62
  407. package/dist/foundation/resident-tabs/bridge-client.d.ts +0 -73
  408. package/dist/foundation/resident-tabs/bridge-client.js +0 -327
  409. package/dist/foundation/resident-tabs/continuity.d.ts +0 -12
  410. package/dist/foundation/resident-tabs/continuity.js +0 -63
  411. package/dist/foundation/resident-tabs/doctor.d.ts +0 -28
  412. package/dist/foundation/resident-tabs/doctor.js +0 -166
  413. package/dist/foundation/resident-tabs/draft-checkpoint.d.ts +0 -27
  414. package/dist/foundation/resident-tabs/draft-checkpoint.js +0 -145
  415. package/dist/foundation/resident-tabs/ensure-terminal-host.d.ts +0 -36
  416. package/dist/foundation/resident-tabs/ensure-terminal-host.js +0 -151
  417. package/dist/foundation/resident-tabs/fault-injection.d.ts +0 -8
  418. package/dist/foundation/resident-tabs/fault-injection.js +0 -26
  419. package/dist/foundation/resident-tabs/fixture-control.d.ts +0 -7
  420. package/dist/foundation/resident-tabs/fixture-control.js +0 -35
  421. package/dist/foundation/resident-tabs/host-entry.js +0 -17
  422. package/dist/foundation/resident-tabs/index.d.ts +0 -15
  423. package/dist/foundation/resident-tabs/index.js +0 -10
  424. package/dist/foundation/resident-tabs/maintenance.d.ts +0 -39
  425. package/dist/foundation/resident-tabs/maintenance.js +0 -75
  426. package/dist/foundation/resident-tabs/progress-observation-schema.d.ts +0 -34
  427. package/dist/foundation/resident-tabs/progress-observation-schema.js +0 -1
  428. package/dist/foundation/resident-tabs/progress-observation.d.ts +0 -4
  429. package/dist/foundation/resident-tabs/progress-observation.js +0 -150
  430. package/dist/foundation/resident-tabs/prompt-journal.d.ts +0 -63
  431. package/dist/foundation/resident-tabs/prompt-journal.js +0 -213
  432. package/dist/foundation/resident-tabs/protocol.d.ts +0 -12
  433. package/dist/foundation/resident-tabs/protocol.js +0 -195
  434. package/dist/foundation/resident-tabs/recovery.d.ts +0 -26
  435. package/dist/foundation/resident-tabs/recovery.js +0 -205
  436. package/dist/foundation/resident-tabs/release-holds.d.ts +0 -28
  437. package/dist/foundation/resident-tabs/release-holds.js +0 -78
  438. package/dist/foundation/resident-tabs/routes.d.ts +0 -5
  439. package/dist/foundation/resident-tabs/routes.js +0 -5
  440. package/dist/foundation/resident-tabs/routing.d.ts +0 -11
  441. package/dist/foundation/resident-tabs/routing.js +0 -10
  442. package/dist/foundation/resident-tabs/runtime-control.d.ts +0 -38
  443. package/dist/foundation/resident-tabs/runtime-control.js +0 -74
  444. package/dist/foundation/resident-tabs/session-sync.d.ts +0 -14
  445. package/dist/foundation/resident-tabs/session-sync.js +0 -37
  446. package/dist/foundation/resident-tabs/settings.d.ts +0 -16
  447. package/dist/foundation/resident-tabs/settings.js +0 -60
  448. package/dist/foundation/resident-tabs/terminal-host-artifact.d.ts +0 -14
  449. package/dist/foundation/resident-tabs/terminal-host-artifact.js +0 -78
  450. package/dist/foundation/resident-tabs/zip-archive.d.ts +0 -9
  451. package/dist/foundation/resident-tabs/zip-archive.js +0 -56
  452. package/dist/foundation/storage/control-store.d.ts +0 -20
  453. package/dist/foundation/storage/control-store.js +0 -331
  454. package/dist/foundation/storage/index.d.ts +0 -1
  455. package/dist/foundation/storage/index.js +0 -1
  456. package/dist/foundation/supervision/index.d.ts +0 -3
  457. package/dist/foundation/supervision/index.js +0 -3
  458. package/dist/foundation/supervision/main.d.ts +0 -1
  459. package/dist/foundation/supervision/main.js +0 -86
  460. package/dist/foundation/supervision/paths.d.ts +0 -1
  461. package/dist/foundation/supervision/paths.js +0 -1
  462. package/dist/foundation/supervision/server.d.ts +0 -46
  463. package/dist/foundation/supervision/server.js +0 -611
  464. package/dist/integrations/pi/components/components.d.ts +0 -4
  465. package/dist/integrations/pi/components/components.js +0 -48
  466. package/dist/integrations/pi/components/conformance.d.ts +0 -18
  467. package/dist/integrations/pi/components/conformance.js +0 -70
  468. package/dist/integrations/pi/components/shell-components.d.ts +0 -7
  469. package/dist/integrations/pi/components/shell-components.js +0 -7
  470. package/dist/integrations/pi/components/upstream/theme/theme-controller.d.ts +0 -33
  471. package/dist/integrations/pi/components/upstream/theme/theme-controller.js +0 -114
  472. package/dist/integrations/pi/engine/offline-settings-port.d.ts +0 -23
  473. package/dist/integrations/pi/engine/offline-settings-port.js +0 -54
  474. package/dist/native/darwin-arm64/manifest.json +0 -23
  475. package/dist/native/darwin-arm64/process-guardian.node +0 -0
  476. package/dist/native/darwin-arm64/terminal-host-THIRD-PARTY-NOTICES.txt +0 -10500
  477. package/dist/native/darwin-arm64/terminal-host.manifest.json +0 -46
  478. package/dist/native/darwin-arm64/terminal-host.node +0 -0
  479. package/dist/native/darwin-x64/manifest.json +0 -23
  480. package/dist/native/darwin-x64/process-guardian.node +0 -0
  481. package/dist/native/darwin-x64/terminal-host-THIRD-PARTY-NOTICES.txt +0 -10737
  482. package/dist/native/darwin-x64/terminal-host.manifest.json +0 -46
  483. package/dist/native/darwin-x64/terminal-host.node +0 -0
  484. package/dist/native/linux-x64/manifest.json +0 -23
  485. package/dist/native/linux-x64/process-guardian.node +0 -0
  486. package/dist/native/linux-x64/terminal-host-THIRD-PARTY-NOTICES.txt +0 -11226
  487. package/dist/native/linux-x64/terminal-host.manifest.json +0 -46
  488. package/dist/native/linux-x64/terminal-host.node +0 -0
  489. package/dist/native/win32-x64/manifest.json +0 -23
  490. package/dist/native/win32-x64/process-guardian.node +0 -0
  491. package/dist/native/win32-x64/terminal-host-THIRD-PARTY-NOTICES.txt +0 -10757
  492. package/dist/native/win32-x64/terminal-host.manifest.json +0 -46
  493. package/dist/native/win32-x64/terminal-host.node +0 -0
  494. package/dist/ui/settings/migrations.d.ts +0 -19
  495. package/dist/ui/settings/migrations.js +0 -209
  496. package/dist/ui/settings/progress-palette.generated.d.ts +0 -139
  497. package/dist/ui/settings/progress-palette.generated.js +0 -139
  498. package/docs/architecture/evidence/resident-tabs/linux-x64.md +0 -37
  499. package/docs/architecture/evidence/resident-tabs/macos-arm64.md +0 -36
  500. package/docs/architecture/evidence/resident-tabs/macos-x64.md +0 -35
  501. package/docs/architecture/evidence/resident-tabs/windows-x64.md +0 -36
  502. package/docs/architecture/evidence/terminal-host-spike/manual-one-pane-terminal-host.md +0 -70
  503. package/docs/architecture/evidence/terminal-host-spike/manual-two-by-two-basic-terminal-host.md +0 -32
  504. package/docs/architecture/evidence/terminal-host-spike/milestone-baseline.json +0 -115
  505. package/docs/architecture/evidence/terminal-host-spike/owned-ui-foundation-prerequisite.json +0 -48
  506. package/docs/architecture/evidence/terminal-host-spike/terminal-host-provenance.json +0 -125
  507. package/docs/architecture/evidence/terminal-host-spike/terminal-host-task-5-1.json +0 -56
  508. package/docs/architecture/evidence/terminal-host-spike/terminal-host-task-5-3.json +0 -174
  509. package/docs/architecture/evidence/terminal-host-spike/terminal-spike-acceptance-record.json +0 -18
  510. package/docs/architecture/native-fixture-isolation.md +0 -23
  511. package/docs/architecture/process-guardian-provenance.md +0 -36
  512. package/docs/architecture/resident-tabs-requirements.md +0 -18
  513. package/docs/architecture/resident-tabs.md +0 -668
  514. package/docs/architecture/terminal-host-proof-gate.md +0 -34
  515. package/docs/architecture/terminal-host-provenance.md +0 -81
  516. package/docs/architecture/terminal-host-spike-evidence.md +0 -39
  517. package/docs/launch-recovery.md +0 -23
  518. package/docs/manual-launch-instance-acceptance.md +0 -43
  519. package/docs/manual-resident-tabs-acceptance.md +0 -51
  520. /package/dist/{cli/tabs-request.js → contracts/owned-ui/shell-components.js} +0 -0
  521. /package/dist/{foundation/release → contracts/presentation}/progress-palette.generated.d.ts +0 -0
  522. /package/dist/{foundation/release → contracts/presentation}/progress-palette.generated.js +0 -0
  523. /package/dist/{foundation/lifecycle/commands.js → contracts/presentation/terminal.js} +0 -0
  524. /package/dist/{foundation/resident-tabs/host-entry.d.ts → contracts/presentation/theme.js} +0 -0
@@ -1,6 +1,7 @@
1
1
  import { DIALOG_BACK_SHORTCUT_HINT, DIALOG_CLOSE_SHORTCUT_HINT } from "../../contracts/presentation/index.js";
2
- import { GLOBAL_SCOPE, LineInput, PLAIN_THEME, ShortcutRegistry, assertNoShortcutConflicts, blockJumpTarget, configureDialogChoiceCapacity, configureDialogTextRows, configureDialogWidth, numericValues, RAIL_COLUMNS, renderCenteredDialogOverlay, renderDialogPanel, renderSteppedDialogPanel, renderEmptyState, renderGroupHeader, renderListRow, renderNote, renderShortcutHintsWithClose, menuRowAt, regionAt, renderValueMenu, withScrollbarRail, stepperEnds, steppedValue, truncateToWidth, valueColumnFor, valueMenuFrame, blockRowSpan, displayWidth, formatLocalTime, handleLineInputKey, humanizeLabel, humanizeTitle, indexOfKey, layoutList, moveSelection, rowKey, scrollForSelection, scrollForTrackPage, scrollbarGeometry, scrollbarPresentation, ScrollbarRails, scrollbarWheelRows, selectableIndexes, } from "../../ui/components/index.js";
3
- import { FlagToggleDialog, PLUS_MENU_SETTING_ID, PlusMenuDialog } from "./plus-menu-dialog.js";
2
+ import { GLOBAL_SCOPE, LineInput, PLAIN_THEME, ShortcutRegistry, assertNoShortcutConflicts, blockJumpTarget, configureDialogChoiceCapacity, configureDialogTextRows, configureDialogWidth, numericValues, RAIL_COLUMNS, renderCenteredDialogOverlay, renderDialogPanel, renderSteppedDialogPanel, renderEmptyState, renderGroupHeader, renderListRow, renderNote, renderShortcutHintsWithClose, menuRowAt, regionAt, renderValueMenu, withScrollbarRail, stepperEnds, steppedValue, truncateToWidth, valueColumnFor, valueMenuFrame, blockRowSpan, displayWidth, handleLineInputKey, humanizeLabel, humanizeTitle, indexOfKey, layoutList, moveSelection, rowKey, scrollForSelection, scrollbarGeometry, scrollbarWheelRows, selectableIndexes, } from "../../ui/components/index.js";
3
+ import { SettingsScrollRail } from "./settings-scroll-rail.js";
4
+ import { SettingsEdits, changeFailure, replaceRecord, sameRecord, structuredValue } from "./settings-edits.js";
4
5
  import { SETTINGS_APP_ID } from "./settings-route.js";
5
6
  export { SETTINGS_APP_ID, SETTINGS_ROUTE } from "./settings-route.js";
6
7
  const SCOPE = SETTINGS_APP_ID;
@@ -15,14 +16,8 @@ const DIALOG_SCOPE = `${SETTINGS_APP_ID}-parts`;
15
16
  const MODEL_SCOPE = `${SETTINGS_APP_ID}-models`;
16
17
  const MODEL_LEVEL_SCOPE = `${SETTINGS_APP_ID}-model-levels`;
17
18
  const SCROLLBAR_TOP_INSET = 0;
18
- /** Identity of the settings list rail in the shared rail state. */
19
- const RAIL_KEY = "settings";
20
- // Compatibility: the transcript rail stays lit this long after a scroll, and repaints just after.
21
- const SCROLL_LINGER_MS = 900;
22
- const SCROLL_LINGER_REPAINT_MS = 925;
23
19
  /** What a structured value offers instead of printing itself. */
24
20
  const CONFIGURE = "configure";
25
- const TAB_BAR_RIGHT_ITEMS_SETTING_ID = "tabBarRightItems";
26
21
  export const SETTINGS_SHORTCUTS = new ShortcutRegistry();
27
22
  SETTINGS_SHORTCUTS.declare({ key: "edit", scope: SCOPE, description: "Search settings", section: "Change", hint: { keys: "Type", does: "search" } }, "edit-filter");
28
23
  SETTINGS_SHORTCUTS.declare({ key: "up", scope: SCOPE, description: "Previous setting", section: "Navigate", hint: { keys: "↑↓", does: "navigate" } }, "move-up");
@@ -98,12 +93,7 @@ export class SettingsApp {
98
93
  #menu = null;
99
94
  #structured = null;
100
95
  // Invariant: pending values remain visible until the source reflects them.
101
- #pending = new Map();
102
- #undoHistory = [];
103
- #editSequence = 0;
104
- #undoRequests = 0;
105
- #undoActive = false;
106
- #closed = false;
96
+ #edits;
107
97
  #bodyTopForFrame = SETTINGS_TOP_RULE_ROWS + SETTINGS_TITLE_ROWS;
108
98
  #bodyHeightForFrame = 0;
109
99
  #panelTopForFrame = 0;
@@ -112,23 +102,13 @@ export class SettingsApp {
112
102
  #frameRows = [];
113
103
  #menuFrame = null;
114
104
  // Invariant: rail hover and drag live in the shared keyed state, as the transcript's do.
115
- #rails = new ScrollbarRails();
105
+ #rail = new SettingsScrollRail();
116
106
  // Rationale: the rail as drawn in the last frame, or null when nothing can be pointed at.
117
- #railFrame = null;
118
- // Invariant: a scroll lights the rail until this time; the timer repaints once it has passed.
119
- #activeUntil = 0;
120
- #activityTimer;
121
- #renderedScroll;
122
107
  #options;
123
- /**
124
- * `pinned` presents the screen as a resident Settings tab, which offers no screen-level close;
125
- * `configurePlusMenu` opens the tab bar's Plus Menu dialog in place of this screen's own.
126
- */
127
108
  constructor(session, options) {
128
109
  this.#session = session;
110
+ this.#edits = new SettingsEdits(session, () => this.#structured);
129
111
  this.#options = {
130
- pinned: options.pinned === true,
131
- configurePlusMenu: options.configurePlusMenu ?? null,
132
112
  dialogPanel: options.dialogPanel ?? null,
133
113
  };
134
114
  this.#search = {
@@ -139,17 +119,14 @@ export class SettingsApp {
139
119
  };
140
120
  }
141
121
  onActivate(host) {
142
- this.#closed = false;
122
+ this.#edits.open();
143
123
  void this.#session.load().then(() => host.requestRender());
144
124
  }
145
125
  onClose(_host) {
146
- this.#closed = true;
147
- this.#undoHistory.length = 0;
148
- this.#undoRequests = 0;
126
+ this.#edits.close();
149
127
  this.#search.input?.setFocused(false);
150
128
  this.#search.input = null;
151
- this.#clearActivityTimer();
152
- this.#rails.clear();
129
+ this.#rail.dispose();
153
130
  }
154
131
  render(rect, host) {
155
132
  const theme = host.theme ?? PLAIN_THEME;
@@ -182,11 +159,7 @@ export class SettingsApp {
182
159
  this.#panelTopForFrame = topRows + contentHeight + dividerRows;
183
160
  this.#scroll = layout.scroll;
184
161
  const now = Date.now();
185
- // Rationale: every way of scrolling ends in this frame, so a moved list is noticed here
186
- // once rather than at each wheel, drag, key, and search branch.
187
- if (this.#renderedScroll !== undefined && this.#renderedScroll !== layout.scroll)
188
- this.#noteScrollActivity(host, now);
189
- this.#renderedScroll = layout.scroll;
162
+ this.#rail.noteRenderedScroll(layout.scroll, now, () => host.requestRender());
190
163
  // Invariant: auto and always keep the rail columns while the list fits, so a revealed
191
164
  // rail never reflows the rows; hidden gives the columns back to the rows.
192
165
  const appearance = this.#scrollbarAppearance();
@@ -199,22 +172,10 @@ export class SettingsApp {
199
172
  scroll: layout.scroll,
200
173
  trackHeight: Math.max(0, titleRows + bodyHeight - SCROLLBAR_TOP_INSET),
201
174
  });
202
- const presentation = scrollbarPresentation({
203
- geometry,
204
- appearance,
205
- style: this.#scrollbarStyle(),
206
- hovered: this.#rails.isHovered(RAIL_KEY),
207
- dragging: this.#rails.isDragging(RAIL_KEY),
208
- activeUntil: this.#activeUntil,
209
- now,
210
- });
211
- this.#railFrame = reservesRail && geometry !== null
212
- ? {
213
- rail: { key: RAIL_KEY, column: rect.width, rowStart: topRows + SCROLLBAR_TOP_INSET, trackHeight: geometry.trackHeight },
214
- geometry,
215
- page: layout.visible,
216
- }
217
- : null;
175
+ const presentation = this.#rail.presentation({ geometry, appearance, style: this.#scrollbarStyle(), now });
176
+ this.#rail.setFrame(reservesRail && geometry !== null
177
+ ? { rail: { column: rect.width, rowStart: topRows + SCROLLBAR_TOP_INSET, trackHeight: geometry.trackHeight }, geometry, page: layout.visible }
178
+ : null);
218
179
  const body = [];
219
180
  this.#frameRows = [];
220
181
  if (rows.length === 0) {
@@ -275,8 +236,7 @@ export class SettingsApp {
275
236
  const selected = indexOfKey(rows, this.#selectedKey);
276
237
  switch (action) {
277
238
  case "close":
278
- if (!this.#options.pinned)
279
- host.close();
239
+ host.close();
280
240
  return { consumed: true };
281
241
  case "edit-filter":
282
242
  return { consumed: false };
@@ -284,7 +244,7 @@ export class SettingsApp {
284
244
  const row = rows[selected];
285
245
  if (row?.kind === "element" && (row.value.structured || isDefaultModelEntry(row.value)))
286
246
  this.#openStructured(row.value);
287
- else if (row?.kind === "element" && typeof this.#shownValue(row.value) === "number")
247
+ else if (row?.kind === "element" && typeof this.#edits.shown(row.value) === "number")
288
248
  this.#cycle(rows, selected, 1);
289
249
  else
290
250
  this.#openMenu(rows, selected, true);
@@ -322,7 +282,7 @@ export class SettingsApp {
322
282
  this.#cycle(rows, selected, action === "next-value" ? 1 : -1);
323
283
  return { consumed: true };
324
284
  case "undo":
325
- this.#undo();
285
+ this.#edits.undo();
326
286
  return { consumed: true };
327
287
  default:
328
288
  return { consumed: false };
@@ -364,7 +324,7 @@ export class SettingsApp {
364
324
  const value = menu.choices[overRow];
365
325
  this.#closeMenu(menu);
366
326
  if (value !== undefined)
367
- this.#apply(menu.entry, value);
327
+ this.#edits.apply(menu.entry, value);
368
328
  return { consumed: true };
369
329
  }
370
330
  if (event.kind === "wheel-up" || event.kind === "wheel-down") {
@@ -389,7 +349,14 @@ export class SettingsApp {
389
349
  // cannot change its selection or act on the Settings list behind it.
390
350
  return { consumed: true, render: false };
391
351
  }
392
- const rail = this.#railPointer(event);
352
+ const rail = this.#rail.pointer(event, this.#scroll);
353
+ if (rail.scroll !== undefined)
354
+ this.#scroll = rail.scroll;
355
+ // Invariant: the rail is not a row: pointing at it lights nothing in the list.
356
+ if (rail.overRail) {
357
+ this.#hoverKey = null;
358
+ this.#hoverRegion = "label";
359
+ }
393
360
  if (rail.owned)
394
361
  return { consumed: true };
395
362
  const row = this.#frameRows.find(candidate => candidate.screenRow === event.row - 1);
@@ -419,52 +386,6 @@ export class SettingsApp {
419
386
  const changed = previousKey !== this.#hoverKey || previousRegion !== this.#hoverRegion || rail.changed;
420
387
  return { consumed: event.kind !== "motion", render: changed };
421
388
  }
422
- // Rationale: the rail takes its share of a pointer report first: hover, a thumb drag, or a
423
- // track page. Owned means the list must not see the report; changed means the rail looks different.
424
- #railPointer(event) {
425
- const frame = this.#railFrame;
426
- const wasHovered = this.#rails.isHovered(RAIL_KEY);
427
- if (frame === null) {
428
- this.#rails.clear();
429
- return { owned: false, changed: wasHovered };
430
- }
431
- const pointer = { column: event.column, row: event.row - 1 };
432
- if (this.#rails.isDragging(RAIL_KEY)) {
433
- // Invariant: a drag keeps the pointer wherever it goes until the button comes up.
434
- if (event.kind === "release")
435
- this.#rails.endDrag();
436
- else {
437
- const target = this.#rails.dragTo(frame.rail, frame.geometry, pointer);
438
- if (target !== null)
439
- this.#scroll = target;
440
- }
441
- return { owned: true, changed: true };
442
- }
443
- const over = this.#rails.notePointer([frame.rail], pointer) !== null;
444
- if (!over)
445
- return { owned: false, changed: wasHovered };
446
- // Invariant: the rail is not a row: pointing at it lights nothing in the list.
447
- this.#hoverKey = null;
448
- this.#hoverRegion = "label";
449
- if (event.kind === "press" && !this.#rails.beginDrag(frame.rail, frame.geometry, pointer)) {
450
- this.#scroll = scrollForTrackPage(frame.geometry, pointer.row - frame.rail.rowStart, this.#scroll, frame.page);
451
- }
452
- return { owned: true, changed: true };
453
- }
454
- #noteScrollActivity(host, now) {
455
- this.#activeUntil = Math.max(this.#activeUntil, now + SCROLL_LINGER_MS);
456
- this.#clearActivityTimer();
457
- this.#activityTimer = setTimeout(() => {
458
- this.#activityTimer = undefined;
459
- host.requestRender();
460
- }, SCROLL_LINGER_REPAINT_MS);
461
- this.#activityTimer.unref?.();
462
- }
463
- #clearActivityTimer() {
464
- if (this.#activityTimer !== undefined)
465
- clearTimeout(this.#activityTimer);
466
- this.#activityTimer = undefined;
467
- }
468
389
  #openMenu(rows, selected, selectCurrent = false) {
469
390
  const row = rows[selected];
470
391
  if (row === undefined || row.kind !== "element")
@@ -474,7 +395,7 @@ export class SettingsApp {
474
395
  this.#openStructured(entry);
475
396
  return;
476
397
  }
477
- const shown = this.#shownValue(entry);
398
+ const shown = this.#edits.shown(entry);
478
399
  // Rationale: a number is stepped, not picked from a list: it has its own two controls,
479
400
  // and pointing at it is not a request for anything else.
480
401
  if (typeof shown === "number")
@@ -517,9 +438,6 @@ export class SettingsApp {
517
438
  // selector may open empty so it can truthfully report that no authenticated models exist.
518
439
  if (entry.flags.length === 0 && modelDialog !== "default")
519
440
  return;
520
- // Rationale: beside a tab bar, its own Plus Menu dialog configures `+`, so both ways look the same.
521
- if (entry.backend === "a1" && entry.id === PLUS_MENU_SETTING_ID && this.#options.configurePlusMenu?.() === true)
522
- return;
523
441
  const stored = typeof entry.rawValue === "object" && entry.rawValue !== null && !Array.isArray(entry.rawValue)
524
442
  ? entry.rawValue
525
443
  : {};
@@ -534,19 +452,12 @@ export class SettingsApp {
534
452
  // thing under the pointer, so it stops looking like it.
535
453
  this.#hoverKey = null;
536
454
  this.#hoverRegion = "label";
537
- this.#rails.clear();
455
+ this.#rail.clear();
538
456
  const currentDefault = typeof entry.rawValue === "string" ? entry.rawValue : null;
539
457
  this.#structured = {
540
458
  entry,
541
459
  flags: entry.flags.map(flag => flag.key),
542
460
  modelDialog,
543
- flagDialog: entry.backend !== "a1" ? null
544
- : entry.id === PLUS_MENU_SETTING_ID ? new PlusMenuDialog(entry.flags)
545
- : entry.id === TAB_BAR_RIGHT_ITEMS_SETTING_ID ? new FlagToggleDialog(entry.flags, {
546
- title: "Widgets",
547
- description: "Choose which widgets the tab bar shows.",
548
- empty: "No items match",
549
- }) : null,
550
461
  filter: modelDialog === null ? null : new LineInput(""),
551
462
  step: "model",
552
463
  modelKey: null,
@@ -562,12 +473,6 @@ export class SettingsApp {
562
473
  return { consumed: false };
563
474
  if (open.modelDialog !== null)
564
475
  return this.#modelDialogKey(open, data);
565
- if (open.flagDialog !== null) {
566
- const outcome = open.flagDialog.handle(KEYS[data] ?? data, data, key => this.#toggleFlag(open.flags.indexOf(key)));
567
- if (outcome === "close")
568
- this.#structured = null;
569
- return { consumed: true };
570
- }
571
476
  switch (SETTINGS_SHORTCUTS.resolve(KEYS[data] ?? data, DIALOG_SCOPE)) {
572
477
  case "close":
573
478
  this.#structured = null;
@@ -582,7 +487,7 @@ export class SettingsApp {
582
487
  this.#toggleFlag(open.index);
583
488
  return { consumed: true };
584
489
  case "undo":
585
- this.#undo();
490
+ this.#edits.undo();
586
491
  return { consumed: true };
587
492
  default:
588
493
  return { consumed: true, render: false };
@@ -714,14 +619,8 @@ export class SettingsApp {
714
619
  this.#saveStructured(open, previous, forward);
715
620
  }
716
621
  #saveStructured(open, previous, forward) {
717
- const sequence = ++this.#editSequence;
718
- void this.#session.changeStructured(open.entry.backend, open.entry.id, structuredValue(open.entry, forward)).then(outcome => {
719
- const failure = changeFailure(outcome);
720
- if (failure === null) {
721
- this.#recordUndo({ kind: "structured", sequence, entry: open.entry, previous, forward });
722
- return;
723
- }
724
- // Concurrency: only roll back the dialog if no later press has moved the record on.
622
+ // Concurrency: only roll back the dialog if no later press has moved the record on.
623
+ this.#edits.saveStructured(open.entry, previous, forward, () => {
725
624
  if (this.#structured === open && sameRecord(open.record, forward))
726
625
  replaceRecord(open.record, previous);
727
626
  });
@@ -733,7 +632,7 @@ export class SettingsApp {
733
632
  const key = KEYS[data] ?? data;
734
633
  if (SETTINGS_SHORTCUTS.resolve(key, SCOPE) === "undo") {
735
634
  this.#closeMenu(menu);
736
- this.#undo();
635
+ this.#edits.undo();
737
636
  return { consumed: true };
738
637
  }
739
638
  if (key === "escape") {
@@ -750,7 +649,7 @@ export class SettingsApp {
750
649
  const value = menu.choices[menu.index];
751
650
  this.#closeMenu(menu);
752
651
  if (value !== undefined)
753
- this.#apply(menu.entry, value);
652
+ this.#edits.apply(menu.entry, value);
754
653
  }
755
654
  return { consumed: true };
756
655
  }
@@ -810,13 +709,13 @@ export class SettingsApp {
810
709
  const entry = row.value;
811
710
  if (!entry.editable)
812
711
  return;
813
- const shown = this.#shownValue(entry);
712
+ const shown = this.#edits.shown(entry);
814
713
  if (typeof shown === "number") {
815
714
  // Rationale: at the end of the range there is nothing to say: the arrow already reads
816
715
  // as unavailable, so a message would only repeat it.
817
716
  const next = steppedValue(rangeOf(entry), shown, delta);
818
717
  if (next !== null)
819
- this.#apply(entry, next);
718
+ this.#edits.apply(entry, next);
820
719
  return;
821
720
  }
822
721
  const choices = entry.choices;
@@ -827,82 +726,7 @@ export class SettingsApp {
827
726
  ? (delta > 0 ? 0 : choices.length - 1)
828
727
  : (current + delta + choices.length) % choices.length];
829
728
  if (next !== undefined)
830
- this.#apply(entry, next);
831
- }
832
- #apply(entry, value) {
833
- const key = `${entry.backend}:${entry.id}`;
834
- const previous = this.#shownValue(entry);
835
- const sequence = ++this.#editSequence;
836
- // Invariant: shown immediately so the row never lags a keypress, and so the next press
837
- // steps from here rather than from a value the source has not caught up to.
838
- this.#pending.set(key, value);
839
- void this.#session.change(entry.backend, entry.id, value).then(outcome => {
840
- const failure = changeFailure(outcome);
841
- if (failure !== null) {
842
- if (this.#pending.get(key) === value)
843
- this.#pending.delete(key);
844
- return;
845
- }
846
- if (previous !== null && previous !== value)
847
- this.#recordUndo({ kind: "scalar", sequence, entry, previous });
848
- // Concurrency: a later press may have moved on; only the last request clears itself.
849
- if (this.#pending.get(key) === value)
850
- this.#pending.delete(key);
851
- });
852
- }
853
- #shownValue(entry) {
854
- return this.#pending.get(`${entry.backend}:${entry.id}`) ?? entry.value;
855
- }
856
- #recordUndo(record) {
857
- if (this.#closed)
858
- return;
859
- const after = this.#undoHistory.findIndex(candidate => candidate.sequence > record.sequence);
860
- if (after < 0)
861
- this.#undoHistory.push(record);
862
- else
863
- this.#undoHistory.splice(after, 0, record);
864
- }
865
- #undo() {
866
- this.#undoRequests++;
867
- this.#drainUndo();
868
- }
869
- #drainUndo() {
870
- if (this.#undoActive || this.#undoRequests === 0)
871
- return;
872
- const record = this.#undoHistory.pop();
873
- if (record === undefined) {
874
- this.#undoRequests = 0;
875
- return;
876
- }
877
- this.#undoRequests--;
878
- this.#undoActive = true;
879
- if (record.kind === "scalar") {
880
- const key = `${record.entry.backend}:${record.entry.id}`;
881
- this.#pending.set(key, record.previous);
882
- void this.#session.change(record.entry.backend, record.entry.id, record.previous).then(outcome => {
883
- if (this.#pending.get(key) === record.previous)
884
- this.#pending.delete(key);
885
- this.#finishUndo(record, outcome);
886
- });
887
- return;
888
- }
889
- const open = this.#structured;
890
- if (open !== null && sameEntry(open.entry, record.entry))
891
- replaceRecord(open.record, record.previous);
892
- void this.#session.changeStructured(record.entry.backend, record.entry.id, structuredValue(record.entry, record.previous)).then(outcome => {
893
- const failure = changeFailure(outcome);
894
- if (failure !== null && this.#structured === open && open !== null && sameRecord(open.record, record.previous)) {
895
- replaceRecord(open.record, record.forward);
896
- }
897
- this.#finishUndo(record, outcome);
898
- });
899
- }
900
- #finishUndo(record, outcome) {
901
- const failure = changeFailure(outcome);
902
- if (failure !== null)
903
- this.#recordUndo(record);
904
- this.#undoActive = false;
905
- this.#drainUndo();
729
+ this.#edits.apply(entry, next);
906
730
  }
907
731
  #scrollbarSpeed() {
908
732
  const value = this.#scrollSetting("scrollbarSpeed");
@@ -920,7 +744,7 @@ export class SettingsApp {
920
744
  const entry = this.#session.sections()
921
745
  .flatMap(section => section.entries)
922
746
  .find(candidate => candidate.backend === "a1" && candidate.id === id);
923
- return entry === undefined ? this.#session.value(id) : this.#shownValue(entry);
747
+ return entry === undefined ? this.#session.value(id) : this.#edits.shown(entry);
924
748
  }
925
749
  #jump(rows, target) {
926
750
  this.#select(rows, target);
@@ -992,7 +816,7 @@ export class SettingsApp {
992
816
  }
993
817
  #viewRow(entry) {
994
818
  const key = `${entry.backend}:${entry.id}`;
995
- const shown = this.#shownValue(entry);
819
+ const shown = this.#edits.shown(entry);
996
820
  const value = entry.structured || isDefaultModelEntry(entry)
997
821
  ? CONFIGURE
998
822
  : shown === null
@@ -1018,7 +842,7 @@ export class SettingsApp {
1018
842
  ...(menu.entry.id === "accentColor" ? {
1019
843
  previews: menu.choices.map(choice => theme.accentPreview?.(String(choice), "■") ?? ""),
1020
844
  } : {}),
1021
- current: this.#shownValue(menu.entry) === null ? null : displaySettingValue(menu.entry, this.#shownValue(menu.entry)),
845
+ current: this.#edits.shown(menu.entry) === null ? null : displaySettingValue(menu.entry, this.#edits.shown(menu.entry)),
1022
846
  index: menu.index,
1023
847
  };
1024
848
  const frame = valueMenuFrame(state, {
@@ -1036,8 +860,6 @@ export class SettingsApp {
1036
860
  #dialogLines(open, width, height, theme) {
1037
861
  if (open.modelDialog !== null)
1038
862
  return this.#modelDialogLines(open, width, height, theme);
1039
- if (open.flagDialog !== null)
1040
- return open.flagDialog.lines(open.record, width, theme);
1041
863
  const rows = open.flags.map(key => {
1042
864
  const declared = open.entry.flags.find(flag => flag.key === key);
1043
865
  return {
@@ -1111,8 +933,7 @@ export class SettingsApp {
1111
933
  #footerLines(width, theme) {
1112
934
  // Rationale: standing guidance is more useful than transient feedback; failures still
1113
935
  // roll back without displacing the Settings interaction contract.
1114
- const entries = SETTINGS_SHORTCUTS.hintEntries(SCOPE).filter(entry => !this.#options.pinned
1115
- || entry.key !== DIALOG_CLOSE_SHORTCUT_HINT.key || entry.action !== DIALOG_CLOSE_SHORTCUT_HINT.action);
936
+ const entries = SETTINGS_SHORTCUTS.hintEntries(SCOPE);
1116
937
  const status = renderShortcutHintsWithClose(entries, theme, width, width > 0 ? 1 : 0);
1117
938
  const input = this.#search.input;
1118
939
  if (input === null)
@@ -1183,36 +1004,6 @@ function thinkingLevelDescription(level) {
1183
1004
  default: return "";
1184
1005
  }
1185
1006
  }
1186
- function structuredValue(entry, record) {
1187
- // Invariant: a choice part at its fallback is unset, so the engine's default applies.
1188
- return Object.fromEntries(Object.entries(record).filter(([key, value]) => {
1189
- const part = entry.flags.find(candidate => candidate.key === key);
1190
- return part?.choices === undefined || value !== part.fallback;
1191
- }));
1192
- }
1193
- function sameEntry(left, right) {
1194
- return left.backend === right.backend && left.id === right.id;
1195
- }
1196
- function sameRecord(left, right) {
1197
- const leftEntries = Object.entries(left);
1198
- const rightEntries = Object.entries(right);
1199
- return leftEntries.length === rightEntries.length
1200
- && leftEntries.every(([key, value]) => right[key] === value);
1201
- }
1202
- function replaceRecord(target, source) {
1203
- for (const key of Object.keys(target))
1204
- delete target[key];
1205
- Object.assign(target, source);
1206
- }
1207
- function changeFailure(outcome) {
1208
- if (outcome.failure !== null)
1209
- return outcome.failure;
1210
- if (outcome.status === "failed")
1211
- return "the effect failed";
1212
- if (outcome.status === "unavailable")
1213
- return outcome.limitationReason ?? "the setting is unavailable";
1214
- return outcome.limitationReason;
1215
- }
1216
1007
  function isDefaultModelEntry(entry) {
1217
1008
  return entry.backend === "agent" && entry.id === "defaultModel";
1218
1009
  }
@@ -1224,11 +1015,8 @@ function labelOf(entry) {
1224
1015
  function rangeOf(entry) {
1225
1016
  return { minimum: entry.minimum, maximum: entry.maximum, values: numericValues(entry.choices) };
1226
1017
  }
1227
- /** Booleans read as yes and no; time-format choices preview the current local time. */
1228
- function displaySettingValue(entry, value) {
1229
- if (entry.backend === "a1" && entry.id === "timeFormat" && (value === "20:00" || value === "8:00 PM")) {
1230
- return formatLocalTime(new Date(), value) ?? value;
1231
- }
1018
+ /** Booleans read as yes and no. */
1019
+ function displaySettingValue(_entry, value) {
1232
1020
  if (typeof value === "boolean")
1233
1021
  return value ? "yes" : "no";
1234
1022
  return String(value);
@@ -0,0 +1,31 @@
1
+ import type { OwnedUiSettingValue, OwnedUiSettingsChangeOutcome, OwnedUiSettingsEntry, OwnedSettingsManager } from "../../ui/settings/index.js";
2
+ type SettingsRecord = Record<string, boolean | string>;
3
+ /** The structured dialog an undo may need to roll back in place; null when none is open. */
4
+ export interface OpenStructuredRecord {
5
+ readonly entry: OwnedUiSettingsEntry;
6
+ readonly record: SettingsRecord;
7
+ }
8
+ /**
9
+ * The settings screen's edits: values shown ahead of the source, and an undo history ordered by edit
10
+ * sequence. Undo requests drain one at a time so each restores against the result of the one before.
11
+ */
12
+ export declare class SettingsEdits {
13
+ #private;
14
+ constructor(session: Pick<OwnedSettingsManager, "change" | "changeStructured">, openStructured: () => OpenStructuredRecord | null);
15
+ /** The value a row shows: a pending edit, or the source's value. */
16
+ shown(entry: OwnedUiSettingsEntry): OwnedUiSettingValue | null;
17
+ apply(entry: OwnedUiSettingsEntry, value: OwnedUiSettingValue): void;
18
+ /** Saves a structured dialog's record; `rollback` runs when the change fails. */
19
+ saveStructured(entry: OwnedUiSettingsEntry, previous: Readonly<SettingsRecord>, forward: Readonly<SettingsRecord>, rollback: () => void): void;
20
+ undo(): void;
21
+ open(): void;
22
+ /** Drops the history and queued requests; late results no longer record undo steps. */
23
+ close(): void;
24
+ }
25
+ /** The record the engine stores: a choice part at its fallback is unset, so the engine's default applies. */
26
+ export declare function structuredValue(entry: OwnedUiSettingsEntry, record: Readonly<SettingsRecord>): SettingsRecord;
27
+ export declare function sameRecord(left: Readonly<SettingsRecord>, right: Readonly<SettingsRecord>): boolean;
28
+ export declare function replaceRecord(target: SettingsRecord, source: Readonly<SettingsRecord>): void;
29
+ /** Why a change did not take effect, or null when it did. */
30
+ export declare function changeFailure(outcome: OwnedUiSettingsChangeOutcome): string | null;
31
+ export {};