@atolis-hq/wake 0.2.96 → 0.3.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 (442) hide show
  1. package/dist/src/activities/agent/agent-activity-definition.js +26 -0
  2. package/dist/src/activities/agent/agent-activity.js +171 -0
  3. package/dist/src/activities/agent/agent-result.js +149 -0
  4. package/dist/src/activities/contracts/activity.js +10 -0
  5. package/dist/src/activities/contracts/config.js +2 -0
  6. package/dist/src/activities/contracts/event-schema.js +302 -0
  7. package/dist/src/activities/contracts/events.js +42 -0
  8. package/dist/src/activities/contracts/identifiers.js +29 -0
  9. package/dist/src/activities/contracts/registry.js +71 -0
  10. package/dist/src/activities/contracts/streams.js +17 -0
  11. package/dist/src/activities/contracts/vocabulary.js +58 -0
  12. package/dist/src/activities/index.js +21 -0
  13. package/dist/src/activities/pr/activity-support.js +111 -0
  14. package/dist/src/activities/pr/application.js +158 -0
  15. package/dist/src/activities/pr/approve.js +85 -0
  16. package/dist/src/activities/pr/capability.js +11 -0
  17. package/dist/src/activities/pr/decision-claim.js +76 -0
  18. package/dist/src/activities/pr/event-drafts.js +66 -0
  19. package/dist/src/activities/pr/intent.js +37 -0
  20. package/dist/src/activities/pr/merge-authority-gate.js +14 -0
  21. package/dist/src/activities/pr/merge.js +110 -0
  22. package/dist/src/activities/pr/policy.js +135 -0
  23. package/dist/src/activities/pr/projection.js +130 -0
  24. package/dist/src/activities/pr/vocabulary.js +30 -0
  25. package/dist/src/activities/review/authorization.js +22 -0
  26. package/dist/src/activities/review/contracts.js +22 -0
  27. package/dist/src/activities/review/signals.js +3 -0
  28. package/dist/src/bootstrap/analytics-projection.js +26 -0
  29. package/dist/src/bootstrap/board-projection.js +337 -0
  30. package/dist/src/bootstrap/composition-root.js +382 -0
  31. package/dist/src/bootstrap/config/load-config.js +51 -0
  32. package/dist/src/bootstrap/config/root-schema.js +134 -0
  33. package/dist/src/bootstrap/external-ref.js +12 -0
  34. package/dist/src/bootstrap/fake-provider-files.js +44 -0
  35. package/dist/src/bootstrap/fake-scenarios.js +22 -0
  36. package/dist/src/bootstrap/index.js +48 -0
  37. package/dist/src/bootstrap/initialise.js +434 -0
  38. package/dist/src/bootstrap/paths.js +15 -0
  39. package/dist/src/bootstrap/projection-runtime.js +27 -0
  40. package/dist/src/bootstrap/runner-quota-reporter.js +21 -0
  41. package/dist/src/bootstrap/runner-registry.js +30 -0
  42. package/dist/src/bootstrap/schedule-checkpoint-store.js +49 -0
  43. package/dist/src/bootstrap/self-update-application.js +195 -0
  44. package/dist/src/bootstrap/self-update-failure-log.js +33 -0
  45. package/dist/src/bootstrap/source-update-port.js +47 -0
  46. package/dist/src/bootstrap/status-publish-activity.js +42 -0
  47. package/dist/src/bootstrap/surface-api-applications.js +325 -0
  48. package/dist/src/bootstrap/surface-api-execution-applications.js +95 -0
  49. package/dist/src/bootstrap/surface-api-metadata.js +12 -0
  50. package/dist/src/bootstrap/surface-api-projection-pages.js +22 -0
  51. package/dist/src/bootstrap/surface-api-run-context.js +5 -0
  52. package/dist/src/bootstrap/surface-api-transcripts.js +57 -0
  53. package/dist/src/bootstrap/surface-api-work-applications.js +199 -0
  54. package/dist/src/bootstrap/surface-applications.js +7 -0
  55. package/dist/src/bootstrap/surface-cli-applications.js +701 -0
  56. package/dist/src/bootstrap/update-ledger.js +61 -0
  57. package/dist/src/bootstrap/update-maintenance-lease.js +176 -0
  58. package/dist/src/{version.js → bootstrap/version.js} +35 -51
  59. package/dist/src/control-plane/application/advance-once.js +184 -0
  60. package/dist/src/control-plane/application/control-plane-projection.js +42 -0
  61. package/dist/src/control-plane/application/control-plane-service.js +42 -0
  62. package/dist/src/control-plane/application/intake-pipeline.js +29 -0
  63. package/dist/src/control-plane/application/runner-control-service.js +66 -0
  64. package/dist/src/control-plane/application/runner-pipeline.js +57 -0
  65. package/dist/src/control-plane/application/schedule-service.js +47 -0
  66. package/dist/src/control-plane/application/work-cancellation-policy.js +31 -0
  67. package/dist/src/control-plane/contracts/commands.js +10 -0
  68. package/dist/src/control-plane/contracts/config.js +22 -0
  69. package/dist/src/control-plane/contracts/events.js +81 -0
  70. package/dist/src/control-plane/contracts/streams.js +5 -0
  71. package/dist/src/control-plane/domain/dispatch-policy.js +15 -0
  72. package/dist/src/control-plane/domain/quota-policy.js +26 -0
  73. package/dist/src/control-plane/domain/runner-quota.js +35 -0
  74. package/dist/src/control-plane/domain/schedule-policy.js +46 -0
  75. package/dist/src/control-plane/index.js +20 -0
  76. package/dist/src/control-plane/infrastructure/intake-host.js +24 -0
  77. package/dist/src/control-plane/infrastructure/resident-host.js +45 -0
  78. package/dist/src/control-plane/infrastructure/tick-host.js +35 -0
  79. package/dist/src/execution/application/activation-claim.js +50 -0
  80. package/dist/src/execution/application/active-run-cancellation.js +14 -0
  81. package/dist/src/execution/application/execution-activity.js +97 -0
  82. package/dist/src/execution/application/execution-projection.js +17 -0
  83. package/dist/src/execution/application/execution-service.js +372 -0
  84. package/dist/src/execution/application/execution-validation.js +26 -0
  85. package/dist/src/execution/application/recovery-service.js +212 -0
  86. package/dist/src/execution/application/run-lifecycle.js +115 -0
  87. package/dist/src/execution/application/run-liveness-service.js +80 -0
  88. package/dist/src/execution/application/run-repository.js +27 -0
  89. package/dist/src/execution/contracts/commands.js +1 -0
  90. package/dist/src/execution/contracts/config.js +35 -0
  91. package/dist/src/execution/contracts/control-plane.js +1 -0
  92. package/dist/src/execution/contracts/event-factory.js +53 -0
  93. package/dist/src/execution/contracts/events.js +274 -0
  94. package/dist/src/execution/contracts/identifiers.js +5 -0
  95. package/dist/src/execution/contracts/liveness.js +1 -0
  96. package/dist/src/execution/contracts/results.js +1 -0
  97. package/dist/src/execution/contracts/runner.js +15 -0
  98. package/dist/src/execution/contracts/streams.js +10 -0
  99. package/dist/src/execution/contracts/views.js +1 -0
  100. package/dist/src/execution/contracts/vocabulary.js +43 -0
  101. package/dist/src/execution/contracts/workspace.js +1 -0
  102. package/dist/src/execution/domain/run-result.js +34 -0
  103. package/dist/src/execution/domain/run.js +142 -0
  104. package/dist/src/execution/index.js +31 -0
  105. package/dist/src/execution/infrastructure/agent-runner-adapter.js +114 -0
  106. package/dist/src/execution/infrastructure/process-execution.js +29 -0
  107. package/dist/src/execution/infrastructure/prompt-templates.js +42 -0
  108. package/dist/src/execution/infrastructure/runners/claude.js +120 -0
  109. package/dist/src/execution/infrastructure/runners/codex.js +143 -0
  110. package/dist/src/execution/infrastructure/runners/command.js +4 -0
  111. package/dist/src/execution/infrastructure/runners/cursor.js +69 -0
  112. package/dist/src/execution/infrastructure/runners/fake-scenarios.js +99 -0
  113. package/dist/src/execution/infrastructure/runners/fake.js +65 -0
  114. package/dist/src/execution/infrastructure/runners/registry.js +26 -0
  115. package/dist/src/execution/infrastructure/transcript-store.js +223 -0
  116. package/dist/src/execution/infrastructure/transcripts.js +11 -0
  117. package/dist/src/execution/infrastructure/workspace/fake-workspace.js +19 -0
  118. package/dist/src/execution/infrastructure/workspace/git-workspace.js +241 -0
  119. package/dist/src/integrations/application/agent-run-publication-reactor.js +111 -0
  120. package/dist/src/integrations/application/artifact-registration-reactor.js +159 -0
  121. package/dist/src/integrations/application/poll-service.js +25 -0
  122. package/dist/src/integrations/application/terminal-agent-run-report.js +40 -0
  123. package/dist/src/integrations/application/work-admission.js +31 -0
  124. package/dist/src/integrations/application/work-conclusion.js +19 -0
  125. package/dist/src/integrations/contracts/artifact-events.js +60 -0
  126. package/dist/src/integrations/contracts/artifact-vocabulary.js +9 -0
  127. package/dist/src/integrations/contracts/config.js +14 -0
  128. package/dist/src/integrations/contracts/identifiers.js +5 -0
  129. package/dist/src/integrations/contracts/intake-rules.js +14 -0
  130. package/dist/src/integrations/contracts/intake.js +1 -0
  131. package/dist/src/integrations/contracts/outcome-vocabulary.js +7 -0
  132. package/dist/src/integrations/contracts/provider.js +37 -0
  133. package/dist/src/integrations/contracts/streams.js +10 -0
  134. package/dist/src/integrations/delivery/application/delivery-outcome-reactor.js +75 -0
  135. package/dist/src/integrations/delivery/application/delivery-projector.js +165 -0
  136. package/dist/src/integrations/delivery/application/delivery-service.js +173 -0
  137. package/dist/src/integrations/delivery/contracts/commands.js +1 -0
  138. package/dist/src/integrations/delivery/contracts/config.js +1 -0
  139. package/dist/src/integrations/delivery/contracts/event-factory.js +18 -0
  140. package/dist/src/integrations/delivery/contracts/events.js +86 -0
  141. package/dist/src/integrations/delivery/contracts/intents.js +89 -0
  142. package/dist/src/integrations/delivery/contracts/views.js +1 -0
  143. package/dist/src/integrations/delivery/contracts/vocabulary.js +22 -0
  144. package/dist/src/integrations/fake/durable-delivery-provider.js +48 -0
  145. package/dist/src/integrations/fake/external-sink.js +9 -0
  146. package/dist/src/integrations/fake/external-source.js +44 -0
  147. package/dist/src/integrations/fake/inbound-translator.js +130 -0
  148. package/dist/src/integrations/fake/provider.js +95 -0
  149. package/dist/src/integrations/github/application/agent-context-reader.js +54 -0
  150. package/dist/src/integrations/github/application/agent-run-comment.js +94 -0
  151. package/dist/src/integrations/github/application/comment-history-reader.js +43 -0
  152. package/dist/src/integrations/github/application/inbound-context.js +10 -0
  153. package/dist/src/integrations/github/application/inbound-review-signals.js +159 -0
  154. package/dist/src/integrations/github/application/inbound-translator.js +231 -0
  155. package/dist/src/integrations/github/application/inbound-watch-gate-signals.js +84 -0
  156. package/dist/src/integrations/github/application/intake-policy.js +23 -0
  157. package/dist/src/integrations/github/application/outbound-translator.js +47 -0
  158. package/dist/src/integrations/github/application/poll-service.js +29 -0
  159. package/dist/src/integrations/github/application/pull-request-translation.js +10 -0
  160. package/dist/src/integrations/github/application/resource-links.js +8 -0
  161. package/dist/src/integrations/github/application/review-command-translator.js +16 -0
  162. package/dist/src/integrations/github/application/wake-labels.js +95 -0
  163. package/dist/src/integrations/github/contracts/config.js +47 -0
  164. package/dist/src/integrations/github/contracts/events.js +127 -0
  165. package/dist/src/integrations/github/contracts/external-key.js +19 -0
  166. package/dist/src/integrations/github/contracts/payloads.js +9 -0
  167. package/dist/src/integrations/github/contracts/vocabulary.js +55 -0
  168. package/dist/src/integrations/github/index.js +31 -0
  169. package/dist/src/integrations/github/infrastructure/client-reads.js +214 -0
  170. package/dist/src/integrations/github/infrastructure/client.js +132 -0
  171. package/dist/src/integrations/github/infrastructure/content-fingerprint.js +10 -0
  172. package/dist/src/integrations/github/infrastructure/delivery.js +31 -0
  173. package/dist/src/integrations/github/infrastructure/etag-cache.js +56 -0
  174. package/dist/src/integrations/github/infrastructure/gh-auth.js +19 -0
  175. package/dist/src/integrations/github/infrastructure/issue-source.js +109 -0
  176. package/dist/src/integrations/github/infrastructure/pr-source.js +186 -0
  177. package/dist/src/integrations/github/infrastructure/review-source.js +70 -0
  178. package/dist/src/integrations/github/infrastructure/source.js +108 -0
  179. package/dist/src/integrations/github/provider.js +96 -0
  180. package/dist/src/integrations/index.js +30 -0
  181. package/dist/src/kernel/contracts/checkpoint-store.js +1 -0
  182. package/dist/src/kernel/contracts/clock.js +1 -0
  183. package/dist/src/kernel/contracts/commands.js +1 -0
  184. package/dist/src/kernel/contracts/event-journal.js +2 -0
  185. package/dist/src/kernel/contracts/event-schema.js +54 -0
  186. package/dist/src/kernel/contracts/events.js +11 -0
  187. package/dist/src/kernel/contracts/id-generator.js +1 -0
  188. package/dist/src/kernel/contracts/identifiers.js +8 -0
  189. package/dist/src/kernel/contracts/projection-store.js +1 -0
  190. package/dist/src/kernel/contracts/relations.js +1 -0
  191. package/dist/src/kernel/contracts/schema.js +17 -0
  192. package/dist/src/kernel/contracts/vocabulary.js +6 -0
  193. package/dist/src/kernel/domain/event-envelope.js +29 -0
  194. package/dist/src/kernel/domain/match-mode.js +11 -0
  195. package/dist/src/kernel/domain/relation.js +10 -0
  196. package/dist/src/kernel/index.js +17 -0
  197. package/dist/src/{lib/clock.js → kernel/infrastructure/system-clock.js} +3 -3
  198. package/dist/src/kernel/infrastructure/ulid-id-generator.js +9 -0
  199. package/dist/src/main.js +137 -1030
  200. package/dist/src/orchestration/application/accept-activity-outcome.js +25 -0
  201. package/dist/src/orchestration/application/accept-signal.js +35 -0
  202. package/dist/src/orchestration/application/advance-workflow.js +160 -0
  203. package/dist/src/orchestration/application/coordination-claims.js +107 -0
  204. package/dist/src/orchestration/application/group-budget-recorder.js +43 -0
  205. package/dist/src/orchestration/application/orchestration-projection.js +20 -0
  206. package/dist/src/orchestration/application/orchestration-repository.js +36 -0
  207. package/dist/src/orchestration/application/orchestration-service.js +82 -0
  208. package/dist/src/orchestration/application/request-child.js +118 -0
  209. package/dist/src/orchestration/application/signal-reactor.js +17 -0
  210. package/dist/src/orchestration/application/start-workflow.js +51 -0
  211. package/dist/src/orchestration/application/watch-reactor.js +82 -0
  212. package/dist/src/orchestration/contracts/activity-outcome.js +18 -0
  213. package/dist/src/orchestration/contracts/commands.js +1 -0
  214. package/dist/src/orchestration/contracts/config.js +128 -0
  215. package/dist/src/orchestration/contracts/event-decoder.js +263 -0
  216. package/dist/src/orchestration/contracts/events.js +41 -0
  217. package/dist/src/orchestration/contracts/identifiers.js +35 -0
  218. package/dist/src/orchestration/contracts/streams.js +38 -0
  219. package/dist/src/orchestration/contracts/views.js +1 -0
  220. package/dist/src/orchestration/contracts/vocabulary.js +30 -0
  221. package/dist/src/orchestration/domain/activation-policy.js +55 -0
  222. package/dist/src/orchestration/domain/approval-defaults.js +17 -0
  223. package/dist/src/orchestration/domain/child-policy.js +63 -0
  224. package/dist/src/orchestration/domain/compiler.js +162 -0
  225. package/dist/src/orchestration/domain/coordination-events.js +25 -0
  226. package/dist/src/orchestration/domain/decision-events.js +47 -0
  227. package/dist/src/orchestration/domain/interpreter.js +49 -0
  228. package/dist/src/orchestration/domain/operator-retry-policy.js +34 -0
  229. package/dist/src/orchestration/domain/retry-policy.js +26 -0
  230. package/dist/src/orchestration/domain/signal-policy.js +120 -0
  231. package/dist/src/orchestration/domain/supplemental-policy.js +61 -0
  232. package/dist/src/orchestration/domain/transition.js +55 -0
  233. package/dist/src/orchestration/domain/workflow-graph.js +41 -0
  234. package/dist/src/orchestration/domain/workflow-instance-events.js +236 -0
  235. package/dist/src/orchestration/domain/workflow-instance.js +41 -0
  236. package/dist/src/orchestration/domain/workflow-selector.js +21 -0
  237. package/dist/src/orchestration/index.js +19 -0
  238. package/dist/src/persistence/application/projection-runner.js +79 -0
  239. package/dist/src/persistence/filesystem/file-checkpoint-store.js +35 -0
  240. package/dist/src/persistence/filesystem/file-event-journal.js +143 -0
  241. package/dist/src/persistence/filesystem/file-lock.js +91 -0
  242. package/dist/src/persistence/filesystem/file-projection-store.js +64 -0
  243. package/dist/src/persistence/index.js +8 -0
  244. package/dist/src/persistence/memory/in-memory-checkpoint-store.js +14 -0
  245. package/dist/src/persistence/memory/in-memory-event-journal.js +88 -0
  246. package/dist/src/persistence/memory/in-memory-projection-store.js +17 -0
  247. package/dist/src/resources/application/lookup-projections.js +48 -0
  248. package/dist/src/resources/application/resource-lookup.js +16 -0
  249. package/dist/src/resources/application/resource-projections.js +81 -0
  250. package/dist/src/resources/application/resource-repository.js +18 -0
  251. package/dist/src/resources/application/resource-service.js +83 -0
  252. package/dist/src/resources/contracts/commands.js +1 -0
  253. package/dist/src/resources/contracts/config.js +2 -0
  254. package/dist/src/resources/contracts/events.js +83 -0
  255. package/dist/src/resources/contracts/identifiers.js +15 -0
  256. package/dist/src/resources/contracts/streams.js +6 -0
  257. package/dist/src/resources/contracts/views.js +1 -0
  258. package/dist/src/resources/contracts/vocabulary.js +67 -0
  259. package/dist/src/resources/domain/correlation.js +8 -0
  260. package/dist/src/resources/domain/resource.js +58 -0
  261. package/dist/src/resources/index.js +14 -0
  262. package/dist/src/surfaces/api/contracts/activities.js +1 -0
  263. package/dist/src/surfaces/api/contracts/board.js +2 -0
  264. package/dist/src/surfaces/api/contracts/common.js +46 -0
  265. package/dist/src/surfaces/api/contracts/control-plane.js +5 -0
  266. package/dist/src/surfaces/api/contracts/events.js +1 -0
  267. package/dist/src/surfaces/api/contracts/execution.js +1 -0
  268. package/dist/src/surfaces/api/contracts/index.js +13 -0
  269. package/dist/src/surfaces/api/contracts/observability.js +1 -0
  270. package/dist/src/surfaces/api/contracts/orchestration.js +1 -0
  271. package/dist/src/surfaces/api/contracts/resources.js +1 -0
  272. package/dist/src/surfaces/api/contracts/status.js +1 -0
  273. package/dist/src/surfaces/api/contracts/system.js +1 -0
  274. package/dist/src/surfaces/api/contracts/transport-values.js +39 -0
  275. package/dist/src/surfaces/api/contracts/work.js +17 -0
  276. package/dist/src/surfaces/api/http-server.js +121 -0
  277. package/dist/src/surfaces/api/presenters/activities.js +1 -0
  278. package/dist/src/surfaces/api/presenters/board.js +3 -0
  279. package/dist/src/surfaces/api/presenters/control-plane.js +1 -0
  280. package/dist/src/surfaces/api/presenters/events.js +1 -0
  281. package/dist/src/surfaces/api/presenters/execution.js +59 -0
  282. package/dist/src/surfaces/api/presenters/observability.js +1 -0
  283. package/dist/src/surfaces/api/presenters/orchestration.js +19 -0
  284. package/dist/src/surfaces/api/presenters/resources.js +15 -0
  285. package/dist/src/surfaces/api/presenters/status.js +3 -0
  286. package/dist/src/surfaces/api/presenters/system.js +14 -0
  287. package/dist/src/surfaces/api/presenters/work.js +16 -0
  288. package/dist/src/surfaces/api/problem-details.js +9 -0
  289. package/dist/src/surfaces/api/router.js +13 -0
  290. package/dist/src/surfaces/api/routes/activities.js +1 -0
  291. package/dist/src/surfaces/api/routes/applications.js +1 -0
  292. package/dist/src/surfaces/api/routes/commands.js +82 -0
  293. package/dist/src/surfaces/api/routes/control-plane.js +6 -0
  294. package/dist/src/surfaces/api/routes/events.js +1 -0
  295. package/dist/src/surfaces/api/routes/execution.js +8 -0
  296. package/dist/src/surfaces/api/routes/index.js +18 -0
  297. package/dist/src/surfaces/api/routes/observability.js +1 -0
  298. package/dist/src/surfaces/api/routes/orchestration.js +1 -0
  299. package/dist/src/surfaces/api/routes/pagination.js +78 -0
  300. package/dist/src/surfaces/api/routes/read.js +135 -0
  301. package/dist/src/surfaces/api/routes/resources.js +1 -0
  302. package/dist/src/surfaces/api/routes/responses.js +67 -0
  303. package/dist/src/surfaces/api/routes/system.js +1 -0
  304. package/dist/src/surfaces/api/routes/work.js +9 -0
  305. package/dist/src/surfaces/cli/commands/api.js +1 -0
  306. package/dist/src/surfaces/cli/commands/audit.js +10 -0
  307. package/dist/src/surfaces/cli/commands/correlate.js +2 -0
  308. package/dist/src/surfaces/cli/commands/doctor.js +6 -0
  309. package/dist/src/surfaces/cli/commands/init.js +39 -0
  310. package/dist/src/surfaces/cli/commands/sandbox-entrypoint.js +33 -0
  311. package/dist/src/surfaces/cli/commands/sandbox-setup.js +29 -0
  312. package/dist/src/surfaces/cli/commands/sandbox.js +105 -0
  313. package/dist/src/surfaces/cli/commands/self-update.js +38 -0
  314. package/dist/src/surfaces/cli/commands/smoke.js +16 -0
  315. package/dist/src/surfaces/cli/commands/start.js +1 -0
  316. package/dist/src/surfaces/cli/commands/stop.js +13 -0
  317. package/dist/src/surfaces/cli/commands/tick.js +1 -0
  318. package/dist/src/surfaces/cli/commands/ui.js +2 -0
  319. package/dist/src/surfaces/cli/commands/validate-state.js +5 -0
  320. package/dist/src/surfaces/cli/infrastructure/docker-cli.js +221 -0
  321. package/dist/src/surfaces/cli/infrastructure/process-log.js +86 -0
  322. package/dist/src/surfaces/cli/main.js +140 -0
  323. package/dist/src/surfaces/cli/usage.js +33 -0
  324. package/dist/src/surfaces/contracts/config.js +34 -0
  325. package/dist/src/surfaces/index.js +47 -0
  326. package/dist/src/surfaces/web-assets/assets/index-Bfn4FwZG.css +1 -0
  327. package/dist/src/surfaces/web-assets/assets/index-ipB6JPGU.js +1090 -0
  328. package/dist/src/surfaces/web-assets/index.html +13 -0
  329. package/dist/src/surfaces/web-host/asset-source.js +1 -0
  330. package/dist/src/surfaces/web-host/packaged-assets.js +44 -0
  331. package/dist/src/work/application/work-projection.js +59 -0
  332. package/dist/src/work/application/work-repository.js +18 -0
  333. package/dist/src/work/application/work-service.js +117 -0
  334. package/dist/src/work/contracts/commands.js +1 -0
  335. package/dist/src/work/contracts/config.js +2 -0
  336. package/dist/src/work/contracts/events.js +103 -0
  337. package/dist/src/work/contracts/identifiers.js +5 -0
  338. package/dist/src/work/contracts/streams.js +6 -0
  339. package/dist/src/work/contracts/views.js +1 -0
  340. package/dist/src/work/contracts/vocabulary.js +6 -0
  341. package/dist/src/work/domain/work-item.js +89 -0
  342. package/dist/src/work/index.js +11 -0
  343. package/docker/Dockerfile +10 -6
  344. package/docker/Dockerfile.packaged +3 -3
  345. package/package.json +29 -4
  346. package/prompts/implement.md +2 -2
  347. package/templates/SETUP.md +7 -7
  348. package/dist/src/adapters/claude/claude-runner.js +0 -529
  349. package/dist/src/adapters/codex/codex-runner.js +0 -503
  350. package/dist/src/adapters/cursor/cursor-runner.js +0 -418
  351. package/dist/src/adapters/docker/docker-cli.js +0 -150
  352. package/dist/src/adapters/fake/fake-artifact-verifier.js +0 -14
  353. package/dist/src/adapters/fake/fake-github-pull-request-activity-source.js +0 -77
  354. package/dist/src/adapters/fake/fake-resource-index.js +0 -21
  355. package/dist/src/adapters/fake/fake-runner.js +0 -77
  356. package/dist/src/adapters/fake/fake-ticketing-system.js +0 -185
  357. package/dist/src/adapters/fake/fake-workspace-manager.js +0 -81
  358. package/dist/src/adapters/fs/resource-index.js +0 -126
  359. package/dist/src/adapters/fs/self-update-ledger.js +0 -17
  360. package/dist/src/adapters/fs/state-store.js +0 -775
  361. package/dist/src/adapters/git/git-workspace-manager.js +0 -289
  362. package/dist/src/adapters/github/github-artifact-verifier.js +0 -38
  363. package/dist/src/adapters/github/github-auth.js +0 -16
  364. package/dist/src/adapters/github/github-client.js +0 -249
  365. package/dist/src/adapters/github/github-etag-cache.js +0 -57
  366. package/dist/src/adapters/github/github-issues-work-source.js +0 -692
  367. package/dist/src/adapters/github/github-pull-request-activity-source.js +0 -584
  368. package/dist/src/adapters/github/github-pull-request-merge-actor.js +0 -45
  369. package/dist/src/adapters/http/ui-assets.js +0 -1188
  370. package/dist/src/adapters/http/ui-data.js +0 -1107
  371. package/dist/src/adapters/http/ui-server.js +0 -458
  372. package/dist/src/adapters/runner/cli-command.js +0 -73
  373. package/dist/src/adapters/runner/prompt-templates.js +0 -76
  374. package/dist/src/adapters/runner/runner-cli-adapter.js +0 -112
  375. package/dist/src/adapters/runner/runner-registry.js +0 -139
  376. package/dist/src/adapters/runner/runtime-events.js +0 -32
  377. package/dist/src/adapters/runner/stage-prompt.js +0 -268
  378. package/dist/src/adapters/runner/transcripts.js +0 -25
  379. package/dist/src/cli/audit-command.js +0 -36
  380. package/dist/src/cli/correlate-command.js +0 -62
  381. package/dist/src/cli/doctor-command.js +0 -48
  382. package/dist/src/cli/init-command.js +0 -18
  383. package/dist/src/cli/sandbox-command.js +0 -258
  384. package/dist/src/cli/sandbox-entrypoint-command.js +0 -88
  385. package/dist/src/cli/sandbox-exec-logging.js +0 -7
  386. package/dist/src/cli/sandbox-resume.js +0 -79
  387. package/dist/src/cli/sandbox-setup-command.js +0 -31
  388. package/dist/src/cli/scaffold-assets.js +0 -100
  389. package/dist/src/cli/self-update-command.js +0 -198
  390. package/dist/src/cli/startup-preflight.js +0 -134
  391. package/dist/src/cli/stop-command.js +0 -46
  392. package/dist/src/cli/ui-command.js +0 -27
  393. package/dist/src/config/defaults.js +0 -10
  394. package/dist/src/config/discover-config-files.js +0 -11
  395. package/dist/src/config/load-config.js +0 -69
  396. package/dist/src/config/split-config.js +0 -14
  397. package/dist/src/core/active-run-recovery.js +0 -44
  398. package/dist/src/core/approval-intents.js +0 -16
  399. package/dist/src/core/audit-events.js +0 -82
  400. package/dist/src/core/control-plane.js +0 -192
  401. package/dist/src/core/event-builders.js +0 -153
  402. package/dist/src/core/event-resolver.js +0 -249
  403. package/dist/src/core/lifecycle-service.js +0 -8
  404. package/dist/src/core/live-execution.js +0 -81
  405. package/dist/src/core/outbox.js +0 -198
  406. package/dist/src/core/policy-engine.js +0 -389
  407. package/dist/src/core/projection-updater.js +0 -693
  408. package/dist/src/core/quota-backoff.js +0 -69
  409. package/dist/src/core/run-lease.js +0 -38
  410. package/dist/src/core/scheduled-workflow-source.js +0 -199
  411. package/dist/src/core/sink-router.js +0 -107
  412. package/dist/src/core/stale-run-reconciler.js +0 -352
  413. package/dist/src/core/tick-runner.js +0 -2365
  414. package/dist/src/core/workspace-cleanup.js +0 -117
  415. package/dist/src/domain/branch-naming.js +0 -14
  416. package/dist/src/domain/custom-commands.js +0 -58
  417. package/dist/src/domain/event-types.js +0 -158
  418. package/dist/src/domain/manual-labels.js +0 -1
  419. package/dist/src/domain/resource-uri.js +0 -38
  420. package/dist/src/domain/runner-routing.js +0 -127
  421. package/dist/src/domain/runtime-events.js +0 -36
  422. package/dist/src/domain/schema.js +0 -1233
  423. package/dist/src/domain/sources.js +0 -16
  424. package/dist/src/domain/stages.js +0 -36
  425. package/dist/src/domain/work-item-labels.js +0 -48
  426. package/dist/src/domain/work-item-lifecycle.js +0 -10
  427. package/dist/src/domain/work-item-status.js +0 -33
  428. package/dist/src/domain/workflows.js +0 -159
  429. package/dist/src/lib/deep-merge.js +0 -14
  430. package/dist/src/lib/detached-process-logging.js +0 -46
  431. package/dist/src/lib/event-log.js +0 -21
  432. package/dist/src/lib/format.js +0 -41
  433. package/dist/src/lib/json-file.js +0 -23
  434. package/dist/src/lib/lock.js +0 -181
  435. package/dist/src/lib/log-rotation.js +0 -42
  436. package/dist/src/lib/paths.js +0 -52
  437. package/dist/src/lib/process-identity.js +0 -54
  438. package/dist/src/lib/state-health.js +0 -30
  439. package/dist/src/lib/work-id.js +0 -19
  440. package/dist/src/lib/yaml-file.js +0 -20
  441. /package/dist/src/{core → activities/pr}/contracts.js +0 -0
  442. /package/dist/src/{domain/types.js → control-plane/contracts/views.js} +0 -0
