@wjarka/cezarion 0.15.1 → 0.16.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 (462) hide show
  1. package/README.md +167 -46
  2. package/dist/agent-config/catalog.d.ts +6 -2
  3. package/dist/agent-config/catalog.js +78 -3
  4. package/dist/agent-config/catalog.js.map +1 -1
  5. package/dist/agent-config/model-settings/shared.js +6 -3
  6. package/dist/agent-config/model-settings/shared.js.map +1 -1
  7. package/dist/agent-config/models.js +4 -0
  8. package/dist/agent-config/models.js.map +1 -1
  9. package/dist/agent-config/validate.js +6 -0
  10. package/dist/agent-config/validate.js.map +1 -1
  11. package/dist/artifacts/cli.js +10 -2
  12. package/dist/artifacts/cli.js.map +1 -1
  13. package/dist/automations/coordinator.d.ts +7 -0
  14. package/dist/automations/coordinator.js +22 -2
  15. package/dist/automations/coordinator.js.map +1 -1
  16. package/dist/automations/github-poller.d.ts +4 -4
  17. package/dist/automations/github-poller.js.map +1 -1
  18. package/dist/automations/schedule-runner.d.ts +130 -0
  19. package/dist/automations/schedule-runner.js +326 -0
  20. package/dist/automations/schedule-runner.js.map +1 -0
  21. package/dist/automations/scheduler.d.ts +38 -7
  22. package/dist/automations/scheduler.js +90 -22
  23. package/dist/automations/scheduler.js.map +1 -1
  24. package/dist/automations/store.d.ts +80 -3
  25. package/dist/automations/store.js +208 -16
  26. package/dist/automations/store.js.map +1 -1
  27. package/dist/automations/task-template.d.ts +42 -6
  28. package/dist/automations/task-template.js +152 -24
  29. package/dist/automations/task-template.js.map +1 -1
  30. package/dist/automations/types.d.ts +142 -6
  31. package/dist/automations/types.js +64 -6
  32. package/dist/automations/types.js.map +1 -1
  33. package/dist/autosave-holders.js +8 -12
  34. package/dist/autosave-holders.js.map +1 -1
  35. package/dist/ci-wait/client.d.ts +8 -1
  36. package/dist/ci-wait/client.js +43 -1
  37. package/dist/ci-wait/client.js.map +1 -1
  38. package/dist/ci-wait/controller.d.ts +83 -4
  39. package/dist/ci-wait/controller.js +76 -11
  40. package/dist/ci-wait/controller.js.map +1 -1
  41. package/dist/ci-wait/errors.d.ts +7 -1
  42. package/dist/ci-wait/errors.js +36 -0
  43. package/dist/ci-wait/errors.js.map +1 -1
  44. package/dist/ci-wait/github.d.ts +2 -0
  45. package/dist/ci-wait/github.js +3 -1
  46. package/dist/ci-wait/github.js.map +1 -1
  47. package/dist/ci-wait/mcp.d.ts +2 -98
  48. package/dist/ci-wait/mcp.js +11 -25
  49. package/dist/ci-wait/mcp.js.map +1 -1
  50. package/dist/ci-wait/supervisor.d.ts +2 -1
  51. package/dist/ci-wait/supervisor.js +2 -1
  52. package/dist/ci-wait/supervisor.js.map +1 -1
  53. package/dist/ci-wait/tools.d.ts +307 -0
  54. package/dist/ci-wait/tools.js +63 -0
  55. package/dist/ci-wait/tools.js.map +1 -0
  56. package/dist/config.d.ts +3 -0
  57. package/dist/config.js +7 -0
  58. package/dist/config.js.map +1 -1
  59. package/dist/contract/agent-config.d.ts +5 -0
  60. package/dist/contract/agent-profiles.d.ts +15 -0
  61. package/dist/contract/automation-schedule.d.ts +60 -0
  62. package/dist/contract/automations.d.ts +208 -36
  63. package/dist/contract/delegation.d.ts +96 -0
  64. package/dist/contract/discovery.d.ts +7 -0
  65. package/dist/contract/github.d.ts +1 -0
  66. package/dist/contract/health.d.ts +6 -0
  67. package/dist/contract/index.d.ts +3 -0
  68. package/dist/contract/index.js +1445 -745
  69. package/dist/contract/preview.d.ts +508 -0
  70. package/dist/contract/runs.d.ts +716 -15
  71. package/dist/contract/skills.d.ts +39 -0
  72. package/dist/contract/workflows.d.ts +6 -0
  73. package/dist/contract/workspace.d.ts +65 -0
  74. package/dist/contract/zoned-time.d.ts +35 -0
  75. package/dist/core/agent-env.d.ts +11 -0
  76. package/dist/core/agent-env.js +27 -5
  77. package/dist/core/agent-env.js.map +1 -1
  78. package/dist/core/agent-profiles.js +7 -0
  79. package/dist/core/agent-profiles.js.map +1 -1
  80. package/dist/core/agent-runner.d.ts +49 -1
  81. package/dist/core/agent-runner.js +2 -1
  82. package/dist/core/agent-runner.js.map +1 -1
  83. package/dist/core/backend-detect.d.ts +3 -2
  84. package/dist/core/backend-detect.js +27 -1
  85. package/dist/core/backend-detect.js.map +1 -1
  86. package/dist/core/claude-cli-runner.d.ts +1 -0
  87. package/dist/core/claude-cli-runner.js +69 -19
  88. package/dist/core/claude-cli-runner.js.map +1 -1
  89. package/dist/core/codex-app-server-runner.d.ts +1 -0
  90. package/dist/core/codex-app-server-runner.js +200 -25
  91. package/dist/core/codex-app-server-runner.js.map +1 -1
  92. package/dist/core/codex-app-server-transport.d.ts +7 -3
  93. package/dist/core/codex-app-server-transport.js +11 -9
  94. package/dist/core/codex-app-server-transport.js.map +1 -1
  95. package/dist/core/cursor-acp-runner.d.ts +1 -0
  96. package/dist/core/cursor-acp-runner.js +24 -9
  97. package/dist/core/cursor-acp-runner.js.map +1 -1
  98. package/dist/core/host-model-catalog.js +2 -0
  99. package/dist/core/host-model-catalog.js.map +1 -1
  100. package/dist/core/managed-session.js +2 -0
  101. package/dist/core/managed-session.js.map +1 -1
  102. package/dist/core/model-identity.js +2 -0
  103. package/dist/core/model-identity.js.map +1 -1
  104. package/dist/core/model-presets.js +3 -0
  105. package/dist/core/model-presets.js.map +1 -1
  106. package/dist/core/omp-model-catalog.d.ts +43 -0
  107. package/dist/core/omp-model-catalog.js +205 -0
  108. package/dist/core/omp-model-catalog.js.map +1 -0
  109. package/dist/core/omp-runner.d.ts +73 -0
  110. package/dist/core/omp-runner.js +990 -0
  111. package/dist/core/omp-runner.js.map +1 -0
  112. package/dist/core/omp-ui-mapper.d.ts +106 -0
  113. package/dist/core/omp-ui-mapper.js +882 -0
  114. package/dist/core/omp-ui-mapper.js.map +1 -0
  115. package/dist/core/opencode-server-runner.d.ts +18 -4
  116. package/dist/core/opencode-server-runner.js +337 -96
  117. package/dist/core/opencode-server-runner.js.map +1 -1
  118. package/dist/core/opencode-session-error.d.ts +11 -0
  119. package/dist/core/opencode-session-error.js +26 -0
  120. package/dist/core/opencode-session-error.js.map +1 -0
  121. package/dist/core/opencode-ui-mapper.js +4 -36
  122. package/dist/core/opencode-ui-mapper.js.map +1 -1
  123. package/dist/core/pi-runner.d.ts +1 -0
  124. package/dist/core/pi-runner.js +75 -12
  125. package/dist/core/pi-runner.js.map +1 -1
  126. package/dist/core/provider-auth.d.ts +9 -2
  127. package/dist/core/provider-auth.js +43 -6
  128. package/dist/core/provider-auth.js.map +1 -1
  129. package/dist/core/runner-factory.js +3 -0
  130. package/dist/core/runner-factory.js.map +1 -1
  131. package/dist/core/runner-model-catalog.js +1 -0
  132. package/dist/core/runner-model-catalog.js.map +1 -1
  133. package/dist/core/runner-stderr.d.ts +2 -0
  134. package/dist/core/runner-stderr.js +20 -0
  135. package/dist/core/runner-stderr.js.map +1 -0
  136. package/dist/core/session-process.d.ts +22 -0
  137. package/dist/core/session-process.js +202 -0
  138. package/dist/core/session-process.js.map +1 -0
  139. package/dist/core/ui-events.d.ts +1 -1
  140. package/dist/core/usage-limit.js +3 -60
  141. package/dist/core/usage-limit.js.map +1 -1
  142. package/dist/data-gitignore.d.ts +6 -0
  143. package/dist/data-gitignore.js +57 -0
  144. package/dist/data-gitignore.js.map +1 -0
  145. package/dist/delegation/capacity.d.ts +19 -0
  146. package/dist/delegation/capacity.js +34 -0
  147. package/dist/delegation/capacity.js.map +1 -0
  148. package/dist/delegation/cli.js +13 -4
  149. package/dist/delegation/cli.js.map +1 -1
  150. package/dist/delegation/conversations.d.ts +4 -2
  151. package/dist/delegation/conversations.js +8 -12
  152. package/dist/delegation/conversations.js.map +1 -1
  153. package/dist/delegation/credentials.d.ts +2 -0
  154. package/dist/delegation/credentials.js +10 -0
  155. package/dist/delegation/credentials.js.map +1 -1
  156. package/dist/delegation/destroy-observation.d.ts +42 -0
  157. package/dist/delegation/destroy-observation.js +115 -0
  158. package/dist/delegation/destroy-observation.js.map +1 -0
  159. package/dist/delegation/execution-identity.d.ts +6 -0
  160. package/dist/delegation/execution-identity.js +1 -1
  161. package/dist/delegation/execution-identity.js.map +1 -1
  162. package/dist/delegation/policy.d.ts +3 -2
  163. package/dist/delegation/policy.js +7 -5
  164. package/dist/delegation/policy.js.map +1 -1
  165. package/dist/delegation/process-liveness.d.ts +57 -20
  166. package/dist/delegation/process-liveness.js +114 -92
  167. package/dist/delegation/process-liveness.js.map +1 -1
  168. package/dist/delegation/provision.js +6 -6
  169. package/dist/delegation/provision.js.map +1 -1
  170. package/dist/delegation/results.js +4 -2
  171. package/dist/delegation/results.js.map +1 -1
  172. package/dist/delegation/retry-backoff.d.ts +23 -0
  173. package/dist/delegation/retry-backoff.js +18 -0
  174. package/dist/delegation/retry-backoff.js.map +1 -0
  175. package/dist/delegation/routes.d.ts +64 -58
  176. package/dist/delegation/scratch-cleanup.d.ts +29 -0
  177. package/dist/delegation/scratch-cleanup.js +143 -0
  178. package/dist/delegation/scratch-cleanup.js.map +1 -0
  179. package/dist/delegation/service.d.ts +20 -1
  180. package/dist/delegation/service.js +233 -70
  181. package/dist/delegation/service.js.map +1 -1
  182. package/dist/delegation/transport.d.ts +12 -6
  183. package/dist/delegation/workspace.d.ts +23 -4
  184. package/dist/delegation/workspace.js +147 -31
  185. package/dist/delegation/workspace.js.map +1 -1
  186. package/dist/git-worktree-lock-helper.js +8 -3
  187. package/dist/git-worktree-lock-helper.js.map +1 -1
  188. package/dist/git-worktree-lock.d.ts +6 -1
  189. package/dist/git-worktree-lock.js +10 -4
  190. package/dist/git-worktree-lock.js.map +1 -1
  191. package/dist/git-worktree-release.d.ts +20 -0
  192. package/dist/git-worktree-release.js +27 -0
  193. package/dist/git-worktree-release.js.map +1 -0
  194. package/dist/git-worktree.d.ts +8 -2
  195. package/dist/git-worktree.js +19 -2
  196. package/dist/git-worktree.js.map +1 -1
  197. package/dist/handoff.d.ts +2 -2
  198. package/dist/handoff.js +1 -1
  199. package/dist/index.js +109 -76
  200. package/dist/index.js.map +1 -1
  201. package/dist/paths.d.ts +1 -1
  202. package/dist/paths.js +5 -1
  203. package/dist/paths.js.map +1 -1
  204. package/dist/preview/cdp.d.ts +13 -0
  205. package/dist/preview/cdp.js +69 -0
  206. package/dist/preview/cdp.js.map +1 -0
  207. package/dist/preview/chromium.d.ts +75 -0
  208. package/dist/preview/chromium.js +394 -0
  209. package/dist/preview/chromium.js.map +1 -0
  210. package/dist/preview/dev-server.d.ts +68 -0
  211. package/dist/preview/dev-server.js +341 -0
  212. package/dist/preview/dev-server.js.map +1 -0
  213. package/dist/preview/host.d.ts +154 -0
  214. package/dist/preview/host.js +681 -0
  215. package/dist/preview/host.js.map +1 -0
  216. package/dist/preview/registration.d.ts +63 -0
  217. package/dist/preview/registration.js +109 -0
  218. package/dist/preview/registration.js.map +1 -0
  219. package/dist/preview/session.d.ts +73 -0
  220. package/dist/preview/session.js +347 -0
  221. package/dist/preview/session.js.map +1 -0
  222. package/dist/preview/url.d.ts +6 -0
  223. package/dist/preview/url.js +17 -0
  224. package/dist/preview/url.js.map +1 -0
  225. package/dist/runs/agent-tmpdir-removal.d.ts +15 -0
  226. package/dist/runs/agent-tmpdir-removal.js +60 -0
  227. package/dist/runs/agent-tmpdir-removal.js.map +1 -0
  228. package/dist/runs/agent-tmpdir.d.ts +12 -1
  229. package/dist/runs/agent-tmpdir.js +123 -34
  230. package/dist/runs/agent-tmpdir.js.map +1 -1
  231. package/dist/runs/delegation-state.d.ts +5 -1
  232. package/dist/runs/delegation-state.js +9 -0
  233. package/dist/runs/delegation-state.js.map +1 -1
  234. package/dist/runs/event-history.d.ts +4 -4
  235. package/dist/runs/event-history.js +97 -117
  236. package/dist/runs/event-history.js.map +1 -1
  237. package/dist/runs/history-compressor.d.ts +29 -0
  238. package/dist/runs/history-compressor.js +116 -0
  239. package/dist/runs/history-compressor.js.map +1 -0
  240. package/dist/runs/history-file.d.ts +36 -0
  241. package/dist/runs/history-file.js +463 -0
  242. package/dist/runs/history-file.js.map +1 -0
  243. package/dist/runs/human-ask-summary.js +18 -13
  244. package/dist/runs/human-ask-summary.js.map +1 -1
  245. package/dist/runs/legacy-index.d.ts +62 -0
  246. package/dist/runs/legacy-index.js +168 -0
  247. package/dist/runs/legacy-index.js.map +1 -0
  248. package/dist/runs/raw-record.d.ts +52 -0
  249. package/dist/runs/raw-record.js +145 -0
  250. package/dist/runs/raw-record.js.map +1 -0
  251. package/dist/runs/retention.d.ts +13 -6
  252. package/dist/runs/retention.js +42 -13
  253. package/dist/runs/retention.js.map +1 -1
  254. package/dist/runs/run-claims.d.ts +23 -0
  255. package/dist/runs/run-claims.js +24 -0
  256. package/dist/runs/run-claims.js.map +1 -0
  257. package/dist/runs/run-database.d.ts +385 -0
  258. package/dist/runs/run-database.js +930 -0
  259. package/dist/runs/run-database.js.map +1 -0
  260. package/dist/runs/run-index.d.ts +35 -9
  261. package/dist/runs/run-index.js +200 -25
  262. package/dist/runs/run-index.js.map +1 -1
  263. package/dist/runs/run-row.d.ts +44 -0
  264. package/dist/runs/run-row.js +84 -0
  265. package/dist/runs/run-row.js.map +1 -0
  266. package/dist/runs/run-search.d.ts +29 -0
  267. package/dist/runs/run-search.js +63 -0
  268. package/dist/runs/run-search.js.map +1 -0
  269. package/dist/runs/store-open-error.d.ts +24 -0
  270. package/dist/runs/store-open-error.js +61 -0
  271. package/dist/runs/store-open-error.js.map +1 -0
  272. package/dist/runs/store.d.ts +667 -32
  273. package/dist/runs/store.js +2153 -324
  274. package/dist/runs/store.js.map +1 -1
  275. package/dist/runs/transcript-facts.d.ts +77 -0
  276. package/dist/runs/transcript-facts.js +302 -0
  277. package/dist/runs/transcript-facts.js.map +1 -0
  278. package/dist/runs/webhook.js +5 -4
  279. package/dist/runs/webhook.js.map +1 -1
  280. package/dist/runs/worker-execution.d.ts +22 -0
  281. package/dist/runs/worker-execution.js +30 -0
  282. package/dist/runs/worker-execution.js.map +1 -0
  283. package/dist/server/capabilities.d.ts +1 -0
  284. package/dist/server/capabilities.js +2 -0
  285. package/dist/server/capabilities.js.map +1 -1
  286. package/dist/server/cockpit-ownership.d.ts +8 -0
  287. package/dist/server/cockpit-ownership.js +19 -0
  288. package/dist/server/cockpit-ownership.js.map +1 -1
  289. package/dist/server/forge/github.d.ts +1 -4
  290. package/dist/server/forge/github.js +47 -23
  291. package/dist/server/forge/github.js.map +1 -1
  292. package/dist/server/git.js +1 -1
  293. package/dist/server/git.js.map +1 -1
  294. package/dist/server/open-in-app.js +1 -0
  295. package/dist/server/open-in-app.js.map +1 -1
  296. package/dist/server/preview-socket.d.ts +36 -0
  297. package/dist/server/preview-socket.js +126 -0
  298. package/dist/server/preview-socket.js.map +1 -0
  299. package/dist/server/project-context.d.ts +31 -4
  300. package/dist/server/project-context.js +73 -9
  301. package/dist/server/project-context.js.map +1 -1
  302. package/dist/server/provider-action-gate.js +1 -0
  303. package/dist/server/provider-action-gate.js.map +1 -1
  304. package/dist/server/repo-branches.d.ts +4 -3
  305. package/dist/server/repo-branches.js +5 -4
  306. package/dist/server/repo-branches.js.map +1 -1
  307. package/dist/server/server.d.ts +4500 -2727
  308. package/dist/server/server.js +651 -202
  309. package/dist/server/server.js.map +1 -1
  310. package/dist/server/upgrade-router.d.ts +23 -0
  311. package/dist/server/upgrade-router.js +53 -0
  312. package/dist/server/upgrade-router.js.map +1 -0
  313. package/dist/server/validators.d.ts +6 -1
  314. package/dist/server/validators.js +4 -4
  315. package/dist/server/validators.js.map +1 -1
  316. package/dist/server/ws.d.ts +16 -16
  317. package/dist/server/ws.js +56 -54
  318. package/dist/server/ws.js.map +1 -1
  319. package/dist/skills-remote.d.ts +14 -0
  320. package/dist/skills-remote.js +91 -15
  321. package/dist/skills-remote.js.map +1 -1
  322. package/dist/task-cli/cli.js +40 -16
  323. package/dist/task-cli/cli.js.map +1 -1
  324. package/dist/task-cli/discovery.d.ts +4 -3
  325. package/dist/task-cli/discovery.js +4 -3
  326. package/dist/task-cli/discovery.js.map +1 -1
  327. package/dist/task-cli/http.d.ts +2 -0
  328. package/dist/task-cli/http.js +10 -4
  329. package/dist/task-cli/http.js.map +1 -1
  330. package/dist/task-cli/projections.d.ts +5 -2
  331. package/dist/task-cli/projections.js +13 -0
  332. package/dist/task-cli/projections.js.map +1 -1
  333. package/dist/task-cli/watch.d.ts +15 -2
  334. package/dist/task-cli/watch.js +31 -9
  335. package/dist/task-cli/watch.js.map +1 -1
  336. package/dist/ui-state.d.ts +4 -3
  337. package/dist/ui-state.js +8 -3
  338. package/dist/ui-state.js.map +1 -1
  339. package/dist/workflows/grouped-command.d.ts +31 -0
  340. package/dist/workflows/grouped-command.js +143 -0
  341. package/dist/workflows/grouped-command.js.map +1 -0
  342. package/dist/workflows/run.d.ts +223 -42
  343. package/dist/workflows/run.js +1316 -398
  344. package/dist/workflows/run.js.map +1 -1
  345. package/dist/workflows/types.d.ts +12 -0
  346. package/dist/workflows/types.js +20 -0
  347. package/dist/workflows/types.js.map +1 -1
  348. package/dist/workspace/agent-accounts.d.ts +5 -1
  349. package/dist/workspace/agent-accounts.js +1 -0
  350. package/dist/workspace/agent-accounts.js.map +1 -1
  351. package/dist/workspace/agent-profiles.js +1 -1
  352. package/dist/workspace/agent-profiles.js.map +1 -1
  353. package/dist/workspace/config.d.ts +3 -1
  354. package/dist/workspace/config.js +1 -0
  355. package/dist/workspace/config.js.map +1 -1
  356. package/dist/worktree-setup.d.ts +85 -0
  357. package/dist/worktree-setup.js +164 -0
  358. package/dist/worktree-setup.js.map +1 -0
  359. package/package.json +7 -5
  360. package/scripts/benchmark-run-store-fixture.ts +428 -0
  361. package/scripts/benchmark-run-store.ts +743 -0
  362. package/scripts/benchmark-stuck-destroys.ts +143 -0
  363. package/scripts/mock-autonomous.mjs +11 -0
  364. package/scripts/mock-ci-tool.mjs +20 -5
  365. package/scripts/mock-claude.mjs +110 -1
  366. package/scripts/mock-codex-app-server.mjs +117 -2
  367. package/scripts/mock-codex-coalesce-steer.mjs +59 -0
  368. package/scripts/mock-codex-reverse-steer.mjs +130 -0
  369. package/scripts/mock-cursor-acp.mjs +75 -1
  370. package/scripts/mock-omp-rpc.mjs +605 -0
  371. package/scripts/mock-opencode-serve.mjs +312 -22
  372. package/scripts/mock-pi-rpc.mjs +109 -3
  373. package/scripts/mock-runner-crash.mjs +42 -0
  374. package/scripts/mock-silent-tail.mjs +78 -0
  375. package/scripts/mock-turn-messages.mjs +5 -0
  376. package/scripts/omp-ci-wait.mjs +29 -0
  377. package/scripts/omp-restrict-delegation.yml +4 -0
  378. package/scripts/pi-ci-wait.mjs +12 -9
  379. package/scripts/seed-archive-profile.ts +3 -3
  380. package/web/dist/assets/agent-accounts-CFOBMVHc.js +1 -0
  381. package/web/dist/assets/alert-dialog-BrpNUwMt.js +1 -0
  382. package/web/dist/assets/app-window-CSHwDX9N.js +1 -0
  383. package/web/dist/assets/button-C_rd7CPp.js +43 -0
  384. package/web/dist/assets/compare-variants-D6WXhvXA.js +1 -0
  385. package/web/dist/assets/diff-DrEARXTV.js +3 -0
  386. package/web/dist/assets/diff-controls-B1-j7nFg.js +1 -0
  387. package/web/dist/assets/{diff-view-DPn6bQ5W.js → diff-view-DvGLjdTk.js} +3 -3
  388. package/web/dist/assets/dropdown-menu-BegOZFrj.js +1 -0
  389. package/web/dist/assets/format-DpNe3S0A.js +1 -0
  390. package/web/dist/assets/git-toolbar-Cw4ljmhB.js +1 -0
  391. package/web/dist/assets/github-CfV5sqL0.js +1 -0
  392. package/web/dist/assets/{image-preview-DJ8cgb1Z.js → image-preview-FOEfqpZP.js} +1 -1
  393. package/web/dist/assets/index-DgWWlOLy.js +13 -0
  394. package/web/dist/assets/index-fBFnuvxu.css +1 -0
  395. package/web/dist/assets/{nav-row-styles-3j64kH5s.js → nav-row-styles-vp2JbhuJ.js} +1 -1
  396. package/web/dist/assets/play-CmVAj_fu.js +1 -0
  397. package/web/dist/assets/popover-BohP6WTx.js +1 -0
  398. package/web/dist/assets/preview-pane-connected-qTA5KNoJ.js +3 -0
  399. package/web/dist/assets/preview-state-vuMviq6q.js +1 -0
  400. package/web/dist/assets/prompt-templates-Cubdut_C.js +15 -0
  401. package/web/dist/assets/repo-git-Cf4t5PD0.js +1 -0
  402. package/web/dist/assets/{run-diff-5-RRdcVz.js → run-diff-BpkUW37Z.js} +3 -3
  403. package/web/dist/assets/run-header-68WHf9wV.js +1 -0
  404. package/web/dist/assets/skills-DiVIgKeU.js +1 -0
  405. package/web/dist/assets/square-terminal-B6RYYieR.js +1 -0
  406. package/web/dist/assets/status-dot-CqTJHSP9.js +1 -0
  407. package/web/dist/assets/{tab-link-K0hjzEXR.js → tab-link-B07Hu4QX.js} +1 -1
  408. package/web/dist/assets/task-changes--lQF6EYf.js +1 -0
  409. package/web/dist/assets/task-commits-Cx0qy4DN.js +1 -0
  410. package/web/dist/assets/task-files-D50s-gKW.js +2 -0
  411. package/web/dist/assets/task-github-item-DaqmSwYT.js +1 -0
  412. package/web/dist/assets/task-thread-BPQ64lui.js +7 -0
  413. package/web/dist/assets/{task-thread-Bw_nQuTx.css → task-thread-zNE2Q9E-.css} +1 -1
  414. package/web/dist/assets/textarea-D20O4Pw0.js +1 -0
  415. package/web/dist/assets/thread-state-DWcFMrvb.js +4 -0
  416. package/web/dist/assets/use-hand-to-agent-state-BLIGmwbd.css +1 -0
  417. package/web/dist/assets/use-hand-to-agent-state-Cy9eyyfL.js +1 -0
  418. package/web/dist/assets/{utils-fzNfbPzA.js → utils-JsL3ZsJf.js} +1 -1
  419. package/web/dist/assets/workflows-jwG7uxqi.js +11 -0
  420. package/web/dist/assets/{zoomable-image-CDmZ_Rtl.js → zoomable-image-BJJ64KGc.js} +1 -1
  421. package/web/dist/cezarion-lockup-dark.svg +1 -13
  422. package/web/dist/cezarion-lockup-light.svg +1 -13
  423. package/web/dist/cezarion-mark-dark.svg +1 -12
  424. package/web/dist/cezarion-mark-light.svg +1 -12
  425. package/web/dist/index.html +16 -21
  426. package/web/dist/assets/agent-accounts-CU2ZDv24.js +0 -1
  427. package/web/dist/assets/alert-dialog-C-xYE_dg.js +0 -43
  428. package/web/dist/assets/chevron-right-BENZ-1ZN.js +0 -1
  429. package/web/dist/assets/collapsible-DD9J91Iv.js +0 -1
  430. package/web/dist/assets/compare-variants-5FmqpFSN.js +0 -1
  431. package/web/dist/assets/diff-controls-Bj0YrioE.js +0 -1
  432. package/web/dist/assets/diff-rE8rm75J2.js +0 -3
  433. package/web/dist/assets/diff-stat-BKDCSVfJ.js +0 -1
  434. package/web/dist/assets/dropdown-menu-Ch5BYQh_.js +0 -1
  435. package/web/dist/assets/format-dBiNDNVe.js +0 -1
  436. package/web/dist/assets/git-toolbar-ClVvf5iF.js +0 -1
  437. package/web/dist/assets/github-BkNOyour.css +0 -1
  438. package/web/dist/assets/github-DeZMeMwJ.js +0 -1
  439. package/web/dist/assets/github-item-detail-W5F6GVjF.js +0 -1
  440. package/web/dist/assets/github-sidebar-model-DcMu-IK2.js +0 -1
  441. package/web/dist/assets/highlighter-CdHqIwFr.js +0 -3
  442. package/web/dist/assets/index-CatemBEL.js +0 -8
  443. package/web/dist/assets/index-MvfD8bZJ.css +0 -1
  444. package/web/dist/assets/markdown-zdKeLIYA.js +0 -2
  445. package/web/dist/assets/mobile-run-bar-BCfmFi8V.js +0 -1
  446. package/web/dist/assets/prompt-templates-CBPp39IU.js +0 -15
  447. package/web/dist/assets/reference-chip-D6owncJT.js +0 -1
  448. package/web/dist/assets/repo-git-CtdkZFey.js +0 -1
  449. package/web/dist/assets/run-header-BcjoDi0W.js +0 -1
  450. package/web/dist/assets/sheet-ChnYVrp1.js +0 -1
  451. package/web/dist/assets/skills-C8YKp2vr.js +0 -1
  452. package/web/dist/assets/task-changes-BW8YdWG8.js +0 -1
  453. package/web/dist/assets/task-commits-q2kB2y6L.js +0 -1
  454. package/web/dist/assets/task-files-pPL6_3Cr.js +0 -2
  455. package/web/dist/assets/task-github-item-BXF5R52U.js +0 -1
  456. package/web/dist/assets/task-thread-DtkFL3EC.js +0 -10
  457. package/web/dist/assets/textarea-DxlkE-Yd.js +0 -1
  458. package/web/dist/assets/token-metrics-DIAjrPlM.js +0 -1
  459. package/web/dist/assets/use-desktop-CrDny2uG.js +0 -1
  460. package/web/dist/assets/use-submit-shortcut-KWJsC906.js +0 -1
  461. package/web/dist/assets/workflows-TmcPEj2K.js +0 -11
  462. /package/web/dist/assets/{lib-BQXq3kEf2.js → lib-BQXq3kEf.js} +0 -0
