@open-mercato/cezar 0.13.0 → 0.14.0

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 (294) hide show
  1. package/README.md +3 -2
  2. package/dist/agent-config/catalog.d.ts +4 -0
  3. package/dist/agent-config/catalog.js +85 -3
  4. package/dist/agent-config/catalog.js.map +1 -1
  5. package/dist/agent-config/model-settings/copilot.d.ts +15 -0
  6. package/dist/agent-config/model-settings/copilot.js +25 -0
  7. package/dist/agent-config/model-settings/copilot.js.map +1 -0
  8. package/dist/agent-config/model-settings/junie.d.ts +12 -0
  9. package/dist/agent-config/model-settings/junie.js +18 -0
  10. package/dist/agent-config/model-settings/junie.js.map +1 -0
  11. package/dist/agent-config/models.js +4 -0
  12. package/dist/agent-config/models.js.map +1 -1
  13. package/dist/automations/prompts.d.ts +2 -2
  14. package/dist/automations/prompts.js +1 -1
  15. package/dist/automations/types.d.ts +12 -0
  16. package/dist/config.d.ts +4 -0
  17. package/dist/config.js +2 -0
  18. package/dist/config.js.map +1 -1
  19. package/dist/contract/agent-config.d.ts +4 -0
  20. package/dist/contract/agent-profiles.d.ts +30 -0
  21. package/dist/contract/automations.d.ts +32 -0
  22. package/dist/contract/dashboard-insights.d.ts +186 -0
  23. package/dist/contract/dashboard.d.ts +88 -0
  24. package/dist/contract/dispatch.d.ts +6 -0
  25. package/dist/contract/health.d.ts +8 -0
  26. package/dist/contract/index.d.ts +2 -0
  27. package/dist/contract/index.js +249 -72
  28. package/dist/contract/runs.d.ts +144 -0
  29. package/dist/contract/self-update.d.ts +111 -2
  30. package/dist/contract/skills.d.ts +19 -0
  31. package/dist/contract/star-count.d.ts +18 -0
  32. package/dist/contract/workflows.d.ts +12 -0
  33. package/dist/contract/workspace.d.ts +42 -2
  34. package/dist/core/acp-client.d.ts +99 -0
  35. package/dist/core/acp-client.js +198 -0
  36. package/dist/core/acp-client.js.map +1 -0
  37. package/dist/core/acp-ui-mapper.d.ts +95 -0
  38. package/dist/core/acp-ui-mapper.js +444 -0
  39. package/dist/core/acp-ui-mapper.js.map +1 -0
  40. package/dist/core/agent-env.js +10 -0
  41. package/dist/core/agent-env.js.map +1 -1
  42. package/dist/core/agent-profiles.d.ts +10 -0
  43. package/dist/core/agent-profiles.js +16 -0
  44. package/dist/core/agent-profiles.js.map +1 -1
  45. package/dist/core/agent-runner.d.ts +5 -3
  46. package/dist/core/agent-runner.js +5 -3
  47. package/dist/core/agent-runner.js.map +1 -1
  48. package/dist/core/backend-detect.d.ts +3 -3
  49. package/dist/core/backend-detect.js +61 -2
  50. package/dist/core/backend-detect.js.map +1 -1
  51. package/dist/core/claude-cli-runner.d.ts +5 -2
  52. package/dist/core/claude-cli-runner.js +11 -6
  53. package/dist/core/claude-cli-runner.js.map +1 -1
  54. package/dist/core/claude-ui-mapper.d.ts +14 -0
  55. package/dist/core/claude-ui-mapper.js +102 -11
  56. package/dist/core/claude-ui-mapper.js.map +1 -1
  57. package/dist/core/codex-app-server-transport.js +8 -4
  58. package/dist/core/codex-app-server-transport.js.map +1 -1
  59. package/dist/core/copilot-acp-runner.d.ts +60 -0
  60. package/dist/core/copilot-acp-runner.js +528 -0
  61. package/dist/core/copilot-acp-runner.js.map +1 -0
  62. package/dist/core/copilot-ui-mapper.d.ts +47 -0
  63. package/dist/core/copilot-ui-mapper.js +111 -0
  64. package/dist/core/copilot-ui-mapper.js.map +1 -0
  65. package/dist/core/cursor-agent-runner.js +4 -4
  66. package/dist/core/cursor-agent-runner.js.map +1 -1
  67. package/dist/core/disclaim-spawn.d.ts +9 -0
  68. package/dist/core/disclaim-spawn.js +53 -0
  69. package/dist/core/disclaim-spawn.js.map +1 -0
  70. package/dist/core/junie-acp-transport.d.ts +58 -0
  71. package/dist/core/junie-acp-transport.js +179 -0
  72. package/dist/core/junie-acp-transport.js.map +1 -0
  73. package/dist/core/junie-auth-probe.d.ts +12 -0
  74. package/dist/core/junie-auth-probe.js +30 -0
  75. package/dist/core/junie-auth-probe.js.map +1 -0
  76. package/dist/core/junie-model-catalog.d.ts +10 -0
  77. package/dist/core/junie-model-catalog.js +104 -0
  78. package/dist/core/junie-model-catalog.js.map +1 -0
  79. package/dist/core/junie-runner.d.ts +45 -0
  80. package/dist/core/junie-runner.js +533 -0
  81. package/dist/core/junie-runner.js.map +1 -0
  82. package/dist/core/junie-ui-mapper.d.ts +132 -0
  83. package/dist/core/junie-ui-mapper.js +459 -0
  84. package/dist/core/junie-ui-mapper.js.map +1 -0
  85. package/dist/core/model-identity.js +17 -0
  86. package/dist/core/model-identity.js.map +1 -1
  87. package/dist/core/model-presets.js +10 -0
  88. package/dist/core/model-presets.js.map +1 -1
  89. package/dist/core/opencode-server-runner.js +4 -4
  90. package/dist/core/opencode-server-runner.js.map +1 -1
  91. package/dist/core/pi-runner.js +4 -4
  92. package/dist/core/pi-runner.js.map +1 -1
  93. package/dist/core/provider-auth.d.ts +16 -2
  94. package/dist/core/provider-auth.js +113 -7
  95. package/dist/core/provider-auth.js.map +1 -1
  96. package/dist/core/runner-factory.js +6 -0
  97. package/dist/core/runner-factory.js.map +1 -1
  98. package/dist/core/runner-model-catalog.js +12 -8
  99. package/dist/core/runner-model-catalog.js.map +1 -1
  100. package/dist/core/tool-display.js +6 -1
  101. package/dist/core/tool-display.js.map +1 -1
  102. package/dist/core/ui-events.d.ts +6 -2
  103. package/dist/git-diff-base.js +23 -2
  104. package/dist/git-diff-base.js.map +1 -1
  105. package/dist/git-worktree.d.ts +21 -2
  106. package/dist/git-worktree.js +68 -5
  107. package/dist/git-worktree.js.map +1 -1
  108. package/dist/index.js +14 -4
  109. package/dist/index.js.map +1 -1
  110. package/dist/paths.js +2 -0
  111. package/dist/paths.js.map +1 -1
  112. package/dist/runs/event-history.js +3 -0
  113. package/dist/runs/event-history.js.map +1 -1
  114. package/dist/runs/store.d.ts +42 -3
  115. package/dist/runs/store.js +112 -6
  116. package/dist/runs/store.js.map +1 -1
  117. package/dist/self-update/checkouts.d.ts +53 -0
  118. package/dist/self-update/checkouts.js +268 -0
  119. package/dist/self-update/checkouts.js.map +1 -0
  120. package/dist/self-update/cli.d.ts +5 -3
  121. package/dist/self-update/cli.js +75 -8
  122. package/dist/self-update/cli.js.map +1 -1
  123. package/dist/self-update/layout.d.ts +33 -1
  124. package/dist/self-update/layout.js +102 -3
  125. package/dist/self-update/layout.js.map +1 -1
  126. package/dist/self-update/pulls.d.ts +40 -0
  127. package/dist/self-update/pulls.js +127 -0
  128. package/dist/self-update/pulls.js.map +1 -0
  129. package/dist/self-update/service.d.ts +26 -3
  130. package/dist/self-update/service.js +85 -9
  131. package/dist/self-update/service.js.map +1 -1
  132. package/dist/server/dashboard.d.ts +107 -0
  133. package/dist/server/dashboard.js +2 -1
  134. package/dist/server/dashboard.js.map +1 -1
  135. package/dist/server/forge/github.js +4 -1
  136. package/dist/server/forge/github.js.map +1 -1
  137. package/dist/server/fs-browse.d.ts +3 -1
  138. package/dist/server/fs-browse.js +27 -5
  139. package/dist/server/fs-browse.js.map +1 -1
  140. package/dist/server/open-in-app.js +2 -0
  141. package/dist/server/open-in-app.js.map +1 -1
  142. package/dist/server/provider-action-gate.js +5 -1
  143. package/dist/server/provider-action-gate.js.map +1 -1
  144. package/dist/server/server.d.ts +880 -511
  145. package/dist/server/server.js +40 -5
  146. package/dist/server/server.js.map +1 -1
  147. package/dist/server/star-count.d.ts +67 -0
  148. package/dist/server/star-count.js +186 -0
  149. package/dist/server/star-count.js.map +1 -0
  150. package/dist/skills-banner.d.ts +19 -0
  151. package/dist/skills-banner.js +24 -0
  152. package/dist/skills-banner.js.map +1 -1
  153. package/dist/workflows/run.d.ts +0 -2
  154. package/dist/workflows/run.js +45 -29
  155. package/dist/workflows/run.js.map +1 -1
  156. package/dist/workflows/types.d.ts +6 -0
  157. package/dist/workspace/agent-accounts.d.ts +9 -1
  158. package/dist/workspace/agent-accounts.js +2 -0
  159. package/dist/workspace/agent-accounts.js.map +1 -1
  160. package/dist/workspace/agent-profiles.d.ts +2 -2
  161. package/dist/workspace/agent-profiles.js +25 -6
  162. package/dist/workspace/agent-profiles.js.map +1 -1
  163. package/dist/workspace/config.d.ts +9 -1
  164. package/dist/workspace/config.js +10 -3
  165. package/dist/workspace/config.js.map +1 -1
  166. package/dist/workspace/dashboard-insights.d.ts +42 -0
  167. package/dist/workspace/dashboard-insights.js +220 -0
  168. package/dist/workspace/dashboard-insights.js.map +1 -0
  169. package/dist/workspace/dashboard.d.ts +71 -1
  170. package/dist/workspace/dashboard.js +14 -1
  171. package/dist/workspace/dashboard.js.map +1 -1
  172. package/dist/workspace/semaphore.d.ts +3 -0
  173. package/dist/workspace/semaphore.js +8 -1
  174. package/dist/workspace/semaphore.js.map +1 -1
  175. package/package.json +3 -3
  176. package/scripts/mock-claude.mjs +34 -1
  177. package/scripts/mock-copilot-acp.mjs +190 -0
  178. package/scripts/mock-junie-acp.mjs +208 -0
  179. package/web/dist/assets/agent-task-pickers-BeQi-UTm.js +1 -0
  180. package/web/dist/assets/alert-dialog-CnRAuqwb.js +1 -0
  181. package/web/dist/assets/arrow-down-Da0kNRNH.js +1 -0
  182. package/web/dist/assets/arrow-left-BIZHhBIP.js +1 -0
  183. package/web/dist/assets/automation-format-CfPmkcsg.js +1 -0
  184. package/web/dist/assets/automations-route-AMJbFP53.js +1 -0
  185. package/web/dist/assets/centered-state-3r2Kaar_.js +1 -0
  186. package/web/dist/assets/chevron-left-DLAUPC66.js +1 -0
  187. package/web/dist/assets/chevron-right-KVZcXiPL.js +1 -0
  188. package/web/dist/assets/{circle-x-C9UoMP1V.js → circle-x-C0Jm5Ppb.js} +1 -1
  189. package/web/dist/assets/collapsible-DG_SIWqU.js +1 -0
  190. package/web/dist/assets/command-Dfln3D4A.js +1 -0
  191. package/web/dist/assets/{commit-list-BSfPsVsu.js → commit-list-_RA72yB_.js} +1 -1
  192. package/web/dist/assets/compare-variants-D6Ji6od4.js +1 -0
  193. package/web/dist/assets/dashboard-B3-tPimG.js +44 -0
  194. package/web/dist/assets/dialog-CiDREdUK.js +1 -0
  195. package/web/dist/assets/{diff-I0xowULh.js → diff-CxdyRumG.js} +2 -2
  196. package/web/dist/assets/diff-controls-DqJMMV4z.js +1 -0
  197. package/web/dist/assets/{diff-stat-yKn7joEr.js → diff-stat-Hupj4hxh.js} +1 -1
  198. package/web/dist/assets/{diff-view-DjvMeW1M.js → diff-view-BBYT5k6c.js} +1 -1
  199. package/web/dist/assets/dist-BqMwqJFX.js +1 -0
  200. package/web/dist/assets/dist-DpiX6WjA.js +1 -0
  201. package/web/dist/assets/{download-BcgZ2yk4.js → download-BR7EN9gW.js} +1 -1
  202. package/web/dist/assets/dropdown-menu-Ci4HFML0.js +1 -0
  203. package/web/dist/assets/editable-title-DDtUgRKZ.js +1 -0
  204. package/web/dist/assets/{ellipsis-vertical-g4O4NlLV.js → ellipsis-vertical-DBklom4U.js} +1 -1
  205. package/web/dist/assets/facet-filter-CfI4QvOd.js +1 -0
  206. package/web/dist/assets/{file-wXNeZwi7.js → file-CZb7cKNH.js} +1 -1
  207. package/web/dist/assets/{file-text-DV1gE2L6.js → file-text-Dm6CrEGW.js} +1 -1
  208. package/web/dist/assets/{folder-wjVId5un.js → folder-zQj-FYOo.js} +1 -1
  209. package/web/dist/assets/{git-pull-request-BBEDdTLK.js → git-pull-request-AhwzJc7s.js} +1 -1
  210. package/web/dist/assets/git-toolbar-j7gKkhGL.js +1 -0
  211. package/web/dist/assets/github-De-DFy8s.js +1 -0
  212. package/web/dist/assets/{image-preview-u1f-wzxC.js → image-preview-Dd3NVB7N.js} +1 -1
  213. package/web/dist/assets/index-HS1hr5Sz.js +12 -0
  214. package/web/dist/assets/index-YwgrLyBj.css +2 -0
  215. package/web/dist/assets/loader-circle-sk4vKJKp.js +1 -0
  216. package/web/dist/assets/{markdown-Bnm47qUl.js → markdown-DjNR-1p8.js} +2 -2
  217. package/web/dist/assets/new-task-form-vLs2G1_z.js +1 -0
  218. package/web/dist/assets/picker-pill-VW-M1ZiV.js +1 -0
  219. package/web/dist/assets/{pill-7dm3vWF7.js → pill-CPl6sysj.js} +1 -1
  220. package/web/dist/assets/popover-CNGONAql.js +1 -0
  221. package/web/dist/assets/project-router-dCZQu1wQ.js +1 -0
  222. package/web/dist/assets/{prompt-templates-BMZ5q5H_.js → prompt-templates-jNjVTAws.js} +1 -1
  223. package/web/dist/assets/{refresh-cw-C69euZ2H.js → refresh-cw-BfkEydKA.js} +1 -1
  224. package/web/dist/assets/repo-git-BZWZ6_pR.js +1 -0
  225. package/web/dist/assets/{run-diff-CoNVGn23.js → run-diff-u_roDsAJ.js} +2 -2
  226. package/web/dist/assets/run-header-Br1yJR0m.js +1 -0
  227. package/web/dist/assets/{search-x-BNLFOxI6.js → search-x-CT0NTqK1.js} +1 -1
  228. package/web/dist/assets/segmented-IDD4ucht.js +1 -0
  229. package/web/dist/assets/skills-Dsi5YdLG.js +1 -0
  230. package/web/dist/assets/{sparkles-ChorK-gZ.js → sparkles-CvOeAoyJ.js} +1 -1
  231. package/web/dist/assets/{square-terminal-C7KCPznz.js → square-terminal-eSs8YYZe.js} +1 -1
  232. package/web/dist/assets/{tab-link-E5O2Cesc.js → tab-link-CPF6ORha.js} +1 -1
  233. package/web/dist/assets/task-changes-DIT9Y1rh.js +1 -0
  234. package/web/dist/assets/task-commits-B4VvdiHH.js +1 -0
  235. package/web/dist/assets/task-files-BMm9C0DW.js +2 -0
  236. package/web/dist/assets/task-thread-RXabJAt0.js +9 -0
  237. package/web/dist/assets/{textarea-DLAfWPb0.js → textarea-DtBqPhIs.js} +1 -1
  238. package/web/dist/assets/thread-loading-Dnxb6Ar-.js +1 -0
  239. package/web/dist/assets/toaster-CfRVb8vH.js +43 -0
  240. package/web/dist/assets/token-metrics-DldVlr6m.js +1 -0
  241. package/web/dist/assets/tooltip-_O50N3pt.js +1 -0
  242. package/web/dist/assets/tracker-J0fdcH1G.js +4 -0
  243. package/web/dist/assets/{trash-2-_vwSMdPG.js → trash-2-CUH7GOVh.js} +1 -1
  244. package/web/dist/assets/{triangle-alert-fBRUkB46.js → triangle-alert-D5K_zyD3.js} +1 -1
  245. package/web/dist/assets/{upload-B4OIpdyq.js → upload-D7_n-9cl.js} +1 -1
  246. package/web/dist/assets/{use-now-sqAvRMna.js → use-now-3lElDuTi.js} +1 -1
  247. package/web/dist/assets/utils-BXvEm7Ve.js +64 -0
  248. package/web/dist/assets/workflows-D-dx9c_0.js +7 -0
  249. package/web/dist/assets/x-kLybIvX4.js +1 -0
  250. package/web/dist/assets/{zoomable-image-X81SApIg.js → zoomable-image-CnyQ9wyw.js} +1 -1
  251. package/web/dist/index.html +38 -36
  252. package/web/dist/assets/agent-task-pickers-DQ1qvgrD.js +0 -1
  253. package/web/dist/assets/alert-dialog-B_2uU4Bg.js +0 -1
  254. package/web/dist/assets/arrow-down-DieVZxSE.js +0 -1
  255. package/web/dist/assets/arrow-left-C8M0efjn.js +0 -1
  256. package/web/dist/assets/automation-format-CzinzpHK.js +0 -1
  257. package/web/dist/assets/automations-route-DYHUjV9R.js +0 -1
  258. package/web/dist/assets/centered-state-DJLgwvA4.js +0 -43
  259. package/web/dist/assets/chevron-left-BhXrOEE3.js +0 -1
  260. package/web/dist/assets/chevron-right-B3Ta8VKK.js +0 -1
  261. package/web/dist/assets/collapsible-BcKvItwg.js +0 -1
  262. package/web/dist/assets/command-BvGGv2_u.js +0 -1
  263. package/web/dist/assets/compare-variants-DBvMYMs3.js +0 -1
  264. package/web/dist/assets/dashboard-CGaFh4RV.js +0 -44
  265. package/web/dist/assets/dialog-B6NgKh0-.js +0 -1
  266. package/web/dist/assets/diff-controls-DskkZqmD.js +0 -1
  267. package/web/dist/assets/dist-BvXEdcbG.js +0 -1
  268. package/web/dist/assets/dist-CTksUkKh.js +0 -1
  269. package/web/dist/assets/dropdown-menu-B7HeKCfN.js +0 -1
  270. package/web/dist/assets/editable-title-BHbHmSIK.js +0 -1
  271. package/web/dist/assets/facet-filter-DZ3wfvN9.js +0 -1
  272. package/web/dist/assets/git-toolbar-EZuX4Cuz.js +0 -1
  273. package/web/dist/assets/github-zcLRxv77.js +0 -1
  274. package/web/dist/assets/index-BrZhA4_u.css +0 -2
  275. package/web/dist/assets/index-CSNFuBvj.js +0 -12
  276. package/web/dist/assets/loader-circle-Cwgo6onL.js +0 -1
  277. package/web/dist/assets/new-task-form-CQODCzBP.js +0 -1
  278. package/web/dist/assets/picker-pill-DNB9ETjS.js +0 -1
  279. package/web/dist/assets/popover-BRq6QnwI.js +0 -1
  280. package/web/dist/assets/project-router-I8Pbsrxy.js +0 -1
  281. package/web/dist/assets/repo-git-G436Abni.js +0 -1
  282. package/web/dist/assets/run-header-CxdaA86t.js +0 -1
  283. package/web/dist/assets/skills-C_kBDesq.js +0 -1
  284. package/web/dist/assets/task-changes-Bhw4Ysvg.js +0 -1
  285. package/web/dist/assets/task-commits-DBuGXuGm.js +0 -1
  286. package/web/dist/assets/task-files-CYDbeffM.js +0 -2
  287. package/web/dist/assets/task-thread-RuxHMJgN.js +0 -9
  288. package/web/dist/assets/thread-loading-BAuVAbcA.js +0 -1
  289. package/web/dist/assets/token-metrics-rVl4kXe_.js +0 -1
  290. package/web/dist/assets/tooltip-Bdl8mQG8.js +0 -1
  291. package/web/dist/assets/tracker-DJ8JW59-.js +0 -4
  292. package/web/dist/assets/utils-DoBmOlX3.js +0 -64
  293. package/web/dist/assets/workflows-C54D7mlm.js +0 -7
  294. package/web/dist/assets/x-HXr9KZBr.js +0 -1