@@ -1,4 +1,4 @@
1
- # Wake Setup Guide (for the assisting agent)
1
+ ?# Wake Setup Guide (for the assisting agent)
2
2
 
3
3
  You are reading this because a human just ran `wake init` and asked you to
4
4
  help finish configuring this Wake home. This file is written as instructions
@@ -37,29 +37,29 @@ preserves any other labels already on the issue.
37
37
  Full reference:
38
38
  https://github.com/atolis-hq/wake/blob/main/docs/configuration.md#sourcesgithub
39
39
 
40
- ## 2. Runner and tier
40
+ ## 2. Runner and runnerPool
41
41
 
42
42
  Ask the user which agent CLI(s) they have authenticated on this host:
43
43
  Claude, Codex, and/or Cursor.
44
44
 
45
45
  `config.workflows.yaml` already has example `runners` entries for
46
46
  `claude-haiku`, `claude-opus`, `codex-mini`, `codex-flagship`, and
47
- `cursor-composer`, but every tier (`light`/`standard`/`deep`, with
48
- `defaultTier: standard`) still points at the placeholder `fake` runner — none
47
+ `cursor-composer`, but every runnerPool (`light`/`standard`/`deep`, with
48
+ `defaultRunnerPool: standard`) still points at the placeholder `fake` runner — none
49
49
  of them route to a real runner yet. Don't rewrite this from scratch — pick
