@astrosheep/keiyaku 4.0.0 → 4.0.2

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 (308) hide show
  1. package/README.md +133 -8
  2. package/build/integrations/marketplace/plugins/keiyaku/.claude-plugin/plugin.json +2 -2
  3. package/build/integrations/marketplace/plugins/keiyaku/.codex-plugin/plugin.json +4 -4
  4. package/build/integrations/marketplace/plugins/keiyaku/opencode.js +2 -2
  5. package/build/integrations/marketplace/plugins/keiyaku/package.json +2 -2
  6. package/build/integrations/marketplace/plugins/keiyaku/skills/keiyaku/SKILL.md +13 -5
  7. package/build/integrations/marketplace/plugins/keiyaku/skills/keiyaku-akuma/SKILL.md +91 -32
  8. package/build/integrations/marketplace/plugins/keiyaku/skills/keiyaku-bind/SKILL.md +134 -0
  9. package/build/integrations/marketplace/plugins/keiyaku/skills/keiyaku-bind/agents/openai.yaml +4 -0
  10. package/build/integrations/marketplace/plugins/keiyaku/skills/keiyaku-task/SKILL.md +41 -6
  11. package/build/integrations/marketplace/plugins/keiyaku/skills/keiyaku-workflow/SKILL.md +262 -46
  12. package/build/src/akuma/abort.d.ts +2 -0
  13. package/build/src/akuma/abort.js +50 -0
  14. package/build/src/akuma/akuma.d.ts +50 -33
  15. package/build/src/akuma/akuma.js +175 -127
  16. package/build/src/akuma/archetype.d.ts +14 -5
  17. package/build/src/akuma/archetype.js +85 -39
  18. package/build/src/akuma/body.d.ts +3 -5
  19. package/build/src/akuma/body.js +490 -183
  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 +88 -45
  23. package/build/src/akuma/heart/facts.js +19 -8
  24. package/build/src/akuma/heart/index.d.ts +64 -55
  25. package/build/src/akuma/heart/index.js +172 -252
  26. package/build/src/akuma/heart/rows.d.ts +38 -83
  27. package/build/src/akuma/heart/rows.js +117 -155
  28. package/build/src/akuma/heart/schema.d.ts +1 -1
  29. package/build/src/akuma/heart/schema.js +61 -22
  30. package/build/src/akuma/heart/soul.d.ts +8 -0
  31. package/build/src/akuma/heart/soul.js +136 -0
  32. package/build/src/akuma/heart/storage.d.ts +47 -0
  33. package/build/src/akuma/heart/storage.js +224 -0
  34. package/build/src/akuma/heart/tells.d.ts +12 -0
  35. package/build/src/akuma/heart/tells.js +79 -0
  36. package/build/src/akuma/heart/timeline.d.ts +15 -0
  37. package/build/src/akuma/heart/timeline.js +86 -0
  38. package/build/src/akuma/identity.d.ts +2 -2
  39. package/build/src/akuma/identity.js +9 -9
  40. package/build/src/akuma/index.d.ts +10 -3
  41. package/build/src/akuma/index.js +7 -1
  42. package/build/src/akuma/projection.d.ts +176 -0
  43. package/build/src/akuma/projection.js +256 -0
  44. package/build/src/akuma/provider-recipe.d.ts +24 -0
  45. package/build/src/akuma/provider-recipe.js +100 -0
  46. package/build/src/akuma/provider.d.ts +67 -13
  47. package/build/src/akuma/provider.js +172 -105
  48. package/build/src/akuma/providers/acp/core.d.ts +19 -0
  49. package/build/src/akuma/providers/acp/core.js +159 -0
  50. package/build/src/akuma/providers/acp/events.d.ts +20 -0
  51. package/build/src/akuma/providers/acp/events.js +73 -0
  52. package/build/src/akuma/providers/acp/index.d.ts +12 -0
  53. package/build/src/akuma/providers/acp/index.js +94 -0
  54. package/build/src/akuma/providers/{claude.d.ts → claude/events.d.ts} +9 -41
  55. package/build/src/akuma/providers/claude/events.js +238 -0
  56. package/build/src/akuma/providers/claude/index.d.ts +47 -0
  57. package/build/src/akuma/providers/claude/index.js +279 -0
  58. package/build/src/akuma/providers/claude/input.d.ts +13 -0
  59. package/build/src/akuma/providers/claude/input.js +109 -0
  60. package/build/src/akuma/providers/codex-app-server/events.d.ts +1 -1
  61. package/build/src/akuma/providers/codex-app-server/events.js +15 -12
  62. package/build/src/akuma/providers/codex-app-server/index.d.ts +15 -13
  63. package/build/src/akuma/providers/codex-app-server/index.js +77 -33
  64. package/build/src/akuma/providers/grok-build/index.d.ts +4 -0
  65. package/build/src/akuma/providers/grok-build/index.js +70 -0
  66. package/build/src/akuma/providers/index.d.ts +5 -3
  67. package/build/src/akuma/providers/index.js +35 -56
  68. package/build/src/akuma/providers/opencode-sdk/events.d.ts +54 -0
  69. package/build/src/akuma/providers/opencode-sdk/events.js +235 -0
  70. package/build/src/akuma/providers/opencode-sdk/index.d.ts +33 -0
  71. package/build/src/akuma/providers/opencode-sdk/index.js +308 -0
  72. package/build/src/akuma/providers/opencode-sdk/session.d.ts +26 -0
  73. package/build/src/akuma/providers/opencode-sdk/session.js +63 -0
  74. package/build/src/akuma/providers/pi/events.d.ts +33 -0
  75. package/build/src/akuma/providers/pi/events.js +166 -0
  76. package/build/src/akuma/providers/pi/index.d.ts +11 -0
  77. package/build/src/akuma/providers/pi/index.js +191 -0
  78. package/build/src/akuma/publication.d.ts +3 -3
  79. package/build/src/akuma/publication.js +28 -40
  80. package/build/src/akuma/requests.d.ts +9 -6
  81. package/build/src/akuma/requests.js +95 -65
  82. package/build/src/alias/index.d.ts +4 -3
  83. package/build/src/alias/index.js +12 -13
  84. package/build/src/body/decode.js +7 -1
  85. package/build/src/body/region.d.ts +2 -0
  86. package/build/src/body/region.js +77 -7
  87. package/build/src/body/render.js +2 -1
  88. package/build/src/body/shape.js +7 -1
  89. package/build/src/body/verification.js +19 -4
  90. package/build/src/cli/accepted.d.ts +18 -12
  91. package/build/src/cli/accepted.js +73 -34
  92. package/build/src/cli/actor.js +3 -3
  93. package/build/src/cli/commands/akuma-invoke.d.ts +44 -19
  94. package/build/src/cli/commands/akuma-invoke.js +101 -52
  95. package/build/src/cli/commands/akuma.d.ts +27 -9
  96. package/build/src/cli/commands/akuma.js +151 -80
  97. package/build/src/cli/commands/contract.d.ts +155 -0
  98. package/build/src/cli/commands/contract.js +20 -0
  99. package/build/src/cli/commands/install.js +2 -0
  100. package/build/src/cli/commands/task-invoke.d.ts +19 -4
  101. package/build/src/cli/commands/task-invoke.js +65 -17
  102. package/build/src/cli/commands/task-query.d.ts +5 -0
  103. package/build/src/cli/commands/task-query.js +247 -0
  104. package/build/src/cli/commands/task.d.ts +3 -1
  105. package/build/src/cli/commands/task.js +52 -14
  106. package/build/src/cli/coordinates.d.ts +18 -0
  107. package/build/src/cli/coordinates.js +120 -0
  108. package/build/src/cli/draft.d.ts +8 -0
  109. package/build/src/cli/draft.js +96 -0
  110. package/build/src/cli/invoke.d.ts +9 -3
  111. package/build/src/cli/invoke.js +287 -108
  112. package/build/src/cli/main.js +54 -7
  113. package/build/src/cli/parse.d.ts +21 -117
  114. package/build/src/cli/parse.js +79 -84
  115. package/build/src/cli/render/akuma-tool-command.d.ts +6 -0
  116. package/build/src/cli/render/akuma-tool-command.js +144 -0
  117. package/build/src/cli/render/akuma-tool.d.ts +4 -2
  118. package/build/src/cli/render/akuma-tool.js +35 -5
  119. package/build/src/cli/render/akuma.d.ts +3 -1
  120. package/build/src/cli/render/akuma.js +247 -212
  121. package/build/src/cli/render/audit.d.ts +3 -0
  122. package/build/src/cli/render/audit.js +104 -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 +3 -3
  126. package/build/src/cli/render/contract.js +200 -54
  127. package/build/src/cli/render/kanshi.js +272 -129
  128. package/build/src/cli/render/receipt.d.ts +19 -0
  129. package/build/src/cli/render/receipt.js +106 -0
  130. package/build/src/cli/render/refusal.d.ts +16 -2
  131. package/build/src/cli/render/refusal.js +88 -3
  132. package/build/src/cli/render/region.d.ts +2 -0
  133. package/build/src/cli/render/region.js +17 -0
  134. package/build/src/cli/render/task.d.ts +2 -1
  135. package/build/src/cli/render/task.js +223 -60
  136. package/build/src/cli/render/terminal.d.ts +20 -0
  137. package/build/src/cli/render/terminal.js +121 -0
  138. package/build/src/cli/render/text.js +11 -3
  139. package/build/src/cli/result.d.ts +126 -19
  140. package/build/src/cli/usage.d.ts +1 -0
  141. package/build/src/cli/usage.js +3 -0
  142. package/build/src/contract-worktree.d.ts +44 -0
  143. package/build/src/contract-worktree.js +251 -0
  144. package/build/src/coordination/durable-file.d.ts +5 -1
  145. package/build/src/coordination/durable-file.js +57 -10
  146. package/build/src/coordination/sqlite-transaction-lock.d.ts +4 -0
  147. package/build/src/coordination/sqlite-transaction-lock.js +22 -5
  148. package/build/src/core/facts/codec.js +23 -4
  149. package/build/src/core/facts/eligibility.d.ts +1 -10
  150. package/build/src/core/facts/eligibility.js +0 -49
  151. package/build/src/core/facts/fold.js +1 -6
  152. package/build/src/core/facts/gate.d.ts +1 -0
  153. package/build/src/core/facts/gate.js +1 -0
  154. package/build/src/core/facts/observation.d.ts +3 -0
  155. package/build/src/core/facts/observation.js +12 -0
  156. package/build/src/core/facts/types.d.ts +10 -3
  157. package/build/src/core/subject.js +2 -2
  158. package/build/src/core/verbs/amend.d.ts +1 -1
  159. package/build/src/core/verbs/amend.js +3 -18
  160. package/build/src/core/verbs/bind.js +2 -16
  161. package/build/src/core/verbs/deliver.d.ts +1 -1
  162. package/build/src/core/verbs/deliver.js +14 -4
  163. package/build/src/core/verbs/placement.d.ts +1 -1
  164. package/build/src/core/verbs/placement.js +7 -9
  165. package/build/src/dispatch/index.d.ts +5 -3
  166. package/build/src/dispatch/index.js +30 -21
  167. package/build/src/duration.d.ts +10 -0
  168. package/build/src/duration.js +22 -0
  169. package/build/src/git/admission.d.ts +2 -2
  170. package/build/src/git/admission.js +33 -23
  171. package/build/src/git/hooks.d.ts +15 -0
  172. package/build/src/git/hooks.js +70 -18
  173. package/build/src/git/identity.d.ts +5 -1
  174. package/build/src/git/identity.js +23 -4
  175. package/build/src/git/integration.d.ts +48 -0
  176. package/build/src/git/integration.js +250 -0
  177. package/build/src/git/observe.d.ts +29 -15
  178. package/build/src/git/observe.js +185 -76
  179. package/build/src/git/read-observation.d.ts +41 -0
  180. package/build/src/git/read-observation.js +361 -0
  181. package/build/src/git/reconcile.d.ts +17 -5
  182. package/build/src/git/reconcile.js +305 -109
  183. package/build/src/git/repository.d.ts +41 -18
  184. package/build/src/git/repository.js +220 -114
  185. package/build/src/git/scratch.d.ts +17 -0
  186. package/build/src/git/scratch.js +73 -0
  187. package/build/src/git/target-placement.d.ts +92 -0
  188. package/build/src/git/target-placement.js +375 -0
  189. package/build/src/git/tender.d.ts +49 -0
  190. package/build/src/git/tender.js +63 -0
  191. package/build/src/git/terminal-seal.d.ts +24 -0
  192. package/build/src/git/terminal-seal.js +89 -0
  193. package/build/src/git/tree.d.ts +2 -2
  194. package/build/src/git/tree.js +4 -0
  195. package/build/src/git/workspace.d.ts +53 -0
  196. package/build/src/git/workspace.js +139 -0
  197. package/build/src/identity/selector.d.ts +6 -0
  198. package/build/src/identity/selector.js +19 -0
  199. package/build/src/index.d.ts +4 -2
  200. package/build/src/index.js +2 -1
  201. package/build/src/kanshi/index.d.ts +2 -2
  202. package/build/src/kanshi/index.js +1 -1
  203. package/build/src/kanshi/read.d.ts +7 -3
  204. package/build/src/kanshi/read.js +245 -45
  205. package/build/src/kanshi/report.d.ts +81 -6
  206. package/build/src/kanshi/select.d.ts +5 -0
  207. package/build/src/kanshi/select.js +33 -1
  208. package/build/src/library/address.d.ts +57 -0
  209. package/build/src/library/address.js +165 -0
  210. package/build/src/library/akuma-creation.d.ts +16 -7
  211. package/build/src/library/akuma-creation.js +96 -22
  212. package/build/src/library/audit.d.ts +18 -0
  213. package/build/src/library/audit.js +44 -0
  214. package/build/src/library/bind.d.ts +21 -0
  215. package/build/src/library/bind.js +56 -0
  216. package/build/src/library/catalog.d.ts +58 -0
  217. package/build/src/library/catalog.js +69 -0
  218. package/build/src/library/configuration.d.ts +6 -15
  219. package/build/src/library/configuration.js +14 -17
  220. package/build/src/library/contract.d.ts +23 -49
  221. package/build/src/library/contract.js +171 -185
  222. package/build/src/library/delivery.d.ts +24 -0
  223. package/build/src/library/delivery.js +21 -0
  224. package/build/src/library/fleet.d.ts +65 -0
  225. package/build/src/library/fleet.js +153 -0
  226. package/build/src/library/input.d.ts +3 -0
  227. package/build/src/library/input.js +19 -0
  228. package/build/src/library/keiyaku.d.ts +18 -3
  229. package/build/src/library/keiyaku.js +12 -1
  230. package/build/src/library/mutation.d.ts +39 -0
  231. package/build/src/library/mutation.js +37 -0
  232. package/build/src/library/reconcile.d.ts +29 -0
  233. package/build/src/library/reconcile.js +179 -0
  234. package/build/src/library/refusal.d.ts +21 -0
  235. package/build/src/library/refusal.js +29 -0
  236. package/build/src/library/region.d.ts +14 -1
  237. package/build/src/library/region.js +18 -4
  238. package/build/src/library/repo.d.ts +4 -13
  239. package/build/src/library/repo.js +14 -24
  240. package/build/src/protocol/attempt.d.ts +16 -3
  241. package/build/src/protocol/attempt.js +41 -10
  242. package/build/src/protocol/bind.d.ts +9 -2
  243. package/build/src/protocol/bind.js +48 -40
  244. package/build/src/protocol/intent.d.ts +57 -20
  245. package/build/src/protocol/intent.js +55 -79
  246. package/build/src/protocol/operations.d.ts +152 -43
  247. package/build/src/protocol/operations.js +482 -166
  248. package/build/src/protocol/outcome.d.ts +14 -3
  249. package/build/src/protocol/outcome.js +11 -3
  250. package/build/src/protocol/placement.d.ts +41 -0
  251. package/build/src/protocol/placement.js +147 -0
  252. package/build/src/protocol/read/documents.d.ts +2 -2
  253. package/build/src/protocol/read/documents.js +4 -4
  254. package/build/src/protocol/read/status.d.ts +18 -5
  255. package/build/src/protocol/read/status.js +73 -13
  256. package/build/src/protocol/run.d.ts +49 -7
  257. package/build/src/protocol/run.js +53 -25
  258. package/build/src/runtime/proc/line-rpc.d.ts +4 -8
  259. package/build/src/runtime/proc/line-rpc.js +22 -28
  260. package/build/src/runtime/proc/run.d.ts +23 -21
  261. package/build/src/runtime/proc/run.js +123 -89
  262. package/build/src/runtime/proc/stdio.d.ts +18 -0
  263. package/build/src/runtime/proc/stdio.js +58 -0
  264. package/build/src/settings.d.ts +7 -1
  265. package/build/src/settings.js +32 -17
  266. package/build/src/settlement/fence.d.ts +5 -0
  267. package/build/src/settlement/fence.js +14 -0
  268. package/build/src/settlement/holder.d.ts +35 -4
  269. package/build/src/settlement/holder.js +127 -28
  270. package/build/src/settlement/settle.d.ts +9 -1
  271. package/build/src/settlement/settle.js +74 -37
  272. package/build/src/task/board.d.ts +23 -5
  273. package/build/src/task/board.js +17 -10
  274. package/build/src/task/compose.d.ts +2 -2
  275. package/build/src/task/compose.js +18 -10
  276. package/build/src/task/context.d.ts +3 -3
  277. package/build/src/task/context.js +15 -20
  278. package/build/src/task/document.d.ts +2 -1
  279. package/build/src/task/document.js +15 -5
  280. package/build/src/task/index.d.ts +27 -15
  281. package/build/src/task/index.js +57 -35
  282. package/build/src/task/operations.d.ts +38 -13
  283. package/build/src/task/operations.js +80 -46
  284. package/build/src/task/query.d.ts +67 -0
  285. package/build/src/task/query.js +279 -0
  286. package/build/src/task/store.d.ts +5 -7
  287. package/build/src/task/store.js +43 -28
  288. package/build/src/verification/declaration.d.ts +1 -0
  289. package/build/src/verification/execution.d.ts +51 -0
  290. package/build/src/verification/execution.js +108 -0
  291. package/build/src/workspace-place.d.ts +41 -0
  292. package/build/src/workspace-place.js +386 -0
  293. package/build/src/world.d.ts +24 -0
  294. package/build/src/world.js +136 -0
  295. package/package.json +8 -4
  296. package/build/src/akuma/activity.d.ts +0 -66
  297. package/build/src/akuma/activity.js +0 -139
  298. package/build/src/akuma/providers/claude.js +0 -305
  299. package/build/src/context-root.d.ts +0 -4
  300. package/build/src/context-root.js +0 -15
  301. package/build/src/git/delivery.d.ts +0 -20
  302. package/build/src/git/delivery.js +0 -109
  303. package/build/src/git/verification.d.ts +0 -14
  304. package/build/src/git/verification.js +0 -56
  305. package/build/src/protocol/read/audit.d.ts +0 -25
  306. package/build/src/protocol/read/audit.js +0 -39
  307. package/build/src/verification/producer.d.ts +0 -23
  308. package/build/src/verification/producer.js +0 -54
