@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,220 +1,9 @@
1
- import { decodeResumeCoordinate, encodeResumeCoordinate } from "./coordinate.js";
1
+ export { decodeResumeCoordinate, encodeResumeCoordinate } from "./coordinate.js";
2
2
  export { AKUMA_REQUESTS_ENV } from "./providers/execution-environment.js";
3
3
  export const AGENT_EVENT_TEXT_LIMIT = 16_384;
4
4
  export const AGENT_THOUGHT_TEXT_LIMIT = 4_000;
5
5
  export const AGENT_EVENT_QUEUE_LIMIT = 256;
6
- const AGENT_EVENT_TYPES = {
7
- session: true,
8
- assistant: true,
9
- thought: true,
10
- tool: true,
11
- note: true,
12
- unknown: true,
13
- };
14
- function object(value) {
15
- return value !== null && typeof value === "object" && !Array.isArray(value)
16
- ? value
17
- : null;
18
- }
19
- export { decodeResumeCoordinate, encodeResumeCoordinate };
20
- function eventType(value) {
21
- return typeof value === "string" && Object.hasOwn(AGENT_EVENT_TYPES, value);
22
- }
23
- const SEARCH_SCOPES = {
24
- content: true,
25
- files: true,
26
- web: true,
27
- };
28
- function decodePositiveLine(value) {
29
- if (value === undefined)
30
- return undefined;
31
- return typeof value === "number" && Number.isSafeInteger(value) && value >= 1 ? value : null;
32
- }
33
- function decodeOptionalText(value) {
34
- if (value === undefined)
35
- return undefined;
36
- return typeof value === "string" ? value : null;
37
- }
38
- function decodeSearchScope(value) {
39
- if (value === undefined)
40
- return undefined;
41
- return typeof value === "string" && Object.hasOwn(SEARCH_SCOPES, value) ? value : null;
42
- }
43
- function decodeRunCall(call) {
44
- return typeof call.command === "string" ? { kind: "run", command: call.command } : null;
45
- }
46
- function decodeReadCall(call) {
47
- if (typeof call.path !== "string")
48
- return null;
49
- const offset = decodePositiveLine(call.offset);
50
- const limit = decodePositiveLine(call.limit);
51
- if (offset === null || limit === null)
52
- return null;
53
- return {
54
- kind: "read",
55
- path: call.path,
56
- ...(offset === undefined ? {} : { offset }),
57
- ...(limit === undefined ? {} : { limit }),
58
- };
59
- }
60
- function decodeSearchCall(call) {
61
- if (typeof call.query !== "string")
62
- return null;
63
- const scope = decodeSearchScope(call.scope);
64
- const path = decodeOptionalText(call.path);
65
- const glob = decodeOptionalText(call.glob);
66
- if (scope === null || path === null || glob === null)
67
- return null;
68
- return {
69
- kind: "search",
70
- query: call.query,
71
- ...(scope === undefined ? {} : { scope }),
72
- ...(path === undefined ? {} : { path }),
73
- ...(glob === undefined ? {} : { glob }),
74
- };
75
- }
76
- function decodeNonnegativeCount(value) {
77
- return Number.isSafeInteger(value) && value >= 0 ? value : null;
78
- }
79
- function decodeDiffstat(value) {
80
- if (value === undefined)
81
- return undefined;
82
- const diffstat = object(value);
83
- if (diffstat === null)
84
- return null;
85
- const added = decodeNonnegativeCount(diffstat.added);
86
- const removed = decodeNonnegativeCount(diffstat.removed);
87
- return added === null || removed === null ? null : { added, removed };
88
- }
89
- function decodeFileChangeMember(value) {
90
- const change = object(value);
91
- if (change === null ||
92
- (change.op !== "add" && change.op !== "update" && change.op !== "delete" && change.op !== "unspecified") ||
93
- typeof change.path !== "string")
94
- return null;
95
- const diffstat = decodeDiffstat(change.diffstat);
96
- if (diffstat === null)
97
- return null;
98
- return {
99
- op: change.op,
100
- path: change.path,
101
- ...(diffstat === undefined ? {} : { diffstat }),
102
- };
103
- }
104
- function decodeFileChangeCall(call) {
105
- if (!Array.isArray(call.changes))
106
- return null;
107
- const changes = call.changes.map(decodeFileChangeMember);
108
- return changes.every((change) => change !== null) ? { kind: "fileChange", changes } : null;
109
- }
110
- function decodeToolInput(value) {
111
- if (value === undefined)
112
- return undefined;
113
- const input = object(value);
114
- if (input === null || typeof input.json !== "string" || typeof input.truncated !== "boolean")
115
- return null;
116
- return { json: input.json, truncated: input.truncated };
117
- }
118
- function decodeOtherCall(call) {
119
- if (typeof call.display !== "string")
120
- return null;
121
- const input = decodeToolInput(call.input);
122
- return input === null ? null : { kind: "other", display: call.display, ...(input === undefined ? {} : { input }) };
123
- }
124
- function decodeToolCall(value) {
125
- const call = object(value);
126
- if (call === null)
127
- return null;
128
- switch (call.kind) {
129
- case "run":
130
- return decodeRunCall(call);
131
- case "read":
132
- return decodeReadCall(call);
133
- case "search":
134
- return decodeSearchCall(call);
135
- case "fileChange":
136
- return decodeFileChangeCall(call);
137
- case "other":
138
- return decodeOtherCall(call);
139
- default:
140
- return null;
141
- }
142
- }
143
- function decodeToolResult(value) {
144
- const result = object(value);
145
- if (result === null || (result.status !== "ok" && result.status !== "error"))
146
- return null;
147
- if (result.message !== undefined && typeof result.message !== "string")
148
- return null;
149
- if (result.exitCode !== undefined && !Number.isSafeInteger(result.exitCode))
150
- return null;
151
- return {
152
- status: result.status,
153
- ...(result.message === undefined ? {} : { message: result.message }),
154
- ...(result.exitCode === undefined ? {} : { exitCode: result.exitCode }),
155
- };
156
- }
157
- function decodeToolEvent(event) {
158
- if (event.truncated !== undefined && event.truncated !== true)
159
- return null;
160
- if (typeof event.id !== "string" || typeof event.name !== "string")
161
- return null;
162
- const call = decodeToolCall(event.call);
163
- if (call !== null && event.phase === "started" && event.result === undefined) {
164
- return {
165
- type: "tool",
166
- phase: "started",
167
- id: event.id,
168
- name: event.name,
169
- call,
170
- ...(event.truncated === true ? { truncated: true } : {}),
171
- };
172
- }
173
- const result = decodeToolResult(event.result);
174
- if (call !== null && event.phase === "completed" && result !== null) {
175
- return {
176
- type: "tool",
177
- phase: "completed",
178
- id: event.id,
179
- name: event.name,
180
- call,
181
- result,
182
- ...(event.truncated === true ? { truncated: true } : {}),
183
- };
184
- }
185
- return null;
186
- }
187
- function decodeTypedEvent(type, event) {
188
- if (type !== "session" && event.truncated !== undefined && event.truncated !== true)
189
- return null;
190
- const truncated = event.truncated === true ? { truncated: true } : {};
191
- switch (type) {
192
- case "assistant":
193
- case "thought":
194
- return typeof event.text === "string" ? { type, text: event.text, ...truncated } : null;
195
- case "note":
196
- return typeof event.text === "string" ? { type, text: event.text, ...truncated } : null;
197
- case "unknown":
198
- return typeof event.kind === "string" ? { type, kind: event.kind, ...truncated } : null;
199
- case "session": {
200
- const coordinate = decodeResumeCoordinate(event.coordinate);
201
- return coordinate === null ? null : { type, coordinate };
202
- }
203
- case "tool":
204
- return decodeToolEvent(event);
205
- default:
206
- return type;
207
- }
208
- }
209
- export function decodeAgentEvent(value) {
210
- const event = object(value);
211
- if (event === null || !eventType(event.type))
212
- throw new Error("Akuma activity has an invalid event shape");
213
- const decoded = decodeTypedEvent(event.type, event);
214
- if (decoded === null)
215
- throw new Error("Akuma activity has an invalid event shape");
216
- return decoded;
217
- }
6
+ export { agentEventSchema, decodeAgentEvent } from "./heart/activity-schema.js";
218
7
  function boundedToolCall(call) {
219
8
  switch (call.kind) {
220
9
  case "run":
@@ -284,13 +73,16 @@ function boundedToolResult(result) {
284
73
  };
285
74
  }
286
75
  export function encodeAgentEvent(event) {
287
- const marked = (value, changed) => ({
288
- ...value,
289
- ...(changed || ("truncated" in event && event.truncated === true) ? { truncated: true } : {}),
290
- });
76
+ const marked = (value, changed) => changed || ("truncated" in event && event.truncated === true) ? { ...value, truncated: true } : value;
291
77
  switch (event.type) {
292
- case "session":
293
- return { type: event.type, coordinate: encodeResumeCoordinate(event.coordinate) };
78
+ case "session": {
79
+ const coordinate = "sessionFile" in event.coordinate
80
+ ? event.coordinate.sessionId === undefined
81
+ ? { sessionFile: event.coordinate.sessionFile }
82
+ : { sessionFile: event.coordinate.sessionFile, sessionId: event.coordinate.sessionId }
83
+ : { sessionId: event.coordinate.sessionId };
84
+ return { type: event.type, coordinate };
85
+ }
294
86
  case "assistant":
295
87
  return marked({ type: event.type, text: boundedEventText(event.text) }, event.text.length > AGENT_EVENT_TEXT_LIMIT);
296
88
  case "thought":
@@ -4,6 +4,8 @@ export type AcpExecutionConfig = Readonly<{
4
4
  argvAfter: readonly string[];
5
5
  modelArg?: string;
6
6
  effortArg?: string;
7
+ modelConfigId?: string;
8
+ effortConfigId?: string;
7
9
  systemPromptArg?: string;
8
10
  systemPromptMode?: SystemPromptMode;
9
11
  }>;
@@ -7,12 +7,32 @@ function argumentName(value, key) {
7
7
  }
8
8
  return selected;
9
9
  }
10
+ function validateSelectorMappings(config) {
11
+ if (config.modelArg !== undefined && config.modelConfigId !== undefined) {
12
+ throw new TypeError("ACP provider config cannot map model to both an argument and a session option");
13
+ }
14
+ if (config.effortArg !== undefined && config.effortConfigId !== undefined) {
15
+ throw new TypeError("ACP provider config cannot map effort to both an argument and a session option");
16
+ }
17
+ if (config.modelConfigId !== undefined && config.modelConfigId === config.effortConfigId) {
18
+ throw new TypeError("ACP provider config model and effort must use different session options");
19
+ }
20
+ }
10
21
  export function decodeAcpConfig(value) {
11
22
  if (value === null || typeof value !== "object" || Array.isArray(value)) {
12
23
  throw new TypeError("ACP provider config must be an object");
13
24
  }
14
25
  const config = value;
15
- const unknown = Object.keys(config).find((key) => !["argvBefore", "argvAfter", "effortArg", "modelArg", "systemPromptArg", "systemPromptMode"].includes(key));
26
+ const unknown = Object.keys(config).find((key) => ![
27
+ "argvBefore",
28
+ "argvAfter",
29
+ "effortArg",
30
+ "modelArg",
31
+ "modelConfigId",
32
+ "effortConfigId",
33
+ "systemPromptArg",
34
+ "systemPromptMode",
35
+ ].includes(key));
16
36
  if (unknown !== undefined)
17
37
  throw new TypeError(`ACP provider config has unknown field ${unknown}`);
18
38
  if (!Array.isArray(config.argvBefore) ||
@@ -25,6 +45,9 @@ export function decodeAcpConfig(value) {
25
45
  }
26
46
  const modelArg = argumentName(config, "modelArg");
27
47
  const effortArg = argumentName(config, "effortArg");
48
+ const modelConfigId = argumentName(config, "modelConfigId");
49
+ const effortConfigId = argumentName(config, "effortConfigId");
50
+ validateSelectorMappings({ modelArg, effortArg, modelConfigId, effortConfigId });
28
51
  const systemPromptArg = argumentName(config, "systemPromptArg");
29
52
  const systemPromptMode = config.systemPromptMode;
30
53
  if (systemPromptMode !== undefined && systemPromptMode !== "append" && systemPromptMode !== "replace") {
@@ -38,6 +61,8 @@ export function decodeAcpConfig(value) {
38
61
  argvAfter: Object.freeze([...config.argvAfter]),
39
62
  ...(modelArg === undefined ? {} : { modelArg }),
40
63
  ...(effortArg === undefined ? {} : { effortArg }),
64
+ ...(modelConfigId === undefined ? {} : { modelConfigId }),
65
+ ...(effortConfigId === undefined ? {} : { effortConfigId }),
41
66
  ...(systemPromptArg === undefined ? {} : { systemPromptArg }),
42
67
  ...(systemPromptMode === undefined ? {} : { systemPromptMode }),
43
68
  });
@@ -10,6 +10,8 @@ export type AcpDependencies = Readonly<{
10
10
  interpretTool?: AcpToolInterpreter;
11
11
  freshSessionMeta?: AcpSessionMeta;
12
12
  loadSessionMeta?: AcpSessionMeta;
13
+ configureClient?: (client: AcpSdk.ClientApp) => void;
14
+ onTerminal?: () => void;
13
15
  }>;
14
16
  export type AcpLiveSession = Readonly<{
15
17
  session: Session;
@@ -20,5 +22,10 @@ export type AcpLiveSession = Readonly<{
20
22
  type AcpLaunch = Readonly<{
21
23
  argv: readonly [string, ...string[]];
22
24
  env?: Readonly<Record<string, string>>;
25
+ sessionOptions?: readonly Readonly<{
26
+ field: "model" | "effort";
27
+ id: string;
28
+ value: string;
29
+ }>[];
23
30
  }>;
24
31
  export declare function startAcpSession(launch: AcpLaunch, input: AcpStartInput, dependencies?: AcpDependencies, custody?: AttemptCustody): Promise<AcpLiveSession>;
@@ -18,10 +18,12 @@ function diagnostic(acp, error) {
18
18
  }
19
19
  return data.length === 0 ? `${error.message} [${error.code}]` : `${error.message} [${error.code}]: ${data}`;
20
20
  }
21
- function createAcpClient(acp, onUpdate) {
22
- return acp
21
+ function createAcpClient(acp, onUpdate, configure) {
22
+ const client = acp
23
23
  .client({ name: "keiyaku" })
24
24
  .onNotification(acp.methods.client.session.update, ({ params }) => onUpdate(params));
25
+ configure?.(client);
26
+ return client;
25
27
  }
26
28
  function promptResult(response) {
27
29
  if (response.stopReason === "end_turn" ||
@@ -34,7 +36,7 @@ function promptResult(response) {
34
36
  function requestMeta(meta) {
35
37
  return meta === undefined || Object.keys(meta).length === 0 ? {} : { _meta: meta };
36
38
  }
37
- async function establishSession(acp, agent, input, dependencies) {
39
+ async function establishSession(acp, agent, input, dependencies, selections) {
38
40
  const initialized = await agent.request(acp.methods.agent.initialize, {
39
41
  protocolVersion: acp.PROTOCOL_VERSION,
40
42
  clientInfo: { name: "keiyaku", version: "4" },
@@ -42,25 +44,53 @@ async function establishSession(acp, agent, input, dependencies) {
42
44
  if (input.session.kind === "resume" && initialized.agentCapabilities?.loadSession !== true) {
43
45
  throw new Error("ACP agent does not advertise session/load");
44
46
  }
47
+ let sessionId;
48
+ let configOptions;
45
49
  if (input.session.kind === "fresh") {
46
- return (await agent.request(acp.methods.agent.session.new, {
50
+ const created = await agent.request(acp.methods.agent.session.new, {
47
51
  cwd: input.cwd,
48
52
  mcpServers: [],
49
53
  ...requestMeta(dependencies.freshSessionMeta),
50
- })).sessionId;
54
+ });
55
+ sessionId = created.sessionId;
56
+ configOptions = created.configOptions;
57
+ }
58
+ else {
59
+ const coordinate = input.session.coordinate.sessionId;
60
+ if (coordinate === undefined)
61
+ throw new Error("ACP resume coordinate has no session id");
62
+ sessionId = coordinate;
63
+ const loaded = await agent.request(acp.methods.agent.session.load, {
64
+ cwd: input.cwd,
65
+ mcpServers: [],
66
+ sessionId,
67
+ ...requestMeta(dependencies.loadSessionMeta),
68
+ });
69
+ configOptions = loaded.configOptions;
70
+ }
71
+ for (const selection of selections) {
72
+ const selected = configOptions?.find((option) => option.id === selection.id);
73
+ if (selected?.type !== "select")
74
+ throw new Error(`ACP ${selection.field} option '${selection.id}' is unavailable`);
75
+ const choices = selected.options.flatMap((option) => ("options" in option ? option.options : [option]));
76
+ if (selected.currentValue === selection.value)
77
+ continue;
78
+ if (!choices.some((option) => option.value === selection.value)) {
79
+ throw new Error(`ACP ${selection.field} value '${selection.value}' is unavailable`);
80
+ }
81
+ const updated = await agent.request(acp.methods.agent.session.setConfigOption, {
82
+ sessionId,
83
+ configId: selection.id,
84
+ value: selection.value,
85
+ });
86
+ configOptions = updated.configOptions;
87
+ if (configOptions.find((option) => option.id === selection.id)?.currentValue !== selection.value) {
88
+ throw new Error(`ACP ${selection.field} option '${selection.id}' did not select '${selection.value}'`);
89
+ }
51
90
  }
52
- const sessionId = input.session.coordinate.sessionId;
53
- if (sessionId === undefined)
54
- throw new Error("ACP resume coordinate has no session id");
55
- await agent.request(acp.methods.agent.session.load, {
56
- cwd: input.cwd,
57
- mcpServers: [],
58
- sessionId,
59
- ...requestMeta(dependencies.loadSessionMeta),
60
- });
61
91
  return sessionId;
62
92
  }
63
- function createAcpTurn(acp, connection, interpret) {
93
+ function createAcpTurn(acp, connection, interpret, onTerminal) {
64
94
  const events = new AgentEventChannel();
65
95
  let state = EMPTY_ACP_EVENT_STATE;
66
96
  let terminal = false;
@@ -80,6 +110,7 @@ function createAcpTurn(acp, connection, interpret) {
80
110
  if (terminal)
81
111
  return;
82
112
  terminal = true;
113
+ onTerminal?.();
83
114
  let completionResult = result;
84
115
  const failCleanup = (error) => {
85
116
  completionResult = { kind: "failed", diagnostic: `ACP cleanup failed: ${diagnostic(acp, error)}` };
@@ -169,10 +200,10 @@ export async function startAcpSession(launch, input, dependencies = {}, custody)
169
200
  const connection = createAcpClient(acp, (notification) => {
170
201
  if (notification.sessionId === sessionId)
171
202
  turn.update(notification.update);
172
- }).connect(acp.ndJsonStream(Writable.toWeb(child.input), Readable.toWeb(child.output)));
173
- turn = createAcpTurn(acp, connection, dependencies.interpretTool);
203
+ }, dependencies.configureClient).connect(acp.ndJsonStream(Writable.toWeb(child.input), Readable.toWeb(child.output)));
204
+ turn = createAcpTurn(acp, connection, dependencies.interpretTool, dependencies.onTerminal);
174
205
  try {
175
- sessionId = await abortable(establishSession(acp, connection.agent, input, dependencies), signal);
206
+ sessionId = await abortable(establishSession(acp, connection.agent, input, dependencies, launch.sessionOptions ?? []), signal);
176
207
  turn.events.emit({ type: "session", coordinate: { sessionId } });
177
208
  const session = beginAcpPrompt({ acp, agent: connection.agent }, child, turn, sessionId, input);
178
209
  return { session, agent: connection.agent, sessionId, open: turn.open };
@@ -6,11 +6,11 @@ function optionAdmission(options, config) {
6
6
  if (options.network !== undefined) {
7
7
  return { kind: "refused", diagnostic: "ACP provider does not support the network option" };
8
8
  }
9
- if (options.model !== undefined && config.modelArg === undefined) {
10
- return { kind: "refused", diagnostic: "ACP provider has no model argument mapping" };
9
+ if (options.model !== undefined && config.modelArg === undefined && config.modelConfigId === undefined) {
10
+ return { kind: "refused", diagnostic: "ACP provider has no model mapping" };
11
11
  }
12
- if (options.effort !== undefined && config.effortArg === undefined) {
13
- return { kind: "refused", diagnostic: "ACP provider has no effort argument mapping" };
12
+ if (options.effort !== undefined && config.effortArg === undefined && config.effortConfigId === undefined) {
13
+ return { kind: "refused", diagnostic: "ACP provider has no effort mapping" };
14
14
  }
15
15
  if (options.systemPrompt !== undefined && options.systemPrompt.length > 0) {
16
16
  if (config.systemPromptArg === undefined) {
@@ -32,9 +32,9 @@ function argv(execution, config, options) {
32
32
  if (execution.executable === undefined)
33
33
  throw new Error("ACP provider execution requires executable");
34
34
  const values = [execution.executable, ...config.argvBefore];
35
- if (options.model !== undefined)
35
+ if (options.model !== undefined && config.modelArg !== undefined)
36
36
  values.push(config.modelArg, options.model);
37
- if (options.effort !== undefined)
37
+ if (options.effort !== undefined && config.effortArg !== undefined)
38
38
  values.push(config.effortArg, options.effort);
39
39
  if (options.systemPrompt !== undefined && config.systemPromptArg !== undefined) {
40
40
  values.push(config.systemPromptArg, options.systemPrompt);
@@ -50,6 +50,14 @@ export function createAcpProvider(execution, dependencies = {}) {
50
50
  const launch = {
51
51
  argv: argv(execution, config, input.options),
52
52
  ...(execution.env === undefined ? {} : { env: execution.env }),
53
+ sessionOptions: [
54
+ ...(input.options.model === undefined || config.modelConfigId === undefined
55
+ ? []
56
+ : [{ field: "model", id: config.modelConfigId, value: input.options.model }]),
57
+ ...(input.options.effort === undefined || config.effortConfigId === undefined
58
+ ? []
59
+ : [{ field: "effort", id: config.effortConfigId, value: input.options.effort }]),
60
+ ],
53
61
  };
54
62
  return (await startAcpSession(launch, input, dependencies, custody)).session;
55
63
  };
@@ -1,6 +1,7 @@
1
1
  import { createProviderAttempt } from "../../provider.js";
2
2
  import { startAcpSession, } from "../acp/core.js";
3
- const INTERJECT_METHOD = "x.ai/interject";
3
+ const INTERJECT_METHOD = "_x.ai/interject";
4
+ const INTERJECTION_METHOD = "_x.ai/session/interjection";
4
5
  function nonblank(value) {
5
6
  return typeof value === "string" && value.trim().length > 0 ? value : undefined;
6
7
  }
@@ -108,23 +109,34 @@ function argv(execution, options) {
108
109
  values.push("stdio");
109
110
  return values;
110
111
  }
111
- function withInterject(live) {
112
+ function withInterject(live, pending) {
112
113
  return {
113
114
  ...live.session,
114
- tell: async (tell) => {
115
+ tell: (tell) => {
115
116
  if (!live.open())
116
- return { kind: "turn-ended" };
117
- const response = await live.agent.request(INTERJECT_METHOD, {
117
+ return Promise.resolve({ kind: "turn-ended" });
118
+ const existing = pending.get(tell.id);
119
+ if (existing !== undefined)
120
+ throw new Error("Grok Build duplicate pending interjection id");
121
+ const receipt = new Promise((resolve, reject) => {
122
+ pending.set(tell.id, { resolve, reject });
123
+ });
124
+ void live.agent
125
+ .request(INTERJECT_METHOD, {
118
126
  sessionId: live.sessionId,
119
127
  text: tell.text,
120
128
  interjectionId: tell.id,
129
+ })
130
+ .then((response) => {
131
+ if (response?.status !== "queued" && pending.has(tell.id)) {
132
+ pending.get(tell.id)?.reject(new Error("Grok Build interject did not return queued"));
133
+ pending.delete(tell.id);
134
+ }
135
+ }, (error) => {
136
+ pending.get(tell.id)?.reject(error);
137
+ pending.delete(tell.id);
121
138
  });
122
- if (!live.open())
123
- return { kind: "turn-ended" };
124
- if (response === null || typeof response !== "object" || response.status !== "queued") {
125
- throw new Error("Grok Build interject did not return queued");
126
- }
127
- return { kind: "accepted", fence: tell.id };
139
+ return receipt;
128
140
  },
129
141
  };
130
142
  }
@@ -132,17 +144,36 @@ export function createGrokBuildProvider(execution, dependencies = {}) {
132
144
  if (execution.executable === undefined)
133
145
  throw new TypeError("Grok Build provider execution requires executable");
134
146
  const drive = async (input, custody) => {
147
+ const pending = new Map();
148
+ let live;
135
149
  const launch = {
136
150
  argv: argv(execution, input.options),
137
151
  ...(execution.env === undefined ? {} : { env: execution.env }),
138
152
  };
139
153
  const sessionMeta = grokSessionMeta(execution.config, input.options);
140
- return withInterject(await startAcpSession(launch, input, {
154
+ live = await startAcpSession(launch, input, {
141
155
  ...dependencies,
156
+ configureClient: (client) => {
157
+ client.onNotification(INTERJECTION_METHOD, (value) => value, ({ params }) => {
158
+ if (params.sessionId !== live?.sessionId)
159
+ return;
160
+ const waiter = pending.get(params.interjectionId);
161
+ if (waiter === undefined)
162
+ return;
163
+ pending.delete(params.interjectionId);
164
+ waiter.resolve({ kind: "accepted", fence: params.interjectionId });
165
+ });
166
+ },
167
+ onTerminal: () => {
168
+ for (const waiter of pending.values())
169
+ waiter.resolve({ kind: "turn-ended" });
170
+ pending.clear();
171
+ },
142
172
  interpretTool: interpretGrokTool,
143
173
  freshSessionMeta: { ...(dependencies.freshSessionMeta ?? {}), ...(sessionMeta.freshSessionMeta ?? {}) },
144
174
  loadSessionMeta: { ...(dependencies.loadSessionMeta ?? {}), ...(sessionMeta.loadSessionMeta ?? {}) },
145
- }, custody));
175
+ }, custody);
176
+ return withInterject(live, pending);
146
177
  };
147
178
  return {
148
179
  admitOptions: optionAdmission,
@@ -1,7 +1,7 @@
1
1
  import type { ProviderAdapter } from "../provider.js";
2
- import { type ProviderExecution } from "../provider-recipe.js";
3
- export declare function decodeProviderExecution(input: unknown): ProviderExecution;
4
- export declare function resolveProviderExecution(input: unknown): Promise<Readonly<{
2
+ import type { ProviderExecution } from "../provider-recipe.js";
3
+ export { decodeProviderRecipe as decodeProviderExecution } from "../provider-recipe.js";
4
+ export declare function resolveProviderExecution(execution: ProviderExecution): Promise<Readonly<{
5
5
  execution: ProviderExecution;
6
6
  adapter: ProviderAdapter;
7
7
  }>>;
@@ -1,14 +1,4 @@
1
- import { decodeProviderRecipe } from "../provider-recipe.js";
2
- export function decodeProviderExecution(input) {
3
- const decoded = decodeProviderRecipe(input);
4
- return Object.freeze({
5
- name: decoded.name,
6
- kind: decoded.kind,
7
- ...(decoded.executable === undefined ? {} : { executable: decoded.executable }),
8
- ...(decoded.config === undefined ? {} : { config: decoded.config }),
9
- ...(decoded.env === undefined ? {} : { env: decoded.env }),
10
- });
11
- }
1
+ export { decodeProviderRecipe as decodeProviderExecution } from "../provider-recipe.js";
12
2
  async function adapterFor(execution) {
13
3
  if (execution.kind === "acp")
14
4
  return (await import("./acp/index.js")).createAcpProvider(execution);
@@ -28,7 +18,6 @@ async function adapterFor(execution) {
28
18
  return (await import("./pi/index.js")).createPiProvider(execution);
29
19
  throw new TypeError(`unknown Akuma provider kind ${execution.kind}`);
30
20
  }
31
- export async function resolveProviderExecution(input) {
32
- const execution = decodeProviderExecution(input);
21
+ export async function resolveProviderExecution(execution) {
33
22
  return Object.freeze({ execution, adapter: await adapterFor(execution) });
34
23
  }
@@ -0,0 +1,28 @@
1
+ import type { AttemptCustody } from "../../provider.js";
2
+ import type { OpencodeEventSubscriptionRequest } from "./session.js";
3
+ /**
4
+ * One adapter-private owner for every resource an OpenCode event subscription
5
+ * creates: the native subscription, its fetch and reader, the pending read, and
6
+ * the SDK's retry waiting. `closed` resolves only after those resources really
7
+ * retired; a teardown rejection escapes through it, and an unprovable
8
+ * retirement leaves it pending so existing custody reports the attempt hung.
9
+ */
10
+ export type OwnedEventStream = Readonly<{
11
+ /** Subscription barrier: resolves once the native subscription exists, rejects on setup failure. */
12
+ ready: Promise<void>;
13
+ /** Reads the next native event. A pending read is interrupted by `retire`. */
14
+ next(): Promise<IteratorResult<unknown>>;
15
+ /** Aborts the owned signal, settles any pending read, then awaits real iterator retirement. */
16
+ retire(): Promise<void>;
17
+ /** Resolves only when subscription, reader, and retry waiting actually ended. */
18
+ closed: Promise<void>;
19
+ }>;
20
+ export declare function ownEventStream(input: Readonly<{
21
+ directory: string;
22
+ /** The session/attempt notification signal this owner's controller follows. */
23
+ signal: AbortSignal;
24
+ subscribe(request: OpencodeEventSubscriptionRequest): Promise<Readonly<{
25
+ stream: AsyncIterable<unknown>;
26
+ }>>;
27
+ custody?: AttemptCustody;
28
+ }>): OwnedEventStream;