@timurproko/a1 0.2.6-dev.736 → 0.2.7-dev.1221

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 (423) hide show
  1. package/README.md +41 -3
  2. package/bin/automatic-update.js +7 -0
  3. package/bin/cli.js +4 -0
  4. package/bin/guardian.js +5 -0
  5. package/bin/tab-launch-context.d.ts +27 -0
  6. package/bin/tab-launch-context.js +94 -0
  7. package/bin/ui.js +107 -59
  8. package/dist/app/session-shell/clipboard-diagnostics.js +1 -1
  9. package/dist/app/session-shell/dialog-coordinator.d.ts +42 -0
  10. package/dist/app/session-shell/dialog-coordinator.js +133 -0
  11. package/dist/app/session-shell/dock-chrome.d.ts +34 -0
  12. package/dist/app/session-shell/dock-chrome.js +109 -0
  13. package/dist/app/session-shell/exit-notice.d.ts +1 -1
  14. package/dist/app/session-shell/exit-notice.js +1 -1
  15. package/dist/app/session-shell/extension-surface.d.ts +30 -0
  16. package/dist/app/session-shell/extension-surface.js +105 -0
  17. package/dist/app/session-shell/helper-pool.d.ts +3 -5
  18. package/dist/app/session-shell/helper-pool.js +3 -5
  19. package/dist/app/session-shell/input-surface-switch.d.ts +36 -0
  20. package/dist/app/session-shell/input-surface-switch.js +85 -0
  21. package/dist/app/session-shell/login-interaction.d.ts +27 -0
  22. package/dist/app/session-shell/login-interaction.js +91 -0
  23. package/dist/app/session-shell/prompt-submission.d.ts +48 -0
  24. package/dist/app/session-shell/prompt-submission.js +276 -0
  25. package/dist/app/session-shell/resident-tab-coordinator.d.ts +38 -0
  26. package/dist/app/session-shell/resident-tab-coordinator.js +77 -0
  27. package/dist/app/session-shell/response-copy-helper.js +21 -6
  28. package/dist/app/session-shell/response-copy-protocol.d.ts +1 -1
  29. package/dist/app/session-shell/response-copy-transport.d.ts +16 -6
  30. package/dist/app/session-shell/response-copy-transport.js +69 -17
  31. package/dist/app/session-shell/session-concern.d.ts +22 -0
  32. package/dist/app/session-shell/session-concern.js +29 -0
  33. package/dist/app/session-shell/session-lifecycle.d.ts +29 -0
  34. package/dist/app/session-shell/session-lifecycle.js +49 -0
  35. package/dist/app/session-shell/session-shell-root.d.ts +42 -6
  36. package/dist/app/session-shell/session-shell-root.js +196 -908
  37. package/dist/app/session-shell/session-shell.d.ts +3 -8
  38. package/dist/app/session-shell/session-shell.js +324 -835
  39. package/dist/app/session-shell/session-viewport-controller.d.ts +2 -2
  40. package/dist/app/session-shell/session-viewport-controller.js +29 -15
  41. package/dist/app/session-shell/settings-bindings.d.ts +17 -0
  42. package/dist/app/session-shell/settings-bindings.js +91 -0
  43. package/dist/app/session-shell/shell-editor-factory.d.ts +27 -0
  44. package/dist/app/session-shell/shell-editor-factory.js +102 -0
  45. package/dist/app/session-shell/shell-host.d.ts +6 -0
  46. package/dist/app/session-shell/shell-host.js +34 -7
  47. package/dist/app/session-shell/shell-layout.d.ts +64 -0
  48. package/dist/app/session-shell/shell-layout.js +18 -0
  49. package/dist/app/session-shell/suggestion-surface.d.ts +25 -0
  50. package/dist/app/session-shell/suggestion-surface.js +63 -0
  51. package/dist/app/session-shell/transcript-document.d.ts +78 -0
  52. package/dist/app/session-shell/transcript-document.js +365 -0
  53. package/dist/app/session-shell/viewport-layout.d.ts +31 -0
  54. package/dist/app/session-shell/viewport-layout.js +160 -0
  55. package/dist/app/session-shell/workflow-output.d.ts +33 -0
  56. package/dist/app/session-shell/workflow-output.js +174 -0
  57. package/dist/app/session-shell/workflow-router.d.ts +25 -0
  58. package/dist/app/session-shell/workflow-router.js +39 -0
  59. package/dist/cli/dispatch.d.ts +11 -1
  60. package/dist/cli/dispatch.js +79 -5
  61. package/dist/cli/tabs-request.d.ts +7 -0
  62. package/dist/cli/tabs-request.js +1 -0
  63. package/dist/cli/tabs.d.ts +14 -0
  64. package/dist/cli/tabs.js +151 -0
  65. package/dist/cli/version-stats.js +38 -3
  66. package/dist/composition/owned-settings.d.ts +12 -0
  67. package/dist/composition/owned-settings.js +36 -0
  68. package/dist/composition/owned-ui.d.ts +27 -28
  69. package/dist/composition/owned-ui.js +205 -153
  70. package/dist/composition/resident-tab-bridge.d.ts +25 -0
  71. package/dist/composition/resident-tab-bridge.js +180 -0
  72. package/dist/composition/session-backend.d.ts +19 -0
  73. package/dist/composition/session-backend.js +1 -0
  74. package/dist/composition/session-runtime-registry.d.ts +20 -0
  75. package/dist/composition/session-runtime-registry.js +85 -0
  76. package/dist/composition/settings-route-host.d.ts +16 -1
  77. package/dist/composition/settings-route-host.js +29 -10
  78. package/dist/composition/settings-search-input.d.ts +9 -0
  79. package/dist/composition/settings-search-input.js +58 -0
  80. package/dist/composition/startup-route.d.ts +32 -0
  81. package/dist/composition/startup-route.js +72 -0
  82. package/dist/composition/utility-tab.d.ts +28 -0
  83. package/dist/composition/utility-tab.js +242 -0
  84. package/dist/contracts/owned-ui/index.d.ts +1 -1
  85. package/dist/contracts/owned-ui/model.d.ts +3 -0
  86. package/dist/contracts/owned-ui/session-backend.d.ts +3 -0
  87. package/dist/contracts/owned-ui/session-workflows.d.ts +11 -4
  88. package/dist/contracts/presentation/index.d.ts +11 -0
  89. package/dist/contracts/presentation/index.js +12 -0
  90. package/dist/features/launch/development-launch.js +6 -0
  91. package/dist/features/launch/index.d.ts +1 -1
  92. package/dist/features/launch/intent.d.ts +3 -1
  93. package/dist/features/launch/intent.js +7 -4
  94. package/dist/features/launch/profile-paths.js +4 -0
  95. package/dist/features/owned-ui/plus-menu-dialog.d.ts +22 -0
  96. package/dist/features/owned-ui/plus-menu-dialog.js +76 -0
  97. package/dist/features/owned-ui/project-trust-dialog.d.ts +1 -1
  98. package/dist/features/owned-ui/project-trust-dialog.js +6 -8
  99. package/dist/features/owned-ui/project-trust-prompt.d.ts +1 -0
  100. package/dist/features/owned-ui/project-trust-prompt.js +7 -3
  101. package/dist/features/owned-ui/reference-screen-app.d.ts +2 -0
  102. package/dist/features/owned-ui/reference-screen-app.js +12 -2
  103. package/dist/features/owned-ui/resources/release-notes.json +4 -0
  104. package/dist/features/owned-ui/settings-app.d.ts +12 -2
  105. package/dist/features/owned-ui/settings-app.js +119 -84
  106. package/dist/features/owned-ui/settings-search-input.d.ts +29 -0
  107. package/dist/features/owned-ui/settings-search-input.js +1 -0
  108. package/dist/features/prompt-history/index.d.ts +1 -1
  109. package/dist/features/prompt-history/paths.d.ts +2 -1
  110. package/dist/features/prompt-history/paths.js +10 -2
  111. package/dist/features/prompt-history/service.d.ts +5 -0
  112. package/dist/features/prompt-history/service.js +1 -1
  113. package/dist/features/resident-tab/auto-name.d.ts +11 -0
  114. package/dist/features/resident-tab/auto-name.js +44 -0
  115. package/dist/features/resident-tab/index.d.ts +5 -0
  116. package/dist/features/resident-tab/index.js +7 -0
  117. package/dist/features/resident-tab/shortcut-bindings-file.d.ts +8 -0
  118. package/dist/features/resident-tab/shortcut-bindings-file.js +40 -0
  119. package/dist/features/resident-tab/shortcut-declarations.d.ts +13 -0
  120. package/dist/features/resident-tab/shortcut-declarations.js +26 -0
  121. package/dist/features/resident-tab/shortcut-projection.d.ts +29 -0
  122. package/dist/features/resident-tab/shortcut-projection.js +64 -0
  123. package/dist/features/resident-tab/status-deriver.d.ts +10 -0
  124. package/dist/features/resident-tab/status-deriver.js +12 -0
  125. package/dist/foundation/launch-context/index.d.ts +12 -0
  126. package/dist/foundation/launch-context/index.js +26 -0
  127. package/dist/foundation/launch-guardian/exit-watcher.d.ts +14 -0
  128. package/dist/foundation/launch-guardian/exit-watcher.js +94 -0
  129. package/dist/foundation/launch-guardian/main.d.ts +7 -1
  130. package/dist/foundation/launch-guardian/main.js +60 -7
  131. package/dist/foundation/lifecycle/session-repository-context.js +16 -2
  132. package/dist/foundation/process-containment/{native-guardian-containment.d.ts → addon-containment.d.ts} +7 -5
  133. package/dist/foundation/process-containment/addon-containment.js +139 -0
  134. package/dist/foundation/process-containment/addon-process-inspector.d.ts +11 -0
  135. package/dist/foundation/process-containment/addon-process-inspector.js +36 -0
  136. package/dist/foundation/process-containment/addon.d.ts +42 -0
  137. package/dist/foundation/process-containment/addon.js +57 -0
  138. package/dist/foundation/process-containment/artifact.d.ts +1 -1
  139. package/dist/foundation/process-containment/artifact.js +6 -5
  140. package/dist/foundation/process-containment/contracts.d.ts +2 -0
  141. package/dist/foundation/process-containment/index.d.ts +4 -4
  142. package/dist/foundation/process-containment/index.js +3 -3
  143. package/dist/foundation/process-containment/native-process-inspector.d.ts +2 -1
  144. package/dist/foundation/process-containment/native-process-inspector.js +10 -10
  145. package/dist/foundation/release/automatic-update.d.ts +37 -0
  146. package/dist/foundation/release/automatic-update.js +265 -0
  147. package/dist/foundation/release/bootstrap.d.ts +7 -9
  148. package/dist/foundation/release/bootstrap.js +107 -24
  149. package/dist/foundation/release/cohort-state.d.ts +1 -1
  150. package/dist/foundation/release/cohort-state.js +6 -3
  151. package/dist/foundation/release/dependency-certification.js +54 -19
  152. package/dist/foundation/release/early-accent.d.ts +12 -0
  153. package/dist/foundation/release/early-accent.js +59 -0
  154. package/dist/foundation/release/index.d.ts +2 -2
  155. package/dist/foundation/release/index.js +2 -2
  156. package/dist/foundation/release/latest-release.d.ts +24 -2
  157. package/dist/foundation/release/latest-release.js +51 -1
  158. package/dist/foundation/release/progress-palette.generated.d.ts +137 -3
  159. package/dist/foundation/release/progress-palette.generated.js +137 -3
  160. package/dist/foundation/release/release-gc.d.ts +3 -0
  161. package/dist/foundation/release/release-gc.js +59 -8
  162. package/dist/foundation/release/release-store.d.ts +12 -0
  163. package/dist/foundation/release/release-store.js +124 -2
  164. package/dist/foundation/release/update-execution-lease.d.ts +48 -0
  165. package/dist/foundation/release/update-execution-lease.js +161 -0
  166. package/dist/foundation/release/update.d.ts +12 -7
  167. package/dist/foundation/release/update.js +281 -196
  168. package/dist/foundation/resident-tabs/bounded-host-command.d.ts +18 -0
  169. package/dist/foundation/resident-tabs/bounded-host-command.js +39 -0
  170. package/dist/foundation/resident-tabs/bridge-client.d.ts +70 -0
  171. package/dist/foundation/resident-tabs/bridge-client.js +321 -0
  172. package/dist/foundation/resident-tabs/doctor.d.ts +28 -0
  173. package/dist/foundation/resident-tabs/doctor.js +166 -0
  174. package/dist/foundation/resident-tabs/draft-checkpoint.d.ts +27 -0
  175. package/dist/foundation/resident-tabs/draft-checkpoint.js +145 -0
  176. package/dist/foundation/resident-tabs/ensure-terminal-host.d.ts +36 -0
  177. package/dist/foundation/resident-tabs/ensure-terminal-host.js +151 -0
  178. package/dist/foundation/resident-tabs/fault-injection.d.ts +8 -0
  179. package/dist/foundation/resident-tabs/fault-injection.js +26 -0
  180. package/dist/foundation/resident-tabs/fixture-control.d.ts +7 -0
  181. package/dist/foundation/resident-tabs/fixture-control.js +35 -0
  182. package/dist/foundation/resident-tabs/host-entry.d.ts +1 -0
  183. package/dist/foundation/resident-tabs/host-entry.js +17 -0
  184. package/dist/foundation/resident-tabs/index.d.ts +12 -0
  185. package/dist/foundation/resident-tabs/index.js +6 -0
  186. package/dist/foundation/resident-tabs/maintenance.d.ts +39 -0
  187. package/dist/foundation/resident-tabs/maintenance.js +75 -0
  188. package/dist/foundation/resident-tabs/progress-observation-schema.d.ts +34 -0
  189. package/dist/foundation/resident-tabs/progress-observation-schema.js +1 -0
  190. package/dist/foundation/resident-tabs/progress-observation.d.ts +4 -0
  191. package/dist/foundation/resident-tabs/progress-observation.js +150 -0
  192. package/dist/foundation/resident-tabs/prompt-journal.d.ts +63 -0
  193. package/dist/foundation/resident-tabs/prompt-journal.js +213 -0
  194. package/dist/foundation/resident-tabs/protocol.d.ts +12 -0
  195. package/dist/foundation/resident-tabs/protocol.js +195 -0
  196. package/dist/foundation/resident-tabs/recovery.d.ts +26 -0
  197. package/dist/foundation/resident-tabs/recovery.js +205 -0
  198. package/dist/foundation/resident-tabs/release-holds.d.ts +28 -0
  199. package/dist/foundation/resident-tabs/release-holds.js +75 -0
  200. package/dist/foundation/resident-tabs/routes.d.ts +5 -0
  201. package/dist/foundation/resident-tabs/routes.js +5 -0
  202. package/dist/foundation/resident-tabs/routing.d.ts +11 -0
  203. package/dist/foundation/resident-tabs/routing.js +10 -0
  204. package/dist/foundation/resident-tabs/session-sync.d.ts +14 -0
  205. package/dist/foundation/resident-tabs/session-sync.js +37 -0
  206. package/dist/foundation/resident-tabs/settings.d.ts +12 -0
  207. package/dist/foundation/resident-tabs/settings.js +58 -0
  208. package/dist/foundation/resident-tabs/terminal-host-artifact.d.ts +14 -0
  209. package/dist/foundation/resident-tabs/terminal-host-artifact.js +78 -0
  210. package/dist/foundation/resident-tabs/zip-archive.d.ts +9 -0
  211. package/dist/foundation/resident-tabs/zip-archive.js +56 -0
  212. package/dist/foundation/session-writer-lock/index.d.ts +30 -0
  213. package/dist/foundation/session-writer-lock/index.js +203 -0
  214. package/dist/foundation/startup/startup-descriptor.js +2 -2
  215. package/dist/foundation/terminal-cleanup/index.d.ts +1 -1
  216. package/dist/foundation/terminal-cleanup/index.js +1 -1
  217. package/dist/foundation/terminal-cleanup/terminal-reset.d.ts +6 -0
  218. package/dist/foundation/terminal-cleanup/terminal-reset.js +6 -0
  219. package/dist/integrations/pi/components/editor-interaction.d.ts +2 -0
  220. package/dist/integrations/pi/components/modal-frame.d.ts +17 -1
  221. package/dist/integrations/pi/components/modal-frame.js +48 -9
  222. package/dist/integrations/pi/components/models-dialog.js +4 -52
  223. package/dist/integrations/pi/components/owned-editor-ux.d.ts +6 -1
  224. package/dist/integrations/pi/components/owned-editor-ux.js +90 -6
  225. package/dist/integrations/pi/components/resources/builtin-themes.d.ts +4 -4
  226. package/dist/integrations/pi/components/resources/builtin-themes.js +4 -4
  227. package/dist/integrations/pi/components/share-operation-dialog.d.ts +2 -0
  228. package/dist/integrations/pi/components/share-operation-dialog.js +2 -1
  229. package/dist/integrations/pi/components/shell-editor-autocomplete.js +58 -36
  230. package/dist/integrations/pi/components/shell-extension-ui.js +79 -60
  231. package/dist/integrations/pi/components/shell-footer-status.d.ts +1 -1
  232. package/dist/integrations/pi/components/shell-footer-status.js +21 -5
  233. package/dist/integrations/pi/components/shell-hotkey-sections.js +1 -1
  234. package/dist/integrations/pi/components/shell-presenters-info.d.ts +5 -2
  235. package/dist/integrations/pi/components/shell-presenters-info.js +18 -4
  236. package/dist/integrations/pi/components/shell-presenters-transcript.js +4 -1
  237. package/dist/integrations/pi/components/shell-selectors-dialogs.js +5 -1
  238. package/dist/integrations/pi/components/shell-shared-facade.d.ts +12 -1
  239. package/dist/integrations/pi/components/skills-dialog.js +2 -2
  240. package/dist/integrations/pi/components/upstream/adjacent/core/keybindings.d.ts +1 -1
  241. package/dist/integrations/pi/components/upstream/adjacent/core/keybindings.js +17 -4
  242. package/dist/integrations/pi/components/upstream/assets/earendil-image.json +2 -2
  243. package/dist/integrations/pi/components/upstream/components/countdown-timer.d.ts +1 -1
  244. package/dist/integrations/pi/components/upstream/components/earendil-announcement.js +1 -1
  245. package/dist/integrations/pi/components/upstream/components/extension-editor.d.ts +1 -1
  246. package/dist/integrations/pi/components/upstream/components/extension-editor.js +1 -1
  247. package/dist/integrations/pi/components/upstream/components/extension-input.js +1 -1
  248. package/dist/integrations/pi/components/upstream/components/extension-selector.js +1 -1
  249. package/dist/integrations/pi/components/upstream/components/mermaid.js +1 -1
  250. package/dist/integrations/pi/components/upstream/components/owned-editor.d.ts +8 -6
  251. package/dist/integrations/pi/components/upstream/components/owned-editor.js +16 -9
  252. package/dist/integrations/pi/components/upstream/components/pi-logo.js +1 -1
  253. package/dist/integrations/pi/components/upstream/components/scoped-models-selector.d.ts +4 -4
  254. package/dist/integrations/pi/components/upstream/components/scoped-models-selector.js +2 -2
  255. package/dist/integrations/pi/components/upstream/components/session-footer.d.ts +2 -1
  256. package/dist/integrations/pi/components/upstream/components/session-footer.js +31 -25
  257. package/dist/integrations/pi/components/upstream/components/session-selector-search.js +1 -1
  258. package/dist/integrations/pi/components/upstream/components/session-selector.js +8 -7
  259. package/dist/integrations/pi/components/upstream/components/skill-invocation-message.d.ts +1 -1
  260. package/dist/integrations/pi/components/upstream/components/skill-invocation-message.js +1 -1
  261. package/dist/integrations/pi/components/upstream/components/status-indicator.d.ts +2 -2
  262. package/dist/integrations/pi/components/upstream/components/status-indicator.js +3 -3
  263. package/dist/integrations/pi/components/upstream/components/themed-text.d.ts +1 -1
  264. package/dist/integrations/pi/components/upstream/components/themed-text.js +1 -1
  265. package/dist/integrations/pi/components/upstream/components/thinking-selector.d.ts +8 -7
  266. package/dist/integrations/pi/components/upstream/components/thinking-selector.js +10 -9
  267. package/dist/integrations/pi/components/upstream/components/tool-execution.d.ts +2 -6
  268. package/dist/integrations/pi/components/upstream/components/tool-execution.js +103 -101
  269. package/dist/integrations/pi/components/upstream/components/tree-selector.d.ts +9 -9
  270. package/dist/integrations/pi/components/upstream/components/tree-selector.js +13 -21
  271. package/dist/integrations/pi/components/upstream/components/trust-selector.js +1 -1
  272. package/dist/integrations/pi/components/upstream/external-editor.js +1 -1
  273. package/dist/integrations/pi/components/upstream/history/editor-core.d.ts +2 -2
  274. package/dist/integrations/pi/components/upstream/history/editor-core.js +7 -5
  275. package/dist/integrations/pi/components/upstream/history/kill-ring.d.ts +1 -1
  276. package/dist/integrations/pi/components/upstream/history/kill-ring.js +1 -1
  277. package/dist/integrations/pi/components/upstream/history/printable-key.js +1 -1
  278. package/dist/integrations/pi/components/upstream/history/text-helpers.js +1 -1
  279. package/dist/integrations/pi/components/upstream/history/undo-stack.d.ts +1 -1
  280. package/dist/integrations/pi/components/upstream/history/undo-stack.js +1 -1
  281. package/dist/integrations/pi/components/upstream/history/word-navigation.js +1 -1
  282. package/dist/integrations/pi/components/upstream/model-search.d.ts +1 -1
  283. package/dist/integrations/pi/components/upstream/program-status-reporter.d.ts +1 -1
  284. package/dist/integrations/pi/components/upstream/theme/theme-controller.d.ts +1 -1
  285. package/dist/integrations/pi/components/upstream/theme/theme.d.ts +5 -0
  286. package/dist/integrations/pi/components/upstream/theme/theme.js +29 -2
  287. package/dist/integrations/pi/engine/adapter.d.ts +5 -77
  288. package/dist/integrations/pi/engine/adapter.js +95 -394
  289. package/dist/integrations/pi/engine/command-dispatch.d.ts +13 -0
  290. package/dist/integrations/pi/engine/command-dispatch.js +57 -0
  291. package/dist/integrations/pi/engine/host.js +2 -2
  292. package/dist/integrations/pi/engine/offline-settings-port.d.ts +23 -0
  293. package/dist/integrations/pi/engine/offline-settings-port.js +53 -0
  294. package/dist/integrations/pi/engine/pi-settings-metadata.json +14 -2
  295. package/dist/integrations/pi/engine/ports.d.ts +56 -0
  296. package/dist/integrations/pi/engine/ports.js +93 -0
  297. package/dist/integrations/pi/engine/prompt-suggestions.d.ts +1 -0
  298. package/dist/integrations/pi/engine/prompt-suggestions.js +40 -0
  299. package/dist/integrations/pi/engine/resources/changelog.json +4 -4
  300. package/dist/integrations/pi/engine/runtime-integration.js +102 -29
  301. package/dist/integrations/pi/engine/session-runtime.d.ts +0 -6
  302. package/dist/integrations/pi/engine/session-runtime.js +13 -5
  303. package/dist/integrations/pi/engine/session-selection.d.ts +3 -0
  304. package/dist/integrations/pi/engine/session-selection.js +45 -9
  305. package/dist/integrations/pi/engine/settings-bridge.d.ts +5 -0
  306. package/dist/integrations/pi/engine/settings-bridge.js +15 -0
  307. package/dist/integrations/pi/engine/settings-port.js +11 -15
  308. package/dist/integrations/pi/engine/view-state.d.ts +42 -0
  309. package/dist/integrations/pi/engine/view-state.js +126 -0
  310. package/dist/integrations/pi/engine/workflow-contexts.js +10 -1
  311. package/dist/integrations/pi/engine/workflow-runner.js +73 -4
  312. package/dist/integrations/pi/engine/workflow-support.d.ts +12 -0
  313. package/dist/integrations/pi/engine/workflow-support.js +36 -0
  314. package/dist/integrations/pi/engine/workflows.d.ts +3 -1
  315. package/dist/integrations/pi/engine/workflows.js +1 -0
  316. package/dist/integrations/pi/startup-public.js +257 -310
  317. package/dist/integrations/pi/startup-public.manifest.json +564 -440
  318. package/dist/integrations/pi/tui-runtime/adapter.d.ts +6 -0
  319. package/dist/integrations/pi/tui-runtime/adapter.js +32 -1
  320. package/dist/integrations/pi/tui-runtime/contracts.d.ts +5 -0
  321. package/dist/integrations/pi/tui-runtime/damage-aware-terminal.d.ts +12 -1
  322. package/dist/integrations/pi/tui-runtime/damage-aware-terminal.js +31 -2
  323. package/dist/native/darwin-arm64/manifest.json +10 -7
  324. package/dist/native/darwin-arm64/process-guardian.node +0 -0
  325. package/dist/native/darwin-arm64/terminal-host-THIRD-PARTY-NOTICES.txt +10500 -0
  326. package/dist/native/darwin-arm64/terminal-host.manifest.json +46 -0
  327. package/dist/native/darwin-arm64/terminal-host.node +0 -0
  328. package/dist/native/darwin-x64/manifest.json +23 -0
  329. package/dist/native/darwin-x64/process-guardian.node +0 -0
  330. package/dist/native/darwin-x64/terminal-host-THIRD-PARTY-NOTICES.txt +10737 -0
  331. package/dist/native/darwin-x64/terminal-host.manifest.json +46 -0
  332. package/dist/native/darwin-x64/terminal-host.node +0 -0
  333. package/dist/native/linux-x64/manifest.json +10 -7
  334. package/dist/native/linux-x64/process-guardian.node +0 -0
  335. package/dist/native/linux-x64/terminal-host-THIRD-PARTY-NOTICES.txt +11226 -0
  336. package/dist/native/linux-x64/terminal-host.manifest.json +46 -0
  337. package/dist/native/linux-x64/terminal-host.node +0 -0
  338. package/dist/native/win32-x64/manifest.json +10 -7
  339. package/dist/native/win32-x64/process-guardian.node +0 -0
  340. package/dist/native/win32-x64/terminal-host-THIRD-PARTY-NOTICES.txt +10757 -0
  341. package/dist/native/win32-x64/terminal-host.manifest.json +46 -0
  342. package/dist/native/win32-x64/terminal-host.node +0 -0
  343. package/dist/product-identity.d.ts +3 -3
  344. package/dist/product-identity.js +4 -4
  345. package/dist/product-identity.json +16 -2
  346. package/dist/runtime-payload-inventory.json +6330 -6677
  347. package/dist/ui/apps/host.d.ts +2 -0
  348. package/dist/ui/apps/host.js +7 -1
  349. package/dist/ui/components/dialog-panel.js +35 -30
  350. package/dist/ui/components/index.d.ts +2 -2
  351. package/dist/ui/components/index.js +1 -1
  352. package/dist/ui/components/line-input.d.ts +4 -1
  353. package/dist/ui/components/line-input.js +3 -1
  354. package/dist/ui/components/prompt-input.d.ts +11 -8
  355. package/dist/ui/components/prompt-input.js +15 -13
  356. package/dist/ui/components/selection-copy.d.ts +2 -0
  357. package/dist/ui/components/selection-copy.js +13 -0
  358. package/dist/ui/components/spans.js +2 -2
  359. package/dist/ui/components/submitted-prompt.d.ts +9 -6
  360. package/dist/ui/components/submitted-prompt.js +20 -12
  361. package/dist/ui/components/surface.js +4 -2
  362. package/dist/ui/components/text.d.ts +3 -6
  363. package/dist/ui/components/text.js +6 -8
  364. package/dist/ui/components/transcript-viewport.d.ts +9 -2
  365. package/dist/ui/components/transcript-viewport.js +176 -55
  366. package/dist/ui/components/value-menu.d.ts +6 -3
  367. package/dist/ui/components/value-menu.js +6 -5
  368. package/dist/ui/settings/declarations.d.ts +90 -16
  369. package/dist/ui/settings/declarations.js +67 -14
  370. package/dist/ui/settings/early-accent.d.ts +81 -0
  371. package/dist/ui/settings/early-accent.js +50 -0
  372. package/dist/ui/settings/index.d.ts +4 -2
  373. package/dist/ui/settings/index.js +2 -1
  374. package/dist/ui/settings/manager.d.ts +16 -3
  375. package/dist/ui/settings/manager.js +122 -33
  376. package/dist/ui/settings/migrations.d.ts +6 -0
  377. package/dist/ui/settings/migrations.js +73 -0
  378. package/dist/ui/settings/profile-document.d.ts +26 -0
  379. package/dist/ui/settings/profile-document.js +164 -0
  380. package/dist/ui/settings/progress-palette.generated.d.ts +139 -0
  381. package/dist/ui/settings/progress-palette.generated.js +139 -0
  382. package/dist/ui/settings/sections.d.ts +4 -0
  383. package/dist/ui/settings/sections.js +9 -3
  384. package/docs/architecture/boundaries.md +25 -10
  385. package/docs/architecture/evidence/resident-tabs/linux-x64.md +37 -0
  386. package/docs/architecture/evidence/resident-tabs/macos-arm64.md +36 -0
  387. package/docs/architecture/evidence/resident-tabs/macos-x64.md +35 -0
  388. package/docs/architecture/evidence/resident-tabs/windows-x64.md +36 -0
  389. package/docs/architecture/evidence/terminal-host-spike/manual-one-pane-terminal-host.md +70 -0
  390. package/docs/architecture/evidence/terminal-host-spike/manual-two-by-two-basic-terminal-host.md +32 -0
  391. package/docs/architecture/evidence/terminal-host-spike/milestone-baseline.json +115 -0
  392. package/docs/architecture/evidence/terminal-host-spike/owned-ui-foundation-prerequisite.json +48 -0
  393. package/docs/architecture/evidence/terminal-host-spike/terminal-host-provenance.json +125 -0
  394. package/docs/architecture/evidence/terminal-host-spike/terminal-host-task-5-1.json +56 -0
  395. package/docs/architecture/evidence/terminal-host-spike/terminal-host-task-5-3.json +174 -0
  396. package/docs/architecture/evidence/terminal-host-spike/terminal-spike-acceptance-record.json +18 -0
  397. package/docs/architecture/internal-naming.md +3 -1
  398. package/docs/architecture/process-guardian-provenance.md +18 -10
  399. package/docs/architecture/project-structure.md +8 -0
  400. package/docs/architecture/resident-tabs-requirements.md +18 -0
  401. package/docs/architecture/resident-tabs.md +648 -0
  402. package/docs/architecture/response-copy-delivery.md +1 -1
  403. package/docs/architecture/terminal-host-proof-gate.md +3 -1
  404. package/docs/architecture/terminal-host-provenance.md +16 -4
  405. package/docs/architecture/terminal-host-spike-evidence.md +1 -1
  406. package/docs/architecture/tool-image-presentation.md +2 -1
  407. package/docs/architecture/toolchain.md +11 -9
  408. package/docs/ci-release-runbook.md +14 -7
  409. package/docs/features/launch-profiles.md +11 -8
  410. package/docs/features/prompt-history.md +41 -20
  411. package/docs/manual-resident-tabs-acceptance.md +51 -0
  412. package/docs/openspec-archive-automation.md +49 -22
  413. package/docs/releases/0.2.6.md +44 -0
  414. package/docs/validation.md +49 -9
  415. package/package.json +19 -6
  416. package/dist/foundation/process-containment/darwin-process-inspector.d.ts +0 -5
  417. package/dist/foundation/process-containment/darwin-process-inspector.js +0 -7
  418. package/dist/foundation/process-containment/native-guardian-containment.js +0 -152
  419. package/dist/foundation/process-containment/windows-process-inspector.d.ts +0 -19
  420. package/dist/foundation/process-containment/windows-process-inspector.js +0 -56
  421. package/dist/native/darwin-arm64/process-guardian +0 -0
  422. package/dist/native/linux-x64/process-guardian +0 -0
  423. package/dist/native/win32-x64/process-guardian.exe +0 -0
