@wjarka/cezarion 0.16.0 → 0.17.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 (907) hide show
  1. package/LICENSE +1 -0
  2. package/README.md +594 -207
  3. package/dist/agent-config/account-identity.d.ts +3 -19
  4. package/dist/agent-config/account-identity.js +8 -5
  5. package/dist/agent-config/account-identity.js.map +1 -1
  6. package/dist/agent-config/catalog.d.ts +3 -14
  7. package/dist/agent-config/catalog.js.map +1 -1
  8. package/dist/agent-config/files.d.ts +2 -6
  9. package/dist/agent-config/files.js +2 -6
  10. package/dist/agent-config/files.js.map +1 -1
  11. package/dist/agent-config/model-settings/types.d.ts +1 -1
  12. package/dist/agent-config/seed.d.ts +11 -3
  13. package/dist/agent-config/seed.js +52 -48
  14. package/dist/agent-config/seed.js.map +1 -1
  15. package/dist/agent-config/service.js +3 -2
  16. package/dist/agent-config/service.js.map +1 -1
  17. package/dist/agent-config/validate.d.ts +1 -4
  18. package/dist/agent-config/validate.js.map +1 -1
  19. package/dist/application-update/helper.d.ts +2 -2
  20. package/dist/application-update/helper.js +7 -12
  21. package/dist/application-update/helper.js.map +1 -1
  22. package/dist/application-update/launcher.d.ts +4 -0
  23. package/dist/application-update/launcher.js +18 -12
  24. package/dist/application-update/launcher.js.map +1 -1
  25. package/dist/application-update/service.d.ts +3 -3
  26. package/dist/application-update/service.js +1 -1
  27. package/dist/application-update/service.js.map +1 -1
  28. package/dist/archive-on-merge-setting.d.ts +15 -0
  29. package/dist/archive-on-merge-setting.js +14 -0
  30. package/dist/archive-on-merge-setting.js.map +1 -0
  31. package/dist/artifacts/cli.d.ts +8 -0
  32. package/dist/artifacts/cli.js +21 -2
  33. package/dist/artifacts/cli.js.map +1 -1
  34. package/dist/artifacts/resolve.js +2 -1
  35. package/dist/artifacts/resolve.js.map +1 -1
  36. package/dist/artifacts/store.js.map +1 -1
  37. package/dist/automations/automation-cli.d.ts +59 -0
  38. package/dist/automations/automation-cli.js +509 -0
  39. package/dist/automations/automation-cli.js.map +1 -0
  40. package/dist/automations/builtin-skill.d.ts +7 -0
  41. package/dist/automations/builtin-skill.js +14 -0
  42. package/dist/automations/builtin-skill.js.map +1 -0
  43. package/dist/automations/github-baseline.d.ts +3 -0
  44. package/dist/automations/github-baseline.js +17 -0
  45. package/dist/automations/github-baseline.js.map +1 -0
  46. package/dist/automations/github-poller.d.ts +23 -4
  47. package/dist/automations/github-poller.js +157 -88
  48. package/dist/automations/github-poller.js.map +1 -1
  49. package/dist/automations/prompts.d.ts +12 -0
  50. package/dist/automations/prompts.js +160 -0
  51. package/dist/automations/prompts.js.map +1 -0
  52. package/dist/automations/schedule-runner.d.ts +43 -24
  53. package/dist/automations/schedule-runner.js +207 -20
  54. package/dist/automations/schedule-runner.js.map +1 -1
  55. package/dist/automations/scheduler.d.ts +10 -2
  56. package/dist/automations/scheduler.js +200 -54
  57. package/dist/automations/scheduler.js.map +1 -1
  58. package/dist/automations/service.d.ts +777 -0
  59. package/dist/automations/service.js +444 -0
  60. package/dist/automations/service.js.map +1 -0
  61. package/dist/automations/store.d.ts +17 -7
  62. package/dist/automations/store.js +88 -17
  63. package/dist/automations/store.js.map +1 -1
  64. package/dist/automations/task-template.d.ts +7 -2
  65. package/dist/automations/task-template.js +93 -44
  66. package/dist/automations/task-template.js.map +1 -1
  67. package/dist/automations/tool-adapter.d.ts +6 -0
  68. package/dist/automations/tool-adapter.js +108 -0
  69. package/dist/automations/tool-adapter.js.map +1 -0
  70. package/dist/automations/types.d.ts +1 -405
  71. package/dist/automations/types.js +1 -218
  72. package/dist/automations/types.js.map +1 -1
  73. package/dist/autosave-cleanup.d.ts +26 -0
  74. package/dist/autosave-cleanup.js +87 -0
  75. package/dist/autosave-cleanup.js.map +1 -0
  76. package/dist/autosave-git.d.ts +3 -0
  77. package/dist/autosave-git.js +67 -35
  78. package/dist/autosave-git.js.map +1 -1
  79. package/dist/autosave-group.d.ts +8 -0
  80. package/dist/autosave-group.js +61 -0
  81. package/dist/autosave-group.js.map +1 -0
  82. package/dist/autosave-holders.d.ts +31 -4
  83. package/dist/autosave-holders.js +92 -7
  84. package/dist/autosave-holders.js.map +1 -1
  85. package/dist/autosave-windows.d.ts +14 -0
  86. package/dist/autosave-windows.js +36 -2
  87. package/dist/autosave-windows.js.map +1 -1
  88. package/dist/ci-wait/client.d.ts +20 -3
  89. package/dist/ci-wait/client.js +40 -44
  90. package/dist/ci-wait/client.js.map +1 -1
  91. package/dist/ci-wait/controller.d.ts +622 -36
  92. package/dist/ci-wait/controller.js +152 -20
  93. package/dist/ci-wait/controller.js.map +1 -1
  94. package/dist/ci-wait/errors.d.ts +19 -0
  95. package/dist/ci-wait/errors.js +180 -2
  96. package/dist/ci-wait/errors.js.map +1 -1
  97. package/dist/ci-wait/github.d.ts +25 -1
  98. package/dist/ci-wait/github.js +76 -9
  99. package/dist/ci-wait/github.js.map +1 -1
  100. package/dist/ci-wait/mcp.d.ts +0 -1
  101. package/dist/ci-wait/mcp.js +0 -2
  102. package/dist/ci-wait/mcp.js.map +1 -1
  103. package/dist/ci-wait/supervisor.d.ts +7 -0
  104. package/dist/ci-wait/supervisor.js +113 -17
  105. package/dist/ci-wait/supervisor.js.map +1 -1
  106. package/dist/ci-wait/tools.d.ts +536 -16
  107. package/dist/ci-wait/tools.js +165 -20
  108. package/dist/ci-wait/tools.js.map +1 -1
  109. package/dist/config.d.ts +3 -17
  110. package/dist/config.js +4 -60
  111. package/dist/config.js.map +1 -1
  112. package/dist/contract/active-provider.d.ts +12 -0
  113. package/dist/contract/agent-profiles.d.ts +2 -10
  114. package/dist/contract/ask-schema.d.ts +22 -4
  115. package/dist/contract/ask.d.ts +6 -4
  116. package/dist/contract/attachments.d.ts +35 -0
  117. package/dist/contract/attention.d.ts +46 -37
  118. package/dist/contract/automation-requests.d.ts +308 -0
  119. package/dist/contract/automation-schedule.d.ts +40 -11
  120. package/dist/contract/automation-storage.d.ts +512 -0
  121. package/dist/contract/automations.d.ts +421 -40
  122. package/dist/contract/ci-wait.d.ts +41 -4
  123. package/dist/contract/config-requests.d.ts +36 -0
  124. package/dist/contract/conversations.d.ts +24 -10
  125. package/dist/contract/defined.d.ts +8 -0
  126. package/dist/contract/delegation.d.ts +312 -8
  127. package/dist/contract/events.d.ts +24 -3
  128. package/dist/contract/github-requests.d.ts +26 -0
  129. package/dist/contract/github.d.ts +60 -27
  130. package/dist/contract/handoff.d.ts +43 -0
  131. package/dist/contract/health.d.ts +2 -2
  132. package/dist/contract/image-path.d.ts +6 -0
  133. package/dist/contract/index.d.ts +31 -0
  134. package/dist/contract/index.js +3756 -1525
  135. package/dist/contract/live-coordination.d.ts +158 -0
  136. package/dist/contract/live-limits.d.ts +8 -0
  137. package/dist/contract/live.d.ts +123 -0
  138. package/dist/contract/pending-ask.d.ts +58 -0
  139. package/dist/contract/permissions.d.ts +54 -0
  140. package/dist/contract/preview.d.ts +33 -0
  141. package/dist/contract/project-limits.d.ts +33 -0
  142. package/dist/contract/projects.d.ts +486 -20
  143. package/dist/contract/provider-requests.d.ts +77 -0
  144. package/dist/contract/query-requests.d.ts +52 -0
  145. package/dist/contract/repo-requests.d.ts +12 -0
  146. package/dist/contract/run-labels.d.ts +8 -0
  147. package/dist/contract/run-limits.d.ts +8 -0
  148. package/dist/contract/run-predicates.d.ts +32 -0
  149. package/dist/contract/run-requests.d.ts +33 -0
  150. package/dist/contract/run-search.d.ts +193 -0
  151. package/dist/contract/runs.d.ts +2232 -1894
  152. package/dist/contract/scheduled-tasks.d.ts +187 -0
  153. package/dist/contract/skills.d.ts +22 -772
  154. package/dist/contract/team-skill-ref.d.ts +10 -0
  155. package/dist/{core → contract}/tool-display.d.ts +4 -10
  156. package/dist/contract/ui-state-requests.d.ts +60 -0
  157. package/dist/contract/version.d.ts +3 -0
  158. package/dist/contract/voice.d.ts +213 -0
  159. package/dist/contract/waits.d.ts +1204 -0
  160. package/dist/contract/workflow-file.d.ts +37 -0
  161. package/dist/contract/workflow-requests.d.ts +7 -0
  162. package/dist/contract/workflows.d.ts +1 -2
  163. package/dist/contract/workspace.d.ts +34 -82
  164. package/dist/contract/zoned-time.d.ts +2 -11
  165. package/dist/core/agent-env.d.ts +4 -16
  166. package/dist/core/agent-env.js +14 -16
  167. package/dist/core/agent-env.js.map +1 -1
  168. package/dist/core/agent-profiles.d.ts +28 -40
  169. package/dist/core/agent-profiles.js +56 -51
  170. package/dist/core/agent-profiles.js.map +1 -1
  171. package/dist/core/agent-runner.d.ts +88 -44
  172. package/dist/core/agent-runner.js +17 -18
  173. package/dist/core/agent-runner.js.map +1 -1
  174. package/dist/core/ask.d.ts +3 -0
  175. package/dist/core/ask.js +12 -0
  176. package/dist/core/ask.js.map +1 -1
  177. package/dist/core/backend-detect.js +16 -2
  178. package/dist/core/backend-detect.js.map +1 -1
  179. package/dist/core/claude-cli-runner.d.ts +23 -4
  180. package/dist/core/claude-cli-runner.js +280 -76
  181. package/dist/core/claude-cli-runner.js.map +1 -1
  182. package/dist/core/claude-model-catalog.d.ts +2 -10
  183. package/dist/core/claude-model-catalog.js +2 -10
  184. package/dist/core/claude-model-catalog.js.map +1 -1
  185. package/dist/core/claude-ui-mapper.d.ts +2 -2
  186. package/dist/core/claude-ui-mapper.js +94 -2
  187. package/dist/core/claude-ui-mapper.js.map +1 -1
  188. package/dist/core/codex-app-server-runner.d.ts +3 -4
  189. package/dist/core/codex-app-server-runner.js +146 -51
  190. package/dist/core/codex-app-server-runner.js.map +1 -1
  191. package/dist/core/codex-app-server-transport.d.ts +4 -3
  192. package/dist/core/codex-app-server-transport.js +11 -7
  193. package/dist/core/codex-app-server-transport.js.map +1 -1
  194. package/dist/core/codex-approvals.d.ts +12 -0
  195. package/dist/core/codex-approvals.js +161 -0
  196. package/dist/core/codex-approvals.js.map +1 -0
  197. package/dist/core/codex-permissions.d.ts +1 -1
  198. package/dist/core/codex-ui-mapper.js +45 -1
  199. package/dist/core/codex-ui-mapper.js.map +1 -1
  200. package/dist/core/cursor-acp-runner.d.ts +1 -1
  201. package/dist/core/cursor-acp-runner.js +39 -15
  202. package/dist/core/cursor-acp-runner.js.map +1 -1
  203. package/dist/core/cursor-cli-flags.d.ts +19 -0
  204. package/dist/core/cursor-cli-flags.js +47 -0
  205. package/dist/core/cursor-cli-flags.js.map +1 -0
  206. package/dist/core/cursor-model-catalog.d.ts +22 -0
  207. package/dist/core/cursor-model-catalog.js +53 -24
  208. package/dist/core/cursor-model-catalog.js.map +1 -1
  209. package/dist/core/cursor-print-capabilities.d.ts +16 -0
  210. package/dist/core/cursor-print-capabilities.js +141 -0
  211. package/dist/core/cursor-print-capabilities.js.map +1 -0
  212. package/dist/core/cursor-print-process.d.ts +31 -0
  213. package/dist/core/cursor-print-process.js +117 -0
  214. package/dist/core/cursor-print-process.js.map +1 -0
  215. package/dist/core/cursor-print-runner.d.ts +31 -0
  216. package/dist/core/cursor-print-runner.js +555 -0
  217. package/dist/core/cursor-print-runner.js.map +1 -0
  218. package/dist/core/cursor-print-tool-catalog.d.ts +10 -0
  219. package/dist/core/cursor-print-tool-catalog.js +91 -0
  220. package/dist/core/cursor-print-tool-catalog.js.map +1 -0
  221. package/dist/core/cursor-print-ui-mapper.d.ts +47 -0
  222. package/dist/core/cursor-print-ui-mapper.js +553 -0
  223. package/dist/core/cursor-print-ui-mapper.js.map +1 -0
  224. package/dist/core/cursor-runner.d.ts +24 -0
  225. package/dist/core/cursor-runner.js +149 -0
  226. package/dist/core/cursor-runner.js.map +1 -0
  227. package/dist/core/cursor-ui-mapper.js +5 -2
  228. package/dist/core/cursor-ui-mapper.js.map +1 -1
  229. package/dist/core/defined.d.ts +1 -0
  230. package/dist/core/defined.js +2 -0
  231. package/dist/core/defined.js.map +1 -0
  232. package/dist/core/hook-items.d.ts +14 -0
  233. package/dist/core/hook-items.js +13 -0
  234. package/dist/core/hook-items.js.map +1 -0
  235. package/dist/core/host-model-catalog.d.ts +2 -9
  236. package/dist/core/host-model-catalog.js +2 -9
  237. package/dist/core/host-model-catalog.js.map +1 -1
  238. package/dist/core/managed-session.js +15 -3
  239. package/dist/core/managed-session.js.map +1 -1
  240. package/dist/core/model-identity.d.ts +4 -21
  241. package/dist/core/model-identity.js.map +1 -1
  242. package/dist/core/model-presets.d.ts +2 -13
  243. package/dist/core/model-presets.js +2 -13
  244. package/dist/core/model-presets.js.map +1 -1
  245. package/dist/core/omp-model-catalog.js.map +1 -1
  246. package/dist/core/omp-runner.d.ts +6 -7
  247. package/dist/core/omp-runner.js +92 -33
  248. package/dist/core/omp-runner.js.map +1 -1
  249. package/dist/core/omp-ui-mapper.js +1 -1
  250. package/dist/core/omp-ui-mapper.js.map +1 -1
  251. package/dist/core/opencode-model-catalog.js.map +1 -1
  252. package/dist/core/opencode-permissions.d.ts +52 -0
  253. package/dist/core/opencode-permissions.js +101 -0
  254. package/dist/core/opencode-permissions.js.map +1 -0
  255. package/dist/core/opencode-server-runner.d.ts +10 -9
  256. package/dist/core/opencode-server-runner.js +286 -28
  257. package/dist/core/opencode-server-runner.js.map +1 -1
  258. package/dist/core/opencode-session-error.d.ts +15 -7
  259. package/dist/core/opencode-session-error.js +25 -9
  260. package/dist/core/opencode-session-error.js.map +1 -1
  261. package/dist/core/opencode-ui-mapper.js +2 -2
  262. package/dist/core/opencode-ui-mapper.js.map +1 -1
  263. package/dist/core/pi-model-catalog.js.map +1 -1
  264. package/dist/core/pi-runner.d.ts +12 -4
  265. package/dist/core/pi-runner.js +171 -63
  266. package/dist/core/pi-runner.js.map +1 -1
  267. package/dist/core/pi-ui-mapper.js +1 -1
  268. package/dist/core/pi-ui-mapper.js.map +1 -1
  269. package/dist/core/process-usage.d.ts +5 -0
  270. package/dist/core/process-usage.js +24 -4
  271. package/dist/core/process-usage.js.map +1 -1
  272. package/dist/core/provider-auth.d.ts +16 -107
  273. package/dist/core/provider-auth.js +16 -132
  274. package/dist/core/provider-auth.js.map +1 -1
  275. package/dist/core/runner-factory.d.ts +4 -1
  276. package/dist/core/runner-factory.js +3 -3
  277. package/dist/core/runner-factory.js.map +1 -1
  278. package/dist/core/runner-runtime.d.ts +22 -0
  279. package/dist/core/runner-runtime.js +66 -5
  280. package/dist/core/runner-runtime.js.map +1 -1
  281. package/dist/core/runner-tool-grants.d.ts +21 -0
  282. package/dist/core/runner-tool-grants.js +64 -0
  283. package/dist/core/runner-tool-grants.js.map +1 -0
  284. package/dist/core/secret-redaction.d.ts +3 -20
  285. package/dist/core/secret-redaction.js +3 -20
  286. package/dist/core/secret-redaction.js.map +1 -1
  287. package/dist/core/session-process.d.ts +22 -2
  288. package/dist/core/session-process.js +170 -12
  289. package/dist/core/session-process.js.map +1 -1
  290. package/dist/core/shell-env.d.ts +2 -15
  291. package/dist/core/shell-env.js +2 -15
  292. package/dist/core/shell-env.js.map +1 -1
  293. package/dist/core/ui-events.d.ts +60 -47
  294. package/dist/core/ui-events.js +0 -23
  295. package/dist/core/ui-events.js.map +1 -1
  296. package/dist/core/usage-limit.js.map +1 -1
  297. package/dist/data-gitignore.js +3 -1
  298. package/dist/data-gitignore.js.map +1 -1
  299. package/dist/delegation/capacity.d.ts +4 -8
  300. package/dist/delegation/capacity.js +4 -8
  301. package/dist/delegation/capacity.js.map +1 -1
  302. package/dist/delegation/cli.js +123 -21
  303. package/dist/delegation/cli.js.map +1 -1
  304. package/dist/delegation/context.d.ts +19 -3
  305. package/dist/delegation/context.js +217 -22
  306. package/dist/delegation/context.js.map +1 -1
  307. package/dist/delegation/conversations.d.ts +4 -3
  308. package/dist/delegation/conversations.js +7 -5
  309. package/dist/delegation/conversations.js.map +1 -1
  310. package/dist/delegation/destroy-observation.d.ts +1 -1
  311. package/dist/delegation/destroy-observation.js.map +1 -1
  312. package/dist/delegation/effort.js.map +1 -1
  313. package/dist/delegation/execution-identity.d.ts +1 -1
  314. package/dist/delegation/execution-identity.js +41 -7
  315. package/dist/delegation/execution-identity.js.map +1 -1
  316. package/dist/delegation/idle-test-app.d.ts +4 -0
  317. package/dist/delegation/idle-test-app.js +174 -0
  318. package/dist/delegation/idle-test-app.js.map +1 -0
  319. package/dist/delegation/input.js.map +1 -1
  320. package/dist/delegation/park-notice.d.ts +42 -0
  321. package/dist/delegation/park-notice.js +71 -0
  322. package/dist/delegation/park-notice.js.map +1 -0
  323. package/dist/delegation/policy.d.ts +2 -0
  324. package/dist/delegation/policy.js +9 -1
  325. package/dist/delegation/policy.js.map +1 -1
  326. package/dist/delegation/process-liveness.d.ts +10 -15
  327. package/dist/delegation/process-liveness.js +11 -35
  328. package/dist/delegation/process-liveness.js.map +1 -1
  329. package/dist/delegation/provision.js +21 -19
  330. package/dist/delegation/provision.js.map +1 -1
  331. package/dist/delegation/questions.d.ts +3 -1
  332. package/dist/delegation/questions.js +10 -5
  333. package/dist/delegation/questions.js.map +1 -1
  334. package/dist/delegation/readiness.d.ts +2 -2
  335. package/dist/delegation/results.d.ts +4 -1
  336. package/dist/delegation/results.js +49 -18
  337. package/dist/delegation/results.js.map +1 -1
  338. package/dist/delegation/retry-backoff.d.ts +8 -0
  339. package/dist/delegation/retry-backoff.js +8 -0
  340. package/dist/delegation/retry-backoff.js.map +1 -1
  341. package/dist/delegation/routes.d.ts +114 -30
  342. package/dist/delegation/routes.js +4 -1
  343. package/dist/delegation/routes.js.map +1 -1
  344. package/dist/delegation/scratch-cleanup.d.ts +4 -5
  345. package/dist/delegation/scratch-cleanup.js +10 -8
  346. package/dist/delegation/scratch-cleanup.js.map +1 -1
  347. package/dist/delegation/service.d.ts +12 -4
  348. package/dist/delegation/service.js +76 -28
  349. package/dist/delegation/service.js.map +1 -1
  350. package/dist/delegation/transport.d.ts +154 -70
  351. package/dist/delegation/wait.d.ts +11 -0
  352. package/dist/delegation/wait.js +24 -0
  353. package/dist/delegation/wait.js.map +1 -1
  354. package/dist/delegation/windows-test-app.d.ts +5 -0
  355. package/dist/delegation/windows-test-app.js +63 -0
  356. package/dist/delegation/windows-test-app.js.map +1 -0
  357. package/dist/delegation/windows-workspace-identity.d.ts +3 -0
  358. package/dist/delegation/windows-workspace-identity.js +22 -0
  359. package/dist/delegation/windows-workspace-identity.js.map +1 -0
  360. package/dist/delegation/workspace.d.ts +5 -10
  361. package/dist/delegation/workspace.js +136 -75
  362. package/dist/delegation/workspace.js.map +1 -1
  363. package/dist/detached-process.d.ts +103 -0
  364. package/dist/detached-process.js +301 -0
  365. package/dist/detached-process.js.map +1 -0
  366. package/dist/discovery/catalog.d.ts +2 -1
  367. package/dist/discovery/catalog.js.map +1 -1
  368. package/dist/discovery/cli.js +3 -1
  369. package/dist/discovery/cli.js.map +1 -1
  370. package/dist/git-diff-base.d.ts +6 -61
  371. package/dist/git-diff-base.js +6 -70
  372. package/dist/git-diff-base.js.map +1 -1
  373. package/dist/git-index-copy.d.ts +4 -0
  374. package/dist/git-index-copy.js +10 -0
  375. package/dist/git-index-copy.js.map +1 -0
  376. package/dist/git-worktree-lock.d.ts +2 -4
  377. package/dist/git-worktree-lock.js +2 -4
  378. package/dist/git-worktree-lock.js.map +1 -1
  379. package/dist/git-worktree-release.d.ts +2 -2
  380. package/dist/git-worktree-release.js.map +1 -1
  381. package/dist/git-worktree.d.ts +47 -76
  382. package/dist/git-worktree.js +240 -94
  383. package/dist/git-worktree.js.map +1 -1
  384. package/dist/handoff.d.ts +51 -41
  385. package/dist/handoff.js +130 -78
  386. package/dist/handoff.js.map +1 -1
  387. package/dist/index.js +60 -39
  388. package/dist/index.js.map +1 -1
  389. package/dist/merge-observations.d.ts +13 -0
  390. package/dist/merge-observations.js +55 -0
  391. package/dist/merge-observations.js.map +1 -0
  392. package/dist/open-url.js +4 -14
  393. package/dist/open-url.js.map +1 -1
  394. package/dist/paths.d.ts +10 -13
  395. package/dist/paths.js +36 -17
  396. package/dist/paths.js.map +1 -1
  397. package/dist/planner.d.ts +2 -1
  398. package/dist/planner.js +9 -6
  399. package/dist/planner.js.map +1 -1
  400. package/dist/preview/agent-address.d.ts +34 -0
  401. package/dist/preview/agent-address.js +51 -0
  402. package/dist/preview/agent-address.js.map +1 -0
  403. package/dist/preview/agent-marker.d.ts +17 -0
  404. package/dist/preview/agent-marker.js +71 -0
  405. package/dist/preview/agent-marker.js.map +1 -0
  406. package/dist/preview/cdp-proxy.d.ts +54 -0
  407. package/dist/preview/cdp-proxy.js +151 -0
  408. package/dist/preview/cdp-proxy.js.map +1 -0
  409. package/dist/preview/cdp.d.ts +39 -3
  410. package/dist/preview/cdp.js +155 -57
  411. package/dist/preview/cdp.js.map +1 -1
  412. package/dist/preview/chromium.d.ts +18 -6
  413. package/dist/preview/chromium.js +112 -25
  414. package/dist/preview/chromium.js.map +1 -1
  415. package/dist/preview/dev-server.d.ts +1 -1
  416. package/dist/preview/dev-server.js +20 -44
  417. package/dist/preview/dev-server.js.map +1 -1
  418. package/dist/preview/host.d.ts +70 -3
  419. package/dist/preview/host.js +314 -28
  420. package/dist/preview/host.js.map +1 -1
  421. package/dist/preview/registration.d.ts +10 -5
  422. package/dist/preview/registration.js +2 -0
  423. package/dist/preview/registration.js.map +1 -1
  424. package/dist/preview/session.d.ts +2 -0
  425. package/dist/preview/session.js +10 -0
  426. package/dist/preview/session.js.map +1 -1
  427. package/dist/process-wait/exit-file.d.ts +29 -0
  428. package/dist/process-wait/exit-file.js +67 -0
  429. package/dist/process-wait/exit-file.js.map +1 -0
  430. package/dist/process-wait/supervisor.d.ts +30 -0
  431. package/dist/process-wait/supervisor.js +71 -0
  432. package/dist/process-wait/supervisor.js.map +1 -0
  433. package/dist/release/snapshot.d.ts +6 -6
  434. package/dist/runs/agent-tmpdir.d.ts +51 -36
  435. package/dist/runs/agent-tmpdir.js +389 -132
  436. package/dist/runs/agent-tmpdir.js.map +1 -1
  437. package/dist/runs/auto-name.d.ts +6 -6
  438. package/dist/runs/auto-name.js +1 -1
  439. package/dist/runs/auto-name.js.map +1 -1
  440. package/dist/runs/client-request.d.ts +3 -3
  441. package/dist/runs/client-request.js +3 -3
  442. package/dist/runs/client-request.js.map +1 -1
  443. package/dist/runs/delegation-state.d.ts +11 -2
  444. package/dist/runs/delegation-state.js.map +1 -1
  445. package/dist/runs/event-history-agent-context.d.ts +14 -0
  446. package/dist/runs/event-history-agent-context.js +105 -0
  447. package/dist/runs/event-history-agent-context.js.map +1 -0
  448. package/dist/runs/event-history-context.d.ts +15 -0
  449. package/dist/runs/event-history-context.js +109 -0
  450. package/dist/runs/event-history-context.js.map +1 -0
  451. package/dist/runs/event-history.d.ts +4 -1
  452. package/dist/runs/event-history.js +29 -130
  453. package/dist/runs/event-history.js.map +1 -1
  454. package/dist/runs/history-stream.d.ts +2 -0
  455. package/dist/runs/history-stream.js +62 -0
  456. package/dist/runs/history-stream.js.map +1 -0
  457. package/dist/runs/legacy-index.d.ts +6 -19
  458. package/dist/runs/legacy-index.js +6 -19
  459. package/dist/runs/legacy-index.js.map +1 -1
  460. package/dist/runs/live-item-snapshots.d.ts +13 -0
  461. package/dist/runs/live-item-snapshots.js +79 -0
  462. package/dist/runs/live-item-snapshots.js.map +1 -0
  463. package/dist/runs/loaded-run-healing.d.ts +3 -0
  464. package/dist/runs/loaded-run-healing.js +17 -0
  465. package/dist/runs/loaded-run-healing.js.map +1 -0
  466. package/dist/runs/outcome-commit.d.ts +98 -0
  467. package/dist/runs/outcome-commit.js +132 -0
  468. package/dist/runs/outcome-commit.js.map +1 -0
  469. package/dist/runs/pull-requests.d.ts +14 -0
  470. package/dist/runs/pull-requests.js +96 -0
  471. package/dist/runs/pull-requests.js.map +1 -0
  472. package/dist/runs/raw-record.d.ts +3 -15
  473. package/dist/runs/raw-record.js +3 -15
  474. package/dist/runs/raw-record.js.map +1 -1
  475. package/dist/runs/retention.d.ts +2 -2
  476. package/dist/runs/retention.js +7 -0
  477. package/dist/runs/retention.js.map +1 -1
  478. package/dist/runs/review-gate.d.ts +1 -1
  479. package/dist/runs/review-gate.js.map +1 -1
  480. package/dist/runs/run-claims.d.ts +2 -9
  481. package/dist/runs/run-claims.js.map +1 -1
  482. package/dist/runs/run-database.d.ts +29 -34
  483. package/dist/runs/run-database.js +124 -46
  484. package/dist/runs/run-database.js.map +1 -1
  485. package/dist/runs/run-index.d.ts +6 -25
  486. package/dist/runs/run-index.js +25 -38
  487. package/dist/runs/run-index.js.map +1 -1
  488. package/dist/runs/run-row.d.ts +5 -34
  489. package/dist/runs/run-row.js +13 -38
  490. package/dist/runs/run-row.js.map +1 -1
  491. package/dist/runs/store.d.ts +1597 -744
  492. package/dist/runs/store.js +1231 -739
  493. package/dist/runs/store.js.map +1 -1
  494. package/dist/runs/task-markers.d.ts +1 -0
  495. package/dist/runs/task-markers.js +5 -1
  496. package/dist/runs/task-markers.js.map +1 -1
  497. package/dist/runs/task-refs.d.ts +3 -3
  498. package/dist/runs/transcript-facts-fold.d.ts +64 -0
  499. package/dist/runs/transcript-facts-fold.js +109 -0
  500. package/dist/runs/transcript-facts-fold.js.map +1 -0
  501. package/dist/runs/transcript-facts-load.d.ts +11 -0
  502. package/dist/runs/transcript-facts-load.js +66 -0
  503. package/dist/runs/transcript-facts-load.js.map +1 -0
  504. package/dist/runs/transcript-facts-queue.d.ts +30 -0
  505. package/dist/runs/transcript-facts-queue.js +227 -0
  506. package/dist/runs/transcript-facts-queue.js.map +1 -0
  507. package/dist/runs/transcript-facts-worker.d.ts +15 -0
  508. package/dist/runs/transcript-facts-worker.js +26 -0
  509. package/dist/runs/transcript-facts-worker.js.map +1 -0
  510. package/dist/runs/transcript-facts.d.ts +13 -51
  511. package/dist/runs/transcript-facts.js +86 -202
  512. package/dist/runs/transcript-facts.js.map +1 -1
  513. package/dist/runs/ui-event-sink.d.ts +5 -30
  514. package/dist/runs/ui-event-sink.js +8 -30
  515. package/dist/runs/ui-event-sink.js.map +1 -1
  516. package/dist/runs/webhook.d.ts +104 -38
  517. package/dist/runs/webhook.js +180 -77
  518. package/dist/runs/webhook.js.map +1 -1
  519. package/dist/server/app-type.d.ts +2 -17
  520. package/dist/server/archive-on-merge.d.ts +35 -0
  521. package/dist/server/archive-on-merge.js +202 -0
  522. package/dist/server/archive-on-merge.js.map +1 -0
  523. package/dist/server/capabilities.d.ts +3 -15
  524. package/dist/server/capabilities.js +6 -19
  525. package/dist/server/capabilities.js.map +1 -1
  526. package/dist/server/checkout-progress.d.ts +10 -0
  527. package/dist/server/checkout-progress.js +27 -0
  528. package/dist/server/checkout-progress.js.map +1 -0
  529. package/dist/server/checkout.d.ts +10 -19
  530. package/dist/server/checkout.js +15 -45
  531. package/dist/server/checkout.js.map +1 -1
  532. package/dist/server/cockpit-ownership.d.ts +2 -0
  533. package/dist/server/cockpit-ownership.js +9 -0
  534. package/dist/server/cockpit-ownership.js.map +1 -1
  535. package/dist/server/cold-repo-handles.d.ts +2 -7
  536. package/dist/server/cold-repo-handles.js +2 -7
  537. package/dist/server/cold-repo-handles.js.map +1 -1
  538. package/dist/server/completion-actions.d.ts +30 -0
  539. package/dist/server/completion-actions.js +204 -0
  540. package/dist/server/completion-actions.js.map +1 -0
  541. package/dist/server/create-project.d.ts +71 -0
  542. package/dist/server/create-project.js +448 -0
  543. package/dist/server/create-project.js.map +1 -0
  544. package/dist/server/forge/github-filters.d.ts +7 -1
  545. package/dist/server/forge/github-filters.js +66 -51
  546. package/dist/server/forge/github-filters.js.map +1 -1
  547. package/dist/server/forge/github-merge-requirements.d.ts +18 -0
  548. package/dist/server/forge/github-merge-requirements.js +137 -0
  549. package/dist/server/forge/github-merge-requirements.js.map +1 -0
  550. package/dist/server/forge/github.d.ts +98 -111
  551. package/dist/server/forge/github.js +625 -306
  552. package/dist/server/forge/github.js.map +1 -1
  553. package/dist/server/forge/types.d.ts +25 -22
  554. package/dist/server/fs-browse.d.ts +3 -28
  555. package/dist/server/fs-browse.js.map +1 -1
  556. package/dist/server/git-changes.d.ts +5 -15
  557. package/dist/server/git-changes.js +3 -50
  558. package/dist/server/git-changes.js.map +1 -1
  559. package/dist/server/git.d.ts +3 -1
  560. package/dist/server/git.js +12 -0
  561. package/dist/server/git.js.map +1 -1
  562. package/dist/server/github.d.ts +1 -1
  563. package/dist/server/github.js +1 -1
  564. package/dist/server/github.js.map +1 -1
  565. package/dist/server/launch-key.d.ts +2 -4
  566. package/dist/server/launch-key.js +2 -4
  567. package/dist/server/launch-key.js.map +1 -1
  568. package/dist/server/live-routes.d.ts +68 -0
  569. package/dist/server/live-routes.js +147 -0
  570. package/dist/server/live-routes.js.map +1 -0
  571. package/dist/server/open-in-app.d.ts +4 -13
  572. package/dist/server/open-in-app.js +5 -41
  573. package/dist/server/open-in-app.js.map +1 -1
  574. package/dist/server/open-in-targets.d.ts +42 -0
  575. package/dist/server/open-in-targets.js +110 -0
  576. package/dist/server/open-in-targets.js.map +1 -0
  577. package/dist/server/open-in-terminal.d.ts +3 -0
  578. package/dist/server/open-in-terminal.js +6 -26
  579. package/dist/server/open-in-terminal.js.map +1 -1
  580. package/dist/server/preview-cdp-socket.d.ts +21 -0
  581. package/dist/server/preview-cdp-socket.js +112 -0
  582. package/dist/server/preview-cdp-socket.js.map +1 -0
  583. package/dist/server/preview-socket.d.ts +11 -11
  584. package/dist/server/preview-socket.js +22 -22
  585. package/dist/server/preview-socket.js.map +1 -1
  586. package/dist/server/preview-sockets.d.ts +14 -0
  587. package/dist/server/preview-sockets.js +18 -0
  588. package/dist/server/preview-sockets.js.map +1 -0
  589. package/dist/server/project-context.d.ts +54 -18
  590. package/dist/server/project-context.js +178 -5
  591. package/dist/server/project-context.js.map +1 -1
  592. package/dist/server/provider-action-gate.d.ts +0 -2
  593. package/dist/server/provider-action-gate.js +0 -21
  594. package/dist/server/provider-action-gate.js.map +1 -1
  595. package/dist/server/provider-auth-runtime.d.ts +3 -18
  596. package/dist/server/provider-auth-runtime.js +3 -18
  597. package/dist/server/provider-auth-runtime.js.map +1 -1
  598. package/dist/server/repo-branches.d.ts +3 -9
  599. package/dist/server/repo-branches.js +6 -22
  600. package/dist/server/repo-branches.js.map +1 -1
  601. package/dist/server/run-event-feed.d.ts +20 -0
  602. package/dist/server/run-event-feed.js +190 -0
  603. package/dist/server/run-event-feed.js.map +1 -0
  604. package/dist/server/server-deps.d.ts +37 -0
  605. package/dist/server/server-deps.js +114 -0
  606. package/dist/server/server-deps.js.map +1 -0
  607. package/dist/server/server.d.ts +14082 -11998
  608. package/dist/server/server.js +785 -1647
  609. package/dist/server/server.js.map +1 -1
  610. package/dist/server/start-run-options.d.ts +82 -0
  611. package/dist/server/start-run-options.js +111 -0
  612. package/dist/server/start-run-options.js.map +1 -0
  613. package/dist/server/validators.d.ts +3 -29
  614. package/dist/server/validators.js +1 -2
  615. package/dist/server/validators.js.map +1 -1
  616. package/dist/server/ws.d.ts +3 -23
  617. package/dist/server/ws.js +3 -23
  618. package/dist/server/ws.js.map +1 -1
  619. package/dist/server-install/engine.d.ts +6 -9
  620. package/dist/server-install/engine.js +2 -9
  621. package/dist/server-install/engine.js.map +1 -1
  622. package/dist/server-install/platforms/ubuntu-vps.d.ts +1 -1
  623. package/dist/server-install/state.d.ts +2 -4
  624. package/dist/server-install/state.js +2 -4
  625. package/dist/server-install/state.js.map +1 -1
  626. package/dist/server-install/steps.d.ts +2 -5
  627. package/dist/server-install/steps.js +3 -6
  628. package/dist/server-install/steps.js.map +1 -1
  629. package/dist/server-install/types.d.ts +3 -6
  630. package/dist/server-install/types.js +2 -5
  631. package/dist/server-install/types.js.map +1 -1
  632. package/dist/server-install/ui.d.ts +2 -8
  633. package/dist/server-install/ui.js +3 -3
  634. package/dist/server-install/ui.js.map +1 -1
  635. package/dist/session-context.d.ts +64 -0
  636. package/dist/session-context.js +264 -0
  637. package/dist/session-context.js.map +1 -0
  638. package/dist/skills-provision.d.ts +62 -0
  639. package/dist/skills-provision.js +325 -0
  640. package/dist/skills-provision.js.map +1 -0
  641. package/dist/skills-remote.d.ts +29 -27
  642. package/dist/skills-remote.js +236 -100
  643. package/dist/skills-remote.js.map +1 -1
  644. package/dist/skills.d.ts +25 -36
  645. package/dist/skills.js +43 -54
  646. package/dist/skills.js.map +1 -1
  647. package/dist/subcommands.d.ts +11 -0
  648. package/dist/subcommands.js +24 -0
  649. package/dist/subcommands.js.map +1 -0
  650. package/dist/task-cli/cli.js +78 -25
  651. package/dist/task-cli/cli.js.map +1 -1
  652. package/dist/task-cli/discovery.d.ts +4 -2
  653. package/dist/task-cli/discovery.js +14 -13
  654. package/dist/task-cli/discovery.js.map +1 -1
  655. package/dist/task-cli/hint.d.ts +20 -0
  656. package/dist/task-cli/hint.js +14 -0
  657. package/dist/task-cli/hint.js.map +1 -0
  658. package/dist/task-cli/http.d.ts +1 -0
  659. package/dist/task-cli/http.js +3 -1
  660. package/dist/task-cli/http.js.map +1 -1
  661. package/dist/task-cli/projections.d.ts +14 -11
  662. package/dist/task-cli/projections.js +15 -11
  663. package/dist/task-cli/projections.js.map +1 -1
  664. package/dist/task-cli/watch.d.ts +18 -10
  665. package/dist/task-cli/watch.js +128 -20
  666. package/dist/task-cli/watch.js.map +1 -1
  667. package/dist/ui-state.d.ts +17 -3
  668. package/dist/ui-state.js +56 -9
  669. package/dist/ui-state.js.map +1 -1
  670. package/dist/update-check.d.ts +0 -10
  671. package/dist/update-check.js +1 -16
  672. package/dist/update-check.js.map +1 -1
  673. package/dist/voice/decide.d.ts +32 -0
  674. package/dist/voice/decide.js +297 -0
  675. package/dist/voice/decide.js.map +1 -0
  676. package/dist/voice/decision-log.d.ts +52 -0
  677. package/dist/voice/decision-log.js +107 -0
  678. package/dist/voice/decision-log.js.map +1 -0
  679. package/dist/voice/engine.d.ts +119 -0
  680. package/dist/voice/engine.js +60 -0
  681. package/dist/voice/engine.js.map +1 -0
  682. package/dist/voice/fake-engine.d.ts +10 -0
  683. package/dist/voice/fake-engine.js +192 -0
  684. package/dist/voice/fake-engine.js.map +1 -0
  685. package/dist/voice/jev-engine.d.ts +17 -0
  686. package/dist/voice/jev-engine.js +110 -0
  687. package/dist/voice/jev-engine.js.map +1 -0
  688. package/dist/voice/pending-ask.d.ts +17 -0
  689. package/dist/voice/pending-ask.js +50 -0
  690. package/dist/voice/pending-ask.js.map +1 -0
  691. package/dist/voice/routes.d.ts +115 -0
  692. package/dist/voice/routes.js +91 -0
  693. package/dist/voice/routes.js.map +1 -0
  694. package/dist/voice/sentence.d.ts +21 -0
  695. package/dist/voice/sentence.js +61 -0
  696. package/dist/voice/sentence.js.map +1 -0
  697. package/dist/voice/thresholds.d.ts +28 -0
  698. package/dist/voice/thresholds.js +29 -0
  699. package/dist/voice/thresholds.js.map +1 -0
  700. package/dist/webhooks/cli.d.ts +18 -0
  701. package/dist/webhooks/cli.js +145 -0
  702. package/dist/webhooks/cli.js.map +1 -0
  703. package/dist/webhooks/prompt.d.ts +5 -0
  704. package/dist/webhooks/prompt.js +26 -0
  705. package/dist/webhooks/prompt.js.map +1 -0
  706. package/dist/workflows/active-run.d.ts +167 -0
  707. package/dist/workflows/active-run.js +21 -0
  708. package/dist/workflows/active-run.js.map +1 -0
  709. package/dist/workflows/continuation-admission.d.ts +913 -0
  710. package/dist/workflows/continuation-admission.js +265 -0
  711. package/dist/workflows/continuation-admission.js.map +1 -0
  712. package/dist/workflows/execution-account.d.ts +13 -0
  713. package/dist/workflows/execution-account.js +18 -0
  714. package/dist/workflows/execution-account.js.map +1 -0
  715. package/dist/workflows/input-acknowledgement.d.ts +152 -0
  716. package/dist/workflows/input-acknowledgement.js +38 -0
  717. package/dist/workflows/input-acknowledgement.js.map +1 -0
  718. package/dist/workflows/line-order.d.ts +5 -0
  719. package/dist/workflows/line-order.js +25 -0
  720. package/dist/workflows/line-order.js.map +1 -0
  721. package/dist/workflows/outcome-batches.d.ts +20 -0
  722. package/dist/workflows/outcome-batches.js +25 -0
  723. package/dist/workflows/outcome-batches.js.map +1 -0
  724. package/dist/workflows/question-routing.d.ts +8 -0
  725. package/dist/workflows/question-routing.js +18 -0
  726. package/dist/workflows/question-routing.js.map +1 -0
  727. package/dist/workflows/run-scheduling.d.ts +35 -0
  728. package/dist/workflows/run-scheduling.js +61 -0
  729. package/dist/workflows/run-scheduling.js.map +1 -0
  730. package/dist/workflows/run-states.d.ts +190 -0
  731. package/dist/workflows/run-states.js +295 -0
  732. package/dist/workflows/run-states.js.map +1 -0
  733. package/dist/workflows/run.d.ts +1296 -278
  734. package/dist/workflows/run.js +5730 -3265
  735. package/dist/workflows/run.js.map +1 -1
  736. package/dist/workflows/turn-end.d.ts +116 -0
  737. package/dist/workflows/turn-end.js +68 -0
  738. package/dist/workflows/turn-end.js.map +1 -0
  739. package/dist/workflows/types.d.ts +35 -130
  740. package/dist/workflows/types.js +47 -100
  741. package/dist/workflows/types.js.map +1 -1
  742. package/dist/workflows/waits.d.ts +74 -0
  743. package/dist/workflows/waits.js +197 -0
  744. package/dist/workflows/waits.js.map +1 -0
  745. package/dist/workspace/agent-accounts.d.ts +5 -38
  746. package/dist/workspace/agent-accounts.js +14 -40
  747. package/dist/workspace/agent-accounts.js.map +1 -1
  748. package/dist/workspace/agent-profiles.d.ts +40 -16
  749. package/dist/workspace/agent-profiles.js +77 -17
  750. package/dist/workspace/agent-profiles.js.map +1 -1
  751. package/dist/workspace/config.d.ts +48 -49
  752. package/dist/workspace/config.js +68 -72
  753. package/dist/workspace/config.js.map +1 -1
  754. package/dist/workspace/migrations.d.ts +3 -13
  755. package/dist/workspace/migrations.js.map +1 -1
  756. package/dist/workspace/projects-cli.d.ts +1 -1
  757. package/dist/workspace/projects-cli.js.map +1 -1
  758. package/dist/workspace/projects.d.ts +15 -18
  759. package/dist/workspace/projects.js +20 -16
  760. package/dist/workspace/projects.js.map +1 -1
  761. package/dist/workspace/semaphore.d.ts +11 -45
  762. package/dist/workspace/semaphore.js +6 -18
  763. package/dist/workspace/semaphore.js.map +1 -1
  764. package/dist/workspace/ui-state.d.ts +6 -4
  765. package/dist/workspace/ui-state.js +6 -4
  766. package/dist/workspace/ui-state.js.map +1 -1
  767. package/dist/workspace/webhooks.d.ts +40 -0
  768. package/dist/workspace/webhooks.js +146 -0
  769. package/dist/workspace/webhooks.js.map +1 -0
  770. package/dist/worktree-manifest.d.ts +165 -0
  771. package/dist/worktree-manifest.js +530 -0
  772. package/dist/worktree-manifest.js.map +1 -0
  773. package/dist/worktree-setup.js.map +1 -1
  774. package/package.json +6 -5
  775. package/scripts/benchmark-run-store-fixture.ts +7 -3
  776. package/scripts/check-pack.mjs +3 -1
  777. package/scripts/inline-contract.mjs +80 -27
  778. package/scripts/install-as-command.mjs +3 -1
  779. package/scripts/measure-transcript-facts-health.mjs +87 -0
  780. package/scripts/measure-transcript-facts-lag.mjs +68 -0
  781. package/scripts/mock-ci-tool.mjs +49 -6
  782. package/scripts/mock-claude-model-refusal.mjs +42 -0
  783. package/scripts/mock-claude.mjs +833 -591
  784. package/scripts/mock-codex-app-server.mjs +785 -418
  785. package/scripts/mock-cursor-acp.mjs +296 -125
  786. package/scripts/mock-cursor-print.mjs +256 -0
  787. package/scripts/mock-deferred-turn-start.mjs +16 -0
  788. package/scripts/mock-delivery-control.d.mts +23 -0
  789. package/scripts/mock-delivery-control.mjs +80 -0
  790. package/scripts/mock-env-record.mjs +11 -0
  791. package/scripts/mock-failure-control.d.mts +13 -0
  792. package/scripts/mock-failure-control.mjs +68 -0
  793. package/scripts/mock-multi-pr.mjs +7 -0
  794. package/scripts/mock-nudge.mjs +45 -0
  795. package/scripts/mock-omp-rpc.mjs +429 -255
  796. package/scripts/mock-opencode-serve.mjs +972 -557
  797. package/scripts/mock-pi-rpc.mjs +558 -331
  798. package/scripts/mock-runner-crash.mjs +18 -2
  799. package/scripts/mock-session-context.d.mts +5 -0
  800. package/scripts/mock-session-context.mjs +56 -0
  801. package/scripts/mock-silent-tail.mjs +10 -3
  802. package/scripts/pi-default-tools.mjs +22 -0
  803. package/scripts/pi-project-skills.mjs +59 -0
  804. package/scripts/probe-cursor-print.mjs +627 -0
  805. package/scripts/transcript-facts-fixture.mjs +53 -0
  806. package/scripts/voice-replay.ts +50 -0
  807. package/scripts/windows-workspace-identity.cs +208 -0
  808. package/scripts/windows-workspace-identity.ps1 +10 -0
  809. package/web/dist/assets/alert-dialog-DfctKUMw.js +1 -0
  810. package/web/dist/assets/button-CeupvoKG.js +41 -0
  811. package/web/dist/assets/centered-state-hDsyXrnH.js +1 -0
  812. package/web/dist/assets/cez-idle-D3aj_9lp.js +1 -0
  813. package/web/dist/assets/diff-BnIXZK3i2.js +3 -0
  814. package/web/dist/assets/diff-controls-GewpW9aF.js +1 -0
  815. package/web/dist/assets/diff-view-Byo7gpvW.js +11 -0
  816. package/web/dist/assets/dropdown-menu-COj_J5wd.js +6 -0
  817. package/web/dist/assets/eye-B8okNWXU.js +1 -0
  818. package/web/dist/assets/git-toolbar-DY0z0n4S.js +1 -0
  819. package/web/dist/assets/github-DwU6ALRK.js +1 -0
  820. package/web/dist/assets/{image-preview-FOEfqpZP.js → image-preview-C_t9q45f.js} +1 -1
  821. package/web/dist/assets/index-BOfE8pyD.js +34 -0
  822. package/web/dist/assets/index-D9HpsmdW.css +1 -0
  823. package/web/dist/assets/live-protocol-Uce2NwEX.js +64 -0
  824. package/web/dist/assets/live-worker-BizfZSoh.ts +33 -0
  825. package/web/dist/assets/markdown-BBDDg-4t.js +1 -0
  826. package/web/dist/assets/nav-row-styles-AoIhhIwf.js +1 -0
  827. package/web/dist/assets/popover-D56fhiXj.js +1 -0
  828. package/web/dist/assets/preview-pane-connected-BmVqfSU5.js +3 -0
  829. package/web/dist/assets/reference-chip-gQNk-4jc.js +1 -0
  830. package/web/dist/assets/repo-git-B5ECDUuv.js +1 -0
  831. package/web/dist/assets/{repo-git-CoKp-g9K.css → repo-git-DVXNOJDT.css} +1 -1
  832. package/web/dist/assets/run-header-C0Y1NvEM.js +2 -0
  833. package/web/dist/assets/run-header-CC7VUTg9.css +1 -0
  834. package/web/dist/assets/skills-DUeTkZ9z.js +1 -0
  835. package/web/dist/assets/status-dot-1PR0i69P.js +1 -0
  836. package/web/dist/assets/tab-link-DmWk4l5O.js +1 -0
  837. package/web/dist/assets/task-changes-DKZXuW89.js +1 -0
  838. package/web/dist/assets/task-commits-BZ6KxWdF.js +1 -0
  839. package/web/dist/assets/task-files-DlF7Apcn.js +2 -0
  840. package/web/dist/assets/task-github-item-CVPo3geZ.js +1 -0
  841. package/web/dist/assets/task-thread-DtQ6uGfQ.css +1 -0
  842. package/web/dist/assets/task-thread-mm4-ECyo.js +9 -0
  843. package/web/dist/assets/thread-state-CIw2BlhT.js +4 -0
  844. package/web/dist/assets/use-hand-to-agent-state-BCDjzHnG.js +1 -0
  845. package/web/dist/assets/use-hand-to-agent-state-C7esPJ-N.css +1 -0
  846. package/web/dist/assets/workflows-D8vYD-ql.js +7 -0
  847. package/web/dist/assets/zoomable-image-CxQSsfcn.js +1 -0
  848. package/web/dist/index.html +13 -17
  849. package/web/dist/live-worker.js +4 -0
  850. package/dist/core/tool-display.js +0 -179
  851. package/dist/core/tool-display.js.map +0 -1
  852. package/dist/runs/human-ask-summary.d.ts +0 -9
  853. package/dist/runs/human-ask-summary.js +0 -39
  854. package/dist/runs/human-ask-summary.js.map +0 -1
  855. package/dist/runs/run-search.d.ts +0 -29
  856. package/dist/runs/run-search.js +0 -63
  857. package/dist/runs/run-search.js.map +0 -1
  858. package/dist/skills-banner.d.ts +0 -22
  859. package/dist/skills-banner.js +0 -41
  860. package/dist/skills-banner.js.map +0 -1
  861. package/dist/skills-update.d.ts +0 -88
  862. package/dist/skills-update.js +0 -392
  863. package/dist/skills-update.js.map +0 -1
  864. package/dist/todos.d.ts +0 -48
  865. package/dist/todos.js +0 -201
  866. package/dist/todos.js.map +0 -1
  867. package/web/dist/assets/agent-accounts-CFOBMVHc.js +0 -1
  868. package/web/dist/assets/alert-dialog-BrpNUwMt.js +0 -1
  869. package/web/dist/assets/button-C_rd7CPp.js +0 -43
  870. package/web/dist/assets/compare-variants-D6WXhvXA.js +0 -1
  871. package/web/dist/assets/diff-DrEARXTV.js +0 -3
  872. package/web/dist/assets/diff-controls-B1-j7nFg.js +0 -1
  873. package/web/dist/assets/diff-view-DvGLjdTk.js +0 -6
  874. package/web/dist/assets/dropdown-menu-BegOZFrj.js +0 -1
  875. package/web/dist/assets/format-DpNe3S0A.js +0 -1
  876. package/web/dist/assets/git-toolbar-Cw4ljmhB.js +0 -1
  877. package/web/dist/assets/github-CfV5sqL0.js +0 -1
  878. package/web/dist/assets/index-DgWWlOLy.js +0 -13
  879. package/web/dist/assets/index-fBFnuvxu.css +0 -1
  880. package/web/dist/assets/nav-row-styles-vp2JbhuJ.js +0 -1
  881. package/web/dist/assets/popover-BohP6WTx.js +0 -1
  882. package/web/dist/assets/preview-pane-connected-qTA5KNoJ.js +0 -3
  883. package/web/dist/assets/preview-state-vuMviq6q.js +0 -1
  884. package/web/dist/assets/prompt-templates-Cubdut_C.js +0 -15
  885. package/web/dist/assets/repo-git-Cf4t5PD0.js +0 -1
  886. package/web/dist/assets/run-diff-BpkUW37Z.js +0 -3
  887. package/web/dist/assets/run-header-68WHf9wV.js +0 -1
  888. package/web/dist/assets/run-header-8GObNx6F.css +0 -1
  889. package/web/dist/assets/search-x-I9Q8pgUa.js +0 -1
  890. package/web/dist/assets/skills-DFBiAuJG.js +0 -1
  891. package/web/dist/assets/skills-DiVIgKeU.js +0 -1
  892. package/web/dist/assets/square-terminal-B6RYYieR.js +0 -1
  893. package/web/dist/assets/status-dot-CqTJHSP9.js +0 -1
  894. package/web/dist/assets/tab-link-B07Hu4QX.js +0 -1
  895. package/web/dist/assets/task-changes--lQF6EYf.js +0 -1
  896. package/web/dist/assets/task-commits-Cx0qy4DN.js +0 -1
  897. package/web/dist/assets/task-files-D50s-gKW.js +0 -2
  898. package/web/dist/assets/task-github-item-DaqmSwYT.js +0 -1
  899. package/web/dist/assets/task-thread-BPQ64lui.js +0 -7
  900. package/web/dist/assets/task-thread-zNE2Q9E-.css +0 -1
  901. package/web/dist/assets/textarea-D20O4Pw0.js +0 -1
  902. package/web/dist/assets/thread-state-DWcFMrvb.js +0 -4
  903. package/web/dist/assets/use-hand-to-agent-state-BLIGmwbd.css +0 -1
  904. package/web/dist/assets/use-hand-to-agent-state-Cy9eyyfL.js +0 -1
  905. package/web/dist/assets/utils-JsL3ZsJf.js +0 -64
  906. package/web/dist/assets/workflows-jwG7uxqi.js +0 -11
  907. package/web/dist/assets/zoomable-image-BJJ64KGc.js +0 -1
