@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,32 +1,11 @@
1
- import { outcomeLines, receiptPayload } from "./receipt.js";
2
- import { DEFAULT_CLI_COLUMNS, displayColumns, renderTextBlock, safeText } from "./terminal.js";
1
+ import { taskMark } from "./marks.js";
2
+ import { outcomeLines, receiptPayload, receiptRow, refusalLines } from "./receipt.js";
3
+ import { DEFAULT_CLI_COLUMNS, displayColumns, emptyCatalogue, safeText } from "./terminal.js";
4
+ export { taskMark } from "./marks.js";
3
5
  const DEFAULT_CONTEXT = { columns: DEFAULT_CLI_COLUMNS, color: false };
4
- function isWorldObservation(result) {
5
- return (typeof result === "object" &&
6
- result !== null &&
7
- "kind" in result &&
8
- (result.kind === "present" || result.kind === "absent" || result.kind === "failed"));
9
- }
10
- export function taskMark(word) {
11
- if (word === "in_progress")
12
- return "●";
13
- if (word === "ready" || word === "open")
14
- return "○";
15
- if (word === "blocked")
16
- return "‖";
17
- if (word === "missing")
18
- return "!";
19
- if (word === "on_hold")
20
- return "⧗";
21
- if (word === "done")
22
- return "✓";
23
- if (word === "drop")
24
- return "×";
25
- return "?";
26
- }
27
6
  /** Task dispositions and relation states are snake_case facts; people read them as words. */
28
7
  export function dispositionText(word) {
29
- return word.replaceAll("_", " ");
8
+ return word === "drop" ? "dropped" : word.replaceAll("_", " ");
30
9
  }
