@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,32 +1,11 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
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 [
|
|
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 {
|
|
67
|
+
return { diagnostic, facts: [`task ${refusal.taskId}`] };
|
|
60
68
|
if (refusal.kind === "invalid-lifecycle-transition") {
|
|
61
|
-
return {
|
|
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 {
|
|
72
|
+
return { diagnostic, facts: [`path ${refusal.path}`] };
|
|
65
73
|
if (refusal.kind === "relation-owned-by-other") {
|
|
66
|
-
return {
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
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
|
-
|
|
72
|
-
}
|
|
73
|
-
|
|
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
|
-
|
|
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
|
|
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(
|
|
134
|
+
function renderRows(action, scope, result, columns) {
|
|
132
135
|
if (result.kind !== "accepted")
|
|
133
|
-
return renderFailure(
|
|
134
|
-
const view =
|
|
136
|
+
return renderFailure(action, result, columns);
|
|
137
|
+
const view = action === "ls" ? "tasks" : action;
|
|
135
138
|
const footer = result.value.hasMore ? ["…"] : [];
|
|
136
|
-
const
|
|
137
|
-
?
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
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,
|
|
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
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
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(
|
|
233
|
+
function renderMutation(action, result, columns) {
|
|
216
234
|
if (result.kind !== "accepted")
|
|
217
|
-
return renderFailure(
|
|
218
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
238
|
-
|
|
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
|
-
|
|
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
|
-
...
|
|
256
|
-
...result.
|
|
272
|
+
...planAliasLines(result.aliases),
|
|
273
|
+
...admissionLines(result.admissions),
|
|
257
274
|
];
|
|
258
275
|
for (const body of result.bodies) {
|
|
259
|
-
lines.push(`body ${body.
|
|
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
|
-
|
|
273
|
-
|
|
274
|
-
|
|
289
|
+
return [
|
|
290
|
+
`✓ composed · ${result.documentChanges.length} changed`,
|
|
291
|
+
...aliasLines(result.aliases),
|
|
292
|
+
...admissionLines(result.admissions),
|
|
293
|
+
].join("\n");
|
|
275
294
|
}
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
}
|
|
289
|
-
function
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
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
|
-
|
|
329
|
-
|
|
330
|
-
|
|
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 (
|
|
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 (
|
|
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 (
|
|
347
|
-
|
|
348
|
-
if (outcome.kind === "retry")
|
|
351
|
+
if ("kind" in result) {
|
|
352
|
+
if (result.kind === "retry")
|
|
349
353
|
return 2;
|
|
350
|
-
if (
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
}
|