@@ -0,0 +1,120 @@
1
+ import { realpath } from "node:fs/promises";
2
+ import { resolve } from "node:path";
3
+ import { NoGitWorldError, Repo } from "../index.js";
4
+ import { World, WorldError } from "../world.js";
5
+ import { CliUsageError } from "./parse.js";
6
+ async function canonicalInvocationCwd(input) {
7
+ try {
8
+ return await realpath(input);
9
+ }
10
+ catch {
11
+ throw new CliUsageError(`invocation cwd is not an existing directory: ${input}`);
12
+ }
13
+ }
14
+ async function discoverRepoAt(coordinate) {
15
+ try {
16
+ return { kind: "present", repo: await Repo.at({ path: coordinate }) };
17
+ }
18
+ catch (error) {
19
+ if (error instanceof NoGitWorldError)
20
+ return { kind: "absent", error };
21
+ throw error;
22
+ }
23
+ }
24
+ function repoPolicy(command) {
25
+ switch (command.command) {
26
+ case "bind":
27
+ case "amend":
28
+ case "deliver":
29
+ case "review":
30
+ case "arc":
31
+ case "abandon":
32
+ case "audit":
33
+ case "reconcile":
34
+ case "show":
35
+ case "region":
36
+ return { use: "required", acceptsExplicit: true };
37
+ case "ls":
38
+ return { use: command.query.kind === "contracts" ? "required" : "none", acceptsExplicit: false };
39
+ case "status":
40
+ case "tell":
41
+ case "history":
42
+ return { use: "optional", acceptsExplicit: false };
43
+ case "fork":
44
+ return { use: "optional", acceptsExplicit: true };
45
+ case "wait":
46
+ case "kill": {
47
+ const contractSelector = command.akuma.some((selector) => selector.startsWith("kei/"));
48
+ return { use: contractSelector ? "required" : "optional", acceptsExplicit: contractSelector };
49
+ }
50
+ case "call":
51
+ return {
52
+ use: command.contract === undefined ? "none" : "required",
53
+ acceptsExplicit: command.contract !== undefined,
54
+ };
55
+ case "settings":
56
+ case "task":
57
+ case "install":
58
+ return { use: "none", acceptsExplicit: false };
59
+ }
60
+ }
61
+ function refuseUnusedRepo(command) {
62
+ if (command.command === "call")
63
+ throw new CliUsageError("--repo has no consumer without --contract");
64
+ throw new CliUsageError(`--repo has no consumer for ${command.command}`);
65
+ }
66
+ export function assertExplicitRepoUse(command, repo) {
67
+ if (repo !== undefined && !repoPolicy(command).acceptsExplicit)
68
+ refuseUnusedRepo(command);
69
+ }
70
+ function repoFor(use, discovery) {
71
+ if (use === "none")
72
+ return undefined;
73
+ if (discovery.kind === "present")
74
+ return discovery.repo;
75
+ if (use === "required")
76
+ throw discovery.error;
77
+ return undefined;
78
+ }
79
+ async function resolveWorld(cwd, repo) {
80
+ try {
81
+ const resolution = await World.resolve({ cwd, ...(repo === undefined ? {} : { repositoryRoot: repo.root }) });
82
+ return {
83
+ root: resolution.root,
84
+ candidate: resolution.candidate,
85
+ async establish() {
86
+ try {
87
+ return await resolution.establish();
88
+ }
89
+ catch (error) {
90
+ if (error instanceof WorldError)
91
+ throw new CliUsageError(error.message);
92
+ throw error;
93
+ }
94
+ },
95
+ };
96
+ }
97
+ catch (error) {
98
+ if (error instanceof WorldError)
99
+ throw new CliUsageError(error.message);
100
+ throw error;
101
+ }
102
+ }
103
+ export async function resolveCliCoordinates(input) {
104
+ const processCwd = resolve(input.processCwd ?? ".");
105
+ const cwd = await canonicalInvocationCwd(resolve(processCwd, input.cwd ?? "."));
106
+ const invocationRepo = await discoverRepoAt(cwd);
107
+ const selectedRepo = input.repo === undefined
108
+ ? invocationRepo
109
+ : await discoverRepoAt(resolve(cwd, input.repo));
110
+ const worldRepo = invocationRepo.kind === "present" ? invocationRepo.repo : undefined;
111
+ const repo = repoFor(repoPolicy(input.command).use, selectedRepo);
112
+ const world = await resolveWorld(cwd, worldRepo);
113
+ return {
114
+ cwd,
115
+ ...(repo === undefined ? {} : { repo }),
116
+ world: world.root,
117
+ candidateWorld: world.candidate,
118
+ establishWorld: world.establish,
119
+ };
120
+ }
@@ -0,0 +1,8 @@
1
+ import type { WorldRoot } from "../world.js";
2
+ import type { BindDraftReceipt } from "./result.js";
3
+ export declare class BindDraftError extends Error {
4
+ readonly original: unknown;
5
+ readonly draft: BindDraftReceipt;
6
+ constructor(original: unknown, draft: BindDraftReceipt);
7
+ }
8
+ export declare function preserveBindDraft(world: WorldRoot, markdown: string, now?: number): Promise<BindDraftReceipt>;
@@ -0,0 +1,96 @@
1
+ import { createHash } from "node:crypto";
2
+ import { lstatSync, mkdirSync, readFileSync, readdirSync, unlinkSync, utimesSync } from "node:fs";
3
+ import { join } from "node:path";
4
+ import { repairDerivedFile, replaceFileDurably } from "../coordination/durable-file.js";
5
+ const RETENTION_MS = 7 * 24 * 60 * 60 * 1_000;
6
+ const DRAFT_NAME = /^bind-[0-9a-f]{64}\.md$/u;
7
+ export class BindDraftError extends Error {
8
+ original;
9
+ draft;
10
+ constructor(original, draft) {
11
+ super(original instanceof Error ? original.message : String(original));
12
+ this.name = "BindDraftError";
13
+ this.original = original;
14
+ this.draft = draft;
15
+ }
16
+ }
17
+ function diagnostic(error) {
18
+ return error instanceof Error ? error.message : String(error);
19
+ }
20
+ function sweep(directory, now) {
21
+ for (const entry of readdirSync(directory, { withFileTypes: true })) {
22
+ if (!entry.isFile() || !DRAFT_NAME.test(entry.name))
23
+ continue;
24
+ const path = join(directory, entry.name);
25
+ try {
26
+ if (now - lstatSync(path).mtimeMs > RETENTION_MS)
27
+ unlinkSync(path);
28
+ }
29
+ catch (error) {
30
+ if (error.code !== "ENOENT")
31
+ throw error;
32
+ }
33
+ }
34
+ }
35
+ export async function preserveBindDraft(world, markdown, now = Date.now()) {
36
+ const digest = createHash("sha256").update(markdown, "utf8").digest("hex");
37
+ const name = `bind-${digest}.md`;
38
+ const relativePath = `.keiyaku/draft/${name}`;
39
+ const directory = join(world, ".keiyaku", "draft");
40
+ const path = join(directory, name);
41
+ const warnings = [];
42
+ try {
43
+ mkdirSync(directory, { recursive: true });
44
+ }
45
+ catch (error) {
46
+ return { warning: `bind draft could not be preserved: ${diagnostic(error)}` };
47
+ }
48
+ try {
49
+ await repairDerivedFile(join(directory, ".gitignore"), "*\n");
50
+ }
51
+ catch (error) {
52
+ warnings.push(`bind draft ignore could not be maintained: ${diagnostic(error)}`);
53
+ }
54
+ try {
55
+ let equal = false;
56
+ try {
57
+ const status = lstatSync(path);
58
+ equal = status.isFile() && !status.isSymbolicLink() && readFileSync(path).equals(Buffer.from(markdown));
59
+ }
60
+ catch (error) {
61
+ if (error.code !== "ENOENT")
62
+ throw error;
63
+ }
64
+ if (equal) {
65
+ try {
66
+ const touched = new Date(now);
67
+ utimesSync(path, touched, touched);
68
+ }
69
+ catch (error) {
70
+ if (error.code !== "ENOENT")
71
+ throw error;
72
+ await replaceFileDurably(path, markdown);
73
+ }
74
+ }
75
+ else {
76
+ await replaceFileDurably(path, markdown);
77
+ }
78
+ if (!readFileSync(path).equals(Buffer.from(markdown))) {
79
+ throw new Error(`bind draft bytes do not match their content address: ${relativePath}`);
80
+ }
81
+ }
82
+ catch (error) {
83
+ warnings.push(`bind draft could not be preserved: ${diagnostic(error)}`);
84
+ return { warning: warnings.join("; ") };
85
+ }
86
+ try {
87
+ sweep(directory, now);
88
+ }
89
+ catch (error) {
90
+ warnings.push(`bind draft sweep failed: ${diagnostic(error)}`);
91
+ }
92
+ return {
93
+ path: relativePath,
94
+ ...(warnings.length === 0 ? {} : { warning: warnings.join("; ") }),
95
+ };
96
+ }
@@ -1,17 +1,23 @@
1
- import { type Settings } from "../index.js";
1
+ import { type ActorId, type ContractId, type Settings } from "../index.js";
2
2
  import { type AkumaInvocationResult } from "./commands/akuma-invoke.js";