package/README.md CHANGED
@@ -5,10 +5,10 @@
5
5
  **Parallel coding agents orchestrator** — a local cockpit for running and
6
6
  tracking AI coding-agent tasks in your repo.
7
7
 
8
- Type a task, pick a workflow and an agent — **Claude Code, Codex, OpenCode or pi
9
- (the latter two experimental), or a mix of them per step** — and watch it work live: steps, tool calls,
8
+ Type a task, pick a workflow and an agent — **Claude Code, Codex, OpenCode, pi or OMP
9
+ (OpenCode, pi and OMP experimental), or a mix of them per step** — and watch it work live: steps, tool calls,
10
10
  tokens, diffs, in a browser cockpit that runs entirely on your machine.
11
- Your CLI logins, your `gh`, your files. No accounts, no database, no cloud.
11
+ Your CLI logins, your `gh`, your files. No accounts, no database server, no cloud.
12
12
 
13
13
  🔥 **Fire and forget.** Queue a stack of autonomous coding and maintenance
14
14
  tasks and let them run — cezar orchestrates them across isolated worktrees,
@@ -20,10 +20,10 @@ your phone, working your backlog while you're away.
20
20
  [A look inside](#a-look-inside) · [What cezar does best](#what-cezar-does-best) · [What it solves](#what-it-solves) · [Who it's for](#who-its-for) · [Quick start](#quick-start) · [How it works](#how-it-works) · [Core concepts](#core-concepts) · [Cockpit tour](#cockpit-tour) · [Agent backends](#coding-agent-backends) · [Remote access](#remote-access-host-cezar-on-a-server)
21
21
 
22
22
  [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE)
23
- ![Node 20+](https://img.shields.io/badge/Node-20%2B-339933)
23
+ ![Node 24.15+](https://img.shields.io/badge/Node-24.15%2B-339933)
24
24
  ![TypeScript 7.x](https://img.shields.io/badge/TypeScript-7.x-3178c6)
25
25
  ![Zero config](https://img.shields.io/badge/config-zero-success)
26
- ![No database](https://img.shields.io/badge/database-none-success)
26
+ ![Embedded SQLite](https://img.shields.io/badge/database-embedded%20SQLite-success)
27
27
 
28
28
  </div>
29
29
 
@@ -36,7 +36,9 @@ npx cezarion # → cockpit at http://localhost:4321
36
36
 
37
37
  That's the whole setup. If your `claude` CLI is logged in (Pro/Max) and `gh` is
38
38
  authenticated, there is nothing else to configure. State lives in `.ai/cezar/`
39
- inside your repo — plain JSON, NDJSON and Markdown you can `cat` and fix by hand.
39
+ inside your repo: your runs in one embedded SQLite file (`runs.db`, built into
40
+ Node: no server, no install, no config), event logs in NDJSON and journals in
41
+ Markdown. Everything except the run file you can `cat` and fix by hand.
40
42
 
41
43
  Local npm installations have a workspace update API. `POST
42
44
  /api/v1/workspace/application-update/apply` with `{}` prepares the release
@@ -72,8 +74,8 @@ conductor-style app, one-agent front-ends. cezar's bet is different. Three thing
72
74
  it does better than any of them:
73
75
 
74
76
  - 🪶 **Genuinely zero config.** `npx cezarion` in your repo and you're running —
75
- no wizard, no API keys, no env vars, no schema, no database. It rides the
76
- `claude` / `codex` / `opencode` / `pi` logins and the `gh` you already have, and every
77
+ no wizard, no API keys, no env vars, no schema, no database server. It rides the
78
+ `claude` / `codex` / `opencode` / `pi` / `omp` logins and the `gh` you already have, and every
77
79
  missing piece degrades gracefully instead of blocking you.
78
80
  - 🖥️ **Built for a server (VPS mode).** cezar is made to live on a **VPS, cloud,
79
81
  or dedicated box** as an always-on janitor for your repo — headless-first, with
@@ -151,7 +153,7 @@ and an orchestrator keeps a whole queue of them moving.
151
153
 
152
154
  ## Quick start
153
155
 
154
- **Prerequisites:** Node 20+, at least one logged-in agent CLI — the
156
+ **Prerequisites:** Node 24.15+, at least one logged-in agent CLI — the
155
157
  [`claude` CLI](https://github.com/anthropics/claude-code) (Pro/Max subscription),
156
158
  the [`codex` CLI](https://github.com/openai/codex), or
157
159
  [OpenCode](https://opencode.ai) — and, optionally, `git` and the `gh` CLI.
@@ -162,10 +164,15 @@ npx cezarion # start the cockpit for the current repo
162
164
  # or: npx @wjarka/cezarion
163
165
  ```
164
166
 
165
- The cockpit opens at `http://localhost:4321` (auto-picks the next free port if
166
- busy). If another cockpit already serves this repository, the command prints its
167
- URL and exits with an error. Different repositories can run side by side; after
168
- a cockpit exits or crashes, its repository can start again without cleanup.
167
+ The cockpit opens at `http://localhost:4321`. If the requested port is occupied,
168
+ startup exits with an actionable error before recovering tasks. Automatic port
169
+ bounce has been removed (hearsay-tools/cezarion#722): open the existing cockpit,
170
+ stop the process using that port, or choose `cez --port <free-port>` deliberately.
171
+ Use `cez --port 0` to ask the OS for an ephemeral port. If another cockpit already
172
+ serves this repository, the command prints its URL and exits with an error,
173
+ even with a different port. Different repositories can run side by side on
174
+ explicitly different ports; after a cockpit exits or crashes, its repository
175
+ can start again without cleanup.
169
176
  Type a task, pick a workflow, hit **Start**. That's it.
170
177
 
171
178
  ```bash
@@ -255,7 +262,7 @@ event live and parks the run at a review gate when there's a diff to inspect.
255
262
  ▼
256
263
  ┌─────────────┐ SSE (replay + live) ┌──────────────────────────┐
257
264
  │ .ai/cezar/ │ ──────────────────────► │ cockpit localhost:4321 │
258
- │ JSON·NDJSON │ │ Tasks · Git · GitHub · │
265
+ │SQLite·NDJSON│ │ Tasks · Git · GitHub · │
259
266
  │ ·Markdown │ │ Skills · Workflows │
260
267
  └─────────────┘ └──────────────────────────┘
261
268
  │
@@ -371,7 +378,16 @@ Every view is project-scoped:
371
378
  `<projectId>` is a slug derived from the folder name (`my-app`, then `my-app-2`
372
379
  on a collision), and `/p/default/…` always means the project cezar was started
373
380
  in. The desktop rail selects the project. Its sidebar shows the project header,
374
- view tabs and task list, with Needs you before Pinned, Working and Recent.
381
+ view tabs and task list, ordered **Needs you → Finished → Working**.
382
+ Pins stay first within their status section and do not spend the default ten-row
383
+ budget; Finished takes priority over Working when that budget fills up. Each
384
+ section starts expanded and folds independently using its heading (click, Enter
385
+ or Space). Folding is remembered per browser, project and section, separately
386
+ from folding a project. Folded headings keep full task counts and attention
387
+ indicators, including tasks outside the visible row limit. These controls work
388
+ in the mobile drawer too. **Archive all** appears only on Finished and archives
389
+ all eligible unpinned tasks, including hidden rows; individual archive actions
390
+ and Undo remain available. Archived keeps its existing history view.
375
391
  Inbox and Automations appear in More views when enabled. The project menu
376
392
  offers Mark all read and project settings; local mode also offers Open in and
377
393
  Copy path. Active/Archived remains below the Tasks heading. The new-task
@@ -411,11 +427,23 @@ server stopped, and `CEZ_HOME` selects which workspace they operate on.
411
427
 
412
428
  Settings split along the same line: **General** (the project's folder, its
413
429
  registry facts, its parallel-task ceiling, and Remove), **Agents**, **Agent config**,
414
- **Worktrees**, **Bookmarklets** and **Prompt templates** describe one
430
+ **Worktrees**, **Sidebar**, **Bookmarklets** and **Prompt templates** describe one
415
431
  repo and live under `/p/<projectId>/settings`; **Appearance**,
416
432
  **Notifications**, **Resources**, **Skills**, **Agent accounts** and **Projects**
417
433
  are yours or the machine's and live at `/settings/global`.
418
434
 
435
+ **Settings → Sidebar** controls this project's task rows on desktop and mobile.
436
+ Set **Overall**, **Needs You**, **Finished**, and **Working** to a positive whole
437
+ number or **Unlimited**. Defaults are 10 overall and Unlimited for each section.
438
+ The overall budget is allocated in section order (Needs You, Finished, Working),
439
+ and each section must also fit its own limit. Unlimited removes only its selected
440
+ constraint. Pinned rows and groups containing pins bypass both budgets; a grouped
441
+ task counts as one row. Archived uses only the overall limit, with no pin exemption.
442
+ Save applies the preferences to this project and keeps them after a reload.
443
+ Refreshed preferences update an untouched form; unsaved edits stay in place.
444
+ Malformed stored sidebar limits fall back field by field to these defaults,
445
+ while valid limits and unrelated preferences are preserved.
446
+
419
447
  On desktop, Settings replaces the sidebar task list with two groups: **This project**
420
448
  and **Global · every project**. Each group includes General and its available sections;
421
449
  the current section is highlighted, and the main page shows its content. On mobile,
@@ -432,6 +460,11 @@ tasks, excluding references to other repositories. Counts show a `+` when the
432
460
  underlying list or search reaches its result limit; an unavailable count is not
433
461
  shown as zero. Views without their own navigation still show tasks in the sidebar.
434
462
 
463
+ Open an issue to see **Linked tasks (N)** beneath its heading. Each row opens a task
464
+ in the current project and shows its title, status and date, newest first. Archived
465
+ tasks remain listed with an **Archived** label, so diagnosis and implementation
466
+ sessions are both reachable.
467
+
435
468
  The Git sidebar lists **Task worktrees** that still exist on disk, including retained
436
469
  worktrees from finished tasks. Each row shows its branch, task title, status and
437
470
  available diff counts, and opens that task's Changes tab. Reclaimed worktrees disappear
@@ -482,7 +515,10 @@ Each row shows **every** PR and issue it references — a task opened on an issu
482
515
  that landed a PR shows both — plus its cost and live CPU/memory, and can be
483
516
  marked **read/unread** (the eye) or **archived** (or restored) right there. Every task title, project name and project group heading links into that
484
517
  project, so the thread, its diff and its worktree are one click away and stay
485
- exactly where they were.
518
+ exactly where they were. Returning to a long thread restores its saved row measurements
519
+ once the replay has rebuilt the same ordered messages, keeping the same content in view.
520
+ Scrolling, jumping to the latest message, or loading different history takes ownership
521
+ from that restoration; a thread left at its live tail follows the current tail.
486
522
 
487
523
  There is deliberately **no project filter**: narrowing this page to one project
488
524
  is that project's own Tasks page, which is a better version of the same answer
@@ -529,8 +565,10 @@ its existing automatic-check schedule when no CI wait is registered.
529
565
 
530
566
  Cezar reports passed, failed, cancelled or skipped checks, no checks, changed head,
531
567
  timeout or an operational error. It watches the registered commit: a new PR head
532
- is reported separately, and the agent decides whether to wait again. Four watchers
533
- run concurrently; queued waits retain their original deadline. Results are bounded
568
+ is reported separately, and the agent decides whether to wait again. The first
569
+ observation runs immediately. Later check-status and PR-head polls run every 30
570
+ seconds, and no setting changes that interval. Four watchers run concurrently;
571
+ queued waits retain their original deadline. Results are bounded
534
572
  observations, not merge approval or evidence that every expected workflow appeared.
535
573
  The agent still decides its next action; CI success never completes the task or
536
574
  accepts review. A human message cancels the current wait, and CI never answers a
@@ -538,7 +576,7 @@ pending human question. Controller recovery can replay an observation after an
538
576
  ambiguous delivery checkpoint, identified by its stable lifecycle input ID.
539
577
 
540
578
  The adapters are bundled for Claude (including `claude-cli`), Codex, OpenCode,
541
- Cursor and Pi. Internal socket/capability environment values are runtime wiring,
579
+ Cursor, Pi and OMP. Internal socket/capability environment values are runtime wiring,
542
580
  not settings to create or share. If the tool is unavailable or denied, its error
543
581
  is surfaced while ordinary tasks continue. See [the CI-wait protocol](AGENT_PROTOCOL.md#ci-wait-tool-contract-474)
544
582
  for limits and the executable harness verification required before release.
@@ -589,7 +627,7 @@ cez worker stop <worker-id>
589
627
  cez worker destroy <worker-id>
590
628
  ```
591
629
 
592
- Use `cez worker --help` to list operations and flags, or `cez worker <operation> --help` for one operation. Explicit help prints human-readable text and exits successfully without an active delegation session. Commands otherwise return bounded JSON and a nonzero exit on failure or incomplete cleanup. Spawn requires a committed baseline (`parent-head` or an explicit ref) and pins its SHA at acceptance; dirty parent edits are excluded. Optional `--context '<text>'` or `--context-file <UTF-8-file>` supplies selected context, not the parent's conversation. The two flags are mutually exclusive, and combined task/context text is limited to 100,000 characters. The API also accepts up to 32 pinned-baseline file or parent-attachment references, with at most 8 MiB of copied attachments. Inspect reports worker-local input locations. Reuse a request ID only with the same task, baseline, context, backend, model, effort and workflow when retrying a lost response. There are at most 32 accepted creations per parent, counting destroyed workers, and 32 undelivered steering messages per worker.
630
+ Use `cez worker --help` to list operations and flags, or `cez worker <operation> --help` for one operation. Explicit help prints human-readable text and exits successfully without an active delegation session. Commands otherwise return bounded JSON and a nonzero exit on failure or incomplete cleanup. Spawn requires a committed baseline (`parent-head` or an explicit ref) and pins its SHA at acceptance; dirty parent edits are excluded. Optional `--context '<text>'` or `--context-file <UTF-8-file>` supplies selected context, not the parent's conversation. The two flags are mutually exclusive, and combined task/context text is limited to 100,000 characters. The API also accepts up to 32 pinned-baseline file or parent-attachment references, with at most 8 MiB of copied attachments. Inspect reports worker-local input locations. Reuse a request ID only with the same task, baseline, context, backend, model, effort and workflow when retrying a lost response. A parent holds at most 32 outstanding workers: accepted, live, or not yet verifiably destroyed. A verified destroy (`cez worker destroy`, or **Clean up** on a finished worker in the cockpit's Workers list) frees a slot; incomplete cleanup keeps its slot until a retry completes. A parent can create at most 1,024 workers in total; past that, start a new task. These limits bound disk resources and runaway spawning, not spending: a worker can be resumed with Continue, and destroying it does not undo charges already made. Cost stays bounded by `maxParallel` and by stopping the parent. There are at most 32 undelivered steering messages per worker.
593
631
 
594
632
  An incomplete destroy reports the remaining resources and a reason. Cezar retries that recorded request after a delay, including after the project's context recovers on server restart. It removes the owned checkout only after process termination and ownership are verified. If the reason persists, inspect the worker process, Git worktree lock and ownership receipt; correct the blocker and use `cez worker destroy <worker-id>` or the cockpit Destroy action to retry immediately. Cezar leaves ambiguous or replaced resources in place for operator review.
595
633
 
@@ -597,7 +635,7 @@ An incomplete destroy reports the remaining resources and a reason. Cezar retrie
597
635
 
598
636
  Explicit default-account model pins are checked against a fresh, nonempty host catalog after account/model resolution and before a worker is created. Named accounts retain existing validation because a default-account catalog cannot disprove their model access. A miss returns `invalid_input`, available models with advertised efforts, and other runners listing the requested ID in `modelChoices`. Empty, stale, or unavailable discovery leaves existing selection validation in place. Accepted retries and omitted model defaults are unchanged.
599
637
 
600
- Omitted `--backend` inherits the parent's active backend. Same-backend workers inherit omitted model/account/effort; `--backend <claude|codex|opencode|pi|cursor>` selecting another backend resolves that backend's project/default account and model without forwarding another provider's settings. `--model <model>` selects a supported model, subject to existing locks. `--effort <low|medium|high|xhigh|max>` pins reasoning effort on same-backend and mixed-backend spawn; omitted `--effort` still inherits the parent pin on same-backend spawn and drops it on mixed-backend spawn. Accepted identity and grants remain fixed across queuing, restart and Continue, including explicit empty grants. Changing or deleting an account registry entry does not rebind a worker. Missing accepted identity evidence or account homes, incompatible Claude state-file layouts, and conflicting later model locks refuse execution explicitly. Credentials and vendor configuration are never copied; each worker receives its own delegation credential, and unspecified native models stay unspecified.
638
+ Omitted `--backend` inherits the parent's active backend. Same-backend workers inherit omitted model/account/effort; `--backend <claude|codex|opencode|pi|cursor|omp>` selecting another backend resolves that backend's project/default account and model without forwarding another provider's settings. `--model <model>` selects a supported model, subject to existing locks. `--effort <low|medium|high|xhigh|max>` pins reasoning effort on same-backend and mixed-backend spawn; omitted `--effort` still inherits the parent pin on same-backend spawn and drops it on mixed-backend spawn. Accepted identity and grants remain fixed across queuing, restart and Continue, including explicit empty grants. Changing or deleting an account registry entry does not rebind a worker. Missing accepted identity evidence or account homes, incompatible Claude state-file layouts, and conflicting later model locks refuse execution explicitly. Credentials and vendor configuration are never copied; each worker receives its own delegation credential, and unspecified native models stay unspecified.
601
639
 
602
640
  Wait registers immediately. End the parent turn to release scheduler capacity; Cezar resumes it on a selected settled outcome or the finite deadline. `any` is the default, `one` requires exactly one worker, and `all` waits for every selected worker. Review, completion, failure, cancellation with proven termination, and destruction are outcomes. Timeout defaults to 600 seconds (1–1800 accepted). `cancel-wait` is idempotent for the retained wait ID and cannot cancel a newer wait. Timeout and wait cancellation report partial outcomes and unresolved workers, never cancel workers, and never automatically re-wait. Steering is attributed agent input and cannot answer a pending human question.
603
641
 
@@ -605,7 +643,7 @@ Parents and owned workers can converse in both directions; a worker may address
605
643
 
606
644
  Messages allow 100,000 characters each, with at most 32 undelivered inputs per recipient, 1,024 messages per family, and 32 pending requests. Request deadlines default to 600 seconds, configurable per message with `--timeout-seconds 1–1800`. Request waits use the same limits and `one`/`any`/`all` modes as worker waits, and each run has one active wait. Incoming conversation can interrupt a parked wait without settling its requests. `cancel-request` cancels an obligation; `cancel-wait` only stops waiting. Completion without a reply, failure, cancellation, destruction, timeout, or sender closure settle obligations distinctly. Late replies remain visible without reopening them.
607
645
 
608
- Messages reach a live recipient as soon as they are accepted, including mid-turn: Claude, Codex, Pi and OpenCode steer them into the running turn, and the model reads them at its next step. Cursor delivers at the turn boundary, because a second prompt would cancel its running turn. Pending conversations go together, in order, up to 32 messages and 100,000 formatted characters per batch; a single valid message is never split. Every message keeps its ID, sender, delivery receipt and request outcome; receipts show queued, delivered and read (when the agent's harness can tell) separately. A pending human question holds messages until it is answered, then they follow right behind the answer. The thread's Details distinguish creation, delivery confirmation and event-recording times.
646
+ Messages reach a live recipient as soon as they are accepted, including mid-turn: Claude, Codex, Pi, OMP and OpenCode steer them into the running turn, and the model reads them at its next step. Cursor delivers at the turn boundary, because a second prompt would cancel its running turn. Pending conversations go together, in order, up to 32 messages and 100,000 formatted characters per batch; a single valid message is never split. Every message keeps its ID, sender, delivery receipt and request outcome; receipts show queued, delivered and read (when the agent's harness can tell) separately. A pending human question holds messages until it is answered, then they follow right behind the answer. The thread's Details distinguish creation, delivery confirmation and event-recording times.
609
647
 
610
648
  Sending to a review or terminal participant without `--resume` reports `not-delivered` and `continuation-required`, with the reason and next command; the CLI exits 1. An active parent can use `worker send --resume` (request or progress) to continue its settled done/review/failed worker with that message as the new instruction. No human Continue is needed for this parent-controlled action. A retry with the same payload and ID never creates another continuation; changing a rejected send to use `--resume` requires a new ID. Stopped or destroyed workers need a new worker. Workers cannot resume parents, and conversation never answers a pending human question. Durable IDs deduplicate accepted queue entries and event replay, but a crash between provider acceptance and its durable delivery checkpoint can leave transport delivery ambiguous; this is not an exactly-once execution guarantee.
611
649
 
@@ -633,11 +671,23 @@ Fix the `cez task` docs. Keep $(example) and "quotes" literal.
633
671
  EOF
634
672
  )
635
673
  cez task wait "$id" --timeout-seconds 900 # 0 done/review/needs you · 1 failed · 3 timeout
636
- cez task status "$id" # slim JSON: status, attention, question, branch…
637
- cez task send "$id" 'Use the retry helper instead' # queued, delivered, or --resume to reopen
674
+ cez task list # currentStepId (running), pullRequestUrl (done/review), capped error (failed)
675
+ cez task status "$id" # slim JSON: status, attention, question, branch, handoffUrl…
676
+ cez task send "$id" 'Use the retry helper instead' # delivered live, queued before start
677
+ cez task send "$id" --resume 'Continue with the next step' # resumed: reopen a settled session
638
678
  cez task log "$id" --follow --timeout-seconds 300 # JSON lines until it ends
639
679
  ```
640
680
 
681
+ `list --status` accepts comma-separated values: `queued`, `running`, `waiting`, `review`,
682
+ `done`, `failed`, `cancelled`. Default rows include only the next-action field for their status
683
+ when defined; errors use the first line, at most 200 characters including `…` when cut.
684
+ Default `status` includes `handoffUrl`, a URL to the existing handoff endpoint even before
685
+ contents are seeded, and keeps the full error. `--full` still prints the contract unchanged.
686
+ To answer a pending `question`, use the same `send` with the answer text. Without `--resume`,
687
+ a closed session returns `delivery: not-delivered` and the `next` command. For multi-line or
688
+ shell-sensitive messages use `send <id> --text-file <path|->` (`-` reads stdin); the quoting
689
+ rules below apply to messages too.
690
+
641
691
  Use `--task-file PATH` to read a saved task (for example, `cez task start --task-file task.md`),
642
692
  or `--task-file -` to read stdin as above. The quoted heredoc delimiter (`<<'EOF'`) keeps
643
693
  backticks and `$()` literal in the task text.
@@ -663,8 +713,8 @@ instead of starting a second. Also: `list`, `stop`, `finish`, `diff [--stat]`, `
663
713
  Use `archive <id>` to hide a task from `list`, `unarchive <id>` to restore it, and
664
714
  `list --all` to include archived tasks. `list` never shows owned workers, with or without
665
715
  `--all`: they are steer targets of their parent task. Id-addressed commands (`status`, `wait`,
666
- `send`, `log`, `stop`, …) still accept a worker's id. `archive-finished` sweeps finished tasks and prints
667
- `{"archived": count}`. The single-task commands print `{"id": "…", "archived": true|false}`.
716
+ `send`, `log`, `stop`, …) still accept a worker's id. `archive-finished` sweeps finished tasks (not scheduled runs waiting on a usage limit, and not owned workers, which leave with their parent) and prints
717
+ `{"archived": count, "ids": [...], "pinnedIds": [...]}`. The single-task commands print `{"id": "…", "archived": true|false}`.
668
718
  Exit codes:
669
719
  `0` ok (`wait`/`start --wait`: the task ended `done`/`review` or stopped for attention), `1` task
670
720
  failed/cancelled or a message was not delivered, `2` no cockpit or the cockpit refused (its `error`
@@ -801,12 +851,15 @@ Useful environment variables:
801
851
  | `CEZ_CLAUDE_PERMISSION_MODE` | Claude agent-run permission flag: `dontAsk` (default), `acceptEdits`, or `bypass`. `bypass` passes `--dangerously-skip-permissions` and omits `--permission-mode`. Unset or unknown keeps today's `dontAsk` / `CEZ_APPROVAL_GATE` path. Provider verification commands are never given this flag. |
802
852
  | `CEZ_CLAUDE_SETTING_SOURCES` | When set, Claude agent runs also pass `--setting-sources <value>` (e.g. `user,project,local`). Unset or empty omits the flag. Provider verification is never given this flag. |
803
853
  | `CEZ_FOLLOWUPS=1` | Turn on the global follow-up **Inbox**: agents are asked to leave follow-ups in `todos.json` when they finish, and the Inbox view appears. Off by default — each task's own **Notes** handoff journal runs either way. |
804
- | `CEZ_AUTOMATIONS=1` | Turn on **GitHub automations**: the Automations view appears and cezar polls GitHub on each enabled automation's interval, launching tasks from what it finds. Off by default, and only the exact value `1` enables it — without it no automation polls GitHub, the automations endpoints answer `409`, and the nav item is absent. Read at boot, so restart after changing it; definitions, receipts and high-watermarks are retained, so unsetting it and restarting restores the feature without migration or data loss. |
805
- | `CEZ_AUTOSAVE=1` | Re-enable the periodic (90 s) autosave commit in task worktrees. Off by default (#471) — turn-end and pre-PR flushes always run, so branches still end complete. Every autosave names its trigger in the commit subject (`cezar autosave (periodic)` vs `(turn end)` / `(run finalize)` / `(pre-PR)`), so the flushes you keep are distinguishable from the timer you disabled. |
854
+ | `CEZ_AUTOMATIONS=1` | Turn on **automations** (GitHub polls and schedules): the Automations view appears and cezar runs each enabled automation while it is open, launching an ordinary task per match or per occurrence. A schedule (daily, weekdays, weekly, every N hours, in the server's time zone) needs no GitHub remote; a GitHub automation polls on its interval. Off by default, and only the exact value `1` enables it — without it nothing polls or fires, the automations endpoints answer `409`, and the nav item is absent. Read at boot, so restart after changing it; definitions, receipts and high-watermarks are retained, so unsetting it and restarting restores the feature without migration or data loss. |
855
+ | `CEZ_PREVIEW=1` | Turn on **live preview** (experimental): agents register a dev server with the `cezar_preview_serve` tool, and the cockpit opens it in a headless Chromium on the host, docked next to the task. cezar first runs a registered command after you press Run and open. Agents can then use `cezar_preview_stop({ port, restart?: boolean })` to stop or restart their own Cezar-started server with that unchanged approval; changed command, cwd or path needs Run and open again. Adopted servers cannot be stopped by this tool. Off by default, and only the exact value `1` enables it — without it the tool is not listed, its route and the preview WebSocket refuse, and `capabilities.preview` is `false`. Read at boot, so restart after changing it. |
856
+ | `CEZ_PREVIEW_NO_SANDBOX=1` | Launch the preview's Chromium with `--no-sandbox`. Off by default and never added automatically, not even for root or in a container; use it only where Chromium's sandbox cannot start, and only for pages you trust. Only the exact value `1` applies. Read at boot. |
857
+ | `CEZ_AUTOSAVE=1` | Re-enable the periodic (90 s) autosave commit in task worktrees. Off by default (open-mercato/cezar#471) — turn-end and pre-PR flushes always run, so branches still end complete. Every autosave names its trigger in the commit subject (`cezar autosave (periodic)` vs `(turn end)` / `(run finalize)` / `(pre-PR)`), so the flushes you keep are distinguishable from the timer you disabled. |
806
858
  | `CEZ_CLAUDE_BIN=/path/to/claude` | Override which `claude` binary is used. |
807
859
  | `CEZ_CODEX_BIN=/path/to/codex` | Override which `codex` binary is used. |
808
860
  | `CEZ_OPENCODE_BIN=/path/to/opencode` | Override which `opencode` binary is used. |
809
861
  | `CEZ_PI_BIN=/path/to/pi` | Override which `pi` binary is used. |
862
+ | `CEZ_OMP_BIN=/path/to/omp` | Override which `omp` (Oh My Pi) binary is used. |
810
863
  | `CEZ_CURSOR_BIN=/path/to/agent` | Override the Cursor CLI (`agent`) executable. |
811
864
  | `CLAUDE_CONFIG_DIR`, `CODEX_HOME` | The agents' **own** variables, honoured where the vendor documents one. Setting one moves that agent's **default account** — the config folder cezar discovers. A *second* login of the same CLI is deliberately not an environment setting, since one process-wide value cannot differ per project: add it under **Settings → Agent accounts** and pick it per project. |
812
865
  | `CEZ_BROWSE_ROOT=~/` | Default root for **Add project → Open local folder…**. The picker cannot navigate above it; a saved workspace value overrides the environment default and must name an existing folder. |
@@ -820,13 +873,13 @@ Useful environment variables:
820
873
  | `CEZ_HIDE_COST=1` | Hide backend-reported monetary cost throughout the browser cockpit while leaving raw input/output token counts visible. Only the exact value `1` enables it; telemetry and API payloads are unchanged, and a restart is required after changing it. |
821
874
  | `CEZ_HIDE_TOKEN_METRICS=1` | Legacy master switch that hides both token usage and cost. It takes precedence over the two independent flags; only the exact value `1` enables it, payloads are unchanged, and a restart is required. |
822
875
  | `GITHUB_TOKEN` | Fallback for GitHub reads/PRs when `gh` isn't authenticated. |
823
- | `CEZ_ENV_PASSTHROUGH=A,B` | Forward these extra host env vars to spawned agents. By default agents get a least-privilege env (safe shell/toolchain vars + the backend's own auth + `GITHUB_TOKEN` + `CEZ_*`), not your full environment — use this to add a var an agent needs. |
824
- | `CEZ_AGENT_ENV_FULL=1` | Escape hatch: give spawned agents the full host environment (pre-hardening behavior). Off by default; only set it if you understand that this hands every host secret to the agent process. |
825
- | `CEZ_AGENT_TMPDIR=0` | Stop giving each task its own temp directory and hand agents the host `TMPDIR` again (pre-#785 behavior). On by default: every run gets `TMPDIR`/`TEMP`/`TMP` pointing at `.ai/cezar/tmp/<task-id>`, created and write-probed before the agent spawns, kept across session close, Continue, and restart while the task is live, and reaped at terminal completion or history deletion (#515) — and kept short enough for unix-socket paths: a checkout so deep that `.ai/cezar/tmp/<task-id>` would cross the kernel's socket-path limit resolves it to a `cez-agent-…` directory under the system temp dir instead (#387), with its location recorded so host temp-environment changes cannot move live scratch. So concurrent tasks stop sharing one directory and a task refuses to start rather than run against a temp directory that silently swallows its shell output (see Troubleshooting below). Only an exact `0` disables it, and it disables the whole thing — the pre-spawn check included, so this stays an escape hatch you can actually take. |
826
- | `CEZ_REDACT_SECRETS=0` | Disable scrubbing of credential values/token shapes from the on-disk state (the NDJSON transcript and the free-text fields of `runs.json`). On by default; leave it on. Controller-generated delegation tokens are always scrubbed. Best-effort defense-in-depth, not a guarantee: it catches known token shapes and the values of your own secret-named env vars, so a credential in neither category can still get through. |
876
+ | `CEZ_ENV_PASSTHROUGH=A,B` | Forward these extra host env vars to spawned agents. By default agents get a least-privilege env (safe shell/toolchain vars + the backend's own auth + `GITHUB_TOKEN` + `CEZ_*`), not your full environment — use this to add a var an agent needs. A dev server live preview starts gets the same env without the backend's auth and `GITHUB_TOKEN`, plus these names. |
877
+ | `CEZ_AGENT_ENV_FULL=1` | Escape hatch: give spawned agents, and dev servers live preview starts, the full host environment (pre-hardening behavior). Off by default; only set it if you understand that this hands every host secret to the agent process. |
878
+ | `CEZ_AGENT_TMPDIR=0` | Stop giving each task its own temp directory and hand agents the host `TMPDIR` again (pre-open-mercato/cezar#785 behavior). On by default: every run gets `TMPDIR`/`TEMP`/`TMP` pointing at `.ai/cezar/tmp/<task-id>`, created and write-probed before the agent spawns, kept across session close, Continue, and restart while the task is live, and reaped at terminal completion or history deletion (hearsay-tools/cezarion#515) — and kept short enough for unix-socket paths: a checkout so deep that `.ai/cezar/tmp/<task-id>` would cross the kernel's socket-path limit resolves it to a `cez-agent-…` directory under the system temp dir instead (hearsay-tools/cezarion#387), with its location recorded so host temp-environment changes cannot move live scratch. So concurrent tasks stop sharing one directory and a task refuses to start rather than run against a temp directory that silently swallows its shell output (see Troubleshooting below). Only an exact `0` disables it, and it disables the whole thing — the pre-spawn check included, so this stays an escape hatch you can actually take. |
879
+ | `CEZ_REDACT_SECRETS=0` | Disable scrubbing of credential values/token shapes from the on-disk state (the NDJSON transcript and the free-text fields of the run records in `runs.db`). On by default; leave it on. Controller-generated delegation tokens are always scrubbed. Best-effort defense-in-depth, not a guarantee: it catches known token shapes and the values of your own secret-named env vars, so a credential in neither category can still get through. |
827
880
  | `CEZ_TITLE_UPDATES=0` | Turn off the live task-title refresh (namer re-runs on each turn end). The Settings → Agents toggle overrides this default. |
828
881
  | `CEZ_AUTONAME=0` | Disable ALL LLM task naming (creation + live) — titles stay heuristic (`437: /om-auto-review-pr`). Under `CEZ_DRY_RUN=1` naming is already off unless forced with `CEZ_AUTONAME=1`. |
829
- | `CEZ_REVIEW_GATE=1` | Turn ON the optional diff-first review gate (#489): a successful, non-autonomous run with changes parks at `review` (Accept / Send back / Draft PR) instead of finishing. Off by default — changed runs settle to `done` with the diff left in the worktree. Only `1` enables. The Settings → Agents toggle overrides this; autonomous runs always skip it. |
882
+ | `CEZ_REVIEW_GATE=1` | Turn ON the optional diff-first review gate (open-mercato/cezar#489): a successful, non-autonomous run with changes parks at `review` (Accept / Send back / Draft PR) instead of finishing. Off by default — changed runs settle to `done` with the diff left in the worktree. Only `1` enables. The Settings → Agents toggle overrides this; autonomous runs always skip it. |
830
883
  | `CEZ_NO_BANNER=1` | Skip the `open-mercato/skills` banner on `cez serve` startup. (The cockpit no longer shows a banner — its skills now live on the Skills page's Manage panel — so this env var is the terminal banner's only switch.) |
831
884
  | `VITE_CEZ_API_BASE=http://localhost:4321` | **Build time only**, and only when the cockpit bundle is deployed apart from the service it talks to. Empty (the default) means "the origin that served this page", which is right for both normal cases: the CLI serves the bundle itself, and `npm run dev` proxies `/api` to the local service. A deployment that must be configured without a rebuild can put `<meta name="cez-api-base" content="…">` in the served HTML instead, which wins over this. |
832
885
  | `VITE_CEZ_E2E=1` | **Build time only.** The cockpit e2e suite sets this when it builds the bundle it drives. It pins `useNow` and every `refetchInterval` so a wait cannot span a 30s tick or a 4s poll. Leave unset for production. |
@@ -851,7 +904,7 @@ df -i "${TMPDIR:-/tmp}" # a tmpfs can exhaust inodes long before
851
904
  Under quota the file is *created* and the write then fails, so the backend reads
852
905
  back a zero-byte capture file and hands the agent an empty result.
853
906
 
854
- **Fix.** Since #785 cezar gives each task its own `TMPDIR` under
907
+ **Fix.** Since open-mercato/cezar#785 cezar gives each task its own `TMPDIR` under
855
908
  `.ai/cezar/tmp/<task-id>` and write-probes it before spawning, so a broken temp
856
909
  directory fails the task with `agent temp directory is not writable: …` on the
857
910
  task thread instead of corrupting its work. If you see that error, free space on
@@ -869,7 +922,7 @@ with `TMPDIR=/tmp` set by hand, the same commands succeed. Tools like `tsx` bind
869
922
  `<tmpdir>/tsx-<uid>/<pid>.pipe`), and the kernel caps a socket path at 104–108
870
923
  bytes — a temp directory near that length leaves no room for the name.
871
924
 
872
- **Fix.** Since #387 cezar keeps each task's temp directory at most 78 bytes. A
925
+ **Fix.** Since hearsay-tools/cezarion#387 cezar keeps each task's temp directory at most 78 bytes. A
873
926
  checkout deep enough to push `.ai/cezar/tmp/<task-id>` past that limit gets a
874
927
  short `cez-agent-…` directory under the system temp directory instead — still
875
928
  per-task, still write-probed before the agent spawns, still reaped when the run
@@ -881,7 +934,7 @@ ends. Checkouts whose path already fits keep the repo-local directory.
881
934
  ## Coding agent backends
882
935
 
883
936
  cezar is not married to one vendor. Every agent step runs through a single
884
- `AgentRunner` seam with five built-in backends:
937
+ `AgentRunner` seam with six built-in backends:
885
938
 
886
939
  | Backend | CLI | How cezar drives it | Tool access |
887
940
  |---|---|---|---|
@@ -890,14 +943,15 @@ cezar is not married to one vendor. Every agent step runs through a single
890
943
  | **OpenCode** _(experimental)_ | [`opencode`](https://opencode.ai) | `opencode serve` — a local HTTP server with an SSE event stream. | Ignores `allowedTools` entirely; every permission is auto-approved. |
891
944
  | **Cursor** | [`agent`](https://cursor.com/docs/cli/installation) | Persistent ACP over stdio. | Uses `--force` and approves ACP allow-once requests; Cursor’s native deny rules still apply. Per-run `allowedTools` and `bashAllowlist` are unsupported. |
892
945
  | **pi** _(experimental)_ | [`pi`](https://github.com/badlogic/pi-mono) | Persistent `--mode rpc` over JSONL; models are picked with the `provider/model` convention. | Maps `allowedTools` onto pi's `--tools` allowlist; default sessions also pass harness extras (`Subagent`, `SubagentSupervisor`, `SubagentWait`) through `--tools`, and an explicit `allowedTools` still restricts. A configured `bashAllowlist` disables Bash because pi cannot express command-prefix rules. |
946
+ | **OMP** _(experimental)_ | [`omp`](https://github.com/can1357/oh-my-pi) | Persistent `--mode rpc` over JSONL (Oh My Pi, a pi fork); models use the `provider/model` convention and are discovered from `omp models --json`. | Maps `allowedTools` onto OMP's `--tools` allowlist (`[]` becomes `--no-tools`); default sessions also pass `todo`, `lsp`, `ast_edit`, `task` and `wait`. A configured `bashAllowlist` disables `bash` because OMP cannot express command-prefix rules. |
893
947
 
894
- > ⚠️ **OpenCode and pi support are experimental.** Both runners work but are less
948
+ > ⚠️ **OpenCode, pi and OMP support are experimental.** These runners work but are less
895
949
  > battle-tested than the Claude Code and Codex backends, and OpenCode auto-approves
896
950
  > every permission (it ignores `allowedTools`). Treat them as previews and expect
897
951
  > rough edges.
898
952
 
899
953
  On startup cezar probes which CLIs are installed and the cockpit only offers
900
- the backends it found — install any one of the five and you're operational.
954
+ the backends it found — install any one of the six and you're operational.
901
955
 
902
956
  ### Cursor CLI
903
957
 
@@ -921,6 +975,19 @@ These select configuration; Cezar does not offer alternate Cursor account profil
921
975
  because a complete credential-and-session home override has not been verified.
922
976
 
923
977
 
978
+ ### OMP (Oh My Pi)
979
+
980
+ Install [OMP](https://github.com/can1357/oh-my-pi) (`curl -fsSL https://omp.sh/install | sh`
981
+ installs a prebuilt binary; Bun is needed only for `--source`) and run `omp login`. Cezar discovers `omp` on PATH;
982
+ `CEZ_OMP_BIN` overrides its location. `omp` is a separate backend from `pi`: a host with
983
+ both binaries keeps both, and `CEZ_PI_BIN` never selects OMP. Select **OMP** in the runner
984
+ picker to use a persistent `--mode rpc` session. A missing CLI leaves the other backends
985
+ available and shows OMP as unavailable. `CEZ_DRY_RUN=1` uses the mock.
986
+
987
+ Agents ask questions through cezar's `CEZ:ASK` marker, and OMP's own sub-agents appear in the
988
+ Agents drawer. Settings → Agent config exposes OMP's `config.yml`, `mcp.json` and
989
+ `AGENTS.md` files. Named OMP profiles and accounts are not supported yet.
990
+
924
991
  **Pick a backend at three levels** (most specific wins):
925
992
 
926
993
  1. **Config default** — `"defaultRunner": "codex"` in `.ai/cezar/config.json`.
@@ -1033,9 +1100,11 @@ cez artifact publish /tmp/decision.md
1033
1100
 
1034
1101
  Cezar supplies the bundled command and task context to agent sessions automatically
1035
1102
  (`CEZ_TASK_ID` and `CEZ_ARTIFACTS_DIR`; do not configure these yourself). The command
1036
- returns JSON with a Markdown link for the agent to share. The Files tab also lists
1037
- published artifacts. It previews text, Markdown and raster images; other formats
1038
- can be downloaded. HTML/scripts never execute inside the cockpit, and embedded
1103
+ returns JSON with a Markdown link for the agent to share. When the owning project
1104
+ is registered, the link keeps that project when copied or opened from another
1105
+ project. If ownership cannot be discovered, publication keeps the legacy task link.
1106
+ The Files tab also lists published artifacts. It previews text, Markdown and raster
1107
+ images; other formats can be downloaded. HTML/scripts never execute inside the cockpit, and embedded
1039
1108
  images in Markdown documents do not load automatically.
1040
1109
 
1041
1110
  Snapshots do not change when the original file changes. They survive worktree
@@ -1064,7 +1133,8 @@ never blocks startup):
1064
1133
  "defaultRunner": "claude", // agent backend: "claude" (default) · "codex" · "opencode" · "pi"
1065
1134
  "modelsLocked": true, // optional: native per-runner model is fixed/read-only; runner stays selectable
1066
1135
  "plannerModel": "sonnet", // model the "Plan first" button uses to draft chains
1067
- "baseBranch": "develop" // branch worktrees fork from + PRs target (also settable in the Git tab)
1136
+ "baseBranch": "develop", // branch worktrees fork from + PRs target (also settable in the Git tab)
1137
+ "worktreeSetup": { "commands": ["npm ci"] } // prepare each new worktree before the agent starts (below)
1068
1138
  }
1069
1139
  ```
1070
1140
 
@@ -1075,8 +1145,9 @@ selector uses that runner's discovered model list. While locked, the model is
1075
1145
  shown read-only and follows the selected runner's native settings; the runner
1076
1146
  itself remains selectable.
1077
1147
 
1078
- Run data (`runs.json`, NDJSON event logs, worktrees, `todos.json`) is
1079
- git-ignored automatically; your workflows and skills stay committable.
1148
+ Run data (`runs.db` and its `-wal`/`-shm` files, the `runs.json.pre-sqlite*.bak`
1149
+ backups, NDJSON event logs, worktrees, `todos.json`) is git-ignored
1150
+ automatically; your workflows and skills stay committable.
1080
1151
 
1081
1152
  Settings that belong to *you* rather than to a repo — the parallel cap
1082
1153
  (`maxParallel`, default **2**), the per-task memory ceiling and the checkout
@@ -1086,6 +1157,56 @@ root — live once in `~/.cezar/config.json`, alongside the
1086
1157
  in a repo's `.ai/cezar/config.json` is imported into the workspace file the
1087
1158
  first time cezar boots there, and ignored afterwards.
1088
1159
 
1160
+ ### Preparing new worktrees
1161
+
1162
+ Every task and worker runs in a fresh worktree, and a fresh worktree has nothing installed. Give
1163
+ the project a `worktreeSetup` and cezar runs those commands in each new worktree before the
1164
+ agent's first turn, so the agent (and anything that runs beside it, such as a test watcher)
1165
+ starts in a ready tree:
1166
+
1167
+ ```jsonc
1168
+ // .ai/cezar/config.json
1169
+ "worktreeSetup": {
1170
+ "commands": ["npm ci", "cp \"$CEZ_PROJECT_ROOT/.env\" .env"],
1171
+ "timeoutSeconds": 900 // optional, per command; default 900, max 7200
1172
+ }
1173
+ ```
1174
+
1175
+ Or edit it in **Settings → Worktrees → Prepare new worktrees**, one command per line. Only a
1176
+ cockpit on the machine running cezar can change it: a hosted cockpit (`CEZ_REMOTE=1`) shows it
1177
+ read-only, because these are commands the host runs.
1178
+
1179
+ - **When it runs.** In every new task worktree and every worker worktree, and again when Continue
1180
+ rebuilds a worktree that retention reclaimed. Never for a task that runs in the repo working
1181
+ tree (worktree off), and never for a non-git directory.
1182
+ - **How it runs.** Each command runs as `bash -lc '<command>'` in the worktree root, in order,
1183
+ and the setup stops at the first command that fails or times out. Up to 20 commands.
1184
+ - **What it can see.** The same curated environment the live preview gives a dev server: your
1185
+ `PATH`, `HOME` and the shell basics, but no agent API keys and no GitHub token. A private
1186
+ registry token reaches it through `CEZ_ENV_PASSTHROUGH=NPM_TOKEN` (or the tool's own config
1187
+ file under `HOME`). It also gets `CEZ_PROJECT_ROOT` (the main checkout, for copying untracked
1188
+ files like `.env`) and `CEZ_TASK_ID`.
1189
+ - **What you see.** The task thread shows a "Ran `<command>`" card per command with its output
1190
+ (the last 20 KB) and a line with the outcome and duration, which also goes into the handoff
1191
+ file.
1192
+ - **What the agent sees.** Its first message says what ran, so it doesn't repeat the install.
1193
+ If a command fails or times out, the agent still starts and its first message names the
1194
+ command, the exit code and the end of the output, so it can fix the cause or work around it.
1195
+ - **Keep generated files gitignored.** Autosave commits whatever Git doesn't ignore, so anything
1196
+ setup creates outside `.gitignore` becomes part of the task's changes. `node_modules/` and
1197
+ `.venv/` are usually ignored already.
1198
+
1199
+ Without the key nothing runs, exactly as before. Examples:
1200
+
1201
+ | Project | `commands` |
1202
+ | --- | --- |
1203
+ | npm | `["npm ci"]` |
1204
+ | pnpm | `["pnpm install --frozen-lockfile"]` |
1205
+ | Python (uv) | `["uv sync --frozen"]` |
1206
+ | Go | `["go mod download"]` |
1207
+ | Rust | `["cargo fetch"]` |
1208
+ | Copy local env | `["cp \"$CEZ_PROJECT_ROOT/.env\" .env"]` |
1209
+
1089
1210
  ### Editing the agents' own config (Settings → Agent config)
1090
1211
 
1091
1212
  cezar picks *which* agent runs; **Settings → Agent config** lets you edit *how* it
@@ -1106,7 +1227,7 @@ hosted cockpit (`CEZ_REMOTE=1`) is read-only and never serves home-file contents
1106
1227
  End-to-end, from a fresh clone to a global `cez` command you can run in **any**
1107
1228
  repo on your machine — no npm publish required.
1108
1229
 
1109
- **1. Prerequisites** — Node 20+ and `git` (plus at least one logged-in agent CLI,
1230
+ **1. Prerequisites** — Node 24.15+ and `git` (plus at least one logged-in agent CLI,
1110
1231
  as in [Quick start](#quick-start)).
1111
1232
 
1112
1233
  **2. Clone & install**
@@ -11,9 +11,11 @@ import type { RunnerId } from '../core/agent-runner.ts';
11
11
  * A raw editor cannot drift on a vendor's *schema*; it can drift on *paths and
12
12
  * precedence strings*, so every entry carries a `docsUrl` and this table is the
13
13
  * single maintenance surface. Facts verified against primary docs 2026-07-16;
14
- * the Pi entries against Pi's README and docs/settings.md on 2026-09-15 (#322).
14
+ * the Pi entries against Pi's README and docs/settings.md on 2026-09-15 (#322);
15
+ * the OMP entries against OMP's docs/config-usage.md and docs/mcp-config.md at
16
+ * main @ 7318a70cf4ed on 2026-10-05 (#595).
15
17
  */
16
- export type ConfigFormat = 'json' | 'jsonc' | 'toml' | 'markdown';
18
+ export type ConfigFormat = 'json' | 'jsonc' | 'toml' | 'yaml' | 'markdown';
17
19
  export type ConfigScope = 'user' | 'project' | 'local';
18
20
  /** `settings` = behavior knobs; `memory` = instruction/markdown; `mcp` = a dedicated MCP file. */
19
21
  export type ConfigKind = 'settings' | 'memory' | 'mcp';
@@ -34,6 +36,8 @@ export interface AgentHomePaths {
34
36
  pi: string;
35
37
  /** Cursor CLI configuration directory; not an account home. */
36
38
  cursor: string;
39
+ /** `$PI_CODING_AGENT_DIR` or `~/${PI_CONFIG_DIR || '.omp'}/agent` — OMP's default profile. */
40
+ omp: string;
37
41
  }
38
42
  export interface ConfigFileDef {
39
43
  /** Stable, opaque, URL-safe. The ONLY thing a client may name (traversal-proof). */
@@ -8,6 +8,8 @@ const OPENCODE_CONFIG_DOCS = 'https://opencode.ai/docs/config/';
8
8
  const OPENCODE_RULES_DOCS = 'https://opencode.ai/docs/rules/';
9
9
  const PI_SETTINGS_DOCS = 'https://github.com/badlogic/pi-mono/blob/main/packages/coding-agent/docs/settings.md';
10
10
  const PI_CONTEXT_FILES_DOCS = 'https://github.com/badlogic/pi-mono/blob/main/packages/coding-agent/README.md#context-files';
11
+ const OMP_CONFIG_DOCS = 'https://github.com/can1357/oh-my-pi/blob/main/docs/config-usage.md';
12
+ const OMP_MCP_DOCS = 'https://github.com/can1357/oh-my-pi/blob/main/docs/mcp-config.md';
11
13
  /**
12
14
  * The table. Order is presentation order: per runner, then user → project →
13
15
  * local so each scope ladder reads top (broad) to bottom (specific).
@@ -245,6 +247,79 @@ export const CONFIG_FILES = [
245
247
  precedence: 'Global context file, loaded first. Every AGENTS.md (or CLAUDE.md) from the parent directories down to the current one is concatenated after it; an AGENTS.override.md replaces that directory’s file only.',
246
248
  docsUrl: PI_CONTEXT_FILES_DOCS,
247
249
  },
250
+ // ---- OMP: verified 2026-10-02 against v18.4.11 ----
251
+ // Oh My Pi (`can1357/oh-my-pi`, docs at main @ 7318a70cf4ed). The user layer lives in
252
+ // `AgentHomePaths.omp` (`$PI_CODING_AGENT_DIR` or `~/${PI_CONFIG_DIR || '.omp'}/agent`, the default
253
+ // profile; a named profile relocates it and is not modelled). Project files always live in
254
+ // `<repo>/.omp/`. Settings are YAML (`config.yml`); no `modelKey`, because OMP has no native-default
255
+ // strategy cezar reads (spec § Model selection). Precedence strings quote the docs in doc order;
256
+ // a numbered doc list is joined with "; ", its wording untouched. Not listed, by the spec's
257
+ // scope: `.omp/AGENTS.md` (OMP's native project context file; project memory is the shared root
258
+ // `AGENTS.md` row) and the `.omp/.mcp.json` / user `.mcp.json` compatibility spellings.
259
+ {
260
+ id: 'omp.user.settings',
261
+ runners: ['omp'],
262
+ kind: 'settings',
263
+ scope: 'user',
264
+ resolve: (_repo, home) => join(home.omp, 'config.yml'),
265
+ label: '~/.omp/agent/config.yml',
266
+ format: 'yaml',
267
+ tracked: 'outside-repo',
268
+ precedence:
269
+ // config-usage.md § Layers, the six-tier list.
270
+ 'Effective precedence, highest first: 1. Environment variable declared on the definition (`env: "NAME"`), parsed by the setting\'s type; unparseable text counts as unset. Booleans follow `parseFlag`: empty is unset, `1`/`y`/`true`/`yes`/`on` (lower or upper case) is true, any other text is false; 2. Runtime overrides: in-memory, non-persistent; 3. Config overlays: `PI_CONFIG_FILES` (platform path-list), followed by repeated `omp --config <path>` files; all are loaded as `config.yml`-style YAML for this process only; 4. Project settings: discovered via the settings capability (`settings.json` and `config.yml` from providers); 5. Global settings: the first present file among `~/.omp/agent/config.yml` and `config.yaml`; 6. Definition default',
271
+ docsUrl: OMP_CONFIG_DOCS,
272
+ },
273
+ {
274
+ id: 'omp.project.settings',
275
+ runners: ['omp'],
276
+ kind: 'settings',
277
+ scope: 'project',
278
+ resolve: (repo) => join(repo, '.omp', 'config.yml'),
279
+ label: '.omp/config.yml',
280
+ format: 'yaml',
281
+ tracked: 'tracked',
282
+ precedence: 'Project settings: discovered via the settings capability (`settings.json` and `config.yml` from providers). Within the native provider, project `config.yml` follows and overrides `settings.json`. Runs read the committed copy.',
283
+ docsUrl: OMP_CONFIG_DOCS,
284
+ },
285
+ {
286
+ id: 'omp.user.mcp',
287
+ runners: ['omp'],
288
+ kind: 'mcp',
289
+ scope: 'user',
290
+ resolve: (_repo, home) => join(home.omp, 'mcp.json'),
291
+ label: '~/.omp/agent/mcp.json',
292
+ format: 'json',
293
+ tracked: 'outside-repo',
294
+ holdsMcp: true,
295
+ precedence: 'Across providers, the first definition wins. Duplicate names are not merged; OpenCode\'s internal config layers are the exception described above. Within OMP native config, project `.omp/mcp.json` precedes `.omp/.mcp.json`, then the active profile\'s user `mcp.json` and `.mcp.json`.',
296
+ docsUrl: OMP_MCP_DOCS,
297
+ },
298
+ {
299
+ id: 'omp.project.mcp',
300
+ runners: ['omp'],
301
+ kind: 'mcp',
302
+ scope: 'project',
303
+ resolve: (repo) => join(repo, '.omp', 'mcp.json'),
304
+ label: '.omp/mcp.json',
305
+ format: 'json',
306
+ tracked: 'tracked',
307
+ holdsMcp: true,
308
+ precedence: 'Across providers, the first definition wins. Duplicate names are not merged; OpenCode\'s internal config layers are the exception described above. Within OMP native config, project `.omp/mcp.json` precedes `.omp/.mcp.json`, then the active profile\'s user `mcp.json` and `.mcp.json`. Runs read the committed copy.',
309
+ docsUrl: OMP_MCP_DOCS,
310
+ },
311
+ {
312
+ id: 'omp.user.memory',
313
+ runners: ['omp'],
314
+ kind: 'memory',
315
+ scope: 'user',
316
+ resolve: (_repo, home) => join(home.omp, 'AGENTS.md'),
317
+ label: '~/.omp/agent/AGENTS.md',
318
+ format: 'markdown',
319
+ tracked: 'outside-repo',
320
+ precedence: '`SYSTEM.md`, `SYSTEM_TEMPLATE.md`, `RULES.md`, and `.omp/AGENTS.md` read user-level files directly and use the nearest non-empty ancestor `.omp` directory for project files. Context files: `.omp/AGENTS.md`; standalone ancestor `AGENTS.md` files are loaded separately by the low-priority `agents-md` provider',
321
+ docsUrl: OMP_CONFIG_DOCS,
322
+ },
248
323
  // ---- Cursor — verified against vendor docs 2026-09-16 ----
249
324
  {
250
325
  id: 'cursor.user.settings',
@@ -283,17 +358,17 @@ export const CONFIG_FILES = [
283
358
  precedence: 'MCP in the CLI uses the same configuration as the editor.',
284
359
  docsUrl: 'https://cursor.com/docs/cli/mcp',
285
360
  },
286
- // ---- Shared: <repo>/AGENTS.md is read by Codex, OpenCode AND Pi ----
361
+ // ---- Shared: <repo>/AGENTS.md is read by Codex, OpenCode, Pi, Cursor AND OMP ----
287
362
  {
288
363
  id: 'project.agents',
289
- runners: ['codex', 'opencode', 'pi', 'cursor'],
364
+ runners: ['codex', 'opencode', 'pi', 'cursor', 'omp'],
290
365
  kind: 'memory',
291
366
  scope: 'project',
292
367
  resolve: (repo) => join(repo, 'AGENTS.md'),
293
368
  label: 'AGENTS.md',
294
369
  format: 'markdown',
295
370
  tracked: 'tracked',
296
- precedence: 'Read by Codex, OpenCode, Pi and Cursor (Claude ignores it). Codex concatenates it root-down; OpenCode uses the first match and prefers it over CLAUDE.md; Pi concatenates every AGENTS.md (or CLAUDE.md) from the parent directories down, after its global file. Runs read the committed copy.',
371
+ precedence: 'Read by Codex, OpenCode, Pi, Cursor and OMP (Claude ignores it). Codex concatenates it root-down; OpenCode uses the first match and prefers it over CLAUDE.md; Pi concatenates every AGENTS.md (or CLAUDE.md) from the parent directories down, after its global file; OMP loads standalone ancestor AGENTS.md files through its low-priority `agents-md` provider. Runs read the committed copy.',
297
372
  docsUrl: OPENCODE_RULES_DOCS,
298
373
  },
299
374
  ];