@@ -38,6 +38,7 @@ import { discoverClaudeModels } from '../core/claude-model-catalog.js';
38
38
  import { discoverCodexModels } from '../core/codex-model-catalog.js';
39
39
  import { discoverCursorModels } from '../core/cursor-model-catalog.js';
40
40
  import { discoverOpencodeModels } from '../core/opencode-model-catalog.js';
41
+ import { discoverJunieModels } from '../core/junie-model-catalog.js';
41
42
  import { PROVIDER_IDS, ProviderAuthService, providerAuthChecksDisabled, } from '../core/provider-auth.js';
42
43
  import { applyProviderEnablement } from '../core/provider-availability.js';
43
44
  import { RunnerModelCatalog } from '../core/runner-model-catalog.js';
@@ -49,8 +50,9 @@ import { QUICK_TASK_WORKFLOW, normalizeWorkflowDoc, skillStackOf, skillsToSteps,
49
50
  import { planChain, slugify } from '../planner.js';
50
51
  import { discoverSkills } from '../skills.js';
51
52
  import { SkillsUpdateConflictError, SkillsUpdateCoordinator, SkillsUpdateService } from '../skills-update.js';
52
- import { selfUpdateApplyRequestSchema, selfUpdateChannelRequestSchema } from '../contract/index.js';
53
+ import { selfUpdateApplyRequestSchema, selfUpdateChannelRequestSchema, selfUpdateDevelopmentQuerySchema } from '../contract/index.js';
53
54
  import { SelfUpdateBusyError, SelfUpdateService } from '../self-update/service.js';
55
+ import { StarCountReader } from './star-count.js';
54
56
  import { getTeamSkillsCached, refreshTeamSkills, waitForTeamSkills } from '../skills-remote.js';
55
57
  import { appendHandoffHeartbeat, handoffProgressExcerpt, readHandoff } from '../handoff.js';
56
58
  import { markStarted, onTodosChanged, readTodos, removeTodo, todoTaskText } from '../todos.js';
@@ -464,6 +466,11 @@ const uiStateSchema = z
464
466
  // The GitHub tab's last-selected sub-tab (#417): issues or PRs. ADDITIVE — an old
465
467
  // ui-state.json without the key behaves as the default (issues).
466
468
  githubView: z.enum(['issues', 'prs']).optional(),
469
+ // The GitHub tab's list order: newest first (what `gh` returns) or oldest first, for working
470
+ // the backlog from the long-waiting end. ADDITIVE, like `githubView` above — an old
471
+ // ui-state.json without the key behaves as the default (newest), and the sort is applied
472
+ // client-side, so this key changes presentation only, never what `GET /github` fetches.
473
+ githubSort: z.enum(['newest', 'oldest']).optional(),
467
474
  // Settings → Appearance (redesign R6): accent + density. ADDITIVE — the theme itself
468
475
  // stays in the browser (`cez-theme` localStorage, pre-paint). The cockpit always PUTs
469
476
  // the whole object because the top-level merge below is shallow.
@@ -741,10 +748,11 @@ export function createApp(deps) {
741
748
  claude: { discover: () => discoverClaudeModels({ cwd: bootRoot }) },
742
749
  codex: { discover: () => discoverCodexModels({ cwd: bootRoot }) },
743
750
  opencode: { discover: () => discoverOpencodeModels({ cwd: bootRoot }) },
751
+ junie: { discover: () => discoverJunieModels({ cwd: bootRoot }) },
744
752
  cursor: { discover: () => discoverCursorModels() },
745
753
  },
746
754
  });
