@timurproko/a1 0.2.6 → 0.2.7-dev.1222

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 (419) 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 +197 -908
  37. package/dist/app/session-shell/session-shell.d.ts +3 -8
  38. package/dist/app/session-shell/session-shell.js +327 -835
  39. package/dist/app/session-shell/session-viewport-controller.d.ts +2 -1
  40. package/dist/app/session-shell/session-viewport-controller.js +41 -38
  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 +105 -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 +207 -153
  70. package/dist/composition/reference-selection-options.d.ts +3 -0
  71. package/dist/composition/reference-selection-options.js +16 -0
  72. package/dist/composition/resident-tab-bridge.d.ts +25 -0
  73. package/dist/composition/resident-tab-bridge.js +180 -0
  74. package/dist/composition/session-backend.d.ts +19 -0
  75. package/dist/composition/session-backend.js +1 -0
  76. package/dist/composition/session-runtime-registry.d.ts +20 -0
  77. package/dist/composition/session-runtime-registry.js +85 -0
  78. package/dist/composition/settings-route-host.d.ts +16 -2
  79. package/dist/composition/settings-route-host.js +42 -17
  80. package/dist/composition/settings-search-input.d.ts +9 -0
  81. package/dist/composition/settings-search-input.js +61 -0
  82. package/dist/composition/startup-route.d.ts +32 -0
  83. package/dist/composition/startup-route.js +72 -0
  84. package/dist/composition/utility-tab.d.ts +28 -0
  85. package/dist/composition/utility-tab.js +244 -0
  86. package/dist/contracts/owned-ui/index.d.ts +1 -1
  87. package/dist/contracts/owned-ui/model.d.ts +3 -0
  88. package/dist/contracts/owned-ui/session-backend.d.ts +3 -0
  89. package/dist/contracts/owned-ui/session-workflows.d.ts +11 -4
  90. package/dist/contracts/presentation/index.d.ts +11 -0
  91. package/dist/contracts/presentation/index.js +12 -0
  92. package/dist/features/launch/development-launch.js +6 -0
  93. package/dist/features/launch/index.d.ts +1 -1
  94. package/dist/features/launch/intent.d.ts +3 -1
  95. package/dist/features/launch/intent.js +7 -4
  96. package/dist/features/launch/profile-paths.js +4 -0
  97. package/dist/features/owned-ui/plus-menu-dialog.d.ts +22 -0
  98. package/dist/features/owned-ui/plus-menu-dialog.js +84 -0
  99. package/dist/features/owned-ui/project-trust-dialog.d.ts +1 -1
  100. package/dist/features/owned-ui/project-trust-dialog.js +6 -8
  101. package/dist/features/owned-ui/project-trust-prompt.d.ts +1 -0
  102. package/dist/features/owned-ui/project-trust-prompt.js +7 -3
  103. package/dist/features/owned-ui/reference-document-selection.d.ts +30 -0
  104. package/dist/features/owned-ui/reference-document-selection.js +179 -0
  105. package/dist/features/owned-ui/reference-screen-app.d.ts +6 -1
  106. package/dist/features/owned-ui/reference-screen-app.js +51 -10
  107. package/dist/features/owned-ui/settings-app.d.ts +13 -2
  108. package/dist/features/owned-ui/settings-app.js +136 -97
  109. package/dist/features/owned-ui/settings-search-input.d.ts +29 -0
  110. package/dist/features/owned-ui/settings-search-input.js +1 -0
  111. package/dist/features/prompt-history/index.d.ts +1 -1
  112. package/dist/features/prompt-history/paths.d.ts +2 -1
  113. package/dist/features/prompt-history/paths.js +10 -2
  114. package/dist/features/prompt-history/service.d.ts +5 -0
  115. package/dist/features/prompt-history/service.js +1 -1
  116. package/dist/features/resident-tab/auto-name.d.ts +11 -0
  117. package/dist/features/resident-tab/auto-name.js +44 -0
  118. package/dist/features/resident-tab/index.d.ts +5 -0
  119. package/dist/features/resident-tab/index.js +7 -0
  120. package/dist/features/resident-tab/shortcut-bindings-file.d.ts +8 -0
  121. package/dist/features/resident-tab/shortcut-bindings-file.js +40 -0
  122. package/dist/features/resident-tab/shortcut-declarations.d.ts +13 -0
  123. package/dist/features/resident-tab/shortcut-declarations.js +26 -0
  124. package/dist/features/resident-tab/shortcut-projection.d.ts +29 -0
  125. package/dist/features/resident-tab/shortcut-projection.js +64 -0
  126. package/dist/features/resident-tab/status-deriver.d.ts +10 -0
  127. package/dist/features/resident-tab/status-deriver.js +12 -0
  128. package/dist/foundation/launch-context/index.d.ts +12 -0
  129. package/dist/foundation/launch-context/index.js +26 -0
  130. package/dist/foundation/launch-guardian/exit-watcher.d.ts +14 -0
  131. package/dist/foundation/launch-guardian/exit-watcher.js +94 -0
  132. package/dist/foundation/launch-guardian/main.d.ts +7 -1
  133. package/dist/foundation/launch-guardian/main.js +60 -7
  134. package/dist/foundation/lifecycle/session-repository-context.js +16 -2
  135. package/dist/foundation/process-containment/{native-guardian-containment.d.ts → addon-containment.d.ts} +7 -5
  136. package/dist/foundation/process-containment/addon-containment.js +139 -0
  137. package/dist/foundation/process-containment/addon-process-inspector.d.ts +11 -0
  138. package/dist/foundation/process-containment/addon-process-inspector.js +36 -0
  139. package/dist/foundation/process-containment/addon.d.ts +42 -0
  140. package/dist/foundation/process-containment/addon.js +57 -0
  141. package/dist/foundation/process-containment/artifact.d.ts +1 -1
  142. package/dist/foundation/process-containment/artifact.js +6 -5
  143. package/dist/foundation/process-containment/contracts.d.ts +2 -0
  144. package/dist/foundation/process-containment/index.d.ts +4 -4
  145. package/dist/foundation/process-containment/index.js +3 -3
  146. package/dist/foundation/process-containment/native-process-inspector.d.ts +2 -1
  147. package/dist/foundation/process-containment/native-process-inspector.js +10 -10
  148. package/dist/foundation/release/automatic-update.d.ts +37 -0
  149. package/dist/foundation/release/automatic-update.js +265 -0
  150. package/dist/foundation/release/bootstrap.d.ts +7 -9
  151. package/dist/foundation/release/bootstrap.js +107 -24
  152. package/dist/foundation/release/cohort-state.d.ts +1 -1
  153. package/dist/foundation/release/cohort-state.js +1 -1
  154. package/dist/foundation/release/dependency-certification.js +54 -19
  155. package/dist/foundation/release/early-accent.d.ts +12 -0
  156. package/dist/foundation/release/early-accent.js +59 -0
  157. package/dist/foundation/release/index.d.ts +2 -2
  158. package/dist/foundation/release/index.js +2 -2
  159. package/dist/foundation/release/latest-release.d.ts +24 -2
  160. package/dist/foundation/release/latest-release.js +51 -1
  161. package/dist/foundation/release/progress-palette.generated.d.ts +137 -3
  162. package/dist/foundation/release/progress-palette.generated.js +137 -3
  163. package/dist/foundation/release/release-gc.d.ts +3 -0
  164. package/dist/foundation/release/release-gc.js +59 -8
  165. package/dist/foundation/release/release-store.d.ts +12 -0
  166. package/dist/foundation/release/release-store.js +124 -2
  167. package/dist/foundation/release/update-execution-lease.d.ts +48 -0
  168. package/dist/foundation/release/update-execution-lease.js +161 -0
  169. package/dist/foundation/release/update.d.ts +12 -7
  170. package/dist/foundation/release/update.js +281 -196
  171. package/dist/foundation/resident-tabs/bounded-host-command.d.ts +18 -0
  172. package/dist/foundation/resident-tabs/bounded-host-command.js +39 -0
  173. package/dist/foundation/resident-tabs/bridge-client.d.ts +70 -0
  174. package/dist/foundation/resident-tabs/bridge-client.js +321 -0
  175. package/dist/foundation/resident-tabs/doctor.d.ts +28 -0
  176. package/dist/foundation/resident-tabs/doctor.js +166 -0
  177. package/dist/foundation/resident-tabs/draft-checkpoint.d.ts +27 -0
  178. package/dist/foundation/resident-tabs/draft-checkpoint.js +145 -0
  179. package/dist/foundation/resident-tabs/ensure-terminal-host.d.ts +36 -0
  180. package/dist/foundation/resident-tabs/ensure-terminal-host.js +151 -0
  181. package/dist/foundation/resident-tabs/fault-injection.d.ts +8 -0
  182. package/dist/foundation/resident-tabs/fault-injection.js +26 -0
  183. package/dist/foundation/resident-tabs/fixture-control.d.ts +7 -0
  184. package/dist/foundation/resident-tabs/fixture-control.js +35 -0
  185. package/dist/foundation/resident-tabs/host-entry.d.ts +1 -0
  186. package/dist/foundation/resident-tabs/host-entry.js +17 -0
  187. package/dist/foundation/resident-tabs/index.d.ts +12 -0
  188. package/dist/foundation/resident-tabs/index.js +6 -0
  189. package/dist/foundation/resident-tabs/maintenance.d.ts +39 -0
  190. package/dist/foundation/resident-tabs/maintenance.js +75 -0
  191. package/dist/foundation/resident-tabs/progress-observation-schema.d.ts +34 -0
  192. package/dist/foundation/resident-tabs/progress-observation-schema.js +1 -0
  193. package/dist/foundation/resident-tabs/progress-observation.d.ts +4 -0
  194. package/dist/foundation/resident-tabs/progress-observation.js +150 -0
  195. package/dist/foundation/resident-tabs/prompt-journal.d.ts +63 -0
  196. package/dist/foundation/resident-tabs/prompt-journal.js +213 -0
  197. package/dist/foundation/resident-tabs/protocol.d.ts +12 -0
  198. package/dist/foundation/resident-tabs/protocol.js +195 -0
  199. package/dist/foundation/resident-tabs/recovery.d.ts +26 -0
  200. package/dist/foundation/resident-tabs/recovery.js +205 -0
  201. package/dist/foundation/resident-tabs/release-holds.d.ts +28 -0
  202. package/dist/foundation/resident-tabs/release-holds.js +75 -0
  203. package/dist/foundation/resident-tabs/routes.d.ts +5 -0
  204. package/dist/foundation/resident-tabs/routes.js +5 -0
  205. package/dist/foundation/resident-tabs/routing.d.ts +11 -0
  206. package/dist/foundation/resident-tabs/routing.js +10 -0
  207. package/dist/foundation/resident-tabs/session-sync.d.ts +14 -0
  208. package/dist/foundation/resident-tabs/session-sync.js +37 -0
  209. package/dist/foundation/resident-tabs/settings.d.ts +12 -0
  210. package/dist/foundation/resident-tabs/settings.js +58 -0
  211. package/dist/foundation/resident-tabs/terminal-host-artifact.d.ts +14 -0
  212. package/dist/foundation/resident-tabs/terminal-host-artifact.js +78 -0
  213. package/dist/foundation/resident-tabs/zip-archive.d.ts +9 -0
  214. package/dist/foundation/resident-tabs/zip-archive.js +56 -0
  215. package/dist/foundation/session-writer-lock/index.d.ts +30 -0
  216. package/dist/foundation/session-writer-lock/index.js +203 -0
  217. package/dist/foundation/startup/startup-descriptor.js +2 -2
  218. package/dist/foundation/terminal-cleanup/index.d.ts +1 -1
  219. package/dist/foundation/terminal-cleanup/index.js +1 -1
  220. package/dist/foundation/terminal-cleanup/terminal-reset.d.ts +6 -0
  221. package/dist/foundation/terminal-cleanup/terminal-reset.js +6 -0
  222. package/dist/integrations/pi/components/editor-interaction.d.ts +2 -0
  223. package/dist/integrations/pi/components/modal-frame.d.ts +17 -1
  224. package/dist/integrations/pi/components/modal-frame.js +48 -9
  225. package/dist/integrations/pi/components/models-dialog.js +4 -52
  226. package/dist/integrations/pi/components/owned-editor-ux.d.ts +6 -1
  227. package/dist/integrations/pi/components/owned-editor-ux.js +138 -11
  228. package/dist/integrations/pi/components/resources/builtin-themes.d.ts +4 -4
  229. package/dist/integrations/pi/components/resources/builtin-themes.js +4 -4
  230. package/dist/integrations/pi/components/share-operation-dialog.d.ts +2 -0
  231. package/dist/integrations/pi/components/share-operation-dialog.js +2 -1
  232. package/dist/integrations/pi/components/shell-editor-autocomplete.js +58 -36
  233. package/dist/integrations/pi/components/shell-extension-ui.js +79 -60
  234. package/dist/integrations/pi/components/shell-footer-status.d.ts +1 -1
  235. package/dist/integrations/pi/components/shell-footer-status.js +21 -5
  236. package/dist/integrations/pi/components/shell-hotkey-sections.js +1 -1
  237. package/dist/integrations/pi/components/shell-presenters-info.d.ts +5 -2
  238. package/dist/integrations/pi/components/shell-presenters-info.js +18 -4
  239. package/dist/integrations/pi/components/shell-presenters-transcript.js +4 -1
  240. package/dist/integrations/pi/components/shell-selectors-dialogs.js +5 -1
  241. package/dist/integrations/pi/components/shell-shared-facade.d.ts +12 -1
  242. package/dist/integrations/pi/components/skills-dialog.js +2 -2
  243. package/dist/integrations/pi/components/upstream/adjacent/core/keybindings.d.ts +1 -1
  244. package/dist/integrations/pi/components/upstream/adjacent/core/keybindings.js +17 -4
  245. package/dist/integrations/pi/components/upstream/assets/earendil-image.json +2 -2
  246. package/dist/integrations/pi/components/upstream/components/countdown-timer.d.ts +1 -1
  247. package/dist/integrations/pi/components/upstream/components/earendil-announcement.js +1 -1
  248. package/dist/integrations/pi/components/upstream/components/extension-editor.d.ts +1 -1
  249. package/dist/integrations/pi/components/upstream/components/extension-editor.js +1 -1
  250. package/dist/integrations/pi/components/upstream/components/extension-input.js +1 -1
  251. package/dist/integrations/pi/components/upstream/components/extension-selector.js +1 -1
  252. package/dist/integrations/pi/components/upstream/components/mermaid.js +1 -1
  253. package/dist/integrations/pi/components/upstream/components/owned-editor.d.ts +8 -6
  254. package/dist/integrations/pi/components/upstream/components/owned-editor.js +16 -9
  255. package/dist/integrations/pi/components/upstream/components/pi-logo.js +1 -1
  256. package/dist/integrations/pi/components/upstream/components/scoped-models-selector.d.ts +4 -4
  257. package/dist/integrations/pi/components/upstream/components/scoped-models-selector.js +2 -2
  258. package/dist/integrations/pi/components/upstream/components/session-footer.d.ts +2 -1
  259. package/dist/integrations/pi/components/upstream/components/session-footer.js +31 -25
  260. package/dist/integrations/pi/components/upstream/components/session-selector-search.js +1 -1
  261. package/dist/integrations/pi/components/upstream/components/session-selector.js +8 -7
  262. package/dist/integrations/pi/components/upstream/components/skill-invocation-message.d.ts +1 -1
  263. package/dist/integrations/pi/components/upstream/components/skill-invocation-message.js +1 -1
  264. package/dist/integrations/pi/components/upstream/components/status-indicator.d.ts +2 -2
  265. package/dist/integrations/pi/components/upstream/components/status-indicator.js +3 -3
  266. package/dist/integrations/pi/components/upstream/components/themed-text.d.ts +1 -1
  267. package/dist/integrations/pi/components/upstream/components/themed-text.js +1 -1
  268. package/dist/integrations/pi/components/upstream/components/thinking-selector.d.ts +8 -7
  269. package/dist/integrations/pi/components/upstream/components/thinking-selector.js +10 -9
  270. package/dist/integrations/pi/components/upstream/components/tool-execution.d.ts +2 -6
  271. package/dist/integrations/pi/components/upstream/components/tool-execution.js +103 -101
  272. package/dist/integrations/pi/components/upstream/components/tree-selector.d.ts +9 -9
  273. package/dist/integrations/pi/components/upstream/components/tree-selector.js +13 -21
  274. package/dist/integrations/pi/components/upstream/components/trust-selector.js +1 -1
  275. package/dist/integrations/pi/components/upstream/external-editor.js +1 -1
  276. package/dist/integrations/pi/components/upstream/history/editor-core.d.ts +2 -2
  277. package/dist/integrations/pi/components/upstream/history/editor-core.js +7 -5
  278. package/dist/integrations/pi/components/upstream/history/kill-ring.d.ts +1 -1
  279. package/dist/integrations/pi/components/upstream/history/kill-ring.js +1 -1
  280. package/dist/integrations/pi/components/upstream/history/printable-key.js +1 -1
  281. package/dist/integrations/pi/components/upstream/history/text-helpers.js +1 -1
  282. package/dist/integrations/pi/components/upstream/history/undo-stack.d.ts +1 -1
  283. package/dist/integrations/pi/components/upstream/history/undo-stack.js +1 -1
  284. package/dist/integrations/pi/components/upstream/history/word-navigation.js +1 -1
  285. package/dist/integrations/pi/components/upstream/model-search.d.ts +1 -1
  286. package/dist/integrations/pi/components/upstream/program-status-reporter.d.ts +1 -1
  287. package/dist/integrations/pi/components/upstream/theme/theme-controller.d.ts +1 -1
  288. package/dist/integrations/pi/components/upstream/theme/theme.d.ts +5 -0
  289. package/dist/integrations/pi/components/upstream/theme/theme.js +29 -2
  290. package/dist/integrations/pi/engine/adapter.d.ts +5 -77
  291. package/dist/integrations/pi/engine/adapter.js +95 -394
  292. package/dist/integrations/pi/engine/command-dispatch.d.ts +13 -0
  293. package/dist/integrations/pi/engine/command-dispatch.js +57 -0
  294. package/dist/integrations/pi/engine/host.js +2 -2
  295. package/dist/integrations/pi/engine/offline-settings-port.d.ts +23 -0
  296. package/dist/integrations/pi/engine/offline-settings-port.js +53 -0
  297. package/dist/integrations/pi/engine/pi-settings-metadata.json +14 -2
  298. package/dist/integrations/pi/engine/ports.d.ts +56 -0
  299. package/dist/integrations/pi/engine/ports.js +93 -0
  300. package/dist/integrations/pi/engine/prompt-suggestions.d.ts +1 -0
  301. package/dist/integrations/pi/engine/prompt-suggestions.js +40 -0
  302. package/dist/integrations/pi/engine/resources/changelog.json +4 -4
  303. package/dist/integrations/pi/engine/runtime-integration.js +102 -29
  304. package/dist/integrations/pi/engine/session-runtime.d.ts +0 -6
  305. package/dist/integrations/pi/engine/session-runtime.js +13 -5
  306. package/dist/integrations/pi/engine/session-selection.d.ts +3 -0
  307. package/dist/integrations/pi/engine/session-selection.js +45 -9
  308. package/dist/integrations/pi/engine/settings-bridge.d.ts +5 -0
  309. package/dist/integrations/pi/engine/settings-bridge.js +15 -0
  310. package/dist/integrations/pi/engine/settings-port.js +11 -15
  311. package/dist/integrations/pi/engine/view-state.d.ts +42 -0
  312. package/dist/integrations/pi/engine/view-state.js +126 -0
  313. package/dist/integrations/pi/engine/workflow-contexts.js +10 -1
  314. package/dist/integrations/pi/engine/workflow-runner.js +74 -5
  315. package/dist/integrations/pi/engine/workflow-support.d.ts +12 -0
  316. package/dist/integrations/pi/engine/workflow-support.js +36 -0
  317. package/dist/integrations/pi/engine/workflows.d.ts +3 -1
  318. package/dist/integrations/pi/engine/workflows.js +1 -0
  319. package/dist/integrations/pi/startup-public.js +257 -310
  320. package/dist/integrations/pi/startup-public.manifest.json +564 -440
  321. package/dist/integrations/pi/tui-runtime/adapter.d.ts +6 -0
  322. package/dist/integrations/pi/tui-runtime/adapter.js +32 -1
  323. package/dist/integrations/pi/tui-runtime/contracts.d.ts +5 -0
  324. package/dist/integrations/pi/tui-runtime/damage-aware-terminal.d.ts +12 -1
  325. package/dist/integrations/pi/tui-runtime/damage-aware-terminal.js +31 -2
  326. package/dist/native/darwin-arm64/manifest.json +10 -7
  327. package/dist/native/darwin-arm64/process-guardian.node +0 -0
  328. package/dist/native/darwin-arm64/terminal-host-THIRD-PARTY-NOTICES.txt +10500 -0
  329. package/dist/native/darwin-arm64/terminal-host.manifest.json +46 -0
  330. package/dist/native/darwin-arm64/terminal-host.node +0 -0
  331. package/dist/native/darwin-x64/manifest.json +23 -0
  332. package/dist/native/darwin-x64/process-guardian.node +0 -0
  333. package/dist/native/darwin-x64/terminal-host-THIRD-PARTY-NOTICES.txt +10737 -0
  334. package/dist/native/darwin-x64/terminal-host.manifest.json +46 -0
  335. package/dist/native/darwin-x64/terminal-host.node +0 -0
  336. package/dist/native/linux-x64/manifest.json +10 -7
  337. package/dist/native/linux-x64/process-guardian.node +0 -0
  338. package/dist/native/linux-x64/terminal-host-THIRD-PARTY-NOTICES.txt +11226 -0
  339. package/dist/native/linux-x64/terminal-host.manifest.json +46 -0
  340. package/dist/native/linux-x64/terminal-host.node +0 -0
  341. package/dist/native/win32-x64/manifest.json +10 -7
  342. package/dist/native/win32-x64/process-guardian.node +0 -0
  343. package/dist/native/win32-x64/terminal-host-THIRD-PARTY-NOTICES.txt +10757 -0
  344. package/dist/native/win32-x64/terminal-host.manifest.json +46 -0
  345. package/dist/native/win32-x64/terminal-host.node +0 -0
  346. package/dist/product-identity.d.ts +3 -3
  347. package/dist/product-identity.js +4 -4
  348. package/dist/product-identity.json +16 -2
  349. package/dist/runtime-payload-inventory.json +6330 -6677
  350. package/dist/ui/apps/host.d.ts +2 -0
  351. package/dist/ui/apps/host.js +7 -1
  352. package/dist/ui/components/dialog-panel.d.ts +17 -8
  353. package/dist/ui/components/dialog-panel.js +117 -41
  354. package/dist/ui/components/index.d.ts +5 -5
  355. package/dist/ui/components/index.js +4 -4
  356. package/dist/ui/components/line-input.d.ts +4 -1
  357. package/dist/ui/components/line-input.js +3 -1
  358. package/dist/ui/components/prompt-input.d.ts +11 -8
  359. package/dist/ui/components/prompt-input.js +15 -13
  360. package/dist/ui/components/scrollbar.d.ts +1 -1
  361. package/dist/ui/components/scrollbar.js +1 -1
  362. package/dist/ui/components/selection-copy.d.ts +3 -3
  363. package/dist/ui/components/selection-copy.js +16 -1
  364. package/dist/ui/components/spans.js +2 -2
  365. package/dist/ui/components/submitted-prompt.d.ts +9 -6
  366. package/dist/ui/components/submitted-prompt.js +20 -12
  367. package/dist/ui/components/surface.js +4 -2
  368. package/dist/ui/components/text-selection.d.ts +1 -2
  369. package/dist/ui/components/text-selection.js +5 -2
  370. package/dist/ui/components/text.d.ts +3 -6
  371. package/dist/ui/components/text.js +6 -8
  372. package/dist/ui/components/transcript-viewport.d.ts +9 -2
  373. package/dist/ui/components/transcript-viewport.js +179 -58
  374. package/dist/ui/settings/declarations.d.ts +90 -16
  375. package/dist/ui/settings/declarations.js +67 -14
  376. package/dist/ui/settings/early-accent.d.ts +81 -0
  377. package/dist/ui/settings/early-accent.js +50 -0
  378. package/dist/ui/settings/index.d.ts +4 -2
  379. package/dist/ui/settings/index.js +2 -1
  380. package/dist/ui/settings/manager.d.ts +16 -3
  381. package/dist/ui/settings/manager.js +122 -33
  382. package/dist/ui/settings/migrations.d.ts +6 -0
  383. package/dist/ui/settings/migrations.js +73 -0
  384. package/dist/ui/settings/profile-document.d.ts +26 -0
  385. package/dist/ui/settings/profile-document.js +164 -0
  386. package/dist/ui/settings/progress-palette.generated.d.ts +139 -0
  387. package/dist/ui/settings/progress-palette.generated.js +139 -0
  388. package/dist/ui/settings/sections.d.ts +4 -0
  389. package/dist/ui/settings/sections.js +9 -3
  390. package/docs/architecture/boundaries.md +24 -9
  391. package/docs/architecture/evidence/resident-tabs/linux-x64.md +37 -0
  392. package/docs/architecture/evidence/resident-tabs/macos-arm64.md +36 -0
  393. package/docs/architecture/evidence/resident-tabs/macos-x64.md +35 -0
  394. package/docs/architecture/evidence/resident-tabs/windows-x64.md +36 -0
  395. package/docs/architecture/internal-naming.md +3 -1
  396. package/docs/architecture/process-guardian-provenance.md +18 -10
  397. package/docs/architecture/project-structure.md +8 -0
  398. package/docs/architecture/resident-tabs-requirements.md +18 -0
  399. package/docs/architecture/resident-tabs.md +649 -0
  400. package/docs/architecture/response-copy-delivery.md +1 -1
  401. package/docs/architecture/terminal-host-proof-gate.md +2 -0
  402. package/docs/architecture/terminal-host-provenance.md +16 -4
  403. package/docs/architecture/tool-image-presentation.md +2 -1
  404. package/docs/architecture/toolchain.md +11 -9
  405. package/docs/ci-release-runbook.md +14 -7
  406. package/docs/features/launch-profiles.md +11 -8
  407. package/docs/features/prompt-history.md +41 -20
  408. package/docs/manual-resident-tabs-acceptance.md +51 -0
  409. package/docs/openspec-archive-automation.md +49 -22
  410. package/docs/validation.md +49 -9
  411. package/package.json +19 -6
  412. package/dist/foundation/process-containment/darwin-process-inspector.d.ts +0 -5
  413. package/dist/foundation/process-containment/darwin-process-inspector.js +0 -7
  414. package/dist/foundation/process-containment/native-guardian-containment.js +0 -152
  415. package/dist/foundation/process-containment/windows-process-inspector.d.ts +0 -19
  416. package/dist/foundation/process-containment/windows-process-inspector.js +0 -56
  417. package/dist/native/darwin-arm64/process-guardian +0 -0
  418. package/dist/native/linux-x64/process-guardian +0 -0
  419. package/dist/native/win32-x64/process-guardian.exe +0 -0
