@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,42 +1,12 @@
|
|
|
1
1
|
import type { WorldRoot } from "../world.js";
|
|
2
|
-
import
|
|
3
|
-
import { type
|
|
4
|
-
|
|
5
|
-
export type { TaskCompositionAlias
|
|
2
|
+
import type { TaskCompositionResult } from "./mutation-result.js";
|
|
3
|
+
import { type AcceptedComposition } from "./compose-language.js";
|
|
4
|
+
export type { TaskCompositionAdmission, TaskCompositionBodyPreview, TaskCompositionPlanAlias, TaskCompositionPlanOrder, } from "./compose-language.js";
|
|
5
|
+
export type { TaskCompositionAlias } from "./compose-language.js";
|
|
6
6
|
export { taskCompositionNamespaceHeader } from "./compose-language.js";
|
|
7
|
-
export type TaskDocumentChange = Readonly<
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
documentDiff: string;
|
|
11
|
-
}>;
|
|
12
|
-
export type TaskCompositionFacts = Readonly<{
|
|
13
|
-
aliases: readonly TaskCompositionAlias[];
|
|
14
|
-
admissionOrder: readonly TaskId[];
|
|
15
|
-
}>;
|
|
16
|
-
export type TaskCompositionResult = Readonly<{
|
|
17
|
-
kind: "planned";
|
|
18
|
-
aliases: readonly TaskCompositionAlias[];
|
|
19
|
-
admissionOrder: readonly TaskId[];
|
|
20
|
-
bodies: readonly TaskCompositionBodyPreview[];
|
|
21
|
-
}> | Readonly<{
|
|
22
|
-
kind: "accepted";
|
|
23
|
-
documentChanges: readonly TaskDocumentChange[];
|
|
24
|
-
cleanup?: TaskCleanupFailure;
|
|
25
|
-
} & TaskCompositionFacts> | Readonly<{
|
|
26
|
-
kind: "refused";
|
|
27
|
-
refusal: Extract<TaskRefusal, {
|
|
28
|
-
kind: "invalid-composition";
|
|
29
|
-
}>;
|
|
30
|
-
}> | (Readonly<{
|
|
31
|
-
kind: "incomplete";
|
|
32
|
-
documentChanges: readonly TaskDocumentChange[];
|
|
33
|
-
cleanup?: TaskCleanupFailure;
|
|
34
|
-
stopped: TaskRefusal | Readonly<{
|
|
35
|
-
kind: "retry";
|
|
36
|
-
reason: TaskRetry;
|
|
37
|
-
}>;
|
|
38
|
-
draft: string;
|
|
39
|
-
}> & TaskCompositionFacts);
|
|
7
|
+
export type TaskDocumentChange = Readonly<AcceptedComposition["documentChanges"][number]>;
|
|
8
|
+
export type TaskCompositionFacts = Readonly<Pick<AcceptedComposition, "aliases" | "admissionOrder" | "admissions">>;
|
|
9
|
+
export type { TaskCompositionResult } from "./mutation-result.js";
|
|
40
10
|
export declare function composeTasks(input: Readonly<{
|
|
41
11
|
world: WorldRoot;
|
|
42
12
|
markdown: string;
|
|
@@ -11,7 +11,7 @@ function currentTimestamp() {
|
|
|
11
11
|
return new Date().toISOString();
|
|
12
12
|
}
|
|
13
13
|
function facts(plan) {
|
|
14
|
-
return { aliases: plan.aliases, admissionOrder: plan.admissionOrder };
|
|
14
|
+
return { aliases: plan.aliases, admissionOrder: plan.admissionOrder, admissions: plannedResult(plan).admissions };
|
|
15
15
|
}
|
|
16
16
|
function reference(id, remainingAliases) {
|
|
17
17
|
const alias = remainingAliases.get(id);
|
|
@@ -56,7 +56,25 @@ function recoveryDraft(namespace, remaining) {
|
|
|
56
56
|
return `${lines.join("\n")}\n`;
|
|
57
57
|
}
|
|
58
58
|
function plannedResult(plan) {
|
|
59
|
-
|
|
59
|
+
const positions = new Map(plan.tasks.map((task) => [task.after.id, task.index + 1]));
|
|
60
|
+
return {
|
|
61
|
+
kind: "planned",
|
|
62
|
+
aliases: plan.aliases.map(({ alias, taskId }) => ({ alias, position: positions.get(taskId) })),
|
|
63
|
+
admissionOrder: plan.tasks.map((task) => ({
|
|
64
|
+
position: task.index + 1,
|
|
65
|
+
...(task.kind === "existing" ? { taskId: task.after.id } : {}),
|
|
66
|
+
...(task.alias === undefined ? {} : { alias: task.alias }),
|
|
67
|
+
})),
|
|
68
|
+
admissions: plan.admissions.map((admission) => admission.kind === "new"
|
|
69
|
+
? {
|
|
70
|
+
position: admission.position,
|
|
71
|
+
kind: "new",
|
|
72
|
+
...(admission.alias === undefined ? {} : { alias: admission.alias }),
|
|
73
|
+
title: admission.title,
|
|
74
|
+
}
|
|
75
|
+
: { position: admission.position, kind: "existing", taskId: admission.taskId, title: admission.title }),
|
|
76
|
+
bodies: plan.bodies,
|
|
77
|
+
};
|
|
60
78
|
}
|
|
61
79
|
function physicalPlanDiagnostics(plan) {
|
|
62
80
|
try {
|
|
@@ -34,6 +34,5 @@ export declare const createdTaskObservationSchema: z.ZodUnion<readonly [z.ZodObj
|
|
|
34
34
|
}, z.core.$strict>]>;
|
|
35
35
|
export type CreatedTaskObservation = z.infer<typeof createdTaskObservationSchema>;
|
|
36
36
|
export declare const EMPTY_CREATED_TASK_OBSERVATION: CreatedTaskObservation;
|
|
37
|
-
export declare function parseCreatedTaskObservation(value: unknown): CreatedTaskObservation;
|
|
38
37
|
/** Project Task board rows created by each identity, preserving input order. */
|
|
39
38
|
export declare function observeCreatedTaskObservations(world: WorldRoot, createdByIds: readonly string[]): Promise<readonly CreatedTaskObservation[]>;
|
|
@@ -6,9 +6,6 @@ export const createdTaskObservationSchema = z.union([
|
|
|
6
6
|
z.object({ kind: z.literal("failed"), diagnostic: z.string() }).strict(),
|
|
7
7
|
]);
|
|
8
8
|
export const EMPTY_CREATED_TASK_OBSERVATION = { kind: "present", rows: [] };
|
|
9
|
-
export function parseCreatedTaskObservation(value) {
|
|
10
|
-
return createdTaskObservationSchema.parse(value);
|
|
11
|
-
}
|
|
12
9
|
function observationDiagnostic(error) {
|
|
13
10
|
return error instanceof Error ? error.message : String(error);
|
|
14
11
|
}
|
|
@@ -22,5 +19,5 @@ export async function observeCreatedTaskObservations(world, createdByIds) {
|
|
|
22
19
|
const failed = { kind: "failed", diagnostic: observationDiagnostic(error) };
|
|
23
20
|
return createdByIds.map(() => failed);
|
|
24
21
|
}
|
|
25
|
-
return createdByIds.map((createdBy) =>
|
|
22
|
+
return createdByIds.map((createdBy) => ({ kind: "present", rows: board.selectCreatedBy(createdBy) }));
|
|
26
23
|
}
|
|
@@ -1,6 +1,16 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
1
2
|
import { type TaskCoordinate, type TaskId } from "./identity.js";
|
|
2
|
-
export
|
|
3
|
-
export
|
|
3
|
+
export declare const taskNonblankTextSchema: z.ZodString;
|
|
4
|
+
export declare const taskStateSchema: z.ZodEnum<{
|
|
5
|
+
open: "open";
|
|
6
|
+
in_progress: "in_progress";
|
|
7
|
+
on_hold: "on_hold";
|
|
8
|
+
done: "done";
|
|
9
|
+
drop: "drop";
|
|
10
|
+
}>;
|
|
11
|
+
export declare const taskPrioritySchema: z.ZodUnion<readonly [z.ZodLiteral<0>, z.ZodLiteral<1>, z.ZodLiteral<2>, z.ZodLiteral<3>]>;
|
|
12
|
+
export type TaskState = z.infer<typeof taskStateSchema>;
|
|
13
|
+
export type TaskPriority = z.infer<typeof taskPrioritySchema>;
|
|
4
14
|
export type TaskDocument = Readonly<{
|
|
5
15
|
id: TaskId;
|
|
6
16
|
title: string;
|
|
@@ -1,5 +1,9 @@
|
|
|
1
1
|
import { isMap, parseDocument, stringify } from "yaml";
|
|
2
|
+
import { z } from "zod";
|
|
2
3
|
import { formatTaskId, parseTaskId } from "./identity.js";
|
|
4
|
+
export const taskNonblankTextSchema = z.string().refine((value) => value.trim() !== "");
|
|
5
|
+
export const taskStateSchema = z.enum(["open", "in_progress", "on_hold", "done", "drop"]);
|
|
6
|
+
export const taskPrioritySchema = z.union([z.literal(0), z.literal(1), z.literal(2), z.literal(3)]);
|
|
3
7
|
export class TaskAuthorityCorruptionError extends Error {
|
|
4
8
|
/** The Task document whose bytes failed decode, when the reader knew its coordinate. */
|
|
5
9
|
coordinate;
|
|
@@ -1,15 +1,18 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
1
2
|
import { type ContractId } from "../core/facts/types.js";
|
|
2
3
|
export type TaskId = `task/${string}`;
|
|
3
4
|
export type TaskCoordinate = Readonly<{
|
|
4
5
|
namespace: readonly string[];
|
|
5
6
|
localId: string;
|
|
6
7
|
}>;
|
|
7
|
-
export declare const TASK_LOCK_ID_BYTES: number;
|
|
8
8
|
export declare const TASK_LOCAL_ID_BYTES: number;
|
|
9
9
|
export declare function isTaskSegment(value: string): boolean;
|
|
10
10
|
export declare function parseTaskId(value: string): TaskCoordinate;
|
|
11
11
|
export declare function formatTaskId(coordinate: TaskCoordinate): TaskId;
|
|
12
12
|
export declare function canonicalTaskId(value: string): TaskId;
|
|
13
|
+
export declare const taskIdSchema: z.ZodPipe<z.ZodString, z.ZodTransform<`task/${string}`, string>>;
|
|
14
|
+
export declare const taskNamespaceSchema: z.ZodReadonly<z.ZodArray<z.ZodString>>;
|
|
15
|
+
export declare const taskIdsSchema: z.ZodReadonly<z.ZodArray<z.ZodPipe<z.ZodString, z.ZodTransform<`task/${string}`, string>>>>;
|
|
13
16
|
export declare function contractNamespace(id: ContractId): readonly string[];
|
|
14
17
|
export declare function taskAuthorityPath(tasksDirectory: string, coordinate: TaskCoordinate): string;
|
|
15
18
|
export declare function deriveLocalStem(title: string): string;
|
|
@@ -1,14 +1,14 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
1
2
|
import { join } from "node:path";
|
|
2
3
|
import { randomBytes } from "node:crypto";
|
|
3
4
|
import { contractSegment } from "../core/facts/types.js";
|
|
4
5
|
import { identityCoordinate, identitySegments } from "../identity/coordinates.js";
|
|
5
|
-
import { normalizeIdentityStem } from "../identity/normalize.js";
|
|
6
|
+
import { fitIdentityStem, normalizeIdentityStem } from "../identity/normalize.js";
|
|
6
7
|
const STEM_CODE_POINTS = 32;
|
|
7
8
|
const TASK_FILENAME_BYTES = 255;
|
|
8
9
|
const TASK_EXTENSION_BYTES = Buffer.byteLength(".md");
|
|
9
10
|
const TASK_LOCK_EXTENSION_BYTES = Buffer.byteLength(".sqlite");
|
|
10
11
|
const GENERATED_SUFFIX = "-0000";
|
|
11
|
-
export const TASK_LOCK_ID_BYTES = TASK_FILENAME_BYTES - TASK_LOCK_EXTENSION_BYTES;
|
|
12
12
|
export const TASK_LOCAL_ID_BYTES = TASK_FILENAME_BYTES - TASK_EXTENSION_BYTES - TASK_LOCK_EXTENSION_BYTES - Buffer.byteLength(GENERATED_SUFFIX);
|
|
13
13
|
const GENERATED_STEM_BYTES = TASK_LOCAL_ID_BYTES - Buffer.byteLength(GENERATED_SUFFIX);
|
|
14
14
|
const WINDOWS_RESERVED = /^(?:con|prn|aux|nul|clock\$|com[1-9]|lpt[1-9])(?:\..*)?$/iu;
|
|
@@ -42,6 +42,23 @@ export function canonicalTaskId(value) {
|
|
|
42
42
|
throw new TypeError("task ID is not canonical");
|
|
43
43
|
return id;
|
|
44
44
|
}
|
|
45
|
+
export const taskIdSchema = z.string().transform((value, context) => {
|
|
46
|
+
try {
|
|
47
|
+
return canonicalTaskId(value);
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
context.addIssue({ code: "custom", message: "expected canonical TaskId" });
|
|
51
|
+
return z.NEVER;
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
export const taskNamespaceSchema = z.array(z.string().refine(isTaskSegment)).readonly();
|
|
55
|
+
export const taskIdsSchema = z
|
|
56
|
+
.array(taskIdSchema)
|
|
57
|
+
.superRefine((ids, context) => {
|
|
58
|
+
if (new Set(ids).size !== ids.length)
|
|
59
|
+
context.addIssue({ code: "custom", message: "TaskIds must be unique" });
|
|
60
|
+
})
|
|
61
|
+
.readonly();
|
|
45
62
|
export function contractNamespace(id) {
|
|
46
63
|
return ["kei", contractSegment(id)];
|
|
47
64
|
}
|
|
@@ -64,31 +81,18 @@ export function deriveLocalStem(title) {
|
|
|
64
81
|
fitted += `-${word}`;
|
|
65
82
|
count = candidate;
|
|
66
83
|
}
|
|
67
|
-
return
|
|
84
|
+
return fitIdentityStem({ stem: fitted, maxBytes: GENERATED_STEM_BYTES });
|
|
68
85
|
}
|
|
69
86
|
export function allocateLocalId(stem, occupied) {
|
|
70
87
|
const seed = randomBytes(2).readUInt16BE(0);
|
|
71
88
|
for (let offset = 0; offset <= 0xffff; offset += 1) {
|
|
72
89
|
const suffix = ((seed + offset) & 0xffff).toString(16).padStart(4, "0");
|
|
73
|
-
const candidate =
|
|
90
|
+
const candidate = fitIdentityStem({ stem, maxBytes: TASK_LOCAL_ID_BYTES, suffix });
|
|
74
91
|
if (!occupied.has(candidate))
|
|
75
92
|
return candidate;
|
|
76
93
|
}
|
|
77
94
|
throw new Error("task identity hexadecimal suffix space exhausted");
|
|
78
95
|
}
|
|
79
|
-
function fitPhysicalStem(stem, suffix) {
|
|
80
|
-
const maxBytes = suffix === undefined ? GENERATED_STEM_BYTES : TASK_LOCAL_ID_BYTES - Buffer.byteLength(`-${suffix}`);
|
|
81
|
-
let result = "";
|
|
82
|
-
for (const segment of new Intl.Segmenter("und", { granularity: "grapheme" }).segment(stem)) {
|
|
83
|
-
if (Buffer.byteLength(result + segment.segment) > maxBytes)
|
|
84
|
-
break;
|
|
85
|
-
result += segment.segment;
|
|
86
|
-
}
|
|
87
|
-
result = result.replace(/-+$/u, "");
|
|
88
|
-
if (result.length === 0)
|
|
89
|
-
throw new TypeError("task title cannot fit the physical filename budget");
|
|
90
|
-
return result;
|
|
91
|
-
}
|
|
92
96
|
export function physicalTaskSegment(segment, maxBytes = TASK_LOCAL_ID_BYTES) {
|
|
93
97
|
if (Buffer.byteLength(segment) <= maxBytes && !WINDOWS_RESERVED.test(segment))
|
|
94
98
|
return segment;
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import type { WorldRoot } from "../world.js";
|
|
2
|
-
import {
|
|
2
|
+
import type { NamespaceContextSource, ResolvedNamespaceContext } from "./context.js";
|
|
3
|
+
import { type ExecutionContext } from "../akuma/requests.js";
|
|
4
|
+
import { type TaskLifecycleVerb } from "./mutation.js";
|
|
3
5
|
export type { WorldRoot } from "../world.js";
|
|
4
6
|
import { type BlockedTaskRow, type TaskDetailFacts, type TaskDoctorIssue, type TaskRef, type TaskRow, type TaskTreeNode } from "./board.js";
|
|
5
|
-
import { type TaskCompositionAlias, type TaskCompositionBodyPreview, type TaskCompositionResult } from "./compose.js";
|
|
7
|
+
import { type TaskCompositionAlias, type TaskCompositionAdmission, type TaskCompositionBodyPreview, type TaskCompositionPlanAlias, type TaskCompositionPlanOrder, type TaskCompositionResult } from "./compose.js";
|
|
6
8
|
import { TaskAuthorityCorruptionError, type TaskPriority, type TaskState } from "./document.js";
|
|
7
9
|
import type { TaskId } from "./identity.js";
|
|
8
10
|
import { type AddTaskDocumentInput, type AddTaskInput, type TaskBatchResult, type TaskCleanupFailure, type TaskCompositionDiagnostic, type TaskMutationResult, type TaskOutcome, type TaskRefusal, type TaskRetry, type TaskUpdateResult, type TaskView, type UpdateTaskInput } from "./operations.js";
|
|
@@ -13,26 +15,42 @@ export type TaskDetail = Omit<TaskDetailFacts, "task"> & Readonly<{
|
|
|
13
15
|
export type TaskList = TaskOutcome<TaskPage<TaskRow>>;
|
|
14
16
|
export type BlockedTaskList = TaskOutcome<TaskPage<BlockedTaskRow>>;
|
|
15
17
|
export type TaskQueryResult = TaskOutcome<TaskPage<TaskQueryRow>>;
|
|
16
|
-
export type TaskContextSource =
|
|
17
|
-
export type ResolvedNamespaceContext
|
|
18
|
-
namespace: readonly string[];
|
|
19
|
-
source: TaskContextSource;
|
|
20
|
-
}>;
|
|
18
|
+
export type TaskContextSource = NamespaceContextSource;
|
|
19
|
+
export type { ResolvedNamespaceContext };
|
|
21
20
|
export type TaskContextResult = TaskOutcome<ResolvedNamespaceContext>;
|
|
22
21
|
export type TaskDoctorReport = Readonly<{
|
|
23
22
|
issues: readonly TaskDoctorIssue[];
|
|
24
23
|
}>;
|
|
25
24
|
export type TaskDecompositionTree = TaskOutcome<TaskTreeNode>;
|
|
26
|
-
export type { AddTaskDocumentInput, AddTaskInput, BlockedTaskRow, TaskBatchResult, TaskCleanupFailure, TaskCompositionDiagnostic, TaskCompositionAlias, TaskCompositionBodyPreview, TaskCompositionResult, TaskDoctorIssue, TaskId, TaskMutationResult, TaskOutcome, TaskPriority, TaskRef, TaskRefusal, TaskRetry, TaskRow, TaskState, TaskTreeNode, TaskUpdateResult, TaskView, UpdateTaskInput, TaskPage, TaskQueryExpression, TaskQueryPredicate, TaskQueryRow, TaskQuerySort, TaskRelationPredicateField, };
|
|
25
|
+
export type { AddTaskDocumentInput, AddTaskInput, BlockedTaskRow, TaskBatchResult, TaskCleanupFailure, TaskCompositionDiagnostic, TaskCompositionAlias, TaskCompositionAdmission, TaskCompositionBodyPreview, TaskCompositionPlanAlias, TaskCompositionPlanOrder, TaskCompositionResult, TaskDoctorIssue, TaskId, TaskMutationResult, TaskOutcome, TaskPriority, TaskRef, TaskRefusal, TaskRetry, TaskRow, TaskState, TaskTreeNode, TaskUpdateResult, TaskView, UpdateTaskInput, TaskPage, TaskQueryExpression, TaskQueryPredicate, TaskQueryRow, TaskQuerySort, TaskRelationPredicateField, };
|
|
27
26
|
export type { LibraryExecution } from "../akuma/requests.js";
|
|
28
27
|
export { TaskAuthorityCorruptionError, TASK_RELATION_PREDICATE_FIELDS };
|
|
29
28
|
export { observeRecentTaskStatus, type RecentTaskStatusRow } from "./catalog.js";
|
|
30
29
|
export { taskRowViewLimit } from "./input.js";
|
|
30
|
+
type ComposeValues = Readonly<{
|
|
31
|
+
markdown: string;
|
|
32
|
+
namespace?: readonly string[];
|
|
33
|
+
actor?: string;
|
|
34
|
+
signal?: AbortSignal;
|
|
35
|
+
}>;
|
|
36
|
+
/**
|
|
37
|
+
* The one bound operation table for a captured route. Each entry either calls the
|
|
38
|
+
* local Task operations directly or sends the same validated values as the one
|
|
39
|
+
* forwarded request shape. Validation stays in the handle methods.
|
|
40
|
+
*/
|
|
41
|
+
type TaskOperations = Readonly<{
|
|
42
|
+
add(values: AddTaskInput): Promise<TaskMutationResult>;
|
|
43
|
+
addDocument(values: AddTaskDocumentInput): Promise<TaskMutationResult>;
|
|
44
|
+
compose(values: ComposeValues): Promise<TaskCompositionResult>;
|
|
45
|
+
update(id: TaskId, values: UpdateTaskInput): Promise<TaskUpdateResult>;
|
|
46
|
+
lifecycle(id: TaskId, verb: TaskLifecycleVerb, note: string | undefined, signal?: AbortSignal): Promise<TaskMutationResult>;
|
|
47
|
+
batch(verb: TaskLifecycleVerb, ids: readonly TaskId[], note: string | undefined, signal?: AbortSignal): Promise<TaskBatchResult>;
|
|
48
|
+
}>;
|
|
31
49
|
declare class TaskHandle {
|
|
32
50
|
readonly id: TaskId;
|
|
33
51
|
private readonly world;
|
|
34
|
-
private readonly
|
|
35
|
-
constructor(id: TaskId, world: WorldRoot,
|
|
52
|
+
private readonly operations;
|
|
53
|
+
constructor(id: TaskId, world: WorldRoot, operations: TaskOperations);
|
|
36
54
|
read(): Promise<TaskDetail | null>;
|
|
37
55
|
tree(): Promise<TaskDecompositionTree>;
|
|
38
56
|
update(input: UpdateTaskInput): Promise<TaskUpdateResult>;
|
|
@@ -61,8 +79,8 @@ declare class TaskHandle {
|
|
|
61
79
|
export type Task = TaskHandle;
|
|
62
80
|
declare class TasksHandle {
|
|
63
81
|
private readonly world;
|
|
64
|
-
private readonly execution;
|
|
65
82
|
readonly root: WorldRoot;
|
|
83
|
+
private readonly operations;
|
|
66
84
|
constructor(world: WorldRoot, execution: ExecutionContext);
|
|
67
85
|
task(input: Readonly<{
|
|
68
86
|
id: string;
|
|
@@ -96,7 +114,7 @@ declare class TasksHandle {
|
|
|
96
114
|
}>): Promise<TaskQueryResult>;
|
|
97
115
|
doctor(): Promise<TaskDoctorReport>;
|
|
98
116
|
batch(input: Readonly<{
|
|
99
|
-
verb: "start" | "done" | "drop" | "hold";
|
|
117
|
+
verb: "start" | "stop" | "done" | "drop" | "hold" | "resume";
|
|
100
118
|
ids: readonly string[];
|
|
101
119
|
note?: string;
|
|
102
120
|
signal?: AbortSignal;
|
|
@@ -110,9 +128,11 @@ declare class TasksHandle {
|
|
|
110
128
|
}>): Promise<TaskCompositionResult>;
|
|
111
129
|
}
|
|
112
130
|
export type Tasks = TasksHandle;
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
131
|
+
/**
|
|
132
|
+
* The one Tasks composition. Public `of` fixes local execution; CLI and Body pass their captured
|
|
133
|
+
* internal channel through `tasksWithExecution` instead of a second constructor.
|
|
134
|
+
*/
|
|
135
|
+
export declare function tasksWithExecution(world: WorldRoot, execution: ExecutionContext): Tasks;
|
|
116
136
|
export declare const Tasks: Readonly<{
|
|
117
|
-
of(world: WorldRoot
|
|
137
|
+
of(world: WorldRoot): Tasks;
|
|
118
138
|
}>;
|
package/build/src/task/index.js
CHANGED
|
@@ -1,15 +1,19 @@
|
|
|
1
|
-
import { executionChannel,
|
|
2
|
-
import { requestForwardedTask } from "./mutation.js";
|
|
1
|
+
import { executionChannel, localExecutionContext } from "../akuma/requests.js";
|
|
2
|
+
import { requestForwardedTask, } from "./mutation.js";
|
|
3
3
|
import { buildTree, createTaskRelations, diagnoseBoard, } from "./board.js";
|
|
4
4
|
import { composeTasks, } from "./compose.js";
|
|
5
5
|
import { TaskAuthorityCorruptionError } from "./document.js";
|
|
6
6
|
import { addTask, addTaskDocument, batchTasks, blockedTasks, lifecycleTask, listTasks, queryTasks, readTaskDetail, readyTasks, taskView, updateTask, } from "./operations.js";
|
|
7
7
|
import { readBoard } from "./store.js";
|
|
8
8
|
import { actor, addInput, closed, namespace, record, signal, sort, taskRowViewLimit, taskId as id, taskIds, text, updateInput, } from "./input.js";
|
|
9
|
-
import { normalizeTaskQuery, TASK_RELATION_PREDICATE_FIELDS, } from "./query.js";
|
|
9
|
+
import { normalizeTaskQuery, taskQuerySelection, TASK_RELATION_PREDICATE_FIELDS, } from "./query.js";
|
|
10
10
|
export { TaskAuthorityCorruptionError, TASK_RELATION_PREDICATE_FIELDS };
|
|
11
11
|
export { observeRecentTaskStatus } from "./catalog.js";
|
|
12
12
|
export { taskRowViewLimit } from "./input.js";
|
|
13
|
+
function taskRoute(execution) {
|
|
14
|
+
const channel = executionChannel(execution);
|
|
15
|
+
return channel.kind === "body-request" ? { kind: "forwarded", directory: channel.directory } : { kind: "local" };
|
|
16
|
+
}
|
|
13
17
|
function forwardTask(directory, world, request, signal) {
|
|
14
18
|
return requestForwardedTask({
|
|
15
19
|
directory,
|
|
@@ -18,14 +22,66 @@ function forwardTask(directory, world, request, signal) {
|
|
|
18
22
|
...(signal === undefined ? {} : { signal }),
|
|
19
23
|
});
|
|
20
24
|
}
|
|
25
|
+
/** The single lifecycle request shapes, keyed once by verb instead of switched per handle. */
|
|
26
|
+
const SINGLE_LIFECYCLE = {
|
|
27
|
+
start: (id) => ({ action: "task.start", id }),
|
|
28
|
+
stop: (id) => ({ action: "task.stop", id }),
|
|
29
|
+
hold: (id) => ({ action: "task.hold", id }),
|
|
30
|
+
resume: (id) => ({ action: "task.resume", id }),
|
|
31
|
+
done: (id, note) => ({ action: "task.done", id, ...(note === undefined ? {} : { note }) }),
|
|
32
|
+
drop: (id, note) => ({ action: "task.drop", id, ...(note === undefined ? {} : { note }) }),
|
|
33
|
+
};
|
|
34
|
+
/** The batch lifecycle request shapes for the same verbs. */
|
|
35
|
+
const BATCH_LIFECYCLE = {
|
|
36
|
+
start: (ids) => ({ action: "task.start", ids }),
|
|
37
|
+
stop: (ids) => ({ action: "task.stop", ids }),
|
|
38
|
+
hold: (ids) => ({ action: "task.hold", ids }),
|
|
39
|
+
resume: (ids) => ({ action: "task.resume", ids }),
|
|
40
|
+
done: (ids, note) => ({ action: "task.done", ids, ...(note === undefined ? {} : { note }) }),
|
|
41
|
+
drop: (ids, note) => ({ action: "task.drop", ids, ...(note === undefined ? {} : { note }) }),
|
|
42
|
+
};
|
|
43
|
+
function taskOperations(world, route) {
|
|
44
|
+
if (route.kind === "forwarded") {
|
|
45
|
+
const { directory } = route;
|
|
46
|
+
return {
|
|
47
|
+
add: (values) => {
|
|
48
|
+
const { actor: _actor, signal, namespace: selected, ...request } = values;
|
|
49
|
+
return forwardTask(directory, world, { action: "task.add", input: { ...request, namespace: selected ?? [] } }, signal);
|
|
50
|
+
},
|
|
51
|
+
addDocument: (values) => forwardTask(directory, world, { action: "task.addDocument", input: { markdown: values.markdown, namespace: values.namespace ?? [] } }, values.signal),
|
|
52
|
+
compose: (values) => forwardTask(directory, world, { action: "task.compose", markdown: values.markdown, namespace: values.namespace ?? [] }, values.signal),
|
|
53
|
+
update: (id, values) => {
|
|
54
|
+
const { signal, ...request } = values;
|
|
55
|
+
return forwardTask(directory, world, { action: "task.update", id, input: request }, signal);
|
|
56
|
+
},
|
|
57
|
+
lifecycle: (id, verb, note, signal) => forwardTask(directory, world, SINGLE_LIFECYCLE[verb](id, note), signal),
|
|
58
|
+
batch: (verb, ids, note, signal) => forwardTask(directory, world, BATCH_LIFECYCLE[verb](ids, note), signal),
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
return {
|
|
62
|
+
add: (values) => addTask(world, values),
|
|
63
|
+
addDocument: (values) => addTaskDocument(world, values),
|
|
64
|
+
compose: (values) => composeTasks({
|
|
65
|
+
world,
|
|
66
|
+
markdown: values.markdown,
|
|
67
|
+
...(values.signal === undefined ? {} : { signal: values.signal }),
|
|
68
|
+
...(values.actor === undefined ? {} : { actor: values.actor }),
|
|
69
|
+
...(values.namespace === undefined ? {} : { defaultNamespace: values.namespace }),
|
|
70
|
+
planOnly: false,
|
|
71
|
+
}),
|
|
72
|
+
update: (id, values) => updateTask(world, id, values),
|
|
73
|
+
lifecycle: (id, verb, note, signal) => lifecycleTask(world, id, verb, signal, note),
|
|
74
|
+
batch: (verb, ids, note, signal) => batchTasks(world, verb, ids, signal, note),
|
|
75
|
+
};
|
|
76
|
+
}
|
|
21
77
|
class TaskHandle {
|
|
22
78
|
id;
|
|
23
79
|
world;
|
|
24
|
-
|
|
25
|
-
constructor(id, world,
|
|
80
|
+
operations;
|
|
81
|
+
constructor(id, world, operations) {
|
|
26
82
|
this.id = id;
|
|
27
83
|
this.world = world;
|
|
28
|
-
this.
|
|
84
|
+
this.operations = operations;
|
|
29
85
|
}
|
|
30
86
|
async read() {
|
|
31
87
|
const facts = await readTaskDetail(this.world, this.id);
|
|
@@ -41,37 +97,13 @@ class TaskHandle {
|
|
|
41
97
|
: { kind: "accepted", value: node };
|
|
42
98
|
}
|
|
43
99
|
update(input) {
|
|
44
|
-
|
|
45
|
-
const { signal: abort, ...request } = values;
|
|
46
|
-
const channel = executionChannel(this.execution);
|
|
47
|
-
if (channel.kind === "body-request") {
|
|
48
|
-
return forwardTask(channel.directory, this.world, { action: "task.update", id: this.id, input: request }, abort);
|
|
49
|
-
}
|
|
50
|
-
return updateTask(this.world, this.id, values);
|
|
100
|
+
return this.operations.update(this.id, updateInput(input));
|
|
51
101
|
}
|
|
52
102
|
lifecycle(verb, input) {
|
|
53
103
|
const value = record(input ?? {}, `${verb} input`);
|
|
54
104
|
closed(value, verb === "drop" || verb === "done" ? ["note", "signal"] : ["signal"], `${verb} input`);
|
|
55
105
|
const note = verb === "drop" || verb === "done" ? text(value.note, "note") : undefined;
|
|
56
|
-
|
|
57
|
-
const channel = executionChannel(this.execution);
|
|
58
|
-
if (channel.kind === "body-request") {
|
|
59
|
-
switch (verb) {
|
|
60
|
-
case "start":
|
|
61
|
-
return forwardTask(channel.directory, this.world, { action: "task.start", id: this.id }, abort);
|
|
62
|
-
case "stop":
|
|
63
|
-
return forwardTask(channel.directory, this.world, { action: "task.stop", id: this.id }, abort);
|
|
64
|
-
case "hold":
|
|
65
|
-
return forwardTask(channel.directory, this.world, { action: "task.hold", id: this.id }, abort);
|
|
66
|
-
case "resume":
|
|
67
|
-
return forwardTask(channel.directory, this.world, { action: "task.resume", id: this.id }, abort);
|
|
68
|
-
case "done":
|
|
69
|
-
return forwardTask(channel.directory, this.world, { action: "task.done", id: this.id, ...(note === undefined ? {} : { note }) }, abort);
|
|
70
|
-
case "drop":
|
|
71
|
-
return forwardTask(channel.directory, this.world, { action: "task.drop", id: this.id, ...(note === undefined ? {} : { note }) }, abort);
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
return lifecycleTask(this.world, this.id, verb, abort, note);
|
|
106
|
+
return this.operations.lifecycle(this.id, verb, note, signal(value.signal));
|
|
75
107
|
}
|
|
76
108
|
start(input) {
|
|
77
109
|
return this.lifecycle("start", input);
|
|
@@ -94,26 +126,20 @@ class TaskHandle {
|
|
|
94
126
|
}
|
|
95
127
|
class TasksHandle {
|
|
96
128
|
world;
|
|
97
|
-
execution;
|
|
98
129
|
root;
|
|
130
|
+
operations;
|
|
99
131
|
constructor(world, execution) {
|
|
100
132
|
this.world = world;
|
|
101
|
-
this.execution = execution;
|
|
102
133
|
this.root = world;
|
|
134
|
+
this.operations = taskOperations(world, taskRoute(execution));
|
|
103
135
|
}
|
|
104
136
|
task(input) {
|
|
105
137
|
const v = record(input, "task input");
|
|
106
138
|
closed(v, ["id"], "task input");
|
|
107
|
-
return new TaskHandle(id(v.id), this.world, this.
|
|
139
|
+
return new TaskHandle(id(v.id), this.world, this.operations);
|
|
108
140
|
}
|
|
109
141
|
add(input) {
|
|
110
|
-
|
|
111
|
-
const { actor: _actor, signal: abort, namespace: selected, ...request } = values;
|
|
112
|
-
const channel = executionChannel(this.execution);
|
|
113
|
-
if (channel.kind === "body-request") {
|
|
114
|
-
return forwardTask(channel.directory, this.world, { action: "task.add", input: { ...request, namespace: selected ?? [] } }, abort);
|
|
115
|
-
}
|
|
116
|
-
return addTask(this.world, values);
|
|
142
|
+
return this.operations.add(addInput(input));
|
|
117
143
|
}
|
|
118
144
|
addDocument(input) {
|
|
119
145
|
const v = record(input, "addDocument input");
|
|
@@ -122,17 +148,12 @@ class TasksHandle {
|
|
|
122
148
|
if (markdown === undefined)
|
|
123
149
|
throw new TypeError("markdown is required");
|
|
124
150
|
const ns = namespace(v.namespace), createdBy = actor(v.actor), abort = signal(v.signal);
|
|
125
|
-
|
|
151
|
+
return this.operations.addDocument({
|
|
126
152
|
markdown,
|
|
127
153
|
...(ns === undefined ? {} : { namespace: ns }),
|
|
128
154
|
...(createdBy === undefined ? {} : { actor: createdBy }),
|
|
129
155
|
...(abort === undefined ? {} : { signal: abort }),
|
|
130
|
-
};
|
|
131
|
-
const channel = executionChannel(this.execution);
|
|
132
|
-
if (channel.kind === "body-request") {
|
|
133
|
-
return forwardTask(channel.directory, this.world, { action: "task.addDocument", input: { markdown, namespace: ns ?? [] } }, abort);
|
|
134
|
-
}
|
|
135
|
-
return addTaskDocument(this.world, local);
|
|
156
|
+
});
|
|
136
157
|
}
|
|
137
158
|
async list(input = {}) {
|
|
138
159
|
const v = record(input, "list input");
|
|
@@ -167,15 +188,7 @@ class TasksHandle {
|
|
|
167
188
|
closed(v, ["where", "scope", "namespace", "sort", "limit"], "query input");
|
|
168
189
|
if (v.scope !== undefined && v.scope !== "namespace" && v.scope !== "world")
|
|
169
190
|
throw new TypeError("scope must be namespace or world");
|
|
170
|
-
const expression = v.where === undefined
|
|
171
|
-
? {
|
|
172
|
-
kind: "and",
|
|
173
|
-
terms: [
|
|
174
|
-
{ kind: "predicate", predicate: { field: "state", operator: "!=", value: "done" } },
|
|
175
|
-
{ kind: "predicate", predicate: { field: "state", operator: "!=", value: "drop" } },
|
|
176
|
-
],
|
|
177
|
-
}
|
|
178
|
-
: normalizeTaskQuery(v.where);
|
|
191
|
+
const expression = v.where === undefined ? taskQuerySelection() : normalizeTaskQuery(v.where);
|
|
179
192
|
const selected = namespace(v.namespace);
|
|
180
193
|
const selectedLimit = taskRowViewLimit(v.limit);
|
|
181
194
|
return queryTasks({
|
|
@@ -194,7 +207,12 @@ class TasksHandle {
|
|
|
194
207
|
const v = record(input, "batch input");
|
|
195
208
|
closed(v, ["verb", "ids", "note", "signal"], "batch input");
|
|
196
209
|
const verb = v.verb;
|
|
197
|
-
if (verb !== "start" &&
|
|
210
|
+
if (verb !== "start" &&
|
|
211
|
+
verb !== "stop" &&
|
|
212
|
+
verb !== "done" &&
|
|
213
|
+
verb !== "drop" &&
|
|
214
|
+
verb !== "hold" &&
|
|
215
|
+
verb !== "resume")
|
|
198
216
|
throw new TypeError("batch verb is invalid");
|
|
199
217
|
const ids = taskIds(v.ids, "ids");
|
|
200
218
|
if (ids === undefined || ids.length === 0)
|
|
@@ -202,21 +220,7 @@ class TasksHandle {
|
|
|
202
220
|
const note = text(v.note, "note");
|
|
203
221
|
if (note !== undefined && verb !== "done" && verb !== "drop")
|
|
204
222
|
throw new TypeError("batch note is valid only for done or drop");
|
|
205
|
-
|
|
206
|
-
const channel = executionChannel(this.execution);
|
|
207
|
-
if (channel.kind === "body-request") {
|
|
208
|
-
switch (verb) {
|
|
209
|
-
case "start":
|
|
210
|
-
return forwardTask(channel.directory, this.world, { action: "task.start", ids }, abort);
|
|
211
|
-
case "hold":
|
|
212
|
-
return forwardTask(channel.directory, this.world, { action: "task.hold", ids }, abort);
|
|
213
|
-
case "done":
|
|
214
|
-
return forwardTask(channel.directory, this.world, { action: "task.done", ids, ...(note === undefined ? {} : { note }) }, abort);
|
|
215
|
-
case "drop":
|
|
216
|
-
return forwardTask(channel.directory, this.world, { action: "task.drop", ids, ...(note === undefined ? {} : { note }) }, abort);
|
|
217
|
-
}
|
|
218
|
-
}
|
|
219
|
-
return batchTasks(this.world, verb, ids, abort, note);
|
|
223
|
+
return this.operations.batch(verb, ids, note, signal(v.signal));
|
|
220
224
|
}
|
|
221
225
|
compose(input) {
|
|
222
226
|
const v = record(input, "compose input");
|
|
@@ -229,33 +233,36 @@ class TasksHandle {
|
|
|
229
233
|
const selected = namespace(v.namespace);
|
|
230
234
|
const selectedSignal = signal(v.signal);
|
|
231
235
|
const selectedActor = actor(v.actor);
|
|
232
|
-
|
|
233
|
-
|
|
236
|
+
if (v.plan === true) {
|
|
237
|
+
// A dry-run plan never leaves the process: it composes locally on any route.
|
|
238
|
+
return composeTasks({
|
|
239
|
+
world: this.world,
|
|
240
|
+
markdown,
|
|
241
|
+
...(selectedSignal === undefined ? {} : { signal: selectedSignal }),
|
|
242
|
+
...(selectedActor === undefined ? {} : { actor: selectedActor }),
|
|
243
|
+
...(selected === undefined ? {} : { defaultNamespace: selected }),
|
|
244
|
+
planOnly: true,
|
|
245
|
+
});
|
|
246
|
+
}
|
|
247
|
+
return this.operations.compose({
|
|
234
248
|
markdown,
|
|
235
|
-
...(
|
|
249
|
+
...(selected === undefined ? {} : { namespace: selected }),
|
|
236
250
|
...(selectedActor === undefined ? {} : { actor: selectedActor }),
|
|
237
|
-
...(
|
|
238
|
-
|
|
239
|
-
};
|
|
240
|
-
const channel = executionChannel(this.execution);
|
|
241
|
-
if (channel.kind === "body-request" && v.plan !== true) {
|
|
242
|
-
return forwardTask(channel.directory, this.world, { action: "task.compose", markdown, namespace: selected ?? [] }, selectedSignal);
|
|
243
|
-
}
|
|
244
|
-
return composeTasks(local);
|
|
251
|
+
...(selectedSignal === undefined ? {} : { signal: selectedSignal }),
|
|
252
|
+
});
|
|
245
253
|
}
|
|
246
254
|
}
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
255
|
+
/**
|
|
256
|
+
* The one Tasks composition. Public `of` fixes local execution; CLI and Body pass their captured
|
|
257
|
+
* internal channel through `tasksWithExecution` instead of a second constructor.
|
|
258
|
+
*/
|
|
259
|
+
export function tasksWithExecution(world, execution) {
|
|
260
|
+
if (typeof world !== "string")
|
|
261
|
+
throw new TypeError("Tasks.of world must be a WorldRoot");
|
|
262
|
+
return new TasksHandle(world, execution);
|
|
253
263
|
}
|
|
254
264
|
export const Tasks = Object.freeze({
|
|
255
|
-
of(world
|
|
256
|
-
|
|
257
|
-
if (typeof world !== "string")
|
|
258
|
-
throw new TypeError("Tasks.of world must be a WorldRoot");
|
|
259
|
-
return new TasksHandle(world, execution);
|
|
265
|
+
of(world) {
|
|
266
|
+
return tasksWithExecution(world, localExecutionContext());
|
|
260
267
|
},
|
|
261
268
|
});
|
|
@@ -2,5 +2,5 @@ import { type SettledTaskResult, type TaskBatchResult, type TaskLifecycleVerb, t
|
|
|
2
2
|
import type { TaskId } from "./identity.js";
|
|
3
3
|
import type { WorldRoot } from "../world.js";
|
|
4
4
|
export declare function lifecycleTask(world: WorldRoot, id: TaskId, verb: TaskLifecycleVerb, signal?: AbortSignal, note?: string): Promise<TaskMutationResult>;
|
|
5
|
-
export declare function batchTasks(world: WorldRoot, verb:
|
|
5
|
+
export declare function batchTasks(world: WorldRoot, verb: TaskLifecycleVerb, ids: readonly TaskId[], signal?: AbortSignal, note?: string): Promise<TaskBatchResult>;
|
|
6
6
|
export declare function settleTask(world: WorldRoot, id: TaskId): Promise<SettledTaskResult>;
|