50
50
  which runner(s) the user actually has access to, and either:
51
51
 
52
- - repoint `tiers` so each tier lists the real named runner(s) the user can
52
+ - repoint `runnerPools` so each runnerPool lists the real named runner(s) the user can
53
53
  actually use instead of `fake`, or
54
54
  - if the user has a runner not already listed (a different model, a
55
55
  different CLI), add a new named entry under `runners` following the
56
- existing pattern, then reference it from `tiers`.
56
+ existing pattern, then reference it from `runnerPools`.
57
57
  - remove entries which are not needed.
58
58
 
59
59
  Full reference:
60
60
  https://github.com/atolis-hq/wake/blob/main/docs/configuration.md#runners
61
61
  and
62
- https://github.com/atolis-hq/wake/blob/main/docs/configuration.md#tiers
62
+ https://github.com/atolis-hq/wake/blob/main/docs/configuration.md#runnerPools
63
63
 
64
64
  ## 3. Credential mounts (check before asking)
65
65
 
@@ -1,529 +0,0 @@
1
- import { parseClaudePrintResult, parseRunnerResult } from '../../domain/schema.js';
2
- import { runAgentCliCommand } from '../runner/cli-command.js';
3
- import { buildStagePrompt, sentinelListForApproval } from '../runner/stage-prompt.js';
4
- import { emitRuntimeEvent, runnerRuntimeEvent } from '../runner/runtime-events.js';
5
- import { writeRunnerTranscript } from '../runner/transcripts.js';
6
- import { createAgentExecution } from '../../core/live-execution.js';
7
- export { buildStagePrompt } from '../runner/stage-prompt.js';
8
- function slugify(value, maxLength = 40) {
9
- return value
10
- .toLowerCase()
11
- .replace(/[^a-z0-9]+/g, '-')
12
- .replace(/^-+|-+$/g, '')
13
- .slice(0, maxLength)
14
- .replace(/-+$/g, '');
15
- }
16
- export function buildWakeSessionName(input) {
17
- return [input.sessionName, `issue-${input.issueNumber}`, slugify(input.title), input.runId]
18
- .filter((part) => part.length > 0)
19
- .join('-');
20
- }
21
- function compactLogValue(value) {
22
- return value.replace(/\s+/g, ' ').trim();
23
- }
24
- export function formatClaudeRunLogLine(input) {
25
- const parts = [
26
- '[claude-run]',
27
- `phase=${input.phase}`,
28
- `runId=${input.runId}`,
29
- `cli=Claude`,
30
- ...(input.model === undefined ? [] : [`model=${input.model}`]),
31
- `repo=${input.repo}`,
32
- `issueNumber=${input.issueNumber}`,
33
- `action=${input.action}`,
34
- `recentEventIds=${input.recentEventIds.length > 0 ? input.recentEventIds.join(',') : '(none)'}`,
35
- ...(input.workspacePath === undefined
36
- ? []
37
- : [`workspacePath=${compactLogValue(input.workspacePath)}`]),
38
- ...(input.sessionId === undefined ? [] : [`sessionId=${input.sessionId}`]),
39
- ...(input.exitCode === undefined ? [] : [`exitCode=${input.exitCode}`]),
40
- ];
41
- return parts.join(' ');
42
- }
43
- export function buildClaudePrintArgs(options) {
44
- return [
45
- '-p',
46
- '--output-format',
47
- 'json',
48
- '--model',
49
- options.model,
50
- '--name',
51
- options.sessionName,
52
- ...(options.resumeSessionId === undefined ? [] : ['--resume', options.resumeSessionId]),
53
- ...(options.effort === undefined ? [] : ['--effort', options.effort]),
54
- ...(options.systemPrompt === undefined ? [] : ['--append-system-prompt', options.systemPrompt]),
55
- ...(options.maxTurns === undefined ? [] : ['--max-turns', String(options.maxTurns)]),
56
- ...(options.permissionMode === undefined ? [] : ['--permission-mode', options.permissionMode]),
57
- ...(options.allowedTools === undefined || options.allowedTools.length === 0
58
- ? []
59
- : ['--allowedTools', options.allowedTools.join(' ')]),
60
- ...(options.remoteControlName === undefined
61
- ? []
62
- : ['--remote-control', options.remoteControlName]),
63
- // Generic escape hatch for any other CLI flag a stage template needs
64
- // (e.g. --dangerously-skip-permissions) without bespoke code per flag.
65
- ...(options.extraArgs ?? []),
66
- // Terminate option parsing so the prompt is never swallowed by a
67
- // variadic/optional-value flag above (e.g. --allowedTools, --remote-control,
68
- // or anything in extraArgs with an optional value).
69
- '--',
70
- options.prompt,
71
- ];
72
- }
73
- export function buildClaudeRemoteControlArgs(options) {
74
- return [
75
- '--bg',
76
- '--remote-control',
77
- options.remoteControlName,
78
- '--model',
79
- options.model,
80
- '--name',
81
- options.sessionName,
82
- options.prompt,
83
- ];
84
- }
85
- export function runClaudeCommand(input) {
86
- return runAgentCliCommand(input);
87
- }
88
- function resolveModel(options) {
89
- return options.settings.model;
90
- }
91
- function parseClaudePrintOutput(stdout) {
92
- return parseClaudePrintResult(JSON.parse(stdout));
93
- }
94
- function extractTokenUsage(parsed) {
95
- const usage = parsed.usage;
96
- if (usage === undefined) {
97
- return undefined;
98
- }
99
- const inputTokens = typeof usage.input_tokens === 'number' ? usage.input_tokens : 0;
100
- const outputTokens = typeof usage.output_tokens === 'number' ? usage.output_tokens : 0;
101
- const cacheCreationInputTokens = typeof usage.cache_creation_input_tokens === 'number'
102
- ? usage.cache_creation_input_tokens
103
- : undefined;
104
- const cacheReadInputTokens = typeof usage.cache_read_input_tokens === 'number' ? usage.cache_read_input_tokens : undefined;
105
- return {
106
- inputTokens,
107
- outputTokens,
108
- ...(cacheCreationInputTokens === undefined ? {} : { cacheCreationInputTokens }),
109
- ...(cacheReadInputTokens === undefined ? {} : { cacheReadInputTokens }),
110
- ...(parsed.total_cost_usd === undefined ? {} : { costUsd: parsed.total_cost_usd }),
111
- ...(parsed.num_turns === undefined ? {} : { turns: parsed.num_turns }),
112
- };
113
- }
114
- const CLAUDE_CLI_NAME = 'Claude';
115
- // Bounded — this is a single "just tell me the status" follow-up, not a
116
- // second attempt at the task, so it never needs more than one turn.
117
- const ENVELOPE_REPAIR_MAX_TURNS = 1;
118
- const ENVELOPE_REPAIR_TIMEOUT_MS = 60_000;
119
- function buildEnvelopeRepairPrompt(reviewShaped) {
120
- return [
121
- 'Your previous reply did not end with the required `wake-result` envelope, so it could not be parsed.',
122
- 'Reply with ONLY a fenced `wake-result` JSON block containing a `status` field, then repeat that status word on its own line after the closing fence.',
123
- `The status must be exactly one of: ${sentinelListForApproval(reviewShaped)}, reflecting the outcome of your previous turn.`,
124
- 'Do not repeat, summarize, or redo any of your previous work — this reply is parsed automatically and anything besides the envelope is discarded.',
125
- ].join('\n');
126
- }
127
- function mergeTokenUsage(base, extra) {
128
- if (extra === undefined) {
129
- return base;
130
- }
131
- if (base === undefined) {
132
- return extra;
133
- }
134
- return {
135
- inputTokens: base.inputTokens + extra.inputTokens,
136
- outputTokens: base.outputTokens + extra.outputTokens,
137
- ...(base.cacheCreationInputTokens === undefined && extra.cacheCreationInputTokens === undefined
138
- ? {}
139
- : {
140
- cacheCreationInputTokens: (base.cacheCreationInputTokens ?? 0) + (extra.cacheCreationInputTokens ?? 0),
141
- }),
142
- ...(base.cacheReadInputTokens === undefined && extra.cacheReadInputTokens === undefined
143
- ? {}
144
- : {
145
- cacheReadInputTokens: (base.cacheReadInputTokens ?? 0) + (extra.cacheReadInputTokens ?? 0),
146
- }),
147
- ...(base.costUsd === undefined && extra.costUsd === undefined
148
- ? {}
149
- : { costUsd: (base.costUsd ?? 0) + (extra.costUsd ?? 0) }),
150
- ...(base.turns === undefined && extra.turns === undefined
151
- ? {}
152
- : { turns: (base.turns ?? 0) + (extra.turns ?? 0) }),
153
- };
154
- }
155
- // Asks the same (still-live) session to restate just its result envelope,
156
- // for the case where a run otherwise completed but the model forgot the
157
- // mandatory trailer — cheaper and more honest than defaulting the whole run
158
- // to BLOCKED because of a formatting slip. Returns undefined on any failure
159
- // so the caller falls back to the original (unparseable) result untouched.
160
- async function attemptEnvelopeRepair(input) {
161
- const args = buildClaudePrintArgs({
162
- model: input.model,
163
- prompt: buildEnvelopeRepairPrompt(input.reviewShaped),
164
- sessionName: input.sessionName,
165
- resumeSessionId: input.sessionId,
166
- maxTurns: ENVELOPE_REPAIR_MAX_TURNS,
167
- });
168
- const result = await runClaudeCommand({
169
- command: input.command,
170
- args,
171
- cwd: input.cwd,
172
- timeoutMs: input.timeoutMs,
173
- });
174
- if (result.exitCode !== 0 || result.timedOut || result.stdout.trim().length === 0) {
175
- return undefined;
176
- }
177
- try {
178
- const parsed = parseClaudePrintOutput(result.stdout);
179
- const repairTokenUsage = extractTokenUsage(parsed);
180
- return {
181
- text: parsed.result,
182
- ...(repairTokenUsage === undefined ? {} : { tokenUsage: repairTokenUsage }),
183
- };
184
- }
185
- catch {
186
- return undefined;
187
- }
188
- }
189
- export function classifyClaudeCliFailure(input) {
190
- if (input.timedOut) {
191
- return 'infra';
192
- }
193
- const text = `${input.stderr}\n${input.stdout}`.toLowerCase();
194
- if (text.includes('rate limit') ||
195
- text.includes('quota') ||
196
- text.includes('billing') ||
197
- text.includes('credit balance') ||
198
- text.includes('spend limit') ||
199
- text.includes('usage limit') ||
200
- text.includes('session limit') ||
201
- text.includes('too many requests') ||
202
- text.includes('authentication') ||
203
- text.includes('unauthorized') ||
204
- text.includes('permission denied')) {
205
- return 'quota';
206
- }
207
- return 'infra';
208
- }
209
- function readSandboxLogBreadcrumb() {
210
- const containerName = process.env.WAKE_SANDBOX_CONTAINER_NAME;
211
- if (containerName === undefined || containerName.length === 0) {
212
- return null;
213
- }
214
- return {
215
- text: `Sandbox logs: docker logs --tail 200 ${containerName}`,
216
- metadata: {
217
- sandboxContainerName: containerName,
218
- },
219
- };
220
- }
221
- export function createClaudeRunner(options) {
222
- async function executeRun(input) {
223
- const sessionName = buildWakeSessionName({
224
- sessionName: options.settings.sessionName,
225
- issueNumber: input.projection.issue.number,
226
- title: input.projection.issue.title,
227
- runId: input.runId,
228
- });
229
- // Resume an in-progress session when the projection carries a session ID
230
- // that was created by this same CLI. This happens when the previous run
231
- // ended with BLOCKED and the same action is being retried after a human
232
- // reply. Any forward-stage transition or FAILED run clears the stored
233
- // session ID so that the next action always starts fresh.
234
- const priorSessionId = input.projection.wake.sessionId;
235
- const priorSessionCli = input.projection.wake.sessionCli;
236
- const isResume = priorSessionId !== undefined && priorSessionCli === CLAUDE_CLI_NAME;
237
- const stagePrompt = await buildStagePrompt({
238
- action: input.action,
239
- projection: input.projection,
240
- mode: isResume ? 'resume' : 'start',
241
- config: input.config,
242
- ...(input.promptContextOverrides === undefined
243
- ? {}
244
- : { contextOverrides: input.promptContextOverrides }),
245
- ...(input.mergeConflictDetected === true ? { mergeConflictDetected: true } : {}),
246
- ...(input.upstreamChanges === undefined ? {} : { upstreamChanges: input.upstreamChanges }),
247
- ...(input.preExistingUncommittedChanges === true
248
- ? { preExistingUncommittedChanges: true }
249
- : {}),
250
- });
251
- const model = resolveModel({
252
- action: input.action,
253
- settings: options.settings,
254
- });
255
- const args = buildClaudePrintArgs({
256
- model,
257
- prompt: stagePrompt.prompt,
258
- systemPrompt: stagePrompt.harnessPrompt,
259
- sessionName,
260
- allowedTools: stagePrompt.allowedTools,
261
- extraArgs: stagePrompt.extraArgs,
262
- maxTurns: stagePrompt.maxTurns,
263
- ...(stagePrompt.permissionMode === undefined
264
- ? {}
265
- : { permissionMode: stagePrompt.permissionMode }),
266
- ...(options.settings.remoteControl.enabled ? { remoteControlName: sessionName } : {}),
267
- ...(options.settings.effort === undefined ? {} : { effort: options.settings.effort }),
268
- ...(isResume ? { resumeSessionId: priorSessionId } : {}),
269
- });
270
- const promptTranscriptPath = await writeRunnerTranscript({
271
- config: input.config,
272
- projection: input.projection,
273
- runId: input.runId,
274
- action: input.action,
275
- cli: CLAUDE_CLI_NAME,
276
- kind: 'prompt',
277
- text: stagePrompt.prompt,
278
- });
279
- console.log(formatClaudeRunLogLine({
280
- phase: 'start',
281
- runId: input.runId,
282
- action: input.action,
283
- issueNumber: input.projection.issue.number,
284
- repo: input.projection.issue.repo,
285
- recentEventIds: input.recentEvents.map((event) => event.eventId),
286
- model,
287
- ...(input.workspacePath === undefined ? {} : { workspacePath: input.workspacePath }),
288
- }));
289
- const result = await runClaudeCommand({
290
- command: options.command,
291
- args,
292
- cwd: input.workspacePath ?? options.cwd,
293
- timeoutMs: options.settings.timeoutMs,
294
- ...(input.cancellationSignal === undefined
295
- ? {}
296
- : { cancellationSignal: input.cancellationSignal }),
297
- onProcessStart: async (identity) => {
298
- await input.onProcessStart?.(identity);
299
- await emitRuntimeEvent(input.onRuntimeEvent, runnerRuntimeEvent({
300
- type: 'agent.process.started',
301
- runId: input.runId,
302
- projection: input.projection,
303
- routing: input.routing,
304
- cli: CLAUDE_CLI_NAME,
305
- model,
306
- payload: { pid: identity.pid, processStartedAt: identity.processStartedAt },
307
- }));
308
- },
309
- });
310
- const responseTranscriptPath = await writeRunnerTranscript({
311
- config: input.config,
312
- projection: input.projection,
313
- runId: input.runId,
314
- action: input.action,
315
- cli: CLAUDE_CLI_NAME,
316
- kind: 'response',
317
- text: result.stdout,
318
- });
319
- if (result.exitCode !== 0 || result.timedOut || result.stdout.trim().length === 0) {
320
- const sandboxLog = readSandboxLogBreadcrumb();
321
- const failureClass = classifyClaudeCliFailure({
322
- stdout: result.stdout,
323
- stderr: result.stderr,
324
- timedOut: result.timedOut,
325
- });
326
- console.error(formatClaudeRunLogLine({
327
- phase: 'failure',
328
- runId: input.runId,
329
- action: input.action,
330
- issueNumber: input.projection.issue.number,
331
- repo: input.projection.issue.repo,
332
- recentEventIds: input.recentEvents.map((event) => event.eventId),
333
- model,
334
- ...(input.workspacePath === undefined ? {} : { workspacePath: input.workspacePath }),
335
- exitCode: result.exitCode,
336
- }));
337
- await emitRuntimeEvent(input.onRuntimeEvent, runnerRuntimeEvent({
338
- type: 'agent.process.exited',
339
- runId: input.runId,
340
- projection: input.projection,
341
- routing: input.routing,
342
- cli: CLAUDE_CLI_NAME,
343
- model,
344
- payload: { exitCode: result.exitCode, timedOut: result.timedOut },
345
- }));
346
- let parsedReason;
347
- let stdoutFailureDetail;
348
- const trimmedStdout = result.stdout.trim();
349
- try {
350
- if (trimmedStdout.length > 0) {
351
- parsedReason = parseClaudePrintOutput(result.stdout).result;
352
- }
353
- }
354
- catch {
355
- // stdout wasn't valid JSON, so it is likely a CLI-level error
356
- // message rather than a Claude print result.
357
- stdoutFailureDetail = trimmedStdout;
358
- }
359
- return {
360
- result: [
361
- result.timedOut
362
- ? `Claude runner timed out after ${options.settings.timeoutMs}ms and was killed`
363
- : trimmedStdout.length === 0
364
- ? 'Claude runner produced no output'
365
- : parsedReason !== undefined
366
- ? `Claude runner failed: ${parsedReason}`
367
- : 'Claude runner failed',
368
- result.stderr,
369
- stdoutFailureDetail,
370
- sandboxLog?.text,
371
- 'FAILED',
372
- ]
373
- .filter((part) => part !== undefined && part.length > 0)
374
- .join('\n'),
375
- model,
376
- cli: CLAUDE_CLI_NAME,
377
- failureClass,
378
- metadata: {
379
- stdout: result.stdout,
380
- stderr: result.stderr,
381
- exitCode: result.exitCode,
382
- failureClass,
383
- ...(promptTranscriptPath === undefined ? {} : { promptTranscriptPath }),
384
- ...(responseTranscriptPath === undefined ? {} : { responseTranscriptPath }),
385
- ...(sandboxLog?.metadata ?? {}),
386
- },
387
- };
388
- }
389
- const parsed = parseClaudePrintOutput(result.stdout);
390
- const sandboxLog = readSandboxLogBreadcrumb();
391
- await emitRuntimeEvent(input.onRuntimeEvent, runnerRuntimeEvent({
392
- type: 'agent.progress',
393
- runId: input.runId,
394
- projection: input.projection,
395
- routing: input.routing,
396
- cli: CLAUDE_CLI_NAME,
397
- model,
398
- ...(parsed.session_id === undefined ? {} : { sessionId: parsed.session_id }),
399
- payload: { message: 'Claude print result received', raw: parsed },
400
- }));
401
- console.log(formatClaudeRunLogLine({
402
- phase: 'success',
403
- runId: input.runId,
404
- action: input.action,
405
- issueNumber: input.projection.issue.number,
406
- repo: input.projection.issue.repo,
407
- recentEventIds: input.recentEvents.map((event) => event.eventId),
408
- model,
409
- ...(input.workspacePath === undefined ? {} : { workspacePath: input.workspacePath }),
410
- ...(parsed.session_id === undefined ? {} : { sessionId: parsed.session_id }),
411
- }));
412
- const tokenUsage = extractTokenUsage(parsed);
413
- let effectiveResultText = parsed.result;
414
- let effectiveTokenUsage = tokenUsage;
415
- let envelopeRepaired = false;
416
- if (parseRunnerResult(effectiveResultText).envelope === 'missing' &&
417
- parsed.session_id !== undefined) {
418
- const repair = await attemptEnvelopeRepair({
419
- command: options.command,
420
- cwd: input.workspacePath ?? options.cwd,
421
- model,
422
- sessionName,
423
- sessionId: parsed.session_id,
424
- reviewShaped: stagePrompt.reviewShaped,
425
- timeoutMs: Math.min(options.settings.timeoutMs, ENVELOPE_REPAIR_TIMEOUT_MS),
426
- });
427
- if (repair !== undefined && parseRunnerResult(repair.text).envelope !== 'missing') {
428
- effectiveResultText = `${effectiveResultText.trimEnd()}\n\n${repair.text.trim()}`;
429
- effectiveTokenUsage = mergeTokenUsage(effectiveTokenUsage, repair.tokenUsage);
430
- envelopeRepaired = true;
431
- console.log(`[claude-run] envelope repair succeeded runId=${input.runId} sessionId=${parsed.session_id}`);
432
- }
433
- else {
434
- console.error(`[claude-run] envelope repair failed runId=${input.runId} sessionId=${parsed.session_id}`);
435
- }
436
- }
437
- if (tokenUsage !== undefined) {
438
- await emitRuntimeEvent(input.onRuntimeEvent, runnerRuntimeEvent({
439
- type: 'agent.usage.updated',
440
- runId: input.runId,
441
- projection: input.projection,
442
- routing: input.routing,
443
- cli: CLAUDE_CLI_NAME,
444
- model,
445
- ...(parsed.session_id === undefined ? {} : { sessionId: parsed.session_id }),
446
- payload: { tokenUsage },
447
- }));
448
- }
449
- await emitRuntimeEvent(input.onRuntimeEvent, runnerRuntimeEvent({
450
- type: 'agent.process.exited',
451
- runId: input.runId,
452
- projection: input.projection,
453
- routing: input.routing,
454
- cli: CLAUDE_CLI_NAME,
455
- model,
456
- ...(parsed.session_id === undefined ? {} : { sessionId: parsed.session_id }),
457
- payload: { exitCode: result.exitCode, timedOut: result.timedOut },
458
- }));
459
- return {
460
- result: effectiveResultText,
461
- model,
462
- cli: CLAUDE_CLI_NAME,
463
- ...(parseRunnerResult(effectiveResultText).status === 'FAILED'
464
- ? { failureClass: 'task' }
465
- : {}),
466
- ...(parsed.session_id === undefined ? {} : { session_id: parsed.session_id }),
467
- ...(effectiveTokenUsage === undefined ? {} : { tokenUsage: effectiveTokenUsage }),
468
- metadata: {
469
- stdout: result.stdout,
470
- stderr: result.stderr,
471
- raw: parsed,
472
- skipApproval: stagePrompt.skipApproval,
473
- allowAutoApproval: stagePrompt.allowAutoApproval,
474
- ...(envelopeRepaired ? { envelopeRepaired: true } : {}),
475
- ...(promptTranscriptPath === undefined ? {} : { promptTranscriptPath }),
476
- ...(responseTranscriptPath === undefined ? {} : { responseTranscriptPath }),
477
- ...(sandboxLog?.metadata ?? {}),
478
- },
479
- };
480
- }
481
- return {
482
- async start(input) {
483
- return createAgentExecution(input, executeRun);
484
- },
485
- async run(input) {
486
- return (await this.start(input)).result;
487
- },
488
- async smoke() {
489
- const args = buildClaudePrintArgs({
490
- model: options.settings.smokeModel,
491
- prompt: options.settings.smokePrompt,
492
- sessionName: options.settings.sessionName,
493
- });
494
- const result = await runClaudeCommand({
495
- command: options.command,
496
- args,
497
- cwd: options.cwd,
498
- });
499
- const parsed = result.exitCode === 0 && result.stdout.trim().length > 0
500
- ? parseClaudePrintOutput(result.stdout)
501
- : undefined;
502
- return {
503
- text: parsed?.result ?? '',
504
- ...(parsed?.session_id === undefined ? {} : { sessionId: parsed.session_id }),
505
- stdout: result.stdout,
506
- stderr: result.stderr,
507
- exitCode: result.exitCode,
508
- };
509
- },
510
- async startRemoteControlSmoke() {
511
- const args = buildClaudeRemoteControlArgs({
512
- model: options.settings.smokeModel,
513
- prompt: options.settings.smokePrompt,
514
- remoteControlName: options.settings.remoteControlName,
515
- sessionName: options.settings.sessionName,
516
- });
517
- const result = await runClaudeCommand({
518
- command: options.command,
519
- args,
520
- cwd: options.cwd,
521
- });
522
- return {
523
- ...result,
524
- command: options.command,
525
- args,
526
- };
527
- },
528
- };
529
- }