@open-mercato/cezar 0.9.1 → 0.9.2-pr778.1064

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 (355) hide show
  1. package/README.md +29 -11
  2. package/dist/agent-config/account-identity.d.ts +44 -0
  3. package/dist/agent-config/account-identity.js +128 -0
  4. package/dist/agent-config/account-identity.js.map +1 -0
  5. package/dist/agent-config/catalog.d.ts +9 -1
  6. package/dist/agent-config/catalog.js +18 -0
  7. package/dist/agent-config/catalog.js.map +1 -1
  8. package/dist/agent-config/files.d.ts +1 -1
  9. package/dist/agent-config/model-settings/claude.d.ts +2 -0
  10. package/dist/agent-config/model-settings/claude.js +11 -0
  11. package/dist/agent-config/model-settings/claude.js.map +1 -0
  12. package/dist/agent-config/model-settings/codex.d.ts +2 -0
  13. package/dist/agent-config/model-settings/codex.js +16 -0
  14. package/dist/agent-config/model-settings/codex.js.map +1 -0
  15. package/dist/agent-config/model-settings/opencode.d.ts +2 -0
  16. package/dist/agent-config/model-settings/opencode.js +8 -0
  17. package/dist/agent-config/model-settings/opencode.js.map +1 -0
  18. package/dist/agent-config/model-settings/shared.d.ts +9 -0
  19. package/dist/agent-config/model-settings/shared.js +93 -0
  20. package/dist/agent-config/model-settings/shared.js.map +1 -0
  21. package/dist/agent-config/model-settings/types.d.ts +9 -0
  22. package/dist/agent-config/model-settings/types.js +2 -0
  23. package/dist/agent-config/model-settings/types.js.map +1 -0
  24. package/dist/agent-config/models.d.ts +9 -0
  25. package/dist/agent-config/models.js +30 -0
  26. package/dist/agent-config/models.js.map +1 -0
  27. package/dist/agent-config/service.d.ts +1 -1
  28. package/dist/agent-config/service.js +4 -4
  29. package/dist/agent-config/service.js.map +1 -1
  30. package/dist/agent-config/validate.d.ts +1 -1
  31. package/dist/automations/coordinator.d.ts +26 -0
  32. package/dist/automations/coordinator.js +66 -0
  33. package/dist/automations/coordinator.js.map +1 -0
  34. package/dist/automations/github-poller.d.ts +74 -0
  35. package/dist/automations/github-poller.js +234 -0
  36. package/dist/automations/github-poller.js.map +1 -0
  37. package/dist/automations/scheduler.d.ts +42 -0
  38. package/dist/automations/scheduler.js +192 -0
  39. package/dist/automations/scheduler.js.map +1 -0
  40. package/dist/automations/store.d.ts +65 -0
  41. package/dist/automations/store.js +298 -0
  42. package/dist/automations/store.js.map +1 -0
  43. package/dist/automations/task-template.d.ts +18 -0
  44. package/dist/automations/task-template.js +95 -0
  45. package/dist/automations/task-template.js.map +1 -0
  46. package/dist/automations/types.d.ts +251 -0
  47. package/dist/automations/types.js +158 -0
  48. package/dist/automations/types.js.map +1 -0
  49. package/dist/config.d.ts +17 -112
  50. package/dist/config.js +45 -4
  51. package/dist/config.js.map +1 -1
  52. package/dist/contract/agent-config.d.ts +151 -0
  53. package/dist/contract/agent-profiles.d.ts +332 -0
  54. package/dist/contract/automations.d.ts +919 -0
  55. package/dist/contract/events.d.ts +45 -0
  56. package/dist/contract/github.d.ts +467 -0
  57. package/dist/contract/health.d.ts +96 -0
  58. package/dist/contract/index.d.ts +16 -0
  59. package/dist/contract/index.js +1604 -0
  60. package/dist/contract/projects.d.ts +185 -0
  61. package/dist/contract/repo.d.ts +234 -0
  62. package/dist/contract/runs.d.ts +1261 -0
  63. package/dist/contract/skills.d.ts +229 -0
  64. package/dist/contract/workflows.d.ts +212 -0
  65. package/dist/contract/workspace.d.ts +472 -0
  66. package/dist/core/agent-env.d.ts +1 -1
  67. package/dist/core/agent-model-policy.d.ts +10 -0
  68. package/dist/core/agent-model-policy.js +36 -0
  69. package/dist/core/agent-model-policy.js.map +1 -0
  70. package/dist/core/agent-profiles.d.ts +59 -0
  71. package/dist/core/agent-profiles.js +83 -0
  72. package/dist/core/agent-profiles.js.map +1 -0
  73. package/dist/core/agent-runner.d.ts +12 -1
  74. package/dist/core/agent-runner.js +13 -0
  75. package/dist/core/agent-runner.js.map +1 -1
  76. package/dist/core/ask.d.ts +45 -124
  77. package/dist/core/ask.js +103 -13
  78. package/dist/core/ask.js.map +1 -1
  79. package/dist/core/backend-detect.js +7 -2
  80. package/dist/core/backend-detect.js.map +1 -1
  81. package/dist/core/claude-cli-runner.d.ts +2 -2
  82. package/dist/core/claude-cli-runner.js +52 -9
  83. package/dist/core/claude-cli-runner.js.map +1 -1
  84. package/dist/core/claude-ui-mapper.d.ts +1 -1
  85. package/dist/core/codex-app-server-runner.d.ts +1 -1
  86. package/dist/core/codex-app-server-runner.js +60 -3
  87. package/dist/core/codex-app-server-runner.js.map +1 -1
  88. package/dist/core/codex-app-server-transport.d.ts +6 -1
  89. package/dist/core/codex-app-server-transport.js +12 -3
  90. package/dist/core/codex-app-server-transport.js.map +1 -1
  91. package/dist/core/codex-model-catalog.d.ts +1 -1
  92. package/dist/core/codex-ui-mapper.d.ts +5 -1
  93. package/dist/core/codex-ui-mapper.js +74 -17
  94. package/dist/core/codex-ui-mapper.js.map +1 -1
  95. package/dist/core/model-identity.d.ts +13 -6
  96. package/dist/core/model-identity.js +32 -17
  97. package/dist/core/model-identity.js.map +1 -1
  98. package/dist/core/model-presets.d.ts +2 -2
  99. package/dist/core/model-presets.js +1 -1
  100. package/dist/core/opencode-server-runner.d.ts +2 -2
  101. package/dist/core/opencode-ui-mapper.d.ts +4 -1
  102. package/dist/core/opencode-ui-mapper.js +45 -7
  103. package/dist/core/opencode-ui-mapper.js.map +1 -1
  104. package/dist/core/provider-auth.d.ts +154 -0
  105. package/dist/core/provider-auth.js +488 -0
  106. package/dist/core/provider-auth.js.map +1 -0
  107. package/dist/core/provider-availability.d.ts +3 -0
  108. package/dist/core/provider-availability.js +14 -0
  109. package/dist/core/provider-availability.js.map +1 -0
  110. package/dist/core/runner-factory.d.ts +1 -1
  111. package/dist/core/runner-model-catalog.d.ts +1 -1
  112. package/dist/core/shell-env.d.ts +28 -0
  113. package/dist/core/shell-env.js +56 -0
  114. package/dist/core/shell-env.js.map +1 -0
  115. package/dist/core/tool-display.d.ts +1 -1
  116. package/dist/core/ui-events.d.ts +1 -1
  117. package/dist/core/ui-events.js +1 -1
  118. package/dist/core/usage-limit.d.ts +42 -0
  119. package/dist/core/usage-limit.js +209 -0
  120. package/dist/core/usage-limit.js.map +1 -0
  121. package/dist/git-diff-base.d.ts +60 -0
  122. package/dist/git-diff-base.js +54 -0
  123. package/dist/git-diff-base.js.map +1 -0
  124. package/dist/git-worktree.d.ts +37 -6
  125. package/dist/git-worktree.js +39 -9
  126. package/dist/git-worktree.js.map +1 -1
  127. package/dist/handoff.d.ts +2 -2
  128. package/dist/handoff.js +1 -1
  129. package/dist/index.js +65 -8
  130. package/dist/index.js.map +1 -1
  131. package/dist/paths.d.ts +69 -6
  132. package/dist/paths.js +86 -9
  133. package/dist/paths.js.map +1 -1
  134. package/dist/planner.d.ts +2 -2
  135. package/dist/planner.js +7 -1
  136. package/dist/planner.js.map +1 -1
  137. package/dist/release/manifests.d.ts +81 -0
  138. package/dist/release/manifests.js +74 -0
  139. package/dist/release/manifests.js.map +1 -0
  140. package/dist/release/snapshot.d.ts +9 -23
  141. package/dist/release/snapshot.js +9 -22
  142. package/dist/release/snapshot.js.map +1 -1
  143. package/dist/release/stable.d.ts +15 -29
  144. package/dist/release/stable.js +14 -27
  145. package/dist/release/stable.js.map +1 -1
  146. package/dist/runs/auto-name.d.ts +1 -1
  147. package/dist/runs/auto-name.js +6 -1
  148. package/dist/runs/auto-name.js.map +1 -1
  149. package/dist/runs/retention.d.ts +1 -1
  150. package/dist/runs/store.d.ts +149 -336
  151. package/dist/runs/store.js +187 -9
  152. package/dist/runs/store.js.map +1 -1
  153. package/dist/runs/ui-event-sink.d.ts +1 -1
  154. package/dist/server/app-type.d.ts +21 -0
  155. package/dist/server/app-type.js +2 -0
  156. package/dist/server/app-type.js.map +1 -0
  157. package/dist/server/capabilities.d.ts +6 -5
  158. package/dist/server/capabilities.js +11 -0
  159. package/dist/server/capabilities.js.map +1 -1
  160. package/dist/server/forge/github.d.ts +58 -151
  161. package/dist/server/forge/github.js +530 -6
  162. package/dist/server/forge/github.js.map +1 -1
  163. package/dist/server/forge/index.d.ts +10 -3
  164. package/dist/server/forge/index.js +14 -1
  165. package/dist/server/forge/index.js.map +1 -1
  166. package/dist/server/forge/types.d.ts +86 -1
  167. package/dist/server/git-changes.d.ts +8 -8
  168. package/dist/server/git-changes.js +14 -17
  169. package/dist/server/git-changes.js.map +1 -1
  170. package/dist/server/git.d.ts +2 -0
  171. package/dist/server/git.js +9 -0
  172. package/dist/server/git.js.map +1 -1
  173. package/dist/server/github.d.ts +3 -3
  174. package/dist/server/github.js +1 -1
  175. package/dist/server/github.js.map +1 -1
  176. package/dist/server/open-in-terminal.d.ts +8 -1
  177. package/dist/server/open-in-terminal.js +16 -8
  178. package/dist/server/open-in-terminal.js.map +1 -1
  179. package/dist/server/pr.d.ts +2 -2
  180. package/dist/server/project-context.d.ts +20 -3
  181. package/dist/server/project-context.js +30 -1
  182. package/dist/server/project-context.js.map +1 -1
  183. package/dist/server/provider-action-gate.d.ts +8 -0
  184. package/dist/server/provider-action-gate.js +54 -0
  185. package/dist/server/provider-action-gate.js.map +1 -0
  186. package/dist/server/provider-auth-runtime.d.ts +21 -0
  187. package/dist/server/provider-auth-runtime.js +66 -0
  188. package/dist/server/provider-auth-runtime.js.map +1 -0
  189. package/dist/server/server.d.ts +12052 -47
  190. package/dist/server/server.js +2626 -918
  191. package/dist/server/server.js.map +1 -1
  192. package/dist/server/validators.d.ts +97 -0
  193. package/dist/server/validators.js +86 -0
  194. package/dist/server/validators.js.map +1 -0
  195. package/dist/server/ws.d.ts +2 -2
  196. package/dist/server/ws.js +2 -2
  197. package/dist/server/ws.js.map +1 -1
  198. package/dist/server-install/engine.d.ts +1 -1
  199. package/dist/server-install/platforms/macosx-ngrok.d.ts +1 -1
  200. package/dist/server-install/platforms/ubuntu-vps.d.ts +16 -1
  201. package/dist/server-install/platforms/ubuntu-vps.js +83 -1
  202. package/dist/server-install/platforms/ubuntu-vps.js.map +1 -1
  203. package/dist/server-install/state.d.ts +1 -1
  204. package/dist/server-install/steps.d.ts +2 -2
  205. package/dist/server-install/strategies.d.ts +1 -1
  206. package/dist/server-install/types.d.ts +38 -424
  207. package/dist/server-install/ui.d.ts +1 -1
  208. package/dist/skills-banner.d.ts +7 -6
  209. package/dist/skills-banner.js +7 -6
  210. package/dist/skills-banner.js.map +1 -1
  211. package/dist/skills-remote.d.ts +2 -2
  212. package/dist/skills-update.d.ts +88 -0
  213. package/dist/skills-update.js +392 -0
  214. package/dist/skills-update.js.map +1 -0
  215. package/dist/skills.d.ts +2 -0
  216. package/dist/skills.js +7 -2
  217. package/dist/skills.js.map +1 -1
  218. package/dist/todos.d.ts +2 -28
  219. package/dist/todos.js +1 -1
  220. package/dist/ui-state.d.ts +16 -2
  221. package/dist/ui-state.js +14 -1
  222. package/dist/ui-state.js.map +1 -1
  223. package/dist/workflows/load.d.ts +1 -1
  224. package/dist/workflows/run.d.ts +238 -12
  225. package/dist/workflows/run.js +1103 -115
  226. package/dist/workflows/run.js.map +1 -1
  227. package/dist/workflows/types.d.ts +59 -224
  228. package/dist/workflows/types.js +14 -0
  229. package/dist/workflows/types.js.map +1 -1
  230. package/dist/workspace/agent-accounts.d.ts +149 -0
  231. package/dist/workspace/agent-accounts.js +303 -0
  232. package/dist/workspace/agent-accounts.js.map +1 -0
  233. package/dist/workspace/agent-profiles.d.ts +78 -0
  234. package/dist/workspace/agent-profiles.js +115 -0
  235. package/dist/workspace/agent-profiles.js.map +1 -0
  236. package/dist/workspace/config.d.ts +82 -206
  237. package/dist/workspace/config.js +183 -14
  238. package/dist/workspace/config.js.map +1 -1
  239. package/dist/workspace/migrations.d.ts +1 -1
  240. package/dist/workspace/migrations.js +19 -4
  241. package/dist/workspace/migrations.js.map +1 -1
  242. package/dist/workspace/projects.d.ts +8 -2
  243. package/dist/workspace/projects.js +9 -3
  244. package/dist/workspace/projects.js.map +1 -1
  245. package/dist/workspace/semaphore.d.ts +45 -0
  246. package/dist/workspace/semaphore.js +45 -1
  247. package/dist/workspace/semaphore.js.map +1 -1
  248. package/dist/workspace/ui-state.d.ts +13 -3
  249. package/dist/workspace/ui-state.js +15 -5
  250. package/dist/workspace/ui-state.js.map +1 -1
  251. package/package.json +17 -39
  252. package/scripts/inline-contract.mjs +112 -0
  253. package/scripts/mock-claude.mjs +59 -1
  254. package/scripts/sync-readme.mjs +20 -0
  255. package/web/dist/assets/alert-dialog-DDkrFSNo.js +1 -0
  256. package/web/dist/assets/arrow-down-6yITIPsm.js +1 -0
  257. package/web/dist/assets/arrow-left-ClFtONFn.js +1 -0
  258. package/web/dist/assets/bundle-mjs-BT31bpU6.js +1 -0
  259. package/web/dist/assets/centered-state-B6eNyY9K.js +43 -0
  260. package/web/dist/assets/chevron-right-DU1ld4lK.js +1 -0
  261. package/web/dist/assets/{chunk-BO2N2NFS-DtrdTCWa.js → chunk-BO2N2NFS-DE6qKn3r.js} +8 -8
  262. package/web/dist/assets/circle-check-CrpGUTuT.js +1 -0
  263. package/web/dist/assets/circle-x-BswQ4rx0.js +1 -0
  264. package/web/dist/assets/collapsible-Cv8ki6G4.js +1 -0
  265. package/web/dist/assets/commit-list-Bwor0g70.js +1 -0
  266. package/web/dist/assets/compare-variants-BA3qQSVU.js +1 -0
  267. package/web/dist/assets/{core-DePtBHcl.js → core-BCsw8oQw.js} +1 -1
  268. package/web/dist/assets/diff-CV5qDJ7S.js +3 -0
  269. package/web/dist/assets/diff-stat-C96SW0xK.js +1 -0
  270. package/web/dist/assets/{diff-view-DCeSegKk.js → diff-view-9Qw79-f1.js} +4 -4
  271. package/web/dist/assets/dropdown-menu-Bnk-hg8y.js +1 -0
  272. package/web/dist/assets/editable-title-veprAEpy.js +1 -0
  273. package/web/dist/assets/{ellipsis-vertical-CNnSLn5a.js → ellipsis-vertical-C8LP-M9x.js} +1 -1
  274. package/web/dist/assets/{file-D4GBh1ao.js → file-DnCwXidV.js} +1 -1
  275. package/web/dist/assets/folder-BBBuunLT.js +1 -0
  276. package/web/dist/assets/{git-pull-request-DnR8Xh4_.js → git-pull-request-BuHs3KJ6.js} +1 -1
  277. package/web/dist/assets/git-toolbar-CPt4JoOj.js +1 -0
  278. package/web/dist/assets/github-Cz2tagoB.js +1 -0
  279. package/web/dist/assets/highlighted-body-OFNGDK62-BL-MfFgl.js +1 -0
  280. package/web/dist/assets/highlighter-CdHqIwFr.js +3 -0
  281. package/web/dist/assets/image-preview-B-UiFJKd.js +1 -0
  282. package/web/dist/assets/index-B84F80Q8.css +2 -0
  283. package/web/dist/assets/index-CkXaC99i.js +6 -0
  284. package/web/dist/assets/lib-BQXq3kEf.js +1 -0
  285. package/web/dist/assets/lib-BxQXEXDF.js +1 -0
  286. package/web/dist/assets/markdown-B0APBJCK.js +2 -0
  287. package/web/dist/assets/mermaid-GHXKKRXX-C4jxqUUb.js +1 -0
  288. package/web/dist/assets/new-task-form-BjNLkW4w.js +1 -0
  289. package/web/dist/assets/pill-DF3ZRiuk.js +1 -0
  290. package/web/dist/assets/project-router-DMinES4q.js +1 -0
  291. package/web/dist/assets/prompt-templates-CKnyW-ae.js +15 -0
  292. package/web/dist/assets/react-runtime-CCIEwYL0.js +9 -0
  293. package/web/dist/assets/{refresh-cw-BT8E96Tm.js → refresh-cw-BTiJYD2N.js} +1 -1
  294. package/web/dist/assets/repo-git-BovGLcYW.js +1 -0
  295. package/web/dist/assets/rolldown-runtime-QTnfLwEv.js +1 -0
  296. package/web/dist/assets/run-diff-BVWjG5af.js +3 -0
  297. package/web/dist/assets/run-header-CEr8j77z.js +1 -0
  298. package/web/dist/assets/{search-x-BDjaMrzG.js → search-x--hctwQW4.js} +1 -1
  299. package/web/dist/assets/skill-empty-hint-DXlK1qF5.js +1 -0
  300. package/web/dist/assets/skills-BiWfHmCR.js +1 -0
  301. package/web/dist/assets/skills-DpxiSJPs.js +1 -0
  302. package/web/dist/assets/sparkles-BSB94GWf.js +1 -0
  303. package/web/dist/assets/{square-terminal-Ckjjn0vb.js → square-terminal-DI9vN2oU.js} +1 -1
  304. package/web/dist/assets/tab-link-xE17QWo3.js +1 -0
  305. package/web/dist/assets/task-changes-DzQ0clq-.js +1 -0
  306. package/web/dist/assets/task-commits-BRvrT2AH.js +1 -0
  307. package/web/dist/assets/task-files-Bw84_sPi.js +2 -0
  308. package/web/dist/assets/task-thread-BT4gX0y6.js +9 -0
  309. package/web/dist/assets/textarea-CxwpSdn4.js +1 -0
  310. package/web/dist/assets/thread-loading-lFlqLRN5.js +1 -0
  311. package/web/dist/assets/{trash-2-DAyZ0VSi.js → trash-2-COvilYIt.js} +1 -1
  312. package/web/dist/assets/{triangle-alert-Uy8rokUh.js → triangle-alert-BVqzlcpl.js} +1 -1
  313. package/web/dist/assets/{upload-CDdyPPo_.js → upload-Ctrt-DXu.js} +1 -1
  314. package/web/dist/assets/use-desktop-BzoSqrBi.js +1 -0
  315. package/web/dist/assets/use-submit-shortcut-C-M46aas.js +1 -0
  316. package/web/dist/assets/utils-Dfe0KwV2.js +64 -0
  317. package/web/dist/assets/workflows-B1wIdn-o.js +11 -0
  318. package/web/dist/assets/zoomable-image-D0J9qb-_.js +1 -0
  319. package/web/dist/index.html +33 -13
  320. package/scripts/dev.mjs +0 -74
  321. package/scripts/release-snapshot.mjs +0 -130
  322. package/scripts/release.mjs +0 -119
  323. package/web/dist/assets/arrow-left-CnSdp92h.js +0 -1
  324. package/web/dist/assets/bundle-mjs-BegPhL5c.js +0 -1
  325. package/web/dist/assets/centered-state-DOsTcJZF.js +0 -43
  326. package/web/dist/assets/commit-list-BrxBEzRK.js +0 -1
  327. package/web/dist/assets/compare-variants-Bv2c9ORF.js +0 -1
  328. package/web/dist/assets/dist-B6XQOhgM.js +0 -1
  329. package/web/dist/assets/git-toolbar-pIC1ubPM.js +0 -1
  330. package/web/dist/assets/github-DTTSG0ht.js +0 -1
  331. package/web/dist/assets/highlighted-body-OFNGDK62-BuFJwunK.js +0 -1
  332. package/web/dist/assets/image-preview-DEhW0TFz.js +0 -1
  333. package/web/dist/assets/index-Cijmlz7q.js +0 -30
  334. package/web/dist/assets/index-DzroxqBG.css +0 -2
  335. package/web/dist/assets/lib-DPEZDBUN.js +0 -1
  336. package/web/dist/assets/lib-uHpeUPzK.js +0 -1
  337. package/web/dist/assets/mermaid-GHXKKRXX-CN2zQue0.js +0 -1
  338. package/web/dist/assets/open-mercato-toBr6SOa.svg +0 -11
  339. package/web/dist/assets/project-router-BMx4e8m-.js +0 -1
  340. package/web/dist/assets/repo-git-BusYfa3t.js +0 -1
  341. package/web/dist/assets/run-diff-wOJ3odA-.js +0 -3
  342. package/web/dist/assets/run-header-Cg5incil.js +0 -1
  343. package/web/dist/assets/skill-empty-hint-DTUSp6Vl.js +0 -1
  344. package/web/dist/assets/skills-PpP2owbM.js +0 -1
  345. package/web/dist/assets/tab-link-F3uQrdm2.js +0 -1
  346. package/web/dist/assets/task-changes-iD9kS79I.js +0 -1
  347. package/web/dist/assets/task-commits-COkLaUri.js +0 -1
  348. package/web/dist/assets/task-files-Ckttz7XH.js +0 -2
  349. package/web/dist/assets/task-thread-CQD91VPt.js +0 -9
  350. package/web/dist/assets/textarea-Bj_LCreg.js +0 -1
  351. package/web/dist/assets/use-desktop-DUh0STzq.js +0 -3
  352. package/web/dist/assets/utils-B8s5qIcK.js +0 -1
  353. package/web/dist/assets/workflows-BFk8C0co.js +0 -11
  354. package/web/dist/assets/zoomable-image-PEDOqyLQ.js +0 -1
  355. /package/web/{open-mercato.svg → dist/open-mercato.svg} +0 -0