@@ -1,27 +1,44 @@
1
- export const OWNED_UI_SETTINGS_VERSION = 13;
1
+ export const OWNED_UI_SETTINGS_VERSION = 19;
2
2
  const UI_ACCENT_COLOR_CHOICES = Object.freeze([
3
- "purple", "blue", "cyan", "green", "orange", "pink",
3
+ "blue", "purple", "cyan", "green", "orange", "pink",
4
4
  ]);
5
5
  const MAX_ID_LENGTH = 64;
6
6
  const ID_PATTERN = /^[a-z][a-z0-9]*(?:[A-Z][a-z0-9]*)*$/;
7
- /** Declared first so the settings screen opens on it; sections follow first-declaration order. */
8
7
  const GENERIC_SECTION = Object.freeze({ id: "generic", title: "Generic" });
9
8
  const APPEARANCE_SECTION = Object.freeze({ id: "appearance", title: "Appearance" });
10
9
  const SCROLL_SECTION = Object.freeze({ id: "scroll", title: "Scroll" });
11
10
  const AGENT_SECTION = Object.freeze({ id: "agent", title: "Agent" });
12
- /**
13
- * Every A1 setting, keyed by its id. The table is the one declaration: ids, defaults, and allowed
14
- * values are read from it, and `OwnedSettingValueOf` derives each getter's type from it.
15
- */
11
+ const TABS_SECTION = Object.freeze({ id: "tabs", title: "Tab Bar" });
12
+ /** The tab kinds the strip's `+` can offer, in the order it shows them. */
13
+ const PLUS_MENU_KINDS = Object.freeze([
14
+ Object.freeze({ key: "agent", label: "Agent", description: "Add a new Agent tab every time." }),
15
+ Object.freeze({ key: "settings", label: "Settings", description: "Show the one Settings tab." }),
16
+ Object.freeze({ key: "changelog", label: "Changelog", description: "Show the one Changelog tab." }),
17
+ ]);
18
+ /** Every enabled subset of the plus-menu kinds, each in kind order. */
19
+ const PLUS_MENU_VALUES = Object.freeze([
20
+ "", "agent", "settings", "changelog", "agent,settings", "agent,changelog", "settings,changelog", "agent,settings,changelog",
21
+ ]);
16
22
  export const OWNED_SETTING_DECLARATIONS = Object.freeze({
17
23
  updateCheck: Object.freeze({
18
24
  id: "updateCheck",
19
- label: "Update check",
25
+ label: "Update",
20
26
  section: GENERIC_SECTION,
21
- description: "Check once a day at startup whether a newer A1 release exists on this channel and show a notice. Uses the public npm registry; applies on next start.",
27
+ description: "Auto installs verified channel updates silently, Notify shows the current update notice, and No leaves updates manual. Checks use the public npm registry; applies on next start.",
22
28
  application: "restart",
23
- defaultValue: true,
24
- allowedValues: Object.freeze([true, false]),
29
+ defaultValue: "auto",
30
+ allowedValues: Object.freeze(["auto", "notify", "no"]),
31
+ }),
32
+ timeFormat: Object.freeze({
33
+ id: "timeFormat",
34
+ label: "Time format",
35
+ section: GENERIC_SECTION,
36
+ description: "Format used by submitted-prompt timestamps and the resident tab clock.",
37
+ application: "live",
38
+ defaultValue: "8:00 PM",
39
+ allowedValues: Object.freeze([
40
+ "20:00", "8:00 PM",
41
+ ]),
25
42
  }),
26
43
  accentColor: Object.freeze({
27
44
  id: "accentColor",
@@ -29,7 +46,7 @@ export const OWNED_SETTING_DECLARATIONS = Object.freeze({
29
46
  section: APPEARANCE_SECTION,
30
47
  description: "Color used by highlighted interface controls, list markers, and tonal interface surfaces.",
31
48
  application: "live",
32
- defaultValue: "purple",
49
+ defaultValue: "blue",
33
50
  allowedValues: UI_ACCENT_COLOR_CHOICES,
34
51
  }),
35
52
  backgroundStyle: Object.freeze({
@@ -83,11 +100,20 @@ export const OWNED_SETTING_DECLARATIONS = Object.freeze({
83
100
  id: "promptHistoryEnabled",
84
101
  label: "Persistent history",
85
102
  section: Object.freeze({ id: "history", title: "History" }),
86
- description: "Retain reusable prompts across sessions. Applies on next start; disabling does not erase saved history or stop existing instances.",
103
+ description: "Retain reusable prompts after restart. Applies on next start; disabling does not erase saved history or stop existing instances.",
87
104
  application: "restart",
88
105
  defaultValue: true,
89
106
  allowedValues: Object.freeze([true, false]),
90
107
  }),
108
+ promptHistoryScope: Object.freeze({
109
+ id: "promptHistoryScope",
110
+ label: "History scope",
111
+ section: Object.freeze({ id: "history", title: "History" }),
112
+ description: "Unique shows each agent session's history; Shared shows the profile-wide history. Switches running agents without moving or erasing saved prompts.",
113
+ application: "live",
114
+ defaultValue: "unique",
115
+ allowedValues: Object.freeze(["unique", "shared"]),
116
+ }),
91
117
  promptHistoryMaxItems: Object.freeze({
92
118
  id: "promptHistoryMaxItems",
93
119
  label: "History limit",
@@ -124,8 +150,35 @@ export const OWNED_SETTING_DECLARATIONS = Object.freeze({
124
150
  defaultValue: 8,
125
151
  allowedValues: Object.freeze([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]),
126
152
  }),
153
+ tabsPosition: Object.freeze({
154
+ id: "tabsPosition",
155
+ label: "Position",
156
+ section: TABS_SECTION,
157
+ description: "Place the resident tab bar at the top or bottom of the terminal.",
158
+ application: "live",
159
+ defaultValue: "top",
160
+ allowedValues: Object.freeze(["top", "bottom"]),
161
+ }),
162
+ tabBarPlusMenu: Object.freeze({
163
+ id: "tabBarPlusMenu",
164
+ label: "Plus menu",
165
+ section: TABS_SECTION,
166
+ description: "The tabs + offers. With only Agent, + adds an Agent at once; with more, it opens a menu; with none, + is hidden.",
167
+ application: "live",
168
+ defaultValue: "agent",
169
+ allowedValues: PLUS_MENU_VALUES,
170
+ flags: PLUS_MENU_KINDS,
171
+ }),
172
+ tabsAutoName: Object.freeze({
173
+ id: "tabsAutoName",
174
+ label: "Auto name",
175
+ section: TABS_SECTION,
176
+ description: "Automatically name a new tab from its first completed turn with the tab's current model.",
177
+ application: "live",
178
+ defaultValue: true,
179
+ allowedValues: Object.freeze([true, false]),
180
+ }),
127
181
  });
128
- /** The declarations in declaration order, for resolution, persistence, and the settings screen. */
129
182
  export const OWNED_UI_SETTING_DECLARATIONS = Object.freeze(Object.values(OWNED_SETTING_DECLARATIONS));
130
183
  export function isOwnedSettingId(id) {
131
184
  return Object.hasOwn(OWNED_SETTING_DECLARATIONS, id);
@@ -0,0 +1,81 @@
1
+ import type { UiAccentColor } from "../../contracts/owned-ui/index.js";
2
+ type Appearance = "dark" | "light";
3
+ type ColorMode = "truecolor" | "256color";
4
+ /** Global settings only: project resources must remain unavailable until trust is resolved. */
5
+ export declare function readPreTrustAccent(environment?: NodeJS.ProcessEnv): UiAccentColor;
6
+ export declare function preTrustPalette(color: UiAccentColor, appearance: Appearance, mode: ColorMode): {
7
+ accent: string;
8
+ border: string;
9
+ } | {
10
+ accent: string;
11
+ border: string;
12
+ } | {
13
+ accent: string;
14
+ border: string;
15
+ } | {
16
+ accent: string;
17
+ border: string;
18
+ } | {
19
+ accent: string;
20
+ border: string;
21
+ } | {
22
+ accent: string;
23
+ border: string;
24
+ } | {
25
+ accent: string;
26
+ border: string;
27
+ } | {
28
+ accent: string;
29
+ border: string;
30
+ } | {
31
+ accent: string;
32
+ border: string;
33
+ } | {
34
+ accent: string;
35
+ border: string;
36
+ } | {
37
+ accent: string;
38
+ border: string;
39
+ } | {
40
+ accent: string;
41
+ border: string;
42
+ } | {
43
+ accent: string;
44
+ border: string;
45
+ } | {
46
+ accent: string;
47
+ border: string;
48
+ } | {
49
+ accent: string;
50
+ border: string;
51
+ } | {
52
+ accent: string;
53
+ border: string;
54
+ } | {
55
+ accent: string;
56
+ border: string;
57
+ } | {
58
+ accent: string;
59
+ border: string;
60
+ } | {
61
+ accent: string;
62
+ border: string;
63
+ } | {
64
+ accent: string;
65
+ border: string;
66
+ } | {
67
+ accent: string;
68
+ border: string;
69
+ } | {
70
+ accent: string;
71
+ border: string;
72
+ } | {
73
+ accent: string;
74
+ border: string;
75
+ } | {
76
+ accent: string;
77
+ border: string;
78
+ };
79
+ export declare function preTrustTerminalAppearance(environment?: NodeJS.ProcessEnv): Appearance;
80
+ export declare function preTrustTerminalColorMode(environment?: NodeJS.ProcessEnv): ColorMode;
81
+ export {};
@@ -0,0 +1,50 @@
1
+ import { readFileSync, statSync } from "node:fs";
2
+ import { homedir } from "node:os";
3
+ import { isAbsolute, join } from "node:path";
4
+ import { PRODUCT_IDENTITY } from "../../product-identity.js";
5
+ import { SHARED_PROGRESS_PALETTE } from "./progress-palette.generated.js";
6
+ /** Global settings only: project resources must remain unavailable until trust is resolved. */
7
+ export function readPreTrustAccent(environment = process.env) {
8
+ try {
9
+ const home = environment[PRODUCT_IDENTITY.environment.profileHome] ?? homedir();
10
+ if (!isAbsolute(home) || home.includes("\0"))
11
+ return "blue";
12
+ const file = join(home, PRODUCT_IDENTITY.state.piAgentProfile, "settings.json");
13
+ if (statSync(file).size > 256 * 1024)
14
+ return "blue";
15
+ const raw = readFileSync(file, "utf8");
16
+ if (Buffer.byteLength(raw, "utf8") > 256 * 1024)
17
+ return "blue";
18
+ const root = JSON.parse(raw.replace(/^\uFEFF/u, ""));
19
+ if (root === null || typeof root !== "object" || Array.isArray(root))
20
+ return "blue";
21
+ const namespace = root[PRODUCT_IDENTITY.commandName];
22
+ if (namespace === null || typeof namespace !== "object" || Array.isArray(namespace))
23
+ return "blue";
24
+ const value = namespace.accentColor;
25
+ if (value === "default")
26
+ return "purple";
27
+ return typeof value === "string" && Object.hasOwn(SHARED_PROGRESS_PALETTE, value) ? value : "blue";
28
+ }
29
+ catch {
30
+ return "blue";
31
+ }
32
+ }
33
+ export function preTrustPalette(color, appearance, mode) {
34
+ return SHARED_PROGRESS_PALETTE[color][appearance][mode];
35
+ }
36
+ export function preTrustTerminalAppearance(environment = process.env) {
37
+ const index = Number.parseInt((environment.COLORFGBG ?? "").split(";").at(-1) ?? "", 10);
38
+ return Number.isInteger(index) && (index === 7 || index === 15 || index >= 231) ? "light" : "dark";
39
+ }
40
+ export function preTrustTerminalColorMode(environment = process.env) {
41
+ if (environment.PI_TRUE_COLOR === "1")
42
+ return "truecolor";
43
+ if (environment.PI_TRUE_COLOR === "0")
44
+ return "256color";
45
+ const program = (environment.TERM_PROGRAM ?? "").toLowerCase();
46
+ const known = ["kitty", "ghostty", "wezterm", "rex", "warpterminal", "iterm.app", "alacritty", "vscode", "zed"];
47
+ return /^(truecolor|24bit)$/iu.test(environment.COLORTERM ?? "") || (environment.TERM ?? "").endsWith("-direct")
48
+ || process.platform === "win32" || environment.WT_SESSION !== undefined || known.includes(program)
49
+ ? "truecolor" : "256color";
50
+ }
@@ -1,10 +1,12 @@
1
1
  export { OWNED_SETTING_DECLARATIONS, OWNED_UI_SETTINGS_VERSION, OWNED_UI_SETTING_DECLARATIONS, assertOwnedUiSettingDeclarations, findOwnedUiSettingDeclaration, isOwnedSettingId, } from "./declarations.js";
2
2
  export type { OwnedSettingId, OwnedSettingValueOf, OwnedUiSettingApplication, OwnedUiSettingDeclaration, OwnedUiSettingValue } from "./declarations.js";
3
- export { OWNED_UI_SETTINGS_MIGRATIONS, assertOwnedUiSettingsMigrations, migrationsFrom } from "./migrations.js";
4
- export type { OwnedUiSettingsMigration } from "./migrations.js";
3
+ export { OWNED_UI_SETTINGS_MIGRATIONS, assertOwnedUiSettingsMigrations, migrationsFrom, normalizeOwnedUiSettingsValues, } from "./migrations.js";
4
+ export type { OwnedUiSettingsCompatibilityResult, OwnedUiSettingsMigration } from "./migrations.js";
5
5
  export { documentFrom, parseOwnedUiSettingsDocument, resolveOwnedUiSettings, settingValue } from "./resolution.js";
6
6
  export type { OwnedUiResolvedSetting, OwnedUiSettingSource, OwnedUiSettingsDocument, OwnedUiSettingsNotice, OwnedUiSettingsNoticeCode, OwnedUiSettingsResolution, ResolveOwnedUiSettingsInput, } from "./resolution.js";
7
7
  export { AGENT_SECTION_ID, buildOwnedUiSettingsSections, findOwnedUiSettingsEntry } from "./sections.js";
8
8
  export type { AgentSettingsSnapshot, BuildOwnedUiSettingsSectionsInput, OwnedUiSettingsBackend, OwnedUiSettingsEntry, OwnedUiSettingsSection, } from "./sections.js";
9
9
  export { OwnedSettingsManager } from "./manager.js";
10
10
  export type { OwnedSettingsManagerOptions, OwnedUiSettingsChangeOutcome, OwnedUiSettingsListener } from "./manager.js";
11
+ export { assertProfileSettingsNamespaceAvailable, readProfileSettingsNamespace, repairProfileSettingsDocument, updateProfileSettingsNamespace, } from "./profile-document.js";
12
+ export type { ProfileSettingsNamespaceRead, ProfileSettingsNamespaceUpdate } from "./profile-document.js";
@@ -1,5 +1,6 @@
1
1
  export { OWNED_SETTING_DECLARATIONS, OWNED_UI_SETTINGS_VERSION, OWNED_UI_SETTING_DECLARATIONS, assertOwnedUiSettingDeclarations, findOwnedUiSettingDeclaration, isOwnedSettingId, } from "./declarations.js";
2
- export { OWNED_UI_SETTINGS_MIGRATIONS, assertOwnedUiSettingsMigrations, migrationsFrom } from "./migrations.js";
2
+ export { OWNED_UI_SETTINGS_MIGRATIONS, assertOwnedUiSettingsMigrations, migrationsFrom, normalizeOwnedUiSettingsValues, } from "./migrations.js";
3
3
  export { documentFrom, parseOwnedUiSettingsDocument, resolveOwnedUiSettings, settingValue } from "./resolution.js";
4
4
  export { AGENT_SECTION_ID, buildOwnedUiSettingsSections, findOwnedUiSettingsEntry } from "./sections.js";
5
5
  export { OwnedSettingsManager } from "./manager.js";
6
+ export { assertProfileSettingsNamespaceAvailable, readProfileSettingsNamespace, repairProfileSettingsDocument, updateProfileSettingsNamespace, } from "./profile-document.js";
@@ -4,13 +4,20 @@ import { type OwnedUiSettingsMigration } from "./migrations.js";
4
4
  import { type OwnedUiSettingsResolution } from "./resolution.js";
5
5
  import { type OwnedUiSettingsBackend, type OwnedUiSettingsSection } from "./sections.js";
6
6
  export interface OwnedSettingsManagerOptions {
7
- /** A1 configuration root. Settings live under `<configDir>/settings/`. */
8
- readonly configDir: string;
7
+ /** Selected global agent profile containing the shared `settings.json`. */
8
+ readonly profileDir?: string;
9
+ /** Compatibility alias for SDK/tests that supplied the former root option. */
10
+ readonly configDir?: string;
9
11
  readonly profileId: string;
12
+ /** Product namespace; defaults to profileId for generic and hermetic consumers. */
13
+ readonly namespace?: string;
14
+ /** Former product configuration root, consulted only while the namespace is absent. */
15
+ readonly legacyConfigDir?: string;
10
16
  readonly declarations?: readonly OwnedUiSettingDeclaration[];
11
17
  readonly migrations?: readonly OwnedUiSettingsMigration[];
12
18
  readonly agent?: AgentSettingsPort | null;
13
19
  readonly agentProvider?: () => AgentSettingsPort | null;
20
+ readonly hiddenOwnedSettingIds?: readonly string[];
14
21
  readonly hiddenAgentSettingIds?: readonly string[];
15
22
  readonly agentSettingLabelOverrides?: Readonly<Record<string, string>>;
16
23
  }
@@ -37,9 +44,15 @@ export declare class OwnedSettingsManager {
37
44
  constructor(options: OwnedSettingsManagerOptions);
38
45
  get file(): string;
39
46
  get resolution(): OwnedUiSettingsResolution;
40
- /** Reads and resolves the stored document. Never throws: every failure becomes a notice. */
47
+ /** Reads and resolves the product namespace. Never throws: every failure becomes a notice. */
41
48
  read(): OwnedUiSettingsResolution;
42
49
  load(): Promise<void>;
50
+ /**
51
+ * Adopts values another process stored in the shared document. Notifies only when a
52
+ * resolved value differs, so a peer's own write echo stays silent. Restart-bound values
53
+ * keep their session-start effect and surface as pending instead.
54
+ */
55
+ refresh(): boolean;
43
56
  sections(): readonly OwnedUiSettingsSection[];
44
57
  /**
45
58
  * The value in effect for a declared setting, typed by its declaration. A restart-bound
@@ -1,10 +1,11 @@
1
- import { mkdirSync, readFileSync, renameSync, rmSync, writeFileSync } from "node:fs";
1
+ import { readFileSync } from "node:fs";
2
2
  import path from "node:path";
3
3
  import { assertAgentSettingDescriptor } from "../../contracts/agent-engine/index.js";
4
4
  import { OWNED_SETTING_DECLARATIONS, OWNED_UI_SETTINGS_VERSION, OWNED_UI_SETTING_DECLARATIONS, } from "./declarations.js";
5
- import { OWNED_UI_SETTINGS_MIGRATIONS } from "./migrations.js";
6
- import { documentFrom, parseOwnedUiSettingsDocument, resolveOwnedUiSettings, } from "./resolution.js";
5
+ import { OWNED_UI_SETTINGS_MIGRATIONS, normalizeOwnedUiSettingsValues, } from "./migrations.js";
6
+ import { parseOwnedUiSettingsDocument, resolveOwnedUiSettings, } from "./resolution.js";
7
7
  import { buildOwnedUiSettingsSections, findOwnedUiSettingsEntry, } from "./sections.js";
8
+ import { readProfileSettingsNamespace, repairProfileSettingsDocument, updateProfileSettingsNamespace, } from "./profile-document.js";
8
9
  const PROFILE_ID_PATTERN = /^[a-z][a-z0-9-]{0,63}$/;
9
10
  const MAX_DOCUMENT_BYTES = 256 * 1024;
10
11
  /**
@@ -15,11 +16,14 @@ const MAX_DOCUMENT_BYTES = 256 * 1024;
15
16
  */
16
17
  export class OwnedSettingsManager {
17
18
  #file;
19
+ #legacyFile;
20
+ #namespace;
18
21
  #declarations;
19
22
  #migrations;
20
23
  #agent;
21
24
  #agentProvider;
22
25
  #listeners = new Set();
26
+ #hiddenOwnedSettingIds;
23
27
  #hiddenAgentSettingIds;
24
28
  #agentSettingLabelOverrides;
25
29
  #resolution;
@@ -30,11 +34,19 @@ export class OwnedSettingsManager {
30
34
  if (!PROFILE_ID_PATTERN.test(options.profileId)) {
31
35
  throw new Error(`owned UI settings profile id is not a bounded slug: ${options.profileId}`);
32
36
  }
33
- this.#file = path.join(path.resolve(options.configDir), "settings", `${options.profileId}.json`);
37
+ const profileDir = options.profileDir ?? options.configDir;
38
+ if (profileDir === undefined)
39
+ throw new Error("owned UI settings require a profile directory");
40
+ this.#file = path.join(path.resolve(profileDir), "settings.json");
41
+ this.#legacyFile = options.legacyConfigDir === undefined
42
+ ? null
43
+ : path.join(path.resolve(options.legacyConfigDir), "settings", `${options.profileId}.json`);
44
+ this.#namespace = options.namespace ?? options.profileId;
34
45
  this.#declarations = options.declarations ?? OWNED_UI_SETTING_DECLARATIONS;
35
46
  this.#migrations = options.migrations ?? OWNED_UI_SETTINGS_MIGRATIONS;
36
47
  this.#agent = options.agent ?? null;
37
48
  this.#agentProvider = options.agentProvider ?? null;
49
+ this.#hiddenOwnedSettingIds = new Set(options.hiddenOwnedSettingIds ?? []);
38
50
  this.#hiddenAgentSettingIds = new Set(options.hiddenAgentSettingIds ?? []);
39
51
  this.#agentSettingLabelOverrides = { ...(options.agentSettingLabelOverrides ?? {}) };
40
52
  this.#resolution = this.read();
@@ -49,24 +61,59 @@ export class OwnedSettingsManager {
49
61
  get resolution() {
50
62
  return this.#resolution;
51
63
  }
52
- /** Reads and resolves the stored document. Never throws: every failure becomes a notice. */
64
+ /** Reads and resolves the product namespace. Never throws: every failure becomes a notice. */
53
65
  read() {
66
+ try {
67
+ repairProfileSettingsDocument(this.#file);
68
+ }
69
+ catch {
70
+ // Compatibility: recovery is opportunistic; unreadable-document handling stays authoritative.
71
+ }
72
+ const shared = readProfileSettingsNamespace(this.#file, this.#namespace);
73
+ if (shared.status === "available") {
74
+ if (Buffer.byteLength(JSON.stringify(shared.value), "utf8") > MAX_DOCUMENT_BYTES) {
75
+ return this.#resolveNamespace(null, `${this.#file} contains a ${this.#namespace} namespace exceeding the ${MAX_DOCUMENT_BYTES}-byte settings limit`);
76
+ }
77
+ return this.#resolveCompatibleNamespace(shared.value);
78
+ }
79
+ if (shared.status === "invalid")
80
+ return this.#resolveNamespace(null, shared.detail);
81
+ return this.#readLegacy();
82
+ }
83
+ #resolveCompatibleNamespace(values) {
84
+ const compatibility = normalizeOwnedUiSettingsValues(values);
85
+ return compatibility.values === null
86
+ ? this.#resolveNamespace(null, compatibility.failure ?? "product settings compatibility failed")
87
+ : this.#resolveNamespace(compatibility.values);
88
+ }
89
+ #resolveNamespace(values, unreadableDetail) {
90
+ return resolveOwnedUiSettings({
91
+ declarations: this.#declarations,
92
+ migrations: [],
93
+ document: values === null ? null : { version: OWNED_UI_SETTINGS_VERSION, values },
94
+ ...(unreadableDetail === undefined ? {} : { unreadableDetail }),
95
+ currentVersion: OWNED_UI_SETTINGS_VERSION,
96
+ });
97
+ }
98
+ #readLegacy() {
99
+ if (this.#legacyFile === null)
100
+ return this.#resolveNamespace(null);
54
101
  let raw = null;
55
102
  let unreadable = null;
56
103
  try {
57
- raw = readFileSync(this.#file, "utf8");
104
+ raw = readFileSync(this.#legacyFile, "utf8");
58
105
  }
59
106
  catch (error) {
60
107
  if (!isMissing(error))
61
- unreadable = `${this.#file} could not be read: ${describe(error)}`;
108
+ unreadable = `${this.#legacyFile} could not be read: ${describe(error)}`;
62
109
  }
63
110
  if (raw !== null && Buffer.byteLength(raw, "utf8") > MAX_DOCUMENT_BYTES) {
64
- unreadable = `${this.#file} exceeds the ${MAX_DOCUMENT_BYTES}-byte settings limit and was ignored`;
111
+ unreadable = `${this.#legacyFile} exceeds the ${MAX_DOCUMENT_BYTES}-byte settings limit and was ignored`;
65
112
  raw = null;
66
113
  }
67
114
  const document = raw === null ? null : parseOwnedUiSettingsDocument(raw);
68
115
  if (raw !== null && document === null && unreadable === null) {
69
- unreadable = `${this.#file} is not a valid settings document and was ignored`;
116
+ unreadable = `${this.#legacyFile} is not a valid settings document and was ignored`;
70
117
  }
71
118
  return resolveOwnedUiSettings({
72
119
  declarations: this.#declarations,
@@ -82,8 +129,36 @@ export class OwnedSettingsManager {
82
129
  this.#agentSnapshot = agent === null ? null : await snapshotOf(agent, this.#hiddenAgentSettingIds);
83
130
  this.#notify();
84
131
  }
132
+ /**
133
+ * Adopts values another process stored in the shared document. Notifies only when a
134
+ * resolved value differs, so a peer's own write echo stays silent. Restart-bound values
135
+ * keep their session-start effect and surface as pending instead.
136
+ */
137
+ refresh() {
138
+ const next = this.read();
139
+ if (resolvedValuesKey(next) === resolvedValuesKey(this.#resolution))
140
+ return false;
141
+ this.#resolution = next;
142
+ for (const setting of next.settings) {
143
+ const id = setting.declaration.id;
144
+ if (!this.#restartEffective.has(id))
145
+ continue;
146
+ if (setting.value === this.#restartEffective.get(id))
147
+ this.#pending.delete(id);
148
+ else
149
+ this.#pending.set(id, setting.value);
150
+ }
151
+ this.#notify();
152
+ return true;
153
+ }
85
154
  sections() {
86
- return buildOwnedUiSettingsSections({ resolution: this.#resolution, agent: this.#agentSnapshot }).map(section => ({
155
+ const resolution = this.#hiddenOwnedSettingIds.size === 0
156
+ ? this.#resolution
157
+ : {
158
+ ...this.#resolution,
159
+ settings: this.#resolution.settings.filter(setting => !this.#hiddenOwnedSettingIds.has(setting.declaration.id)),
160
+ };
161
+ return buildOwnedUiSettingsSections({ resolution, agent: this.#agentSnapshot }).map(section => ({
87
162
  ...section,
88
163
  entries: section.entries.map(entry => {
89
164
  if (entry.backend === "a1" && this.#restartEffective.has(entry.id)) {
@@ -113,9 +188,13 @@ export class OwnedSettingsManager {
113
188
  return () => this.#listeners.delete(listener);
114
189
  }
115
190
  async changeStructured(backend, id, value) {
116
- if (backend !== "agent")
117
- return failed("only an agent setting holds a structured value");
118
- return await this.#changeAgentValue(id, value);
191
+ if (backend === "agent")
192
+ return await this.#changeAgentValue(id, value);
193
+ // Invariant: a flagged A1 setting stores its enabled parts as one value, in declaration order.
194
+ const flags = findOwnedUiSettingsEntry(this.sections(), id, "a1")?.flags ?? [];
195
+ if (flags.length === 0)
196
+ return failed(`${id} holds no structured value`);
197
+ return await this.change("a1", id, flags.filter(flag => value[flag.key] === true).map(flag => flag.key).join(","));
119
198
  }
120
199
  async change(backend, id, value) {
121
200
  const entry = findOwnedUiSettingsEntry(this.sections(), id, backend);
@@ -126,7 +205,7 @@ export class OwnedSettingsManager {
126
205
  return backend === "a1" ? this.#changeOwned(id, value) : await this.#changeAgentValue(id, value);
127
206
  }
128
207
  #changeOwned(id, value) {
129
- const outcome = this.#write(this.#resolution, id, value);
208
+ const outcome = this.#write(id, value);
130
209
  if (!outcome.stored)
131
210
  return failed(outcome.failure ?? `${id} could not be stored`);
132
211
  const previous = this.#resolution;
@@ -141,35 +220,34 @@ export class OwnedSettingsManager {
141
220
  this.#notify();
142
221
  return changed("applied", "live", value, value);
143
222
  }
144
- // Invariant: the resolved form is written with `id` set to `value` and undeclared keys preserved.
145
- // Concurrency: a temporary sibling is renamed over the target, so an interrupted write leaves
146
- // either the complete previous document or the complete new one.
147
- #write(resolution, id, value) {
223
+ // Invariant: only non-default declared values and unknown product properties are stored.
224
+ // Concurrency: the namespace updater rereads current JSON while holding Pi's compatible lock.
225
+ #write(id, value) {
148
226
  const declaration = this.#declarations.find(candidate => candidate.id === id);
149
227
  if (!declaration)
150
228
  return { stored: false, failure: `unknown owned UI setting: ${id}` };
151
229
  if (!declaration.allowedValues.includes(value)) {
152
230
  return { stored: false, failure: `value ${JSON.stringify(value)} is not allowed for ${id}` };
153
231
  }
154
- const current = documentFrom(resolution);
155
- const next = {
156
- version: OWNED_UI_SETTINGS_VERSION,
157
- values: { ...current.values, [id]: value },
158
- };
159
- const temporary = `${this.#file}.${process.pid}.tmp`;
160
232
  try {
161
- mkdirSync(path.dirname(this.#file), { recursive: true, mode: 0o700 });
162
- writeFileSync(temporary, `${JSON.stringify(next, null, 2)}\n`, { encoding: "utf8", mode: 0o600 });
163
- renameSync(temporary, this.#file);
233
+ updateProfileSettingsNamespace(this.#file, this.#namespace, current => {
234
+ let latest = this.#readLegacy();
235
+ if (current !== null) {
236
+ const compatibility = normalizeOwnedUiSettingsValues(current);
237
+ if (compatibility.values === null)
238
+ throw new Error(compatibility.failure ?? "product settings compatibility failed");
239
+ latest = this.#resolveNamespace(compatibility.values);
240
+ }
241
+ const next = compactValues(latest);
242
+ if (value === declaration.defaultValue)
243
+ delete next[id];
244
+ else
245
+ next[id] = value;
246
+ return Object.keys(next).length === 0 ? null : next;
247
+ });
164
248
  return { stored: true, failure: null };
165
249
  }
166
250
  catch (error) {
167
- try {
168
- rmSync(temporary, { force: true });
169
- }
170
- catch {
171
- // Security: a leftover temporary file is inert: read() only ever opens the target path.
172
- }
173
251
  return { stored: false, failure: `${this.#file} could not be written: ${describe(error)}` };
174
252
  }
175
253
  }
@@ -218,6 +296,9 @@ async function snapshotOf(agent, hidden) {
218
296
  return { descriptors: [], writeAdvertised: false, failure: describe(error) };
219
297
  }
220
298
  }
299
+ function resolvedValuesKey(resolution) {
300
+ return JSON.stringify(resolution.settings.map(setting => [setting.declaration.id, setting.value]));
301
+ }
221
302
  function failed(failure) {
222
303
  return {
223
304
  status: "failed",
@@ -254,6 +335,14 @@ function fromAgentOutcome(result) {
254
335
  failure: result.failure,
255
336
  };
256
337
  }
338
+ function compactValues(resolution) {
339
+ const values = { ...resolution.preserved };
340
+ for (const setting of resolution.settings) {
341
+ if (setting.value !== setting.declaration.defaultValue)
342
+ values[setting.declaration.id] = setting.value;
343
+ }
344
+ return values;
345
+ }
257
346
  function isMissing(error) {
258
347
  return typeof error === "object" && error !== null && error.code === "ENOENT";
259
348
  }
@@ -9,5 +9,11 @@ export interface OwnedUiSettingsMigration {
9
9
  * is the first stored shape.
10
10
  */
11
11
  export declare const OWNED_UI_SETTINGS_MIGRATIONS: readonly OwnedUiSettingsMigration[];
12
+ export interface OwnedUiSettingsCompatibilityResult {
13
+ readonly values: Readonly<Record<string, unknown>> | null;
14
+ readonly failure: string | null;
15
+ }
16
+ /** Shape-selected compatibility for the metadata-free product object. */
17
+ export declare function normalizeOwnedUiSettingsValues(source: Readonly<Record<string, unknown>>): OwnedUiSettingsCompatibilityResult;
12
18
  export declare function assertOwnedUiSettingsMigrations(migrations: readonly OwnedUiSettingsMigration[], currentVersion?: number): void;
13
19
  export declare function migrationsFrom(migrations: readonly OwnedUiSettingsMigration[], storedVersion: number): readonly OwnedUiSettingsMigration[];