@astrosheep/keiyaku 4.5.29 → 4.6.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 (418) hide show
  1. package/build/integrations/marketplace/plugins/keiyaku/skills/keiyaku/SKILL.md +0 -13
  2. package/build/integrations/marketplace/plugins/keiyaku/skills/keiyaku-akuma/SKILL.md +47 -78
  3. package/build/integrations/marketplace/plugins/keiyaku/skills/keiyaku-akuma/references/automation.md +54 -41
  4. package/build/integrations/marketplace/plugins/keiyaku/skills/keiyaku-babysit/SKILL.md +10 -0
  5. package/build/integrations/marketplace/plugins/keiyaku/skills/keiyaku-bind/SKILL.md +27 -9
  6. package/build/integrations/marketplace/plugins/keiyaku/skills/keiyaku-workflow/SKILL.md +68 -71
  7. package/build/src/akuma/akuma-call.d.ts +53 -0
  8. package/build/src/akuma/akuma-call.js +113 -0
  9. package/build/src/akuma/akuma-instance.d.ts +20 -18
  10. package/build/src/akuma/akuma-instance.js +65 -175
  11. package/build/src/akuma/akuma-observe.d.ts +3 -21
  12. package/build/src/akuma/akuma-observe.js +7 -24
  13. package/build/src/akuma/{akuma-handle.d.ts → akuma-owner.d.ts} +55 -27
  14. package/build/src/akuma/{akuma-handle.js → akuma-owner.js} +24 -23
  15. package/build/src/akuma/akuma-selection-execution.d.ts +51 -0
  16. package/build/src/akuma/akuma-selection-execution.js +134 -0
  17. package/build/src/akuma/{fleet-execution.d.ts → akuma-wait.d.ts} +24 -44
  18. package/build/src/akuma/akuma-wait.js +113 -0
  19. package/build/src/akuma/akuma.d.ts +35 -89
  20. package/build/src/akuma/akuma.js +148 -30
  21. package/build/src/akuma/archetype.d.ts +12 -0
  22. package/build/src/akuma/archetype.js +47 -19
  23. package/build/src/akuma/body.d.ts +76 -36
  24. package/build/src/akuma/body.js +84 -49
  25. package/build/src/akuma/call-initial-tell.d.ts +131 -22
  26. package/build/src/akuma/call-initial-tell.js +31 -1
  27. package/build/src/akuma/call-request.d.ts +237 -31
  28. package/build/src/akuma/call-request.js +67 -94
  29. package/build/src/akuma/coordinate.d.ts +15 -5
  30. package/build/src/akuma/coordinate.js +12 -22
  31. package/build/src/akuma/dispatch-association.d.ts +1 -1
  32. package/build/src/akuma/dispatch-association.js +1 -10
  33. package/build/src/akuma/heart/activity-schema.d.ts +325 -0
  34. package/build/src/akuma/heart/activity-schema.js +53 -0
  35. package/build/src/akuma/heart/facts.d.ts +1 -6
  36. package/build/src/akuma/heart/index.d.ts +3 -1
  37. package/build/src/akuma/heart/index.js +4 -1
  38. package/build/src/akuma/heart/rows.d.ts +49 -2
  39. package/build/src/akuma/heart/rows.js +16 -2
  40. package/build/src/akuma/heart/soul.d.ts +1 -0
  41. package/build/src/akuma/heart/soul.js +6 -4
  42. package/build/src/akuma/heart/tells.d.ts +1 -0
  43. package/build/src/akuma/heart/tells.js +18 -0
  44. package/build/src/akuma/identity.d.ts +10 -7
  45. package/build/src/akuma/identity.js +23 -0
  46. package/build/src/akuma/index.d.ts +10 -8
  47. package/build/src/akuma/index.js +2 -2
  48. package/build/src/akuma/nuke.d.ts +3 -0
  49. package/build/src/akuma/nuke.js +13 -7
  50. package/build/src/akuma/projection.d.ts +0 -5
  51. package/build/src/akuma/projection.js +22 -43
  52. package/build/src/akuma/provider-recipe.d.ts +58 -13
  53. package/build/src/akuma/provider-recipe.js +62 -80
  54. package/build/src/akuma/provider.d.ts +6 -76
  55. package/build/src/akuma/provider.js +11 -219
  56. package/build/src/akuma/providers/acp/config.d.ts +2 -0
  57. package/build/src/akuma/providers/acp/config.js +26 -1
  58. package/build/src/akuma/providers/acp/core.d.ts +7 -0
  59. package/build/src/akuma/providers/acp/core.js +49 -18
  60. package/build/src/akuma/providers/acp/index.js +14 -6
  61. package/build/src/akuma/providers/grok-build/index.js +44 -13
  62. package/build/src/akuma/providers/index.d.ts +3 -3
  63. package/build/src/akuma/providers/index.js +2 -13
  64. package/build/src/akuma/providers/opencode-sdk/event-stream.d.ts +28 -0
  65. package/build/src/akuma/providers/opencode-sdk/event-stream.js +92 -0
  66. package/build/src/akuma/providers/opencode-sdk/events.d.ts +0 -1
  67. package/build/src/akuma/providers/opencode-sdk/index.js +200 -64
  68. package/build/src/akuma/providers/opencode-sdk/session.d.ts +41 -1
  69. package/build/src/akuma/providers/opencode-sdk/session.js +69 -2
  70. package/build/src/akuma/providers/pi/events.js +5 -2
  71. package/build/src/akuma/providers/pi/index.d.ts +3 -4
  72. package/build/src/akuma/providers/pi/index.js +99 -45
  73. package/build/src/akuma/publication.d.ts +84 -3
  74. package/build/src/akuma/publication.js +145 -2
  75. package/build/src/akuma/read-pool.d.ts +2 -0
  76. package/build/src/akuma/read-pool.js +15 -0
  77. package/build/src/akuma/request-rendezvous.js +10 -0
  78. package/build/src/akuma/request-serve.js +7 -0
  79. package/build/src/akuma/request-wire.d.ts +14 -26
  80. package/build/src/akuma/request-wire.js +4 -0
  81. package/build/src/akuma/requests.d.ts +0 -2
  82. package/build/src/akuma/requests.js +0 -17
  83. package/build/src/akuma/{fleet-observation.d.ts → selection-observation.d.ts} +37 -36
  84. package/build/src/akuma/selection-observation.js +65 -0
  85. package/build/src/akuma/{fleet-owner-port.d.ts → selection-owner-port.d.ts} +3 -3
  86. package/build/src/akuma/{fleet-owner-port.js → selection-owner-port.js} +11 -17
  87. package/build/src/akuma/{fleet-request.d.ts → selection-request.d.ts} +42 -82
  88. package/build/src/akuma/{fleet-request.js → selection-request.js} +92 -136
  89. package/build/src/akuma/turn-drive.js +73 -14
  90. package/build/src/akuma-body.js +91 -56
  91. package/build/src/body/amend.d.ts +5 -0
  92. package/build/src/body/amend.js +26 -50
  93. package/build/src/body/arc.d.ts +4 -2
  94. package/build/src/body/arc.js +19 -26
  95. package/build/src/body/criteria.d.ts +6 -0
  96. package/build/src/body/criteria.js +37 -0
  97. package/build/src/body/decode.js +5 -42
  98. package/build/src/body/region.d.ts +5 -0
  99. package/build/src/body/region.js +45 -2
  100. package/build/src/body/render.js +2 -4
  101. package/build/src/cli/activity.d.ts +26 -0
  102. package/build/src/cli/activity.js +75 -0
  103. package/build/src/cli/actor.d.ts +3 -1
  104. package/build/src/cli/actor.js +15 -2
  105. package/build/src/cli/commands/akuma-grammar.d.ts +75 -0
  106. package/build/src/cli/commands/akuma-grammar.js +414 -0
  107. package/build/src/cli/commands/akuma.d.ts +5 -69
  108. package/build/src/cli/commands/akuma.js +352 -319
  109. package/build/src/cli/commands/amend.d.ts +4 -5
  110. package/build/src/cli/commands/amend.js +1 -2
  111. package/build/src/cli/commands/bind.d.ts +4 -5
  112. package/build/src/cli/commands/bind.js +7 -10
  113. package/build/src/cli/commands/contract-grammar.d.ts +112 -0
  114. package/build/src/cli/commands/contract-grammar.js +282 -0
  115. package/build/src/cli/commands/contract-help.d.ts +17 -22
  116. package/build/src/cli/commands/contract-help.js +37 -24
  117. package/build/src/cli/commands/contract.d.ts +18 -97
  118. package/build/src/cli/commands/contract.js +621 -233
  119. package/build/src/cli/commands/install.d.ts +1 -1
  120. package/build/src/cli/commands/install.js +2 -2
  121. package/build/src/cli/commands/task-grammar.d.ts +19 -0
  122. package/build/src/cli/commands/task-grammar.js +438 -0
  123. package/build/src/cli/commands/task-query.js +23 -104
  124. package/build/src/cli/commands/task.d.ts +5 -20
  125. package/build/src/cli/commands/task.js +414 -364
  126. package/build/src/cli/coordinates.d.ts +10 -0
  127. package/build/src/cli/coordinates.js +20 -0
  128. package/build/src/cli/draft.d.ts +7 -1
  129. package/build/src/cli/main.js +10 -1
  130. package/build/src/cli/parse.d.ts +8 -9
  131. package/build/src/cli/parse.js +62 -62
  132. package/build/src/cli/render/akuma-activity.d.ts +54 -36
  133. package/build/src/cli/render/akuma-activity.js +262 -242
  134. package/build/src/cli/render/akuma-tool.d.ts +8 -4
  135. package/build/src/cli/render/akuma-tool.js +6 -5
  136. package/build/src/cli/render/akuma.d.ts +36 -16
  137. package/build/src/cli/render/akuma.js +65 -132
  138. package/build/src/cli/render/audit.d.ts +6 -2
  139. package/build/src/cli/render/audit.js +59 -28
  140. package/build/src/cli/render/catalog.d.ts +11 -2
  141. package/build/src/cli/render/catalog.js +75 -95
  142. package/build/src/cli/render/contract-history.d.ts +3 -1
  143. package/build/src/cli/render/contract-history.js +215 -22
  144. package/build/src/cli/render/contract-observation.d.ts +10 -5
  145. package/build/src/cli/render/contract-observation.js +29 -46
  146. package/build/src/cli/render/contract.d.ts +10 -3
  147. package/build/src/cli/render/contract.js +252 -103
  148. package/build/src/cli/render/effects.d.ts +26 -0
  149. package/build/src/cli/render/effects.js +41 -0
  150. package/build/src/cli/render/execution-progress.d.ts +18 -6
  151. package/build/src/cli/render/execution-progress.js +34 -31
  152. package/build/src/cli/render/kanshi-akuma.d.ts +1 -2
  153. package/build/src/cli/render/kanshi-akuma.js +5 -26
  154. package/build/src/cli/render/kanshi.js +107 -128
  155. package/build/src/cli/render/marks.d.ts +13 -0
  156. package/build/src/cli/render/marks.js +74 -0
  157. package/build/src/cli/render/nuke.js +18 -7
  158. package/build/src/cli/render/receipt.d.ts +10 -4
  159. package/build/src/cli/render/receipt.js +124 -44
  160. package/build/src/cli/render/reconcile.d.ts +5 -0
  161. package/build/src/cli/render/reconcile.js +152 -0
  162. package/build/src/cli/render/refusal.d.ts +21 -4
  163. package/build/src/cli/render/refusal.js +60 -33
  164. package/build/src/cli/render/region.js +3 -2
  165. package/build/src/cli/render/settings.js +2 -12
  166. package/build/src/cli/render/task.d.ts +37 -6
  167. package/build/src/cli/render/task.js +161 -157
  168. package/build/src/cli/render/terminal.d.ts +20 -1
  169. package/build/src/cli/render/terminal.js +92 -18
  170. package/build/src/cli/runtime.d.ts +32 -8
  171. package/build/src/cli/runtime.js +157 -165
  172. package/build/src/cli/selectors.d.ts +5 -2
  173. package/build/src/cli/selectors.js +11 -3
  174. package/build/src/cli/streams.d.ts +11 -0
  175. package/build/src/cli/streams.js +32 -0
  176. package/build/src/cli/usage.d.ts +2 -0
  177. package/build/src/cli/usage.js +12 -8
  178. package/build/src/contract-guidance.js +3 -7
  179. package/build/src/contract-worktree.d.ts +20 -28
  180. package/build/src/contract-worktree.js +18 -70
  181. package/build/src/coordination/durable-file.d.ts +2 -2
  182. package/build/src/coordination/durable-file.js +0 -27
  183. package/build/src/core/facts/codec.d.ts +1 -2
  184. package/build/src/core/facts/codec.js +6 -7
  185. package/build/src/core/facts/gate.d.ts +0 -1
  186. package/build/src/core/facts/gate.js +0 -82
  187. package/build/src/core/facts/types.d.ts +1 -2
  188. package/build/src/core/verbs/abandon.d.ts +2 -6
  189. package/build/src/core/verbs/abandon.js +0 -16
  190. package/build/src/core/verbs/amend.d.ts +0 -1
  191. package/build/src/core/verbs/amend.js +0 -20
  192. package/build/src/core/verbs/arc.d.ts +7 -8
  193. package/build/src/core/verbs/arc.js +2 -19
  194. package/build/src/core/verbs/attestation.d.ts +2 -6
  195. package/build/src/core/verbs/attestation.js +0 -16
  196. package/build/src/core/verbs/bind.d.ts +0 -1
  197. package/build/src/core/verbs/bind.js +0 -16
  198. package/build/src/core/verbs/deliver.d.ts +0 -1
  199. package/build/src/core/verbs/deliver.js +0 -16
  200. package/build/src/core/verbs/placement.d.ts +2 -1
  201. package/build/src/core/verbs/placement.js +10 -59
  202. package/build/src/git/admission.d.ts +6 -4
  203. package/build/src/git/admission.js +4 -0
  204. package/build/src/git/hooks.d.ts +55 -30
  205. package/build/src/git/hooks.js +30 -3
  206. package/build/src/git/identity.d.ts +6 -0
  207. package/build/src/git/identity.js +47 -0
  208. package/build/src/git/integration.d.ts +31 -13
  209. package/build/src/git/integration.js +32 -1
  210. package/build/src/git/nuke.d.ts +10 -1
  211. package/build/src/git/nuke.js +31 -11
  212. package/build/src/git/observe.js +2 -15
  213. package/build/src/git/private-state-seat.d.ts +6 -7
  214. package/build/src/git/private-state-seat.js +8 -6
  215. package/build/src/git/read-observation.d.ts +6 -1
  216. package/build/src/git/read-observation.js +81 -46
  217. package/build/src/git/reconcile.d.ts +117 -40
  218. package/build/src/git/reconcile.js +169 -40
  219. package/build/src/git/scratch.d.ts +7 -4
  220. package/build/src/git/scratch.js +28 -6
  221. package/build/src/git/target-placement.d.ts +53 -38
  222. package/build/src/git/target-placement.js +69 -54
  223. package/build/src/git/tender.d.ts +37 -28
  224. package/build/src/git/tender.js +39 -0
  225. package/build/src/git/terminal-reconcile.js +21 -23
  226. package/build/src/git/terminal-seal.d.ts +8 -6
  227. package/build/src/git/terminal-seal.js +10 -0
  228. package/build/src/git/workspace.d.ts +29 -15
  229. package/build/src/git/workspace.js +28 -2
  230. package/build/src/identity/normalize.js +19 -6
  231. package/build/src/index.d.ts +78 -7
  232. package/build/src/index.js +52 -4
  233. package/build/src/kanshi/read.d.ts +3 -3
  234. package/build/src/kanshi/read.js +21 -21
  235. package/build/src/kanshi/report.d.ts +9 -8
  236. package/build/src/kanshi/roster.d.ts +2 -0
  237. package/build/src/kanshi/roster.js +2 -0
  238. package/build/src/kanshi/select.js +7 -3
  239. package/build/src/library/address.d.ts +3 -7
  240. package/build/src/library/address.js +7 -7
  241. package/build/src/library/akuma-creation.d.ts +21 -32
  242. package/build/src/library/akuma-creation.js +148 -165
  243. package/build/src/library/akumas.d.ts +20 -22
  244. package/build/src/library/akumas.js +43 -20
  245. package/build/src/library/bind.d.ts +107 -13
  246. package/build/src/library/bind.js +29 -23
  247. package/build/src/library/continuation.d.ts +556 -28
  248. package/build/src/library/continuation.js +29 -54
  249. package/build/src/library/contract-composition.d.ts +40 -0
  250. package/build/src/library/contract-composition.js +105 -0
  251. package/build/src/library/contract-creation.d.ts +7 -0
  252. package/build/src/library/contract-creation.js +192 -0
  253. package/build/src/library/contract-execution.d.ts +29 -40
  254. package/build/src/library/contract-execution.js +503 -128
  255. package/build/src/library/contract-operations.d.ts +275 -134
  256. package/build/src/library/contract-operations.js +83 -92
  257. package/build/src/library/contract-outcomes.d.ts +71 -0
  258. package/build/src/library/contract-outcomes.js +32 -0
  259. package/build/src/library/contract-settings.d.ts +25 -0
  260. package/build/src/library/contract-settings.js +135 -0
  261. package/build/src/library/contract-types.d.ts +17 -38
  262. package/build/src/library/delivery.d.ts +530 -10
  263. package/build/src/library/delivery.js +20 -45
  264. package/build/src/library/input.d.ts +3 -1
  265. package/build/src/library/input.js +11 -16
  266. package/build/src/library/invocation.d.ts +87 -0
  267. package/build/src/library/invocation.js +290 -0
  268. package/build/src/library/keiyaku.d.ts +45 -22
  269. package/build/src/library/keiyaku.js +134 -8
  270. package/build/src/library/nuke.d.ts +2 -11
  271. package/build/src/library/nuke.js +70 -57
  272. package/build/src/library/outcome.d.ts +13196 -0
  273. package/build/src/library/outcome.js +487 -0
  274. package/build/src/library/reconcile.d.ts +96 -24
  275. package/build/src/library/reconcile.js +102 -42
  276. package/build/src/library/refusal.d.ts +470 -42
  277. package/build/src/library/refusal.js +55 -143
  278. package/build/src/library/region.d.ts +15 -7
  279. package/build/src/library/region.js +23 -3
  280. package/build/src/library/repo.d.ts +2 -12
  281. package/build/src/library/repo.js +1 -22
  282. package/build/src/library/selection.d.ts +121 -0
  283. package/build/src/library/{fleet.js → selection.js} +169 -152
  284. package/build/src/plugin/public.d.ts +2 -0
  285. package/build/src/protocol/abandon.d.ts +2 -2
  286. package/build/src/protocol/abandon.js +1 -0
  287. package/build/src/protocol/amend.js +1 -0
  288. package/build/src/protocol/arc.d.ts +6 -4
  289. package/build/src/protocol/attempt.d.ts +4 -2
  290. package/build/src/protocol/attempt.js +10 -0
  291. package/build/src/protocol/audit.d.ts +255 -52
  292. package/build/src/protocol/audit.js +63 -5
  293. package/build/src/protocol/bind.d.ts +18 -17
  294. package/build/src/protocol/bind.js +9 -28
  295. package/build/src/protocol/completion.d.ts +256 -22
  296. package/build/src/protocol/completion.js +100 -12
  297. package/build/src/protocol/deliver.d.ts +34 -23
  298. package/build/src/protocol/deliver.js +39 -25
  299. package/build/src/protocol/execution-observation.d.ts +36 -37
  300. package/build/src/protocol/execution-observation.js +7 -9
  301. package/build/src/protocol/intent.d.ts +101 -30
  302. package/build/src/protocol/intent.js +74 -1
  303. package/build/src/protocol/operations.d.ts +570 -64
  304. package/build/src/protocol/operations.js +189 -9
  305. package/build/src/protocol/outcome.d.ts +2 -1
  306. package/build/src/protocol/placement.d.ts +2 -2
  307. package/build/src/protocol/placement.js +3 -1
  308. package/build/src/protocol/progress.d.ts +108 -65
  309. package/build/src/protocol/progress.js +82 -132
  310. package/build/src/protocol/read/status.d.ts +4 -3
  311. package/build/src/protocol/read/status.js +6 -5
  312. package/build/src/protocol/reconcile.d.ts +3 -3
  313. package/build/src/protocol/reconcile.js +4 -0
  314. package/build/src/protocol/reintegrate.d.ts +2 -2
  315. package/build/src/protocol/review.d.ts +30 -12
  316. package/build/src/protocol/review.js +15 -24
  317. package/build/src/protocol/run.d.ts +34 -5
  318. package/build/src/protocol/run.js +24 -12
  319. package/build/src/runtime/proc/windows-launch.exe +0 -0
  320. package/build/src/settings.d.ts +0 -10
  321. package/build/src/settings.js +0 -76
  322. package/build/src/settlement/holder.d.ts +1 -1
  323. package/build/src/settlement/settle.d.ts +25 -16
  324. package/build/src/settlement/settle.js +80 -20
  325. package/build/src/task/board.d.ts +3 -1
  326. package/build/src/task/board.js +13 -17
  327. package/build/src/task/catalog.d.ts +0 -4
  328. package/build/src/task/catalog.js +0 -15
  329. package/build/src/task/compose-language.d.ts +19 -9
  330. package/build/src/task/compose-language.js +30 -20
  331. package/build/src/task/compose.d.ts +7 -37
  332. package/build/src/task/compose.js +20 -2
  333. package/build/src/task/created-observation.d.ts +0 -1
  334. package/build/src/task/created-observation.js +1 -4
  335. package/build/src/task/document.d.ts +12 -2
  336. package/build/src/task/document.js +4 -0
  337. package/build/src/task/identity.d.ts +4 -1
  338. package/build/src/task/identity.js +21 -17
  339. package/build/src/task/index.d.ts +36 -16
  340. package/build/src/task/index.js +103 -96
  341. package/build/src/task/lifecycle-operations.d.ts +1 -1
  342. package/build/src/task/mutation-result.d.ts +647 -586
  343. package/build/src/task/mutation-result.js +79 -46
  344. package/build/src/task/mutation.d.ts +298 -270
  345. package/build/src/task/mutation.js +93 -110
  346. package/build/src/task/operation-types.d.ts +6 -49
  347. package/build/src/task/operations.d.ts +2 -1
  348. package/build/src/task/operations.js +35 -12
  349. package/build/src/task/query.d.ts +9 -3
  350. package/build/src/task/query.js +42 -16
  351. package/build/src/task/store.d.ts +2 -1
  352. package/build/src/task/store.js +10 -14
  353. package/build/src/verification/declaration.d.ts +0 -1
  354. package/build/src/verification/declaration.js +1 -18
  355. package/build/src/verification/execution.d.ts +6 -2
  356. package/build/src/verification/observation.d.ts +1 -1
  357. package/package.json +2 -18
  358. package/build/src/akuma/akuma-product.d.ts +0 -58
  359. package/build/src/akuma/akuma-product.js +0 -276
  360. package/build/src/akuma/fleet-execution.js +0 -234
  361. package/build/src/akuma/fleet-observation.js +0 -97
  362. package/build/src/cli/accepted.d.ts +0 -24
  363. package/build/src/cli/accepted.js +0 -167
  364. package/build/src/cli/catalog.d.ts +0 -45
  365. package/build/src/cli/catalog.js +0 -1
  366. package/build/src/cli/commands/akuma-invoke.d.ts +0 -114
  367. package/build/src/cli/commands/akuma-invoke.js +0 -375
  368. package/build/src/cli/commands/contract-invoke.d.ts +0 -34
  369. package/build/src/cli/commands/contract-invoke.js +0 -259
  370. package/build/src/cli/commands/nuke.d.ts +0 -10
  371. package/build/src/cli/commands/nuke.js +0 -20
  372. package/build/src/cli/commands/status-set.d.ts +0 -4
  373. package/build/src/cli/commands/status-set.js +0 -52
  374. package/build/src/cli/commands/task-invoke.d.ts +0 -49
  375. package/build/src/cli/commands/task-invoke.js +0 -306
  376. package/build/src/cli/invoke.d.ts +0 -27
  377. package/build/src/cli/invoke.js +0 -521
  378. package/build/src/cli/render/board.d.ts +0 -3
  379. package/build/src/cli/render/board.js +0 -25
  380. package/build/src/cli/render/status-set.d.ts +0 -5
  381. package/build/src/cli/render/status-set.js +0 -19
  382. package/build/src/cli/render/text.d.ts +0 -3
  383. package/build/src/cli/render/text.js +0 -33
  384. package/build/src/cli/result.d.ts +0 -240
  385. package/build/src/cli/result.js +0 -1
  386. package/build/src/git/result-codec.d.ts +0 -29
  387. package/build/src/git/result-codec.js +0 -309
  388. package/build/src/kanshi/fleet.d.ts +0 -6
  389. package/build/src/kanshi/fleet.js +0 -27
  390. package/build/src/library/audit.d.ts +0 -29
  391. package/build/src/library/audit.js +0 -41
  392. package/build/src/library/composition.d.ts +0 -15
  393. package/build/src/library/composition.js +0 -28
  394. package/build/src/library/configuration.d.ts +0 -4
  395. package/build/src/library/configuration.js +0 -2
  396. package/build/src/library/contract-bind.d.ts +0 -31
  397. package/build/src/library/contract-bind.js +0 -140
  398. package/build/src/library/contract-forwarding.d.ts +0 -55
  399. package/build/src/library/contract-forwarding.js +0 -67
  400. package/build/src/library/contract-handle.d.ts +0 -50
  401. package/build/src/library/contract-handle.js +0 -385
  402. package/build/src/library/contract.d.ts +0 -46
  403. package/build/src/library/contract.js +0 -73
  404. package/build/src/library/execution-result.d.ts +0 -243
  405. package/build/src/library/execution-result.js +0 -101
  406. package/build/src/library/execution.d.ts +0 -8
  407. package/build/src/library/execution.js +0 -102
  408. package/build/src/library/fleet.d.ts +0 -83
  409. package/build/src/library/mutation.d.ts +0 -501
  410. package/build/src/library/mutation.js +0 -248
  411. package/build/src/library/result-codec.d.ts +0 -2
  412. package/build/src/library/result-codec.js +0 -12
  413. package/build/src/protocol/result-codec.d.ts +0 -23
  414. package/build/src/protocol/result-codec.js +0 -488
  415. package/build/src/settlement/result-codec.d.ts +0 -2
  416. package/build/src/settlement/result-codec.js +0 -56
  417. package/build/src/task/public.d.ts +0 -2
  418. package/build/src/task/public.js +0 -1