@@ -1,10 +1,24 @@
1
1
  #!/usr/bin/env node
2
+ // Load only when configured: ordinary mock turns retain their event-loop ordering.
3
+ const failureControl = process.env.CEZ_MOCK_FAILURE_CONTROL === undefined ? undefined
4
+ : (await import('./mock-failure-control.mjs')).readFailureControl();
5
+ const delivery = process.env.CEZ_MOCK_DELIVERY_CONTROL === undefined ? undefined
6
+ : (await import('./mock-delivery-control.mjs')).readDeliveryControl(['reject', 'hold-ack', 'hold-response']);
2
7
  // Keep this fixture standalone: lifecycle tests copy the runner into a temp directory.
3
8
  import { spawn as watchdogSpawn } from 'node:child_process';
4
- import { writeFileSync as watchdogWritePid } from 'node:fs';
9
+ import { closeSync as watchdogCloseInput, renameSync as watchdogRename, writeFileSync as watchdogWrite, existsSync as promptAckReleased } from 'node:fs';
10
+ // Publish a pid atomically (temporary sibling, then rename): a test reading it sees no
11
+ // file or a whole pid, never the empty file whose Number() is 0 (hearsay-tools/cezarion#953).
12
+ function watchdogWritePid(file, pid) { const tmp = `${file}.${process.pid}.tmp`; watchdogWrite(tmp, pid); watchdogRename(tmp, file); }
5
13
  function watchdogStall(prompt) {
6
14
  if (!prompt.includes('mock:no-progress')) return false;
7
- watchdogWritePid('watchdog.pid', String(process.pid));
15
+ if (prompt.includes('input-closed')) {
16
+ watchdogCloseInput(0);
17
+ watchdogWritePid('input-closed.pid', String(process.pid));
18
+ // The S29 acknowledgement gate keeps the native pipe closed while the test
19
+ // releases the initial prompt ACK. All other fixtures retain their exit.
20
+ setTimeout(() => process.exit(0), prompt.includes('mock:gate-prompt-ack') ? 15_000 : 300);
21
+ }
8
22
  if (prompt.includes('ignore-term')) {
9
23
  process.removeAllListeners('SIGTERM');
10
24
  process.on('SIGTERM', () => {});
@@ -17,15 +31,20 @@ function watchdogStall(prompt) {
17
31
  if (prompt.includes('leftover')) {
18
32
  // hearsay-tools/cezarion#890: one child stays in the session's process group and ignores
19
33
  // SIGTERM; one leaves the group with setsid. Both exit on their own as a cleanup backstop.
20
- const leftover = (file) => `process.on('SIGTERM',()=>{}); require('fs').writeFileSync(${JSON.stringify(file)}, String(process.pid)); setTimeout(()=>{},20000)`;
34
+ const leftover = (file) => `process.on('SIGTERM',()=>{}); const fs = require('fs'); fs.writeFileSync(${JSON.stringify(`${file}.tmp`)}, String(process.pid)); fs.renameSync(${JSON.stringify(`${file}.tmp`)}, ${JSON.stringify(file)}); setTimeout(()=>{},20000)`;
21
35
  watchdogSpawn(process.execPath, ['-e', leftover('leftover-group.pid')], { stdio: 'ignore' });
22
36
  watchdogSpawn(process.execPath, ['-e', leftover('leftover-session.pid')], { stdio: 'ignore', detached: true }).unref();
23
37
  }
38
+ // Publish readiness after mode setup: another process may signal us as soon as it sees it.
39
+ watchdogWritePid('watchdog.pid', String(process.pid));
24
40
  return true;
25
41
  }
26
42
 
27
43
  import readline from 'node:readline';
28
44
  import { appendFileSync, existsSync as mockReleaseExists } from 'node:fs';
45
+ import { rawMessage, stripCommandMessage } from './mock-session-context.mjs';
46
+ // Dynamic, like every sibling import here, so a test's copy of this mock can repoint it.
47
+ const { answerNudge, silentNudge } = await import('./mock-nudge.mjs');
29
48
  const sleep = (ms) => new Promise(r => setTimeout(r, ms));
30
49
  async function waitForMockRelease(fallbackMs) {
31
50
  const file = process.env.CEZ_MOCK_RELEASE_FILE;
@@ -54,7 +73,7 @@ let steeringMode = 'one-at-a-time';
54
73
  // The prompt a queued handler is running; pi records it as the turn's user message.
55
74
  let currentPrompt;
56
75
  let resumeAfterAsk = false;
57
- const send = (value) => {
76
+ const sendNow = (value) => {
58
77
  if (value?.type === 'turn_start' && !activeTurn) {
59
78
  activeTurn = { steers: [], late: false };
60
79
  write(value);
@@ -83,6 +102,41 @@ const send = (value) => {
83
102
  }
84
103
  write(value);
85
104
  };
105
+ // A configured delivery control decides when a prompt's acknowledgement and its turn content
106
+ // go out. Every scripted branch sends through here, so none of them needs its own hook.
107
+ const deliveryTexts = new Map();
108
+ let heldFrames;
109
+ const send = !delivery ? sendNow : (value) => {
110
+ if (value?.type === 'response' && value.command === 'prompt' && value.success && deliveryTexts.has(value.id)) {
111
+ const text = deliveryTexts.get(value.id);
112
+ deliveryTexts.delete(value.id);
113
+ delivery.ack(text, () => sendNow(value));
114
+ return;
115
+ }
116
+ if (heldFrames && value?.type !== 'response' && value?.type !== 'agent_start' && value?.type !== 'turn_start') {
117
+ heldFrames.push(value);
118
+ return;
119
+ }
120
+ sendNow(value);
121
+ };
122
+ /** One queued prompt under a configured control, before any scenario branch answers it. A
123
+ * rejected prompt still reached pi's RPC, so it is recorded. A held response keeps the prompt
124
+ * queue pending until its frames are flushed: the next prompt's turn never starts inside it. */
125
+ async function handleControlled(command) {
126
+ if (delivery.rejects(command.message)) {
127
+ if (process.env.CEZ_MOCK_STDIN_FILE) appendFileSync(process.env.CEZ_MOCK_STDIN_FILE, `${JSON.stringify({ userText: rawMessage(command), imageCount: (command.images ?? []).length })}\n`);
128
+ write({ id: command.id, type: 'response', command: 'prompt', success: false, error: { message: 'owned turn rejected' } });
129
+ return;
130
+ }
131
+ if (command.id !== undefined) deliveryTexts.set(command.id, command.message);
132
+ const hold = delivery.holdResponse(command.message);
133
+ const frames = hold ? heldFrames = [] : undefined;
134
+ await handleCommand(command);
135
+ if (!hold) return;
136
+ await hold;
137
+ heldFrames = undefined;
138
+ for (const frame of frames) send(frame);
139
+ }
86
140
 
87
141
  /** One valid CEZ:ASK payload (spec #473), used by the `mock:ask` scenario. */
88
142
  const ASK_MARKER_BODY = "{\"questions\":[{\"header\":\"Library\",\"question\":\"Which test library?\",\"multiSelect\":false,\"options\":[{\"label\":\"Vitest\",\"description\":\"Use the existing test runner\"},{\"label\":\"Node test\",\"description\":\"Use node:test\"}]}]}";
@@ -115,9 +169,26 @@ function sendTurnEnd(usage = { input: 10, output: 5, cacheRead: 0, cacheWrite: 0
115
169
  const rl = readline.createInterface({ input: process.stdin });
116
170
  let queue = Promise.resolve();
117
171
  rl.on('line', (line) => {
118
- const command = JSON.parse(line);
119
- if (command.type === 'prompt' && command.streamingBehavior === 'steer' && activeTurn) {
120
- if (process.env.CEZ_MOCK_STDIN_FILE) appendFileSync(process.env.CEZ_MOCK_STDIN_FILE, `${JSON.stringify({ userText: command.message, imageCount: 0, streamingBehavior: 'steer' })}\n`);
172
+ const command = stripCommandMessage(JSON.parse(line));
173
+ // hearsay-tools/cezarion#1112: a late-ack steer is admitted into the running turn after its
174
+ // last model call: pi acknowledges it now, with the turn open, and reads it as its next
175
+ // prompt once that turn settles (the `mock:steer-late` ordering), starting that run late.
176
+ if (command.type === 'prompt' && command.streamingBehavior === 'steer' && command.message.includes('mock:deferred-turn-start:late-ack')) {
177
+ const admit = () => {
178
+ if (!activeTurn) { setTimeout(admit, 5); return; }
179
+ if (process.env.CEZ_MOCK_STDIN_FILE) appendFileSync(process.env.CEZ_MOCK_STDIN_FILE, `${JSON.stringify({ userText: rawMessage(command), imageCount: 0, streamingBehavior: 'steer' })}\n`);
180
+ activeTurn.steers.push(command.message);
181
+ activeTurn.late = true;
182
+ write({ id: command.id, type: 'response', command: 'prompt', success: true });
183
+ };
184
+ admit();
185
+ return;
186
+ }
187
+ // hearsay-tools/cezarion#1112: a deferred-start steer is not admitted into the running turn;
188
+ // pi acknowledges it as its next prompt once that turn settles, with no turn open.
189
+ if (command.type === 'prompt' && command.streamingBehavior === 'steer' && activeTurn &&
190
+ !command.message.includes('mock:deferred-turn-start')) {
191
+ if (process.env.CEZ_MOCK_STDIN_FILE) appendFileSync(process.env.CEZ_MOCK_STDIN_FILE, `${JSON.stringify({ userText: rawMessage(command), imageCount: 0, streamingBehavior: 'steer' })}\n`);
121
192
  activeTurn.steers.push(command.message);
122
193
  write({ id: command.id, type: 'response', command: 'prompt', success: true });
123
194
  return;
@@ -126,346 +197,502 @@ rl.on('line', (line) => {
126
197
  });
127
198
  rl.on('close', () => { queue.then(() => process.exit(0)); });
128
199
 
129
- async function handle(command) {
130
- if (command.type === 'prompt' && (command.message.includes('mock:autonomous') || command.message.startsWith('Continue working autonomously until the task is fully complete.'))) {
131
- const { autonomousReply } = await import('./mock-autonomous.mjs');
200
+ function handle(command) {
201
+ return delivery && command.type === 'prompt' ? handleControlled(command) : handleCommand(command);
202
+ }
203
+
204
+ async function respondAutonomous(command) {
205
+ const { autonomousReply } = await import('./mock-autonomous.mjs');
206
+ // Recorded like every other prompt, so a test can count the autonomous nudges pi received.
207
+ if (process.env.CEZ_MOCK_STDIN_FILE) appendFileSync(process.env.CEZ_MOCK_STDIN_FILE, `${JSON.stringify({ userText: rawMessage(command), imageCount: 0 })}\n`);
208
+ send({ id: command.id, type: 'response', command: 'prompt', success: true });
209
+ send({ type: 'agent_start' });
210
+ send({ type: 'turn_start' });
211
+ sendText([autonomousReply(command.message)]);
212
+ sendTurnEnd();
213
+ return;
214
+ }
215
+
216
+ async function respondSilentTail(command) {
217
+ const silent = await import('./mock-silent-tail.mjs');
218
+ silent.noteSilentTailPrompt(command.message);
219
+ if (silent.isFinalMessageNudge(command.message)) return respondFinalNudge(command, silent);
220
+ if (silent.isSilentTailScenario(command.message)) {
132
221
  send({ id: command.id, type: 'response', command: 'prompt', success: true });
133
222
  send({ type: 'agent_start' });
134
223
  send({ type: 'turn_start' });
135
- sendText([autonomousReply(command.message)]);
224
+ sendText([silent.SILENT_TAIL_OPENING]);
225
+ send({ type: 'tool_execution_start', toolCallId: 'tool-silent-gh', toolName: 'bash', args: { command: 'gh issue create' } });
226
+ send({ type: 'tool_execution_end', toolCallId: 'tool-silent-gh', toolName: 'bash', result: { content: [{ type: 'text', text: 'created' }] }, isError: false });
227
+ sendThinking(silent.SILENT_TAIL_REASONING, 1);
136
228
  sendTurnEnd();
137
229
  return;
138
230
  }
139
- if (command.type === 'prompt' && (command.message.includes('mock:silent-tail') || command.message.includes('mock:tool-tail') || command.message.includes('Your last turn ended without a message to the user.'))) {
140
- const silent = await import('./mock-silent-tail.mjs');
141
- silent.noteSilentTailPrompt(command.message);
142
- if (silent.isFinalMessageNudge(command.message)) {
143
- send({ id: command.id, type: 'response', command: 'prompt', success: true });
144
- const kind = silent.finalMessageNudgeKind();
145
- if (kind === 'ack-only') return;
146
- if (kind === 'late') await silent.sleep(silent.LATE_REPLY_MS);
147
- send({ type: 'agent_start' });
148
- send({ type: 'turn_start' });
149
- if (kind === 'silent') sendThinking(silent.SILENT_TAIL_REASONING);
150
- else if (kind === 'slow-done') {
151
- sendText([silent.SLOW_DONE_PREFIX]);
152
- await silent.sleep(silent.SLOW_DONE_TAIL_MS);
153
- sendText([silent.SILENT_TAIL_DONE]);
154
- } else sendText([kind === 'standing' ? silent.FINAL_MESSAGE_STANDING : silent.SILENT_TAIL_DONE]);
155
- sendTurnEnd();
156
- return;
157
- }
158
- if (silent.isSilentTailScenario(command.message)) {
159
- send({ id: command.id, type: 'response', command: 'prompt', success: true });
160
- send({ type: 'agent_start' });
161
- send({ type: 'turn_start' });
162
- sendText([silent.SILENT_TAIL_OPENING]);
163
- send({ type: 'tool_execution_start', toolCallId: 'tool-silent-gh', toolName: 'bash', args: { command: 'gh issue create' } });
164
- send({ type: 'tool_execution_end', toolCallId: 'tool-silent-gh', toolName: 'bash', result: { content: [{ type: 'text', text: 'created' }] }, isError: false });
165
- sendThinking(silent.SILENT_TAIL_REASONING, 1);
166
- sendTurnEnd();
167
- return;
168
- }
169
- if (silent.isToolTailScenario(command.message)) {
170
- send({ id: command.id, type: 'response', command: 'prompt', success: true });
171
- send({ type: 'agent_start' });
172
- send({ type: 'turn_start' });
173
- sendText([silent.TOOL_TAIL_OPENING]);
174
- send({ type: 'tool_execution_start', toolCallId: 'tool-tail-git', toolName: 'bash', args: { command: 'git status --short' } });
175
- send({ type: 'tool_execution_end', toolCallId: 'tool-tail-git', toolName: 'bash', result: { content: [{ type: 'text', text: ' M src/example.ts' }] }, isError: false });
176
- sendTurnEnd();
177
- return;
178
- }
231
+ if (silent.isToolTailScenario(command.message)) {
232
+ send({ id: command.id, type: 'response', command: 'prompt', success: true });
233
+ send({ type: 'agent_start' });
234
+ send({ type: 'turn_start' });
235
+ sendText([silent.TOOL_TAIL_OPENING]);
236
+ send({ type: 'tool_execution_start', toolCallId: 'tool-tail-git', toolName: 'bash', args: { command: 'git status --short' } });
237
+ send({ type: 'tool_execution_end', toolCallId: 'tool-tail-git', toolName: 'bash', result: { content: [{ type: 'text', text: ' M src/example.ts' }] }, isError: false });
238
+ sendTurnEnd();
239
+ return;
179
240
  }
180
- if (command.type === 'prompt' && command.message.includes('mock:crash-stderr')) {
181
- const { crashWithStderr } = await import('./mock-runner-crash.mjs');
182
- if (crashWithStderr(command.message, '{"type":"tool_execution_update","toolCallId":"truncated')) return;
241
+ return false;
242
+ }
243
+
244
+ async function respondCrash(command) {
245
+ const { crashWithStderr } = await import('./mock-runner-crash.mjs');
246
+ if (crashWithStderr(command.message, '{"type":"tool_execution_update","toolCallId":"truncated')) return;
247
+ return false;
248
+ }
249
+
250
+ function respondState(command) {
251
+ send({
252
+ id: command.id,
253
+ type: 'response',
254
+ command: 'get_state',
255
+ success: true,
256
+ data: {
257
+ sessionId,
258
+ thinkingLevel: 'medium',
259
+ isStreaming: false,
260
+ isCompacting: false,
261
+ steeringMode,
262
+ followUpMode: 'one-at-a-time',
263
+ autoCompactionEnabled: true,
264
+ messageCount: 0,
265
+ pendingMessageCount: 0,
266
+ },
267
+ });
268
+ }
269
+
270
+ async function respondCezarTool(command) {
271
+ send({ id: command.id, type: 'response', command: 'prompt', success: true });
272
+ send({ type: 'agent_start' }); send({ type: 'turn_start' });
273
+ const { toolPrompt } = await import('./mock-ci-tool.mjs');
274
+ sendText([await toolPrompt('pi', process.argv.slice(2), command.message)]);
275
+ sendTurnEnd();
276
+ }
277
+
278
+ async function respondCiWait(command) {
279
+ send({ id: command.id, type: 'response', command: 'prompt', success: true });
280
+ send({ type: 'agent_start' }); send({ type: 'turn_start' });
281
+ const { ciPrompt } = await import('./mock-ci-tool.mjs');
282
+ sendText([await ciPrompt('pi', process.argv.slice(2), command.message)]);
283
+ sendTurnEnd();
284
+ }
285
+
286
+ async function respondSteerTool(command) {
287
+ send({ id: command.id, type: 'response', command: 'prompt', success: true });
288
+ send({ type: 'agent_start' }); send({ type: 'turn_start' });
289
+ send({ type: 'tool_execution_start', toolCallId: 'tool-steer', toolName: 'bash', args: { command: 'wait' } });
290
+ await sleep(Number(process.env.CEZ_MOCK_STEER_MS ?? 600));
291
+ send({ type: 'tool_execution_end', toolCallId: 'tool-steer', toolName: 'bash', result: { content: [{ type: 'text', text: 'waited' }] }, isError: false });
292
+ sendText(['steer tool done']);
293
+ sendTurnEnd();
294
+ }
295
+
296
+ async function respondSteerLate(command) {
297
+ send({ id: command.id, type: 'response', command: 'prompt', success: true });
298
+ send({ type: 'agent_start' }); send({ type: 'turn_start' });
299
+ sendText(['late window: final message already sent']);
300
+ activeTurn.late = true;
301
+ await sleep(300);
302
+ sendTurnEnd();
303
+ }
304
+
305
+ async function respondMultiPrRefs(command) {
306
+ const { multiPrText, unrelatedPr } = await import('./mock-multi-pr.mjs');
307
+ send({ id: command.id, type: 'response', command: 'prompt', success: true });
308
+ send({ type: 'agent_start' }); send({ type: 'turn_start' });
309
+ send({ type: 'tool_execution_start', toolCallId: 'multi-read', toolName: 'read', args: { path: 'other.txt' } });
310
+ send({ type: 'tool_execution_end', toolCallId: 'multi-read', toolName: 'read', result: { content: [{ type: 'text', text: unrelatedPr }] }, isError: false });
311
+ send({ type: 'message_end', message: { role: 'assistant', content: [{ type: 'thinking', thinking: unrelatedPr }], stopReason: 'stop' } });
312
+ const text = multiPrText(command.message);
313
+ sendText([text.slice(0, 5), text.slice(5)]);
314
+ sendTurnEnd();
315
+ }
316
+
317
+ async function respondTurnMessages(command) {
318
+ const { turnMessages } = await import('./mock-turn-messages.mjs');
319
+ send({ id: command.id, type: 'response', command: 'prompt', success: true });
320
+ send({ type: 'agent_start' }); send({ type: 'turn_start' });
321
+ for (const text of turnMessages(command.message)) sendText([text]);
322
+ sendTurnEnd();
323
+ }
324
+
325
+ function respondAgentEcho(command) {
326
+ // rpc-lifecycle.ndjson's normal prompt/assistant/settled sequence.
327
+ send({ id: command.id, type: 'response', command: 'prompt', success: true });
328
+ send({ type: 'agent_start' });
329
+ send({ type: 'turn_start' });
330
+ sendText([command.message]);
331
+ sendTurnEnd();
332
+ }
333
+
334
+ function respondSplitText(command) {
335
+ // Pi streams one text_delta per token (#2's root cause), so the marker is
336
+ // split across deltas. Only a coalescer reassembles `CEZ:MONITORING`;
337
+ // one v1 `text` per delta joins them with a newline and the park is lost
338
+ // (harness parity S8).
339
+ send({ id: command.id, type: 'response', command: 'prompt', success: true });
340
+ send({ type: 'agent_start' });
341
+ send({ type: 'turn_start' });
342
+ sendText(['parity split text', '\n\n', 'CEZ:', 'MONITORING']);
343
+ sendTurnEnd();
344
+ }
345
+
346
+ function respondProviderError(command) {
347
+ // An assistant `message_end` whose stopReason is `error`, carrying the
348
+ // transport diagnostic — wire shape copied from
349
+ // `src/core/__fixtures__/pi/provider-error.ndjson`. #54: this arrived
350
+ // before `agent_settled` and the run parked as "Needs You" instead of
351
+ // failing (harness parity S7).
352
+ send({ id: command.id, type: 'response', command: 'prompt', success: true });
353
+ send({ type: 'agent_start' });
354
+ send({ type: 'turn_start' });
355
+ send({ type: 'message_end', message: {
356
+ role: 'assistant',
357
+ content: [],
358
+ api: 'openai-codex-responses',
359
+ provider: 'openai-codex',
360
+ model: 'gpt-5.6-sol',
361
+ usage: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, totalTokens: 0, cost: { total: 0 } },
362
+ stopReason: 'error',
363
+ diagnostics: [{ type: 'provider_transport_failure', error: { name: 'Error', message: 'WebSocket error' } }],
364
+ errorMessage: 'Not Found',
365
+ } });
366
+ send({ type: 'agent_settled' });
367
+ }
368
+
369
+ async function respondHoldDone(command) {
370
+ send({ id: command.id, type: 'response', command: 'prompt', success: true });
371
+ send({ type: 'agent_start' });
372
+ send({ type: 'turn_start' });
373
+ await waitForMockRelease(400);
374
+ sendText(['parity hold-done: content after the pause\n\nCEZ:DONE']);
375
+ sendTurnEnd();
376
+ }
377
+
378
+ async function respondHoldAsk(command) {
379
+ send({ id: command.id, type: 'response', command: 'prompt', success: true });
380
+ send({ type: 'agent_start' });
381
+ send({ type: 'turn_start' });
382
+ await waitForMockRelease(400);
383
+ sendText(['Pick one.\n\nCEZ:ASK {"questions":[{"header":"Library","question":"Which test library?","options":[{"label":"Vitest"},{"label":"Node test"}]}]}']);
384
+ sendTurnEnd();
385
+ }
386
+
387
+ function respondDone(command) {
388
+ resumeAfterAsk = false;
389
+ // Declares the task complete so the run reaches cezar's review gate; a
390
+ // markerless turn-end correctly parks as `waiting` instead (harness
391
+ // parity R1).
392
+ send({ id: command.id, type: 'response', command: 'prompt', success: true });
393
+ send({ type: 'agent_start' });
394
+ send({ type: 'turn_start' });
395
+ sendText(['parity done: the task is complete\n\nCEZ:DONE']);
396
+ sendTurnEnd();
397
+ }
398
+
399
+ function respondAskSnapshot(command) {
400
+ // #401: authoritative text_end without deltas, using rpc-lifecycle frames.
401
+ send({ id: command.id, type: 'response', command: 'prompt', success: true });
402
+ send({ type: 'agent_start' });
403
+ send({ type: 'turn_start' });
404
+ send({ type: 'message_update', message: {}, assistantMessageEvent: { type: 'text_end', contentIndex: 0, content: command.message.includes('mock:ask-snapshot-bad') ? 'CEZ:ASK {not valid json' : 'Using the CEZ:ASK structured question format instead:\n\nCEZ:ASK {"questions":[{"header":"Library","question":"Which test library?","options":[{"label":"Vitest"},{"label":"Node test"}]}]}', partial: {} } });
405
+ sendTurnEnd();
406
+ }
407
+
408
+ function respondAskProse(command) {
409
+ send({ id: command.id, type: 'response', command: 'prompt', success: true });
410
+ send({ type: 'agent_start' });
411
+ send({ type: 'turn_start' });
412
+ sendText(['Use `CEZ:ASK {"questions":[]}` in your reply.\n> CEZ:ASK {not valid json']);
413
+ sendTurnEnd();
414
+ }
415
+
416
+ function respondBadAsk(command) {
417
+ // A marker whose JSON body is invalid. `parseAskMarker` must render no card
418
+ // and the turn must still end (harness parity R4) — pi has no native ask
419
+ // wire, so the `CEZ:ASK` marker is its only ask path, same as claude's.
420
+ send({ id: command.id, type: 'response', command: 'prompt', success: true });
421
+ send({ type: 'agent_start' });
422
+ send({ type: 'turn_start' });
423
+ sendText(['Pick one.\n\nCEZ:ASK {not valid json']);
424
+ sendTurnEnd();
425
+ }
426
+
427
+ function respondAsk(command) {
428
+ resumeAfterAsk = command.message.includes('mock:resume-done');
429
+ // A well-formed `CEZ:ASK` marker, split so the marker and its JSON body land
430
+ // in separate deltas — the #2 boundary that used to break assembly, and the
431
+ // reason an ask row is worth driving through the real coalescer.
432
+ send({ id: command.id, type: 'response', command: 'prompt', success: true });
433
+ send({ type: 'agent_start' });
434
+ send({ type: 'turn_start' });
435
+ sendText(['Pick one.\n\n', 'CEZ:ASK', ' ', ASK_MARKER_BODY]);
436
+ sendTurnEnd();
437
+ }
438
+
439
+ async function respondProgress(command) {
440
+ const gated = command.message.includes('mock:gate-prompt-ack');
441
+ if (gated) {
442
+ watchdogStall(command.message);
443
+ while (!promptAckReleased('input-ack.release')) await sleep(10);
444
+ }
445
+ send({ id: command.id, type: 'response', command: 'prompt', success: true });
446
+ send({ type: 'agent_start' }); send({ type: 'turn_start' });
447
+ if (!gated) watchdogStall(command.message);
448
+ if (command.message.includes('mock:busy-progress')) {
449
+ return respondBusyProgress();
450
+ }
451
+ }
452
+
453
+ async function respondBusyProgress() {
454
+ for (let i = 0; i < 24; i++) { send({ type: 'tool_execution_update', toolCallId: 'busy', toolName: 'bash', partialResult: { content: [{ type: 'text', text: 'working' }] } }); await sleep(100); }
455
+ sendText(['busy complete\n\nCEZ:DONE']);
456
+ sendTurnEnd();
457
+ }
458
+
459
+ async function respondHoldGated(command) {
460
+ send({ id: command.id, type: 'response', command: 'prompt', success: true });
461
+ send({ type: 'agent_start' });
462
+ send({ type: 'turn_start' });
463
+ await waitForMockRelease(250);
464
+ sendText(['parity hold-gated: content after the pause']);
465
+ await sleep(250);
466
+ sendTurnEnd();
467
+ }
468
+
469
+ async function respondHold(command) {
470
+ // The `response` below is the ack. Holding the content AND the terminal
471
+ // quartet behind it is what makes harness parity S2 meaningful: a runner
472
+ // deriving turn-end from the ack reports it before this content arrives
473
+ // (the #4 failure mode on pi's wire).
474
+ send({ id: command.id, type: 'response', command: 'prompt', success: true });
475
+ send({ type: 'agent_start' });
476
+ send({ type: 'turn_start' });
477
+ await sleep(250);
478
+ sendText(['parity hold: content after the pause']);
479
+ await sleep(250);
480
+ sendTurnEnd();
481
+ }
482
+
483
+ async function respondDefault(command) {
484
+ const monitoringMarker = command.message.includes('mock:monitoring') ? '\n\nCEZ:MONITORING' : '';
485
+ const responseText = `Investigating: ${command.message}${monitoringMarker}`;
486
+ send({ id: command.id, type: 'response', command: 'prompt', success: true });
487
+ // hearsay-tools/cezarion#1112: the acknowledged prompt opens its native run late. A late-ack
488
+ // steer's run reports agent_start first: pi's mapper reports no turn for it, so the hold
489
+ // must outlast it until the run's first activity.
490
+ const lateAck = command.message.includes('mock:deferred-turn-start:late-ack');
491
+ if (lateAck) send({ type: 'agent_start' });
492
+ if (command.message.includes('mock:deferred-turn-start')) await (await import('./mock-deferred-turn-start.mjs')).deferredTurnStart();
493
+ if (!lateAck) send({ type: 'agent_start' });
494
+ send({ type: 'turn_start' });
495
+ send({
496
+ type: 'message_update',
497
+ message: {},
498
+ assistantMessageEvent: { type: 'text_start', contentIndex: 0, partial: {} },
499
+ });
500
+ send({
501
+ type: 'message_update',
502
+ message: {},
503
+ assistantMessageEvent: {
504
+ type: 'text_delta',
505
+ contentIndex: 0,
506
+ delta: responseText,
507
+ partial: {},
508
+ },
509
+ });
510
+ send({
511
+ type: 'message_update',
512
+ message: {},
513
+ assistantMessageEvent: {
514
+ type: 'text_end',
515
+ contentIndex: 0,
516
+ content: responseText,
517
+ partial: {},
518
+ },
519
+ });
520
+ send({ type: 'tool_execution_start', toolCallId: 'tool-1', toolName: 'read', args: { path: 'README.md' } });
521
+ send({
522
+ type: 'tool_execution_end',
523
+ toolCallId: 'tool-1',
524
+ toolName: 'read',
525
+ result: { content: [{ type: 'text', text: 'mock file' }] },
526
+ isError: false,
527
+ });
528
+ if (!monitoringMarker) sendText(['Done with the first pass.']);
529
+ send({
530
+ type: 'message_end',
531
+ message: {
532
+ role: 'assistant',
533
+ usage: {
534
+ input: 10,
535
+ output: 5,
536
+ cacheRead: 0,
537
+ cacheWrite: 0,
538
+ cost: { total: 0.001 },
539
+ },
540
+ },
541
+ });
542
+ send({ type: 'turn_end', message: {}, toolResults: [] });
543
+ send({ type: 'agent_end', messages: [], willRetry: false });
544
+ send({ type: 'agent_settled' });
545
+ if (command.message.includes('mock:backend-resume-text')) {
546
+ setTimeout(() => {
547
+ send({
548
+ type: 'message_update',
549
+ message: {},
550
+ assistantMessageEvent: { type: 'text_start', contentIndex: 0, partial: {} },
551
+ });
552
+ send({
553
+ type: 'message_update',
554
+ message: {},
555
+ assistantMessageEvent: {
556
+ type: 'text_delta',
557
+ contentIndex: 0,
558
+ delta: 'Pi resumed without a prompt',
559
+ partial: {},
560
+ },
561
+ });
562
+ send({
563
+ type: 'message_update',
564
+ message: {},
565
+ assistantMessageEvent: {
566
+ type: 'text_end',
567
+ contentIndex: 0,
568
+ content: 'Pi resumed without a prompt',
569
+ partial: {},
570
+ },
571
+ });
572
+ }, 250);
573
+ } else if (command.message.includes('mock:backend-resume')) {
574
+ setTimeout(() => {
575
+ send({
576
+ type: 'tool_execution_start',
577
+ toolCallId: 'pi-autonomous-edit',
578
+ toolName: 'edit',
579
+ args: { path: 'src/a.ts', oldText: 'old', newText: 'new' },
580
+ });
581
+ send({
582
+ type: 'tool_execution_end',
583
+ toolCallId: 'pi-autonomous-edit',
584
+ toolName: 'edit',
585
+ result: { content: [{ type: 'text', text: 'updated' }] },
586
+ isError: false,
587
+ });
588
+ }, 250);
589
+ }
590
+ }
591
+
592
+ function respondSteeringMode(command) {
593
+ if (command.mode === 'all' || command.mode === 'one-at-a-time') steeringMode = command.mode;
594
+ if (process.env.CEZ_MOCK_STDIN_FILE) {
595
+ try { appendFileSync(process.env.CEZ_MOCK_STDIN_FILE, `${JSON.stringify({ type: 'set_steering_mode', mode: command.mode })}\n`); } catch { /* best effort */ }
183
596
  }
597
+ send({ ...(command.id ? { id: command.id } : {}), type: 'response', command: 'set_steering_mode', success: true });
598
+ }
599
+
600
+ async function respondFinalNudge(command, silent) {
601
+ send({ id: command.id, type: 'response', command: 'prompt', success: true });
602
+ const kind = silent.finalMessageNudgeKind();
603
+ if (kind === 'ack-only') return;
604
+ if (kind === 'late') await waitForMockRelease(silent.LATE_REPLY_MS);
605
+ send({ type: 'agent_start' });
606
+ send({ type: 'turn_start' });
607
+ return finishFinalNudge(silent, kind);
608
+ }
609
+
610
+ async function finishFinalNudge(silent, kind) {
611
+ if (kind === 'silent') sendThinking(silent.SILENT_TAIL_REASONING);
612
+ else if (kind === 'slow-done') {
613
+ sendText([silent.SLOW_DONE_PREFIX]);
614
+ await silent.sleep(silent.SLOW_DONE_TAIL_MS);
615
+ sendText([silent.SILENT_TAIL_DONE]);
616
+ } else sendText([kind === 'standing' ? silent.FINAL_MESSAGE_STANDING : silent.SILENT_TAIL_DONE]);
617
+ sendTurnEnd();
618
+ }
619
+
620
+ function recordPrompt(command) {
184
621
  // Testability hook, mirroring mock-claude: CEZ_MOCK_STDIN_FILE=<path> appends
185
622
  // each inbound prompt's text and image count, so tests can assert what the
186
623
  // runner actually wrote onto the RPC (harness parity's AgentRunSpec probes).
187
- if (command.type === 'prompt' && process.env.CEZ_MOCK_STDIN_FILE) {
624
+ if (process.env.CEZ_MOCK_STDIN_FILE) {
188
625
  try {
189
- appendFileSync(process.env.CEZ_MOCK_STDIN_FILE, `${JSON.stringify({ userText: command.message, imageCount: (command.images ?? []).length })}\n`);
626
+ appendFileSync(process.env.CEZ_MOCK_STDIN_FILE, `${JSON.stringify({ userText: rawMessage(command), imageCount: (command.images ?? []).length })}\n`);
190
627
  } catch {
191
628
  // best effort — never break the mock over the hook
192
629
  }
193
630
  }
194
- if (command.type === 'get_state') {
195
- send({
196
- id: command.id,
197
- type: 'response',
198
- command: 'get_state',
199
- success: true,
200
- data: {
201
- sessionId,
202
- thinkingLevel: 'medium',
203
- isStreaming: false,
204
- isCompacting: false,
205
- steeringMode,
206
- followUpMode: 'one-at-a-time',
207
- autoCompactionEnabled: true,
208
- messageCount: 0,
209
- pendingMessageCount: 0,
210
- },
211
- });
212
- } else if (command.type === 'prompt' && command.message.includes('mock:ci-wait')) {
213
- send({ id: command.id, type: 'response', command: 'prompt', success: true });
214
- send({ type: 'agent_start' }); send({ type: 'turn_start' });
215
- const { ciPrompt } = await import('./mock-ci-tool.mjs');
216
- sendText([await ciPrompt('pi', process.argv.slice(2), command.message)]);
217
- sendTurnEnd();
218
- } else if (command.type === 'prompt' && command.message.includes('mock:steer-tool')) {
219
- send({ id: command.id, type: 'response', command: 'prompt', success: true });
220
- send({ type: 'agent_start' }); send({ type: 'turn_start' });
221
- send({ type: 'tool_execution_start', toolCallId: 'tool-steer', toolName: 'bash', args: { command: 'wait' } });
222
- await sleep(Number(process.env.CEZ_MOCK_STEER_MS ?? 600));
223
- send({ type: 'tool_execution_end', toolCallId: 'tool-steer', toolName: 'bash', result: { content: [{ type: 'text', text: 'waited' }] }, isError: false });
224
- sendText(['steer tool done']);
225
- sendTurnEnd();
226
- } else if (command.type === 'prompt' && command.message.includes('mock:steer-late')) {
227
- send({ id: command.id, type: 'response', command: 'prompt', success: true });
228
- send({ type: 'agent_start' }); send({ type: 'turn_start' });
229
- sendText(['late window: final message already sent']);
230
- activeTurn.late = true;
231
- await sleep(300);
232
- sendTurnEnd();
233
- } else if (command.type === 'prompt' && command.message.includes('mock:turn-messages:')) {
234
- const { turnMessages } = await import('./mock-turn-messages.mjs');
235
- send({ id: command.id, type: 'response', command: 'prompt', success: true });
236
- send({ type: 'agent_start' }); send({ type: 'turn_start' });
237
- for (const text of turnMessages(command.message)) sendText([text]);
238
- sendTurnEnd();
239
- } else if (command.type === 'prompt' && command.message.includes('mock:agent-echo')) {
240
- // rpc-lifecycle.ndjson's normal prompt/assistant/settled sequence.
241
- send({ id: command.id, type: 'response', command: 'prompt', success: true });
242
- send({ type: 'agent_start' });
243
- send({ type: 'turn_start' });
244
- sendText([command.message]);
245
- sendTurnEnd();
246
- } else if (command.type === 'prompt' && command.message.includes('mock:split-text')) {
247
- // Pi streams one text_delta per token (#2's root cause), so the marker is
248
- // split across deltas. Only a coalescer reassembles `CEZ:MONITORING`;
249
- // one v1 `text` per delta joins them with a newline and the park is lost
250
- // (harness parity S8).
251
- send({ id: command.id, type: 'response', command: 'prompt', success: true });
252
- send({ type: 'agent_start' });
253
- send({ type: 'turn_start' });
254
- sendText(['parity split text', '\n\n', 'CEZ:', 'MONITORING']);
255
- sendTurnEnd();
256
- } else if (command.type === 'prompt' && command.message.includes('mock:provider-error')) {
257
- // An assistant `message_end` whose stopReason is `error`, carrying the
258
- // transport diagnostic — wire shape copied from
259
- // `src/core/__fixtures__/pi/provider-error.ndjson`. #54: this arrived
260
- // before `agent_settled` and the run parked as "Needs You" instead of
261
- // failing (harness parity S7).
262
- send({ id: command.id, type: 'response', command: 'prompt', success: true });
263
- send({ type: 'agent_start' });
264
- send({ type: 'turn_start' });
265
- send({ type: 'message_end', message: {
266
- role: 'assistant',
267
- content: [],
268
- api: 'openai-codex-responses',
269
- provider: 'openai-codex',
270
- model: 'gpt-5.6-sol',
271
- usage: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, totalTokens: 0, cost: { total: 0 } },
272
- stopReason: 'error',
273
- diagnostics: [{ type: 'provider_transport_failure', error: { name: 'Error', message: 'WebSocket error' } }],
274
- errorMessage: 'Not Found',
275
- } });
276
- send({ type: 'agent_settled' });
277
- } else if (command.type === 'prompt' && command.message.includes('mock:hold-done')) {
278
- send({ id: command.id, type: 'response', command: 'prompt', success: true });
279
- send({ type: 'agent_start' });
280
- send({ type: 'turn_start' });
281
- await waitForMockRelease(400);
282
- sendText(['parity hold-done: content after the pause\n\nCEZ:DONE']);
283
- sendTurnEnd();
284
- } else if (command.type === 'prompt' && command.message.includes('mock:hold-ask')) {
285
- send({ id: command.id, type: 'response', command: 'prompt', success: true });
286
- send({ type: 'agent_start' });
287
- send({ type: 'turn_start' });
288
- await waitForMockRelease(400);
289
- sendText(['Pick one.\n\nCEZ:ASK {"questions":[{"header":"Library","question":"Which test library?","options":[{"label":"Vitest"},{"label":"Node test"}]}]}']);
290
- sendTurnEnd();
291
- } else if (command.type === 'prompt' && (command.message.includes('mock:done') || (resumeAfterAsk && command.message.trim() === 'Library: Vitest'))) {
292
- resumeAfterAsk = false;
293
- // Declares the task complete so the run reaches cezar's review gate; a
294
- // markerless turn-end correctly parks as `waiting` instead (harness
295
- // parity R1).
296
- send({ id: command.id, type: 'response', command: 'prompt', success: true });
297
- send({ type: 'agent_start' });
298
- send({ type: 'turn_start' });
299
- sendText(['parity done: the task is complete\n\nCEZ:DONE']);
300
- sendTurnEnd();
301
- } else if (command.type === 'prompt' && command.message.includes('mock:ask-snapshot')) {
302
- // #401: authoritative text_end without deltas, using rpc-lifecycle frames.
303
- send({ id: command.id, type: 'response', command: 'prompt', success: true });
304
- send({ type: 'agent_start' });
305
- send({ type: 'turn_start' });
306
- send({ type: 'message_update', message: {}, assistantMessageEvent: { type: 'text_end', contentIndex: 0, content: command.message.includes('mock:ask-snapshot-bad') ? 'CEZ:ASK {not valid json' : 'Using the CEZ:ASK structured question format instead:\n\nCEZ:ASK {"questions":[{"header":"Library","question":"Which test library?","options":[{"label":"Vitest"},{"label":"Node test"}]}]}', partial: {} } });
307
- sendTurnEnd();
308
- } else if (command.type === 'prompt' && command.message.includes('mock:ask-prose')) {
309
- send({ id: command.id, type: 'response', command: 'prompt', success: true });
310
- send({ type: 'agent_start' });
311
- send({ type: 'turn_start' });
312
- sendText(['Use `CEZ:ASK {"questions":[]}` in your reply.\n> CEZ:ASK {not valid json']);
313
- sendTurnEnd();
314
- } else if (command.type === 'prompt' && command.message.includes('mock:ask-bad')) {
315
- // A marker whose JSON body is invalid. `parseAskMarker` must render no card
316
- // and the turn must still end (harness parity R4) — pi has no native ask
317
- // wire, so the `CEZ:ASK` marker is its only ask path, same as claude's.
318
- send({ id: command.id, type: 'response', command: 'prompt', success: true });
319
- send({ type: 'agent_start' });
320
- send({ type: 'turn_start' });
321
- sendText(['Pick one.\n\nCEZ:ASK {not valid json']);
322
- sendTurnEnd();
323
- } else if (command.type === 'prompt' && command.message.includes('mock:ask')) {
324
- resumeAfterAsk = command.message.includes('mock:resume-done');
325
- // A well-formed `CEZ:ASK` marker, split so the marker and its JSON body land
326
- // in separate deltas — the #2 boundary that used to break assembly, and the
327
- // reason an ask row is worth driving through the real coalescer.
328
- send({ id: command.id, type: 'response', command: 'prompt', success: true });
329
- send({ type: 'agent_start' });
330
- send({ type: 'turn_start' });
331
- sendText(['Pick one.\n\n', 'CEZ:ASK', ' ', ASK_MARKER_BODY]);
332
- sendTurnEnd();
333
- } else if (command.type === 'prompt' && /mock:(no-progress|busy-progress)/.test(command.message)) {
334
- send({ id: command.id, type: 'response', command: 'prompt', success: true });
335
- send({ type: 'agent_start' }); send({ type: 'turn_start' });
336
- watchdogStall(command.message);
337
- if (command.message.includes('mock:busy-progress')) {
338
- for (let i = 0; i < 24; i++) { send({ type: 'tool_execution_update', toolCallId: 'busy', toolName: 'bash', partialResult: { content: [{ type: 'text', text: 'working' }] } }); await sleep(100); }
339
- sendTurnEnd();
340
- }
341
- } else if (command.type === 'prompt' && command.message.includes('mock:hold-gated')) {
342
- send({ id: command.id, type: 'response', command: 'prompt', success: true });
343
- send({ type: 'agent_start' });
344
- send({ type: 'turn_start' });
345
- await waitForMockRelease(250);
346
- sendText(['parity hold-gated: content after the pause']);
347
- await sleep(250);
348
- sendTurnEnd();
349
- } else if (command.type === 'prompt' && command.message.includes('mock:hold')) {
350
- // The `response` below is the ack. Holding the content AND the terminal
351
- // quartet behind it is what makes harness parity S2 meaningful: a runner
352
- // deriving turn-end from the ack reports it before this content arrives
353
- // (the #4 failure mode on pi's wire).
354
- send({ id: command.id, type: 'response', command: 'prompt', success: true });
355
- send({ type: 'agent_start' });
356
- send({ type: 'turn_start' });
357
- await sleep(250);
358
- sendText(['parity hold: content after the pause']);
359
- await sleep(250);
360
- sendTurnEnd();
361
- } else if (command.type === 'prompt') {
362
- const monitoringMarker = command.message.includes('mock:monitoring') ? '\n\nCEZ:MONITORING' : '';
363
- const responseText = `Investigating: ${command.message}${monitoringMarker}`;
631
+ }
632
+
633
+ // These scenarios run before recording or rewriting an ordinary prompt.
634
+ // Silent-tail and clean crashes may fall through. Keep their original priority.
635
+ const earlyPromptScenarios = [
636
+ { matches: command => command.message.includes('mock:autonomous') || command.message.startsWith('Continue working autonomously until the task is fully complete.'), respond: respondAutonomous },
637
+ { matches: command => command.message.includes('mock:silent-tail') || command.message.includes('mock:tool-tail') || silentNudge(command.message), respond: respondSilentTail },
638
+ { matches: command => command.message.includes('mock:crash-stderr'), respond: respondCrash },
639
+ ];
640
+
641
+ // First match wins. These scenarios run before the configured failure control.
642
+ const promptScenarios = [
643
+ { matches: command => command.message.includes('mock:cezar-tool'), respond: respondCezarTool },
644
+ { matches: command => command.message.includes('mock:ci-wait'), respond: respondCiWait },
645
+ { matches: command => command.message.includes('mock:steer-tool'), respond: respondSteerTool },
646
+ { matches: command => command.message.includes('mock:steer-late'), respond: respondSteerLate },
647
+ { matches: command => command.message.includes('mock:multi-pr-refs'), respond: respondMultiPrRefs },
648
+ { matches: command => command.message.includes('mock:turn-messages:'), respond: respondTurnMessages },
649
+ { matches: command => command.message.includes('mock:agent-echo'), respond: respondAgentEcho },
650
+ { matches: command => command.message.includes('mock:split-text'), respond: respondSplitText },
651
+ ];
652
+
653
+ // A provider failure takes priority over these trailing scenarios.
654
+ const tailPromptScenarios = [
655
+ { matches: command => command.message.includes('mock:hold-done'), respond: respondHoldDone },
656
+ { matches: command => command.message.includes('mock:hold-ask'), respond: respondHoldAsk },
657
+ { matches: command => (command.message.includes('mock:done') || (resumeAfterAsk && command.message.trim() === 'Library: Vitest')), respond: respondDone },
658
+ { matches: command => command.message.includes('mock:ask-snapshot'), respond: respondAskSnapshot },
659
+ { matches: command => command.message.includes('mock:ask-prose'), respond: respondAskProse },
660
+ { matches: command => command.message.includes('mock:ask-bad'), respond: respondBadAsk },
661
+ { matches: command => command.message.includes('mock:ask'), respond: respondAsk },
662
+ { matches: command => /mock:(no-progress|busy-progress)/.test(command.message), respond: respondProgress },
663
+ { matches: command => command.message.includes('mock:hold-gated'), respond: respondHoldGated },
664
+ { matches: command => command.message.includes('mock:hold'), respond: respondHold },
665
+ ];
666
+
667
+ async function handlePromptCommand(command) {
668
+ for (const scenario of earlyPromptScenarios) {
669
+ if (!scenario.matches(command)) continue;
670
+ const result = scenario.respond(command);
671
+ const handled = result instanceof Promise ? await result : result;
672
+ if (handled !== false) return;
673
+ }
674
+ recordPrompt(command);
675
+ command.message = answerNudge(command.message);
676
+ // `mock:ack-only` accepts the prompt without opening a native agent turn.
677
+ if (command.message.includes('mock:ack-only')) {
364
678
  send({ id: command.id, type: 'response', command: 'prompt', success: true });
365
- send({ type: 'agent_start' });
366
- send({ type: 'turn_start' });
367
- send({
368
- type: 'message_update',
369
- message: {},
370
- assistantMessageEvent: { type: 'text_start', contentIndex: 0, partial: {} },
371
- });
372
- send({
373
- type: 'message_update',
374
- message: {},
375
- assistantMessageEvent: {
376
- type: 'text_delta',
377
- contentIndex: 0,
378
- delta: responseText,
379
- partial: {},
380
- },
381
- });
382
- send({
383
- type: 'message_update',
384
- message: {},
385
- assistantMessageEvent: {
386
- type: 'text_end',
387
- contentIndex: 0,
388
- content: responseText,
389
- partial: {},
390
- },
391
- });
392
- send({ type: 'tool_execution_start', toolCallId: 'tool-1', toolName: 'read', args: { path: 'README.md' } });
393
- send({
394
- type: 'tool_execution_end',
395
- toolCallId: 'tool-1',
396
- toolName: 'read',
397
- result: { content: [{ type: 'text', text: 'mock file' }] },
398
- isError: false,
399
- });
400
- if (!monitoringMarker) sendText(['Done with the first pass.']);
401
- send({
402
- type: 'message_end',
403
- message: {
404
- role: 'assistant',
405
- usage: {
406
- input: 10,
407
- output: 5,
408
- cacheRead: 0,
409
- cacheWrite: 0,
410
- cost: { total: 0.001 },
411
- },
412
- },
413
- });
414
- send({ type: 'turn_end', message: {}, toolResults: [] });
415
- send({ type: 'agent_end', messages: [], willRetry: false });
416
- send({ type: 'agent_settled' });
417
- if (command.message.includes('mock:backend-resume-text')) {
418
- setTimeout(() => {
419
- send({
420
- type: 'message_update',
421
- message: {},
422
- assistantMessageEvent: { type: 'text_start', contentIndex: 0, partial: {} },
423
- });
424
- send({
425
- type: 'message_update',
426
- message: {},
427
- assistantMessageEvent: {
428
- type: 'text_delta',
429
- contentIndex: 0,
430
- delta: 'Pi resumed without a prompt',
431
- partial: {},
432
- },
433
- });
434
- send({
435
- type: 'message_update',
436
- message: {},
437
- assistantMessageEvent: {
438
- type: 'text_end',
439
- contentIndex: 0,
440
- content: 'Pi resumed without a prompt',
441
- partial: {},
442
- },
443
- });
444
- }, 250);
445
- } else if (command.message.includes('mock:backend-resume')) {
446
- setTimeout(() => {
447
- send({
448
- type: 'tool_execution_start',
449
- toolCallId: 'pi-autonomous-edit',
450
- toolName: 'edit',
451
- args: { path: 'src/a.ts', oldText: 'old', newText: 'new' },
452
- });
453
- send({
454
- type: 'tool_execution_end',
455
- toolCallId: 'pi-autonomous-edit',
456
- toolName: 'edit',
457
- result: { content: [{ type: 'text', text: 'updated' }] },
458
- isError: false,
459
- });
460
- }, 250);
461
- }
462
- } else if (command.type === 'set_steering_mode') {
463
- if (command.mode === 'all' || command.mode === 'one-at-a-time') steeringMode = command.mode;
464
- if (process.env.CEZ_MOCK_STDIN_FILE) {
465
- try { appendFileSync(process.env.CEZ_MOCK_STDIN_FILE, `${JSON.stringify({ type: 'set_steering_mode', mode: command.mode })}\n`); } catch { /* best effort */ }
466
- }
467
- send({ ...(command.id ? { id: command.id } : {}), type: 'response', command: 'set_steering_mode', success: true });
468
- } else if (command.type === 'abort') {
469
- send({ type: 'response', command: 'abort', success: true });
679
+ return;
680
+ }
681
+ const scenario = promptScenarios.find(scenario => scenario.matches(command));
682
+ if (scenario) return scenario.respond(command);
683
+ if (failureControl ? (await failureControl.failureFor(command.message)) === 'provider' : command.message.includes('mock:provider-error')) {
684
+ return respondProviderError(command);
685
+ }
686
+ const tail = tailPromptScenarios.find(scenario => scenario.matches(command));
687
+ if (tail) return tail.respond(command);
688
+ return respondDefault(command);
689
+ }
690
+
691
+ async function handleCommand(command) {
692
+ switch (command.type) {
693
+ case 'prompt': return handlePromptCommand(command);
694
+ case 'get_state': respondState(command); return;
695
+ case 'set_steering_mode': respondSteeringMode(command); return;
696
+ case 'abort': send({ type: 'response', command: 'abort', success: true });
470
697
  }
471
698
  }