@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.
- package/build/integrations/marketplace/plugins/keiyaku/skills/keiyaku/SKILL.md +0 -13
- package/build/integrations/marketplace/plugins/keiyaku/skills/keiyaku-akuma/SKILL.md +47 -78
- package/build/integrations/marketplace/plugins/keiyaku/skills/keiyaku-akuma/references/automation.md +54 -41
- package/build/integrations/marketplace/plugins/keiyaku/skills/keiyaku-babysit/SKILL.md +10 -0
- package/build/integrations/marketplace/plugins/keiyaku/skills/keiyaku-bind/SKILL.md +27 -9
- package/build/integrations/marketplace/plugins/keiyaku/skills/keiyaku-workflow/SKILL.md +68 -71
- package/build/src/akuma/akuma-call.d.ts +53 -0
- package/build/src/akuma/akuma-call.js +113 -0
- package/build/src/akuma/akuma-instance.d.ts +20 -18
- package/build/src/akuma/akuma-instance.js +65 -175
- package/build/src/akuma/akuma-observe.d.ts +3 -21
- package/build/src/akuma/akuma-observe.js +7 -24
- package/build/src/akuma/{akuma-handle.d.ts → akuma-owner.d.ts} +55 -27
- package/build/src/akuma/{akuma-handle.js → akuma-owner.js} +24 -23
- package/build/src/akuma/akuma-selection-execution.d.ts +51 -0
- package/build/src/akuma/akuma-selection-execution.js +134 -0
- package/build/src/akuma/{fleet-execution.d.ts → akuma-wait.d.ts} +24 -44
- package/build/src/akuma/akuma-wait.js +113 -0
- package/build/src/akuma/akuma.d.ts +35 -89
- package/build/src/akuma/akuma.js +148 -30
- package/build/src/akuma/archetype.d.ts +12 -0
- package/build/src/akuma/archetype.js +47 -19
- package/build/src/akuma/body.d.ts +76 -36
- package/build/src/akuma/body.js +84 -49
- package/build/src/akuma/call-initial-tell.d.ts +131 -22
- package/build/src/akuma/call-initial-tell.js +31 -1
- package/build/src/akuma/call-request.d.ts +237 -31
- package/build/src/akuma/call-request.js +67 -94
- package/build/src/akuma/coordinate.d.ts +15 -5
- package/build/src/akuma/coordinate.js +12 -22
- package/build/src/akuma/dispatch-association.d.ts +1 -1
- package/build/src/akuma/dispatch-association.js +1 -10
- package/build/src/akuma/heart/activity-schema.d.ts +325 -0
- package/build/src/akuma/heart/activity-schema.js +53 -0
- package/build/src/akuma/heart/facts.d.ts +1 -6
- package/build/src/akuma/heart/index.d.ts +3 -1
- package/build/src/akuma/heart/index.js +4 -1
- package/build/src/akuma/heart/rows.d.ts +49 -2
- package/build/src/akuma/heart/rows.js +16 -2
- package/build/src/akuma/heart/soul.d.ts +1 -0
- package/build/src/akuma/heart/soul.js +6 -4
- package/build/src/akuma/heart/tells.d.ts +1 -0
- package/build/src/akuma/heart/tells.js +18 -0
- package/build/src/akuma/identity.d.ts +10 -7
- package/build/src/akuma/identity.js +23 -0
- package/build/src/akuma/index.d.ts +10 -8
- package/build/src/akuma/index.js +2 -2
- package/build/src/akuma/nuke.d.ts +3 -0
- package/build/src/akuma/nuke.js +13 -7
- package/build/src/akuma/projection.d.ts +0 -5
- package/build/src/akuma/projection.js +22 -43
- package/build/src/akuma/provider-recipe.d.ts +58 -13
- package/build/src/akuma/provider-recipe.js +62 -80
- package/build/src/akuma/provider.d.ts +6 -76
- package/build/src/akuma/provider.js +11 -219
- package/build/src/akuma/providers/acp/config.d.ts +2 -0
- package/build/src/akuma/providers/acp/config.js +26 -1
- package/build/src/akuma/providers/acp/core.d.ts +7 -0
- package/build/src/akuma/providers/acp/core.js +49 -18
- package/build/src/akuma/providers/acp/index.js +14 -6
- package/build/src/akuma/providers/grok-build/index.js +44 -13
- package/build/src/akuma/providers/index.d.ts +3 -3
- package/build/src/akuma/providers/index.js +2 -13
- package/build/src/akuma/providers/opencode-sdk/event-stream.d.ts +28 -0
- package/build/src/akuma/providers/opencode-sdk/event-stream.js +92 -0
- package/build/src/akuma/providers/opencode-sdk/events.d.ts +0 -1
- package/build/src/akuma/providers/opencode-sdk/index.js +200 -64
- package/build/src/akuma/providers/opencode-sdk/session.d.ts +41 -1
- package/build/src/akuma/providers/opencode-sdk/session.js +69 -2
- package/build/src/akuma/providers/pi/events.js +5 -2
- package/build/src/akuma/providers/pi/index.d.ts +3 -4
- package/build/src/akuma/providers/pi/index.js +99 -45
- package/build/src/akuma/publication.d.ts +84 -3
- package/build/src/akuma/publication.js +145 -2
- package/build/src/akuma/read-pool.d.ts +2 -0
- package/build/src/akuma/read-pool.js +15 -0
- package/build/src/akuma/request-rendezvous.js +10 -0
- package/build/src/akuma/request-serve.js +7 -0
- package/build/src/akuma/request-wire.d.ts +14 -26
- package/build/src/akuma/request-wire.js +4 -0
- package/build/src/akuma/requests.d.ts +0 -2
- package/build/src/akuma/requests.js +0 -17
- package/build/src/akuma/{fleet-observation.d.ts → selection-observation.d.ts} +37 -36
- package/build/src/akuma/selection-observation.js +65 -0
- package/build/src/akuma/{fleet-owner-port.d.ts → selection-owner-port.d.ts} +3 -3
- package/build/src/akuma/{fleet-owner-port.js → selection-owner-port.js} +11 -17
- package/build/src/akuma/{fleet-request.d.ts → selection-request.d.ts} +42 -82
- package/build/src/akuma/{fleet-request.js → selection-request.js} +92 -136
- package/build/src/akuma/turn-drive.js +73 -14
- package/build/src/akuma-body.js +91 -56
- package/build/src/body/amend.d.ts +5 -0
- package/build/src/body/amend.js +26 -50
- package/build/src/body/arc.d.ts +4 -2
- package/build/src/body/arc.js +19 -26
- package/build/src/body/criteria.d.ts +6 -0
- package/build/src/body/criteria.js +37 -0
- package/build/src/body/decode.js +5 -42
- package/build/src/body/region.d.ts +5 -0
- package/build/src/body/region.js +45 -2
- package/build/src/body/render.js +2 -4
- package/build/src/cli/activity.d.ts +26 -0
- package/build/src/cli/activity.js +75 -0
- package/build/src/cli/actor.d.ts +3 -1
- package/build/src/cli/actor.js +15 -2
- package/build/src/cli/commands/akuma-grammar.d.ts +75 -0
- package/build/src/cli/commands/akuma-grammar.js +414 -0
- package/build/src/cli/commands/akuma.d.ts +5 -69
- package/build/src/cli/commands/akuma.js +352 -319
- package/build/src/cli/commands/amend.d.ts +4 -5
- package/build/src/cli/commands/amend.js +1 -2
- package/build/src/cli/commands/bind.d.ts +4 -5
- package/build/src/cli/commands/bind.js +7 -10
- package/build/src/cli/commands/contract-grammar.d.ts +112 -0
- package/build/src/cli/commands/contract-grammar.js +282 -0
- package/build/src/cli/commands/contract-help.d.ts +17 -22
- package/build/src/cli/commands/contract-help.js +37 -24
- package/build/src/cli/commands/contract.d.ts +18 -97
- package/build/src/cli/commands/contract.js +621 -233
- package/build/src/cli/commands/install.d.ts +1 -1
- package/build/src/cli/commands/install.js +2 -2
- package/build/src/cli/commands/task-grammar.d.ts +19 -0
- package/build/src/cli/commands/task-grammar.js +438 -0
- package/build/src/cli/commands/task-query.js +23 -104
- package/build/src/cli/commands/task.d.ts +5 -20
- package/build/src/cli/commands/task.js +414 -364
- package/build/src/cli/coordinates.d.ts +10 -0
- package/build/src/cli/coordinates.js +20 -0
- package/build/src/cli/draft.d.ts +7 -1
- package/build/src/cli/main.js +10 -1
- package/build/src/cli/parse.d.ts +8 -9
- package/build/src/cli/parse.js +62 -62
- package/build/src/cli/render/akuma-activity.d.ts +54 -36
- package/build/src/cli/render/akuma-activity.js +262 -242
- package/build/src/cli/render/akuma-tool.d.ts +8 -4
- package/build/src/cli/render/akuma-tool.js +6 -5
- package/build/src/cli/render/akuma.d.ts +36 -16
- package/build/src/cli/render/akuma.js +65 -132
- package/build/src/cli/render/audit.d.ts +6 -2
- package/build/src/cli/render/audit.js +59 -28
- package/build/src/cli/render/catalog.d.ts +11 -2
- package/build/src/cli/render/catalog.js +75 -95
- package/build/src/cli/render/contract-history.d.ts +3 -1
- package/build/src/cli/render/contract-history.js +215 -22
- package/build/src/cli/render/contract-observation.d.ts +10 -5
- package/build/src/cli/render/contract-observation.js +29 -46
- package/build/src/cli/render/contract.d.ts +10 -3
- package/build/src/cli/render/contract.js +252 -103
- package/build/src/cli/render/effects.d.ts +26 -0
- package/build/src/cli/render/effects.js +41 -0
- package/build/src/cli/render/execution-progress.d.ts +18 -6
- package/build/src/cli/render/execution-progress.js +34 -31
- package/build/src/cli/render/kanshi-akuma.d.ts +1 -2
- package/build/src/cli/render/kanshi-akuma.js +5 -26
- package/build/src/cli/render/kanshi.js +107 -128
- package/build/src/cli/render/marks.d.ts +13 -0
- package/build/src/cli/render/marks.js +74 -0
- package/build/src/cli/render/nuke.js +18 -7
- package/build/src/cli/render/receipt.d.ts +10 -4
- package/build/src/cli/render/receipt.js +124 -44
- package/build/src/cli/render/reconcile.d.ts +5 -0
- package/build/src/cli/render/reconcile.js +152 -0
- package/build/src/cli/render/refusal.d.ts +21 -4
- package/build/src/cli/render/refusal.js +60 -33
- package/build/src/cli/render/region.js +3 -2
- package/build/src/cli/render/settings.js +2 -12
- package/build/src/cli/render/task.d.ts +37 -6
- package/build/src/cli/render/task.js +161 -157
- package/build/src/cli/render/terminal.d.ts +20 -1
- package/build/src/cli/render/terminal.js +92 -18
- package/build/src/cli/runtime.d.ts +32 -8
- package/build/src/cli/runtime.js +157 -165
- package/build/src/cli/selectors.d.ts +5 -2
- package/build/src/cli/selectors.js +11 -3
- package/build/src/cli/streams.d.ts +11 -0
- package/build/src/cli/streams.js +32 -0
- package/build/src/cli/usage.d.ts +2 -0
- package/build/src/cli/usage.js +12 -8
- package/build/src/contract-guidance.js +3 -7
- package/build/src/contract-worktree.d.ts +20 -28
- package/build/src/contract-worktree.js +18 -70
- package/build/src/coordination/durable-file.d.ts +2 -2
- package/build/src/coordination/durable-file.js +0 -27
- package/build/src/core/facts/codec.d.ts +1 -2
- package/build/src/core/facts/codec.js +6 -7
- package/build/src/core/facts/gate.d.ts +0 -1
- package/build/src/core/facts/gate.js +0 -82
- package/build/src/core/facts/types.d.ts +1 -2
- package/build/src/core/verbs/abandon.d.ts +2 -6
- package/build/src/core/verbs/abandon.js +0 -16
- package/build/src/core/verbs/amend.d.ts +0 -1
- package/build/src/core/verbs/amend.js +0 -20
- package/build/src/core/verbs/arc.d.ts +7 -8
- package/build/src/core/verbs/arc.js +2 -19
- package/build/src/core/verbs/attestation.d.ts +2 -6
- package/build/src/core/verbs/attestation.js +0 -16
- package/build/src/core/verbs/bind.d.ts +0 -1
- package/build/src/core/verbs/bind.js +0 -16
- package/build/src/core/verbs/deliver.d.ts +0 -1
- package/build/src/core/verbs/deliver.js +0 -16
- package/build/src/core/verbs/placement.d.ts +2 -1
- package/build/src/core/verbs/placement.js +10 -59
- package/build/src/git/admission.d.ts +6 -4
- package/build/src/git/admission.js +4 -0
- package/build/src/git/hooks.d.ts +55 -30
- package/build/src/git/hooks.js +30 -3
- package/build/src/git/identity.d.ts +6 -0
- package/build/src/git/identity.js +47 -0
- package/build/src/git/integration.d.ts +31 -13
- package/build/src/git/integration.js +32 -1
- package/build/src/git/nuke.d.ts +10 -1
- package/build/src/git/nuke.js +31 -11
- package/build/src/git/observe.js +2 -15
- package/build/src/git/private-state-seat.d.ts +6 -7
- package/build/src/git/private-state-seat.js +8 -6
- package/build/src/git/read-observation.d.ts +6 -1
- package/build/src/git/read-observation.js +81 -46
- package/build/src/git/reconcile.d.ts +117 -40
- package/build/src/git/reconcile.js +169 -40
- package/build/src/git/scratch.d.ts +7 -4
- package/build/src/git/scratch.js +28 -6
- package/build/src/git/target-placement.d.ts +53 -38
- package/build/src/git/target-placement.js +69 -54
- package/build/src/git/tender.d.ts +37 -28
- package/build/src/git/tender.js +39 -0
- package/build/src/git/terminal-reconcile.js +21 -23
- package/build/src/git/terminal-seal.d.ts +8 -6
- package/build/src/git/terminal-seal.js +10 -0
- package/build/src/git/workspace.d.ts +29 -15
- package/build/src/git/workspace.js +28 -2
- package/build/src/identity/normalize.js +19 -6
- package/build/src/index.d.ts +78 -7
- package/build/src/index.js +52 -4
- package/build/src/kanshi/read.d.ts +3 -3
- package/build/src/kanshi/read.js +21 -21
- package/build/src/kanshi/report.d.ts +9 -8
- package/build/src/kanshi/roster.d.ts +2 -0
- package/build/src/kanshi/roster.js +2 -0
- package/build/src/kanshi/select.js +7 -3
- package/build/src/library/address.d.ts +3 -7
- package/build/src/library/address.js +7 -7
- package/build/src/library/akuma-creation.d.ts +21 -32
- package/build/src/library/akuma-creation.js +148 -165
- package/build/src/library/akumas.d.ts +20 -22
- package/build/src/library/akumas.js +43 -20
- package/build/src/library/bind.d.ts +107 -13
- package/build/src/library/bind.js +29 -23
- package/build/src/library/continuation.d.ts +556 -28
- package/build/src/library/continuation.js +29 -54
- package/build/src/library/contract-composition.d.ts +40 -0
- package/build/src/library/contract-composition.js +105 -0
- package/build/src/library/contract-creation.d.ts +7 -0
- package/build/src/library/contract-creation.js +192 -0
- package/build/src/library/contract-execution.d.ts +29 -40
- package/build/src/library/contract-execution.js +503 -128
- package/build/src/library/contract-operations.d.ts +275 -134
- package/build/src/library/contract-operations.js +83 -92
- package/build/src/library/contract-outcomes.d.ts +71 -0
- package/build/src/library/contract-outcomes.js +32 -0
- package/build/src/library/contract-settings.d.ts +25 -0
- package/build/src/library/contract-settings.js +135 -0
- package/build/src/library/contract-types.d.ts +17 -38
- package/build/src/library/delivery.d.ts +530 -10
- package/build/src/library/delivery.js +20 -45
- package/build/src/library/input.d.ts +3 -1
- package/build/src/library/input.js +11 -16
- package/build/src/library/invocation.d.ts +87 -0
- package/build/src/library/invocation.js +290 -0
- package/build/src/library/keiyaku.d.ts +45 -22
- package/build/src/library/keiyaku.js +134 -8
- package/build/src/library/nuke.d.ts +2 -11
- package/build/src/library/nuke.js +70 -57
- package/build/src/library/outcome.d.ts +13196 -0
- package/build/src/library/outcome.js +487 -0
- package/build/src/library/reconcile.d.ts +96 -24
- package/build/src/library/reconcile.js +102 -42
- package/build/src/library/refusal.d.ts +470 -42
- package/build/src/library/refusal.js +55 -143
- package/build/src/library/region.d.ts +15 -7
- package/build/src/library/region.js +23 -3
- package/build/src/library/repo.d.ts +2 -12
- package/build/src/library/repo.js +1 -22
- package/build/src/library/selection.d.ts +121 -0
- package/build/src/library/{fleet.js → selection.js} +169 -152
- package/build/src/plugin/public.d.ts +2 -0
- package/build/src/protocol/abandon.d.ts +2 -2
- package/build/src/protocol/abandon.js +1 -0
- package/build/src/protocol/amend.js +1 -0
- package/build/src/protocol/arc.d.ts +6 -4
- package/build/src/protocol/attempt.d.ts +4 -2
- package/build/src/protocol/attempt.js +10 -0
- package/build/src/protocol/audit.d.ts +255 -52
- package/build/src/protocol/audit.js +63 -5
- package/build/src/protocol/bind.d.ts +18 -17
- package/build/src/protocol/bind.js +9 -28
- package/build/src/protocol/completion.d.ts +256 -22
- package/build/src/protocol/completion.js +100 -12
- package/build/src/protocol/deliver.d.ts +34 -23
- package/build/src/protocol/deliver.js +39 -25
- package/build/src/protocol/execution-observation.d.ts +36 -37
- package/build/src/protocol/execution-observation.js +7 -9
- package/build/src/protocol/intent.d.ts +101 -30
- package/build/src/protocol/intent.js +74 -1
- package/build/src/protocol/operations.d.ts +570 -64
- package/build/src/protocol/operations.js +189 -9
- package/build/src/protocol/outcome.d.ts +2 -1
- package/build/src/protocol/placement.d.ts +2 -2
- package/build/src/protocol/placement.js +3 -1
- package/build/src/protocol/progress.d.ts +108 -65
- package/build/src/protocol/progress.js +82 -132
- package/build/src/protocol/read/status.d.ts +4 -3
- package/build/src/protocol/read/status.js +6 -5
- package/build/src/protocol/reconcile.d.ts +3 -3
- package/build/src/protocol/reconcile.js +4 -0
- package/build/src/protocol/reintegrate.d.ts +2 -2
- package/build/src/protocol/review.d.ts +30 -12
- package/build/src/protocol/review.js +15 -24
- package/build/src/protocol/run.d.ts +34 -5
- package/build/src/protocol/run.js +24 -12
- package/build/src/runtime/proc/windows-launch.exe +0 -0
- package/build/src/settings.d.ts +0 -10
- package/build/src/settings.js +0 -76
- package/build/src/settlement/holder.d.ts +1 -1
- package/build/src/settlement/settle.d.ts +25 -16
- package/build/src/settlement/settle.js +80 -20
- package/build/src/task/board.d.ts +3 -1
- package/build/src/task/board.js +13 -17
- package/build/src/task/catalog.d.ts +0 -4
- package/build/src/task/catalog.js +0 -15
- package/build/src/task/compose-language.d.ts +19 -9
- package/build/src/task/compose-language.js +30 -20
- package/build/src/task/compose.d.ts +7 -37
- package/build/src/task/compose.js +20 -2
- package/build/src/task/created-observation.d.ts +0 -1
- package/build/src/task/created-observation.js +1 -4
- package/build/src/task/document.d.ts +12 -2
- package/build/src/task/document.js +4 -0
- package/build/src/task/identity.d.ts +4 -1
- package/build/src/task/identity.js +21 -17
- package/build/src/task/index.d.ts +36 -16
- package/build/src/task/index.js +103 -96
- package/build/src/task/lifecycle-operations.d.ts +1 -1
- package/build/src/task/mutation-result.d.ts +647 -586
- package/build/src/task/mutation-result.js +79 -46
- package/build/src/task/mutation.d.ts +298 -270
- package/build/src/task/mutation.js +93 -110
- package/build/src/task/operation-types.d.ts +6 -49
- package/build/src/task/operations.d.ts +2 -1
- package/build/src/task/operations.js +35 -12
- package/build/src/task/query.d.ts +9 -3
- package/build/src/task/query.js +42 -16
- package/build/src/task/store.d.ts +2 -1
- package/build/src/task/store.js +10 -14
- package/build/src/verification/declaration.d.ts +0 -1
- package/build/src/verification/declaration.js +1 -18
- package/build/src/verification/execution.d.ts +6 -2
- package/build/src/verification/observation.d.ts +1 -1
- package/package.json +2 -18
- package/build/src/akuma/akuma-product.d.ts +0 -58
- package/build/src/akuma/akuma-product.js +0 -276
- package/build/src/akuma/fleet-execution.js +0 -234
- package/build/src/akuma/fleet-observation.js +0 -97
- package/build/src/cli/accepted.d.ts +0 -24
- package/build/src/cli/accepted.js +0 -167
- package/build/src/cli/catalog.d.ts +0 -45
- package/build/src/cli/catalog.js +0 -1
- package/build/src/cli/commands/akuma-invoke.d.ts +0 -114
- package/build/src/cli/commands/akuma-invoke.js +0 -375
- package/build/src/cli/commands/contract-invoke.d.ts +0 -34
- package/build/src/cli/commands/contract-invoke.js +0 -259
- package/build/src/cli/commands/nuke.d.ts +0 -10
- package/build/src/cli/commands/nuke.js +0 -20
- package/build/src/cli/commands/status-set.d.ts +0 -4
- package/build/src/cli/commands/status-set.js +0 -52
- package/build/src/cli/commands/task-invoke.d.ts +0 -49
- package/build/src/cli/commands/task-invoke.js +0 -306
- package/build/src/cli/invoke.d.ts +0 -27
- package/build/src/cli/invoke.js +0 -521
- package/build/src/cli/render/board.d.ts +0 -3
- package/build/src/cli/render/board.js +0 -25
- package/build/src/cli/render/status-set.d.ts +0 -5
- package/build/src/cli/render/status-set.js +0 -19
- package/build/src/cli/render/text.d.ts +0 -3
- package/build/src/cli/render/text.js +0 -33
- package/build/src/cli/result.d.ts +0 -240
- package/build/src/cli/result.js +0 -1
- package/build/src/git/result-codec.d.ts +0 -29
- package/build/src/git/result-codec.js +0 -309
- package/build/src/kanshi/fleet.d.ts +0 -6
- package/build/src/kanshi/fleet.js +0 -27
- package/build/src/library/audit.d.ts +0 -29
- package/build/src/library/audit.js +0 -41
- package/build/src/library/composition.d.ts +0 -15
- package/build/src/library/composition.js +0 -28
- package/build/src/library/configuration.d.ts +0 -4
- package/build/src/library/configuration.js +0 -2
- package/build/src/library/contract-bind.d.ts +0 -31
- package/build/src/library/contract-bind.js +0 -140
- package/build/src/library/contract-forwarding.d.ts +0 -55
- package/build/src/library/contract-forwarding.js +0 -67
- package/build/src/library/contract-handle.d.ts +0 -50
- package/build/src/library/contract-handle.js +0 -385
- package/build/src/library/contract.d.ts +0 -46
- package/build/src/library/contract.js +0 -73
- package/build/src/library/execution-result.d.ts +0 -243
- package/build/src/library/execution-result.js +0 -101
- package/build/src/library/execution.d.ts +0 -8
- package/build/src/library/execution.js +0 -102
- package/build/src/library/fleet.d.ts +0 -83
- package/build/src/library/mutation.d.ts +0 -501
- package/build/src/library/mutation.js +0 -248
- package/build/src/library/result-codec.d.ts +0 -2
- package/build/src/library/result-codec.js +0 -12
- package/build/src/protocol/result-codec.d.ts +0 -23
- package/build/src/protocol/result-codec.js +0 -488
- package/build/src/settlement/result-codec.d.ts +0 -2
- package/build/src/settlement/result-codec.js +0 -56
- package/build/src/task/public.d.ts +0 -2
- package/build/src/task/public.js +0 -1
|
@@ -1,8 +1,12 @@
|
|
|
1
|
-
import type {
|
|
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
|
-
|
|
5
|
-
|
|
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:
|
|
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
|
-
|
|
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
|
-
/**
|
|
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 [
|
|
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
|
-
|
|
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
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
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 {
|
|
7
|
+
export { endpointFact, formatAge, NARROW_COLUMNS, renderAkuma };
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { snapshotActivityLines } from "./akuma-activity.js";
|
|
2
|
-
import {
|
|
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
|
-
|
|
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 {
|
|
93
|
+
export { endpointFact, formatAge, NARROW_COLUMNS, renderAkuma };
|
|
@@ -1,10 +1,13 @@
|
|
|
1
|
-
import { abbreviateGitIds, afterWording,
|
|
2
|
-
import { DEFAULT_CLI_COLUMNS, entityLines, elapsedMilliseconds, identityLine, plumbFacts, RECENT_TONE_MS,
|
|
3
|
-
import {
|
|
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 === "
|
|
22
|
+
if (row.phase === "delivered" && phaseAge !== null && phaseAge >= REVIEW_ATTENTION_MS)
|
|
20
23
|
return "attention";
|
|
21
|
-
if (
|
|
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
|
|
75
|
-
const
|
|
76
|
-
|
|
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
|
-
: `${
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
142
|
-
facts.push(`${row.
|
|
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
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
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
|
-
|
|
156
|
-
|
|
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
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
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
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
lines.push(...
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
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
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
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:
|
|
203
|
+
state: formatAge(row.phaseAt, report.observedAt),
|
|
223
204
|
title,
|
|
224
205
|
facts: contractFacts,
|
|
225
206
|
context,
|
|
226
|
-
})
|
|
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(
|
|
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:
|
|
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
|
-
|
|
303
|
-
|
|
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
|
+
}
|