31
10
  function priorityText(priority) {
32
11
  return priority === null ? "P?" : `P${priority}`;
@@ -44,7 +23,28 @@ function entityLines(entity, columns, indent = "") {
44
23
  const inline = `${scan} — ${title}`;
45
24
  if (displayColumns(inline) <= columns)
46
25
  return [inline];
47
- return [`${scan} —`, ...renderTextBlock(title, `${indent} `, columns)];
26
+ return [scan, ...dashTitleLines(title, `${indent} `, columns)];
27
+ }
28
+ /** Wrap `— <title>` as one unit: the dash never dangles alone at a line end. */
29
+ function dashTitleLines(title, indent, columns) {
30
+ const words = title
31
+ .trim()
32
+ .split(/\s+/u)
33
+ .filter((word) => word.length > 0);
34
+ const unit = words.length === 0 ? [`—`] : [`— ${words[0]}`, ...words.slice(1)];
35
+ const lines = [];
36
+ let current = indent;
37
+ for (const word of unit) {
38
+ const candidate = current === indent ? `${indent}${word}` : `${current} ${word}`;
39
+ if (current !== indent && displayColumns(candidate) > columns) {
40
+ lines.push(current);
41
+ current = `${indent}${word}`;
42
+ }
43
+ else
44
+ current = candidate;
45
+ }
46
+ lines.push(current);
47
+ return lines;
48
48
  }
49
49
  function stateEntity(task) {
50
50
  return {
@@ -54,45 +54,49 @@ function stateEntity(task) {
54
54
  title: task.title,
55
55
  };
56
56
  }
57
+ const TASK_REFUSAL_WORDS = {
58
+ "task-missing": "task missing",
59
+ "invalid-lifecycle-transition": "invalid lifecycle transition",
60
+ "invalid-namespace-context": "invalid namespace context",
61
+ "relation-owned-by-other": "relation owned by other",
62
+ "invalid-composition": "invalid composition",
63
+ };
57
64
  function projectRefusal(refusal) {
65
+ const diagnostic = TASK_REFUSAL_WORDS[refusal.kind] ?? refusal.kind.replaceAll("-", " ");
58
66
  if (refusal.kind === "task-missing")
59
- return { line: `task-missing ${refusal.taskId}` };
67
+ return { diagnostic, facts: [`task ${refusal.taskId}`] };
60
68
  if (refusal.kind === "invalid-lifecycle-transition") {
61
- return { line: `invalid-lifecycle-transition ${refusal.taskId} ${refusal.state} ${refusal.verb}` };
69
+ return { diagnostic, facts: [`task ${refusal.taskId}`, `state ${refusal.state} · verb ${refusal.verb}`] };
62
70
  }
63
71
  if (refusal.kind === "invalid-namespace-context")
64
- return { line: `invalid-namespace-context ${refusal.path}` };
72
+ return { diagnostic, facts: [`path ${refusal.path}`] };
65
73
  if (refusal.kind === "relation-owned-by-other") {
66
- return { line: `relation-owned-by-other ${refusal.taskId} ${refusal.related} ${refusal.declaringTask}` };
67
- }
68
- if (refusal.kind === "invalid-composition") {
69
- return { line: refusal.kind, compositionDiagnostics: refusal.diagnostics };
74
+ return {
75
+ diagnostic,
76
+ facts: [
77
+ `task ${refusal.taskId}`,
78
+ `related task ${refusal.related}`,
79
+ `declaring task ${refusal.declaringTask}`,
80
+ ],
81
+ };
70
82
  }
71
- return { line: refusal.kind, diagnostic: refusal.diagnostic };
72
- }
73
- function appendDiagnostic(lines, diagnostic) {
74
- if (diagnostic !== undefined)
75
- receiptPayload(lines, "diagnostic", diagnostic);
83
+ if (refusal.kind === "invalid-composition")
84
+ return { diagnostic, compositionDiagnostics: refusal.diagnostics };
85
+ return refusal.diagnostic === undefined ? { diagnostic } : { diagnostic, facts: [`detail ${refusal.diagnostic}`] };
76
86
  }
77
87
  function renderFailure(verb, result, columns) {
78
88
  if (result.kind === "retry") {
79
89
  return [...outcomeLines("?", verb, "retry", undefined, columns), result.reason].join("\n");
80
90
  }
81
- const lines = [...outcomeLines("×", verb, "refused", undefined, columns)];
82
91
  const facts = projectRefusal(result.refusal);
83
- lines.push(facts.line);
84
- appendDiagnostic(lines, facts.diagnostic);
85
- for (const item of facts.compositionDiagnostics ?? []) {
86
- lines.push(`line ${item.line} · ${safeText(item.reason)} · ${safeText(item.token)}`);
87
- }
88
- return lines.join("\n");
92
+ return refusalLines(verb, [`reason ${facts.diagnostic}`, ...(facts.facts ?? [])], columns, (facts.compositionDiagnostics ?? []).map((item) => `line ${item.line} · ${safeText(item.reason)} · ${safeText(item.token)}`)).join("\n");
89
93
  }
90
94
  function edge(label, ref, mark) {
91
95
  const prefix = mark === undefined ? ` ${label}` : ` ${mark} ${label}`;
92
96
  return `${prefix} ${ref.id} · ${dispositionText(ref.state)}`;
93
97
  }
94
- function pageHeading(view) {
95
- return view;
98
+ export function taskFrameHead(view, scope) {
99
+ return `${view.toUpperCase()} // ${scope}`;
96
100
  }
97
101
  function updatedAge(updatedAt) {
98
102
  const elapsed = Math.max(0, performance.timeOrigin + performance.now() - Date.parse(updatedAt));
@@ -107,7 +111,6 @@ function updatedAge(updatedAt) {
107
111
  function compactFacts(item) {
108
112
  return [
109
113
  `updated ${updatedAge(item.updatedAt)}`,
110
- ...(item.bodyPresent ? [] : ["no body"]),
111
114
  ...(item.children === undefined ? [] : [`children ${item.children.live} live · ${item.children.total} total`]),
112
115
  ].join(" · ");
113
116
  }
@@ -128,31 +131,34 @@ function renderListRow(item, columns, omitDisposition) {
128
131
  }
129
132
  return lines;
130
133
  }
131
- function renderRows(command, result, columns) {
134
+ function renderRows(action, scope, result, columns) {
132
135
  if (result.kind !== "accepted")
133
- return renderFailure(command.action, result, columns);
134
- const view = command.action === "ls" ? "tasks" : command.action;
136
+ return renderFailure(action, result, columns);
137
+ const view = action === "ls" ? "tasks" : action;
135
138
  const footer = result.value.hasMore ? ["…"] : [];
136
- const scope = command.action === "ls"
137
- ? command.flags.world === true
138
- ? "world"
139
- : command.positionals.length > 0
140
- ? `namespace ${command.positionals[0].replace(/^task\//u, "").replace(/\/$/u, "") || "root"}`
141
- : "current namespace"
142
- : undefined;
143
- const heading = scope === undefined ? pageHeading(view) : `${pageHeading(view)} · ${scope}`;
139
+ const scopeText = scope === "world"
140
+ ? "world"
141
+ : scope === "current"
142
+ ? "current namespace"
143
+ : `namespace ${scope.namespace.replace(/^task\//u, "").replace(/\/$/u, "") || "root"}`;
144
+ const heading = taskFrameHead(view, scopeText);
145
+ if (result.value.rows.length === 0)
146
+ return emptyCatalogue(view);
144
147
  return [
145
148
  heading,
146
- ...result.value.rows.flatMap((item) => renderListRow(item, columns, command.action === "ready")),
149
+ ...result.value.rows.flatMap((item) => renderListRow(item, columns, action === "ready")),
147
150
  ...footer,
148
151
  ].join("\n");
149
152
  }
153
+ function textTimestamp(timestamp) {
154
+ return timestamp.replace(/\.\d+(?=Z$)/u, "");
155
+ }
150
156
  function renderShowDetail(result, columns) {
151
157
  const task = result.task;
152
158
  const lines = [
153
159
  ...entityLines(stateEntity(task), columns),
154
- ` created ${task.createdAt}`,
155
- ` updated ${task.updatedAt}`,
160
+ ` created ${textTimestamp(task.createdAt)}`,
161
+ ` updated ${textTimestamp(task.updatedAt)}`,
156
162
  ...(task.createdBy === undefined ? [] : [` created by ${task.createdBy}`]),
157
163
  ];
158
164
  for (const need of result.needs.filter((item) => !item.released))
@@ -206,57 +212,68 @@ function renderDoctor(report) {
206
212
  const noun = report.issues.length === 1 ? "issue" : "issues";
207
213
  return [`! doctor ${report.issues.length} ${noun}`, ...report.issues.map(doctorIssue)].join("\n");
208
214
  }
209
- function renderAcceptedMutation(verb, task, columns, documentDiff) {
210
- const lines = [...outcomeLines("✓", verb, "accepted", task.id, columns), ...entityLines(stateEntity(task), columns)];
211
- if (documentDiff !== undefined)
212
- receiptPayload(lines, "diff", documentDiff);
215
+ const PAST_VERBS = {
216
+ add: "added",
217
+ start: "started",
218
+ stop: "stopped",
219
+ hold: "held",
220
+ resume: "resumed",
221
+ done: "done",
222
+ drop: "dropped",
223
+ update: "updated",
224
+ };
225
+ function renderAcceptedMutation(verb, task, columns, changes = []) {
226
+ const lines = [];
227
+ receiptRow(lines, "✓", PAST_VERBS[verb] ?? verb, [{ text: task.id, opaque: true }], columns);
228
+ lines.push(...entityLines(stateEntity(task), columns));
229
+ for (const change of changes)
230
+ lines.push(` ${change.field} ${change.action}`);
213
231
  return lines.join("\n");
214
232
  }
215
- function renderMutation(command, result, columns) {
233
+ function renderMutation(action, result, columns) {
216
234
  if (result.kind !== "accepted")
217
- return renderFailure(command.action, result, columns);
218
- if (command.action !== "update") {
219
- return renderAcceptedMutation(command.action, result.value, columns);
220
- }
221
- const value = result.value;
222
- return renderAcceptedMutation(command.action, value.task, columns, value.documentDiff);
235
+ return renderFailure(action, result, columns);
236
+ return renderAcceptedMutation(action, result.value, columns);
223
237
  }
224
- function renderBatchItem(verb, item) {
238
+ function renderUpdate(result, columns) {
239
+ if (result.kind !== "accepted")
240
+ return renderFailure("update", result, columns);
241
+ return renderAcceptedMutation("update", result.value.task, columns, result.value.changedFields);
242
+ }
243
+ function renderBatchItem(verb, item, columns) {
225
244
  if (item.outcome.kind === "accepted")
226
- return `✓ ${verb} ${item.id}`;
245
+ return `✓ ${PAST_VERBS[verb] ?? verb} ${item.id}`;
227
246
  if (item.outcome.kind === "retry")
228
247
  return `? ${verb} ${item.id} ${item.outcome.reason}`;
229
248
  const facts = projectRefusal(item.outcome.refusal);
230
- const lines = [`× ${verb} ${item.id} ${facts.line}`];
231
- appendDiagnostic(lines, facts.diagnostic);
232
- return lines.join("\n");
249
+ return refusalLines(verb, [`task ${item.id}`, `reason ${facts.diagnostic}`, ...(facts.facts ?? [])], columns).join("\n");
233
250
  }
234
- function renderBatch(verb, batch) {
235
- return batch.items.map((item) => renderBatchItem(verb, item)).join("\n");
251
+ function renderBatch(verb, batch, columns) {
252
+ return batch.items.map((item) => renderBatchItem(verb, item, columns)).join("\n");
236
253
  }
237
- function composeDiffs(lines, changes) {
238
- for (const change of changes)
239
- receiptPayload(lines, `diff ${change.taskId}`, change.documentDiff);
254
+ function admissionLines(admissions) {
255
+ return admissions.map((admission) => `admit ${admission.position} ${admission.kind === "new" ? "+" : `@${admission.taskId}`} ${safeText(admission.title)}${admission.kind === "new" && admission.alias !== undefined ? ` as ^${admission.alias}` : ""}`);
240
256
  }
241
257
  function stoppedLines(stopped) {
242
258
  if (stopped.kind === "retry")
243
259
  return [`? stopped ${stopped.reason}`];
244
260
  const facts = projectRefusal(stopped);
245
- const lines = [`× stopped ${facts.line}`];
246
- appendDiagnostic(lines, facts.diagnostic);
247
- return lines;
261
+ return refusalLines("stopped", [`reason ${facts.diagnostic}`, ...(facts.facts ?? [])], DEFAULT_CLI_COLUMNS);
248
262
  }
249
263
  function aliasLines(aliases) {
250
264
  return aliases.map((binding) => `alias ^${binding.alias} ${binding.taskId}`);
251
265
  }
266
+ function planAliasLines(aliases) {
267
+ return aliases.map((binding) => `alias ^${binding.alias} ${binding.position}`);
268
+ }
252
269
  function renderPlan(result) {
253
270
  const lines = [
254
271
  `compose plan · ${result.admissionOrder.length} documents`,
255
- ...aliasLines(result.aliases),
256
- ...result.admissionOrder.map((id, index) => `admit ${index + 1} ${id}`),
272
+ ...planAliasLines(result.aliases),
273
+ ...admissionLines(result.admissions),
257
274
  ];
258
275
  for (const body of result.bodies) {
259
- lines.push(`body ${body.taskId} · ${body.bytes} bytes`);
276
+ lines.push(`body ${body.position} + ${safeText(body.title)} · ${body.bytes} bytes`);
260
277
  lines.push(` first ${safeText(body.firstLine)}`);
261
278
  lines.push(` last ${safeText(body.lastLine)}`);
262
279
  }
@@ -269,85 +286,72 @@ function renderCompose(result, columns) {
269
286
  return renderPlan(result);
270
287
  if (result.kind !== "accepted")
271
288
  return renderFailure("compose", result, columns);
272
- const lines = [`✓ compose accepted · ${result.documentChanges.length} changed`, ...aliasLines(result.aliases)];
273
- composeDiffs(lines, result.documentChanges);
274
- return lines.join("\n");
289
+ return [
290
+ `✓ composed · ${result.documentChanges.length} changed`,
291
+ ...aliasLines(result.aliases),
292
+ ...admissionLines(result.admissions),
293
+ ].join("\n");
275
294
  }
276
- export function renderTaskText(command, result, context = DEFAULT_CONTEXT) {
277
- if (isWorldObservation(result)) {
278
- if (result.kind === "absent")
279
- return "task world absent";
280
- if (result.kind === "failed") {
281
- const lines = ["task world failed"];
282
- receiptPayload(lines, "diagnostic", result.failure.message);
283
- return lines.join("\n");
284
- }
285
- result = result.value;
286
- }
287
- return renderTaskValue(command, result, context.columns);
288
- }
289
- function renderTaskValue(command, result, columns) {
290
- if (command.action === "show")
291
- return renderShow(result, columns);
292
- if (command.action === "ls" ||
293
- command.action === "ready" ||
294
- command.action === "blocked" ||
295
- command.action === "query") {
296
- return renderRows(command, result, columns);
297
- }
298
- if (command.action === "tree") {
299
- const tree = result;
300
- return tree.kind === "accepted"
301
- ? treeLines(tree.value, columns).join("\n")
302
- : renderFailure(command.action, tree, columns);
303
- }
304
- if (command.action === "doctor")
305
- return renderDoctor(result);
306
- if (command.action === "context") {
307
- const context = result;
308
- if (context.kind !== "accepted")
309
- return renderFailure(command.action, context, columns);
310
- const value = context.value.namespace.length === 0 ? "root" : context.value.namespace.join("/");
311
- return `context ${value} · ${context.value.source}`;
312
- }
313
- if (command.action === "compose")
314
- return renderCompose(result, columns);
315
- if (command.action === "start" ||
316
- command.action === "hold" ||
317
- command.action === "done" ||
318
- command.action === "drop") {
319
- if (!(typeof result === "object" && result !== null && "items" in result))
320
- return renderMutation(command, result, columns);
321
- return renderBatch(command.action, result);
322
- }
323
- return renderMutation(command, result, columns);
295
+ /** One addressed show selection rendered directly from its native answer. */
296
+ export function renderTaskShow(result, context = DEFAULT_CONTEXT) {
297
+ return renderShow(result, context.columns);
298
+ }
299
+ /** One list read rendered from its native answer and the leaf's presentation-only scope. */
300
+ export function renderTaskList(action, scope, result, context = DEFAULT_CONTEXT) {
301
+ return renderRows(action, scope, result, context.columns);
302
+ }
303
+ export function renderTaskTree(result, context = DEFAULT_CONTEXT) {
304
+ return result.kind === "accepted"
305
+ ? treeLines(result.value, context.columns).join("\n")
306
+ : renderFailure("tree", result, context.columns);
307
+ }
308
+ export function renderTaskDoctor(result) {
309
+ return renderDoctor(result);
310
+ }
311
+ export function renderTaskContext(result, context = DEFAULT_CONTEXT) {
312
+ if (result.kind !== "accepted")
313
+ return renderFailure("context", result, context.columns);
314
+ const value = result.value.namespace.length === 0 ? "root" : result.value.namespace.join("/");
315
+ return `context ${value} · ${result.value.source}`;
316
+ }
317
+ export function renderTaskCompose(result, context = DEFAULT_CONTEXT) {
318
+ return renderCompose(result, context.columns);
319
+ }
320
+ /** One single-Task mutation answer; `verb` is the literal action the leaf invoked. */
321
+ export function renderTaskMutation(verb, result, context = DEFAULT_CONTEXT) {
322
+ return renderMutation(verb, result, context.columns);
323
+ }
324
+ export function renderTaskUpdate(result, context = DEFAULT_CONTEXT) {
325
+ return renderUpdate(result, context.columns);
326
+ }
327
+ /** One lifecycle answer: a single mutation or a plural batch, both native shapes. */
328
+ export function renderTaskLifecycle(verb, result, context = DEFAULT_CONTEXT) {
329
+ return "items" in result ? renderBatch(verb, result, context.columns) : renderMutation(verb, result, context.columns);
330
+ }
331
+ /** A native refusal the CLI edge raised for one action, through the shared refusal grammar. */
332
+ export function renderTaskFailure(verb, result, context = DEFAULT_CONTEXT) {
333
+ return renderFailure(verb, result, context.columns);
324
334
  }
325
335
  export function renderTaskIncompleteDiagnostic(result) {
326
336
  if (result.kind !== "incomplete")
327
337
  return "";
328
- const lines = [`! compose incomplete ${result.documentChanges.length} admitted`, ...stoppedLines(result.stopped)];
329
- composeDiffs(lines, result.documentChanges);
330
- return lines.join("\n");
338
+ return [
339
+ `! compose incomplete ${result.documentChanges.length} admitted`,
340
+ ...admissionLines(result.admissions.slice(0, result.documentChanges.length)),
341
+ ...stoppedLines(result.stopped),
342
+ ].join("\n");
331
343
  }
332
344
  export function taskExitCode(result) {
333
- if (isWorldObservation(result)) {
334
- if (result.kind === "absent")
335
- return 1;
336
- if (result.kind === "failed")
337
- return 3;
338
- result = result.value;
339
- }
340
- if (typeof result === "object" && result !== null && "issues" in result)
345
+ if ("issues" in result)
341
346
  return result.issues.length === 0 ? 0 : 1;
342
- if (typeof result === "object" && result !== null && "items" in result) {
347
+ if ("items" in result) {
343
348
  const kinds = result.items.map((item) => item.outcome.kind);
344
349
  return kinds.includes("retry") ? 2 : kinds.includes("refused") ? 1 : 0;
345
350
  }
346
- if (typeof result === "object" && result !== null && "kind" in result) {
347
- const outcome = result;
348
- if (outcome.kind === "retry")
351
+ if ("kind" in result) {
352
+ if (result.kind === "retry")
349
353
  return 2;
350
- if (outcome.kind === "refused" || outcome.kind === "incomplete")
354
+ if (result.kind === "refused" || result.kind === "incomplete")
351
355
  return 1;
352
356
  }
353
357
  return 0;
@@ -1,4 +1,6 @@
1
1
  export declare const DEFAULT_CLI_COLUMNS = 100;
2
+ export declare function emptyCatalogue(surface: string): string;
3
+ export declare function orderRefusalFacts(facts: readonly string[]): readonly string[];
2
4
  export type TextRenderContext = Readonly<{
3
5
  columns: number;
4
6
  color: boolean;
@@ -19,6 +21,8 @@ export declare function takeDisplayColumnsFromEnd(value: string, maximum: number
19
21
  rest: string;
20
22
  }>;
21
23
  export declare function truncateDisplayText(value: string, maximum: number): string;
24
+ /** Pad text to a terminal-column width; raw string length is never the measuring stick. */
25
+ export declare function padToDisplay(text: string, width: number): string;
22
26
  export declare function truncateMiddleDisplayText(value: string, maximum: number): string;
23
27
  export declare function renderBoundedTextBlock(value: string, input: Readonly<{
24
28
  first: string;
@@ -27,6 +31,16 @@ export declare function renderBoundedTextBlock(value: string, input: Readonly<{
27
31
  lines?: number;
28
32
  truncated?: boolean;
29
33
  }>): readonly string[];
34
+ export declare function renderBoundedPayload(input: Readonly<{
35
+ text: string;
36
+ first: string;
37
+ continuation: string;
38
+ columns: number;
39
+ maxLines: number;
40
+ quote: string;
41
+ openQuote: boolean;
42
+ truncated: boolean;
43
+ }>): readonly string[];
30
44
  export declare function quotedText(value: string): string;
31
45
  export declare function safeText(value: string): string;
32
46
  type CheckoutNotFollowable = Readonly<{
@@ -41,9 +55,14 @@ export declare function renderOpaqueBlock(value: string, indent: string, columns
41
55
  export type SemanticTone = "dim" | "recent" | "attention" | "alert";
42
56
  export declare const RECENT_TONE_MS: number;
43
57
  export declare function elapsedMilliseconds(source: string | null | undefined, observedAt: string): number | null;
58
+ /**
59
+ * Compact age wording shared by catalog and kanshi renderers. A source later than the
60
+ * observation is reported as `future`, so each surface chooses whether clock skew is
61
+ * ordinary ("now") or worth flagging ("future").
62
+ */
63
+ export declare function ageText(source: string, observedAt: string, future?: "now" | "future"): string;
44
64
  export declare function tone(value: string, kind: SemanticTone, color: boolean): string;
45
65
  export declare function plumbFacts(facts: readonly string[], columns: number): readonly string[];
46
- export declare function linkedEntityLines(facts: readonly string[], _columns: number): readonly string[];
47
66
  export declare function identityLine(mark: string, identity: string, extra?: string): string;
48
67
  export declare function entityLines(entity: Readonly<{
49
68
  mark: string;
@@ -1,4 +1,13 @@
1
1
  export const DEFAULT_CLI_COLUMNS = 100;
2
+ export function emptyCatalogue(surface) {
3
+ return `${surface} none`;
4
+ }
5
+ export function orderRefusalFacts(facts) {
6
+ return [
7
+ ...facts.filter((fact) => !fact.startsWith("detail ")),
8
+ ...facts.filter((fact) => fact.startsWith("detail ")),
9
+ ];
10
+ }
2
11
  export function gitShortStat(stat) {
3
12
  const files = stat.filesChanged === 1 ? "1 file changed" : `${stat.filesChanged} files changed`;
4
13
  const parts = [files];
@@ -112,6 +121,11 @@ export function truncateDisplayText(value, maximum) {
112
121
  return "…";
113
122
  return `${takeDisplayColumns(clean, maximum - 1).text.replace(/…+$/u, "")}…`;
114
123
  }
124
+ /** Pad text to a terminal-column width; raw string length is never the measuring stick. */
125
+ export function padToDisplay(text, width) {
126
+ const remaining = width - displayColumns(text);
127
+ return remaining > 0 ? `${text}${" ".repeat(remaining)}` : text;
128
+ }
115
129
  export function truncateMiddleDisplayText(value, maximum) {
116
130
  const clean = safeText(value);
117
131
  if (displayColumns(clean) <= maximum)
@@ -164,6 +178,35 @@ export function renderBoundedTextBlock(value, input) {
164
178
  }
165
179
  return lines.length === 0 ? [input.first.trimEnd()] : lines;
166
180
  }
181
+ export function renderBoundedPayload(input) {
182
+ let rest = safeText(input.text).replace(/\s+/gu, " ").trim();
183
+ const lines = [];
184
+ for (let index = 0; index < input.maxLines; index += 1) {
185
+ const prefix = index === 0 ? input.first : input.continuation;
186
+ if (rest.length === 0 && !input.quote && index === 0)
187
+ return [prefix.trimEnd()];
188
+ const opening = input.quote && index === 0 ? input.quote : "";
189
+ const closing = input.quote && !input.openQuote ? (input.quote === "“" ? "”" : input.quote) : "";
190
+ const budget = Math.max(0, input.columns - displayColumns(prefix + opening + closing));
191
+ if (budget === 0)
192
+ return lines.length === 0 ? [prefix.trimEnd()] : lines;
193
+ const fragment = payloadFragment(rest, budget, index === input.maxLines - 1, input.truncated);
194
+ rest = fragment.remaining;
195
+ lines.push(`${prefix}${opening}${fragment.body}${rest.length === 0 ? closing : ""}`);
196
+ if (rest.length === 0)
197
+ break;
198
+ }
199
+ return lines;
200
+ }
201
+ function payloadFragment(rest, budget, last, forced) {
202
+ const truncated = (forced && displayColumns(rest) <= budget) || (last && (forced || displayColumns(rest) > budget));
203
+ if (truncated)
204
+ return { body: truncateDisplayText(`${rest}…`, budget), remaining: "" };
205
+ const body = takeDisplayColumns(rest, budget).text;
206
+ if (body.length === 0 && rest.length > 0)
207
+ return { body: truncateDisplayText(rest, budget), remaining: "" };
208
+ return { body, remaining: rest.slice(body.length) };
209
+ }
167
210
  export function quotedText(value) {
168
211
  return JSON.stringify(value).replaceAll(/[\p{Cc}\p{Cf}\p{Zl}\p{Zp}]/gu, (character) => character
169
212
  .split("")
@@ -212,37 +255,57 @@ export function renderTextBlock(value, indent, columns) {
212
255
  lines.push(current);
213
256
  return lines;
214
257
  }
258
+ const OPAQUE_BLOCK_MAX_LINES = 100;
215
259
  export function renderOpaqueBlock(value, indent, columns) {
216
- let rest = safeText(value);
217
- if (rest.length === 0)
260
+ if (value.length === 0)
218
261
  return [indent.trimEnd()];
219
262
  const continuation = `${indent} `;
220
263
  const lines = [];
264
+ const sourceLines = value.split("\n");
265
+ let sourceIndex = 0;
266
+ let rest = "";
221
267
  let prefix = indent;
222
- while (rest.length > 0) {
268
+ let truncated = false;
269
+ while (sourceIndex < sourceLines.length || rest.length > 0) {
270
+ if (rest.length === 0) {
271
+ rest = safeText(sourceLines[sourceIndex++] ?? "");
272
+ prefix = indent;
273
+ if (rest.length === 0) {
274
+ if (lines.length === OPAQUE_BLOCK_MAX_LINES) {
275
+ truncated = true;
276
+ break;
277
+ }
278
+ if (lines.at(-1) === indent.trimEnd())
279
+ continue;
280
+ lines.push(indent.trimEnd());
281
+ continue;
282
+ }
283
+ }
284
+ if (lines.length === OPAQUE_BLOCK_MAX_LINES) {
285
+ truncated = true;
286
+ break;
287
+ }
223
288
  const budget = columns - displayColumns(prefix);
224
289
  if (budget <= 0) {
225
- if (prefix === continuation) {
226
- lines.push(`${prefix}${rest}`);
227
- break;
228
- }
229
290
  lines.push(prefix.trimEnd());
230
291
  prefix = continuation;
231
292
  continue;
232
293
  }
233
- if (displayColumns(rest) <= budget) {
234
- lines.push(`${prefix}${rest}`);
235
- break;
236
- }
237
294
  const taken = takeDisplayColumns(rest, budget);
238
295
  if (taken.text.length === 0) {
239
296
  lines.push(`${prefix}${rest}`);
240
- break;
297
+ rest = "";
298
+ continue;
241
299
  }
242
300
  lines.push(`${prefix}${taken.text}`);
243
301
  rest = taken.rest;
244
302
  prefix = continuation;
245
303
  }
304
+ if (truncated || sourceIndex < sourceLines.length || rest.length > 0) {
305
+ const omittedLines = sourceLines.length - sourceIndex + (rest.length > 0 ? 1 : 0);
306
+ const omitted = omittedLines > 1 ? `${omittedLines} lines` : `${Math.max(1, omittedLines)} line`;
307
+ lines[OPAQUE_BLOCK_MAX_LINES - 1] = `${indent}… (${omitted} omitted)`;
308
+ }
246
309
  return lines;
247
310
  }
248
311
  export const RECENT_TONE_MS = 5 * 60 * 1_000;
@@ -255,6 +318,23 @@ export function elapsedMilliseconds(source, observedAt) {
255
318
  return null;
256
319
  return Math.max(0, observedMs - sourceMs);
257
320
  }
321
+ /**
322
+ * Compact age wording shared by catalog and kanshi renderers. A source later than the
323
+ * observation is reported as `future`, so each surface chooses whether clock skew is
324
+ * ordinary ("now") or worth flagging ("future").
325
+ */
326
+ export function ageText(source, observedAt, future = "now") {
327
+ const seconds = Math.floor((Date.parse(observedAt) - Date.parse(source)) / 1_000);
328
+ if (seconds < 0)
329
+ return future;
330
+ if (seconds < 60)
331
+ return `${seconds}s`;
332
+ const minutes = Math.floor(seconds / 60);
333
+ if (minutes < 60)
334
+ return `${minutes}m`;
335
+ const hours = Math.floor(minutes / 60);
336
+ return hours < 24 ? `${hours}h` : `${Math.floor(hours / 24)}d`;
337
+ }
258
338
  export function tone(value, kind, color) {
259
339
  if (!color)
260
340
  return value;
@@ -277,12 +357,6 @@ export function plumbFacts(facts, columns) {
277
357
  lines.push(current);
278
358
  return lines;
279
359
  }
280
- export function linkedEntityLines(facts, _columns) {
281
- return facts
282
- .map(safeText)
283
- .filter((fact) => fact.length > 0)
284
- .map((fact) => ` │ ${fact}`);
285
- }
286
360
  export function identityLine(mark, identity, extra = "") {
287
361
  return extra.length === 0 ? `${mark} ${safeText(identity)}` : `${mark} ${safeText(identity)} ${safeText(extra)}`;
288
362
  }