3
3
  import { type InstallInvocationResult } from "./commands/install.js";
4
4
  import { type TaskInvocationResult } from "./commands/task-invoke.js";
5
5
  import { type ParsedExecution } from "./parse.js";
6
6
  import type { InvocationResult } from "./result.js";
7
- export type { AcceptedFact, DiffUnavailable, InvocationResult, Lag } from "./result.js";
7
+ export type { AcceptedFact, InvocationResult, Lag } from "./result.js";
8
8
  type InvokeRuntime = Readonly<{
9
9
  cwd?: string;
10
10
  environment?: NodeJS.ProcessEnv;
11
- readStdin?: () => string;
11
+ readStdin?: () => Promise<string>;
12
+ actor?: ActorId;
12
13
  }>;
13
14
  export type SettingsInvocationResult = Readonly<{
14
15
  kind: "settings";
15
16
  value: Settings;
16
17
  }>;
18
+ export type GuidanceInvocationResult = Readonly<{
19
+ kind: "guidance";
20
+ contract: ContractId;
21
+ guidance: string;
22
+ }>;
17
23
  export declare function invoke(invocation: ParsedExecution, runtime?: InvokeRuntime): Promise<InvocationResult | TaskInvocationResult | AkumaInvocationResult | SettingsInvocationResult | InstallInvocationResult>;