@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,8 +1,12 @@
1
- import type { ExecutionEvent } from "../../library/execution.js";
2
- import { type TextRenderContext } from "./terminal.js";
1
+ import type { ExecutionObservation } from "../../protocol/execution-observation.js";
3
2
  import { type StatusLineOptions, type StatusLineStream } from "./status-line.js";
4
- /** Sparse rendering for consumers that do not own a live stream. */
5
- export declare function executionProgressLines(event: ExecutionEvent, context: TextRenderContext): readonly string[];
3
+ import { type TextRenderContext } from "./terminal.js";
4
+ /**
5
+ * Sparse rendering for consumers that do not own a live stream. Admitted facts and phase stages are not durable
6
+ * output: the receipt names admitted facts once, and a stage start is a live-frame claim that must never freeze
7
+ * into scrollback. Only completed verification facts and bounded live output survive here.
8
+ */
9
+ export declare function executionProgressLines(event: ExecutionObservation, context: TextRenderContext): readonly string[];
6
10
  export type ExecutionProgressOptions = StatusLineOptions & Readonly<{
7
11
  stream: StatusLineStream;
8
12
  context: TextRenderContext;
@@ -18,10 +22,18 @@ export declare class ExecutionProgressRenderer {
18
22
  private phaseUnknown;
19
23
  private readonly liveOutput;
20
24
  constructor(input: ExecutionProgressOptions);
21
- consume(event: ExecutionEvent): Promise<void>;
25
+ consume(event: ExecutionObservation): Promise<void>;
22
26
  finish(): void;
23
27
  private consumeVerification;
24
28
  private write;
25
29
  private finalMark;
26
30
  }
27
- export declare function renderExecutionProgress(events: AsyncIterable<ExecutionEvent>, input: ExecutionProgressOptions): Promise<void>;
31
+ /**
32
+ * One renderer fed directly by the invocation's observer; events keep transport order through a
33
+ * serialization chain, and a dead destination still aborts the live frame. There is no subscription
34
+ * queue and no second state machine.
35
+ */
36
+ export declare function createExecutionProgressRenderer(input: ExecutionProgressOptions): Readonly<{
37
+ observe(event: ExecutionObservation): void;
38
+ finish(): Promise<void>;
39
+ }>;
@@ -1,5 +1,5 @@
1
- import { renderOpaqueBlock, safeText } from "./terminal.js";
2
1
  import { StatusLine } from "./status-line.js";
2
+ import { renderOpaqueBlock, safeText } from "./terminal.js";
3
3
  const LIVE_OUTPUT_BYTES = 4 * 1024;
4
4
  function boundedUtf8Prefix(value, maximumBytes = LIVE_OUTPUT_BYTES) {
5
5
  let bytes = 0;
@@ -22,9 +22,6 @@ function phaseDetail(observation) {
22
22
  return `declaration ${observation.index ?? "?"}/${observation.total ?? "?"}`;
23
23
  return observation.name === undefined ? observation.phase : `${observation.phase} · ${safeText(observation.name)}`;
24
24
  }
25
- function phaseStartLine(observation) {
26
- return `● ${[phaseDetail(observation), ...(observation.cwd === undefined ? [] : [safeText(observation.cwd)])].join(" · ")}`;
27
- }
28
25
  function phaseMark(outcome) {
29
26
  if (outcome === undefined)
30
27
  return "?";
@@ -115,21 +112,21 @@ class VerificationLiveOutput {
115
112
  return lines;
116
113
  }
117
114
  }
118
- /** Sparse rendering for consumers that do not own a live stream. */
115
+ /**
116
+ * Sparse rendering for consumers that do not own a live stream. Admitted facts and phase stages are not durable
117
+ * output: the receipt names admitted facts once, and a stage start is a live-frame claim that must never freeze
118
+ * into scrollback. Only completed verification facts and bounded live output survive here.
119
+ */
119
120
  export function executionProgressLines(event, context) {
120
121
  switch (event.kind) {
121
122
  case "admitted":
122
- return [`✓ admitted ${event.fact.kind} · ${event.contractId}`];
123
- case "verification":
124
- return event.observation.kind === "output"
125
- ? outputLines(event.observation, context)
126
- : [
127
- event.observation.state === "started"
128
- ? phaseStartLine(event.observation)
129
- : phaseFinishLine(event.observation),
130
- ];
131
123
  case "stage":
132
- return [`${event.state === "started" ? "●" : "✓"} ${event.stage}`];
124
+ return [];
125
+ case "verification": {
126
+ if (event.observation.kind === "output")
127
+ return outputLines(event.observation, context);
128
+ return event.observation.state === "started" ? [] : [phaseFinishLine(event.observation)];
129
+ }
133
130
  case "progress-dropped":
134
131
  return [`progress dropped ${event.count} event${event.count === 1 ? "" : "s"}`];
135
132
  }
@@ -179,8 +176,6 @@ export class ExecutionProgressRenderer {
179
176
  this.verificationStartedAt ??= (this.input.now ?? (() => performance.now()))();
180
177
  if (this.status.isTTY)
181
178
  this.status.show((duration) => `verify ● ${phaseDetail(observation)} · ${elapsed(duration)}`);
182
- else
183
- await this.write([phaseStartLine(observation)]);
184
179
  return;
185
180
  }
186
181
  await this.write(this.liveOutput.finish(this.input.context));
@@ -211,22 +206,30 @@ export class ExecutionProgressRenderer {
211
206
  return this.phaseFailed || this.declarationFailed ? "×" : this.phaseUnknown ? "?" : "✓";
212
207
  }
213
208
  }
214
- export async function renderExecutionProgress(events, input) {
209
+ /**
210
+ * One renderer fed directly by the invocation's observer; events keep transport order through a
211
+ * serialization chain, and a dead destination still aborts the live frame. There is no subscription
212
+ * queue and no second state machine.
213
+ */
214
+ export function createExecutionProgressRenderer(input) {
215
215
  const renderer = new ExecutionProgressRenderer(input);
216
216
  const destination = watchDestination(input.stream);
217
- const iterator = events[Symbol.asyncIterator]();
218
- try {
219
- for (;;) {
220
- const next = await Promise.race([iterator.next(), destination.promise]);
221
- if (next.done === true)
222
- break;
223
- await renderer.consume(next.value);
224
- }
225
- renderer.finish();
226
- }
227
- finally {
228
- destination.detach();
229
- }
217
+ let chain = Promise.resolve();
218
+ return {
219
+ observe: (event) => {
220
+ chain = chain.then(() => renderer.consume(event));
221
+ chain.catch(() => undefined);
222
+ },
223
+ finish: async () => {
224
+ try {
225
+ await Promise.race([destination.promise, chain]);
226
+ renderer.finish();
227
+ }
228
+ finally {
229
+ destination.detach();
230
+ }
231
+ },
232
+ };
230
233
  }
231
234
  /** Reject when the destination dies while the producer is still owned. */
232
235
  function watchDestination(stream) {
@@ -1,8 +1,7 @@
1
1
  import type { KanshiReport } from "../../kanshi/index.js";
2
2
  import { type TextRenderContext } from "./terminal.js";
3
3
  declare const NARROW_COLUMNS = 72;
4
- declare function akumaMark(life: string): string;
5
4
  declare function endpointFact(id: string, observed: string | undefined): string;
6
5
  declare function renderAkuma(report: KanshiReport, context: TextRenderContext): readonly string[];
7
6
  declare function formatAge(source: string | null | undefined, observedAt: string): string;
8
- export { akumaMark, endpointFact, formatAge, NARROW_COLUMNS, renderAkuma };
7
+ export { endpointFact, formatAge, NARROW_COLUMNS, renderAkuma };
@@ -1,5 +1,6 @@
1
1
  import { snapshotActivityLines } from "./akuma-activity.js";
2
- import { elapsedMilliseconds, entityLines, identityLine, RECENT_TONE_MS, renderSectionBlock, safeText, tone, } from "./terminal.js";
2
+ import { akumaMark } from "./marks.js";
3
+ import { ageText, elapsedMilliseconds, entityLines, identityLine, RECENT_TONE_MS, renderSectionBlock, safeText, tone, } from "./terminal.js";
3
4
  const NARROW_COLUMNS = 72;
4
5
  const ACTIVITY_INDENT = " ";
5
6
  function mostRecentTimestamp(...values) {
@@ -23,21 +24,10 @@ function akumaStatusTone(row, observedAt) {
23
24
  return "recent";
24
25
  return null;
25
26
  }
26
- function akumaMark(life) {
27
- return life === "running"
28
- ? "●"
29
- : life === "asleep"
30
- ? "○"
31
- : life === "killed"
32
- ? "×"
33
- : life === "stranded" || life === "stillborn" || life === "untidy"
34
- ? "!"
35
- : "?";
36
- }
37
27
  /** Bounded latest semantic entry, rendered by the same activity renderer as a targeted snapshot. */
38
28
  function latestActivityLines(snapshot, context) {
39
29
  const bounded = { ...context, columns: Math.max(1, context.columns - ACTIVITY_INDENT.length) };
40
- return snapshotActivityLines(snapshot, bounded, { latest: true }).map((line) => `${ACTIVITY_INDENT}${line}`);
30
+ return snapshotActivityLines(snapshot, bounded, { latest: true, tailAnswer: true }).map((line) => `${ACTIVITY_INDENT}${line}`);
41
31
  }
42
32
  function akumaLabel(row) {
43
33
  const aliases = row.aliases ?? [];
@@ -98,17 +88,6 @@ function renderAkuma(report, context) {
98
88
  function formatAge(source, observedAt) {
99
89
  if (source === null || source === undefined)
100
90
  return "—";
101
- const sourceMs = Date.parse(source);
102
- const observedMs = Date.parse(observedAt);
103
- if (sourceMs > observedMs)
104
- return "now";
105
- const seconds = Math.floor((observedMs - sourceMs) / 1_000);
106
- if (seconds < 60)
107
- return `${seconds}s`;
108
- const minutes = Math.floor(seconds / 60);
109
- if (minutes < 60)
110
- return `${minutes}m`;
111
- const hours = Math.floor(minutes / 60);
112
- return hours < 24 ? `${hours}h` : `${Math.floor(hours / 24)}d`;
91
+ return ageText(source, observedAt);
113
92
  }
114
- export { akumaMark, endpointFact, formatAge, NARROW_COLUMNS, renderAkuma };
93
+ export { endpointFact, formatAge, NARROW_COLUMNS, renderAkuma };
@@ -1,10 +1,13 @@
1
- import { abbreviateGitIds, afterWording, candidateIntegrationFacts, dependentWording, displayGitId, gateFact, gitIdsInRow, mergeSummary, targetFacts, } from "./contract-observation.js";
2
- import { DEFAULT_CLI_COLUMNS, entityLines, elapsedMilliseconds, identityLine, plumbFacts, RECENT_TONE_MS, renderSectionBlock, linkedEntityLines, safeText, tone, } from "./terminal.js";
3
- import { akumaMark, endpointFact, formatAge, NARROW_COLUMNS, renderAkuma } from "./kanshi-akuma.js";
1
+ import { abbreviateGitIds, afterWording, progressStrip, displayGitId, gateFact, gitIdsInRow, lifecycleWord, mergeSummary, targetMovementFacts, verificationFact, } from "./contract-observation.js";
2
+ import { DEFAULT_CLI_COLUMNS, entityLines, elapsedMilliseconds, identityLine, plumbFacts, RECENT_TONE_MS, renderBoundedPayload, renderSectionBlock, safeText, tone, } from "./terminal.js";
3
+ import { endpointFact, formatAge, NARROW_COLUMNS, renderAkuma } from "./kanshi-akuma.js";
4
+ import { contractMark, taskDispositionMark } from "./marks.js";
4
5
  import { dispositionText } from "./task.js";
5
6
  const REVIEW_ATTENTION_MS = 15 * 60 * 1_000;
6
7
  const PENDING_ATTENTION_MS = 60 * 60 * 1_000;
7
8
  function contractHasError(row) {
9
+ if (row.phase === "claimed" || row.phase === "abandoned")
10
+ return row.title === null;
8
11
  return (row.title === null ||
9
12
  row.gates.reports.some((report) => report.current.kind === "attested" && report.current.verdict === "unsatisfied") ||
10
13
  row.targetLag.kind === "unknown" ||
@@ -16,37 +19,13 @@ function contractStatusTone(row, observedAt) {
16
19
  if (contractHasError(row))
17
20
  return "alert";
18
21
  const phaseAge = elapsedMilliseconds(row.phaseAt, observedAt);
19
- if (row.phase === "tendered" && phaseAge !== null && phaseAge >= REVIEW_ATTENTION_MS)
22
+ if (row.phase === "delivered" && phaseAge !== null && phaseAge >= REVIEW_ATTENTION_MS)
20
23
  return "attention";
21
- if ((row.phase === "waiting" || row.phase === "bound") && phaseAge !== null && phaseAge >= PENDING_ATTENTION_MS)
24
+ if (row.phase === "bound" && phaseAge !== null && phaseAge >= PENDING_ATTENTION_MS)
22
25
  return "attention";
23
26
  const journalAge = elapsedMilliseconds(row.lastJournalAt, observedAt);
24
27
  return journalAge !== null && journalAge <= RECENT_TONE_MS ? "recent" : null;
25
28
  }
26
- function contractMark(row) {
27
- if (row.phase === "claimed")
28
- return "✓";
29
- if (row.phase === "abandoned")
30
- return "×";
31
- if (row.title === null)
32
- return "?";
33
- if (row.gates.reports.some((report) => report.current.kind === "attested" && report.current.verdict === "unsatisfied"))
34
- return "!";
35
- if (row.targetLag.kind === "unknown")
36
- return "?";
37
- if (row.phase === "waiting" || row.phase === "tendered")
38
- return "⧗";
39
- return "●";
40
- }
41
- function taskMark(row) {
42
- if (row.disposition === "done")
43
- return "✓";
44
- if (row.disposition === "drop")
45
- return "×";
46
- if (row.disposition === "on_hold")
47
- return "⧗";
48
- return row.disposition === "in_progress" ? "●" : row.disposition === "blocked" ? "‖" : "○";
49
- }
50
29
  function gitAbbreviations(report) {
51
30
  const ids = [];
52
31
  if (report.contracts.kind !== "present")
@@ -71,24 +50,9 @@ function workspaceState(row) {
71
50
  .map(([name, count]) => `${name} ${count}`);
72
51
  return counts.length === 0 ? "workspace dirty" : `workspace dirty · ${counts.join(" · ")}`;
73
52
  }
74
- function mergeFacts(row, selected, abbreviations) {
75
- const observation = row.workspaceObservation;
76
- const summary = mergeSummary(observation);
77
- if (summary === undefined ||
78
- (observation.kind !== "clean" && observation.kind !== "dirty") ||
79
- observation.merge === null)
80
- return [];
81
- if (!selected)
82
- return [summary];
83
- const paths = observation.merge.unmergedPaths;
84
- return [
85
- summary,
86
- `merge head ${displayGitId(observation.merge.head, abbreviations)}`,
87
- ...(paths.length === 0 ? ["unmerged paths none"] : paths.map((path) => `unmerged path ${path}`)),
88
- ...(observation.merge.handoffBase === undefined
89
- ? []
90
- : ["saved worktree bytes before projection", `handoff base ${observation.merge.handoffBase}`]),
91
- ];
53
+ function mergeFacts(row) {
54
+ const summary = mergeSummary(row.workspaceObservation);
55
+ return summary === undefined ? [] : [summary];
92
56
  }
93
57
  function linkedTask(report, taskId) {
94
58
  if (report.tasks.kind !== "present")
@@ -96,50 +60,31 @@ function linkedTask(report, taskId) {
96
60
  const task = report.tasks.value.rows.find((candidate) => candidate.id === taskId);
97
61
  return task === undefined
98
62
  ? `! ${taskId} · unavailable`
99
- : `${taskMark(task)} ${task.id} · ${dispositionText(task.disposition)}`;
100
- }
101
- function linkedAkuma(report, id, aliases) {
102
- const alias = aliases.length === 0 ? "" : ` (${aliases.join(" ")})`;
103
- if (report.akuma.kind !== "present")
104
- return `! ${id}${alias} · unavailable`;
105
- const akuma = report.akuma.value.rows.find((candidate) => candidate.id === id);
106
- return akuma === undefined
107
- ? `! ${id}${alias} · unavailable`
108
- : `${akumaMark(akuma.life)} ${id}${alias} · ${akuma.life} · ${formatAge("lifeAt" in akuma ? akuma.lifeAt : null, report.observedAt)}`;
63
+ : `${taskDispositionMark(task.disposition)} ${task.id} · ${dispositionText(task.disposition)}`;
109
64
  }
110
65
  function isTerminalAkuma(life) {
111
66
  return life === "killed" || life === "stillborn";
112
67
  }
113
- function linkedFacts(row, report) {
114
- const linked = [];
115
- if (row.holder.kind === "held")
116
- linked.push(linkedTask(report, row.holder.taskId));
117
- if (row.holder.kind === "unavailable")
118
- linked.push("! task · unavailable");
119
- for (const attached of row.fleet)
120
- linked.push(linkedAkuma(report, attached.id, attached.aliases));
121
- return linked;
122
- }
123
68
  function linkedAkumaSummary(row, report) {
124
- if (row.fleet.length === 0)
69
+ if (row.roster.length === 0)
125
70
  return undefined;
126
71
  if (report.akuma.kind !== "present")
127
72
  return "akuma unavailable";
128
73
  const byId = new Map(report.akuma.value.rows.map((akuma) => [akuma.id, akuma]));
129
- const known = row.fleet
74
+ const known = row.roster
130
75
  .map((attached) => byId.get(attached.id))
131
76
  .filter((akuma) => akuma !== undefined);
132
77
  if (known.length === 0)
133
- return `akuma ${row.fleet.length} · unavailable`;
78
+ return `akuma ${row.roster.length} · unavailable`;
134
79
  const live = known.filter((akuma) => !isTerminalAkuma(akuma.life)).length;
135
80
  const terminal = known.length - live;
136
- const facts = [`akuma ${row.fleet.length}`];
81
+ const facts = [`akuma ${row.roster.length}`];
137
82
  if (live > 0)
138
83
  facts.push(`${live} live`);
139
84
  if (terminal > 0)
140
85
  facts.push(`${terminal} terminal`);
141
- if (known.length < row.fleet.length)
142
- facts.push(`${row.fleet.length - known.length} unavailable`);
86
+ if (known.length < row.roster.length)
87
+ facts.push(`${row.roster.length - known.length} unavailable`);
143
88
  return facts.join(" · ");
144
89
  }
145
90
  function semanticBlock(_name, facts, _context) {
@@ -147,15 +92,48 @@ function semanticBlock(_name, facts, _context) {
147
92
  return [];
148
93
  return facts.map((fact) => ` ${safeText(fact)}`);
149
94
  }
150
- function namespaceTaskFacts(row) {
151
- if (row.namespaceTasks === undefined)
152
- return [];
153
- if (row.namespaceTasks.kind === "absent")
95
+ function payload(label, text, context) {
96
+ return renderBoundedPayload({
97
+ text,
98
+ first: ` ${label} `,
99
+ continuation: " │ ",
100
+ columns: context.columns,
101
+ maxLines: 3,
102
+ quote: "“",
103
+ openQuote: false,
104
+ truncated: false,
105
+ });
106
+ }
107
+ function liveAlarms(row, report) {
108
+ return [
109
+ ...mergeFacts(row),
110
+ ...(row.holder.kind === "unavailable" ? ["task unavailable"] : []),
111
+ ...(row.holder.kind === "held" && linkedTask(report, row.holder.taskId).startsWith("!")
112
+ ? ["task unavailable"]
113
+ : []),
114
+ ...(row.issue === undefined ? [] : ["pending reconciliation"]),
115
+ ...(row.workspaceObservation.kind === "failed" || row.workspaceObservation.kind === "unavailable"
116
+ ? [workspaceState(row)]
117
+ : []),
118
+ ].map((alarm) => `! ${alarm}`);
119
+ }
120
+ function terminalFacts(row, context, abbreviations) {
121
+ if (row.phase === "abandoned")
122
+ return row.abandonNote === undefined ? [] : payload("note", row.abandonNote, context);
123
+ const integration = row.delivery?.integration.snapshot;
124
+ const review = row.gates.reports.find((gate) => gate.gate === "reviewed");
125
+ return [
126
+ ...(integration === undefined ? [] : [`landed ${displayGitId(integration, abbreviations)}`]),
127
+ ...(review?.current.kind === "attested" && review.current.summary !== undefined
128
+ ? payload("review", review.current.summary, context)
129
+ : []),
130
+ ];
131
+ }
132
+ function staleVerificationFacts(row) {
133
+ if (row.verification?.kind !== "recorded" || row.verification.snapshot === row.delivery?.integration.snapshot)
154
134
  return [];
155
- if (row.namespaceTasks.kind === "failed") {
156
- return [`failed ${row.namespaceTasks.failure.message}`];
157
- }
158
- return row.namespaceTasks.value.map((task) => `${taskMark(task)} ${task.id} · ${dispositionText(task.disposition)} · P${task.priority} · ${task.title}`);
135
+ const fact = verificationFact(row.verification);
136
+ return fact === undefined ? [] : [fact];
159
137
  }
160
138
  function renderSelectedContractRow(row, report, context, abbreviations) {
161
139
  const title = row.title ?? "title unavailable";
@@ -164,66 +142,69 @@ function renderSelectedContractRow(row, report, context, abbreviations) {
164
142
  ...entityLines({
165
143
  mark: statusTone === null ? contractMark(row) : tone(contractMark(row), statusTone, context.color),
166
144
  identity: row.id,
167
- state: `${row.phase} · ${formatAge(row.phaseAt, report.observedAt)}`,
145
+ state: `${lifecycleWord(row.phase)} · ${formatAge(row.phaseAt, report.observedAt)}`,
168
146
  title,
169
147
  facts: [],
170
148
  context,
171
149
  }),
172
150
  ];
173
- lines.push(...semanticBlock("after", row.after.map(afterWording), context));
174
- lines.push(...semanticBlock("dependents", row.dependents.map(dependentWording), context));
175
- const gateFacts = row.gates.reports.flatMap((gate) => [
176
- `${gateFact(gate)}${gate.current.kind === "attested" ? ` · ${formatAge(gate.current.at, report.observedAt)}` : ""}`,
177
- ...(gate.current.kind === "attested" && gate.current.summary !== undefined
178
- ? [`summary ${gate.gate} · ${gate.current.summary}`]
179
- : []),
180
- ]);
181
- lines.push(...semanticBlock("gates", gateFacts, context));
182
- lines.push(...semanticBlock("candidate/integration", candidateIntegrationFacts(row.delivery, row.verification, abbreviations), context));
183
- lines.push(...semanticBlock("target", targetFacts(row, abbreviations), context));
184
- const workspaceFacts = [workspaceState(row)];
185
- if (row.workspaceObservation.kind !== "unappointed" &&
186
- row.workspaceObservation.kind !== "failed" &&
187
- row.workspaceObservation.location.kind === "worktree") {
188
- workspaceFacts.push(`worktree ${row.workspaceObservation.location.path}`);
151
+ if (row.phase === "claimed" || row.phase === "abandoned") {
152
+ const outcome = terminalFacts(row, context, abbreviations);
153
+ lines.push(...outcome.map((fact) => (fact.startsWith(" ") ? fact : ` ${safeText(fact)}`)));
154
+ return lines;
189
155
  }
190
- lines.push(...semanticBlock("workspace/merge", [...workspaceFacts, ...mergeFacts(row, true, abbreviations)], context));
191
- const attachments = [...linkedFacts(row, report)];
192
- if (row.issue !== undefined)
193
- lines.push(...plumbFacts([`lag target-checkout-retained · ${row.issue.target}`], context.columns));
194
- lines.push(...linkedEntityLines(attachments, context.columns));
195
- lines.push(...semanticBlock("namespace tasks", namespaceTaskFacts(row), context));
196
- const observation = row.workspaceObservation;
197
- if ((observation.kind === "clean" || observation.kind === "dirty") && observation.merge?.recovery !== undefined) {
198
- lines.push(` deliver ${safeText(observation.merge.recovery.deliver)} · reads worktree bytes, not index`);
156
+ if (row.phase === "bound") {
157
+ lines.push(...semanticBlock("gates", row.gates.reports.map(gateFact), context));
158
+ lines.push(...semanticBlock("prerequisites", row.after.filter((edge) => edge.endpoint.kind !== "claimed").map(afterWording), context));
159
+ lines.push(...semanticBlock("ball", [progressStrip(row)], context));
160
+ const akuma = linkedAkumaSummary(row, report);
161
+ if (akuma !== undefined)
162
+ lines.push(...semanticBlock("akuma", [akuma], context));
163
+ if (row.worktreePath !== null)
164
+ lines.push(...semanticBlock("worktree", [`worktree ${row.worktreePath}`], context));
165
+ }
166
+ else {
167
+ lines.push(...semanticBlock("ball", [progressStrip(row)], context));
168
+ lines.push(...semanticBlock("prerequisites", row.after.filter((edge) => edge.endpoint.kind !== "claimed").map(afterWording), context));
169
+ if (row.delivery !== null) {
170
+ lines.push(...semanticBlock("candidate", [
171
+ `candidate ${displayGitId(row.delivery.tenderSnapshot, abbreviations)}`,
172
+ `integration result ${displayGitId(row.delivery.integration.snapshot, abbreviations)}${row.verification?.kind === "recorded" && row.verification.snapshot === row.delivery.integration.snapshot ? ` · verification ${row.verification.verdict}` : ""}${row.targetObservation?.drift === true ? " · target moved since" : ""}`,
173
+ ...(row.targetObservation?.drift === true ? targetMovementFacts(row, abbreviations) : []),
174
+ ], context));
175
+ }
176
+ lines.push(...semanticBlock("verification", staleVerificationFacts(row), context));
177
+ const deniedReview = row.gates.reports.find((gate) => gate.gate === "reviewed" && gate.current.kind === "attested" && gate.current.verdict === "unsatisfied");
178
+ lines.push(...semanticBlock("gates", row.gates.reports
179
+ .filter((gate) => gate !== deniedReview || gate.current.kind !== "attested" || gate.current.summary === undefined)
180
+ .map(gateFact), context));
181
+ if (deniedReview?.current.kind === "attested" && deniedReview.current.summary !== undefined)
182
+ lines.push(...payload("review ×", deniedReview.current.summary, context));
199
183
  }
184
+ lines.push(...semanticBlock("alarms", liveAlarms(row, report), context));
200
185
  return lines;
201
186
  }
202
187
  function renderWorldContractRow(row, report, context) {
203
188
  const title = row.title ?? "title unavailable";
204
189
  const abbreviations = gitAbbreviations(report);
205
- const contractFacts = [
206
- ...candidateIntegrationFacts(row.delivery, row.verification, abbreviations),
207
- ...targetFacts(row, abbreviations),
208
- ...[],
209
- ...(linkedAkumaSummary(row, report) === undefined ? [] : [linkedAkumaSummary(row, report)]),
210
- ...row.after.map(afterWording),
211
- ...(row.dependents.length === 0 ? [] : [`dependents ${row.dependents.map(dependentWording).join(" · ")}`]),
212
- ...row.gates.reports.map(gateFact),
213
- ];
214
- const linkedFacts = [
215
- ...(row.holder.kind === "held" ? [linkedTask(report, row.holder.taskId)] : []),
216
- ...(row.holder.kind === "unavailable" ? ["! task · unavailable"] : []),
217
- ];
190
+ const contractFacts = row.phase === "claimed" || row.phase === "abandoned"
191
+ ? terminalFacts(row, context, abbreviations)
192
+ .filter((fact) => !fact.startsWith(" "))
193
+ .slice(0, 1)
194
+ : [
195
+ progressStrip(row),
196
+ ...(linkedAkumaSummary(row, report) === undefined ? [] : [linkedAkumaSummary(row, report)]),
197
+ ...liveAlarms(row, report),
198
+ ];
218
199
  const statusTone = contractStatusTone(row, report.observedAt);
219
200
  return entityLines({
220
201
  mark: statusTone === null ? contractMark(row) : tone(contractMark(row), statusTone, context.color),
221
202
  identity: row.id,
222
- state: `${row.phase} · ${formatAge(row.lastJournalAt, report.observedAt)}`,
203
+ state: formatAge(row.phaseAt, report.observedAt),
223
204
  title,
224
205
  facts: contractFacts,
225
206
  context,
226
- }).concat(linkedEntityLines(linkedFacts, context.columns));
207
+ });
227
208
  }
228
209
  function renderContracts(report, context) {
229
210
  const section = report.contracts;
@@ -274,12 +255,12 @@ function renderTasks(report, context) {
274
255
  const association = relation.length === 0 ? "" : ` · ${relation.join(" · ")}`;
275
256
  if (context.columns > NARROW_COLUMNS) {
276
257
  return [
277
- identityLine(taskMark(row), row.id, `· ${dispositionText(row.disposition)} · P${row.priority} · ${row.title}${association}`),
258
+ identityLine(taskDispositionMark(row.disposition), row.id, `· ${dispositionText(row.disposition)} · P${row.priority} · ${row.title}${association}`),
278
259
  ...plumbFacts([...childFacts, ...blockerFacts], context.columns),
279
260
  ];
280
261
  }
281
262
  return entityLines({
282
- mark: taskMark(row),
263
+ mark: taskDispositionMark(row.disposition),
283
264
  identity: row.id,
284
265
  state: `${dispositionText(row.disposition)} · P${row.priority}`,
285
266
  title: row.title,
@@ -299,8 +280,6 @@ function renderTasks(report, context) {
299
280
  export function renderKanshiText(report, context = { columns: DEFAULT_CLI_COLUMNS, color: false }, selection = "world") {
300
281
  if (selection === "contract")
301
282
  return renderSelectedContract(report, context).join("\n");
302
- return [renderContracts(report, context), renderAkuma(report, context), renderTasks(report, context)]
303
- .filter((block) => block.length > 0)
304
- .map((block) => block.join("\n"))
305
- .join("\n\n");
283
+ const blocks = [renderContracts(report, context), renderAkuma(report, context), renderTasks(report, context)].filter((block) => block.length > 0);
284
+ return blocks.length === 0 ? "○ world empty" : blocks.map((block) => block.join("\n")).join("\n\n");
306
285
  }
@@ -0,0 +1,13 @@
1
+ import type { AkumaLife } from "../../akuma/heart/index.js";
2
+ import type { ContractRow } from "../../protocol/read/status.js";
3
+ import type { TaskDisposition } from "../../task/board.js";
4
+ import type { TaskState } from "../../task/document.js";
5
+ export type TaskMarkWord = TaskDisposition | TaskState | "missing";
6
+ /** Akuma life marks are one vocabulary; render surfaces consume and never re-derive them. */
7
+ export declare function akumaMark(life: AkumaLife | "unborn" | "stillborn"): string;
8
+ /** Contract board marks weigh phase, gates, and target knowledge in one fixed order. */
9
+ export declare function contractMark(row: ContractRow): string;
10
+ /** The board's derived dispositions have their own exhaustive source lock. */
11
+ export declare function taskDispositionMark(disposition: TaskDisposition): string;
12
+ /** Document states and missing references reuse the board marks where they overlap. */
13
+ export declare function taskMark(word: TaskMarkWord): string;
@@ -0,0 +1,74 @@
1
+ function unreachable(value) {
2
+ throw new Error(`unhandled Task mark word: ${String(value)}`);
3
+ }
4
+ /** Akuma life marks are one vocabulary; render surfaces consume and never re-derive them. */
5
+ export function akumaMark(life) {
6
+ switch (life) {
7
+ case "running":
8
+ return "●";
9
+ case "asleep":
10
+ case "unborn":
11
+ return "○";
12
+ case "stranded":
13
+ case "untidy":
14
+ case "stillborn":
15
+ return "!";
16
+ case "killed":
17
+ return "×";
18
+ case "hung":
19
+ return "?";
20
+ default:
21
+ return unreachable(life);
22
+ }
23
+ }
24
+ /** Contract board marks weigh phase, gates, and target knowledge in one fixed order. */
25
+ export function contractMark(row) {
26
+ if (row.phase === "claimed")
27
+ return "✓";
28
+ if (row.phase === "abandoned")
29
+ return "×";
30
+ if (row.title === null)
31
+ return "?";
32
+ if (row.gates.reports.some((gate) => gate.current.kind === "attested" && gate.current.verdict === "unsatisfied"))
33
+ return "!";
34
+ if (row.targetLag.kind === "unknown")
35
+ return "?";
36
+ return "⧗";
37
+ }
38
+ /** The board's derived dispositions have their own exhaustive source lock. */
39
+ export function taskDispositionMark(disposition) {
40
+ switch (disposition) {
41
+ case "ready":
42
+ return "○";
43
+ case "blocked":
44
+ return "‖";
45
+ case "in_progress":
46
+ return "●";
47
+ case "on_hold":
48
+ return "⧗";
49
+ case "done":
50
+ return "✓";
51
+ case "drop":
52
+ return "×";
53
+ default:
54
+ return unreachable(disposition);
55
+ }
56
+ }
57
+ /** Document states and missing references reuse the board marks where they overlap. */
58
+ export function taskMark(word) {
59
+ switch (word) {
60
+ case "open":
61
+ return "○";
62
+ case "missing":
63
+ return "!";
64
+ case "ready":
65
+ case "blocked":
66
+ case "in_progress":
67
+ case "on_hold":
68
+ case "done":
69
+ case "drop":
70
+ return taskDispositionMark(word);
71
+ default:
72
+ return unreachable(word);
73
+ }
74
+ }