747
- const providerAuth = deps.providerAuth ?? new ProviderAuthService();
755
+ const providerAuth = deps.providerAuth ?? new ProviderAuthService({ cwd: bootRoot });
748
756
  const workspaceConfig = deps.workspaceConfig ?? {
749
757
  load: loadWorkspaceConfig,
750
758
  mergeWrite: mergeWriteWorkspaceConfig,
@@ -805,6 +813,7 @@ export function createApp(deps) {
805
813
  readOnly: true,
806
814
  trimPaths: () => !capabilities().localHandoff,
807
815
  });
816
+ const starCount = deps.starCount ?? new StarCountReader();
808
817
  // ---- workspace boot-project identity (multi-project spec) ----------------
809
818
  // The boot flow (`initWorkspace` in src/index.ts) registers the boot repo
810
819
  // and plumbs its registry id in via `deps.bootProjectId`. Legacy callers and
@@ -1365,7 +1374,7 @@ export function createApp(deps) {
1365
1374
  // `modelDiscoveryRunnerSchema` is the contract's own list of the runners with an
1366
1375
  // authoritative host-local catalog (#794, #784), so the client compiles against exactly what
1367
1376
  // this validates. A runner absent from it has no discovery path and this 400s.
1368
- .get('/models', queryZodValidator(z.object({ runner: z.union([z.string(), z.array(z.string()).transform((v) => v[0])]).pipe(modelDiscoveryRunnerSchema) }), { message: 'runner must be claude, codex, opencode, or cursor' }), async (c) => {
1377
+ .get('/models', queryZodValidator(z.object({ runner: z.union([z.string(), z.array(z.string()).transform((v) => v[0])]).pipe(modelDiscoveryRunnerSchema) }), { message: 'runner must be claude, codex, opencode, cursor, or junie' }), async (c) => {
1369
1378
  const query = { data: c.req.valid('query') };
1370
1379
  return c.json(await modelCatalog.get(query.data.runner));
1371
1380
  });
@@ -1466,7 +1475,7 @@ export function createApp(deps) {
1466
1475
  workspaceEvents.emit('provider-status', row);
1467
1476
  return c.json(result);
1468
1477
  })
1469
- .post('/providers/connect', jsonZodValidator(providerConnectSchema, { message: 'provider must be claude, codex, opencode, cursor, or pi' }), async (c) => {
1478
+ .post('/providers/connect', jsonZodValidator(providerConnectSchema, { message: 'provider must be claude, codex, opencode, cursor, pi, or copilot' }), async (c) => {
1470
1479
  const body = { data: c.req.valid('json') };
1471
1480
  const provider = body.data.provider;
1472
1481
  // A NAMED account is refused in hosted mode before anything is resolved, exactly like every
@@ -2493,10 +2502,19 @@ export function createApp(deps) {
2493
2502
  // registry, so the request cannot inject code, and a VPS behind the installer's Basic auth
2494
2503
  // is exactly where "update from the cockpit" replaces `cezar server-deploy` — but hosted
2495
2504
  // applies are FORWARD-ONLY (see the guard on /apply below).
2505
+ // ---- chained family: the star ask (workspace-level) ----------------------
2506
+ // cezar's own star count, for the cockpit's ⭐ button. Workspace-level and single-mount, like
2507
+ // `/health`: it says nothing about any project, and there is nothing for a project scope to
2508
+ // change about it. Never fails — `{ available: false }` is the ordinary offline answer, so the
2509
+ // cockpit's chip simply is not there rather than showing an error nobody asked for.
2510
+ const starCountRoutes = new Hono().get('/star-count', async (c) => c.json(await starCount.read()));
2496
2511
  const selfUpdateRoutes = new Hono()
2497
2512
  .get('/workspace/self-update', async (c) => c.json(await selfUpdate.status()))
2498
2513
  .post('/workspace/self-update/refresh', async (c) => c.json(await selfUpdate.status({ refresh: true })))
2499
- .put('/workspace/self-update/channel', jsonZodValidator(selfUpdateChannelRequestSchema, { message: 'body must be { channel: "stable" | "nightly" }' }), async (c) => {
2514
+ // The development channel's pickers: cezar's own worktrees and its open PRs' preview builds.
2515
+ // A separate read because it costs a git call per worktree and a GitHub round trip.
2516
+ .get('/workspace/self-update/development', queryZodValidator(selfUpdateDevelopmentQuerySchema), async (c) => c.json(await selfUpdate.development({ refresh: c.req.valid('query').refresh === '1' })))
2517
+ .put('/workspace/self-update/channel', jsonZodValidator(selfUpdateChannelRequestSchema, { message: 'body must be { channel: "stable" | "nightly" | "development" }' }), async (c) => {
2500
2518
  const { channel } = c.req.valid('json');
2501
2519
  await selfUpdate.setChannel(channel);
2502
2520
  return c.json(await selfUpdate.status());
@@ -2567,6 +2585,7 @@ export function createApp(deps) {
2567
2585
  resources: {
2568
2586
  maxParallel: config.resources.maxParallel,
2569
2587
  maxMonitoringSessions: config.resources.maxMonitoringSessions,
2588
+ idleTimeoutMinutes: config.resources.idleTimeoutMinutes,
2570
2589
  monitoringWakeIntervalMinutes: config.resources.monitoringWakeIntervalMinutes,
2571
2590
  autoResumeOnUsageLimit: config.resources.autoResumeOnUsageLimit,
2572
2591
  memoryLimitMb: config.resources.memoryLimitMb,
@@ -2733,6 +2752,7 @@ export function createApp(deps) {
2733
2752
  .object({
2734
2753
  maxParallel: z.number().int().min(1).max(16).optional(),
2735
2754
  maxMonitoringSessions: z.number().int().min(0).max(16).optional(),
2755
+ idleTimeoutMinutes: z.number().int().min(0).max(1440).nullable().optional(),
2736
2756
  monitoringWakeIntervalMinutes: z.number().int().min(1).max(60).nullable().optional(),
2737
2757
  autoResumeOnUsageLimit: z.boolean().optional(),
2738
2758
  memoryLimitMb: z.number().int().min(0).max(1_048_576).nullable().optional(),
@@ -2751,6 +2771,8 @@ export function createApp(deps) {
2751
2771
  opencode: z.string().trim().min(1).max(200).nullable().optional(),
2752
2772
  cursor: z.string().trim().min(1).max(200).nullable().optional(),
2753
2773
  pi: z.string().trim().min(1).max(200).nullable().optional(),
2774
+ junie: z.string().trim().min(1).max(200).nullable().optional(),
2775
+ copilot: z.string().trim().min(1).max(200).nullable().optional(),
2754
2776
  })
2755
2777
  .optional(),
2756
2778
  })
@@ -5660,6 +5682,8 @@ export function createApp(deps) {
5660
5682
  if (typeof number === 'number' && Number.isInteger(number) && number > 0)
5661
5683
  numbers.push(number);
5662
5684
  }
5685
+ for (const ref of run.prRefs ?? [])
5686
+ numbers.push(ref.number);
5663
5687
  return numbers;
5664
5688
  };
5665
5689
  const runIndexEntry = (projectId, run) => {
@@ -5696,6 +5720,7 @@ export function createApp(deps) {
5696
5720
  ? { referencedPullRequestUrl: run.referencedPullRequestUrl }
5697
5721
  : {}),
5698
5722
  ...(run.prNumber !== undefined ? { prNumber: run.prNumber } : {}),
5723
+ ...(run.prRefs !== undefined ? { prRefs: run.prRefs } : {}),
5699
5724
  ...(run.issueNumber !== undefined ? { issueNumber: run.issueNumber } : {}),
5700
5725
  ...(run.referencedIssueUrl !== undefined ? { referencedIssueUrl: run.referencedIssueUrl } : {}),
5701
5726
  ...(run.markerRefs !== undefined ? { markerRefs: run.markerRefs } : {}),
@@ -5828,6 +5853,7 @@ export function createApp(deps) {
5828
5853
  .route('/', agentProfilesRoutes)
5829
5854
  .route('/', skillsUpdateRoutes)
5830
5855
  .route('/', selfUpdateRoutes)
5856
+ .route('/', starCountRoutes)
5831
5857
  .route('/', workspaceConfigRoutes)
5832
5858
  .route('/', fsBrowseRoutes)
5833
5859
  .route('/', automationChecksRoutes)
@@ -6172,6 +6198,12 @@ export function resumeCommand(runner, sessionId) {
6172
6198
  if (!isSafeSessionId(sessionId))
6173
6199
  return null;
6174
6200
  switch (runner) {
6201
+ case 'junie':
6202
+ // Verified live (`junie --help`, 26.9.22): `--resume` alone reopens the LAST session;
6203
+ // the target session is named by the separate `--session-id=<id>` flag, not a positional
6204
+ // argument (junie's positional slot is `[<task>]`) — `junie --resume ${sessionId}` would
6205
+ // silently resume the wrong session and read the id as a task prompt instead.
6206
+ return `junie --resume --session-id=${sessionId}`;
6175
6207
  case 'codex':
6176
6208
  return `codex resume ${sessionId}`;
6177
6209
  case 'opencode':
@@ -6182,6 +6214,9 @@ export function resumeCommand(runner, sessionId) {
6182
6214
  }
6183
6215
  case 'pi':
6184
6216
  return `pi --session ${sessionId}`;
6217
+ case 'copilot':
6218
+ // `--resume <id>` takes a session id, a task id or an id prefix (`copilot --help`, 1.0.88).
6219
+ return `copilot --resume ${sessionId}`;
6185
6220
  default:
6186
6221
  return `claude --resume ${sessionId}`;
6187
6222
  }