@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
package/build/src/akuma-body.js
CHANGED
|
@@ -1,14 +1,19 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { resolve } from "node:path";
|
|
2
|
+
import { fileURLToPath } from "node:url";
|
|
3
|
+
import { bodyLaunchSchema, LEASH_HELD_EXIT, runAkumaBody } from "./akuma/body.js";
|
|
2
4
|
import { worldRootForAkumaPaths } from "./akuma/identity.js";
|
|
3
|
-
import { World } from "./world.js";
|
|
4
|
-
import { fleetRequestPort } from "./akuma/fleet-owner-port.js";
|
|
5
|
-
import { fleetRequestCommands } from "./akuma/fleet-request.js";
|
|
6
|
-
import { worktreeHooksFrom } from "./git/hooks.js";
|
|
7
|
-
import { contractRequestCommands, executeForwardedAudit, executeForwardedDeliver, executeForwardedReview, } from "./library/contract-operations.js";
|
|
8
|
-
import { Repo } from "./library/repo.js";
|
|
9
|
-
import { requireBranchesToBeUpToDateFrom, settings } from "./settings.js";
|
|
10
|
-
import { executeTaskMutation, taskMutationRequestCommands } from "./task/mutation.js";
|
|
11
5
|
import { composeRequestCommands } from "./akuma/request-wire.js";
|
|
6
|
+
import { localExecutionContext } from "./akuma/requests.js";
|
|
7
|
+
import { selectionRequestPort } from "./akuma/selection-owner-port.js";
|
|
8
|
+
import { selectionRequestCommands } from "./akuma/selection-request.js";
|
|
9
|
+
import { composeContractLibrary } from "./library/contract-composition.js";
|
|
10
|
+
import { contractRequestCommands } from "./library/contract-operations.js";
|
|
11
|
+
import { createKeiyakuHandle } from "./library/keiyaku.js";
|
|
12
|
+
import { Repo } from "./library/repo.js";
|
|
13
|
+
import { settings } from "./settings.js";
|
|
14
|
+
import { Tasks } from "./task/index.js";
|
|
15
|
+
import { taskMutationRequestCommands } from "./task/mutation.js";
|
|
16
|
+
import { World } from "./world.js";
|
|
12
17
|
async function contractDependencies(repoRoot, processConfiguration) {
|
|
13
18
|
const repo = await Repo.at({
|
|
14
19
|
path: repoRoot,
|
|
@@ -23,82 +28,112 @@ async function contractDependencies(repoRoot, processConfiguration) {
|
|
|
23
28
|
});
|
|
24
29
|
return [repo, configuration];
|
|
25
30
|
}
|
|
31
|
+
function contractChannel(repo, contractId, requester, configuration) {
|
|
32
|
+
return composeContractLibrary(localExecutionContext(), createKeiyakuHandle, {
|
|
33
|
+
settings: configuration,
|
|
34
|
+
actor: requester,
|
|
35
|
+
}).select({
|
|
36
|
+
repo,
|
|
37
|
+
id: contractId,
|
|
38
|
+
});
|
|
39
|
+
}
|
|
26
40
|
function contractUpstream(processConfiguration) {
|
|
27
41
|
return {
|
|
28
42
|
audit: async (input) => {
|
|
29
43
|
const [repo, configuration] = await contractDependencies(input.repoRoot, processConfiguration);
|
|
30
|
-
return await
|
|
31
|
-
repo,
|
|
32
|
-
...(input.observe === undefined ? {} : { observe: input.observe }),
|
|
33
|
-
contractId: input.contractId,
|
|
34
|
-
requester: input.requester,
|
|
44
|
+
return await contractChannel(repo, input.contractId, input.requester, configuration).audit({
|
|
35
45
|
includeDirty: input.includeDirty,
|
|
36
46
|
showDiff: input.showDiff,
|
|
37
|
-
requireBranchesToBeUpToDate: requireBranchesToBeUpToDateFrom({ settings: configuration }),
|
|
38
|
-
hooks: worktreeHooksFrom({ settings: configuration }),
|
|
39
47
|
signal: input.signal,
|
|
40
|
-
});
|
|
48
|
+
}, input.observe === undefined ? undefined : { observe: input.observe });
|
|
41
49
|
},
|
|
42
50
|
deliver: async (input) => {
|
|
43
51
|
const [repo, configuration] = await contractDependencies(input.repoRoot, processConfiguration);
|
|
44
|
-
return await
|
|
45
|
-
repo,
|
|
46
|
-
...(input.observe === undefined ? {} : { observe: input.observe }),
|
|
47
|
-
contractId: input.contractId,
|
|
48
|
-
requester: input.requester,
|
|
49
|
-
...(input.message === undefined ? {} : { message: input.message }),
|
|
52
|
+
return await contractChannel(repo, input.contractId, input.requester, configuration).deliver({
|
|
50
53
|
includeDirty: input.includeDirty,
|
|
51
54
|
materializeConflict: input.materializeConflict,
|
|
52
|
-
|
|
53
|
-
|
|
55
|
+
...(input.message === undefined ? {} : { message: input.message }),
|
|
56
|
+
...(input.overwrite === undefined ? {} : { overwrite: input.overwrite }),
|
|
54
57
|
signal: input.signal,
|
|
55
|
-
});
|
|
58
|
+
}, input.observe === undefined ? undefined : { observe: input.observe });
|
|
56
59
|
},
|
|
57
60
|
review: async (input) => {
|
|
58
61
|
const [repo, configuration] = await contractDependencies(input.repoRoot, processConfiguration);
|
|
59
|
-
return await
|
|
60
|
-
repo,
|
|
61
|
-
...(input.observe === undefined ? {} : { observe: input.observe }),
|
|
62
|
-
contractId: input.contractId,
|
|
63
|
-
requester: input.requester,
|
|
62
|
+
return await contractChannel(repo, input.contractId, input.requester, configuration).review({
|
|
64
63
|
verdict: input.verdict,
|
|
65
|
-
signal: input.signal,
|
|
66
64
|
...(input.summary === undefined ? {} : { summary: input.summary }),
|
|
67
|
-
|
|
68
|
-
});
|
|
65
|
+
signal: input.signal,
|
|
66
|
+
}, input.observe === undefined ? undefined : { observe: input.observe });
|
|
69
67
|
},
|
|
70
68
|
};
|
|
71
69
|
}
|
|
70
|
+
const TASK_LIFECYCLE = {
|
|
71
|
+
start: async (handle, input) => await handle.start(input),
|
|
72
|
+
stop: async (handle, input) => await handle.stop(input),
|
|
73
|
+
hold: async (handle, input) => await handle.hold(input),
|
|
74
|
+
resume: async (handle, input) => await handle.resume(input),
|
|
75
|
+
done: async (handle, input) => await handle.done(input),
|
|
76
|
+
drop: async (handle, input) => await handle.drop(input),
|
|
77
|
+
};
|
|
78
|
+
/**
|
|
79
|
+
* The upper Body edge composes the forced-local Tasks SDK the descriptor
|
|
80
|
+
* execution entries consume. Each ability is one ordinary local product
|
|
81
|
+
* operation; no generic task(request) dispatcher is introduced here.
|
|
82
|
+
*/
|
|
72
83
|
function taskMutationRequestPort() {
|
|
73
84
|
return {
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
85
|
+
add: async ({ world, options }) => await Tasks.of(world).add(options),
|
|
86
|
+
addDocument: async ({ world, document }) => await Tasks.of(world).addDocument(document),
|
|
87
|
+
compose: async ({ world, markdown, defaultNamespace, actor, signal }) => await Tasks.of(world).compose({
|
|
88
|
+
markdown,
|
|
89
|
+
namespace: defaultNamespace,
|
|
90
|
+
actor,
|
|
91
|
+
...(signal === undefined ? {} : { signal }),
|
|
92
|
+
}),
|
|
93
|
+
update: async ({ world, id, options }) => await Tasks.of(world).task({ id }).update(options),
|
|
94
|
+
lifecycle: async ({ world, verb, id, note, signal }) => await TASK_LIFECYCLE[verb](Tasks.of(world).task({ id }), {
|
|
95
|
+
...(note === undefined ? {} : { note }),
|
|
96
|
+
...(signal === undefined ? {} : { signal }),
|
|
97
|
+
}),
|
|
98
|
+
batch: async ({ world, verb, ids, note, signal }) => await Tasks.of(world).batch({
|
|
99
|
+
verb,
|
|
100
|
+
ids,
|
|
101
|
+
...(note === undefined ? {} : { note }),
|
|
102
|
+
...(signal === undefined ? {} : { signal }),
|
|
79
103
|
}),
|
|
80
104
|
};
|
|
81
105
|
}
|
|
82
|
-
const encoded = process.argv[2];
|
|
83
|
-
if (encoded === undefined)
|
|
84
|
-
throw new TypeError("Akuma body launch payload is missing");
|
|
85
|
-
const launch = JSON.parse(Buffer.from(encoded, "base64url").toString("utf8"));
|
|
86
|
-
const mappedHome = process.env.KEIYAKU_HOME?.trim();
|
|
87
|
-
const mappedGitPath = process.env.KEIYAKU_GIT_PATH;
|
|
88
|
-
if (mappedGitPath !== undefined && mappedGitPath.trim().length === 0) {
|
|
89
|
-
throw new TypeError("KEIYAKU_GIT_PATH requires a nonblank value");
|
|
90
|
-
}
|
|
91
|
-
const configuration = {
|
|
92
|
-
...(mappedHome === undefined || mappedHome.length === 0 ? {} : { home: mappedHome }),
|
|
93
|
-
...(mappedGitPath === undefined ? {} : { gitPath: mappedGitPath }),
|
|
94
|
-
};
|
|
95
106
|
export async function externalRequestCommandsFor(launch, processConfiguration) {
|
|
96
107
|
const world = await World.prove(worldRootForAkumaPaths(launch.paths));
|
|
97
108
|
return {
|
|
98
109
|
world,
|
|
99
|
-
commands: composeRequestCommands(
|
|
110
|
+
commands: composeRequestCommands(selectionRequestCommands(selectionRequestPort(world)), contractRequestCommands(contractUpstream(processConfiguration)), taskMutationRequestCommands(taskMutationRequestPort())),
|
|
100
111
|
};
|
|
101
112
|
}
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
113
|
+
function bodyProcessConfiguration() {
|
|
114
|
+
const mappedHome = process.env.KEIYAKU_HOME?.trim();
|
|
115
|
+
const mappedGitPath = process.env.KEIYAKU_GIT_PATH;
|
|
116
|
+
if (mappedGitPath !== undefined && mappedGitPath.trim().length === 0) {
|
|
117
|
+
throw new TypeError("KEIYAKU_GIT_PATH requires a nonblank value");
|
|
118
|
+
}
|
|
119
|
+
return {
|
|
120
|
+
...(mappedHome === undefined || mappedHome.length === 0 ? {} : { home: mappedHome }),
|
|
121
|
+
...(mappedGitPath === undefined ? {} : { gitPath: mappedGitPath }),
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
async function runBodyEntrypoint() {
|
|
125
|
+
const encoded = process.argv[2];
|
|
126
|
+
if (encoded === undefined)
|
|
127
|
+
throw new TypeError("Akuma body launch payload is missing");
|
|
128
|
+
const launch = bodyLaunchSchema.parse(JSON.parse(Buffer.from(encoded, "base64url").toString("utf8")));
|
|
129
|
+
const { world, commands } = await externalRequestCommandsFor(launch, bodyProcessConfiguration());
|
|
130
|
+
if ((await runAkumaBody(launch, world, commands)) === "held")
|
|
131
|
+
process.exitCode = LEASH_HELD_EXIT;
|
|
132
|
+
}
|
|
133
|
+
/** Only the spawned entrypoint launches a Body; importing this module composes commands without side effects. */
|
|
134
|
+
function invokedAsBodyEntrypoint() {
|
|
135
|
+
const entry = process.argv[1];
|
|
136
|
+
return entry !== undefined && resolve(entry) === resolve(fileURLToPath(import.meta.url));
|
|
137
|
+
}
|
|
138
|
+
if (invokedAsBodyEntrypoint())
|
|
139
|
+
await runBodyEntrypoint();
|
|
@@ -3,3 +3,8 @@ export declare function applyAmendDocument(source: string, current: DecodedContr
|
|
|
3
3
|
document: string;
|
|
4
4
|
changedSections: ReadonlySet<string>;
|
|
5
5
|
}>;
|
|
6
|
+
/** Caller syntax is decoded before any repository observation; current-dependent application stays pure. */
|
|
7
|
+
export declare function prepareAmendDocument(source: string): (current: DecodedContractDocument) => Readonly<{
|
|
8
|
+
document: string;
|
|
9
|
+
changedSections: ReadonlySet<string>;
|
|
10
|
+
}>;
|
package/build/src/body/amend.js
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import { decodeVerificationDeclarations, VerificationDocumentError } from "./verification.js";
|
|
2
2
|
import { parseToAST } from "../markdown/parse.js";
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
3
|
+
import { indexDocument, indexedHeadings, normalizeTitle, rawSlice, sectionContent } from "../markdown/query.js";
|
|
4
|
+
import { decodeRegionOrRefusal } from "./region.js";
|
|
5
5
|
import { contractSectionName, RESERVED_SECTIONS } from "./shape.js";
|
|
6
6
|
import { renderAmendedContractBody } from "./render.js";
|
|
7
|
+
import { decodeCriteria } from "./criteria.js";
|
|
7
8
|
function refusal(message) {
|
|
8
9
|
throw new TypeError(message);
|
|
9
10
|
}
|
|
@@ -37,39 +38,6 @@ function prose(document, section, label) {
|
|
|
37
38
|
refusal(`${label} operation body must be nonblank`);
|
|
38
39
|
return value;
|
|
39
40
|
}
|
|
40
|
-
function region(document, section) {
|
|
41
|
-
try {
|
|
42
|
-
return decodeRegion(document, section);
|
|
43
|
-
}
|
|
44
|
-
catch (error) {
|
|
45
|
-
if (error instanceof RegionDocumentError)
|
|
46
|
-
refusal(error.message);
|
|
47
|
-
throw error;
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
function criteria(document, section) {
|
|
51
|
-
const headings = directChildren(section, "heading").filter((heading) => heading.level === 3);
|
|
52
|
-
if (headings.length === 0)
|
|
53
|
-
refusal("Criteria operation must contain one or more H3 entries");
|
|
54
|
-
const before = rawSlice(document, { start: section.contentStart, end: headings[0].span.start });
|
|
55
|
-
if (before.trim().length > 0)
|
|
56
|
-
refusal("Criteria operation may contain only H3 entries");
|
|
57
|
-
const seen = new Set();
|
|
58
|
-
return headings.map((heading, index) => {
|
|
59
|
-
const title = heading.text.trim();
|
|
60
|
-
const key = normalizeTitle(title);
|
|
61
|
-
if (title.length === 0 || seen.has(key))
|
|
62
|
-
refusal("criteria operation contains duplicate or empty titles");
|
|
63
|
-
seen.add(key);
|
|
64
|
-
const body = rawSlice(document, {
|
|
65
|
-
start: heading.span.end,
|
|
66
|
-
end: headings[index + 1]?.span.start ?? section.span.end,
|
|
67
|
-
});
|
|
68
|
-
if (body.trim().length === 0)
|
|
69
|
-
refusal(`criterion '${title}' operation body is empty`);
|
|
70
|
-
return { title, body };
|
|
71
|
-
});
|
|
72
|
-
}
|
|
73
41
|
function verification(document, section) {
|
|
74
42
|
try {
|
|
75
43
|
return decodeVerificationDeclarations(document, section, { requireTimeout: true });
|
|
@@ -154,7 +122,7 @@ function applyUpdate(body, operation, document) {
|
|
|
154
122
|
body.extensions[index] = { ...extension, content: prose(document, operation.section, "extension") };
|
|
155
123
|
}
|
|
156
124
|
function addedCriteria(body, operation, document) {
|
|
157
|
-
const added =
|
|
125
|
+
const added = decodeCriteria(document, operation.section, "amend");
|
|
158
126
|
if (added.some((candidate) => criterionIndex(body, candidate.title) >= 0)) {
|
|
159
127
|
refusal(`${operation.kind} Criteria targets an existing criterion`);
|
|
160
128
|
}
|
|
@@ -213,11 +181,11 @@ function applyReplace(body, operation, document) {
|
|
|
213
181
|
return;
|
|
214
182
|
}
|
|
215
183
|
if (target === "region") {
|
|
216
|
-
body.region =
|
|
184
|
+
body.region = decodeRegionOrRefusal(document, operation.section);
|
|
217
185
|
return;
|
|
218
186
|
}
|
|
219
187
|
if (target === "criteria") {
|
|
220
|
-
const replacement =
|
|
188
|
+
const replacement = decodeCriteria(document, operation.section, "amend");
|
|
221
189
|
body.criteria = [...replacement];
|
|
222
190
|
body.criterionIndexes = new Map(replacement.map((criterion, index) => [normalizeTitle(criterion.title), index]));
|
|
223
191
|
return;
|
|
@@ -262,28 +230,36 @@ function applyOperation(body, operation, document) {
|
|
|
262
230
|
function operationKey(operation) {
|
|
263
231
|
return `${operation.kind}:${operation.target}`;
|
|
264
232
|
}
|
|
265
|
-
function apply(
|
|
233
|
+
function apply(document, operations, current) {
|
|
234
|
+
const changed = new Set();
|
|
235
|
+
const body = cloneBody(current);
|
|
236
|
+
for (const operation of operations) {
|
|
237
|
+
changed.add(normalizeTitle(operation.target));
|
|
238
|
+
applyOperation(body, operation, document);
|
|
239
|
+
}
|
|
240
|
+
return { body: completeBody(body), changed };
|
|
241
|
+
}
|
|
242
|
+
export function applyAmendDocument(source, current) {
|
|
243
|
+
return prepareAmendDocument(source)(current);
|
|
244
|
+
}
|
|
245
|
+
/** Caller syntax is decoded before any repository observation; current-dependent application stays pure. */
|
|
246
|
+
export function prepareAmendDocument(source) {
|
|
266
247
|
const document = parseToAST(source);
|
|
267
248
|
const operations = operationSections(document);
|
|
268
249
|
if (operations.length === 0)
|
|
269
250
|
refusal("amend requires at least one H2 operation");
|
|
270
251
|
const seen = new Set();
|
|
271
|
-
const changed = new Set();
|
|
272
|
-
const body = cloneBody(current);
|
|
273
252
|
for (const operation of operations) {
|
|
274
253
|
const key = operationKey(operation);
|
|
275
254
|
if (seen.has(key))
|
|
276
255
|
refusal(`duplicate amend operation '${key}'`);
|
|
277
256
|
seen.add(key);
|
|
278
|
-
changed.add(normalizeTitle(operation.target));
|
|
279
|
-
applyOperation(body, operation, document);
|
|
280
257
|
}
|
|
281
|
-
return
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
changedSections: result.changed,
|
|
258
|
+
return (current) => {
|
|
259
|
+
const result = apply(document, operations, current);
|
|
260
|
+
return {
|
|
261
|
+
document: renderAmendedContractBody(current.document.bytes, result.body, result.changed),
|
|
262
|
+
changedSections: result.changed,
|
|
263
|
+
};
|
|
288
264
|
};
|
|
289
265
|
}
|
package/build/src/body/arc.d.ts
CHANGED
package/build/src/body/arc.js
CHANGED
|
@@ -1,29 +1,22 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
throw new TypeError(message);
|
|
5
|
-
}
|
|
6
|
-
function requiredProse(document, sections, name) {
|
|
7
|
-
const section = sections.get(name);
|
|
8
|
-
if (section === undefined)
|
|
9
|
-
refusal(`arc document is missing ## ${name[0].toUpperCase()}${name.slice(1)}`);
|
|
10
|
-
const value = sectionContent(document, section);
|
|
11
|
-
if (value.trim().length === 0)
|
|
12
|
-
refusal(`arc section '${section.title}' is empty`);
|
|
13
|
-
return value;
|
|
14
|
-
}
|
|
1
|
+
import { parseToAST } from "../markdown/parse.js";
|
|
2
|
+
import { indexDocument, indexedHeadings } from "../markdown/query.js";
|
|
3
|
+
const ARC_SHAPE = "arc document requires exactly one nonblank H1 chapter name (# <name>) followed by a freeform Markdown body (which may be empty)";
|
|
15
4
|
export function decodeArcDocument(source) {
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
5
|
+
let document;
|
|
6
|
+
try {
|
|
7
|
+
document = parseToAST(source);
|
|
8
|
+
}
|
|
9
|
+
catch {
|
|
10
|
+
throw new TypeError(ARC_SHAPE);
|
|
11
|
+
}
|
|
12
|
+
const titles = indexedHeadings(indexDocument(document), { level: 1 }).filter((node) => node.type === "section");
|
|
13
|
+
const title = titles[0];
|
|
14
|
+
if (document.frontmatter !== undefined ||
|
|
15
|
+
titles.length !== 1 ||
|
|
16
|
+
title === undefined ||
|
|
17
|
+
title.title.trim().length === 0 ||
|
|
18
|
+
source.slice(0, title.span.start).trim().length !== 0) {
|
|
19
|
+
throw new TypeError(ARC_SHAPE);
|
|
23
20
|
}
|
|
24
|
-
return {
|
|
25
|
-
title: title.title,
|
|
26
|
-
objective: requiredProse(document, sections, "objective"),
|
|
27
|
-
brief: requiredProse(document, sections, "brief"),
|
|
28
|
-
};
|
|
21
|
+
return { title: title.title, body: source.slice(title.contentStart) };
|
|
29
22
|
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { DocumentNode, SectionNode } from "../markdown/types.js";
|
|
2
|
+
import type { ContractCriterion } from "./types.js";
|
|
3
|
+
type CriteriaContext = "contract" | "amend";
|
|
4
|
+
export declare function criteriaStructure(document: DocumentNode, section: SectionNode, context?: CriteriaContext): string | null;
|
|
5
|
+
export declare function decodeCriteria(document: DocumentNode, section: SectionNode, context?: CriteriaContext): readonly ContractCriterion[];
|
|
6
|
+
export {};
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { directChildren, normalizeTitle, rawSlice } from "../markdown/query.js";
|
|
2
|
+
function criteriaHeadings(section) {
|
|
3
|
+
return directChildren(section, "heading").filter((heading) => heading.level === 3);
|
|
4
|
+
}
|
|
5
|
+
export function criteriaStructure(document, section, context = "contract") {
|
|
6
|
+
const label = context === "amend" ? "Criteria operation" : "Criteria";
|
|
7
|
+
const headings = criteriaHeadings(section);
|
|
8
|
+
if (headings.length === 0)
|
|
9
|
+
return `${label} must contain one or more H3 entries`;
|
|
10
|
+
const before = rawSlice(document, { start: section.contentStart, end: headings[0].span.start });
|
|
11
|
+
return before.trim().length === 0 ? null : `${label} may contain only H3 entries`;
|
|
12
|
+
}
|
|
13
|
+
export function decodeCriteria(document, section, context = "contract") {
|
|
14
|
+
const structural = criteriaStructure(document, section, context);
|
|
15
|
+
if (structural !== null)
|
|
16
|
+
throw new TypeError(structural);
|
|
17
|
+
const headings = criteriaHeadings(section);
|
|
18
|
+
const seen = new Set();
|
|
19
|
+
return headings.map((heading, index) => {
|
|
20
|
+
const title = heading.text.trim();
|
|
21
|
+
const key = normalizeTitle(title);
|
|
22
|
+
if (title.length === 0 || seen.has(key)) {
|
|
23
|
+
throw new TypeError(context === "amend"
|
|
24
|
+
? "criteria operation contains duplicate or empty titles"
|
|
25
|
+
: `duplicate criterion '${title}'`);
|
|
26
|
+
}
|
|
27
|
+
seen.add(key);
|
|
28
|
+
const body = rawSlice(document, {
|
|
29
|
+
start: heading.span.end,
|
|
30
|
+
end: headings[index + 1]?.span.start ?? section.span.end,
|
|
31
|
+
});
|
|
32
|
+
if (body.trim().length === 0) {
|
|
33
|
+
throw new TypeError(context === "amend" ? `criterion '${title}' operation body is empty` : `criterion '${title}' is empty`);
|
|
34
|
+
}
|
|
35
|
+
return { title, body };
|
|
36
|
+
});
|
|
37
|
+
}
|
package/build/src/body/decode.js
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { mintDocumentKey, mintDocumentSegmentKey } from "./keys.js";
|
|
2
2
|
import { decodeDocumentEnvelope } from "./envelope.js";
|
|
3
|
-
import {
|
|
3
|
+
import { criteriaStructure, decodeCriteria } from "./criteria.js";
|
|
4
|
+
import { directChildren, rawSlice, sectionContent } from "../markdown/query.js";
|
|
4
5
|
import { CONTRACT_SECTIONS, RESERVED_SECTIONS } from "./shape.js";
|
|
5
|
-
import {
|
|
6
|
+
import { decodeRegionOrRefusal, regionStructure } from "./region.js";
|
|
6
7
|
import { decodeVerificationDeclarations, VerificationDocumentError } from "./verification.js";
|
|
7
8
|
function refusal(message) {
|
|
8
9
|
throw new TypeError(message);
|
|
@@ -18,13 +19,6 @@ function requireSections(sections) {
|
|
|
18
19
|
function requiredSection(sections, name) {
|
|
19
20
|
return sections.get(name);
|
|
20
21
|
}
|
|
21
|
-
function criteriaStructure(document, section) {
|
|
22
|
-
const headings = directChildren(section, "heading").filter((heading) => heading.level === 3);
|
|
23
|
-
if (headings.length === 0)
|
|
24
|
-
return "Criteria must contain one or more H3 entries";
|
|
25
|
-
const before = rawSlice(document, { start: section.contentStart, end: headings[0].span.start });
|
|
26
|
-
return before.trim().length === 0 ? null : "Criteria may contain only H3 entries";
|
|
27
|
-
}
|
|
28
22
|
function verificationStructure(document, section) {
|
|
29
23
|
const blocks = directChildren(section, "code_block");
|
|
30
24
|
if (blocks.length === 0)
|
|
@@ -62,37 +56,6 @@ function prose(document, section) {
|
|
|
62
56
|
refusal(`contract section '${section.title}' is empty`);
|
|
63
57
|
return value;
|
|
64
58
|
}
|
|
65
|
-
function region(document, section) {
|
|
66
|
-
try {
|
|
67
|
-
return decodeRegion(document, section);
|
|
68
|
-
}
|
|
69
|
-
catch (error) {
|
|
70
|
-
if (error instanceof RegionDocumentError)
|
|
71
|
-
refusal(error.message);
|
|
72
|
-
throw error;
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
function criteria(document, section) {
|
|
76
|
-
const structural = criteriaStructure(document, section);
|
|
77
|
-
if (structural !== null)
|
|
78
|
-
refusal(structural);
|
|
79
|
-
const headings = directChildren(section, "heading").filter((heading) => heading.level === 3);
|
|
80
|
-
const seen = new Set();
|
|
81
|
-
return headings.map((heading, index) => {
|
|
82
|
-
const title = heading.text.trim();
|
|
83
|
-
const key = normalizeTitle(title);
|
|
84
|
-
if (seen.has(key))
|
|
85
|
-
refusal(`duplicate criterion '${title}'`);
|
|
86
|
-
seen.add(key);
|
|
87
|
-
const body = rawSlice(document, {
|
|
88
|
-
start: heading.span.end,
|
|
89
|
-
end: headings[index + 1]?.span.start ?? section.span.end,
|
|
90
|
-
});
|
|
91
|
-
if (body.trim().length === 0)
|
|
92
|
-
refusal(`criterion '${title}' is empty`);
|
|
93
|
-
return { title, body };
|
|
94
|
-
});
|
|
95
|
-
}
|
|
96
59
|
function verification(document, section, options) {
|
|
97
60
|
try {
|
|
98
61
|
return decodeVerificationDeclarations(document, section, options);
|
|
@@ -129,8 +92,8 @@ export function decodeContractDocument(source, options = {}) {
|
|
|
129
92
|
context: prose(document, requiredSection(sections, "context")),
|
|
130
93
|
objective: prose(document, requiredSection(sections, "objective")),
|
|
131
94
|
design: prose(document, requiredSection(sections, "design")),
|
|
132
|
-
region:
|
|
133
|
-
criteria:
|
|
95
|
+
region: decodeRegionOrRefusal(document, requiredSection(sections, "region")),
|
|
96
|
+
criteria: decodeCriteria(document, requiredSection(sections, "criteria")),
|
|
134
97
|
verification: verificationSection === undefined ? [] : verification(document, verificationSection, options),
|
|
135
98
|
extensions,
|
|
136
99
|
};
|
|
@@ -12,4 +12,9 @@ export declare function regionStructure(section: SectionNode): string | null;
|
|
|
12
12
|
/** A whitespace-bearing pattern is almost certainly strayed prose; bind warns and proceeds rather than rejecting. */
|
|
13
13
|
export declare function regionWarnings(patterns: readonly string[]): readonly string[];
|
|
14
14
|
export declare function decodeRegion(_document: DocumentNode, section: SectionNode): readonly string[];
|
|
15
|
+
/** Region decoding for body parsers: document errors surface as plain TypeError refusals. */
|
|
16
|
+
export declare function decodeRegionOrRefusal(document: DocumentNode, section: SectionNode): readonly string[];
|
|
17
|
+
export type RegionRelation = "same" | "mine-within-theirs" | "theirs-within-mine" | "intersect";
|
|
18
|
+
export type RegionOverlapPair = readonly [mine: string, theirs: string, relation: RegionRelation];
|
|
19
|
+
export declare function regionsOverlapWithRelation(mine: readonly string[], theirs: readonly string[]): readonly RegionOverlapPair[];
|
|
15
20
|
export declare function regionsOverlap(mine: readonly string[], theirs: readonly string[]): readonly [string, string][];
|
package/build/src/body/region.js
CHANGED
|
@@ -201,16 +201,59 @@ export function decodeRegion(_document, section) {
|
|
|
201
201
|
refusal("Region must declare at least one path pattern");
|
|
202
202
|
return patterns.map((pattern) => compileRegionPattern(pattern).source);
|
|
203
203
|
}
|
|
204
|
-
|
|
204
|
+
/** Region decoding for body parsers: document errors surface as plain TypeError refusals. */
|
|
205
|
+
export function decodeRegionOrRefusal(document, section) {
|
|
206
|
+
try {
|
|
207
|
+
return decodeRegion(document, section);
|
|
208
|
+
}
|
|
209
|
+
catch (error) {
|
|
210
|
+
if (error instanceof RegionDocumentError)
|
|
211
|
+
throw new TypeError(error.message);
|
|
212
|
+
throw error;
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
function literalPrefixWithDeepTail(pattern) {
|
|
216
|
+
if (pattern.segments.at(-1)?.kind !== "deep")
|
|
217
|
+
return null;
|
|
218
|
+
const prefix = pattern.segments.slice(0, -1);
|
|
219
|
+
if (prefix.some((segment) => segment.kind !== "segment" || segment.characters.some((character) => character === "*" || character === "?")))
|
|
220
|
+
return null;
|
|
221
|
+
return prefix.map((segment) => segment.characters.join(""));
|
|
222
|
+
}
|
|
223
|
+
function patternWithin(container, candidate) {
|
|
224
|
+
const prefix = literalPrefixWithDeepTail(container);
|
|
225
|
+
if (prefix === null)
|
|
226
|
+
return false;
|
|
227
|
+
const candidateSegments = candidate.segments;
|
|
228
|
+
if (candidateSegments.length < prefix.length)
|
|
229
|
+
return false;
|
|
230
|
+
return prefix.every((value, index) => {
|
|
231
|
+
const segment = candidateSegments[index];
|
|
232
|
+
return segment?.kind === "segment" && segment.characters.join("") === value;
|
|
233
|
+
});
|
|
234
|
+
}
|
|
235
|
+
function relationOf(mine, theirs) {
|
|
236
|
+
if (mine.source === theirs.source)
|
|
237
|
+
return "same";
|
|
238
|
+
if (patternWithin(theirs, mine))
|
|
239
|
+
return "mine-within-theirs";
|
|
240
|
+
if (patternWithin(mine, theirs))
|
|
241
|
+
return "theirs-within-mine";
|
|
242
|
+
return "intersect";
|
|
243
|
+
}
|
|
244
|
+
export function regionsOverlapWithRelation(mine, theirs) {
|
|
205
245
|
const myPatterns = mine.map((pattern) => compileRegionPattern(pattern));
|
|
206
246
|
const theirPatterns = theirs.map((pattern) => compileRegionPattern(pattern));
|
|
207
247
|
const overlaps = [];
|
|
208
248
|
for (const myPattern of myPatterns) {
|
|
209
249
|
for (const theirPattern of theirPatterns) {
|
|
210
250
|
if (patternsOverlap(myPattern.segments, theirPattern.segments)) {
|
|
211
|
-
overlaps.push([myPattern.source, theirPattern.source]);
|
|
251
|
+
overlaps.push([myPattern.source, theirPattern.source, relationOf(myPattern, theirPattern)]);
|
|
212
252
|
}
|
|
213
253
|
}
|
|
214
254
|
}
|
|
215
255
|
return overlaps;
|
|
216
256
|
}
|
|
257
|
+
export function regionsOverlap(mine, theirs) {
|
|
258
|
+
return regionsOverlapWithRelation(mine, theirs).map(([minePattern, theirsPattern]) => [minePattern, theirsPattern]);
|
|
259
|
+
}
|
package/build/src/body/render.js
CHANGED
|
@@ -31,10 +31,8 @@ function arcSection(arc) {
|
|
|
31
31
|
String(arc.seq),
|
|
32
32
|
"### Title",
|
|
33
33
|
content(arc.title),
|
|
34
|
-
"###
|
|
35
|
-
content(arc.
|
|
36
|
-
"### Brief",
|
|
37
|
-
content(arc.brief),
|
|
34
|
+
"### Body",
|
|
35
|
+
content(arc.body.replace(/^(?:\r?\n)+/u, "")),
|
|
38
36
|
].join("\n\n");
|
|
39
37
|
}
|
|
40
38
|
export function renderContractBody(body, currentArc) {
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The one process-facing activity driver for observing Call, Ask and Wait. It owns the live frame's
|
|
3
|
+
* whole lifetime — settled-row emission, redrawable frame, one conclusion and honest close — so the
|
|
4
|
+
* three modes supply only their typed observation port and their native conclusion, never a second frame.
|
|
5
|
+
*/
|
|
6
|
+
export declare class ActivityDriver {
|
|
7
|
+
private readonly stream;
|
|
8
|
+
private lines;
|
|
9
|
+
private concluded;
|
|
10
|
+
constructor(stream?: NodeJS.WriteStream);
|
|
11
|
+
/** Emit one settled row block, then redraw the retained live frame beneath it. */
|
|
12
|
+
settle(rows: readonly string[], frame: readonly string[]): void;
|
|
13
|
+
/** Replace the redrawable live frame. Non-TTY streams keep settled rows only. */
|
|
14
|
+
redraw(frame: readonly string[]): void;
|
|
15
|
+
/** Conclude the frame once with its final body and release it. */
|
|
16
|
+
conclude(body: string): void;
|
|
17
|
+
/**
|
|
18
|
+
* Close on failure or cancellation without inventing a conclusion. Any still-in-flight rows are
|
|
19
|
+
* emitted with their unresolved marks so the terminal shows what never settled, then the frame is
|
|
20
|
+
* released; a mode that already concluded contributes no rows and this is a no-op.
|
|
21
|
+
*/
|
|
22
|
+
close(inFlight?: readonly string[]): void;
|
|
23
|
+
private write;
|
|
24
|
+
private draw;
|
|
25
|
+
private clear;
|
|
26
|
+
}
|