@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
@@ -1,16 +1,16 @@
1
- import { readFileSync, readdirSync } from "node:fs";
1
+ import { readFile, readdir } from "node:fs/promises";
2
2
  import { dirname, join } from "node:path";
3
3
  import { parseDocument } from "yaml";
4
4
  import { archetypeName } from "./identity.js";
5
- import { decodeProviderOptions } from "./provider.js";
6
- import { decodeProviderExecution, providerNamed } from "./providers/index.js";
5
+ import { decodeProviderOptions, decodeProviderRecipe, } from "./provider-recipe.js";
6
+ import { resolveProviderExecution } from "./providers/index.js";
7
7
  export class AkumaArchetypeError extends Error {
8
8
  archetype;
9
9
  searched;
10
10
  reason;
11
11
  kind = "akuma-archetype";
12
- constructor(archetype, searched, reason) {
13
- super(`Akuma archetype ${archetype} ${reason}\n${searched.map((path) => `searched ${path}`).join("\n")}`);
12
+ constructor(archetype, searched, reason, guidance) {
13
+ super([`\`${archetype}\` ${reason}`, ...(guidance === undefined ? [] : [guidance])].join("\n"));
14
14
  this.archetype = archetype;
15
15
  this.searched = searched;
16
16
  this.reason = reason;
@@ -21,27 +21,24 @@ function archetypeDirectory(settings) {
21
21
  const userPath = settings.scopes.user.path;
22
22
  return userPath === undefined ? null : join(dirname(userPath), "akuma");
23
23
  }
24
- export function listArchetypes(input) {
25
- const directory = archetypeDirectory(input.settings);
24
+ async function archetypePaths(settings) {
25
+ const directory = archetypeDirectory(settings);
26
26
  if (directory === null)
27
27
  return [];
28
28
  try {
29
- return readdirSync(directory, { withFileTypes: true })
29
+ return (await readdir(directory, { withFileTypes: true }))
30
30
  .flatMap((entry) => {
31
- if (!entry.isFile())
32
- return [];
33
- const filename = entry.name;
34
- if (!filename.endsWith(".md"))
31
+ if (!entry.isFile() || !entry.name.endsWith(".md"))
35
32
  return [];
36
- const name = filename.slice(0, -3);
33
+ const name = entry.name.slice(0, -3);
37
34
  try {
38
- return [archetypeName(name)];
35
+ return [{ name: archetypeName(name), path: join(directory, entry.name) }];
39
36
  }
40
37
  catch {
41
38
  return [];
42
39
  }
43
40
  })
44
- .sort((left, right) => Buffer.compare(Buffer.from(left), Buffer.from(right)));
41
+ .sort((left, right) => Buffer.compare(Buffer.from(left.name), Buffer.from(right.name)));
45
42
  }
46
43
  catch (error) {
47
44
  if (error.code === "ENOENT")
@@ -49,12 +46,15 @@ export function listArchetypes(input) {
49
46
  throw error;
50
47
  }
51
48
  }
49
+ export async function listArchetypes(input) {
50
+ return (await archetypePaths(input.settings)).map(({ name }) => name);
51
+ }
52
52
  function archetypeField(values, key, required = false) {
53
53
  const value = values[key];
54
54
  if (value === undefined && !required)
55
55
  return undefined;
56
56
  if (typeof value !== "string" || value.trim().length === 0) {
57
- throw new TypeError(`Archetype ${key} must be a nonblank string`);
57
+ throw new TypeError(`Akuma ${key} must be a nonblank string`);
58
58
  }
59
59
  return value;
60
60
  }
@@ -63,28 +63,37 @@ function archetypeEnum(values, key, allowed) {
63
63
  if (value === undefined)
64
64
  return undefined;
65
65
  if (!allowed.includes(value))
66
- throw new TypeError(`Archetype ${key} must be one of ${allowed.join(", ")}`);
66
+ throw new TypeError(`Akuma ${key} must be one of ${allowed.join(", ")}`);
67
67
  return value;
68
68
  }
69
+ function archetypeReadonly(values) {
70
+ if (!("readonly" in values))
71
+ return undefined;
72
+ if (values.readonly !== true)
73
+ throw new TypeError("Akuma readonly must be true");
74
+ return true;
75
+ }
69
76
  function decodeArchetype(name, path, markdown) {
70
77
  const lines = markdown.split(/\r?\n/u);
71
78
  if (lines[0]?.trim() !== "---")
72
- throw new TypeError("Archetype must begin with YAML frontmatter");
79
+ throw new TypeError("Akuma configuration must begin with YAML frontmatter");
73
80
  const closing = lines.findIndex((line, index) => index > 0 && line.trim() === "---");
74
81
  if (closing < 0)
75
- throw new TypeError("Archetype frontmatter is not closed");
82
+ throw new TypeError("Akuma frontmatter is not closed");
76
83
  const document = parseDocument(lines.slice(1, closing).join("\n"), { uniqueKeys: true });
77
84
  if (document.errors.length > 0)
78
- throw new TypeError(`Archetype frontmatter is invalid: ${document.errors[0].message}`);
85
+ throw new TypeError(`Akuma frontmatter is invalid: ${document.errors[0].message}`);
79
86
  const decoded = document.toJS();
80
87
  if (decoded === null || typeof decoded !== "object" || Array.isArray(decoded)) {
81
- throw new TypeError("Archetype frontmatter must be one mapping");
88
+ throw new TypeError("Akuma frontmatter must be one mapping");
82
89
  }
83
90
  const values = decoded;
84
91
  const provider = archetypeField(values, "provider", true);
92
+ if ("access" in values)
93
+ throw new TypeError("Akuma access is not supported; use readonly: true");
85
94
  const model = archetypeField(values, "model");
86
95
  const effort = archetypeField(values, "effort");
87
- const access = archetypeEnum(values, "access", ["read", "write", "auto"]);
96
+ const readonly = archetypeReadonly(values);
88
97
  const network = archetypeEnum(values, "network", ["disabled", "enabled"]);
89
98
  const description = archetypeField(values, "description");
90
99
  const systemPrompt = lines.slice(closing + 1).join("\n");
@@ -96,12 +105,33 @@ function decodeArchetype(name, path, markdown) {
96
105
  options: decodeProviderOptions({
97
106
  ...(model === undefined ? {} : { model }),
98
107
  ...(effort === undefined ? {} : { effort }),
99
- ...(access === undefined ? {} : { access }),
108
+ ...(readonly === undefined ? {} : { readonly }),
100
109
  ...(network === undefined ? {} : { network }),
101
- systemPrompt,
110
+ ...(systemPrompt.length === 0 ? {} : { systemPrompt }),
102
111
  }),
103
112
  });
104
113
  }
114
+ export async function listArchetypeDefinitions(input) {
115
+ // Reads still run concurrently, but the reported failure is the first invalid
116
+ // definition in catalog byte order, not whichever read happened to finish first.
117
+ const settled = await Promise.allSettled((await archetypePaths(input.settings)).map(async ({ name, path }) => {
118
+ try {
119
+ const definition = decodeArchetype(name, path, await readFile(path, "utf8"));
120
+ return Object.freeze({
121
+ name: definition.name,
122
+ ...(definition.options.model === undefined ? {} : { model: definition.options.model }),
123
+ ...(definition.description === undefined ? {} : { description: definition.description }),
124
+ });
125
+ }
126
+ catch (error) {
127
+ throw new AkumaArchetypeError(name, [path], `is invalid: ${error instanceof Error ? error.message : String(error)}`);
128
+ }
129
+ }));
130
+ const firstInvalid = settled.find((result) => result.status === "rejected");
131
+ if (firstInvalid !== undefined)
132
+ throw firstInvalid.reason;
133
+ return settled.map((result) => result.value);
134
+ }
105
135
  function record(value) {
106
136
  return value !== null && typeof value === "object" && !Array.isArray(value)
107
137
  ? value : null;
@@ -123,7 +153,7 @@ function configuredProvider(name, selected) {
123
153
  if (unknown !== undefined)
124
154
  throw new TypeError(`provider ${name} has unknown field ${unknown}`);
125
155
  optionalProviderText(value, name, "description");
126
- return decodeProviderExecution({
156
+ return decodeProviderRecipe({
127
157
  name,
128
158
  kind: value.kind,
129
159
  ...(value.executable === undefined ? {} : { executable: value.executable }),
@@ -131,6 +161,16 @@ function configuredProvider(name, selected) {
131
161
  ...(value.env === undefined ? {} : { env: value.env }),
132
162
  });
133
163
  }
164
+ const BUILTIN_EXECUTIONS = {
165
+ claude: { kind: "claude-agent-sdk" },
166
+ "codex-app-server": { kind: "codex-app-server" },
167
+ "opencode-sdk": { kind: "opencode-sdk" },
168
+ pi: { kind: "pi" },
169
+ "grok-build": {
170
+ kind: "grok-build",
171
+ executable: "grok",
172
+ },
173
+ };
134
174
  function providerExecution(settings, name) {
135
175
  const view = settings.namespace("providers");
136
176
  if (view.kind === "failed")
@@ -138,43 +178,49 @@ function providerExecution(settings, name) {
138
178
  const selected = view.entries.find((entry) => entry.name === name)?.value;
139
179
  if (selected !== undefined)
140
180
  return configuredProvider(name, selected);
141
- if (name === "claude")
142
- return Object.freeze({ name, kind: "claude-agent-sdk" });
143
- if (name === "codex-app-server")
144
- return Object.freeze({ name, kind: "codex-app-server" });
181
+ const builtin = BUILTIN_EXECUTIONS[name];
182
+ if (builtin !== undefined)
183
+ return decodeProviderRecipe({ name, ...builtin });
145
184
  throw new TypeError(`unknown provider ${name}`);
146
185
  }
147
186
  function admitArchetype(archetype, settings) {
148
- let execution;
187
+ let selected;
149
188
  try {
150
- execution = providerExecution(settings, archetype.provider);
189
+ selected = resolveProviderExecution(providerExecution(settings, archetype.provider));
151
190
  }
152
191
  catch (error) {
153
192
  if (error instanceof TypeError)
154
193
  throw new AkumaArchetypeError(archetype.name, [archetype.path], `uses ${error.message}`);
155
194
  throw error;
156
195
  }
157
- const adapter = providerNamed(execution);
196
+ const execution = selected.execution;
197
+ const adapter = selected.adapter;
158
198
  const admission = adapter.admitOptions(archetype.options);
159
199
  if (admission.kind === "refused") {
160
200
  throw new AkumaArchetypeError(archetype.name, [archetype.path], `is unsupported: ${admission.diagnostic}`);
161
201
  }
162
- return Object.freeze({ ...archetype, provider: execution, adapter, options: admission.options });
202
+ return Object.freeze({
203
+ ...archetype,
204
+ provider: execution,
205
+ adapter,
206
+ options: admission.options,
207
+ ...(admission.readonly === undefined ? {} : { readonly: admission.readonly }),
208
+ });
163
209
  }
164
- export function loadArchetype(input) {
210
+ export async function loadArchetype(input) {
165
211
  const name = archetypeName(input.name);
166
212
  const directory = archetypeDirectory(input.settings);
213
+ const missing = () => new AkumaArchetypeError(name, directory === null ? [] : [join(directory, `${name}.md`)], "was not found", "use `keiyaku ls aku/` to list available Akuma");
167
214
  if (directory === null)
168
- throw new AkumaArchetypeError(name, [], "has no user Settings coordinate");
215
+ throw missing();
169
216
  const path = join(directory, `${name}.md`);
170
217
  let markdown;
171
218
  try {
172
- markdown = readFileSync(path, "utf8");
219
+ markdown = await readFile(path, "utf8");
173
220
  }
174
221
  catch (error) {
175
- if (error.code === "ENOENT") {
176
- throw new AkumaArchetypeError(name, [path], "was not found");
177
- }
222
+ if (error.code === "ENOENT")
223
+ throw missing();
178
224
  throw new AkumaArchetypeError(name, [path], `could not be read: ${error instanceof Error ? error.message : String(error)}`);
179
225
  }
180
226
  try {
@@ -2,7 +2,7 @@ import { type SessionFact, type Soul } from "./heart/index.js";
2
2
  import type { AkumaPaths } from "./identity.js";
3
3
  import { type ProviderAdapter } from "./provider.js";
4
4
  import { type RequestChildLaunch } from "./requests.js";
5
- import { type ProcessCollar } from "../runtime/proc/run.js";
5
+ export declare const CONTROL_RESPONSE_MS = 1000;
6
6
  export type BodyLaunch = Readonly<{
7
7
  paths: AkumaPaths;
8
8
  seed?: Omit<Soul, "createdAt">;
@@ -10,11 +10,9 @@ export type BodyLaunch = Readonly<{
10
10
  initialBody?: string;
11
11
  }>;
12
12
  type BodyRuntime = Readonly<{
13
- collar: ProcessCollar;
14
13
  now(): string;
15
- putDownOwnTree(collar: ProcessCollar): Promise<void>;
16
- spawnChild?(launch: RequestChildLaunch): Promise<ProcessCollar>;
14
+ spawnChild?(launch: RequestChildLaunch): Promise<void>;
17
15
  }>;
18
16
  export declare function driveAkumaBody(launch: BodyLaunch, adapter?: ProviderAdapter, runtime?: BodyRuntime): Promise<void>;
19
- export declare function spawnAkumaBody(launch: BodyLaunch): Promise<ProcessCollar>;
17
+ export declare function spawnAkumaBody(launch: BodyLaunch): Promise<void>;
20
18
  export {};