@@ -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[];
@@ -104,7 +104,80 @@ export const OWNED_UI_SETTINGS_MIGRATIONS = Object.freeze([
104
104
  return { ...values };
105
105
  },
106
106
  }),
107
+ Object.freeze({
108
+ to: 14,
109
+ description: "Introduce the opt-in resident tabs preview with a disabled default.",
110
+ migrate(values) {
111
+ return { ...values };
112
+ },
113
+ }),
114
+ Object.freeze({
115
+ to: 15,
116
+ description: "Introduce the bounded concurrent resident-tab start limit.",
117
+ migrate(values) {
118
+ return { ...values };
119
+ },
120
+ }),
121
+ Object.freeze({
122
+ to: 16,
123
+ description: "Make bare A1 tabs unconditional and keep only tab UX controls.",
124
+ migrate(values) {
125
+ const migrated = { ...values };
126
+ delete migrated.residentTabs;
127
+ delete migrated.tabsMaxConcurrentStarts;
128
+ delete migrated.tabsUnresponsiveRestartSeconds;
129
+ delete migrated.tabsStallNoticeSeconds;
130
+ return migrated;
131
+ },
132
+ }),
133
+ Object.freeze({
134
+ to: 17,
135
+ description: "Introduce the shared twelve-hour time format default.",
136
+ migrate(values) {
137
+ return { ...values };
138
+ },
139
+ }),
140
+ Object.freeze({
141
+ to: 18,
142
+ description: "Introduce the top resident tab-bar position default.",
143
+ migrate(values) {
144
+ return { ...values };
145
+ },
146
+ }),
147
+ Object.freeze({
148
+ to: 19,
149
+ description: "Expand the update check into auto, notify, and no modes.",
150
+ migrate(values) {
151
+ if (values.updateCheck === true)
152
+ return { ...values, updateCheck: "notify" };
153
+ if (values.updateCheck === false)
154
+ return { ...values, updateCheck: "no" };
155
+ return { ...values };
156
+ },
157
+ }),
107
158
  ]);