@@ -1,355 +1,388 @@
1
- import { CliUsageError, commandGuide, isBlankInput, usageLine } from "../usage.js";
2
- import { parseDuration as decodeDuration } from "../../duration.js";
3
- import { parseAkumaAlias, parseAkumaGlob } from "../../identity/selector.js";
4
- import { ALLOWED_ACTIONS, DEFAULT_ALLOWED_ACTIONS, decodeAllowedActions, } from "../../akuma/allowed.js";
5
- import { parsePublicHistoryId } from "../../akuma/identity.js";
6
- const AKUMA_COMMAND_SPECS = {
7
- call: {
8
- arity: 1,
9
- stdin: true,
10
- flags: {
11
- contract: "value",
12
- alias: "value",
13
- wait: "value",
14
- allowed: "repeatable",
15
- json: "boolean",
16
- schema: "value",
17
- },
18
- usage: "call <akuma-name> [--contract <kei/...>] [--workdir <path>] [--alias <name>] [--allowed <product.action>]... [--schema <file>] [--wait <duration>] (<prompt> | -)",
19
- purpose: "Call an Akuma into the world with one prompt.",
20
- details: [
21
- "Give <prompt> as one argument, or use - to read stdin.",
22
- "By default, start returns once the Akuma is created; --wait also waits for its first answer, up to the given duration.",
23
- "--contract assigns the Akuma work from that Contract; it does not choose where the Akuma works.",
24
- "--workdir selects where the Akuma works; relative paths start from your current directory. Without it, the current directory is used.",
25
- "--alias <name> gives the new Akuma the selector @name; use it instead of aku/<id>.",
26
- `Available actions: ${ALLOWED_ACTIONS.join(", ")}.`,
27
- `Default actions: ${DEFAULT_ALLOWED_ACTIONS.join(", ")}.`,
28
- "Repeated --allowed adds actions to the selected Akuma's allowed actions; it cannot remove inherited permissions.",
29
- "If no actions are configured, defaults apply; an explicitly empty list allows none.",
30
- "An Akuma started by another Akuma can use only actions its parent can use. status <aku/...|@alias> shows that Akuma's allowed actions.",
31
- "--schema checks the Akuma's answer against a JSON Schema file; stdin is still the prompt source.",
32
- "On success, the Akuma is assigned to the Contract; if @name is already in use, --alias reassigns it to this Akuma.",
33
- "With --wait, completed activity streams on stderr and the final answer is written to stdout once.",
34
- ].join("\n"),
35
- },
36
- wait: {
37
- arity: "one-or-more",
38
- stdin: false,
39
- flags: { any: "boolean", all: "boolean", timeout: "value", json: "boolean" },
40
- usage: "wait <akuma-selector>... [--any | --all] [--timeout <duration>]",
41
- purpose: "Wait for one or more Akumas to finish work.",
42
- details: [
43
- "Without --any or --all the mode is any: the wait returns when any selected Akuma completes.",
44
- "--all waits until every selected Akuma completes.",
45
- "An already completed member counts immediately, so repeating a selection can return at once.",
46
- "Akuma names, completed activity, and the final result stream on stderr.",
47
- "A streamed plural wait leaves stdout empty, and so does a single wait with no answer.",
48
- "Only a single selected Akuma that answered writes to stdout, exactly its answer.",
49
- "With --json nothing streams and stdout carries the result document.",
50
- ].join("\n"),
51
- },
52
- tell: {
53
- arity: 1,
54
- stdin: true,
55
- flags: { interrupt: "boolean", schema: "value", wait: "value", json: "boolean" },
56
- usage: "tell <aku/...|@alias> [--interrupt] [--schema <file>] [--wait <duration>] (<prompt> | -)",
57
- purpose: "Send a prompt to an Akuma and wake it to respond.",
58
- details: [
59
- "Give <prompt> as one argument, or use - to read stdin.",
60
- "--interrupt ends the Akuma's current work before accepting the new prompt and waking it again.",
61
- "--schema reads a JSON Schema file for the answer contract; stdin remains the prompt source.",
62
- "--wait waits for the answer to this prompt, for the supplied duration after it is accepted.",
63
- "With --wait, completed activity streams on stderr and the final answer is written to stdout once.",
64
- ].join("\n"),
65
- },
66
- history: {
67
- arity: 1,
68
- stdin: false,
69
- flags: { id: "value", before: "value", since: "value", limit: "value", last: "boolean", json: "boolean" },
70
- usage: "history <aku/...|@alias> [--id <historyId> | --before <index> | --since <index>] [--limit <count>] [--last]\nhistory <kei/...>",
71
- purpose: "Read an Akuma's answers and activity, or a Contract's history of changes and assigned work.",
72
- details: [
73
- "--id reads the exact retained answered turn (turn/<number>).",
74
- "--before <index> pages older rows before that sequence; --since <index> pages newer rows after it.",
75
- "--limit bounds page size (default 12); without --since, the latest rows are shown.",
76
- "With --since, paging starts at the earliest newer rows.",
77
- "--last returns only the most recent answer, if one exists; it is not a history page.",
78
- ].join("\n"),
79
- },
80
- fork: {
81
- arity: 1,
82
- stdin: false,
83
- flags: { at: "value", json: "boolean" },
84
- usage: "fork <aku/...|@alias> --at <historyId>",
85
- purpose: "Create a new Akuma from one retained answered turn.",
86
- },
87
- kill: {
88
- arity: "one-or-more",
89
- stdin: false,
90
- flags: { json: "boolean" },
91
- usage: "kill <akuma-selector>...",
92
- purpose: "Stop the selected Akuma's current work; it can be woken again with tell.",
93
- },
94
- };
95
- export function isAkumaAction(value) {
96
- return value !== undefined && Object.hasOwn(AKUMA_COMMAND_SPECS, value);
97
- }
98
- export function isParsedAkumaCommand(command) {
99
- return isAkumaAction(command.command) && !("contract" in command && command.command === "history");
1
+ import { CliUsageError, isBlankInput } from "../usage.js";
2
+ import { readFile } from "node:fs/promises";
3
+ import { resolve } from "node:path";
4
+ import { squareAssignedParticipantName } from "@astrosheep/square";
5
+ import { emitInitiatingPluginSignal } from "../../plugin/akuma-signals.js";
6
+ import { canonicalBirthCwd } from "../../akuma/call-input.js";
7
+ import { Schema } from "../../akuma/index.js";
8
+ import { executionChannel } from "../../akuma/requests.js";
9
+ import { settings } from "../../settings.js";
10
+ import { AkumaWorldScopeError } from "../../index.js";
11
+ import { akumasWithExecution } from "../../library/akumas.js";
12
+ import { contractFromInput } from "../selectors.js";
13
+ import { ActivityDriver } from "../activity.js";
14
+ import { displayContext, resultContext, writeJson, writeStderr, writeStdout } from "../streams.js";
15
+ import { callObservationStream, inputWaitStream, waitObservationStream, } from "../render/akuma-activity.js";
16
+ import { askRawAnswer, callRawAnswer, historyRawAnswer, waitRawAnswer } from "../render/akuma-activity.js";
17
+ import { askExitCode, askProgressStream, callExitCode, callObservationHead, forkExitCode, historyExitCode, killExitCode, renderCallText, renderForkText, renderHistoryText, renderKillText, renderTellText, renderWaitText, tellExitCode, waitedTellProgress, } from "../render/akuma.js";
18
+ export { isParsedAkumaCommand, renderAkumaHelp } from "./akuma-grammar.js";
19
+ // ---------------------------------------------------------------------------
20
+ // Leaf dispatch: acquisition, one public SDK invocation, direct rendering
21
+ // ---------------------------------------------------------------------------
22
+ async function settingsAt(root, home) {
23
+ return settings({
24
+ ...(root === undefined ? {} : { root }),
25
+ ...(home === undefined ? {} : { home }),
26
+ });
100
27
  }
101
- export function renderAkumaRootRows() {
102
- return Object.entries(AKUMA_COMMAND_SPECS).map(([action, spec]) => ` ${action.padEnd(10)} ${spec.purpose}`);
28
+ function akumas(input) {
29
+ return akumasWithExecution(input.path, input.execution);
103
30
  }
104
- export function renderAkumaHelp(action) {
105
- const spec = AKUMA_COMMAND_SPECS[action];
106
- return `${spec.purpose}\n\n${usageLine(spec.usage)}${spec.details === undefined ? "" : `\n\n${spec.details}`}`;
107
- }
108
- export function renderAkumaUsage(action) {
109
- return usageLine(AKUMA_COMMAND_SPECS[action].usage);
31
+ async function schemaFromFile(path) {
32
+ try {
33
+ const parsed = JSON.parse(await readFile(path, "utf8"));
34
+ return Schema.json(parsed, (value) => value);
35
+ }
36
+ catch (error) {
37
+ throw new Error(`cannot read JSON Schema file ${path}: ${error instanceof Error ? error.message : String(error)}`);
38
+ }
110
39
  }
111
- export function akumaUsageGuide(action) {
112
- return commandGuide(action, AKUMA_COMMAND_SPECS[action].usage);
40
+ function inputAlias(selector) {
41
+ return selector.startsWith("@") ? selector : undefined;
113
42
  }
114
- function stringFlag(value, diagnostic, fail) {
115
- if (typeof value !== "string")
116
- fail(diagnostic);
117
- return value;
43
+ async function promptBody(action, command, input) {
44
+ if (command.prompt.kind !== "stdin")
45
+ return command.prompt.value;
46
+ const bytes = await input.readStdin();
47
+ if (isBlankInput(bytes))
48
+ throw new CliUsageError(`${action} requires a nonblank prompt`);
49
+ return bytes;
118
50
  }
119
- function parseDuration(raw, option, fail) {
120
- if (typeof raw !== "string")
121
- fail(`${option} requires an integer duration with unit ms, s, m, or h`);
122
- const duration = decodeDuration(raw);
123
- if (duration.kind === "invalid")
124
- fail(`${option} requires an integer duration with unit ms, s, m, or h`);
125
- if (duration.kind === "overflow")
126
- fail(`${option} duration exceeds the safe millisecond range`);
127
- return duration.milliseconds;
51
+ function waitObserver(stream, driver, onSelected) {
52
+ return {
53
+ selected: (selected) => {
54
+ onSelected?.(selected);
55
+ stream.select(selected);
56
+ },
57
+ observe: (observed) => {
58
+ driver.settle(stream.observe(observed), stream.frame());
59
+ },
60
+ };
128
61
  }
129
- function scanNamedOption(input, flags, fail) {
130
- const token = input.argv[input.index];
131
- const name = token.slice(2);
132
- const kind = input.spec.flags[name];
133
- if (kind === undefined)
134
- fail(`option ${token} is not valid for ${input.action}`);
135
- if (kind !== "repeatable" && flags[name] !== undefined)
136
- fail(`duplicate option: ${token}`);
137
- if (kind === "boolean") {
138
- flags[name] = true;
139
- return input.index;
62
+ async function inputInitiator(input) {
63
+ let initiator;
64
+ try {
65
+ initiator = squareAssignedParticipantName(input.environment);
140
66
  }
141
- const value = input.argv[input.index + 1];
142
- if (value === undefined || value === "-" || value === "-d" || value.startsWith("--")) {
143
- fail(`${token} requires a value`);
67
+ catch { }
68
+ if (initiator === undefined)
69
+ return {};
70
+ try {
71
+ await emitInitiatingPluginSignal({
72
+ world: input.path,
73
+ ...(input.settings === undefined ? {} : { settings: input.settings }),
74
+ initiator,
75
+ reportDiagnostic: (message) => writeStderr(message),
76
+ });
144
77
  }
145
- if (isBlankInput(value))
146
- fail(`${token} requires a nonblank value`);
147
- flags[name] = kind === "repeatable" ? [...(Array.isArray(flags[name]) ? flags[name] : []), value] : value;
148
- return input.index + 1;
78
+ catch (error) {
79
+ writeStderr(`! plugin initiation: ${error instanceof Error ? error.message : String(error)}`);
80
+ }
81
+ return { initiator };
82
+ }
83
+ function emitResult(body, exact) {
84
+ if (exact)
85
+ process.stdout.write(body);
86
+ else
87
+ writeStdout(body);
149
88
  }
150
- function scanAkuma(action, argv, fail) {
151
- const spec = AKUMA_COMMAND_SPECS[action];
152
- const flags = {};
153
- const positionals = [];
154
- let stdin = false;
155
- for (let index = 1; index < argv.length; index += 1) {
156
- const token = argv[index];
157
- if (token === "-") {
158
- if (!spec.stdin)
159
- fail(`stdin marker '-' is not valid for ${action}`);
160
- if (stdin)
161
- fail("stdin marker '-' may appear only once");
162
- stdin = true;
89
+ // eslint-disable-next-line complexity -- one call owns prompt/schema/placement plus live observation.
90
+ async function runCall(command, input) {
91
+ const body = command.prompt === undefined ? undefined : await promptBody("call", { prompt: command.prompt }, input);
92
+ const schema = command.schema === undefined ? undefined : await schemaFromFile(command.schema);
93
+ const caller = akumas(input);
94
+ const request = {
95
+ ...(await inputInitiator(input)),
96
+ archetype: command.archetype,
97
+ ...(body === undefined ? {} : { body }),
98
+ ...(input.home === undefined ? {} : { home: input.home }),
99
+ ...(input.settings === undefined ? {} : { settings: input.settings }),
100
+ ...(input.executionCwd === undefined ? {} : { cwd: input.executionCwd }),
101
+ ...(input.contract === undefined ? {} : { contract: input.contract }),
102
+ ...(command.alias === undefined ? {} : { alias: command.alias }),
103
+ ...(command.allowed === undefined ? {} : { allowed: command.allowed }),
104
+ ...(schema === undefined ? {} : { schema }),
105
+ ...(input.signal === undefined ? {} : { signal: input.signal }),
106
+ };
107
+ let stream;
108
+ const driver = new ActivityDriver(process.stderr);
109
+ const observing = command.mode === "wait" && command.output === "text";
110
+ const observe = observing
111
+ ? {
112
+ admitted: (tell, id, head) => {
113
+ stream = callObservationStream(resultContext(), callObservationHead({ akuma: id, ...head }), {
114
+ admittedAt: tell.row.at,
115
+ });
116
+ driver.redraw(stream.frame());
117
+ },
118
+ observe: (observation) => {
119
+ driver.settle(stream?.observe(observation) ?? [], stream?.frame() ?? []);
120
+ },
163
121
  }
164
- else if (token === "-d") {
165
- fail(`option ${token} is not valid for ${action}`);
122
+ : undefined;
123
+ try {
124
+ const result = await caller.call({
125
+ ...request,
126
+ mode: command.mode,
127
+ ...(command.timeoutMs === undefined ? {} : { timeoutMs: command.timeoutMs }),
128
+ ...(observe === undefined ? {} : { observe }),
129
+ });
130
+ let streamed = stream !== undefined;
131
+ if (stream !== undefined) {
132
+ driver.conclude(stream.conclude(result.observation));
166
133
  }
167
- else if (!token.startsWith("--")) {
168
- if (isBlankInput(token))
169
- fail(`${action} requires a nonblank value`);
170
- positionals.push(token);
134
+ else if (observing && result.observation.kind === "failed") {
135
+ const fallback = inputWaitStream(resultContext(), () => callObservationHead({
136
+ akuma: result.akuma,
137
+ dispatch: result.dispatch,
138
+ alias: result.alias,
139
+ }), { cursor: "empty", answerSeparator: true });
140
+ writeStderr(fallback.conclude({ kind: "failed", diagnostic: result.observation.failure.diagnostic }));
141
+ streamed = true;
171
142
  }
172
- else {
173
- index = scanNamedOption({ action, spec, argv, index }, flags, fail);
143
+ if (command.output === "json") {
144
+ writeJson(result);
145
+ return callExitCode(result);
174
146
  }
147
+ const raw = callRawAnswer(result, streamed);
148
+ if (raw === undefined)
149
+ emitResult(renderCallText(result, streamed, displayContext()), false);
150
+ else
151
+ emitResult(raw, true);
152
+ return callExitCode(result);
153
+ }
154
+ finally {
155
+ driver.close(stream?.flush() ?? []);
175
156
  }
176
- return { flags, positionals, stdin };
177
- }
178
- function positiveIndex(raw, option, fail) {
179
- if (typeof raw !== "string" || !/^[1-9][0-9]*$/u.test(raw))
180
- fail(`${option} requires a positive integer`);
181
- const value = Number(raw);
182
- if (!Number.isSafeInteger(value) || value <= 0)
183
- fail(`${option} exceeds the safe integer range`);
184
- return value;
185
- }
186
- function validateDirect(value, _fail) {
187
- // Address validation belongs to the operation boundary so callers receive
188
- // the compact Akuma refusal instead of a generic usage page.
189
- return value;
190
157
  }
191
- function validateSet(value, fail) {
192
- if (value.startsWith("kei/"))
193
- return value;
194
- if (value.includes("*")) {
195
- try {
196
- parseAkumaGlob(value);
197
- }
198
- catch (error) {
199
- fail(error instanceof Error ? error.message : `invalid Akuma glob: ${value}`);
158
+ async function runWait(command, input) {
159
+ const alias = command.akuma.length === 1 ? inputAlias(command.akuma[0]) : undefined;
160
+ const stream = command.output === "text" ? waitObservationStream(resultContext()) : undefined;
161
+ const driver = new ActivityDriver(process.stderr);
162
+ const startedAt = Date.now();
163
+ let selection;
164
+ const observer = stream === undefined
165
+ ? undefined
166
+ : waitObserver(stream, driver, (selected) => {
167
+ selection = selected;
168
+ });
169
+ try {
170
+ const result = await akumas(input).wait({
171
+ akuma: command.akuma,
172
+ ...(input.repo === undefined ? {} : { repo: input.repo }),
173
+ ...(command.completion === undefined ? {} : { completion: command.completion }),
174
+ ...(command.timeoutMs === undefined ? {} : { timeoutMs: command.timeoutMs }),
175
+ ...(input.signal === undefined ? {} : { signal: input.signal }),
176
+ ...(observer === undefined ? {} : { observe: observer }),
177
+ });
178
+ const streamed = stream !== undefined && stream.streamed();
179
+ if (stream !== undefined && streamed)
180
+ driver.conclude(stream.conclude(result));
181
+ const presentation = {
182
+ ...(alias === undefined ? {} : { alias }),
183
+ ...(selection === undefined ? {} : { selection }),
184
+ startedAt,
185
+ };
186
+ if (command.output === "json") {
187
+ writeJson(result);
188
+ return 0;
200
189
  }
201
- return value;
190
+ const raw = waitRawAnswer(result, streamed);
191
+ if (raw === undefined)
192
+ emitResult(renderWaitText(result, presentation, displayContext()), false);
193
+ else
194
+ emitResult(raw, true);
195
+ return 0;
196
+ }
197
+ finally {
198
+ driver.close(stream?.flush() ?? []);
202
199
  }
203
- return validateDirect(value, fail);
204
200
  }
205
- function parseWait(rawSelectors, flags, output, fail) {
206
- if (flags.any === true && flags.all === true)
207
- fail("wait --any and --all are mutually exclusive");
208
- const completion = flags.any === true ? "any" : flags.all === true ? "all" : undefined;
209
- return {
210
- command: "wait",
211
- akuma: rawSelectors.map((value) => validateSet(value, fail)),
212
- ...(completion === undefined ? {} : { completion }),
213
- ...(flags.timeout === undefined ? {} : { timeoutMs: parseDuration(flags.timeout, "--timeout", fail) }),
214
- output,
215
- };
201
+ async function runTell(command, input) {
202
+ const body = await promptBody("tell", command, input);
203
+ const result = await akumas(input).tell({
204
+ ...(await inputInitiator(input)),
205
+ akuma: command.akuma,
206
+ body,
207
+ ...(command.interrupt ? { interrupt: true } : {}),
208
+ ...(input.repo === undefined ? {} : { repo: input.repo }),
209
+ ...(input.signal === undefined ? {} : { signal: input.signal }),
210
+ });
211
+ if (command.output === "json") {
212
+ writeJson(result);
213
+ return tellExitCode(result);
214
+ }
215
+ emitResult(renderTellText(result, inputAlias(command.akuma), displayContext()), false);
216
+ return tellExitCode(result);
216
217
  }
217
- function parseHistory(selector, flags, output, fail) {
218
- if (selector.startsWith("kei/")) {
219
- if ([flags.id, flags.before, flags.since, flags.limit, flags.last].some((value) => value !== undefined)) {
220
- fail("history kei/... does not accept --id, --before, --since, --limit, or --last");
218
+ async function runAsk(command, input) {
219
+ const body = await promptBody("ask", command, input);
220
+ const schema = command.schema === undefined ? undefined : await schemaFromFile(command.schema);
221
+ const alias = inputAlias(command.akuma);
222
+ const channel = executionChannel(input.execution);
223
+ const progress = command.output === "text" && channel.kind === "local"
224
+ ? askProgressStream(undefined, alias, resultContext())
225
+ : undefined;
226
+ const driver = new ActivityDriver(process.stderr);
227
+ try {
228
+ const result = await akumas(input).ask({
229
+ ...(await inputInitiator(input)),
230
+ akuma: command.akuma,
231
+ body,
232
+ ...(command.timeoutMs === undefined ? {} : { timeoutMs: command.timeoutMs }),
233
+ ...(schema === undefined ? {} : { schema }),
234
+ ...(command.interrupt ? { interrupt: true } : {}),
235
+ ...(input.repo === undefined ? {} : { repo: input.repo }),
236
+ ...(input.signal === undefined ? {} : { signal: input.signal }),
237
+ ...(progress === undefined
238
+ ? {}
239
+ : {
240
+ observe: {
241
+ admitted: (tell, id) => {
242
+ driver.settle(progress.admitted(tell, id), progress.frame());
243
+ },
244
+ observe: (observation) => {
245
+ driver.settle(progress.observe(observation), progress.frame());
246
+ },
247
+ },
248
+ }),
249
+ });
250
+ if (progress !== undefined)
251
+ driver.conclude(progress.conclude(result).join("\n"));
252
+ else if (command.output === "text" && channel.kind === "body-request")
253
+ writeStderr(waitedTellProgress(result, alias, resultContext()));
254
+ if (command.output === "json") {
255
+ writeJson(result);
256
+ return askExitCode(result);
221
257
  }
222
- return { command: "history", contract: selector, output };
258
+ emitResult(askRawAnswer(result, schema !== undefined) ?? "", true);
259
+ return askExitCode(result);
260
+ }
261
+ finally {
262
+ driver.close(progress?.flush() ?? []);
223
263
  }
224
- return parseAkumaHistory(selector, flags, output, fail);
225
264
  }
226
- function parseAkumaHistory(selector, flags, output, fail) {
227
- const bounded = flags.before !== undefined || flags.since !== undefined || flags.limit !== undefined;
228
- if (flags.before !== undefined && flags.since !== undefined)
229
- fail("history --before and --since are mutually exclusive");
230
- if (flags.id !== undefined && (flags.last === true || bounded))
231
- fail("history --id cannot be combined with --last, --before, --since, or --limit");
232
- if (flags.last === true && bounded)
233
- fail("history --last cannot be combined with --before, --since, or --limit");
234
- const limit = flags.limit === undefined ? undefined : positiveIndex(flags.limit, "--limit", fail);
235
- if (limit !== undefined && limit > 5_000)
236
- fail("--limit must be no greater than 5000");
237
- const id = flags.id === undefined ? undefined : stringFlag(flags.id, "history --id requires a nonblank historyId", fail);
238
- if (id !== undefined && parsePublicHistoryId(id) === null)
239
- fail("history --id requires turn/<positive safe integer>");
240
- return {
241
- command: "history",
242
- akuma: validateDirect(selector, fail),
243
- ...(id === undefined ? {} : { id }),
244
- last: flags.last === true,
245
- ...(flags.before === undefined ? {} : { before: positiveIndex(flags.before, "--before", fail) }),
246
- ...(flags.since === undefined ? {} : { since: positiveIndex(flags.since, "--since", fail) }),
247
- ...(limit === undefined ? {} : { limit }),
248
- output,
265
+ async function runHistory(command, input) {
266
+ const result = await akumas(input).history({
267
+ akuma: command.akuma,
268
+ ...(input.repo === undefined ? {} : { repo: input.repo }),
269
+ ...(command.before === undefined ? {} : { before: command.before }),
270
+ ...(command.since === undefined ? {} : { since: command.since }),
271
+ ...(command.limit === undefined ? {} : { limit: command.limit }),
272
+ ...(command.id === undefined ? {} : { id: command.id }),
273
+ last: command.last,
274
+ });
275
+ if (command.output === "json") {
276
+ writeJson(result);
277
+ return historyExitCode(result, command.id);
278
+ }
279
+ const raw = historyRawAnswer(result, command.id);
280
+ const presentation = {
281
+ ...(inputAlias(command.akuma) === undefined ? {} : { alias: command.akuma }),
282
+ ...(command.id === undefined ? {} : { id: command.id }),
283
+ last: command.last,
249
284
  };
285
+ if (raw !== undefined)
286
+ emitResult(raw, true);
287
+ else if (command.last && result.kind === "last")
288
+ emitResult(result.answer, true);
289
+ else
290
+ emitResult(renderHistoryText(result, presentation, displayContext()), false);
291
+ return historyExitCode(result, command.id);
250
292
  }
251
- function parseAddressed(action, rawSelectors, flags, output, fail) {
252
- if (action === "kill")
253
- return { command: action, akuma: rawSelectors.map((value) => validateSet(value, fail)), output };
254
- if (action === "wait")
255
- return parseWait(rawSelectors, flags, output, fail);
256
- if (action === "history") {
257
- const selector = rawSelectors[0];
258
- if (selector.includes("*"))
259
- fail("history accepts one complete aku/..., @alias, or kei/... selector");
260
- return parseHistory(selector, flags, output, fail);
293
+ async function runFork(command, input) {
294
+ const receipt = await akumas(input).fork({
295
+ akuma: command.akuma,
296
+ at: command.at,
297
+ ...(input.repo === undefined ? {} : { repo: input.repo }),
298
+ });
299
+ if (command.output === "json") {
300
+ writeJson(receipt);
301
+ return forkExitCode(receipt);
261
302
  }
262
- const akuma = validateDirect(rawSelectors[0], fail);
263
- const at = stringFlag(flags.at, "fork requires --at <historyId>", fail);
264
- return { command: action, akuma, at, output };
303
+ emitResult(renderForkText(receipt), false);
304
+ return forkExitCode(receipt);
265
305
  }
266
- function parsePrompted(action, positionals, stdin, fail) {
267
- if (positionals.length < 1 || positionals.length > 2)
268
- fail(`${action} has invalid positional arguments`);
269
- const argument = positionals[1];
270
- if (stdin && argument !== undefined)
271
- fail(`${action} accepts either a prompt argument or stdin, not both`);
272
- if (!stdin && argument === undefined)
273
- fail(`${action} requires a prompt argument or stdin`);
274
- return {
275
- subject: positionals[0],
276
- prompt: stdin ? { kind: "stdin" } : { kind: "argument", value: argument },
277
- };
306
+ async function runKill(command, input) {
307
+ const alias = command.akuma.length === 1 ? inputAlias(command.akuma[0]) : undefined;
308
+ const result = await akumas(input).kill({
309
+ akuma: command.akuma,
310
+ ...(input.repo === undefined ? {} : { repo: input.repo }),
311
+ ...(input.signal === undefined ? {} : { signal: input.signal }),
312
+ });
313
+ if (command.output === "json") {
314
+ writeJson(result);
315
+ return killExitCode(result);
316
+ }
317
+ emitResult(renderKillText(result, alias, displayContext()), false);
318
+ return killExitCode(result);
278
319
  }
279
- function parseTell(flags, subject, prompt, output, fail) {
280
- const schema = flags.schema === undefined ? undefined : stringFlag(flags.schema, "tell --schema requires a file", fail);
281
- return {
282
- command: "tell",
283
- akuma: validateDirect(subject, fail),
284
- interrupt: flags.interrupt === true,
285
- ...(schema === undefined ? {} : { schema }),
286
- ...(flags.wait === undefined ? {} : { timeoutMs: parseDuration(flags.wait, "--wait", fail) }),
287
- prompt,
288
- output,
289
- };
320
+ async function akumaWorld(command, coordinates) {
321
+ const world = command.command === "call"
322
+ ? (coordinates.candidateWorld ?? (await coordinates.establishWorld()))
323
+ : coordinates.world;
324
+ if (world === null)
325
+ throw new CliUsageError("no Keiyaku world contains the invocation cwd");
326
+ return world;
290
327
  }
291
- function parseAllowedFlag(raw, fail) {
292
- if (raw === undefined)
328
+ async function callExecutionCwd(command, cwd, workdir) {
329
+ if (command.command !== "call")
293
330
  return undefined;
294
- if (!Array.isArray(raw))
295
- fail("--allowed requires a value");
296
- const selected = raw;
297
- try {
298
- return decodeAllowedActions(selected, "--allowed");
299
- }
300
- catch (error) {
301
- fail(error instanceof Error ? error.message : "invalid --allowed action");
302
- }
331
+ if (workdir !== undefined)
332
+ return await canonicalBirthCwd(resolve(cwd, workdir), `workdir is not an existing directory: ${workdir}`);
333
+ return cwd;
303
334
  }
304
- function parseCall(flags, archetype, prompt, output, fail) {
305
- let alias;
306
- if (flags.alias !== undefined) {
307
- try {
308
- const name = stringFlag(flags.alias, "--alias requires a name", fail);
309
- alias = parseAkumaAlias(name.startsWith("@") ? name : `@${name}`);
310
- }
311
- catch (error) {
312
- fail(error instanceof Error ? error.message : "invalid Akuma alias");
313
- }
314
- }
315
- const mode = flags.wait === undefined ? "detach" : "wait";
316
- const timeoutMs = flags.wait === undefined ? undefined : parseDuration(flags.wait, "--wait", fail);
317
- const allowed = parseAllowedFlag(flags.allowed, fail);
318
- const schema = flags.schema === undefined ? undefined : stringFlag(flags.schema, "call --schema requires a file", fail);
335
+ async function akumaInput(command, coordinates, workdir, runtime) {
336
+ const path = await akumaWorld(command, coordinates);
337
+ const executionCwd = await callExecutionCwd(command, coordinates.cwd, workdir);
338
+ const execution = runtime.execution;
339
+ const home = command.command === "call" ? runtime.home : undefined;
340
+ const configuration = command.command === "call" ? await settingsAt(path, home) : undefined;
341
+ if (command.command === "call" && command.contract !== undefined && coordinates.repo === undefined)
342
+ throw new Error("call with Contract requires a resolved Repo");
343
+ const contract = command.command === "call" && command.contract !== undefined
344
+ ? contractFromInput(coordinates.repo, command.contract, execution).contract
345
+ : undefined;
319
346
  return {
320
- command: "call",
321
- archetype,
322
- ...(typeof flags.contract === "string" ? { contract: flags.contract } : {}),
323
- ...(alias === undefined ? {} : { alias }),
324
- mode,
325
- ...(timeoutMs === undefined ? {} : { timeoutMs }),
326
- ...(allowed === undefined ? {} : { allowed }),
327
- ...(schema === undefined ? {} : { schema }),
328
- prompt,
329
- output,
347
+ path,
348
+ ...(executionCwd === undefined ? {} : { executionCwd }),
349
+ ...(home === undefined ? {} : { home }),
350
+ ...(configuration === undefined ? {} : { settings: configuration }),
351
+ ...(contract === undefined ? {} : { contract }),
352
+ ...(coordinates.repo === undefined ? {} : { repo: coordinates.repo }),
353
+ environment: runtime.environment,
354
+ readStdin: runtime.readStdin,
355
+ execution,
356
+ ...(runtime.signal === undefined ? {} : { signal: runtime.signal }),
330
357
  };
331
358
  }
332
- export function parseAkumaCommand(argv) {
333
- const candidate = argv[0];
334
- if (!isAkumaAction(candidate))
335
- throw new CliUsageError(`unknown command: ${candidate ?? ""}`);
336
- const action = candidate;
337
- const spec = AKUMA_COMMAND_SPECS[action];
338
- const fail = (message) => {
339
- throw new CliUsageError(message, akumaUsageGuide(action));
340
- };
341
- const { flags, positionals, stdin } = scanAkuma(action, argv, fail);
342
- const output = flags.json === true ? "json" : "text";
343
- if (action === "call" || action === "tell") {
344
- const parsed = parsePrompted(action, positionals, stdin, fail);
345
- return action === "call"
346
- ? parseCall(flags, parsed.subject, parsed.prompt, output, fail)
347
- : parseTell(flags, parsed.subject, parsed.prompt, output, fail);
359
+ export async function runAkumaCommand(command, coordinates, workdir, runtime) {
360
+ try {
361
+ const input = await akumaInput(command, coordinates, workdir, runtime);
362
+ switch (command.command) {
363
+ case "call":
364
+ return await runCall(command, input);
365
+ case "wait":
366
+ return await runWait(command, input);
367
+ case "tell":
368
+ return await runTell(command, input);
369
+ case "ask":
370
+ return await runAsk(command, input);
371
+ case "history":
372
+ return await runHistory(command, input);
373
+ case "fork":
374
+ return await runFork(command, input);
375
+ case "kill":
376
+ return await runKill(command, input);
377
+ }
348
378
  }
349
- if (spec.arity === "one-or-more" ? positionals.length === 0 : positionals.length !== spec.arity) {
350
- fail(`${action} has invalid positional arguments`);
379
+ catch (error) {
380
+ if (error instanceof Error && "executionReceipt" in error)
381
+ throw error;
382
+ if (error instanceof AkumaWorldScopeError)
383
+ throw error;
384
+ if (error instanceof TypeError)
385
+ throw new CliUsageError(error.message);
386
+ throw error;
351
387
  }
352
- if (stdin)
353
- fail(`${action} reads no stdin`);
354
- return parseAddressed(action, positionals, flags, output, fail);
355
388
  }