@astrosheep/keiyaku 2.9.13 → 4.0.1

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 (730) hide show
  1. package/README.md +5 -132
  2. package/build/integrations/marketplace/.agents/plugins/marketplace.json +12 -0
  3. package/build/integrations/marketplace/.claude-plugin/marketplace.json +5 -0
  4. package/build/integrations/marketplace/plugins/keiyaku/.claude-plugin/plugin.json +7 -0
  5. package/build/integrations/marketplace/plugins/keiyaku/.codex-plugin/plugin.json +18 -0
  6. package/build/integrations/marketplace/plugins/keiyaku/opencode.js +16 -0
  7. package/build/integrations/marketplace/plugins/keiyaku/package.json +8 -0
  8. package/build/integrations/marketplace/plugins/keiyaku/skills/keiyaku/SKILL.md +42 -0
  9. package/build/integrations/marketplace/plugins/keiyaku/skills/keiyaku-akuma/SKILL.md +53 -0
  10. package/build/integrations/marketplace/plugins/keiyaku/skills/keiyaku-bind/SKILL.md +94 -0
  11. package/build/integrations/marketplace/plugins/keiyaku/skills/keiyaku-bind/agents/openai.yaml +4 -0
  12. package/build/integrations/marketplace/plugins/keiyaku/skills/keiyaku-task/SKILL.md +97 -0
  13. package/build/integrations/marketplace/plugins/keiyaku/skills/keiyaku-workflow/SKILL.md +189 -0
  14. package/build/src/akuma/akuma.d.ts +124 -0
  15. package/build/src/akuma/akuma.js +414 -0
  16. package/build/src/akuma/archetype.d.ts +39 -0
  17. package/build/src/akuma/archetype.js +207 -0
  18. package/build/src/akuma/body.d.ts +20 -0
  19. package/build/src/akuma/body.js +417 -0
  20. package/build/src/akuma/coordinate.d.ts +9 -0
  21. package/build/src/akuma/coordinate.js +22 -0
  22. package/build/src/akuma/heart/facts.d.ts +202 -0
  23. package/build/src/akuma/heart/facts.js +9 -0
  24. package/build/src/akuma/heart/index.d.ts +90 -0
  25. package/build/src/akuma/heart/index.js +240 -0
  26. package/build/src/akuma/heart/rows.d.ts +166 -0
  27. package/build/src/akuma/heart/rows.js +299 -0
  28. package/build/src/akuma/heart/schema.d.ts +5 -0
  29. package/build/src/akuma/heart/schema.js +160 -0
  30. package/build/src/akuma/heart/storage.d.ts +33 -0
  31. package/build/src/akuma/heart/storage.js +164 -0
  32. package/build/src/akuma/heart/tells.d.ts +12 -0
  33. package/build/src/akuma/heart/tells.js +79 -0
  34. package/build/src/akuma/heart/timeline.d.ts +15 -0
  35. package/build/src/akuma/heart/timeline.js +86 -0
  36. package/build/src/akuma/identity.d.ts +46 -0
  37. package/build/src/akuma/identity.js +89 -0
  38. package/build/src/akuma/index.d.ts +9 -0
  39. package/build/src/akuma/index.js +3 -0
  40. package/build/src/akuma/projection.d.ts +97 -0
  41. package/build/src/akuma/projection.js +145 -0
  42. package/build/src/akuma/provider.d.ts +169 -0
  43. package/build/src/akuma/provider.js +255 -0
  44. package/build/src/akuma/providers/claude/events.d.ts +52 -0
  45. package/build/src/akuma/providers/claude/events.js +185 -0
  46. package/build/src/akuma/providers/claude/index.d.ts +46 -0
  47. package/build/src/akuma/providers/claude/index.js +265 -0
  48. package/build/src/akuma/providers/claude/input.d.ts +13 -0
  49. package/build/src/akuma/providers/claude/input.js +109 -0
  50. package/build/src/akuma/providers/codex-app-server/events.d.ts +110 -0
  51. package/build/src/akuma/providers/codex-app-server/events.js +337 -0
  52. package/build/src/akuma/providers/codex-app-server/index.d.ts +29 -0
  53. package/build/src/akuma/providers/codex-app-server/index.js +213 -0
  54. package/build/src/akuma/providers/index.d.ts +4 -0
  55. package/build/src/akuma/providers/index.js +85 -0
  56. package/build/src/akuma/providers/opencode-sdk/events.d.ts +48 -0
  57. package/build/src/akuma/providers/opencode-sdk/events.js +116 -0
  58. package/build/src/akuma/providers/opencode-sdk/index.d.ts +32 -0
  59. package/build/src/akuma/providers/opencode-sdk/index.js +203 -0
  60. package/build/src/akuma/providers/opencode-sdk/session.d.ts +41 -0
  61. package/build/src/akuma/providers/opencode-sdk/session.js +62 -0
  62. package/build/src/akuma/providers/pi/events.d.ts +33 -0
  63. package/build/src/akuma/providers/pi/events.js +128 -0
  64. package/build/src/akuma/providers/pi/index.d.ts +11 -0
  65. package/build/src/akuma/providers/pi/index.js +162 -0
  66. package/build/src/akuma/publication.d.ts +10 -0
  67. package/build/src/akuma/publication.js +107 -0
  68. package/build/src/akuma/requests.d.ts +47 -0
  69. package/build/src/akuma/requests.js +391 -0
  70. package/build/src/alias/index.d.ts +18 -0
  71. package/build/src/alias/index.js +103 -0
  72. package/build/src/body/amend.d.ts +2 -0
  73. package/build/src/body/amend.js +289 -0
  74. package/build/src/body/arc.d.ts +2 -0
  75. package/build/src/body/arc.js +54 -0
  76. package/build/src/body/decode.d.ts +4 -0
  77. package/build/src/body/decode.js +146 -0
  78. package/build/src/body/keys.d.ts +4 -0
  79. package/build/src/body/keys.js +11 -0
  80. package/build/src/body/region.d.ts +6 -0
  81. package/build/src/body/region.js +139 -0
  82. package/build/src/body/render.d.ts +4 -0
  83. package/build/src/body/render.js +74 -0
  84. package/build/src/body/shape.d.ts +29 -0
  85. package/build/src/body/shape.js +22 -0
  86. package/build/src/body/types.d.ts +28 -0
  87. package/build/src/body/verification.d.ts +7 -0
  88. package/build/src/body/verification.js +40 -0
  89. package/build/src/cli/accepted.d.ts +18 -0
  90. package/build/src/cli/accepted.js +66 -0
  91. package/build/src/cli/actor.d.ts +8 -0
  92. package/build/src/cli/actor.js +11 -0
  93. package/build/src/cli/commands/akuma-invoke.d.ts +77 -0
  94. package/build/src/cli/commands/akuma-invoke.js +112 -0
  95. package/build/src/cli/commands/akuma.d.ts +50 -0
  96. package/build/src/cli/commands/akuma.js +262 -0
  97. package/build/src/cli/commands/amend.d.ts +13 -0
  98. package/build/src/cli/commands/amend.js +13 -0
  99. package/build/src/cli/commands/bind.d.ts +12 -0
  100. package/build/src/cli/commands/bind.js +17 -0
  101. package/build/src/cli/commands/contract.d.ts +142 -0
  102. package/build/src/cli/commands/contract.js +14 -0
  103. package/build/src/cli/commands/install.d.ts +25 -0
  104. package/build/src/cli/commands/install.js +105 -0
  105. package/build/src/cli/commands/task-invoke.d.ts +11 -0
  106. package/build/src/cli/commands/task-invoke.js +117 -0
  107. package/build/src/cli/commands/task.d.ts +16 -0
  108. package/build/src/cli/commands/task.js +144 -0
  109. package/build/src/cli/index.d.ts +2 -0
  110. package/build/src/cli/index.js +3 -0
  111. package/build/src/cli/invoke.d.ts +22 -0
  112. package/build/src/cli/invoke.js +463 -0
  113. package/build/src/cli/main.d.ts +1 -0
  114. package/build/src/cli/main.js +98 -0
  115. package/build/src/cli/parse.d.ts +107 -0
  116. package/build/src/cli/parse.js +348 -0
  117. package/build/src/cli/render/akuma-tool.d.ts +13 -0
  118. package/build/src/cli/render/akuma-tool.js +72 -0
  119. package/build/src/cli/render/akuma.d.ts +7 -0
  120. package/build/src/cli/render/akuma.js +194 -0
  121. package/build/src/cli/render/board.d.ts +2 -0
  122. package/build/src/cli/render/board.js +4 -0
  123. package/build/src/cli/render/catalog.d.ts +2 -0
  124. package/build/src/cli/render/catalog.js +16 -0
  125. package/build/src/cli/render/contract.d.ts +4 -0
  126. package/build/src/cli/render/contract.js +102 -0
  127. package/build/src/cli/render/kanshi.d.ts +3 -0
  128. package/build/src/cli/render/kanshi.js +252 -0
  129. package/build/src/cli/render/refusal.d.ts +2 -0
  130. package/build/src/cli/render/refusal.js +21 -0
  131. package/build/src/cli/render/settings.d.ts +3 -0
  132. package/build/src/cli/render/settings.js +30 -0
  133. package/build/src/cli/render/task.d.ts +6 -0
  134. package/build/src/cli/render/task.js +105 -0
  135. package/build/src/cli/render/terminal.d.ts +23 -0
  136. package/build/src/cli/render/terminal.js +151 -0
  137. package/build/src/cli/render/text.d.ts +3 -0
  138. package/build/src/cli/render/text.js +20 -0
  139. package/build/src/cli/result.d.ts +67 -0
  140. package/build/src/cli/selectors.d.ts +9 -0
  141. package/build/src/cli/selectors.js +66 -0
  142. package/build/src/cli/usage.d.ts +6 -0
  143. package/build/src/cli/usage.js +19 -0
  144. package/build/src/contract-worktree.d.ts +43 -0
  145. package/build/src/contract-worktree.js +213 -0
  146. package/build/src/coordination/durable-file.d.ts +4 -0
  147. package/build/src/coordination/durable-file.js +79 -0
  148. package/build/src/coordination/sqlite-transaction-lock.d.ts +14 -0
  149. package/build/src/coordination/sqlite-transaction-lock.js +119 -0
  150. package/build/src/core/decide.d.ts +45 -0
  151. package/build/src/core/facts/codec.d.ts +3 -0
  152. package/build/src/core/facts/codec.js +277 -0
  153. package/build/src/core/facts/eligibility.d.ts +7 -0
  154. package/build/src/core/facts/eligibility.js +26 -0
  155. package/build/src/core/facts/errors.d.ts +3 -0
  156. package/build/src/core/facts/errors.js +6 -0
  157. package/build/src/core/facts/fold.d.ts +2 -0
  158. package/build/src/core/facts/fold.js +97 -0
  159. package/build/src/core/facts/gate.d.ts +24 -0
  160. package/build/src/core/facts/gate.js +52 -0
  161. package/build/src/core/facts/observation.d.ts +15 -0
  162. package/build/src/core/facts/observation.js +35 -0
  163. package/build/src/core/facts/offer.d.ts +21 -0
  164. package/build/src/core/facts/types.d.ts +137 -0
  165. package/build/src/core/facts/types.js +66 -0
  166. package/build/src/core/subject.d.ts +21 -0
  167. package/build/src/core/subject.js +89 -0
  168. package/build/src/core/verbs/abandon.d.ts +13 -0
  169. package/build/src/core/verbs/abandon.js +17 -0
  170. package/build/src/core/verbs/amend.d.ts +14 -0
  171. package/build/src/core/verbs/amend.js +52 -0
  172. package/build/src/core/verbs/arc.d.ts +13 -0
  173. package/build/src/core/verbs/arc.js +25 -0
  174. package/build/src/core/verbs/attestation.d.ts +13 -0
  175. package/build/src/core/verbs/attestation.js +21 -0
  176. package/build/src/core/verbs/bind.d.ts +13 -0
  177. package/build/src/core/verbs/bind.js +26 -0
  178. package/build/src/core/verbs/deliver.d.ts +13 -0
  179. package/build/src/core/verbs/deliver.js +42 -0
  180. package/build/src/core/verbs/placement.d.ts +13 -0
  181. package/build/src/core/verbs/placement.js +37 -0
  182. package/build/src/dispatch/index.d.ts +33 -0
  183. package/build/src/dispatch/index.js +168 -0
  184. package/build/src/duration.d.ts +10 -0
  185. package/build/src/duration.js +22 -0
  186. package/build/src/git/admission.d.ts +18 -0
  187. package/build/src/git/admission.js +126 -0
  188. package/build/src/git/hooks.d.ts +49 -0
  189. package/build/src/git/hooks.js +310 -0
  190. package/build/src/git/identity.d.ts +17 -0
  191. package/build/src/git/identity.js +47 -0
  192. package/build/src/git/integration.d.ts +49 -0
  193. package/build/src/git/integration.js +214 -0
  194. package/build/src/git/observe.d.ts +50 -0
  195. package/build/src/git/observe.js +330 -0
  196. package/build/src/git/read-observation.d.ts +41 -0
  197. package/build/src/git/read-observation.js +361 -0
  198. package/build/src/git/reconcile.d.ts +59 -0
  199. package/build/src/git/reconcile.js +376 -0
  200. package/build/src/git/repository.d.ts +95 -0
  201. package/build/src/git/repository.js +490 -0
  202. package/build/src/git/scratch.d.ts +13 -0
  203. package/build/src/git/scratch.js +66 -0
  204. package/build/src/git/target-placement.d.ts +56 -0
  205. package/build/src/git/target-placement.js +255 -0
  206. package/build/src/git/tender.d.ts +48 -0
  207. package/build/src/git/tender.js +82 -0
  208. package/build/src/git/terminal-seal.d.ts +24 -0
  209. package/build/src/git/terminal-seal.js +87 -0
  210. package/build/src/git/tree.d.ts +34 -0
  211. package/build/src/git/tree.js +116 -0
  212. package/build/src/git/workspace.d.ts +21 -0
  213. package/build/src/git/workspace.js +104 -0
  214. package/build/src/identity/coordinates.d.ts +9 -0
  215. package/build/src/identity/coordinates.js +20 -0
  216. package/build/src/identity/normalize.d.ts +8 -0
  217. package/build/src/identity/normalize.js +45 -0
  218. package/build/src/identity/selector.d.ts +12 -0
  219. package/build/src/identity/selector.js +26 -0
  220. package/build/src/index.d.ts +6 -0
  221. package/build/src/index.js +3 -0
  222. package/build/src/kanshi/index.d.ts +5 -0
  223. package/build/src/kanshi/index.js +2 -0
  224. package/build/src/kanshi/read.d.ts +8 -0
  225. package/build/src/kanshi/read.js +209 -0
  226. package/build/src/kanshi/report.d.ts +60 -0
  227. package/build/src/kanshi/select.d.ts +8 -0
  228. package/build/src/kanshi/select.js +21 -0
  229. package/build/src/library/address.d.ts +48 -0
  230. package/build/src/library/address.js +134 -0
  231. package/build/src/library/akuma-creation.d.ts +83 -0
  232. package/build/src/library/akuma-creation.js +152 -0
  233. package/build/src/library/bind.d.ts +21 -0
  234. package/build/src/library/bind.js +56 -0
  235. package/build/src/library/catalog.d.ts +58 -0
  236. package/build/src/library/catalog.js +72 -0
  237. package/build/src/library/configuration.d.ts +17 -0
  238. package/build/src/library/configuration.js +97 -0
  239. package/build/src/library/contract.d.ts +120 -0
  240. package/build/src/library/contract.js +335 -0
  241. package/build/src/library/delivery.d.ts +23 -0
  242. package/build/src/library/delivery.js +21 -0
  243. package/build/src/library/fleet.d.ts +65 -0
  244. package/build/src/library/fleet.js +189 -0
  245. package/build/src/library/input.d.ts +16 -0
  246. package/build/src/library/input.js +101 -0
  247. package/build/src/library/keiyaku.d.ts +42 -0
  248. package/build/src/library/keiyaku.js +26 -0
  249. package/build/src/library/mutation.d.ts +38 -0
  250. package/build/src/library/mutation.js +39 -0
  251. package/build/src/library/refusal.d.ts +21 -0
  252. package/build/src/library/refusal.js +29 -0
  253. package/build/src/library/region.d.ts +18 -0
  254. package/build/src/library/region.js +30 -0
  255. package/build/src/library/repo.d.ts +36 -0
  256. package/build/src/library/repo.js +76 -0
  257. package/build/src/markdown/diff.d.ts +1 -0
  258. package/build/src/markdown/diff.js +4 -0
  259. package/build/src/markdown/lex.d.ts +3 -0
  260. package/build/src/markdown/lex.js +221 -0
  261. package/build/src/markdown/parse.d.ts +2 -0
  262. package/build/src/markdown/parse.js +221 -0
  263. package/build/src/markdown/query.d.ts +21 -0
  264. package/build/src/markdown/query.js +51 -0
  265. package/build/src/markdown/types.d.ts +118 -0
  266. package/build/src/markdown/types.js +6 -0
  267. package/build/src/protocol/attempt.d.ts +49 -0
  268. package/build/src/protocol/attempt.js +150 -0
  269. package/build/src/protocol/bind.d.ts +32 -0
  270. package/build/src/protocol/bind.js +70 -0
  271. package/build/src/protocol/intent.d.ts +76 -0
  272. package/build/src/protocol/intent.js +90 -0
  273. package/build/src/protocol/operations.d.ts +198 -0
  274. package/build/src/protocol/operations.js +485 -0
  275. package/build/src/protocol/outcome.d.ts +23 -0
  276. package/build/src/protocol/outcome.js +21 -0
  277. package/build/src/protocol/placement.d.ts +30 -0
  278. package/build/src/protocol/placement.js +114 -0
  279. package/build/src/protocol/read/audit.d.ts +31 -0
  280. package/build/src/protocol/read/audit.js +55 -0
  281. package/build/src/protocol/read/documents.d.ts +8 -0
  282. package/build/src/protocol/read/documents.js +16 -0
  283. package/build/src/protocol/read/status.d.ts +44 -0
  284. package/build/src/protocol/read/status.js +60 -0
  285. package/build/src/protocol/run.d.ts +81 -0
  286. package/build/src/protocol/run.js +64 -0
  287. package/build/src/runtime/proc/line-rpc.d.ts +38 -0
  288. package/build/src/runtime/proc/line-rpc.js +145 -0
  289. package/build/src/runtime/proc/run.d.ts +70 -0
  290. package/build/src/runtime/proc/run.js +226 -0
  291. package/build/src/settings.d.ts +51 -0
  292. package/build/src/settings.js +114 -0
  293. package/build/src/settlement/fence.d.ts +9 -0
  294. package/build/src/settlement/fence.js +23 -0
  295. package/build/src/settlement/holder.d.ts +36 -0
  296. package/build/src/settlement/holder.js +187 -0
  297. package/build/src/settlement/settle.d.ts +44 -0
  298. package/build/src/settlement/settle.js +165 -0
  299. package/build/src/task/board.d.ts +83 -0
  300. package/build/src/task/board.js +165 -0
  301. package/build/src/task/compose.d.ts +25 -0
  302. package/build/src/task/compose.js +232 -0
  303. package/build/src/task/context.d.ts +4 -0
  304. package/build/src/task/context.js +51 -0
  305. package/build/src/task/document.d.ts +24 -0
  306. package/build/src/task/document.js +118 -0
  307. package/build/src/task/identity.d.ts +12 -0
  308. package/build/src/task/identity.js +47 -0
  309. package/build/src/task/index.d.ts +90 -0
  310. package/build/src/task/index.js +182 -0
  311. package/build/src/task/operations.d.ts +134 -0
  312. package/build/src/task/operations.js +198 -0
  313. package/build/src/task/store.d.ts +20 -0
  314. package/build/src/task/store.js +114 -0
  315. package/build/src/verification/declaration.d.ts +23 -0
  316. package/build/src/verification/declaration.js +14 -0
  317. package/build/src/verification/execution.d.ts +49 -0
  318. package/build/src/verification/execution.js +104 -0
  319. package/build/src/world.d.ts +13 -0
  320. package/build/src/world.js +103 -0
  321. package/package.json +65 -44
  322. package/build/.tsbuildinfo +0 -1
  323. package/build/agents/call-terms.js +0 -32
  324. package/build/agents/harness/activity-values.js +0 -70
  325. package/build/agents/harness/control-types.js +0 -18
  326. package/build/agents/harness/event-channel.js +0 -213
  327. package/build/agents/harness/event-persistence.js +0 -220
  328. package/build/agents/harness/events.js +0 -48
  329. package/build/agents/harness/execution-handle.js +0 -172
  330. package/build/agents/harness/index.js +0 -11
  331. package/build/agents/harness/outcome-error.js +0 -81
  332. package/build/agents/harness/outcome.js +0 -220
  333. package/build/agents/harness/projection.js +0 -369
  334. package/build/agents/harness/provider-adapter.js +0 -58
  335. package/build/agents/harness/router.js +0 -30
  336. package/build/agents/harness/runtime.js +0 -85
  337. package/build/agents/harness/session.js +0 -15
  338. package/build/agents/launch-snapshot/model.js +0 -127
  339. package/build/agents/launch-snapshot/parse-helpers.js +0 -114
  340. package/build/agents/launch-snapshot/resolve.js +0 -46
  341. package/build/agents/opencode-sdk.js +0 -159
  342. package/build/agents/providers/claude-agent-sdk/adapter.js +0 -396
  343. package/build/agents/providers/claude-agent-sdk/events.js +0 -218
  344. package/build/agents/providers/claude-agent-sdk/registration.js +0 -225
  345. package/build/agents/providers/claude-agent-sdk/session-schema.js +0 -2
  346. package/build/agents/providers/claude-agent-sdk/session.js +0 -172
  347. package/build/agents/providers/codex-app-server/adapter.js +0 -387
  348. package/build/agents/providers/codex-app-server/events.js +0 -492
  349. package/build/agents/providers/codex-app-server/identity.js +0 -1
  350. package/build/agents/providers/codex-app-server/policy.js +0 -29
  351. package/build/agents/providers/codex-app-server/registration.js +0 -259
  352. package/build/agents/providers/codex-app-server/session-schema.js +0 -6
  353. package/build/agents/providers/codex-app-server/session.js +0 -273
  354. package/build/agents/providers/event-type-tail.js +0 -16
  355. package/build/agents/providers/opencode-sdk/adapter.js +0 -402
  356. package/build/agents/providers/opencode-sdk/events.js +0 -380
  357. package/build/agents/providers/opencode-sdk/registration.js +0 -146
  358. package/build/agents/providers/opencode-sdk/session-schema.js +0 -2
  359. package/build/agents/providers/opencode-sdk/session.js +0 -187
  360. package/build/agents/providers/pi/adapter.js +0 -285
  361. package/build/agents/providers/pi/checkpoint.js +0 -49
  362. package/build/agents/providers/pi/events.js +0 -285
  363. package/build/agents/providers/pi/registration.js +0 -160
  364. package/build/agents/providers/pi/session-schema.js +0 -6
  365. package/build/agents/providers/registration.js +0 -7
  366. package/build/agents/providers/registry.js +0 -76
  367. package/build/agents/selector.js +0 -120
  368. package/build/agents/session.js +0 -29
  369. package/build/agents/string-tail-buffer.js +0 -44
  370. package/build/agents/types.js +0 -30
  371. package/build/artifact-directories.js +0 -22
  372. package/build/cli/commands/akuma/akuma/handler.js +0 -5
  373. package/build/cli/commands/akuma/akuma/meta.js +0 -17
  374. package/build/cli/commands/akuma/catalog.js +0 -10
  375. package/build/cli/commands/akuma/list/handler.js +0 -15
  376. package/build/cli/commands/akuma/list/meta-list.js +0 -12
  377. package/build/cli/commands/akuma/list/meta-ls.js +0 -9
  378. package/build/cli/commands/akuma/show/handler.js +0 -27
  379. package/build/cli/commands/akuma/show/meta.js +0 -8
  380. package/build/cli/commands/akuma.js +0 -186
  381. package/build/cli/commands/contract/amend/handler.js +0 -17
  382. package/build/cli/commands/contract/amend/meta.js +0 -13
  383. package/build/cli/commands/contract/arc/handler.js +0 -16
  384. package/build/cli/commands/contract/arc/meta.js +0 -28
  385. package/build/cli/commands/contract/audit/handler.js +0 -42
  386. package/build/cli/commands/contract/audit/meta.js +0 -17
  387. package/build/cli/commands/contract/bind/handler.js +0 -39
  388. package/build/cli/commands/contract/bind/meta.js +0 -96
  389. package/build/cli/commands/contract/catalog.js +0 -18
  390. package/build/cli/commands/contract/forfeit/handler.js +0 -17
  391. package/build/cli/commands/contract/forfeit/meta.js +0 -12
  392. package/build/cli/commands/contract/log/handler.js +0 -12
  393. package/build/cli/commands/contract/log/meta.js +0 -12
  394. package/build/cli/commands/contract/petition/handler.js +0 -64
  395. package/build/cli/commands/contract/petition/meta.js +0 -23
  396. package/build/cli/commands/contract/renew/handler.js +0 -65
  397. package/build/cli/commands/contract/renew/meta.js +0 -19
  398. package/build/cli/commands/metadata.js +0 -68
  399. package/build/cli/commands/projection/call/handler.js +0 -43
  400. package/build/cli/commands/projection/call/meta.js +0 -12
  401. package/build/cli/commands/projection/catalog.js +0 -16
  402. package/build/cli/commands/projection/fork/handler.js +0 -61
  403. package/build/cli/commands/projection/fork/meta.js +0 -12
  404. package/build/cli/commands/projection/history/handler.js +0 -65
  405. package/build/cli/commands/projection/history/meta.js +0 -9
  406. package/build/cli/commands/projection/kill/handler.js +0 -20
  407. package/build/cli/commands/projection/kill/meta.js +0 -11
  408. package/build/cli/commands/projection/shared.js +0 -27
  409. package/build/cli/commands/projection/status/handler.js +0 -42
  410. package/build/cli/commands/projection/status/meta.js +0 -20
  411. package/build/cli/commands/projection/tell/handler.js +0 -32
  412. package/build/cli/commands/projection/tell/meta.js +0 -12
  413. package/build/cli/commands/projection/wait/handler.js +0 -80
  414. package/build/cli/commands/projection/wait/meta.js +0 -16
  415. package/build/cli/commands/registry.js +0 -48
  416. package/build/cli/commands/shared.js +0 -74
  417. package/build/cli/commands/skills/catalog.js +0 -6
  418. package/build/cli/commands/skills/install/handler.js +0 -7
  419. package/build/cli/commands/skills/install/meta.js +0 -9
  420. package/build/cli/commands/skills/skills/handler.js +0 -4
  421. package/build/cli/commands/skills/skills/meta.js +0 -10
  422. package/build/cli/commands/system/catalog.js +0 -10
  423. package/build/cli/commands/system/completion/handler.js +0 -10
  424. package/build/cli/commands/system/completion/meta.js +0 -9
  425. package/build/cli/commands/system/dump-env/handler.js +0 -3
  426. package/build/cli/commands/system/dump-env/meta.js +0 -10
  427. package/build/cli/commands/system/guide/handler.js +0 -4
  428. package/build/cli/commands/system/guide/meta.js +0 -9
  429. package/build/cli/commands/task/add/handler.js +0 -38
  430. package/build/cli/commands/task/add/meta.js +0 -31
  431. package/build/cli/commands/task/catalog.js +0 -32
  432. package/build/cli/commands/task/compose/handler.js +0 -18
  433. package/build/cli/commands/task/compose/meta.js +0 -10
  434. package/build/cli/commands/task/doctor/handler.js +0 -3
  435. package/build/cli/commands/task/doctor/meta.js +0 -8
  436. package/build/cli/commands/task/done/handler.js +0 -10
  437. package/build/cli/commands/task/done/meta.js +0 -8
  438. package/build/cli/commands/task/drop/handler.js +0 -8
  439. package/build/cli/commands/task/drop/meta.js +0 -11
  440. package/build/cli/commands/task/hold/handler.js +0 -3
  441. package/build/cli/commands/task/hold/meta.js +0 -8
  442. package/build/cli/commands/task/log/handler.js +0 -12
  443. package/build/cli/commands/task/log/meta.js +0 -8
  444. package/build/cli/commands/task/ls/handler.js +0 -17
  445. package/build/cli/commands/task/ls/meta.js +0 -8
  446. package/build/cli/commands/task/note/handler.js +0 -6
  447. package/build/cli/commands/task/note/meta.js +0 -11
  448. package/build/cli/commands/task/resume/handler.js +0 -3
  449. package/build/cli/commands/task/resume/meta.js +0 -8
  450. package/build/cli/commands/task/shared.js +0 -181
  451. package/build/cli/commands/task/show/handler.js +0 -13
  452. package/build/cli/commands/task/show/meta.js +0 -8
  453. package/build/cli/commands/task/start/handler.js +0 -3
  454. package/build/cli/commands/task/start/meta.js +0 -8
  455. package/build/cli/commands/task/stop/handler.js +0 -10
  456. package/build/cli/commands/task/stop/meta.js +0 -8
  457. package/build/cli/commands/task/task/handler.js +0 -5
  458. package/build/cli/commands/task/task/meta.js +0 -11
  459. package/build/cli/commands/task/update/handler.js +0 -21
  460. package/build/cli/commands/task/update/meta.js +0 -12
  461. package/build/cli/commands/verification/handler.js +0 -43
  462. package/build/cli/commands/verification/meta.js +0 -13
  463. package/build/cli/completion.js +0 -91
  464. package/build/cli/draft-artifact.js +0 -50
  465. package/build/cli/flags.js +0 -321
  466. package/build/cli/help.js +0 -99
  467. package/build/cli/index.js +0 -333
  468. package/build/cli/missing-subcommand.js +0 -7
  469. package/build/cli/output-stream-error-policy.js +0 -31
  470. package/build/cli/parse-flags.js +0 -301
  471. package/build/cli/parse-metadata.js +0 -132
  472. package/build/cli/parse-selectors.js +0 -83
  473. package/build/cli/parse.js +0 -250
  474. package/build/cli/projection-address.js +0 -105
  475. package/build/cli/render/address.js +0 -101
  476. package/build/cli/render/amendment-warning.js +0 -8
  477. package/build/cli/render/arc.js +0 -88
  478. package/build/cli/render/audit.js +0 -440
  479. package/build/cli/render/call.js +0 -70
  480. package/build/cli/render/compact-text.js +0 -3
  481. package/build/cli/render/errors.js +0 -101
  482. package/build/cli/render/format.js +0 -226
  483. package/build/cli/render/kanshi.js +0 -300
  484. package/build/cli/render/kill.js +0 -9
  485. package/build/cli/render/lifecycle.js +0 -56
  486. package/build/cli/render/line-width.js +0 -103
  487. package/build/cli/render/misc.js +0 -84
  488. package/build/cli/render/path-prefix-compaction.js +0 -131
  489. package/build/cli/render/petition.js +0 -85
  490. package/build/cli/render/projection-activity.js +0 -332
  491. package/build/cli/render/projection-history.js +0 -77
  492. package/build/cli/render/response-style.js +0 -27
  493. package/build/cli/render/shared.js +0 -232
  494. package/build/cli/render/skills.js +0 -10
  495. package/build/cli/render/status-indicator.js +0 -47
  496. package/build/cli/render/status.js +0 -243
  497. package/build/cli/render/success-response.js +0 -95
  498. package/build/cli/render/task.js +0 -175
  499. package/build/cli/render/tell.js +0 -11
  500. package/build/cli/render/terminal-failure.js +0 -65
  501. package/build/cli/render/tool-command-normalization.js +0 -137
  502. package/build/cli/render/tool-ledger-rollup.js +0 -74
  503. package/build/cli/render/tool-presentation.js +0 -98
  504. package/build/cli/render/types.js +0 -2
  505. package/build/cli/render/verification.js +0 -23
  506. package/build/cli/render/wait.js +0 -343
  507. package/build/cli/skills-install.js +0 -348
  508. package/build/cli/subagent-guard.js +0 -25
  509. package/build/cli/types.js +0 -2
  510. package/build/config/akuma-loader.js +0 -240
  511. package/build/config/env-keys.js +0 -57
  512. package/build/config/env.js +0 -304
  513. package/build/config/provider-policy-ownership.js +0 -10
  514. package/build/config/settings/disease.js +0 -33
  515. package/build/config/settings/knobs.js +0 -14
  516. package/build/config/settings/loader.js +0 -275
  517. package/build/config/settings/provider-instance-fields.js +0 -51
  518. package/build/config/settings/schema.js +0 -113
  519. package/build/core/address-carrier.js +0 -89
  520. package/build/core/addressing.js +0 -407
  521. package/build/core/amend.js +0 -321
  522. package/build/core/amendment-criteria.js +0 -17
  523. package/build/core/amendment-warning.js +0 -10
  524. package/build/core/arc.js +0 -293
  525. package/build/core/atomic-publish.js +0 -64
  526. package/build/core/audit/candidate.js +0 -141
  527. package/build/core/audit/coordinates.js +0 -230
  528. package/build/core/audit/evidence.js +0 -156
  529. package/build/core/audit/facade.js +0 -65
  530. package/build/core/audit/readiness.js +0 -4
  531. package/build/core/audit/report.js +0 -38
  532. package/build/core/audit.js +0 -1
  533. package/build/core/bind-reconciliation.js +0 -409
  534. package/build/core/bind-workspace.js +0 -115
  535. package/build/core/bind.js +0 -503
  536. package/build/core/call/call.js +0 -235
  537. package/build/core/call/context.js +0 -210
  538. package/build/core/call/execution.js +0 -255
  539. package/build/core/call/prompt.js +0 -27
  540. package/build/core/call/reference.js +0 -24
  541. package/build/core/call-persist.js +0 -76
  542. package/build/core/command-markdown.js +0 -45
  543. package/build/core/context.js +0 -104
  544. package/build/core/contract-carrier-runtime.js +0 -512
  545. package/build/core/contract-carrier.js +0 -353
  546. package/build/core/contract-view.js +0 -319
  547. package/build/core/contract.js +0 -19
  548. package/build/core/derived-replay.js +0 -340
  549. package/build/core/draft.js +0 -400
  550. package/build/core/execution-coordinate.js +0 -46
  551. package/build/core/execution-pact.js +0 -126
  552. package/build/core/forfeit.js +0 -132
  553. package/build/core/hints.js +0 -34
  554. package/build/core/identifier-slug.js +0 -116
  555. package/build/core/ids.js +0 -90
  556. package/build/core/lifecycle-history.js +0 -48
  557. package/build/core/lifecycle-recovery.js +0 -122
  558. package/build/core/lifecycle-runner.js +0 -377
  559. package/build/core/log.js +0 -50
  560. package/build/core/markdown/lex.js +0 -274
  561. package/build/core/markdown/parser.js +0 -260
  562. package/build/core/markdown/render.js +0 -68
  563. package/build/core/markdown/sections.js +0 -80
  564. package/build/core/markdown/titles.js +0 -9
  565. package/build/core/markdown/types.js +0 -6
  566. package/build/core/outcome-base.js +0 -185
  567. package/build/core/places.js +0 -175
  568. package/build/core/projection/akuma-name.js +0 -43
  569. package/build/core/projection/generation/database.js +0 -473
  570. package/build/core/projection/generation/identity.js +0 -84
  571. package/build/core/projection/generation/ledger.js +0 -91
  572. package/build/core/projection/generation/model.js +0 -261
  573. package/build/core/projection/generation/projection-generation-continuation.js +0 -84
  574. package/build/core/projection/generation/projection-generation-doorbell.js +0 -88
  575. package/build/core/projection/generation/projection-generation-execution.js +0 -241
  576. package/build/core/projection/generation/projection-generation-identity.js +0 -21
  577. package/build/core/projection/generation/projection-generation-launcher.js +0 -154
  578. package/build/core/projection/generation/projection-generation-process.js +0 -47
  579. package/build/core/projection/generation/projection-generation-runner.js +0 -489
  580. package/build/core/projection/generation/projection-generation-runtime.js +0 -46
  581. package/build/core/projection/generation/protocol.js +0 -68
  582. package/build/core/projection/generation/store.js +0 -108
  583. package/build/core/projection/generation/transitions.js +0 -463
  584. package/build/core/projection/heart.js +0 -9
  585. package/build/core/projection/index.js +0 -28
  586. package/build/core/projection/projection-activity.js +0 -273
  587. package/build/core/projection/projection-alias.js +0 -131
  588. package/build/core/projection/projection-coordinate.js +0 -61
  589. package/build/core/projection/projection-core.js +0 -127
  590. package/build/core/projection/projection-execution-observer.js +0 -270
  591. package/build/core/projection/projection-history.js +0 -474
  592. package/build/core/projection/projection-identity.js +0 -11
  593. package/build/core/projection/projection-kill.js +0 -112
  594. package/build/core/projection/projection-life-observer.js +0 -101
  595. package/build/core/projection/projection-mint.js +0 -170
  596. package/build/core/projection/projection-status-observation.js +0 -434
  597. package/build/core/projection/projection-status.js +0 -442
  598. package/build/core/projection/projection-terminal-failure.js +0 -111
  599. package/build/core/projection/projection-wait.js +0 -337
  600. package/build/core/projection/projection-wake.js +0 -298
  601. package/build/core/projection/tell/launch-store.js +0 -244
  602. package/build/core/projection/tell/model.js +0 -98
  603. package/build/core/projection/tell/store.js +0 -245
  604. package/build/core/provider-loader-ports.js +0 -4
  605. package/build/core/registry.js +0 -100
  606. package/build/core/renew-build.js +0 -554
  607. package/build/core/renew-plan.js +0 -264
  608. package/build/core/renew-rewrite.js +0 -118
  609. package/build/core/renew.js +0 -345
  610. package/build/core/repository-ledger/accepted-fold-read.js +0 -22
  611. package/build/core/repository-ledger/accepted-tail.js +0 -116
  612. package/build/core/repository-ledger/admission.js +0 -38
  613. package/build/core/repository-ledger/authoritative-transaction.js +0 -1
  614. package/build/core/repository-ledger/claim-evidence.js +0 -147
  615. package/build/core/repository-ledger/codec.js +0 -303
  616. package/build/core/repository-ledger/current-state-store.js +0 -968
  617. package/build/core/repository-ledger/fold-repository.js +0 -374
  618. package/build/core/repository-ledger/fold.js +0 -248
  619. package/build/core/repository-ledger/git-object-store.js +0 -243
  620. package/build/core/repository-ledger/history-read.js +0 -15
  621. package/build/core/repository-ledger/identity.js +0 -60
  622. package/build/core/repository-ledger/incremental-read.js +0 -153
  623. package/build/core/repository-ledger/index.js +0 -15
  624. package/build/core/repository-ledger/inventory-plan.js +0 -75
  625. package/build/core/repository-ledger/inventory.js +0 -310
  626. package/build/core/repository-ledger/publication-admission.js +0 -125
  627. package/build/core/repository-ledger/publication.js +0 -353
  628. package/build/core/repository-ledger/read-model.js +0 -517
  629. package/build/core/repository-ledger/transaction-membership.js +0 -78
  630. package/build/core/repository-ledger/traversal.js +0 -404
  631. package/build/core/repository-ledger/write-transaction.js +0 -346
  632. package/build/core/response-artifact-catalog-sqlite.js +0 -112
  633. package/build/core/response-artifact-catalog.js +0 -7
  634. package/build/core/response-artifact-id.js +0 -5
  635. package/build/core/run-control/connection-bound-close.js +0 -41
  636. package/build/core/run-control/detached-lease-bootstrap.js +0 -208
  637. package/build/core/run-control/detached-process.js +0 -14
  638. package/build/core/run-control/index.js +0 -6
  639. package/build/core/run-control/process-tree.js +0 -139
  640. package/build/core/run-control/runner-lease.js +0 -172
  641. package/build/core/run-control/sqlite-process-lifetime-lock.js +0 -174
  642. package/build/core/scope.js +0 -416
  643. package/build/core/seal.js +0 -364
  644. package/build/core/settlement/claim-delivery.js +0 -82
  645. package/build/core/settlement/claim.js +0 -258
  646. package/build/core/settlement/index.js +0 -19
  647. package/build/core/settlement/petition-claim-gates.js +0 -247
  648. package/build/core/settlement/petition-forfeit.js +0 -46
  649. package/build/core/settlement/petition-head-guard.js +0 -12
  650. package/build/core/settlement/petition-io.js +0 -1
  651. package/build/core/settlement/petition-preview.js +0 -125
  652. package/build/core/settlement/petition-window.js +0 -50
  653. package/build/core/settlement/petition.js +0 -315
  654. package/build/core/settlement/queue-read-model.js +0 -120
  655. package/build/core/settlement/queue-seat-allocation.js +0 -65
  656. package/build/core/settlement/queue.js +0 -6
  657. package/build/core/settlement/settlement.js +0 -385
  658. package/build/core/settlement/verdict.js +0 -126
  659. package/build/core/settlement/verification.js +0 -554
  660. package/build/core/status/board.js +0 -455
  661. package/build/core/status/drift.js +0 -113
  662. package/build/core/status/lifecycle.js +0 -11
  663. package/build/core/stored-agent-event.js +0 -129
  664. package/build/core/structured-query.js +0 -23
  665. package/build/core/target-ref.js +0 -10
  666. package/build/core/task/board.js +0 -248
  667. package/build/core/task/commands.js +0 -401
  668. package/build/core/task/compose.js +0 -328
  669. package/build/core/task/coordinate.js +0 -56
  670. package/build/core/task/document.js +0 -273
  671. package/build/core/task/index.js +0 -16
  672. package/build/core/task/model.js +0 -8
  673. package/build/core/task/query.js +0 -204
  674. package/build/core/task/settlement-git.js +0 -423
  675. package/build/core/task/settlement-policy.js +0 -137
  676. package/build/core/task/source-board.js +0 -104
  677. package/build/core/task/source-model.js +0 -1
  678. package/build/core/task/task-bind-preparation.js +0 -243
  679. package/build/core/task/task-contract.js +0 -371
  680. package/build/core/task/task-doctor.js +0 -14
  681. package/build/core/task/task-file-transaction.js +0 -171
  682. package/build/core/task/task-git-actor.js +0 -33
  683. package/build/core/task/task-git-runtime.js +0 -97
  684. package/build/core/task/task-git-store.js +0 -400
  685. package/build/core/task/task-repository.js +0 -1
  686. package/build/core/task/task-store-repository.js +0 -97
  687. package/build/core/task/task-store.js +0 -1
  688. package/build/core/task/task-worktree.js +0 -25
  689. package/build/core/task/task.js +0 -7
  690. package/build/core/task/tree.js +0 -37
  691. package/build/core/task/validation.js +0 -48
  692. package/build/core/transcripts.js +0 -485
  693. package/build/core/validation.js +0 -17
  694. package/build/core/verification-declaration.js +0 -95
  695. package/build/core/worktree-bootstrap.js +0 -195
  696. package/build/core/worktree-path.js +0 -371
  697. package/build/errno.js +0 -3
  698. package/build/flow-error.js +0 -191
  699. package/build/fs/durability.js +0 -27
  700. package/build/fs/path-coordinate.js +0 -16
  701. package/build/generated/version.js +0 -3
  702. package/build/git/branches.js +0 -84
  703. package/build/git/commits.js +0 -151
  704. package/build/git/core.js +0 -86
  705. package/build/git/diff/parsers.js +0 -181
  706. package/build/git/diff/pathspec.js +0 -3
  707. package/build/git/diff/preview.js +0 -38
  708. package/build/git/diff/read.js +0 -105
  709. package/build/git/diff/structured.js +0 -127
  710. package/build/git/diff/types.js +0 -1
  711. package/build/git/path-coordinate.js +0 -17
  712. package/build/git/process.js +0 -229
  713. package/build/git/refs.js +0 -250
  714. package/build/git/staging.js +0 -79
  715. package/build/git/streaming-batch.js +0 -354
  716. package/build/git/worktree.js +0 -175
  717. package/build/index.js +0 -67
  718. package/build/keiyaku-constants.js +0 -2
  719. package/build/keiyaku.js +0 -30
  720. package/build/telemetry/debug-log.js +0 -40
  721. package/build/telemetry/logger.js +0 -48
  722. package/skills/keiyaku/SKILL.md +0 -46
  723. package/skills/keiyaku-akuma/SKILL.md +0 -97
  724. package/skills/keiyaku-task/SKILL.md +0 -118
  725. package/skills/keiyaku-workflow/SKILL.md +0 -191
  726. /package/build/{agents/launch-snapshot → src/body}/types.js +0 -0
  727. /package/build/{agents/providers/claude-agent-sdk/terms.js → src/cli/result.js} +0 -0
  728. /package/build/{agents/providers/codex-app-server/terms.js → src/core/decide.js} +0 -0
  729. /package/build/{agents/providers/opencode-sdk/terms.js → src/core/facts/offer.js} +0 -0
  730. /package/build/{agents/providers/pi/terms.js → src/kanshi/report.js} +0 -0