@@ -1,5 +1,6 @@
1
1
  import { readFile } from 'node:fs/promises';
2
2
  import { join } from 'node:path';
3
+ import { workspaceUiStateSchema } from '../contract/index.js';
3
4
  import { cezarHomeDir, workspaceConfigPath } from '../paths.js';
4
5
  import { readUiState } from '../ui-state.js';
5
6
  import { loadWorkspaceConfig, mergeWriteWorkspaceConfig } from './config.js';
@@ -82,13 +83,27 @@ const migration001 = {
82
83
  if (!bootRepoRoot)
83
84
  return;
84
85
  const repoUiState = await readUiState(bootRepoRoot);
85
- const uiKeys = ['appearance', 'notifications'].filter((key) => repoUiState[key] !== undefined);
86
- if (uiKeys.length === 0)
86
+ // The two prefs that went GLOBAL at step 3.5, read out of the per-repo bag and validated with
87
+ // the DESTINATION's own field schemas. `notifications` is not named by the per-repo contract
88
+ // at all (it left at 3.5), so it arrives through the open catchall as `unknown` — parsing it
89
+ // here is what makes it assignable, and it is also the honest thing: `GET /workspace/ui-state`
90
+ // promises these two keys' shapes, so a hand-edited value must not be promoted into the global
91
+ // file unchecked. A value that does not parse is simply not imported — never a failed boot.
92
+ const shape = workspaceUiStateSchema.shape;
93
+ const importable = {};
94
+ const appearance = shape.appearance.safeParse(repoUiState.appearance);
95
+ if (appearance.success && appearance.data !== undefined)
96
+ importable.appearance = appearance.data;
97
+ const notifications = shape.notifications.safeParse(repoUiState.notifications);
98
+ if (notifications.success && notifications.data !== undefined) {
99
+ importable.notifications = notifications.data;
100
+ }
101
+ if (Object.keys(importable).length === 0)
87
102
  return; // nothing to import — don't create the file
88
103
  await mergeWriteWorkspaceUiState((state) => {
89
- for (const key of uiKeys) {
104
+ for (const [key, value] of Object.entries(importable)) {
90
105
  if (state[key] === undefined)
91
- state[key] = repoUiState[key];
106
+ state[key] = value;
92
107
  }
93
108
  });
94
109
  },
@@ -1 +1 @@
1
- {"version":3,"file":"migrations.js","sourceRoot":"","sources":["../../src/workspace/migrations.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"migrations.js","sourceRoot":"","sources":["../../src/workspace/migrations.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,5 @@
1
- import { type WorkspaceProject } from './config.js';
1
+ import { type ForgeKind } from '../server/forge/index.ts';
2
+ import { type WorkspaceProject } from './config.ts';
2
3
  /**
3
4
  * Project registry operations over `~/.cezar/config.json` (spec
4
5
  * 2026-07-20-multi-project-workspace, "Project identity" + "Boot flow"):
@@ -54,6 +55,11 @@ export interface ProjectListEntry extends WorkspaceProject {
54
55
  status: ProjectStatus;
55
56
  /** Current branch when cheaply available (omitted e.g. on an unborn HEAD). */
56
57
  branch?: string;
58
+ /** Which forge the root's remote belongs to (#698) — classified from the
59
+ * remote URL alone, no `gh` probe. Omitted when there is no forge remote.
60
+ * The sidebar gates each project group's GitHub tab on this, instead of on
61
+ * the boot folder's health-level forge answer. */
62
+ forge?: ForgeKind;
57
63
  }
58
64
  /** Test hook: drop cached probes so status changes are visible immediately. */
59
65
  export declare function clearProjectProbeCache(): void;
@@ -64,7 +70,7 @@ export declare function clearProjectProbeCache(): void;
64
70
  * SAME shape the list route does — one project, one shape, whichever route
65
71
  * produced it.
66
72
  */
67
- export declare function probeProjectStatus(root: string): Promise<Pick<ProjectListEntry, 'status' | 'branch'>>;
73
+ export declare function probeProjectStatus(root: string): Promise<Pick<ProjectListEntry, 'status' | 'branch' | 'forge'>>;
68
74
  /**
69
75
  * Registry entries in stored order, each with its `status` (+`branch` when
70
76
  * available). Probes run concurrently and are TTL-cached per root. A
@@ -1,6 +1,7 @@
1
1
  import { realpath, stat } from 'node:fs/promises';
2
2
  import { homedir } from 'node:os';
3
3
  import { basename, join, resolve, sep } from 'node:path';
4
+ import { forgeKindOfRemote } from '../server/forge/index.js';
4
5
  import { getRepoInfo } from '../server/git.js';
5
6
  import { mergeWriteWorkspaceConfig, loadWorkspaceConfig, } from './config.js';
6
7
  /**
@@ -163,10 +164,15 @@ async function computeProbe(root) {
163
164
  catch {
164
165
  return { status: 'not-git' };
165
166
  }
166
- // Branch is best-effort garnish: getRepoInfo never throws (null on e.g. an
167
- // unborn HEAD), and a repo without a readable branch is still status ok.
167
+ // Branch and forge are best-effort garnish: getRepoInfo never throws (null
168
+ // on e.g. an unborn HEAD), and a repo without either is still status ok.
168
169
  const info = await getRepoInfo(root);
169
- return info?.branch ? { status: 'ok', branch: info.branch } : { status: 'ok' };
170
+ const forge = forgeKindOfRemote(info?.remote);
171
+ return {
172
+ status: 'ok',
173
+ ...(info?.branch ? { branch: info.branch } : {}),
174
+ ...(forge ? { forge } : {}),
175
+ };
170
176
  }
171
177
  async function probeRoot(root) {
172
178
  const cached = probeCache.get(root);
@@ -1 +1 @@
1
- {"version":3,"file":"projects.js","sourceRoot":"","sources":["../../src/workspace/projects.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"projects.js","sourceRoot":"","sources":["../../src/workspace/projects.ts"],"names":[],"mappings":"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"}
@@ -31,6 +31,12 @@
31
31
  export interface WorkspaceResourceLimits {
32
32
  /** Workspace-wide cap on concurrently *running* agent runs. */
33
33
  maxParallel: number;
34
+ /** Durable monitoring sessions that do not consume active-task capacity. */
35
+ maxMonitoringSessions?: number;
36
+ /** Optional automatic monitoring re-check cadence; null means stay parked. */
37
+ monitoringWakeIntervalMinutes?: number | null;
38
+ /** Resume a run stopped by a provider usage limit when that limit resets. Default ON. */
39
+ autoResumeOnUsageLimit?: boolean;
34
40
  /** Per-task process-tree memory ceiling in MiB; null = no limit. */
35
41
  memoryLimitMb: number | null;
36
42
  /**
@@ -42,6 +48,20 @@ export interface WorkspaceResourceLimits {
42
48
  */
43
49
  projectLimits?: ReadonlyMap<string, number>;
44
50
  }
51
+ /**
52
+ * The two kinds of usage-limit hold an account can be under, kept apart because they bind
53
+ * different work (spec 2026-08-03-auto-resume-after-usage-limit):
54
+ *
55
+ * - `deadline` — a run is parked on a reset instant that has not arrived. The window is known to
56
+ * be shut, so this blocks EVERYTHING on that account, resumes included.
57
+ * - `inFlight` — a resume is running right now, re-testing the window. Nothing is proven yet, so
58
+ * this blocks fresh work but NOT other resumes: a resume blocked by a resume is the deadlock
59
+ * that stopped a live workspace dead.
60
+ */
61
+ export interface AccountHolds {
62
+ deadline: ReadonlySet<string>;
63
+ inFlight: ReadonlySet<string>;
64
+ }
45
65
  /** One manager's seam into the shared counter. */
46
66
  export interface SemaphoreParticipant {
47
67
  /** Slots this manager currently holds. The #347 exemption lives in the
@@ -56,6 +76,15 @@ export interface SemaphoreParticipant {
56
76
  * workspace's longest-waiting run instead of whichever manager happens to
57
77
  * have registered first. */
58
78
  oldestQueuedAt(): number | null;
79
+ /**
80
+ * Agent accounts this participant is holding, by KIND (spec
81
+ * 2026-08-03-auto-resume-after-usage-limit, `RunManager.accountHolds`).
82
+ *
83
+ * Workspace-scoped for the same reason the parallel cap is: a limit closes an ACCOUNT, and one
84
+ * account can be driving tasks in several projects at once. Optional so a stub participant —
85
+ * and any caller that predates the hold — keeps working; absent simply holds nothing.
86
+ */
87
+ accountHolds?(): AccountHolds;
59
88
  }
60
89
  export interface WorkspaceSemaphoreOptions {
61
90
  /** Snapshot source for `refresh()` — tests inject a stub; production keeps
@@ -84,8 +113,24 @@ export declare class WorkspaceSemaphore {
84
113
  busy(): number;
85
114
  /** Cached workspace-wide parallel cap. */
86
115
  maxParallel(): number;
116
+ maxMonitoringSessions(): number;
117
+ monitoringWakeIntervalMinutes(): number | null;
118
+ /** Whether a usage-limit stop schedules its own resume. Absent (an older `load` stub, a config
119
+ * written before the key existed) reads as ON — the shipped default. */
120
+ autoResumeOnUsageLimit(): boolean;
87
121
  /** Cached per-task memory ceiling (MiB), or null for no limit. */
88
122
  memoryLimitMb(): number | null;
123
+ /**
124
+ * Every agent account held across the WHOLE workspace, by kind — the union of what each manager
125
+ * reports (spec 2026-08-03-auto-resume-after-usage-limit). A `pump()` consults this before
126
+ * starting a queued run, so a limit hit in one project also stops the same account being walked
127
+ * into the wall from another.
128
+ *
129
+ * Asked live rather than cached: the underlying answer is derived from run records that change
130
+ * on every schedule, resume and cancel, and a stale snapshot here would either stall a queue
131
+ * whose window has reopened or leak a stampede through one that has not.
132
+ */
133
+ accountHolds(): AccountHolds;
89
134
  /**
90
135
  * A slot came free somewhere in the workspace: pump EVERY manager,
91
136
  * longest-waiting-queue first.
@@ -13,7 +13,13 @@ function normalizeRootSync(root) {
13
13
  return resolve(root);
14
14
  }
15
15
  }
16
- const DEFAULT_LIMITS = { maxParallel: 2, memoryLimitMb: null };
16
+ const DEFAULT_LIMITS = {
17
+ maxParallel: 2,
18
+ maxMonitoringSessions: 2,
19
+ monitoringWakeIntervalMinutes: null,
20
+ autoResumeOnUsageLimit: true,
21
+ memoryLimitMb: null,
22
+ };
17
23
  /** Production loader: the `resources` slice of `~/.cezar/config.json`
18
24
  * (schema-defaulted, so a missing/corrupt file yields the zero-config 2/null),
19
25
  * plus the per-project `maxParallel` overrides built into a root→limit map.
@@ -28,6 +34,9 @@ async function loadResourceLimits() {
28
34
  }
29
35
  return {
30
36
  maxParallel: resources.maxParallel,
37
+ maxMonitoringSessions: resources.maxMonitoringSessions,
38
+ monitoringWakeIntervalMinutes: resources.monitoringWakeIntervalMinutes,
39
+ autoResumeOnUsageLimit: resources.autoResumeOnUsageLimit,
31
40
  memoryLimitMb: resources.memoryLimitMb,
32
41
  projectLimits,
33
42
  };
@@ -63,10 +72,45 @@ export class WorkspaceSemaphore {
63
72
  maxParallel() {
64
73
  return this.limits.maxParallel;
65
74
  }
75
+ maxMonitoringSessions() {
76
+ return this.limits.maxMonitoringSessions ?? 2;
77
+ }
78
+ monitoringWakeIntervalMinutes() {
79
+ return this.limits.monitoringWakeIntervalMinutes ?? null;
80
+ }
81
+ /** Whether a usage-limit stop schedules its own resume. Absent (an older `load` stub, a config
82
+ * written before the key existed) reads as ON — the shipped default. */
83
+ autoResumeOnUsageLimit() {
84
+ return this.limits.autoResumeOnUsageLimit ?? true;
85
+ }
66
86
  /** Cached per-task memory ceiling (MiB), or null for no limit. */
67
87
  memoryLimitMb() {
68
88
  return this.limits.memoryLimitMb;
69
89
  }
90
+ /**
91
+ * Every agent account held across the WHOLE workspace, by kind — the union of what each manager
92
+ * reports (spec 2026-08-03-auto-resume-after-usage-limit). A `pump()` consults this before
93
+ * starting a queued run, so a limit hit in one project also stops the same account being walked
94
+ * into the wall from another.
95
+ *
96
+ * Asked live rather than cached: the underlying answer is derived from run records that change
97
+ * on every schedule, resume and cancel, and a stale snapshot here would either stall a queue
98
+ * whose window has reopened or leak a stampede through one that has not.
99
+ */
100
+ accountHolds() {
101
+ const deadline = new Set();
102
+ const inFlight = new Set();
103
+ for (const participant of this.participants) {
104
+ const holds = participant.accountHolds?.();
105
+ if (!holds)
106
+ continue;
107
+ for (const key of holds.deadline)
108
+ deadline.add(key);
109
+ for (const key of holds.inFlight)
110
+ inFlight.add(key);
111
+ }
112
+ return { deadline, inFlight };
113
+ }
70
114
  /**
71
115
  * A slot came free somewhere in the workspace: pump EVERY manager,
72
116
  * longest-waiting-queue first.
@@ -1 +1 @@
1
- {"version":3,"file":"semaphore.js","sourceRoot":"","sources":["../../src/workspace/semaphore.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"semaphore.js","sourceRoot":"","sources":["../../src/workspace/semaphore.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,4 @@
1
+ import type { WorkspaceUiState } from '../contract/index.js';
1
2
  /**
2
3
  * `~/.cezar/ui-state.json` — global GUI state, the workspace twin of the
3
4
  * per-repo `.ai/cezar/ui-state.json` (spec 2026-07-20-multi-project-workspace,
@@ -9,8 +10,13 @@
9
10
  * repo's own file.
10
11
  */
11
12
  /** Read `~/.cezar/ui-state.json` on demand — never cached, never throws.
12
- * Missing, unreadable, malformed, or non-object all degrade to `{}`. */
13
- export declare function readWorkspaceUiState(): Promise<Record<string, unknown>>;
13
+ * Missing, unreadable, malformed, or non-object all degrade to `{}`.
14
+ *
15
+ * Typed by the CONTRACT (`WorkspaceUiState`) for the same reason as its per-repo twin in
16
+ * `src/ui-state.ts`: `GET /api/v1/workspace/ui-state` answers this value verbatim, so a loose
17
+ * record left the route naming no key. The schema is a `z.looseObject`, so unknown prefs keep
18
+ * round-tripping (BACKWARD_COMPATIBILITY.md §3) — the type only adds the known names. */
19
+ export declare function readWorkspaceUiState(path?: string): Promise<WorkspaceUiState>;
14
20
  /**
15
21
  * Read-modify-write for `~/.cezar/ui-state.json`, written with the same atomic
16
22
  * per-writer tmp+rename `0600` pattern (dir `0700`) as
@@ -19,5 +25,9 @@ export declare function readWorkspaceUiState(): Promise<Record<string, unknown>>
19
25
  * corrupt file merges from `{}`. The mutator may mutate its argument in place
20
26
  * or return a replacement. Throws on write failure (e.g. a read-only home) —
21
27
  * degrading is the caller's policy, per house rules.
28
+ *
29
+ * Path resolved once, before the `await`, for the same reason as
30
+ * `mergeWriteWorkspaceConfig`: a `CEZ_HOME` that changes mid-flight must not be
31
+ * able to send the read and the write to two different files.
22
32
  */
23
- export declare function mergeWriteWorkspaceUiState(mutator: (state: Record<string, unknown>) => Record<string, unknown> | void): Promise<Record<string, unknown>>;
33
+ export declare function mergeWriteWorkspaceUiState(mutator: (state: WorkspaceUiState) => WorkspaceUiState | void): Promise<WorkspaceUiState>;
@@ -12,10 +12,15 @@ import { atomicWriteJsonSync } from './config.js';
12
12
  * repo's own file.
13
13
  */
14
14
  /** Read `~/.cezar/ui-state.json` on demand — never cached, never throws.
15
- * Missing, unreadable, malformed, or non-object all degrade to `{}`. */
16
- export async function readWorkspaceUiState() {
15
+ * Missing, unreadable, malformed, or non-object all degrade to `{}`.
16
+ *
17
+ * Typed by the CONTRACT (`WorkspaceUiState`) for the same reason as its per-repo twin in
18
+ * `src/ui-state.ts`: `GET /api/v1/workspace/ui-state` answers this value verbatim, so a loose
19
+ * record left the route naming no key. The schema is a `z.looseObject`, so unknown prefs keep
20
+ * round-tripping (BACKWARD_COMPATIBILITY.md §3) — the type only adds the known names. */
21
+ export async function readWorkspaceUiState(path = workspaceUiStatePath()) {
17
22
  try {
18
- const parsed = JSON.parse(await readFile(workspaceUiStatePath(), 'utf8'));
23
+ const parsed = JSON.parse(await readFile(path, 'utf8'));
19
24
  return parsed !== null && typeof parsed === 'object' && !Array.isArray(parsed)
20
25
  ? parsed
21
26
  : {};
@@ -32,11 +37,16 @@ export async function readWorkspaceUiState() {
32
37
  * corrupt file merges from `{}`. The mutator may mutate its argument in place
33
38
  * or return a replacement. Throws on write failure (e.g. a read-only home) —
34
39
  * degrading is the caller's policy, per house rules.
40
+ *
41
+ * Path resolved once, before the `await`, for the same reason as
42
+ * `mergeWriteWorkspaceConfig`: a `CEZ_HOME` that changes mid-flight must not be
43
+ * able to send the read and the write to two different files.
35
44
  */
36
45
  export async function mergeWriteWorkspaceUiState(mutator) {
37
- const current = await readWorkspaceUiState();
46
+ const path = workspaceUiStatePath();
47
+ const current = await readWorkspaceUiState(path);
38
48
  const next = mutator(current) ?? current;
39
- atomicWriteJsonSync(workspaceUiStatePath(), next);
49
+ atomicWriteJsonSync(path, next);
40
50
  return next;
41
51
  }
42
52
  //# sourceMappingURL=ui-state.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ui-state.js","sourceRoot":"","sources":["../../src/workspace/ui-state.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAElD;;;;;;;;;GASG;AAEH;yEACyE;AACzE,MAAM,CAAC,KAAK,UAAU,oBAAoB;IACxC,IAAI,CAAC;QACH,MAAM,MAAM,GAAY,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,oBAAoB,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC;QACnF,OAAO,MAAM,KAAK,IAAI,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;YAC5E,CAAC,CAAE,MAAkC;YACrC,CAAC,CAAC,EAAE,CAAC;IACT,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAC9C,OAA2E;IAE3E,MAAM,OAAO,GAAG,MAAM,oBAAoB,EAAE,CAAC;IAC7C,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC;IACzC,mBAAmB,CAAC,oBAAoB,EAAE,EAAE,IAAI,CAAC,CAAC;IAClD,OAAO,IAAI,CAAC;AACd,CAAC"}
1
+ {"version":3,"file":"ui-state.js","sourceRoot":"","sources":["../../src/workspace/ui-state.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAE5C,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAElD;;;;;;;;;GASG;AAEH;;;;;;0FAM0F;AAC1F,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,IAAI,GAAW,oBAAoB,EAAE;IAErC,IAAI,CAAC;QACH,MAAM,MAAM,GAAY,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;QACjE,OAAO,MAAM,KAAK,IAAI,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;YAC5E,CAAC,CAAE,MAA2B;YAC9B,CAAC,CAAC,EAAE,CAAC;IACT,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAC9C,OAA6D;IAE7D,MAAM,IAAI,GAAG,oBAAoB,EAAE,CAAC;IACpC,MAAM,OAAO,GAAG,MAAM,oBAAoB,CAAC,IAAI,CAAC,CAAC;IACjD,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC;IACzC,mBAAmB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAChC,OAAO,IAAI,CAAC;AACd,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@open-mercato/cezar",
3
- "version": "0.9.1",
3
+ "version": "0.9.2-pr778.1064",
4
4
  "description": "Local cockpit for running and tracking AI agent tasks in your repo. Uses your logged-in `claude` CLI and `gh` — zero config, zero database.",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -9,9 +9,13 @@
9
9
  "cez": "dist/index.js",
10
10
  "cezar-cli": "dist/index.js"
11
11
  },
12
+ "exports": {
13
+ ".": "./dist/index.js",
14
+ "./app-type": "./dist/server/app-type.js",
15
+ "./package.json": "./package.json"
16
+ },
12
17
  "files": [
13
18
  "dist",
14
- "web/open-mercato.svg",
15
19
  "web/dist",
16
20
  "scripts",
17
21
  "README.md"
@@ -20,27 +24,22 @@
20
24
  "node": ">=20"
21
25
  },
22
26
  "scripts": {
23
- "build": "tsc && npm run build:web && npm run check:pack",
24
- "build:web": "vite build --config web/app/vite.config.ts",
27
+ "prebuild": "node scripts/sync-readme.mjs",
28
+ "build": "tsc",
25
29
  "check:pack": "node scripts/check-pack.mjs",
26
- "dev": "node scripts/dev.mjs",
30
+ "dev": "tsx src/index.ts",
27
31
  "install-as-command": "node scripts/install-as-command.mjs --mode link",
28
32
  "install-as-command:global": "node scripts/install-as-command.mjs --mode global",
29
33
  "uninstall-as-command": "node scripts/install-as-command.mjs --mode uninstall",
30
- "dev:server": "tsx src/index.ts",
31
34
  "server-install": "tsx src/index.ts server-install",
32
35
  "server-deploy": "tsx src/index.ts server-deploy",
33
36
  "server-uninstall": "tsx src/index.ts server-uninstall",
34
- "dev:web": "vite --config web/app/vite.config.ts",
35
37
  "test": "vitest run",
36
38
  "test:watch": "vitest",
37
39
  "test:unit": "node --import tsx --test test/unit/*.test.ts",
38
40
  "test:package": "node --import tsx --test test/e2e/*.test.ts",
39
- "test:e2e": "sh .ai/scripts/e2e.sh",
40
- "typecheck": "npm run typecheck:server && npm run typecheck:web",
41
- "typecheck:server": "tsc --noEmit -p tsconfig.test.json",
42
- "typecheck:web": "tsc --noEmit -p web/app/tsconfig.json",
43
- "prepublishOnly": "npm run build"
41
+ "typecheck": "tsc --noEmit -p tsconfig.test.json",
42
+ "postbuild": "node scripts/inline-contract.mjs"
44
43
  },
45
44
  "dependencies": {
46
45
  "@clack/prompts": "^0.11.0",
@@ -49,43 +48,22 @@
49
48
  "smol-toml": "^1.7.0",
50
49
  "ws": "^8.21.1",
51
50
  "yaml": "^2.5.0",
52
- "zod": "^3.23.0"
51
+ "zod": "^4.4.3"
53
52
  },
54
53
  "devDependencies": {
55
- "@dnd-kit/core": "^6.3.1",
56
- "@dnd-kit/sortable": "^10.0.0",
57
- "@dnd-kit/utilities": "^3.2.2",
58
- "@tailwindcss/vite": "^4.3.2",
59
- "@tanstack/react-query": "^5.101.2",
60
- "@testing-library/react": "^16.3.2",
54
+ "@open-mercato/cezar-api-client": "0.9.2-pr778.1064",
55
+ "@open-mercato/cezar-contract": "0.9.2-pr778.1064",
61
56
  "@types/node": "^20.14.0",
62
- "@types/react": "^19.2.17",
63
- "@types/react-dom": "^19.2.3",
64
57
  "@types/ws": "^8.18.1",
65
- "@vitejs/plugin-react": "^6.0.3",
66
- "class-variance-authority": "^0.7.1",
67
- "clsx": "^2.1.1",
68
- "cmdk": "^1.1.1",
69
- "jsdom": "^29.1.1",
70
- "lucide-react": "^1.24.0",
71
- "radix-ui": "^1.6.2",
72
- "react": "^19.2.7",
73
- "react-dom": "^19.2.7",
74
- "react-router": "^7.18.1",
75
- "shiki": "^4.3.1",
76
- "streamdown": "^2.5.0",
77
- "tailwind-merge": "^3.6.0",
78
- "tailwindcss": "^4.3.2",
58
+ "esbuild": "^0.28.1",
79
59
  "tsx": "^4.19.0",
80
- "tw-animate-css": "^1.4.0",
81
60
  "typescript": "^7.0.2",
82
- "virtua": "^0.49.3",
83
- "vite": "^8.1.4",
84
61
  "vitest": "^4.1.10"
85
62
  },
86
63
  "repository": {
87
64
  "type": "git",
88
- "url": "https://github.com/open-mercato/cezar"
65
+ "url": "https://github.com/open-mercato/cezar",
66
+ "directory": "packages/cezar"
89
67
  },
90
68
  "publishConfig": {
91
69
  "access": "public"
@@ -0,0 +1,112 @@
1
+ /**
2
+ * Bundle `@open-mercato/cezar-contract` into `dist` after `tsc`.
3
+ *
4
+ * The contract and the api-client are PRIVATE and ship no build of their own — they are linked as
5
+ * workspace packages and consumed as TypeScript source, which is what every other consumer wants:
6
+ * the cockpit's Vite bundles them, vitest transforms them.
7
+ *
8
+ * This package is the exception, because it is PUBLISHED. `workspace/migrations.ts` imports
9
+ * `workspaceUiStateSchema` — a zod value, not a type — so the installed CLI resolves the contract
10
+ * at runtime, and a tarball naming a package npm has never seen would fail on install. So the
11
+ * build folds it in: esbuild compiles the contract's source to one ESM file under `dist/contract/`,
12
+ * `tsc` emits its declarations beside it, and the emitted references are repointed at both.
13
+ *
14
+ * Nothing is copied at the SOURCE level — the package graph still states the dependency, and this
15
+ * runs only when `dist` actually names it. Delete this the day the contract is published, or the
16
+ * day nothing here imports a contract VALUE.
17
+ *
18
+ * DECLARATIONS ship next to the bundle, and that is not optional. The scan below matches `.d.ts`
19
+ * as well as `.js`, so emitted type imports get repointed too (`dist/ui-state.d.ts` names
20
+ * `WorkspaceUiState`). esbuild emits JavaScript only, so a bundle on its own leaves those
21
+ * declarations naming a module TypeScript cannot resolve — `TS7016`, and the type silently
22
+ * degrades to `any` for anyone consuming the published package. Every tsconfig here sets
23
+ * `skipLibCheck`, so nothing in this repo would have said a word. `tsc --emitDeclarationOnly`
24
+ * mirrors the contract's `src` tree into `dist/contract/`, which is what makes
25
+ * `./contract/index.js` resolve to a real `./contract/index.d.ts`.
26
+ */
27
+ import { execFileSync } from 'node:child_process';
28
+ import { createRequire } from 'node:module';
29
+ import { existsSync, readdirSync, readFileSync, rmSync, writeFileSync } from 'node:fs';
30
+ import { dirname, join, relative } from 'node:path';
31
+ import { fileURLToPath } from 'node:url';
32
+ import { build } from 'esbuild';
33
+
34
+ const here = dirname(fileURLToPath(import.meta.url));
35
+ const dist = join(here, '..', 'dist');
36
+ const contractRoot = join(here, '..', '..', 'contract');
37
+ const entry = join(contractRoot, 'src', 'index.ts');
38
+ const outdir = join(dist, 'contract');
39
+ const SPEC = /(['"])@open-mercato\/cezar-contract\1/g;
40
+
41
+ /** Emitted files that name the package — the copy happens only if it is really used. */
42
+ const referrers = [];
43
+ const scan = (dir) => {
44
+ for (const entry of readdirSync(dir, { withFileTypes: true })) {
45
+ const p = join(dir, entry.name);
46
+ if (entry.isDirectory()) {
47
+ if (p !== outdir) scan(p);
48
+ } else if (/\.(js|d\.ts|js\.map)$/.test(entry.name)) {
49
+ SPEC.lastIndex = 0;
50
+ if (SPEC.test(readFileSync(p, 'utf8'))) referrers.push(p);
51
+ }
52
+ }
53
+ };
54
+ scan(dist);
55
+
56
+ rmSync(outdir, { recursive: true, force: true });
57
+ if (referrers.length === 0) {
58
+ console.log('inline-contract ok — nothing in dist references the contract, nothing bundled');
59
+ process.exit(0);
60
+ }
61
+
62
+ // `zod` stays external: it is a real dependency of this package, so npm resolves it normally and
63
+ // the tarball does not carry a second copy.
64
+ await build({
65
+ entryPoints: [entry],
66
+ outfile: join(outdir, 'index.js'),
67
+ bundle: true,
68
+ format: 'esm',
69
+ platform: 'neutral',
70
+ target: 'es2022',
71
+ external: ['zod'],
72
+ });
73
+
74
+ // `tsc` is located through the module graph rather than a guessed `node_modules` path, because
75
+ // `typescript` is a devDependency of THIS package and may sit here or be hoisted to the workspace
76
+ // root. Via the manifest's own `bin` entry: TypeScript 7's `exports` map does not publish
77
+ // `./bin/tsc`, so resolving that subpath directly is ERR_PACKAGE_PATH_NOT_EXPORTED.
78
+ const require_ = createRequire(import.meta.url);
79
+ const tsManifest = require_.resolve('typescript/package.json');
80
+ const tscBin = join(dirname(tsManifest), require_(tsManifest).bin.tsc);
81
+
82
+ // The declarations for the bundle above. `tsc` mirrors `src/**` into `outdir`, so `index.d.ts`
83
+ // lands beside `index.js` and its relative siblings (`./health.js` → `./health.d.ts`) resolve as
84
+ // TypeScript expects. Those siblings have no runtime twin, which is correct: the bundle is
85
+ // self-contained and nothing imports those paths at runtime.
86
+ execFileSync(
87
+ process.execPath,
88
+ [
89
+ tscBin,
90
+ '--project',
91
+ join(contractRoot, 'tsconfig.json'),
92
+ '--emitDeclarationOnly',
93
+ '--declarationMap',
94
+ 'false',
95
+ '--sourceMap',
96
+ 'false',
97
+ '--outDir',
98
+ outdir,
99
+ ],
100
+ { stdio: 'inherit' },
101
+ );
102
+ if (!existsSync(join(outdir, 'index.d.ts'))) {
103
+ console.error('inline-contract: tsc emitted no index.d.ts — the bundled contract would ship untyped');
104
+ process.exit(1);
105
+ }
106
+
107
+ for (const p of referrers) {
108
+ let rel = relative(dirname(p), join(outdir, 'index.js')).replaceAll('\\', '/');
109
+ if (!rel.startsWith('.')) rel = `./${rel}`;
110
+ writeFileSync(p, readFileSync(p, 'utf8').replace(SPEC, `'${rel}'`), 'utf8');
111
+ }
112
+ console.log(`inline-contract ok — contract bundled with declarations, ${referrers.length} file(s) repointed`);