159
+ /** Shape-selected compatibility for the metadata-free product object. */
160
+ export function normalizeOwnedUiSettingsValues(source) {
161
+ const values = { ...source };
162
+ // Compatibility: "high" is valid again, so the old speed meaning is ambiguous without legacy metadata.
163
+ if (values.scrollbarAppearance === "hover")
164
+ values.scrollbarAppearance = "auto";
165
+ if (values.accentColor === "default")
166
+ values.accentColor = "purple";
167
+ if (values.updateCheck === true)
168
+ values.updateCheck = "notify";
169
+ else if (values.updateCheck === false)
170
+ values.updateCheck = "no";
171
+ if (values.quitEffect === "off") {
172
+ if (Object.hasOwn(values, "quitAnimation") && values.quitAnimation !== false) {
173
+ return { values: null, failure: "legacy quitEffect conflicts with quitAnimation" };
174
+ }
175
+ values.quitAnimation = false;
176
+ }
177
+ delete values.quitEffect;
178
+ delete values.quitEffectDurationMs;
179
+ return { values, failure: null };
180
+ }
108
181
  export function assertOwnedUiSettingsMigrations(migrations, currentVersion = OWNED_UI_SETTINGS_VERSION) {
109
182
  const firstProduced = currentVersion - migrations.length + 1;
110
183
  if (migrations.length > 0 && firstProduced < 2) {
@@ -0,0 +1,26 @@
1
+ export type ProfileSettingsNamespaceRead = {
2
+ readonly status: "missing";
3
+ readonly value: null;
4
+ } | {
5
+ readonly status: "available";
6
+ readonly value: Readonly<Record<string, unknown>>;
7
+ } | {
8
+ readonly status: "invalid";
9
+ readonly value: null;
10
+ readonly detail: string;
11
+ };
12
+ export type ProfileSettingsNamespaceUpdate = (current: Readonly<Record<string, unknown>> | null) => Readonly<Record<string, unknown>> | null;
13
+ /** Refuse an injected namespace already claimed by the surrounding root schema. */
14
+ export declare function assertProfileSettingsNamespaceAvailable(namespace: string, rootSettingKeys: readonly string[]): void;
15
+ /** Read one product-owned root object without exposing unrelated profile settings. */
16
+ export declare function readProfileSettingsNamespace(file: string, namespace: string): ProfileSettingsNamespaceRead;
17
+ /**
18
+ * Remove bounded leading noise only when the remaining bytes are one complete root object.
19
+ * The repair is silent and uses the same lock and atomic replacement path as namespace writes.
20
+ */
21
+ export declare function repairProfileSettingsDocument(file: string): boolean;
22
+ /**
23
+ * Replace one root namespace through the lock protocol used by pinned Pi.
24
+ * The updater receives bytes reread while locked, so unrelated concurrent writes survive.
25
+ */
26
+ export declare function updateProfileSettingsNamespace(file: string, namespace: string, update: ProfileSettingsNamespaceUpdate): void;
@@ -0,0 +1,164 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { existsSync, mkdirSync, readFileSync, renameSync, rmSync, writeFileSync } from "node:fs";
3
+ import { dirname } from "node:path";
4
+ import lockfile from "proper-lockfile";
5
+ const NAMESPACE_PATTERN = /^[a-z][a-z0-9-]*$/;
6
+ const MAX_RECOVERABLE_PREFIX_BYTES = 256;
7
+ /** Refuse an injected namespace already claimed by the surrounding root schema. */
8
+ export function assertProfileSettingsNamespaceAvailable(namespace, rootSettingKeys) {
9
+ assertNamespace(namespace);
10
+ if (rootSettingKeys.includes(namespace))
11
+ throw new Error(`profile settings namespace collides with a root setting: ${namespace}`);
12
+ }
13
+ /** Read one product-owned root object without exposing unrelated profile settings. */
14
+ export function readProfileSettingsNamespace(file, namespace) {
15
+ assertNamespace(namespace);
16
+ let raw;
17
+ try {
18
+ raw = readFileSync(file, "utf8");
19
+ }
20
+ catch (error) {
21
+ if (isMissing(error))
22
+ return { status: "missing", value: null };
23
+ return { status: "invalid", value: null, detail: `${file} could not be read: ${describe(error)}` };
24
+ }
25
+ const root = parseRoot(raw);
26
+ if (root === null)
27
+ return { status: "invalid", value: null, detail: `${file} is not a valid settings object` };
28
+ if (!Object.hasOwn(root, namespace))
29
+ return { status: "missing", value: null };
30
+ const value = root[namespace];
31
+ if (!isRecord(value)) {
32
+ return { status: "invalid", value: null, detail: `${file} contains a non-object ${namespace} settings namespace` };
33
+ }
34
+ return { status: "available", value: Object.freeze({ ...value }) };
35
+ }
36
+ /**
37
+ * Remove bounded leading noise only when the remaining bytes are one complete root object.
38
+ * The repair is silent and uses the same lock and atomic replacement path as namespace writes.
39
+ */
40
+ export function repairProfileSettingsDocument(file) {
41
+ if (!existsSync(file))
42
+ return false;
43
+ const release = acquireLock(file);
44
+ try {
45
+ if (!existsSync(file))
46
+ return false;
47
+ const raw = readFileSync(file, "utf8");
48
+ if (parseRoot(raw) !== null)
49
+ return false;
50
+ const root = parseRootAfterLeadingNoise(raw);
51
+ if (root === null)
52
+ return false;
53
+ replaceRoot(file, root);
54
+ return true;
55
+ }
56
+ finally {
57
+ release();
58
+ }
59
+ }
60
+ /**
61
+ * Replace one root namespace through the lock protocol used by pinned Pi.
62
+ * The updater receives bytes reread while locked, so unrelated concurrent writes survive.
63
+ */
64
+ export function updateProfileSettingsNamespace(file, namespace, update) {
65
+ assertNamespace(namespace);
66
+ mkdirSync(dirname(file), { recursive: true, mode: 0o700 });
67
+ const release = acquireLock(file);
68
+ try {
69
+ const root = existsSync(file) ? parseRoot(readFileSync(file, "utf8")) : {};
70
+ if (root === null)
71
+ throw new Error(`${file} is not a valid settings object`);
72
+ const existing = root[namespace];
73
+ if (existing !== undefined && !isRecord(existing)) {
74
+ throw new Error(`${file} contains a non-object ${namespace} settings namespace`);
75
+ }
76
+ const nextNamespace = update(existing === undefined ? null : Object.freeze({ ...existing }));
77
+ const nextRoot = { ...root };
78
+ if (nextNamespace === null || Object.keys(nextNamespace).length === 0)
79
+ delete nextRoot[namespace];
80
+ else
81
+ nextRoot[namespace] = { ...nextNamespace };
82
+ replaceRoot(file, nextRoot);
83
+ }
84
+ finally {
85
+ release();
86
+ }
87
+ }
88
+ function acquireLock(file) {
89
+ for (let attempt = 0;; attempt += 1) {
90
+ try {
91
+ return lockfile.lockSync(file, { realpath: false });
92
+ }
93
+ catch (error) {
94
+ if (attempt >= 9 || !isLocked(error))
95
+ throw error;
96
+ Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, 20);
97
+ }
98
+ }
99
+ }
100
+ function replaceRoot(file, root) {
101
+ let temporary = `${file}.${process.pid}.${randomUUID()}.tmp`;
102
+ try {
103
+ writeFileSync(temporary, `${JSON.stringify(root, null, 2)}\n`, { encoding: "utf8", mode: 0o600 });
104
+ renameSync(temporary, file);
105
+ temporary = null;
106
+ }
107
+ finally {
108
+ if (temporary !== null) {
109
+ try {
110
+ rmSync(temporary, { force: true });
111
+ }
112
+ catch {
113
+ // Invariant: failed temporary cleanup cannot make the target document authoritative.
114
+ }
115
+ }
116
+ }
117
+ }
118
+ function parseRoot(raw) {
119
+ return parseRootValue(stripBom(raw));
120
+ }
121
+ function parseRootAfterLeadingNoise(raw) {
122
+ const withoutBom = stripBom(raw);
123
+ const start = withoutBom.indexOf("{");
124
+ if (start <= 0)
125
+ return null;
126
+ const prefix = withoutBom.slice(0, start);
127
+ if (Buffer.byteLength(prefix, "utf8") > MAX_RECOVERABLE_PREFIX_BYTES || prefix.trim().length === 0)
128
+ return null;
129
+ try {
130
+ JSON.parse(prefix);
131
+ return null;
132
+ }
133
+ catch {
134
+ return parseRootValue(withoutBom.slice(start));
135
+ }
136
+ }
137
+ function parseRootValue(raw) {
138
+ try {
139
+ const value = JSON.parse(raw);
140
+ return isRecord(value) ? value : null;
141
+ }
142
+ catch {
143
+ return null;
144
+ }
145
+ }
146
+ function stripBom(raw) {
147
+ return raw.charCodeAt(0) === 0xfeff ? raw.slice(1) : raw;
148
+ }
149
+ function isRecord(value) {
150
+ return typeof value === "object" && value !== null && !Array.isArray(value);
151
+ }
152
+ function assertNamespace(namespace) {
153
+ if (!NAMESPACE_PATTERN.test(namespace))
154
+ throw new Error(`profile settings namespace is invalid: ${namespace}`);
155
+ }
156
+ function isMissing(error) {
157
+ return typeof error === "object" && error !== null && "code" in error && error.code === "ENOENT";
158
+ }
159
+ function isLocked(error) {
160
+ return typeof error === "object" && error !== null && "code" in error && error.code === "ELOCKED";
161
+ }
162
+ function describe(error) {
163
+ return error instanceof Error ? error.message : String(error);
164
+ }
@@ -0,0 +1,139 @@
1
+ /**
2
+ * Generated by scripts/pi/sync-progress-palette.ts from A1's named accent projection
3
+ * over pinned Pi 1.4.0 (MIT), commit 4a080252f06caf63a525d7873c5d94d3c23887e0. Do not edit directly.
4
+ */
5
+ export declare const SHARED_PROGRESS_PALETTE: Readonly<{
6
+ blue: {
7
+ dark: {
8
+ truecolor: {
9
+ accent: string;
10
+ border: string;
11
+ };
12
+ "256color": {
13
+ accent: string;
14
+ border: string;
15
+ };
16
+ };
17
+ light: {
18
+ truecolor: {
19
+ accent: string;
20
+ border: string;
21
+ };
22
+ "256color": {
23
+ accent: string;
24
+ border: string;
25
+ };
26
+ };
27
+ };
28
+ purple: {
29
+ dark: {
30
+ truecolor: {
31
+ accent: string;
32
+ border: string;
33
+ };
34
+ "256color": {
35
+ accent: string;
36
+ border: string;
37
+ };
38
+ };
39
+ light: {
40
+ truecolor: {
41
+ accent: string;
42
+ border: string;
43
+ };
44
+ "256color": {
45
+ accent: string;
46
+ border: string;
47
+ };
48
+ };
49
+ };
50
+ cyan: {
51
+ dark: {
52
+ truecolor: {
53
+ accent: string;
54
+ border: string;
55
+ };
56
+ "256color": {
57
+ accent: string;
58
+ border: string;
59
+ };
60
+ };
61
+ light: {
62
+ truecolor: {
63
+ accent: string;
64
+ border: string;
65
+ };
66
+ "256color": {
67
+ accent: string;
68
+ border: string;
69
+ };
70
+ };
71
+ };
72
+ green: {
73
+ dark: {
74
+ truecolor: {
75
+ accent: string;
76
+ border: string;
77
+ };
78
+ "256color": {
79
+ accent: string;
80
+ border: string;
81
+ };
82
+ };
83
+ light: {
84
+ truecolor: {
85
+ accent: string;
86
+ border: string;
87
+ };
88
+ "256color": {
89
+ accent: string;
90
+ border: string;
91
+ };
92
+ };
93
+ };
94
+ orange: {
95
+ dark: {
96
+ truecolor: {
97
+ accent: string;
98
+ border: string;
99
+ };
100
+ "256color": {
101
+ accent: string;
102
+ border: string;
103
+ };
104
+ };
105
+ light: {
106
+ truecolor: {
107
+ accent: string;
108
+ border: string;
109
+ };
110
+ "256color": {
111
+ accent: string;
112
+ border: string;
113
+ };
114
+ };
115
+ };
116
+ pink: {
117
+ dark: {
118
+ truecolor: {
119
+ accent: string;
120
+ border: string;
121
+ };
122
+ "256color": {
123
+ accent: string;
124
+ border: string;
125
+ };
126
+ };
127
+ light: {
128
+ truecolor: {
129
+ accent: string;
130
+ border: string;
131
+ };
132
+ "256color": {
133
+ accent: string;
134
+ border: string;
135
+ };
136
+ };
137
+ };
138
+ }>;
139
+ export declare const SHARED_PROGRESS_ACCENT_ANSI: string;