@atolis-hq/wake 0.2.97 → 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 -2442
  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,289 +0,0 @@
1
- import { execFile as nodeExecFile } from 'node:child_process';
2
- import { access, mkdir, rm } from 'node:fs/promises';
3
- import { dirname, join } from 'node:path';
4
- import { promisify } from 'node:util';
5
- import { createWakePaths } from '../../lib/paths.js';
6
- import { branchNameForIssue } from '../../domain/branch-naming.js';
7
- const execFile = promisify(nodeExecFile);
8
- // Re-exported for existing callers (this adapter's own use below, plus
9
- // adapters/runner/stage-prompt.ts and tests) — the canonical definition now
10
- // lives in domain/branch-naming.ts so core/ can use it without importing a
11
- // concrete adapter.
12
- export { branchNameForIssue };
13
- async function git(args, cwd) {
14
- const result = await execFile('git', args, {
15
- cwd,
16
- env: process.env,
17
- encoding: 'utf8',
18
- maxBuffer: 1024 * 1024 * 16,
19
- });
20
- return { stdout: result.stdout.trim(), stderr: result.stderr.trim() };
21
- }
22
- async function gitExitCode(args, cwd) {
23
- try {
24
- await execFile('git', args, {
25
- cwd,
26
- env: process.env,
27
- encoding: 'utf8',
28
- maxBuffer: 1024 * 1024 * 16,
29
- });
30
- return 0;
31
- }
32
- catch (error) {
33
- const maybeExit = error;
34
- return typeof maybeExit.code === 'number' ? maybeExit.code : 1;
35
- }
36
- }
37
- export class WorkspaceValidationError extends Error {
38
- failureSource = 'wake-workspace-validation';
39
- constructor(message) {
40
- super(message);
41
- this.name = 'WorkspaceValidationError';
42
- }
43
- }
44
- async function detectDefaultBranch(repoPath) {
45
- await git(['remote', 'set-head', 'origin', '--auto'], repoPath);
46
- const { stdout } = await git(['symbolic-ref', '--short', 'refs/remotes/origin/HEAD'], repoPath);
47
- const defaultBranch = stdout.replace(/^origin\//, '');
48
- if (defaultBranch.length === 0) {
49
- throw new Error(`Unable to detect default branch for ${repoPath}`);
50
- }
51
- return defaultBranch;
52
- }
53
- async function pathExists(path) {
54
- try {
55
- await access(path);
56
- return true;
57
- }
58
- catch {
59
- return false;
60
- }
61
- }
62
- export function defaultRemoteUrlForRepo(repo) {
63
- return `https://github.com/${repo}.git`;
64
- }
65
- export function buildWorkspaceCloneArgs(input) {
66
- return [
67
- 'clone',
68
- '--no-local',
69
- '--branch',
70
- input.defaultBranch,
71
- input.sourceRepoPath,
72
- input.workspacePath,
73
- ];
74
- }
75
- async function tryUpdateFromDefaultBranch(workspacePath) {
76
- try {
77
- const { stdout: status } = await git(['status', '--porcelain'], workspacePath);
78
- if (status.length > 0) {
79
- return { mergeConflictDetected: false, preExistingUncommittedChanges: true };
80
- }
81
- await git(['fetch', 'origin'], workspacePath);
82
- const defaultBranch = await detectDefaultBranch(workspacePath);
83
- const { stdout: count } = await git(['rev-list', '--count', `HEAD..origin/${defaultBranch}`], workspacePath);
84
- if (parseInt(count.trim(), 10) === 0) {
85
- return { mergeConflictDetected: false };
86
- }
87
- const { stdout: upstreamChanges } = await git([
88
- 'log',
89
- '--date=short',
90
- '--pretty=format:%h %ad %an <%ae>%n %s',
91
- `HEAD..origin/${defaultBranch}`,
92
- ], workspacePath);
93
- // Probe for conflicts without touching the index or worktree. A real merge
94
- // would need committer identity even with --no-commit on some Git versions.
95
- try {
96
- await git(['merge-tree', '--write-tree', 'HEAD', `origin/${defaultBranch}`], workspacePath);
97
- await git([
98
- '-c',
99
- 'user.email=wake@example.invalid',
100
- '-c',
101
- 'user.name=Wake',
102
- 'merge',
103
- '--no-edit',
104
- `origin/${defaultBranch}`,
105
- ], workspacePath);
106
- return {
107
- mergeConflictDetected: false,
108
- ...(upstreamChanges.length === 0 ? {} : { upstreamChanges }),
109
- };
110
- }
111
- catch {
112
- return { mergeConflictDetected: true };
113
- }
114
- }
115
- catch {
116
- // Fetch or branch detection failed — leave workspace as-is, no conflict reported
117
- return { mergeConflictDetected: false };
118
- }
119
- }
120
- async function validateWorkspace(input) {
121
- await git(['fetch', 'origin'], input.workspacePath);
122
- const { stdout: actualRemoteUrl } = await git(['remote', 'get-url', 'origin'], input.workspacePath);
123
- const { stdout: actualBranch } = await git(['rev-parse', '--abbrev-ref', 'HEAD'], input.workspacePath);
124
- const { stdout: baseRevision } = await git(['merge-base', 'HEAD', input.expectedBaseRef], input.workspacePath);
125
- const { stdout: headRevision } = await git(['rev-parse', 'HEAD'], input.workspacePath);
126
- const { stdout: status } = await git(['status', '--porcelain'], input.workspacePath);
127
- const remoteExit = await gitExitCode(['ls-remote', '--exit-code', 'origin', 'HEAD'], input.workspacePath);
128
- const validation = {
129
- repo: input.repo,
130
- expectedBranch: input.expectedBranch,
131
- actualBranch,
132
- expectedRemoteUrl: input.expectedRemoteUrl,
133
- actualRemoteUrl,
134
- baseRevision,
135
- headRevision,
136
- clean: status.length === 0,
137
- remoteAvailable: remoteExit === 0,
138
- };
139
- const failures = [];
140
- if (actualRemoteUrl !== input.expectedRemoteUrl) {
141
- failures.push(`expected origin ${input.expectedRemoteUrl}, found ${actualRemoteUrl}`);
142
- }
143
- if (actualBranch !== input.expectedBranch) {
144
- failures.push(`expected branch ${input.expectedBranch}, found ${actualBranch}`);
145
- }
146
- if (!validation.clean && input.allowUncommittedChanges !== true) {
147
- failures.push('working tree has uncommitted or untracked changes');
148
- }
149
- if (!validation.remoteAvailable) {
150
- failures.push('origin remote is not available');
151
- }
152
- if (failures.length > 0) {
153
- throw new WorkspaceValidationError(`Workspace validation failed: ${failures.join('; ')}`);
154
- }
155
- return validation;
156
- }
157
- async function recordWorkspaceBookkeeping(workspacePath) {
158
- const { stdout: branch } = await git(['rev-parse', '--abbrev-ref', 'HEAD'], workspacePath);
159
- const { stdout: headRevision } = await git(['rev-parse', 'HEAD'], workspacePath);
160
- const { stdout: diffSummary } = await git(['diff', '--stat', 'HEAD'], workspacePath);
161
- const { stdout: untracked } = await git(['ls-files', '--others', '--exclude-standard'], workspacePath);
162
- let hasUpstream = true;
163
- let count;
164
- let commits;
165
- try {
166
- const { stdout: upstream } = await git(['rev-parse', '--abbrev-ref', '--symbolic-full-name', '@{u}'], workspacePath);
167
- const { stdout: ahead } = await git(['rev-list', '--count', `${upstream}..HEAD`], workspacePath);
168
- count = parseInt(ahead, 10);
169
- const { stdout: commitLog } = await git(['log', '--pretty=format:%h %s', `${upstream}..HEAD`], workspacePath);
170
- commits = commitLog.length === 0 ? [] : commitLog.split('\n');
171
- }
172
- catch {
173
- hasUpstream = false;
174
- const { stdout: commitLog } = await git(['log', '--pretty=format:%h %s'], workspacePath);
175
- commits = commitLog.length === 0 ? [] : commitLog.split('\n');
176
- count = commits.length;
177
- }
178
- return {
179
- branch,
180
- headRevision,
181
- diffSummary,
182
- untrackedFiles: untracked.length === 0 ? [] : untracked.split('\n'),
183
- unpushedCommits: {
184
- hasUpstream,
185
- count,
186
- commits,
187
- },
188
- };
189
- }
190
- export function createGitWorkspaceManager(options) {
191
- const paths = createWakePaths(options.wakeRoot);
192
- const remoteUrlForRepo = options.remoteUrlForRepo ?? defaultRemoteUrlForRepo;
193
- async function ensureCanonicalClone(repo) {
194
- const repoPath = paths.repoRoot(repo);
195
- const remoteUrl = remoteUrlForRepo(repo);
196
- if (await pathExists(repoPath)) {
197
- // The canonical clone is only ever touched by one tick at a time, so an
198
- // index.lock found here can't be a live concurrent writer - it's a leftover
199
- // from a process that was killed mid-git-operation (e.g. a container
200
- // restart). Left in place it wedges every future tick on this repo with
201
- // "Unable to create index.lock: File exists", so clear it defensively
202
- // before running any git command against the clone.
203
- await rm(join(repoPath, '.git', 'index.lock'), { force: true });
204
- await git(['fetch', 'origin'], repoPath);
205
- const defaultBranch = await detectDefaultBranch(repoPath);
206
- await git(['checkout', defaultBranch], repoPath);
207
- await git(['reset', '--hard', `origin/${defaultBranch}`], repoPath);
208
- await git(['clean', '-fdx'], repoPath);
209
- return { repoPath, defaultBranch };
210
- }
211
- else {
212
- await mkdir(dirname(repoPath), { recursive: true });
213
- await git(['clone', remoteUrl, repoPath], dirname(repoPath));
214
- const defaultBranch = await detectDefaultBranch(repoPath);
215
- return { repoPath, defaultBranch };
216
- }
217
- }
218
- return {
219
- async prepareWorkspace({ workId, repo, issueNumber, }) {
220
- // The workspace is keyed by work item; `repo` still drives the clone and
221
- // `issueNumber` still names the branch, which stays human-readable and
222
- // provider-facing (spec D2).
223
- const workspacePath = paths.workspaceDir(workId);
224
- if (await pathExists(workspacePath)) {
225
- const updateResult = await tryUpdateFromDefaultBranch(workspacePath);
226
- const defaultBranch = await detectDefaultBranch(workspacePath);
227
- const validation = await validateWorkspace({
228
- workspacePath,
229
- repo,
230
- expectedBranch: branchNameForIssue(issueNumber),
231
- expectedRemoteUrl: remoteUrlForRepo(repo),
232
- expectedBaseRef: `origin/${defaultBranch}`,
233
- ...(updateResult.preExistingUncommittedChanges === true
234
- ? { allowUncommittedChanges: true }
235
- : {}),
236
- });
237
- return { workspacePath, ...updateResult, validation };
238
- }
239
- const { repoPath, defaultBranch } = await ensureCanonicalClone(repo);
240
- const remoteUrl = remoteUrlForRepo(repo);
241
- await mkdir(dirname(workspacePath), { recursive: true });
242
- await git(buildWorkspaceCloneArgs({
243
- sourceRepoPath: repoPath,
244
- workspacePath,
245
- defaultBranch,
246
- }), dirname(workspacePath));
247
- const branch = branchNameForIssue(issueNumber);
248
- await git(['remote', 'set-url', 'origin', remoteUrl], workspacePath);
249
- await git(['checkout', '-B', branch], workspacePath);
250
- const validation = await validateWorkspace({
251
- workspacePath,
252
- repo,
253
- expectedBranch: branch,
254
- expectedRemoteUrl: remoteUrl,
255
- expectedBaseRef: `origin/${defaultBranch}`,
256
- });
257
- return { workspacePath, mergeConflictDetected: false, validation };
258
- },
259
- async prepareReadOnlyClone({ repo, }) {
260
- // Refine only reads the issue and, at most, the canonical clone -
261
- // it never gets a per-issue branch/workspace of its own (only
262
- // 'implement' pays that cost).
263
- const { repoPath } = await ensureCanonicalClone(repo);
264
- const defaultBranch = await detectDefaultBranch(repoPath);
265
- const validation = await validateWorkspace({
266
- workspacePath: repoPath,
267
- repo,
268
- expectedBranch: defaultBranch,
269
- expectedRemoteUrl: remoteUrlForRepo(repo),
270
- expectedBaseRef: `origin/${defaultBranch}`,
271
- });
272
- return { workspacePath: repoPath, validation };
273
- },
274
- async recordWorkspaceBookkeeping({ workspacePath, }) {
275
- return recordWorkspaceBookkeeping(workspacePath);
276
- },
277
- async cleanupWorkspace({ workspacePath }) {
278
- // On Windows, a just-exited git subprocess (or AV/indexer) can hold a brief
279
- // handle on files it touched; a bare rm races that and fails EBUSY/EPERM.
280
- // maxRetries/retryDelay make fs.rm retry with backoff instead of throwing.
281
- await rm(workspacePath, {
282
- recursive: true,
283
- force: true,
284
- maxRetries: 5,
285
- retryDelay: 200,
286
- });
287
- },
288
- };
289
- }
@@ -1,38 +0,0 @@
1
- import { buildResourceUri } from '../../domain/resource-uri.js';
2
- const githubPrUrlPattern = /^https:\/\/github\.com\/([^/]+)\/([^/]+)\/pull\/(\d+)/;
3
- export function createGitHubArtifactVerifier(deps) {
4
- return {
5
- async verify(artifact, context) {
6
- if (artifact.kind !== 'pr') {
7
- return null;
8
- }
9
- const match = githubPrUrlPattern.exec(artifact.url);
10
- if (match === null) {
11
- return null;
12
- }
13
- const [, owner, repo, numberStr] = match;
14
- if (owner === undefined || repo === undefined || numberStr === undefined) {
15
- return null;
16
- }
17
- // GitHub owner/repo names are case-insensitive, so the URL's rendered
18
- // casing (owner/repo, as linked by the agent) can legitimately differ
19
- // from the configured context.repo string.
20
- if (`${owner}/${repo}`.toLowerCase() !== context.repo.toLowerCase()) {
21
- return null;
22
- }
23
- try {
24
- const pr = await deps.client.getPullRequest(owner, repo, Number(numberStr));
25
- if (pr.head.ref !== context.branch) {
26
- return null;
27
- }
28
- // Built from context.repo, not the URL's owner/repo casing, so this
29
- // resourceUri exact-matches the one discoverPullRequests/pollWatchedPr
30
- // build from the same configured repo string.
31
- return { resourceUri: buildResourceUri('github', 'pr', `${context.repo}#${numberStr}`) };
32
- }
33
- catch {
34
- return null;
35
- }
36
- },
37
- };
38
- }
@@ -1,16 +0,0 @@
1
- import { execFile as nodeExecFile } from 'node:child_process';
2
- import { promisify } from 'node:util';
3
- const execFile = promisify(nodeExecFile);
4
- export async function resolveGitHubToken(deps) {
5
- try {
6
- const result = await (deps?.execFile ?? execFile)('gh', ['auth', 'token']);
7
- const token = String(result.stdout).trim();
8
- if (token.length === 0) {
9
- throw new Error('empty token');
10
- }
11
- return token;
12
- }
13
- catch (error) {
14
- throw new Error(`Failed to resolve GitHub token via gh auth token: ${error instanceof Error ? error.message : String(error)}`, { cause: error });
15
- }
16
- }
@@ -1,249 +0,0 @@
1
- import { Octokit } from '@octokit/rest';
2
- import { createEtagCache, fetchPaginatedWithEtag, fetchSingleWithEtag, } from './github-etag-cache.js';
3
- // Octokit's built-in request-log plugin routes every non-2xx response
4
- // through `log.error` (console.error by default) before the error reaches
5
- // our code, including the 304s that ETag-based conditional requests are
6
- // *expected* to produce (see github-etag-cache.ts). Without this override,
7
- // normal cache-hit traffic prints as spurious stderr errors. The plugin only
8
- // hands `log.error` a pre-formatted string (`METHOD path - STATUS with id
9
- // ID in Nms`), not the response object, so we extract the actual status
10
- // code from that fixed format rather than substring-matching "304"
11
- // anywhere in the message.
12
- function requestLogStatus(message) {
13
- const match = / - (\d{3}) with id /.exec(message);
14
- return match === null ? undefined : Number(match[1]);
15
- }
16
- export function createGitHubClient(token) {
17
- const octokit = new Octokit({
18
- auth: token,
19
- log: {
20
- debug: () => { },
21
- info: () => { },
22
- warn: console.warn.bind(console),
23
- error: (message) => {
24
- if (requestLogStatus(message) !== 304) {
25
- console.error(message);
26
- }
27
- },
28
- },
29
- });
30
- const etagCache = createEtagCache();
31
- return {
32
- async getAuthenticatedLogin() {
33
- const { data } = await octokit.rest.users.getAuthenticated();
34
- return data.login;
35
- },
36
- // `maxResults` is a hard cap on issues returned, not just a page size:
37
- // octokit.paginate otherwise walks every page regardless of page size,
38
- // which burns GitHub's rate limit (a "fourth budget") on repos with many
39
- // issues. Stop paginating as soon as the cap is reached.
40
- async listIssues(owner, repo, maxResults, since) {
41
- const perPage = Math.min(maxResults, 100);
42
- return fetchPaginatedWithEtag({
43
- cache: etagCache,
44
- cacheKey: `issues:${owner}/${repo}`,
45
- maxResults,
46
- pages: (headers) => octokit.paginate.iterator(octokit.rest.issues.listForRepo, {
47
- owner,
48
- repo,
49
- state: 'all',
50
- per_page: perPage,
51
- ...(since === undefined ? {} : { since }),
52
- ...(headers === undefined ? {} : { headers }),
53
- }),
54
- });
55
- },
56
- async listComments(owner, repo, issueNumber, perPage) {
57
- return fetchPaginatedWithEtag({
58
- cache: etagCache,
59
- cacheKey: `issue-comments:${owner}/${repo}#${issueNumber}`,
60
- pages: (headers) => octokit.paginate.iterator(octokit.rest.issues.listComments, {
61
- owner,
62
- repo,
63
- issue_number: issueNumber,
64
- per_page: perPage,
65
- ...(headers === undefined ? {} : { headers }),
66
- }),
67
- });
68
- },
69
- async getIssue(owner, repo, issueNumber) {
70
- const { data } = await octokit.rest.issues.get({
71
- owner,
72
- repo,
73
- issue_number: issueNumber,
74
- });
75
- return data;
76
- },
77
- async createComment(owner, repo, issueNumber, body) {
78
- return octokit.rest.issues.createComment({
79
- owner,
80
- repo,
81
- issue_number: issueNumber,
82
- body,
83
- });
84
- },
85
- async setLabels(owner, repo, issueNumber, labels) {
86
- return octokit.rest.issues.setLabels({
87
- owner,
88
- repo,
89
- issue_number: issueNumber,
90
- labels,
91
- });
92
- },
93
- async getPullRequest(owner, repo, pullNumber) {
94
- const { data } = await octokit.rest.pulls.get({
95
- owner,
96
- repo,
97
- pull_number: pullNumber,
98
- });
99
- return data;
100
- },
101
- async getRequiredStatusChecks(owner, repo, branch) {
102
- const data = await fetchSingleWithEtag({
103
- cache: etagCache,
104
- cacheKey: `required-status-checks:${owner}/${repo}@${branch}`,
105
- request: async (headers) => {
106
- const response = await octokit.rest.repos.getBranch({
107
- owner,
108
- repo,
109
- branch,
110
- ...(headers === undefined ? {} : { headers }),
111
- });
112
- return { data: response.data, headers: response.headers ?? {} };
113
- },
114
- });
115
- const requiredStatusChecks = data.protection?.required_status_checks;
116
- return {
117
- contexts: requiredStatusChecks?.contexts ?? [],
118
- checks: (requiredStatusChecks?.checks ?? [])
119
- .map((check) => check.context)
120
- .filter((context) => typeof context === 'string'),
121
- };
122
- },
123
- async listCheckRunsForRef(owner, repo, ref) {
124
- const data = await fetchSingleWithEtag({
125
- cache: etagCache,
126
- cacheKey: `check-runs:${owner}/${repo}@${ref}`,
127
- request: async (headers) => {
128
- const response = await octokit.rest.checks.listForRef({
129
- owner,
130
- repo,
131
- ref,
132
- per_page: 100,
133
- ...(headers === undefined ? {} : { headers }),
134
- });
135
- return { data: response.data, headers: response.headers ?? {} };
136
- },
137
- });
138
- return data.check_runs;
139
- },
140
- async getCombinedStatusForRef(owner, repo, ref) {
141
- const data = await fetchSingleWithEtag({
142
- cache: etagCache,
143
- cacheKey: `combined-status:${owner}/${repo}@${ref}`,
144
- request: async (headers) => {
145
- const response = await octokit.rest.repos.getCombinedStatusForRef({
146
- owner,
147
- repo,
148
- ref,
149
- ...(headers === undefined ? {} : { headers }),
150
- });
151
- return { data: response.data, headers: response.headers ?? {} };
152
- },
153
- });
154
- return data.statuses;
155
- },
156
- async listPullRequests(owner, repo, maxResults) {
157
- const perPage = Math.min(maxResults, 100);
158
- return fetchPaginatedWithEtag({
159
- cache: etagCache,
160
- cacheKey: `pulls:${owner}/${repo}`,
161
- maxResults,
162
- pages: (headers) => octokit.paginate.iterator(octokit.rest.pulls.list, {
163
- owner,
164
- repo,
165
- state: 'open',
166
- per_page: perPage,
167
- ...(headers === undefined ? {} : { headers }),
168
- }),
169
- });
170
- },
171
- async listReviews(owner, repo, pullNumber, perPage) {
172
- return fetchPaginatedWithEtag({
173
- cache: etagCache,
174
- cacheKey: `pr-reviews:${owner}/${repo}#${pullNumber}`,
175
- pages: (headers) => octokit.paginate.iterator(octokit.rest.pulls.listReviews, {
176
- owner,
177
- repo,
178
- pull_number: pullNumber,
179
- per_page: perPage,
180
- ...(headers === undefined ? {} : { headers }),
181
- }),
182
- });
183
- },
184
- async listReviewComments(owner, repo, pullNumber, perPage) {
185
- return fetchPaginatedWithEtag({
186
- cache: etagCache,
187
- cacheKey: `pr-review-comments:${owner}/${repo}#${pullNumber}`,
188
- pages: (headers) => octokit.paginate.iterator(octokit.rest.pulls.listReviewComments, {
189
- owner,
190
- repo,
191
- pull_number: pullNumber,
192
- per_page: perPage,
193
- ...(headers === undefined ? {} : { headers }),
194
- }),
195
- });
196
- },
197
- async listPullRequestFiles(owner, repo, pullNumber) {
198
- return fetchPaginatedWithEtag({
199
- cache: etagCache,
200
- cacheKey: `pr-files:${owner}/${repo}#${pullNumber}`,
201
- pages: (headers) => octokit.paginate.iterator(octokit.rest.pulls.listFiles, {
202
- owner,
203
- repo,
204
- pull_number: pullNumber,
205
- per_page: 100,
206
- ...(headers === undefined ? {} : { headers }),
207
- }),
208
- });
209
- },
210
- async createPullRequestApproval(owner, repo, pullNumber, body) {
211
- await octokit.rest.pulls.createReview({
212
- owner,
213
- repo,
214
- pull_number: pullNumber,
215
- event: 'APPROVE',
216
- body,
217
- });
218
- },
219
- // GitHub's REST merge method takes a lowercase merge_method value,
220
- // distinct from the GraphQL PullRequestMergeMethod enum used by
221
- // enablePullRequestAutoMerge below.
222
- async mergePullRequest(owner, repo, pullNumber, mergeMethod) {
223
- await octokit.rest.pulls.merge({
224
- owner,
225
- repo,
226
- pull_number: pullNumber,
227
- merge_method: mergeMethod.toLowerCase(),
228
- });
229
- },
230
- async enablePullRequestAutoMerge(pullRequestNodeId, mergeMethod) {
231
- await octokit.graphql(`mutation EnableWakeAutoMerge($pullRequestId: ID!, $mergeMethod: PullRequestMergeMethod!) {
232
- enablePullRequestAutoMerge(input: { pullRequestId: $pullRequestId, mergeMethod: $mergeMethod }) {
233
- pullRequest {
234
- id
235
- }
236
- }
237
- }`, { pullRequestId: pullRequestNodeId, mergeMethod });
238
- },
239
- async replyToReviewComment(owner, repo, pullNumber, commentId, body) {
240
- return octokit.rest.pulls.createReplyForReviewComment({
241
- owner,
242
- repo,
243
- pull_number: pullNumber,
244
- comment_id: commentId,
245
- body,
246
- });
247
- },
248
- };
249
- }
@@ -1,57 +0,0 @@
1
- export function createEtagCache() {
2
- return new Map();
3
- }
4
- function isNotModifiedError(error) {
5
- return (typeof error === 'object' &&
6
- error !== null &&
7
- 'status' in error &&
8
- error.status === 304);
9
- }
10
- export async function fetchSingleWithEtag(input) {
11
- const cached = input.cache.get(input.cacheKey);
12
- try {
13
- const response = await input.request(cached === undefined ? undefined : { 'if-none-match': cached.etag });
14
- if (typeof response.headers.etag === 'string') {
15
- input.cache.set(input.cacheKey, { etag: response.headers.etag, data: response.data });
16
- }
17
- return response.data;
18
- }
19
- catch (error) {
20
- if (isNotModifiedError(error) && cached !== undefined) {
21
- return cached.data;
22
- }
23
- throw error;
24
- }
25
- }
26
- export async function fetchPaginatedWithEtag(input) {
27
- const cached = input.cache.get(input.cacheKey);
28
- const results = [];
29
- let pageCount = 0;
30
- let lastHeaders = {};
31
- try {
32
- for await (const page of input.pages(cached === undefined ? undefined : { 'if-none-match': cached.etag })) {
33
- pageCount += 1;
34
- lastHeaders = page.headers;
35
- results.push(...page.data);
36
- if (input.maxResults !== undefined && results.length >= input.maxResults) {
37
- break;
38
- }
39
- }
40
- }
41
- catch (error) {
42
- if (isNotModifiedError(error) && cached !== undefined) {
43
- return input.maxResults === undefined ? cached.data : cached.data.slice(0, input.maxResults);
44
- }
45
- throw error;
46
- }
47
- const truncated = input.maxResults !== undefined && results.length > input.maxResults
48
- ? results.slice(0, input.maxResults)
49
- : results;
50
- if (pageCount <= 1 && typeof lastHeaders.etag === 'string') {
51
- input.cache.set(input.cacheKey, { etag: lastHeaders.etag, data: truncated });
52
- }
53
- else {
54
- input.cache.delete(input.cacheKey);
55
- }
56
- return truncated;
57
- }