@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,40 +1,17 @@
|
|
|
1
|
-
import { executionReceipt } from "./execution-result.js";
|
|
2
|
-
import { decodeExecutionEvent, observeExecution } from "../protocol/execution-observation.js";
|
|
3
|
-
import { contractId, snapshotId } from "../core/facts/types.js";
|
|
4
|
-
import { AkumaBodyRequestError, requestBodyCommand } from "../akuma/request-rendezvous.js";
|
|
5
|
-
import { eraseRequestCommand, } from "../akuma/request-wire.js";
|
|
6
|
-
import { auditReportSchema, auditResultSchema, deliveryResultSchema, reviewResultSchema, } from "./mutation.js";
|
|
7
|
-
import { decodeContractLiveFailure, encodeContractLiveFailure } from "./refusal.js";
|
|
8
1
|
import { isAbsolute, resolve } from "node:path";
|
|
9
2
|
import { z } from "zod";
|
|
3
|
+
import { AkumaBodyRequestError, requestBodyCommand } from "../akuma/request-rendezvous.js";
|
|
4
|
+
import { eraseRequestCommand, } from "../akuma/request-wire.js";
|
|
5
|
+
import { auditReportSchema } from "../protocol/audit.js";
|
|
6
|
+
import { materializedConflictSchema } from "../protocol/deliver.js";
|
|
7
|
+
import { decodeExecutionObservation, observeExecution, } from "../protocol/execution-observation.js";
|
|
8
|
+
import { contractIdSchema } from "../protocol/operations.js";
|
|
9
|
+
import { deliveryValueSchema } from "./delivery.js";
|
|
10
|
+
import { InvocationAccumulator } from "./invocation.js";
|
|
11
|
+
import { decodeFailureWire, encodeFailureWire, KeiyakuError, outcomeSchema, project, reviewSchema } from "./outcome.js";
|
|
10
12
|
const absolutePathSchema = z.string().refine((value) => isAbsolute(value) && resolve(value) === value);
|
|
11
13
|
const nonblankStringSchema = z.string().refine((value) => value.trim() !== "");
|
|
12
|
-
const contractIdSchema = z.string().transform((value, context) => {
|
|
13
|
-
try {
|
|
14
|
-
return contractId(value);
|
|
15
|
-
}
|
|
16
|
-
catch {
|
|
17
|
-
context.addIssue({ code: "custom", message: "expected ContractId" });
|
|
18
|
-
return z.NEVER;
|
|
19
|
-
}
|
|
20
|
-
});
|
|
21
|
-
const snapshotIdSchema = z.string().transform((value, context) => {
|
|
22
|
-
try {
|
|
23
|
-
return snapshotId(value);
|
|
24
|
-
}
|
|
25
|
-
catch {
|
|
26
|
-
context.addIssue({ code: "custom", message: "expected SnapshotId" });
|
|
27
|
-
return z.NEVER;
|
|
28
|
-
}
|
|
29
|
-
});
|
|
30
14
|
const contractRequestBaseSchema = z.object({ repoRoot: absolutePathSchema, contractId: contractIdSchema }).strict();
|
|
31
|
-
const conflictRecoverySchema = z
|
|
32
|
-
.object({
|
|
33
|
-
materialize: z.literal("deliver --materialize-conflict --include-dirty"),
|
|
34
|
-
deliver: z.literal("deliver --include-dirty"),
|
|
35
|
-
staging: z.literal("not-required"),
|
|
36
|
-
})
|
|
37
|
-
.strict();
|
|
38
15
|
const auditRequestSchema = contractRequestBaseSchema
|
|
39
16
|
.extend({
|
|
40
17
|
includeDirty: z.boolean(),
|
|
@@ -76,26 +53,12 @@ const reviewReferenceSchema = z
|
|
|
76
53
|
reviewFactId: nonblankStringSchema,
|
|
77
54
|
})
|
|
78
55
|
.strict();
|
|
79
|
-
const
|
|
80
|
-
|
|
56
|
+
const materializedHandoffReferenceSchema = materializedConflictSchema;
|
|
57
|
+
const materializedHandoffServiceSchema = materializedConflictSchema
|
|
58
|
+
.extend({
|
|
81
59
|
kind: z.literal("materialized-handoff"),
|
|
82
60
|
repoRoot: absolutePathSchema,
|
|
83
61
|
contractId: contractIdSchema,
|
|
84
|
-
targetHead: snapshotIdSchema,
|
|
85
|
-
handoffBase: snapshotIdSchema,
|
|
86
|
-
recovery: conflictRecoverySchema,
|
|
87
|
-
conflictPaths: z.array(nonblankStringSchema).transform((paths) => Object.freeze(paths)),
|
|
88
|
-
workspace: z.object({ kind: z.literal("worktree"), path: nonblankStringSchema }).strict(),
|
|
89
|
-
})
|
|
90
|
-
.strict();
|
|
91
|
-
const materializedHandoffReferenceSchema = z
|
|
92
|
-
.object({
|
|
93
|
-
kind: z.literal("integration-conflict-materialized"),
|
|
94
|
-
targetHead: snapshotIdSchema,
|
|
95
|
-
handoffBase: snapshotIdSchema,
|
|
96
|
-
recovery: conflictRecoverySchema,
|
|
97
|
-
conflictPaths: z.array(nonblankStringSchema).transform((paths) => Object.freeze(paths)),
|
|
98
|
-
workspace: z.object({ kind: z.literal("worktree"), path: nonblankStringSchema }).strict(),
|
|
99
62
|
})
|
|
100
63
|
.strict();
|
|
101
64
|
const contractServiceSchema = z.union([
|
|
@@ -144,86 +107,102 @@ function executionObservation(facts) {
|
|
|
144
107
|
return {};
|
|
145
108
|
return { observe: (event) => facts.progress?.(event) };
|
|
146
109
|
}
|
|
110
|
+
function acceptedDeliveryEvidence(result) {
|
|
111
|
+
const leading = result.value.leading;
|
|
112
|
+
if (leading === undefined)
|
|
113
|
+
throw new Error("accepted delivery is missing its leading admission evidence");
|
|
114
|
+
return leading.fact;
|
|
115
|
+
}
|
|
116
|
+
function acceptedReviewEvidence(result, contractId) {
|
|
117
|
+
const review = result.facts.findLast((fact) => fact.contract === contractId && fact.kind === "attestation" && fact.data.gate === "reviewed");
|
|
118
|
+
if (review === undefined)
|
|
119
|
+
throw new Error("accepted review is missing its addressed journal fact");
|
|
120
|
+
return review.entry;
|
|
121
|
+
}
|
|
147
122
|
async function executeContractRequest(request, facts, port) {
|
|
148
123
|
const observation = executionObservation(facts);
|
|
149
124
|
if (request.action === "contract.audit") {
|
|
150
|
-
const
|
|
125
|
+
const result = await port.audit({
|
|
151
126
|
...request,
|
|
152
127
|
...observation,
|
|
153
128
|
requester: facts.requester,
|
|
154
129
|
signal: facts.signal,
|
|
155
130
|
});
|
|
156
|
-
if (
|
|
157
|
-
|
|
131
|
+
if (result.kind !== "accepted")
|
|
132
|
+
return { kind: "voided", outcome: result };
|
|
158
133
|
return {
|
|
159
|
-
|
|
134
|
+
kind: "served",
|
|
135
|
+
result,
|
|
160
136
|
service: {
|
|
161
137
|
kind: "audit-report",
|
|
162
138
|
repoRoot: request.repoRoot,
|
|
163
139
|
contractId: request.contractId,
|
|
164
|
-
report:
|
|
140
|
+
report: result.value,
|
|
165
141
|
},
|
|
166
142
|
};
|
|
167
143
|
}
|
|
168
144
|
if (request.action === "contract.deliver") {
|
|
169
|
-
const
|
|
145
|
+
const result = await port.deliver({
|
|
170
146
|
...request,
|
|
171
147
|
...observation,
|
|
172
148
|
overwrite: request.overwrite ?? false,
|
|
173
149
|
requester: facts.requester,
|
|
174
150
|
signal: facts.signal,
|
|
175
151
|
});
|
|
176
|
-
if (
|
|
152
|
+
if (result.kind === "refused" || result.kind === "retry")
|
|
153
|
+
return { kind: "voided", outcome: result };
|
|
154
|
+
if (result.kind === "handoff") {
|
|
177
155
|
return {
|
|
178
|
-
|
|
156
|
+
kind: "served",
|
|
157
|
+
result,
|
|
179
158
|
service: {
|
|
180
159
|
kind: "materialized-handoff",
|
|
181
160
|
repoRoot: request.repoRoot,
|
|
182
161
|
contractId: request.contractId,
|
|
183
|
-
targetHead:
|
|
184
|
-
handoffBase:
|
|
185
|
-
recovery:
|
|
186
|
-
conflictPaths:
|
|
187
|
-
workspace:
|
|
162
|
+
targetHead: result.value.targetHead,
|
|
163
|
+
handoffBase: result.value.handoffBase,
|
|
164
|
+
recovery: result.value.recovery,
|
|
165
|
+
conflictPaths: result.value.conflictPaths,
|
|
166
|
+
workspace: result.value.workspace,
|
|
188
167
|
},
|
|
189
168
|
};
|
|
190
169
|
}
|
|
191
|
-
if (served.deliveryFactId === undefined)
|
|
192
|
-
throw new Error(`Contract ${request.action} completed without durable service evidence`);
|
|
193
170
|
return {
|
|
194
|
-
|
|
171
|
+
kind: "served",
|
|
172
|
+
result,
|
|
195
173
|
service: {
|
|
196
174
|
kind: "accepted-reference",
|
|
197
175
|
repoRoot: request.repoRoot,
|
|
198
176
|
contractId: request.contractId,
|
|
199
|
-
deliveryFactId:
|
|
177
|
+
deliveryFactId: acceptedDeliveryEvidence(result),
|
|
200
178
|
},
|
|
201
179
|
};
|
|
202
180
|
}
|
|
203
|
-
const
|
|
181
|
+
const result = await port.review({
|
|
204
182
|
...request,
|
|
205
183
|
...observation,
|
|
206
184
|
requester: facts.requester,
|
|
207
185
|
signal: facts.signal,
|
|
208
186
|
});
|
|
209
|
-
if (
|
|
210
|
-
|
|
187
|
+
if (result.kind !== "accepted")
|
|
188
|
+
return { kind: "voided", outcome: result };
|
|
211
189
|
return {
|
|
212
|
-
|
|
190
|
+
kind: "served",
|
|
191
|
+
result,
|
|
213
192
|
service: {
|
|
214
193
|
kind: "accepted-reference",
|
|
215
194
|
repoRoot: request.repoRoot,
|
|
216
195
|
contractId: request.contractId,
|
|
217
|
-
reviewFactId:
|
|
196
|
+
reviewFactId: acceptedReviewEvidence(result, request.contractId),
|
|
218
197
|
},
|
|
219
198
|
};
|
|
220
199
|
}
|
|
221
200
|
function decodedContractResult(action, value) {
|
|
222
201
|
const schema = action === "contract.audit"
|
|
223
|
-
?
|
|
202
|
+
? outcomeSchema("audit", auditReportSchema)
|
|
224
203
|
: action === "contract.deliver"
|
|
225
|
-
?
|
|
226
|
-
:
|
|
204
|
+
? outcomeSchema("deliver", deliveryValueSchema, materializedHandoffReferenceSchema)
|
|
205
|
+
: outcomeSchema("review", reviewSchema);
|
|
227
206
|
const parsed = schema.safeParse(value);
|
|
228
207
|
if (!parsed.success)
|
|
229
208
|
throw new Error(`transport integrity: Contract ${action} returned an invalid live result`);
|
|
@@ -240,8 +219,8 @@ export function contractRequestProtocol(action) {
|
|
|
240
219
|
decodeRequest: (value) => decodeContractRequest(action, value),
|
|
241
220
|
encodeResult: (value) => value,
|
|
242
221
|
decodeResult: (value) => decodedContractResult(action, value),
|
|
243
|
-
encodeFailure:
|
|
244
|
-
decodeFailure:
|
|
222
|
+
encodeFailure: encodeFailureWire,
|
|
223
|
+
decodeFailure: (value) => decodeFailureWire(value),
|
|
245
224
|
decodeReference: (reference) => decodeContractReference(action, reference),
|
|
246
225
|
isPermitted: (allowed) => allowed.includes(action),
|
|
247
226
|
};
|
|
@@ -271,7 +250,7 @@ export async function requestForwardedContractLive(input) {
|
|
|
271
250
|
value: input.request,
|
|
272
251
|
onProgress: (value) => {
|
|
273
252
|
try {
|
|
274
|
-
observeExecution(input.observe,
|
|
253
|
+
observeExecution(input.observe, decodeExecutionObservation(value));
|
|
275
254
|
}
|
|
276
255
|
catch {
|
|
277
256
|
observeExecution(input.observe, { kind: "progress-dropped", count: 1 });
|
|
@@ -279,23 +258,35 @@ export async function requestForwardedContractLive(input) {
|
|
|
279
258
|
},
|
|
280
259
|
onProgressGap: (count) => observeExecution(input.observe, { kind: "progress-dropped", count }),
|
|
281
260
|
...(input.signal === undefined ? {} : { signal: input.signal }),
|
|
282
|
-
}).catch((error) =>
|
|
283
|
-
if (error instanceof AkumaBodyRequestError &&
|
|
284
|
-
error.outcome === "unproven" &&
|
|
285
|
-
error.cause instanceof Error &&
|
|
286
|
-
executionReceipt(error.cause) !== undefined) {
|
|
287
|
-
Object.defineProperties(error.cause, {
|
|
288
|
-
requestId: { value: error.requestId, enumerable: false },
|
|
289
|
-
action: { value: error.action, enumerable: false },
|
|
290
|
-
requestOutcome: { value: error.outcome, enumerable: false },
|
|
291
|
-
});
|
|
292
|
-
throw error.cause;
|
|
293
|
-
}
|
|
294
|
-
throw error;
|
|
295
|
-
});
|
|
261
|
+
}).catch((error) => mapForwardedContractFailure(error, input.request));
|
|
296
262
|
if (response.kind === "reference") {
|
|
297
263
|
throw new Error(`transport integrity: request ${response.requestId} action ${response.action} returned a durable reference without a live result`);
|
|
298
264
|
}
|
|
299
265
|
return response.result;
|
|
300
266
|
}
|
|
301
|
-
|
|
267
|
+
/** Map durable request disposition without reconstructing an expired owner answer. */
|
|
268
|
+
export function mapForwardedContractFailure(error, request) {
|
|
269
|
+
if (error instanceof AkumaBodyRequestError && error.outcome === "voided") {
|
|
270
|
+
const operation = request.action === "contract.audit" ? "audit" : request.action === "contract.review" ? "review" : "deliver";
|
|
271
|
+
const projected = project(operation, new InvocationAccumulator().snapshot(), {
|
|
272
|
+
kind: "retry",
|
|
273
|
+
contract: request.contractId,
|
|
274
|
+
reason: { kind: "owner-reason-unavailable", diagnostic: error.diagnostic },
|
|
275
|
+
});
|
|
276
|
+
if (projected.kind === "failed")
|
|
277
|
+
throw projected.error;
|
|
278
|
+
return { kind: "returned", result: projected.outcome };
|
|
279
|
+
}
|
|
280
|
+
if (error instanceof AkumaBodyRequestError &&
|
|
281
|
+
error.outcome === "unproven" &&
|
|
282
|
+
error.cause instanceof Error &&
|
|
283
|
+
error.cause instanceof KeiyakuError) {
|
|
284
|
+
Object.defineProperties(error.cause, {
|
|
285
|
+
requestId: { value: error.requestId, enumerable: false },
|
|
286
|
+
action: { value: error.action, enumerable: false },
|
|
287
|
+
requestOutcome: { value: error.outcome, enumerable: false },
|
|
288
|
+
});
|
|
289
|
+
throw error.cause;
|
|
290
|
+
}
|
|
291
|
+
throw error;
|
|
292
|
+
}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/** @architectureCompositionRoot */
|
|
2
|
+
import type { ContractId, Gate } from "../core/facts/types.js";
|
|
3
|
+
import type { AuditReport } from "../protocol/audit.js";
|
|
4
|
+
import type { ExecutionObserver } from "../protocol/execution-observation.js";
|
|
5
|
+
import type { IntentOutcome, IntentRetry } from "../protocol/operations.js";
|
|
6
|
+
import type { ContractWorkspaceLocation } from "../workspace-place.js";
|
|
7
|
+
import type { Delivery, DeliveryValue } from "./delivery.js";
|
|
8
|
+
import type { InvocationAccumulator } from "./invocation.js";
|
|
9
|
+
import type { Keiyaku } from "./keiyaku.js";
|
|
10
|
+
import type { ContractVerb, HandoffOutcome, OperationOutcome, OutcomeProjection, Review } from "./outcome.js";
|
|
11
|
+
import type { OperationRefusals } from "./refusal.js";
|
|
12
|
+
import type { AmendRegionObservation, RegionObservation } from "./region.js";
|
|
13
|
+
export type BindValue = Readonly<{
|
|
14
|
+
keiyaku: Keiyaku;
|
|
15
|
+
workspace?: ContractWorkspaceLocation;
|
|
16
|
+
warnings?: readonly string[];
|
|
17
|
+
}> & RegionObservation;
|
|
18
|
+
export type AmendValue = Readonly<{
|
|
19
|
+
documentDiff: string;
|
|
20
|
+
changes: Readonly<{
|
|
21
|
+
gates?: readonly Gate[];
|
|
22
|
+
after?: readonly ContractId[];
|
|
23
|
+
}>;
|
|
24
|
+
}> & AmendRegionObservation;
|
|
25
|
+
export type BindOutcome = OperationOutcome<"bind", BindValue, OperationRefusals["bind"]>;
|
|
26
|
+
export type AmendOutcome = OperationOutcome<"amend", AmendValue, OperationRefusals["amend"]>;
|
|
27
|
+
export type DeliverOutcome = OperationOutcome<"deliver", Delivery & DeliveryValue, OperationRefusals["deliver"]> | HandoffOutcome;
|
|
28
|
+
export type ReviewOutcome = OperationOutcome<"review", Review, OperationRefusals["review"]>;
|
|
29
|
+
export type AuditOutcome = OperationOutcome<"audit", AuditReport, OperationRefusals["audit"]>;
|
|
30
|
+
export type ArcOutcome = OperationOutcome<"arc", void, OperationRefusals["arc"]>;
|
|
31
|
+
export type AbandonOutcome = OperationOutcome<"abandon", void, OperationRefusals["abandon"]>;
|
|
32
|
+
export type MutationObservation = Readonly<{
|
|
33
|
+
observe?: ExecutionObserver;
|
|
34
|
+
}>;
|
|
35
|
+
export type AuditInput = Readonly<{
|
|
36
|
+
includeDirty?: boolean;
|
|
37
|
+
showDiff?: boolean;
|
|
38
|
+
signal?: AbortSignal;
|
|
39
|
+
}>;
|
|
40
|
+
export type BindResult = BindOutcome;
|
|
41
|
+
type AcceptedIntent<Value> = Extract<IntentOutcome<Value>, {
|
|
42
|
+
kind: "accepted";
|
|
43
|
+
}>;
|
|
44
|
+
type Admission<Value, Refusal> = Readonly<{
|
|
45
|
+
kind: "accepted";
|
|
46
|
+
accepted: AcceptedIntent<Value>;
|
|
47
|
+
}> | Readonly<{
|
|
48
|
+
kind: "refused";
|
|
49
|
+
refusal: Refusal;
|
|
50
|
+
}> | Readonly<{
|
|
51
|
+
kind: "retry";
|
|
52
|
+
reason: IntentRetry;
|
|
53
|
+
}>;
|
|
54
|
+
export declare function admissionOf<Value, Refusal>(outcome: IntentOutcome<Value, Refusal>): Admission<Value, Refusal>;
|
|
55
|
+
/** The refused/retry arms are value-agnostic, so every operation can return them unchanged. */
|
|
56
|
+
type ExpectedProjection<Refusal> = Readonly<{
|
|
57
|
+
kind: "refused";
|
|
58
|
+
contract?: ContractId;
|
|
59
|
+
refusal: Refusal;
|
|
60
|
+
}> | Readonly<{
|
|
61
|
+
kind: "retry";
|
|
62
|
+
contract?: ContractId;
|
|
63
|
+
reason: IntentRetry;
|
|
64
|
+
}>;
|
|
65
|
+
export declare function expected<Refusal>(contract: ContractId | undefined, admission: Exclude<Admission<unknown, Refusal>, {
|
|
66
|
+
kind: "accepted";
|
|
67
|
+
}>): ExpectedProjection<Refusal>;
|
|
68
|
+
export declare function acceptedOutcome<Operation extends ContractVerb, Value>(operation: Operation, contract: ContractId, accumulator: InvocationAccumulator, value: Value): OutcomeProjection<Operation, Value, never>;
|
|
69
|
+
export declare function conclusions(value: object): Readonly<Record<string, unknown>>;
|
|
70
|
+
export declare function retainAdmission<Value>(accumulator: InvocationAccumulator, contract: ContractId, leading: AcceptedIntent<Value>, verificationResidueRecorded: boolean): void;
|
|
71
|
+
export {};
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
export function admissionOf(outcome) {
|
|
2
|
+
if (outcome.kind === "accepted")
|
|
3
|
+
return { kind: "accepted", accepted: outcome };
|
|
4
|
+
return outcome.kind === "refused"
|
|
5
|
+
? { kind: "refused", refusal: outcome.refusal }
|
|
6
|
+
: { kind: "retry", reason: outcome.reason };
|
|
7
|
+
}
|
|
8
|
+
export function expected(contract, admission) {
|
|
9
|
+
return admission.kind === "refused"
|
|
10
|
+
? {
|
|
11
|
+
kind: "refused",
|
|
12
|
+
...(contract === undefined ? {} : { contract }),
|
|
13
|
+
refusal: admission.refusal,
|
|
14
|
+
}
|
|
15
|
+
: { kind: "retry", ...(contract === undefined ? {} : { contract }), reason: admission.reason };
|
|
16
|
+
}
|
|
17
|
+
export function acceptedOutcome(operation, contract, accumulator, value) {
|
|
18
|
+
void operation;
|
|
19
|
+
const head = accumulator.head(contract);
|
|
20
|
+
if (head === undefined)
|
|
21
|
+
throw new Error("missing leading admission receipt");
|
|
22
|
+
return { kind: "accepted", contract, head, value };
|
|
23
|
+
}
|
|
24
|
+
export function conclusions(value) {
|
|
25
|
+
return value;
|
|
26
|
+
}
|
|
27
|
+
export function retainAdmission(accumulator, contract, leading, verificationResidueRecorded) {
|
|
28
|
+
accumulator.recordPublication(contract, leading.head, leading.facts);
|
|
29
|
+
accumulator.recordResidue(contract, leading);
|
|
30
|
+
if (!verificationResidueRecorded)
|
|
31
|
+
accumulator.recordVerification(contract, undefined, leading);
|
|
32
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/** @architectureCompositionRoot */
|
|
2
|
+
import { type ActorId, type Gate } from "../core/facts/types.js";
|
|
3
|
+
import { type WorktreeHooks } from "../git/hooks.js";
|
|
4
|
+
import { type Settings } from "../settings.js";
|
|
5
|
+
import type { LocalContractComposition } from "./contract-types.js";
|
|
6
|
+
/** The one immutable Contract-local composition captured at construction. */
|
|
7
|
+
export type LocalContractCompositionCapture = Readonly<{
|
|
8
|
+
settings?: Settings;
|
|
9
|
+
actor?: ActorId;
|
|
10
|
+
}>;
|
|
11
|
+
/**
|
|
12
|
+
* Hooks, freshness, and gate bundles are read from the captured Settings only at the operation
|
|
13
|
+
* that consumes them. Bare core (omitted Settings) keeps empty hooks, false freshness, and
|
|
14
|
+
* literal gate words; a broken selected namespace fails before any admission.
|
|
15
|
+
*/
|
|
16
|
+
export declare function derivedHooks(composition: LocalContractCompositionCapture): WorktreeHooks;
|
|
17
|
+
/** The two Settings-derived Contract policies one mutating operation may consume. */
|
|
18
|
+
export declare function derivedContractPolicy(composition: LocalContractCompositionCapture): Readonly<{
|
|
19
|
+
hooks: WorktreeHooks;
|
|
20
|
+
requireBranchesToBeUpToDate: boolean;
|
|
21
|
+
}>;
|
|
22
|
+
export declare function gateNames(value: unknown): readonly string[] | undefined;
|
|
23
|
+
/** Bare words and configured bundles share validation, first-seen accumulation, and freezing. */
|
|
24
|
+
export declare function derivedGates(composition: LocalContractCompositionCapture, names: readonly string[] | undefined): readonly Gate[];
|
|
25
|
+
export declare function captureLocalContractComposition(input?: LocalContractComposition): LocalContractCompositionCapture;
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
/** @architectureCompositionRoot */
|
|
2
|
+
import { gate, gateWord } from "../core/facts/types.js";
|
|
3
|
+
import { EMPTY_WORKTREE_HOOKS, worktreeHooksFrom } from "../git/hooks.js";
|
|
4
|
+
import { SettingsError } from "../settings.js";
|
|
5
|
+
import { actorOption, requireInput } from "./input.js";
|
|
6
|
+
import { KeiyakuError } from "./outcome.js";
|
|
7
|
+
/** One scoped Settings lookup: its native failure stays the cause of caller-invalid input. */
|
|
8
|
+
function settingsScopedFailure(error) {
|
|
9
|
+
if (error instanceof SettingsError)
|
|
10
|
+
throw new KeiyakuError("invalid-input", error.message, { cause: error });
|
|
11
|
+
throw error;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Hooks, freshness, and gate bundles are read from the captured Settings only at the operation
|
|
15
|
+
* that consumes them. Bare core (omitted Settings) keeps empty hooks, false freshness, and
|
|
16
|
+
* literal gate words; a broken selected namespace fails before any admission.
|
|
17
|
+
*/
|
|
18
|
+
export function derivedHooks(composition) {
|
|
19
|
+
if (composition.settings === undefined)
|
|
20
|
+
return EMPTY_WORKTREE_HOOKS;
|
|
21
|
+
try {
|
|
22
|
+
return worktreeHooksFrom({ settings: composition.settings });
|
|
23
|
+
}
|
|
24
|
+
catch (error) {
|
|
25
|
+
return settingsScopedFailure(error);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
function derivedFreshness(composition) {
|
|
29
|
+
if (composition.settings === undefined)
|
|
30
|
+
return false;
|
|
31
|
+
try {
|
|
32
|
+
const view = composition.settings.namespace("git");
|
|
33
|
+
if (view.kind === "failed")
|
|
34
|
+
namespaceFailure(view);
|
|
35
|
+
for (const entry of view.entries) {
|
|
36
|
+
if (entry.name !== "requireBranchesToBeUpToDate") {
|
|
37
|
+
throw new SettingsError(`git has unknown entry: ${entry.name}`);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
const selected = view.entries.find((entry) => entry.name === "requireBranchesToBeUpToDate");
|
|
41
|
+
if (selected === undefined)
|
|
42
|
+
return false;
|
|
43
|
+
if (typeof selected.value !== "boolean") {
|
|
44
|
+
throw new SettingsError("git.requireBranchesToBeUpToDate must be a boolean");
|
|
45
|
+
}
|
|
46
|
+
return selected.value;
|
|
47
|
+
}
|
|
48
|
+
catch (error) {
|
|
49
|
+
return settingsScopedFailure(error);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
/** The two Settings-derived Contract policies one mutating operation may consume. */
|
|
53
|
+
export function derivedContractPolicy(composition) {
|
|
54
|
+
return { hooks: derivedHooks(composition), requireBranchesToBeUpToDate: derivedFreshness(composition) };
|
|
55
|
+
}
|
|
56
|
+
export function gateNames(value) {
|
|
57
|
+
if (value === undefined)
|
|
58
|
+
return undefined;
|
|
59
|
+
if (!Array.isArray(value))
|
|
60
|
+
throw new TypeError("gates must be an array");
|
|
61
|
+
return value.map((item, index) => {
|
|
62
|
+
if (typeof item !== "string")
|
|
63
|
+
throw new TypeError(`gates[${index}] must be a string`);
|
|
64
|
+
return item;
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
function namespaceFailure(view) {
|
|
68
|
+
throw new SettingsError(view.failures.map((failure) => `${failure.scope}: ${failure.diagnostic}`).join("; "));
|
|
69
|
+
}
|
|
70
|
+
function gateValue(value, message, configured) {
|
|
71
|
+
if (!gateWord(value)) {
|
|
72
|
+
if (configured)
|
|
73
|
+
throw new SettingsError(message);
|
|
74
|
+
throw new KeiyakuError("invalid-input", message, { cause: new TypeError(message) });
|
|
75
|
+
}
|
|
76
|
+
return gate(value);
|
|
77
|
+
}
|
|
78
|
+
function bundleGates(name, value) {
|
|
79
|
+
if (value === null || typeof value !== "object" || Array.isArray(value)) {
|
|
80
|
+
throw new SettingsError(`gate bundle '${name}' must be an object`);
|
|
81
|
+
}
|
|
82
|
+
const bundle = value;
|
|
83
|
+
if (bundle.kind !== "bundle") {
|
|
84
|
+
throw new SettingsError(`gate bundle '${name}' has unsupported kind: ${String(bundle.kind)}`);
|
|
85
|
+
}
|
|
86
|
+
for (const field of Object.keys(bundle)) {
|
|
87
|
+
if (field !== "kind" && field !== "gates") {
|
|
88
|
+
throw new SettingsError(`gate bundle '${name}' has unknown field: ${field}`);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
if (!Array.isArray(bundle.gates))
|
|
92
|
+
throw new SettingsError(`gate bundle '${name}'.gates must be an array`);
|
|
93
|
+
return bundle.gates.map((value) => gateValue(value, `gate bundle '${name}' contains an invalid gate word`, true));
|
|
94
|
+
}
|
|
95
|
+
/** Bare words and configured bundles share validation, first-seen accumulation, and freezing. */
|
|
96
|
+
export function derivedGates(composition, names) {
|
|
97
|
+
const settings = composition.settings;
|
|
98
|
+
const configured = settings !== undefined;
|
|
99
|
+
try {
|
|
100
|
+
const selected = (names ?? (configured ? ["default"] : [])).map((name, index) => gateValue(name, configured
|
|
101
|
+
? "gate or bundle name must match ^[a-z][a-z0-9-]{0,63}$"
|
|
102
|
+
: `gates[${index}] must match ^[a-z][a-z0-9-]{0,63}$`, configured));
|
|
103
|
+
// Explicit empty selection never looks up a namespace.
|
|
104
|
+
if (selected.length === 0)
|
|
105
|
+
return Object.freeze([]);
|
|
106
|
+
const view = settings?.namespace("gates");
|
|
107
|
+
if (view?.kind === "failed")
|
|
108
|
+
namespaceFailure(view);
|
|
109
|
+
const expanded = new Set();
|
|
110
|
+
for (const name of selected) {
|
|
111
|
+
const entry = view?.entries.find((entry) => entry.name === name);
|
|
112
|
+
const gates = entry === undefined
|
|
113
|
+
? [configured && names === undefined ? gate("reviewed") : name]
|
|
114
|
+
: bundleGates(name, entry.value);
|
|
115
|
+
for (const value of gates)
|
|
116
|
+
expanded.add(value);
|
|
117
|
+
}
|
|
118
|
+
return Object.freeze([...expanded]);
|
|
119
|
+
}
|
|
120
|
+
catch (error) {
|
|
121
|
+
return settingsScopedFailure(error);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
export function captureLocalContractComposition(input) {
|
|
125
|
+
const values = requireInput(input === undefined ? {} : input, "Keiyaku.with input", ["settings", "actor"]);
|
|
126
|
+
const actor = actorOption(values.actor).actor;
|
|
127
|
+
const settings = values.settings;
|
|
128
|
+
if (settings !== undefined && (settings === null || typeof settings !== "object")) {
|
|
129
|
+
throw new TypeError("Keiyaku.with settings must be a Settings value");
|
|
130
|
+
}
|
|
131
|
+
return Object.freeze({
|
|
132
|
+
...(actor === undefined ? {} : { actor }),
|
|
133
|
+
...(settings === undefined ? {} : { settings: settings }),
|
|
134
|
+
});
|
|
135
|
+
}
|
|
@@ -1,26 +1,14 @@
|
|
|
1
|
-
import type { ContractId, JournalEntry, SnapshotId } from "../core/facts/types.js";
|
|
2
|
-
import type { ContractFileEffect, ContractFileLag } from "../contract-worktree.js";
|
|
3
|
-
import type { ReconcileReport as ProtocolReconcileReport } from "../protocol/reconcile.js";
|
|
1
|
+
import type { AttestationData, ContractId, JournalEntry, SnapshotId } from "../core/facts/types.js";
|
|
4
2
|
import type { Dispatch } from "../dispatch/index.js";
|
|
5
|
-
import type { Gate, WorktreeHooks } from "./configuration.js";
|
|
6
|
-
import type { AmendRegionObservation, RegionObservation } from "./region.js";
|
|
7
|
-
import type { Repo } from "./repo.js";
|
|
8
|
-
import type { MutationResult } from "./mutation.js";
|
|
9
|
-
import type { SettlementReport } from "../settlement/settle.js";
|
|
10
|
-
import type { AttestationVerdict } from "./contract.js";
|
|
11
|
-
import type { Keiyaku } from "./contract-handle.js";
|
|
12
3
|
import type { ContractBoard, ContractRow } from "../protocol/read/status.js";
|
|
4
|
+
import type { Settings } from "../settings.js";
|
|
13
5
|
import type { TaskId } from "../task/identity.js";
|
|
14
|
-
import type {
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
workspace?: ContractWorkspaceLocation;
|
|
18
|
-
warnings?: readonly string[];
|
|
19
|
-
} & RegionObservation>;
|
|
20
|
-
export type Fact = JournalEntry;
|
|
6
|
+
import type { Repo } from "./repo.js";
|
|
7
|
+
/** Public gate words remain ordinary strings; private policy interprets them. */
|
|
8
|
+
export type Gate = string;
|
|
21
9
|
export type ContractHistoryEvent = Readonly<{
|
|
22
10
|
source: "journal";
|
|
23
|
-
fact:
|
|
11
|
+
fact: JournalEntry;
|
|
24
12
|
}> | Readonly<{
|
|
25
13
|
source: "dispatch";
|
|
26
14
|
dispatch: Dispatch;
|
|
@@ -28,19 +16,13 @@ export type ContractHistoryEvent = Readonly<{
|
|
|
28
16
|
export type ContractHistory = Readonly<{
|
|
29
17
|
id: ContractId;
|
|
30
18
|
state: SnapshotId;
|
|
19
|
+
workspace?: Readonly<{
|
|
20
|
+
kind: "worktree";
|
|
21
|
+
path: string;
|
|
22
|
+
}>;
|
|
31
23
|
events: readonly ContractHistoryEvent[];
|
|
32
24
|
}>;
|
|
33
|
-
|
|
34
|
-
export type Lag = ProtocolReconcileReport["lag"][number] | ContractFileLag;
|
|
35
|
-
export type AmendResult = Readonly<MutationResult<void> & {
|
|
36
|
-
documentDiff: string;
|
|
37
|
-
}> & AmendRegionObservation;
|
|
38
|
-
export type ReconcileReport = Readonly<{
|
|
39
|
-
effects: readonly (ProtocolReconcileReport["effects"][number] | ContractFileEffect)[];
|
|
40
|
-
lag: readonly (ProtocolReconcileReport["lag"][number] | ContractFileLag)[];
|
|
41
|
-
settlement: SettlementReport;
|
|
42
|
-
}>;
|
|
43
|
-
export type MarkdownBindInput = Readonly<{
|
|
25
|
+
type MarkdownBindInput = Readonly<{
|
|
44
26
|
repo: Repo;
|
|
45
27
|
markdown: string;
|
|
46
28
|
task?: TaskId;
|
|
@@ -48,31 +30,28 @@ export type MarkdownBindInput = Readonly<{
|
|
|
48
30
|
workspace?: "worktree";
|
|
49
31
|
actor?: string;
|
|
50
32
|
after?: readonly ContractId[];
|
|
51
|
-
gates?: readonly
|
|
52
|
-
hooks?: WorktreeHooks;
|
|
33
|
+
gates?: readonly string[];
|
|
53
34
|
}>;
|
|
54
|
-
|
|
35
|
+
type ForkBindInput = Readonly<{
|
|
55
36
|
repo: Repo;
|
|
56
37
|
forkOf: ContractId;
|
|
57
38
|
target?: string;
|
|
58
39
|
workspace?: "worktree";
|
|
59
40
|
actor?: string;
|
|
60
|
-
hooks?: WorktreeHooks;
|
|
61
41
|
}>;
|
|
62
42
|
export type BindInput = MarkdownBindInput | ForkBindInput;
|
|
63
43
|
type ActorOptions = Readonly<{
|
|
64
44
|
actor?: string;
|
|
65
|
-
hooks?: WorktreeHooks;
|
|
66
45
|
}>;
|
|
46
|
+
/** Contract-local composition: one captured Settings selection and the operation actor. */
|
|
67
47
|
export type LocalContractComposition = Readonly<{
|
|
48
|
+
settings?: Settings;
|
|
68
49
|
actor?: string;
|
|
69
|
-
hooks?: WorktreeHooks;
|
|
70
|
-
requireBranchesToBeUpToDate?: boolean;
|
|
71
50
|
}>;
|
|
72
51
|
export type AmendInput = ActorOptions & Readonly<{
|
|
73
52
|
markdown?: string;
|
|
74
53
|
after?: readonly ContractId[];
|
|
75
|
-
gates?: readonly
|
|
54
|
+
gates?: readonly string[];
|
|
76
55
|
}>;
|
|
77
56
|
export type ArcInput = ActorOptions & Readonly<{
|
|
78
57
|
markdown: string;
|
|
@@ -94,7 +73,7 @@ export type KeiyakuSelectInput = Readonly<{
|
|
|
94
73
|
id: ContractId;
|
|
95
74
|
}>;
|
|
96
75
|
export type ReviewInput = Readonly<{
|
|
97
|
-
verdict:
|
|
76
|
+
verdict: AttestationData["verdict"];
|
|
98
77
|
summary?: string;
|
|
99
78
|
signal?: AbortSignal;
|
|
100
79
|
}>;
|