@@ -0,0 +1,310 @@
1
+ import { mkdirSync, readFileSync } from "node:fs";
2
+ import { dirname, join } from "node:path";
3
+ import { fileURLToPath } from "node:url";
4
+ import { replaceFileDurably } from "../coordination/durable-file.js";
5
+ import { acquireSqliteTransactionLock } from "../coordination/sqlite-transaction-lock.js";
6
+ import { runProcess, runProcessToExit } from "../runtime/proc/run.js";
7
+ import { SettingsError } from "../settings.js";
8
+ const MARKER_VERSION = 1;
9
+ function object(value) {
10
+ return value !== null && typeof value === "object" && !Array.isArray(value);
11
+ }
12
+ export function worktreeHooksFrom(input) {
13
+ if (!object(input))
14
+ throw new TypeError("worktreeHooksFrom input must be an object");
15
+ const view = input.settings.namespace("worktree");
16
+ if (view.kind === "failed") {
17
+ throw new SettingsError(view.failures.map((failure) => `${failure.scope}: ${failure.diagnostic}`).join("; "));
18
+ }
19
+ for (const entry of view.entries) {
20
+ if (entry.name !== "create" && entry.name !== "destroy")
21
+ throw new SettingsError(`worktree has unknown entry: ${entry.name}`);
22
+ }
23
+ const commands = (phase) => {
24
+ const selected = view.entries.find((entry) => entry.name === phase);
25
+ if (selected === undefined)
26
+ return Object.freeze([]);
27
+ if (!Array.isArray(selected.value))
28
+ throw new SettingsError(`worktree.${phase} must be an array`);
29
+ return Object.freeze(selected.value.map((item, index) => {
30
+ if (!object(item))
31
+ throw new SettingsError(`worktree.${phase}[${index}] must be an object`);
32
+ const coordinate = `worktree.${phase}[${index}]`;
33
+ exactKeys(item, ["argv", "timeoutMs"], coordinate);
34
+ if (!Array.isArray(item.argv) || item.argv.length === 0 || !item.argv.every((value) => typeof value === "string")) {
35
+ throw new SettingsError(`${coordinate}.argv must be a nonempty string array`);
36
+ }
37
+ if (item.argv[0].trim().length === 0)
38
+ throw new SettingsError(`${coordinate}.argv[0] must be nonblank`);
39
+ if (!Number.isSafeInteger(item.timeoutMs) || item.timeoutMs < 1 || item.timeoutMs > 2_147_483_647) {
40
+ throw new SettingsError(`${coordinate}.timeoutMs must be an integer from 1 through 2147483647`);
41
+ }
42
+ return Object.freeze({ argv: Object.freeze([...item.argv]), timeoutMs: item.timeoutMs });
43
+ }));
44
+ };
45
+ return Object.freeze({ create: commands("create"), destroy: commands("destroy") });
46
+ }
47
+ function exactKeys(value, keys, coordinate) {
48
+ const actual = Object.keys(value).sort();
49
+ const expected = [...keys].sort();
50
+ if (actual.length !== expected.length || actual.some((key, index) => key !== expected[index])) {
51
+ throw new Error(`${coordinate} has invalid fields`);
52
+ }
53
+ }
54
+ function decodeCommand(value, coordinate) {
55
+ if (!object(value))
56
+ throw new Error(`${coordinate} must be an object`);
57
+ exactKeys(value, ["argv", "timeoutMs"], coordinate);
58
+ if (!Array.isArray(value.argv) || value.argv.length === 0 || !value.argv.every((item) => typeof item === "string")) {
59
+ throw new Error(`${coordinate}.argv must be a nonempty string array`);
60
+ }
61
+ if (value.argv[0].trim().length === 0)
62
+ throw new Error(`${coordinate}.argv[0] must be nonblank`);
63
+ if (!Number.isSafeInteger(value.timeoutMs) || value.timeoutMs < 1 || value.timeoutMs > 2_147_483_647) {
64
+ throw new Error(`${coordinate}.timeoutMs is invalid`);
65
+ }
66
+ return { argv: value.argv, timeoutMs: value.timeoutMs };
67
+ }
68
+ function decodeCommands(value, coordinate) {
69
+ if (!Array.isArray(value))
70
+ throw new Error(`${coordinate} must be an array`);
71
+ return value.map((item, index) => decodeCommand(item, `${coordinate}[${index}]`));
72
+ }
73
+ function decodeFailure(value, coordinate) {
74
+ if (!object(value) || typeof value.kind !== "string")
75
+ throw new Error(`${coordinate} is invalid`);
76
+ switch (value.kind) {
77
+ case "exit":
78
+ exactKeys(value, ["kind", "code", "stdout", "stderr", "truncated"], coordinate);
79
+ if (!Number.isInteger(value.code) || typeof value.stdout !== "string" || typeof value.stderr !== "string" || typeof value.truncated !== "boolean") {
80
+ throw new Error(`${coordinate} is invalid`);
81
+ }
82
+ return { kind: "exit", code: value.code, stdout: value.stdout, stderr: value.stderr, truncated: value.truncated };
83
+ case "timeout":
84
+ case "unknown-exit":
85
+ exactKeys(value, ["kind"], coordinate);
86
+ return { kind: value.kind };
87
+ case "spawn-error":
88
+ exactKeys(value, ["kind", "diagnostic"], coordinate);
89
+ if (typeof value.diagnostic !== "string")
90
+ throw new Error(`${coordinate}.diagnostic must be a string`);
91
+ return { kind: "spawn-error", diagnostic: value.diagnostic };
92
+ default:
93
+ throw new Error(`${coordinate}.kind is invalid`);
94
+ }
95
+ }
96
+ function decodeProgress(value, commands, coordinate) {
97
+ if (!object(value) || typeof value.status !== "string")
98
+ throw new Error(`${coordinate} is invalid`);
99
+ if (value.status === "ok") {
100
+ exactKeys(value, ["status"], coordinate);
101
+ return { status: "ok" };
102
+ }
103
+ if (value.status === "pending") {
104
+ exactKeys(value, ["status", "next"], coordinate);
105
+ if (!Number.isInteger(value.next) || value.next < 0 || value.next > commands) {
106
+ throw new Error(`${coordinate}.next is invalid`);
107
+ }
108
+ return { status: "pending", next: value.next };
109
+ }
110
+ if (value.status === "failed") {
111
+ exactKeys(value, ["status", "command", "failure"], coordinate);
112
+ if (!Number.isInteger(value.command) || value.command < 0 || value.command >= commands) {
113
+ throw new Error(`${coordinate}.command is invalid`);
114
+ }
115
+ return { status: "failed", command: value.command, failure: decodeFailure(value.failure, `${coordinate}.failure`) };
116
+ }
117
+ throw new Error(`${coordinate}.status is invalid`);
118
+ }
119
+ function decodeMarker(bytes) {
120
+ const value = JSON.parse(bytes);
121
+ if (!object(value))
122
+ throw new Error("worktree hook marker must be an object");
123
+ exactKeys(value, ["version", "commands", "create", "destroy"], "worktree hook marker");
124
+ if (value.version !== MARKER_VERSION)
125
+ throw new Error(`worktree hook marker version must be ${MARKER_VERSION}`);
126
+ if (!object(value.commands))
127
+ throw new Error("worktree hook marker commands must be an object");
128
+ exactKeys(value.commands, ["create", "destroy"], "worktree hook marker commands");
129
+ const commands = {
130
+ create: decodeCommands(value.commands.create, "worktree hook marker commands.create"),
131
+ destroy: decodeCommands(value.commands.destroy, "worktree hook marker commands.destroy"),
132
+ };
133
+ return {
134
+ version: MARKER_VERSION,
135
+ commands,
136
+ create: decodeProgress(value.create, commands.create.length, "worktree hook marker create"),
137
+ destroy: decodeProgress(value.destroy, commands.destroy.length, "worktree hook marker destroy"),
138
+ };
139
+ }
140
+ export function hookMarkerPath(administrationDirectory) {
141
+ return join(administrationDirectory, "keiyaku", "hooks.json");
142
+ }
143
+ function readMarker(administrationDirectory) {
144
+ try {
145
+ return decodeMarker(readFileSync(hookMarkerPath(administrationDirectory), "utf8"));
146
+ }
147
+ catch (error) {
148
+ if (error.code === "ENOENT")
149
+ return null;
150
+ throw error;
151
+ }
152
+ }
153
+ function writeMarker(administrationDirectory, marker) {
154
+ const path = hookMarkerPath(administrationDirectory);
155
+ mkdirSync(dirname(path), { recursive: true });
156
+ replaceFileDurably(path, `${JSON.stringify(marker)}\n`);
157
+ }
158
+ function freshMarker(commands, createPending) {
159
+ return {
160
+ version: MARKER_VERSION,
161
+ commands,
162
+ create: createPending ? { status: "pending", next: 0 } : { status: "ok" },
163
+ destroy: { status: "pending", next: 0 },
164
+ };
165
+ }
166
+ function failedOutcome(outcome) {
167
+ if (outcome.kind === "terminal") {
168
+ return outcome.code === 0 ? null : {
169
+ kind: "exit",
170
+ code: outcome.code,
171
+ stdout: outcome.stdout,
172
+ stderr: outcome.stderr,
173
+ truncated: outcome.truncated,
174
+ };
175
+ }
176
+ return outcome;
177
+ }
178
+ /** Execute an ordered command list without lifecycle state. Scratch owns this policy. */
179
+ export async function runHookCommands(worktree, commands, signal) {
180
+ for (const [command, value] of commands.entries()) {
181
+ const outcome = await runProcess({
182
+ argv: value.argv,
183
+ timeoutMs: value.timeoutMs,
184
+ cwd: worktree,
185
+ ...(signal === undefined ? {} : { signal }),
186
+ });
187
+ if (outcome.kind === "cancelled")
188
+ return outcome;
189
+ const failure = failedOutcome(outcome);
190
+ if (failure !== null)
191
+ return { kind: "failed", command, failure };
192
+ }
193
+ return { kind: "ok" };
194
+ }
195
+ function withProgress(marker, phase, progress) {
196
+ return { ...marker, [phase]: progress };
197
+ }
198
+ function hookExecutionLockPath(administrationDirectory) {
199
+ return join(administrationDirectory, "keiyaku", "hook-execution.sqlite");
200
+ }
201
+ function decodeRunnerInput(encoded) {
202
+ const value = JSON.parse(Buffer.from(encoded, "base64url").toString("utf8"));
203
+ if (!object(value))
204
+ throw new Error("Hook runner input must be an object");
205
+ exactKeys(value, ["administrationDirectory", "worktree", "phase", "command"], "Hook runner input");
206
+ if (typeof value.administrationDirectory !== "string" || value.administrationDirectory.length === 0) {
207
+ throw new Error("Hook runner administrationDirectory must be nonempty");
208
+ }
209
+ if (typeof value.worktree !== "string" || value.worktree.length === 0) {
210
+ throw new Error("Hook runner worktree must be nonempty");
211
+ }
212
+ if (value.phase !== "create" && value.phase !== "destroy")
213
+ throw new Error("Hook runner phase is invalid");
214
+ if (!Number.isSafeInteger(value.command) || value.command < 0) {
215
+ throw new Error("Hook runner command must be a nonnegative safe integer");
216
+ }
217
+ return {
218
+ administrationDirectory: value.administrationDirectory,
219
+ worktree: value.worktree,
220
+ phase: value.phase,
221
+ command: value.command,
222
+ };
223
+ }
224
+ async function executePendingCommand(input) {
225
+ const held = await acquireSqliteTransactionLock({
226
+ path: hookExecutionLockPath(input.administrationDirectory),
227
+ mode: "immediate",
228
+ });
229
+ try {
230
+ const marker = readMarker(input.administrationDirectory);
231
+ if (marker === null)
232
+ throw new Error("worktree hook marker disappeared before execution");
233
+ const progress = marker[input.phase];
234
+ if (progress.status !== "pending" || progress.next !== input.command)
235
+ return;
236
+ const command = marker.commands[input.phase][input.command];
237
+ if (command === undefined)
238
+ throw new Error("worktree hook marker pending index is out of range");
239
+ const result = await runHookCommands(input.worktree, [command]);
240
+ if (result.kind === "cancelled")
241
+ throw new Error("managed hook runner cancelled without a signal");
242
+ const failure = result.kind === "failed" ? result.failure : null;
243
+ const next = input.command + 1;
244
+ writeMarker(input.administrationDirectory, withProgress(marker, input.phase, failure === null
245
+ ? next === marker.commands[input.phase].length ? { status: "ok" } : { status: "pending", next }
246
+ : { status: "failed", command: input.command, failure }));
247
+ }
248
+ finally {
249
+ held.close();
250
+ }
251
+ }
252
+ function runnerFailure(outcome) {
253
+ if (outcome.kind === "terminal") {
254
+ const detail = outcome.stderr.trim() || outcome.stdout.trim();
255
+ return new Error(detail.length === 0 ? `Hook runner exited ${outcome.code}` : `Hook runner exited ${outcome.code}: ${detail}`);
256
+ }
257
+ if (outcome.kind === "spawn-error")
258
+ return new Error(`Hook runner failed to spawn: ${outcome.diagnostic}`);
259
+ return new Error(`Hook runner ended with ${outcome.kind}`);
260
+ }
261
+ async function runPendingCommand(input) {
262
+ const encoded = Buffer.from(JSON.stringify(input), "utf8").toString("base64url");
263
+ const outcome = await runProcessToExit({
264
+ argv: [process.execPath, ...process.execArgv, fileURLToPath(import.meta.url), "--run-hook", encoded],
265
+ cwd: dirname(fileURLToPath(import.meta.url)),
266
+ });
267
+ if (outcome.kind !== "terminal" || outcome.code !== 0)
268
+ throw runnerFailure(outcome);
269
+ }
270
+ async function runPhase(worktree, administrationDirectory, hooks, phase, retryHooks) {
271
+ let marker = readMarker(administrationDirectory);
272
+ if (marker === null) {
273
+ marker = freshMarker(hooks, phase === "create");
274
+ writeMarker(administrationDirectory, marker);
275
+ }
276
+ let retryFailure = retryHooks && marker[phase].status === "failed";
277
+ for (;;) {
278
+ marker = readMarker(administrationDirectory);
279
+ if (marker === null)
280
+ throw new Error("worktree hook marker disappeared during execution");
281
+ const progress = marker[phase];
282
+ if (progress.status === "ok")
283
+ return null;
284
+ if (progress.status === "failed") {
285
+ if (!retryFailure) {
286
+ return { kind: "worktree-hook-failed", phase, path: worktree, command: progress.command, failure: progress.failure };
287
+ }
288
+ retryFailure = false;
289
+ writeMarker(administrationDirectory, withProgress(marker, phase, { status: "pending", next: progress.command }));
290
+ continue;
291
+ }
292
+ if (progress.next === marker.commands[phase].length) {
293
+ writeMarker(administrationDirectory, withProgress(marker, phase, { status: "ok" }));
294
+ continue;
295
+ }
296
+ await runPendingCommand({ administrationDirectory, worktree, phase, command: progress.next });
297
+ }
298
+ }
299
+ export function runCreateHooks(worktree, administrationDirectory, hooks, retryHooks) {
300
+ return runPhase(worktree, administrationDirectory, hooks, "create", retryHooks);
301
+ }
302
+ export function runDestroyHooks(worktree, administrationDirectory, hooks, retryHooks) {
303
+ return runPhase(worktree, administrationDirectory, hooks, "destroy", retryHooks);
304
+ }
305
+ if (process.argv[1] !== undefined && fileURLToPath(import.meta.url) === process.argv[1] && process.argv[2] === "--run-hook") {
306
+ const encoded = process.argv[3];
307
+ if (encoded === undefined)
308
+ throw new Error("Hook runner input is missing");
309
+ await executePendingCommand(decodeRunnerInput(encoded));
310
+ }
@@ -0,0 +1,17 @@
1
+ import { type ChangeId, type ContractHead, type ContractId, type SnapshotId } from "../core/facts/types.js";
2
+ declare const gitObjectIdBrand: unique symbol;
3
+ export type GitObjectId = string & {
4
+ readonly [gitObjectIdBrand]: "GitObjectId";
5
+ };
6
+ export declare function contractLocator(contract: ContractId): string;
7
+ export declare function gitRefLocator(ref: string): string;
8
+ export declare function contractPhysicalName(contract: ContractId): string;
9
+ export type ContractJournalClass = "active" | "terminal";
10
+ export declare function contractJournalPath(contract: ContractId, journalClass?: ContractJournalClass): string;
11
+ export declare function contractJournalPaths(contract: ContractId): readonly string[];
12
+ export declare function gitObjectId(value: string, label?: string): GitObjectId;
13
+ export declare function mintSnapshotId(value: string): SnapshotId;
14
+ export declare function mintChangeId(value: string): ChangeId;
15
+ export declare function mintContractHead(value: string): ContractHead;
16
+ export declare function gitObjectIdForSnapshot(value: SnapshotId): GitObjectId;
17
+ export {};
@@ -0,0 +1,47 @@
1
+ import { createHash } from "node:crypto";
2
+ import { changeId, contractHead, contractId, snapshotId, } from "../core/facts/types.js";
3
+ const GIT_OBJECT_ID = /^(?:[0-9a-f]{40}|[0-9a-f]{64})$/;
4
+ function locator(value) {
5
+ return createHash("sha256").update(value, "utf8").digest("hex");
6
+ }
7
+ export function contractLocator(contract) {
8
+ return locator(contractId(contract));
9
+ }
10
+ export function gitRefLocator(ref) {
11
+ if (ref.length === 0)
12
+ throw new Error("Git ref locator input must be nonempty");
13
+ return locator(ref);
14
+ }
15
+ export function contractPhysicalName(contract) {
16
+ return contractId(contract).replace("/", "-");
17
+ }
18
+ function contractJournalSuffix(contract) {
19
+ const digest = contractLocator(contract);
20
+ return `${digest.slice(0, 2)}/${digest.slice(2, 4)}/${digest.slice(4)}.jsonl`;
21
+ }
22
+ export function contractJournalPath(contract, journalClass = "active") {
23
+ return `contracts/${journalClass}/${contractJournalSuffix(contract)}`;
24
+ }
25
+ export function contractJournalPaths(contract) {
26
+ return [
27
+ contractJournalPath(contract, "active"),
28
+ contractJournalPath(contract, "terminal"),
29
+ ];
30
+ }
31
+ export function gitObjectId(value, label = "Git object ID") {
32
+ if (!GIT_OBJECT_ID.test(value))
33
+ throw new Error(`${label} is not a Git object ID: ${value}`);
34
+ return value;
35
+ }
36
+ export function mintSnapshotId(value) {
37
+ return snapshotId(gitObjectId(value, "snapshot"));
38
+ }
39
+ export function mintChangeId(value) {
40
+ return changeId(gitObjectId(value, "change"));
41
+ }
42
+ export function mintContractHead(value) {
43
+ return contractHead(gitObjectId(value, "contract head"));
44
+ }
45
+ export function gitObjectIdForSnapshot(value) {
46
+ return gitObjectId(value, "snapshot");
47
+ }
@@ -0,0 +1,49 @@
1
+ import type { Preparation } from "../core/decide.js";
2
+ import type { ChangeId, ContractCoordinates, ContractId, SnapshotId } from "../core/facts/types.js";
3
+ import { type GitObjectId } from "./identity.js";
4
+ import { type GitRepository } from "./repository.js";
5
+ import type { TenderCapture } from "./tender.js";
6
+ import type { WorkspaceDirtyDelta } from "./tender.js";
7
+ declare const REQUIRED_GIT: "2.38";
8
+ export type IntegrationPreparationRefusal = Readonly<{
9
+ kind: "integration-failed";
10
+ contractId: ContractId;
11
+ reason: "not-based-on-target" | "unrelated-histories" | "conflict";
12
+ targetHead: SnapshotId;
13
+ conflictPaths?: readonly string[];
14
+ }> | Readonly<{
15
+ kind: "integration-unsupported";
16
+ contractId: ContractId;
17
+ requiredGit: typeof REQUIRED_GIT;
18
+ }>;
19
+ export type IntegrationCoordinates = Readonly<{
20
+ contractId: ContractId;
21
+ coordinates: ContractCoordinates;
22
+ }>;
23
+ export type IntegrationPlan = Readonly<{
24
+ predecessor: SnapshotId;
25
+ tree: GitObjectId;
26
+ changeId: ChangeId;
27
+ }>;
28
+ export type ReviewIntegration = Readonly<{
29
+ changeId: ChangeId;
30
+ workspace?: WorkspaceDirtyDelta;
31
+ }>;
32
+ /** Materialize the exact integration tree against its observed predecessor. */
33
+ export declare function materializeIntegrationSnapshot(repository: GitRepository, tree: GitObjectId, parent: SnapshotId, input: Readonly<{
34
+ contractId: ContractId;
35
+ title: string;
36
+ message?: string;
37
+ }>): SnapshotId;
38
+ export declare function planIntegration(repository: GitRepository, input: IntegrationCoordinates, tender: TenderCapture, requireBranchesToBeUpToDate: boolean): Preparation<IntegrationPlan, Readonly<{
39
+ kind: "target-missing";
40
+ contractId: ContractId;
41
+ }> | IntegrationPreparationRefusal>;
42
+ /** Prepare the integration-derived review subject from one captured tender. */
43
+ export declare function prepareReviewIntegration(repository: GitRepository, input: IntegrationCoordinates, tender: TenderCapture, workspace?: WorkspaceDirtyDelta): Preparation<ReviewIntegration, Readonly<{
44
+ kind: "target-missing";
45
+ contractId: ContractId;
46
+ }> | IntegrationPreparationRefusal>;
47
+ /** Read a recorded integration pair's patch, or null when Git no longer has it. */
48
+ export declare function readDeliveryDiff(repository: GitRepository, predecessor: SnapshotId, candidate: SnapshotId): string | null;
49
+ export {};
@@ -0,0 +1,214 @@
1
+ import { AuthorityCorruptionError } from "../core/facts/errors.js";
2
+ import { gitObjectId, gitObjectIdForSnapshot, mintChangeId, mintSnapshotId } from "./identity.js";
3
+ import { GitPlumbingError, readRef, runGit, runGitWithEnvironment, } from "./repository.js";
4
+ const REQUIRED_GIT = "2.38";
5
+ function runAllowingNonzero(repository, args, input) {
6
+ try {
7
+ return { stdout: runGit(repository, args, input), stderr: Buffer.alloc(0), status: 0 };
8
+ }
9
+ catch (error) {
10
+ if (!(error instanceof GitPlumbingError))
11
+ throw error;
12
+ return { stdout: error.stdout, stderr: error.stderr, status: error.status };
13
+ }
14
+ }
15
+ function stablePatchId(repository, predecessor, tree) {
16
+ const diff = runGit(repository, ["diff", "--binary", gitObjectIdForSnapshot(predecessor), tree]);
17
+ const output = runGit(repository, ["patch-id", "--stable"], diff).toString("utf8").trim();
18
+ const separator = output.indexOf(" ");
19
+ const identity = output.length === 0
20
+ ? runGit(repository, ["hash-object", "-t", "blob", "--stdin"], diff).toString("utf8").trim()
21
+ : separator < 0 ? output : output.slice(0, separator);
22
+ return mintChangeId(identity);
23
+ }
24
+ /** Materialize the exact integration tree against its observed predecessor. */
25
+ export function materializeIntegrationSnapshot(repository, tree, parent, input) {
26
+ const commit = runGitWithEnvironment(repository, ["commit-tree", tree, "-p", gitObjectIdForSnapshot(parent)], `${input.message ?? `${input.contractId}: ${input.title}`}\n\nKeiyaku-Contract: ${input.contractId}\n`, {
27
+ GIT_AUTHOR_NAME: "Keiyaku",
28
+ GIT_AUTHOR_EMAIL: "keiyaku@localhost",
29
+ GIT_COMMITTER_NAME: "Keiyaku",
30
+ GIT_COMMITTER_EMAIL: "keiyaku@localhost",
31
+ GIT_AUTHOR_DATE: "Thu, 01 Jan 1970 00:00:00 +0000",
32
+ GIT_COMMITTER_DATE: "Thu, 01 Jan 1970 00:00:00 +0000",
33
+ }).toString("utf8").trim();
34
+ return mintSnapshotId(commit);
35
+ }
36
+ function isAncestor(repository, ancestor, descendant) {
37
+ const result = runAllowingNonzero(repository, [
38
+ "merge-base",
39
+ "--is-ancestor",
40
+ gitObjectIdForSnapshot(ancestor),
41
+ gitObjectIdForSnapshot(descendant),
42
+ ]);
43
+ if (result.status === 0)
44
+ return true;
45
+ if (result.status === 1)
46
+ return false;
47
+ throw new GitPlumbingError({
48
+ stderr: result.stderr,
49
+ status: result.status,
50
+ message: "git merge-base --is-ancestor failed",
51
+ });
52
+ }
53
+ function commonAncestor(repository, left, right) {
54
+ const result = runAllowingNonzero(repository, [
55
+ "merge-base",
56
+ gitObjectIdForSnapshot(left),
57
+ gitObjectIdForSnapshot(right),
58
+ ]);
59
+ if (result.status === 1)
60
+ return null;
61
+ if (result.status !== 0) {
62
+ throw new GitPlumbingError({
63
+ stderr: result.stderr,
64
+ status: result.status,
65
+ message: "git merge-base failed",
66
+ });
67
+ }
68
+ return mintSnapshotId(result.stdout.toString("utf8").trim());
69
+ }
70
+ function supportsMergeTree(repository) {
71
+ return runAllowingNonzero(repository, ["merge-tree", "--write-tree", "--stdin"], "").status === 0;
72
+ }
73
+ function nulFields(output) {
74
+ const fields = output.toString("utf8").split("\0");
75
+ if (fields.at(-1) !== "")
76
+ throw new Error("Git merge-tree output is not NUL terminated");
77
+ return fields.slice(0, -1);
78
+ }
79
+ function mergedTree(repository, contractId, base, targetHead, tenderTree) {
80
+ if (!supportsMergeTree(repository)) {
81
+ return { kind: "refused", refusal: { kind: "integration-unsupported", contractId, requiredGit: REQUIRED_GIT } };
82
+ }
83
+ const result = runAllowingNonzero(repository, [
84
+ "merge-tree",
85
+ "--write-tree",
86
+ "--no-messages",
87
+ "-z",
88
+ "--name-only",
89
+ "--merge-base",
90
+ gitObjectIdForSnapshot(base),
91
+ gitObjectIdForSnapshot(targetHead),
92
+ tenderTree,
93
+ ]);
94
+ const fields = nulFields(result.stdout);
95
+ if (result.status === 0) {
96
+ if (fields.length !== 1)
97
+ throw new Error("successful Git merge-tree output has unexpected fields");
98
+ return { kind: "prepared", data: gitObjectId(fields[0], "integration tree") };
99
+ }
100
+ if (result.status === 1) {
101
+ if (fields.length < 2)
102
+ throw new Error("conflicted Git merge-tree output is missing paths");
103
+ return {
104
+ kind: "refused",
105
+ refusal: {
106
+ kind: "integration-failed",
107
+ contractId,
108
+ reason: "conflict",
109
+ targetHead,
110
+ conflictPaths: Object.freeze([...new Set(fields.slice(1))].sort()),
111
+ },
112
+ };
113
+ }
114
+ throw new GitPlumbingError({
115
+ stderr: result.stderr,
116
+ status: result.status,
117
+ message: "git merge-tree --write-tree failed",
118
+ });
119
+ }
120
+ export function planIntegration(repository, input, tender, requireBranchesToBeUpToDate) {
121
+ const target = input.coordinates.target;
122
+ if (target === undefined) {
123
+ return {
124
+ kind: "prepared",
125
+ data: {
126
+ predecessor: input.coordinates.start,
127
+ tree: tender.tree,
128
+ changeId: stablePatchId(repository, input.coordinates.start, tender.tree),
129
+ },
130
+ };
131
+ }
132
+ const observed = readRef(repository, target);
133
+ if (observed === null) {
134
+ return { kind: "refused", refusal: { kind: "target-missing", contractId: input.contractId } };
135
+ }
136
+ const targetHead = mintSnapshotId(observed);
137
+ let tree;
138
+ if (requireBranchesToBeUpToDate) {
139
+ if (!isAncestor(repository, targetHead, tender.head)) {
140
+ return {
141
+ kind: "refused",
142
+ refusal: {
143
+ kind: "integration-failed",
144
+ contractId: input.contractId,
145
+ reason: "not-based-on-target",
146
+ targetHead,
147
+ },
148
+ };
149
+ }
150
+ tree = tender.tree;
151
+ }
152
+ else {
153
+ const base = commonAncestor(repository, tender.head, targetHead);
154
+ if (base === null) {
155
+ return {
156
+ kind: "refused",
157
+ refusal: {
158
+ kind: "integration-failed",
159
+ contractId: input.contractId,
160
+ reason: "unrelated-histories",
161
+ targetHead,
162
+ },
163
+ };
164
+ }
165
+ const merged = mergedTree(repository, input.contractId, base, targetHead, tender.tree);
166
+ if (merged.kind === "refused")
167
+ return merged;
168
+ tree = merged.data;
169
+ }
170
+ return {
171
+ kind: "prepared",
172
+ data: {
173
+ predecessor: targetHead,
174
+ tree,
175
+ changeId: stablePatchId(repository, targetHead, tree),
176
+ },
177
+ };
178
+ }
179
+ /** Prepare the integration-derived review subject from one captured tender. */
180
+ export function prepareReviewIntegration(repository, input, tender, workspace) {
181
+ const integration = planIntegration(repository, input, tender, false);
182
+ return integration.kind === "refused"
183
+ ? integration
184
+ : { kind: "prepared", data: { changeId: integration.data.changeId, ...(workspace === undefined ? {} : { workspace }) } };
185
+ }
186
+ function deliverySnapshotAvailability(repository, predecessor, candidate) {
187
+ const objects = [gitObjectIdForSnapshot(predecessor), gitObjectIdForSnapshot(candidate)];
188
+ const types = runGit(repository, ["cat-file", "--batch-check=%(objectname) %(objecttype)"], `${objects.join("\n")}\n`).toString("ascii").trimEnd().split("\n").map((record) => record.split(" ")[1]);
189
+ if (types.includes("missing"))
190
+ return "unavailable";
191
+ if (types.some((type) => type !== "commit")) {
192
+ throw new AuthorityCorruptionError("recorded delivery snapshot is not a Git commit");
193
+ }
194
+ return "available";
195
+ }
196
+ /** Read a recorded integration pair's patch, or null when Git no longer has it. */
197
+ export function readDeliveryDiff(repository, predecessor, candidate) {
198
+ if (deliverySnapshotAvailability(repository, predecessor, candidate) === "unavailable")
199
+ return null;
200
+ try {
201
+ return runGit(repository, [
202
+ "diff",
203
+ "--no-ext-diff",
204
+ "--no-color",
205
+ gitObjectIdForSnapshot(predecessor),
206
+ gitObjectIdForSnapshot(candidate),
207
+ ]).toString("utf8");
208
+ }
209
+ catch (error) {
210
+ if (deliverySnapshotAvailability(repository, predecessor, candidate) === "unavailable")
211
+ return null;
212
+ throw error;
213
+ }
214
+ }