@astrosheep/keiyaku 4.5.28 → 4.6.1
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 -19
- package/build/src/akuma/akuma-instance.js +65 -177
- package/build/src/akuma/akuma-observe.d.ts +3 -21
- package/build/src/akuma/akuma-observe.js +7 -25
- package/build/src/akuma/{akuma-handle.d.ts → akuma-owner.d.ts} +60 -25
- package/build/src/akuma/{akuma-handle.js → akuma-owner.js} +43 -29
- 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 -32
- package/build/src/akuma/akuma-wait.js +113 -0
- package/build/src/akuma/akuma.d.ts +35 -97
- package/build/src/akuma/akuma.js +148 -35
- package/build/src/akuma/archetype.d.ts +18 -6
- package/build/src/akuma/archetype.js +52 -34
- package/build/src/akuma/body.d.ts +79 -61
- package/build/src/akuma/body.js +101 -50
- package/build/src/akuma/call-initial-tell.d.ts +164 -0
- package/build/src/akuma/call-initial-tell.js +62 -0
- package/build/src/akuma/call-input.d.ts +0 -3
- package/build/src/akuma/call-input.js +0 -7
- package/build/src/akuma/call-request.d.ts +247 -38
- package/build/src/akuma/call-request.js +77 -92
- 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 +3 -9
- 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 +7 -10
- 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-read.js +1 -2
- 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 -23
- package/build/src/akuma/provider-recipe.js +62 -103
- package/build/src/akuma/provider.d.ts +7 -78
- 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 -17
- package/build/src/akuma/providers/claude/index.js +2 -14
- package/build/src/akuma/providers/codex-app-server/index.js +0 -22
- package/build/src/akuma/providers/grok-build/index.js +44 -24
- 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 -74
- 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.js +70 -24
- 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 -3
- package/build/src/akuma/requests.js +0 -24
- package/build/src/akuma/{fleet-observation.d.ts → selection-observation.d.ts} +61 -52
- 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.d.ts +3 -0
- package/build/src/akuma/turn-drive.js +75 -16
- 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 -312
- 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 +5 -9
- 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 +28 -30
- package/build/src/cli/commands/contract-help.js +69 -96
- package/build/src/cli/commands/contract.d.ts +18 -97
- package/build/src/cli/commands/contract.js +620 -237
- 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 +415 -333
- 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 +63 -61
- package/build/src/cli/render/akuma-activity.d.ts +88 -39
- package/build/src/cli/render/akuma-activity.js +465 -263
- package/build/src/cli/render/akuma-tool.d.ts +15 -5
- package/build/src/cli/render/akuma-tool.js +40 -27
- package/build/src/cli/render/akuma.d.ts +40 -24
- package/build/src/cli/render/akuma.js +108 -205
- package/build/src/cli/render/audit.d.ts +6 -2
- package/build/src/cli/render/audit.js +61 -30
- package/build/src/cli/render/catalog.d.ts +11 -2
- package/build/src/cli/render/catalog.js +75 -94
- 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 +255 -106
- 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 +108 -129
- 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 +126 -46
- 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 +61 -34
- package/build/src/cli/render/region.js +3 -2
- package/build/src/cli/render/settings.js +4 -14
- package/build/src/cli/render/task.d.ts +37 -6
- package/build/src/cli/render/task.js +162 -158
- package/build/src/cli/render/terminal.d.ts +25 -1
- package/build/src/cli/render/terminal.js +105 -18
- package/build/src/cli/runtime.d.ts +32 -8
- package/build/src/cli/runtime.js +161 -163
- 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 -6
- package/build/src/index.js +52 -3
- 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 +35 -33
- package/build/src/library/akuma-creation.js +184 -167
- package/build/src/library/akumas.d.ts +40 -0
- package/build/src/library/akumas.js +84 -0
- 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 +24 -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 +44 -437
- package/build/src/library/keiyaku.js +132 -20
- 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} +177 -160
- 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 -14
- package/build/src/akuma/akuma-product-symbols.d.ts +0 -1
- package/build/src/akuma/akuma-product-symbols.js +0 -1
- package/build/src/akuma/akuma-product.d.ts +0 -62
- package/build/src/akuma/akuma-product.js +0 -293
- package/build/src/akuma/fleet-execution.js +0 -181
- package/build/src/akuma/fleet-observation.js +0 -91
- package/build/src/cli/accepted.d.ts +0 -24
- package/build/src/cli/accepted.js +0 -167
- package/build/src/cli/commands/akuma-invoke.d.ts +0 -114
- package/build/src/cli/commands/akuma-invoke.js +0 -402
- 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 -484
- 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/catalog.d.ts +0 -68
- package/build/src/library/catalog.js +0 -130
- package/build/src/library/composition.d.ts +0 -403
- package/build/src/library/composition.js +0 -29
- 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 -45
- package/build/src/library/contract-handle.js +0 -373
- package/build/src/library/contract.d.ts +0 -53
- package/build/src/library/contract.js +0 -91
- 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,17 +1,99 @@
|
|
|
1
|
+
import { snapshotIdSchema, mintedSnapshotInputSchema } from "./identity.js";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
import { targetCheckoutEffectSchema, targetCheckoutLagSchema } from "./target-placement.js";
|
|
4
|
+
import { worktreeHookLagSchema } from "./hooks.js";
|
|
5
|
+
import { unsealedBytesSchema } from "./terminal-seal.js";
|
|
1
6
|
import { access, mkdir } from "node:fs/promises";
|
|
2
7
|
import { dirname, join } from "node:path";
|
|
3
|
-
import { acquireSqliteTransactionLock, } from "../coordination/sqlite-transaction-lock.js";
|
|
8
|
+
import { acquireSqliteTransactionLock, SqliteTransactionLockError, } from "../coordination/sqlite-transaction-lock.js";
|
|
4
9
|
import { AuthorityCorruptionError } from "../core/facts/errors.js";
|
|
5
10
|
import { CANDIDATE_PIN_REF_NAMESPACE, commonGitDirectory, DELIVERY_REF_NAMESPACE, registeredWorktreePaths, } from "./repository.js";
|
|
6
|
-
import { runGit } from "./process.js";
|
|
11
|
+
import { runGit, GitPlumbingError } from "./process.js";
|
|
7
12
|
import { contractLocator, contractPhysicalName, gitObjectIdForSnapshot } from "./identity.js";
|
|
8
13
|
import { observeContractAt } from "./observe.js";
|
|
9
|
-
import { acquireTargetPlacementFence, recoverTargetPlacement
|
|
14
|
+
import { acquireTargetPlacementFence, recoverTargetPlacement } from "./target-placement.js";
|
|
10
15
|
import { runCreateHooks } from "./hooks.js";
|
|
11
16
|
import { followDependentManagedWorktree, retireConflictHandoff, worktreePath } from "./workspace.js";
|
|
12
17
|
import { removeCollectableScratchWorktrees } from "./scratch.js";
|
|
13
18
|
import { reconcileTerminalManagedWorktree, removeRef, updateRef } from "./terminal-reconcile.js";
|
|
19
|
+
class WorktreeCustodyError extends Error {
|
|
20
|
+
}
|
|
14
21
|
const pathExists = (path) => access(path).then(() => true, () => false);
|
|
22
|
+
export const reconcileEffectSchema = z.union([
|
|
23
|
+
z
|
|
24
|
+
.object({
|
|
25
|
+
kind: z.literal("worktree"),
|
|
26
|
+
path: z.string().refine((value) => value.trim() !== ""),
|
|
27
|
+
action: z.enum(["created", "removed", "unchanged"]),
|
|
28
|
+
before: z.unknown().optional(),
|
|
29
|
+
after: z.unknown().optional(),
|
|
30
|
+
})
|
|
31
|
+
.strict()
|
|
32
|
+
.transform(({ before: _before, after: _after, ...effect }) => effect),
|
|
33
|
+
z
|
|
34
|
+
.object({
|
|
35
|
+
kind: z.literal("worktree"),
|
|
36
|
+
path: z.string().refine((value) => value.trim() !== ""),
|
|
37
|
+
action: z.literal("followed"),
|
|
38
|
+
before: snapshotIdSchema,
|
|
39
|
+
after: snapshotIdSchema,
|
|
40
|
+
})
|
|
41
|
+
.strict(),
|
|
42
|
+
z
|
|
43
|
+
.object({
|
|
44
|
+
kind: z.literal("recovery-snapshot"),
|
|
45
|
+
action: z.literal("created"),
|
|
46
|
+
snapshot: snapshotIdSchema,
|
|
47
|
+
retention: z.literal("ephemeral"),
|
|
48
|
+
})
|
|
49
|
+
.strict(),
|
|
50
|
+
targetCheckoutEffectSchema,
|
|
51
|
+
z
|
|
52
|
+
.object({
|
|
53
|
+
kind: z.literal("ref"),
|
|
54
|
+
name: z.string().refine((value) => value.trim() !== ""),
|
|
55
|
+
before: z.string().min(1).nullable(),
|
|
56
|
+
after: z.string().min(1).nullable(),
|
|
57
|
+
action: z.enum(["created", "updated", "removed", "unchanged"]),
|
|
58
|
+
})
|
|
59
|
+
.strict(),
|
|
60
|
+
]);
|
|
61
|
+
const reconcileFailureSchema = z
|
|
62
|
+
.object({
|
|
63
|
+
kind: z.literal("reconcile-failed"),
|
|
64
|
+
stage: z.enum(["observation", "effect"]),
|
|
65
|
+
diagnostic: z.string().refine((value) => value.trim() !== ""),
|
|
66
|
+
})
|
|
67
|
+
.strict();
|
|
68
|
+
export const gitReconcileLagSchema = z.union([
|
|
69
|
+
z
|
|
70
|
+
.object({
|
|
71
|
+
kind: z.literal("worktree-retained"),
|
|
72
|
+
path: z.string().refine((value) => value.trim() !== ""),
|
|
73
|
+
diagnostic: z
|
|
74
|
+
.string()
|
|
75
|
+
.refine((value) => value.trim() !== "")
|
|
76
|
+
.optional(),
|
|
77
|
+
})
|
|
78
|
+
.strict(),
|
|
79
|
+
z
|
|
80
|
+
.object({
|
|
81
|
+
kind: z.literal("worktree-follow-retained"),
|
|
82
|
+
path: z.string().refine((value) => value.trim() !== ""),
|
|
83
|
+
tender: mintedSnapshotInputSchema,
|
|
84
|
+
head: mintedSnapshotInputSchema,
|
|
85
|
+
reason: z.enum(["head-moved", "head-attached", "operation-in-progress", "unsupported-parent-shape"]),
|
|
86
|
+
paths: z
|
|
87
|
+
.array(z.string().refine((value) => value.trim() !== ""))
|
|
88
|
+
.readonly()
|
|
89
|
+
.optional(),
|
|
90
|
+
})
|
|
91
|
+
.strict(),
|
|
92
|
+
unsealedBytesSchema,
|
|
93
|
+
targetCheckoutLagSchema,
|
|
94
|
+
worktreeHookLagSchema,
|
|
95
|
+
reconcileFailureSchema,
|
|
96
|
+
]);
|
|
15
97
|
function deliveryRefFor(contract) {
|
|
16
98
|
return `${DELIVERY_REF_NAMESPACE}/${contractPhysicalName(contract)}`;
|
|
17
99
|
}
|
|
@@ -34,8 +116,36 @@ function diagnostic(error) {
|
|
|
34
116
|
function complete(effects = [], lag = [], hookRuns = []) {
|
|
35
117
|
return hookRuns.length === 0 ? { effects, lag } : { effects, lag, hookRuns };
|
|
36
118
|
}
|
|
119
|
+
/** Append owner observations and publish those same objects before the next await. */
|
|
120
|
+
function reconcileAccumulation(onPhysical) {
|
|
121
|
+
const effects = [];
|
|
122
|
+
const lag = [];
|
|
123
|
+
return {
|
|
124
|
+
effects,
|
|
125
|
+
lag,
|
|
126
|
+
hookRuns: [],
|
|
127
|
+
recordEffect(...observed) {
|
|
128
|
+
effects.push(...observed);
|
|
129
|
+
if (observed.length > 0)
|
|
130
|
+
onPhysical?.({ effects: observed, lag: [] });
|
|
131
|
+
},
|
|
132
|
+
recordLag(...observed) {
|
|
133
|
+
lag.push(...observed);
|
|
134
|
+
if (observed.length > 0)
|
|
135
|
+
onPhysical?.({ effects: [], lag: observed });
|
|
136
|
+
},
|
|
137
|
+
};
|
|
138
|
+
}
|
|
37
139
|
function failed(stage, error, effects = [], lag = []) {
|
|
38
|
-
if (error instanceof
|
|
140
|
+
if (!(error instanceof WorktreeCustodyError ||
|
|
141
|
+
error instanceof GitPlumbingError ||
|
|
142
|
+
error instanceof SqliteTransactionLockError ||
|
|
143
|
+
(error instanceof Error &&
|
|
144
|
+
!(error instanceof AuthorityCorruptionError) &&
|
|
145
|
+
!(error instanceof TypeError) &&
|
|
146
|
+
"code" in error &&
|
|
147
|
+
typeof error.code === "string" &&
|
|
148
|
+
/^E[A-Z0-9]+$/u.test(error.code))))
|
|
39
149
|
throw error;
|
|
40
150
|
return { effects, lag: [...lag, { kind: "reconcile-failed", stage, diagnostic: diagnostic(error) }] };
|
|
41
151
|
}
|
|
@@ -52,20 +162,24 @@ async function worktree(repository, topology, path, desired) {
|
|
|
52
162
|
topology.paths.delete(path);
|
|
53
163
|
}
|
|
54
164
|
if (await pathExists(path))
|
|
55
|
-
throw new
|
|
165
|
+
throw new WorktreeCustodyError(`delivery worktree path is occupied: ${path}`);
|
|
56
166
|
await mkdir(dirname(path), { recursive: true });
|
|
57
167
|
await runGit(repository, ["worktree", "add", "--detach", path, gitObjectIdForSnapshot(desired)]);
|
|
58
168
|
topology.paths.add(path);
|
|
59
169
|
return { kind: "worktree", path, action: "created" };
|
|
60
170
|
}
|
|
61
|
-
async function removeCollectableScratch(repository, topology,
|
|
171
|
+
async function removeCollectableScratch(repository, topology, acc) {
|
|
62
172
|
for (const removal of await removeCollectableScratchWorktrees(repository, topology.paths)) {
|
|
63
|
-
|
|
173
|
+
acc.recordEffect({ kind: "worktree", path: removal.path, action: removal.action });
|
|
64
174
|
if (removal.retained)
|
|
65
|
-
|
|
175
|
+
acc.recordLag({
|
|
176
|
+
kind: "worktree-retained",
|
|
177
|
+
path: removal.path,
|
|
178
|
+
...(removal.diagnostic === undefined ? {} : { diagnostic: removal.diagnostic }),
|
|
179
|
+
});
|
|
66
180
|
}
|
|
67
181
|
}
|
|
68
|
-
async function reconcileTargetCheckouts(repository, state) {
|
|
182
|
+
async function reconcileTargetCheckouts(repository, state, onPhysical) {
|
|
69
183
|
if (state.terminal?.kind !== "claimed" || state.coordinates.target === undefined || state.delivery === null) {
|
|
70
184
|
return complete();
|
|
71
185
|
}
|
|
@@ -79,14 +193,16 @@ async function reconcileTargetCheckouts(repository, state) {
|
|
|
79
193
|
let result;
|
|
80
194
|
let exceptional;
|
|
81
195
|
try {
|
|
82
|
-
const recovered = await recoverTargetPlacement(repository, state);
|
|
196
|
+
const recovered = await recoverTargetPlacement(repository, state, onPhysical);
|
|
83
197
|
result = complete(recovered.effects, recovered.lag);
|
|
84
198
|
}
|
|
85
199
|
catch (error) {
|
|
86
|
-
|
|
87
|
-
exceptional = error;
|
|
88
|
-
else
|
|
200
|
+
try {
|
|
89
201
|
result = failed("effect", error);
|
|
202
|
+
}
|
|
203
|
+
catch (unexpected) {
|
|
204
|
+
exceptional = { error: unexpected };
|
|
205
|
+
}
|
|
90
206
|
}
|
|
91
207
|
let releaseFailure;
|
|
92
208
|
try {
|
|
@@ -96,21 +212,24 @@ async function reconcileTargetCheckouts(repository, state) {
|
|
|
96
212
|
releaseFailure = error;
|
|
97
213
|
}
|
|
98
214
|
if (exceptional !== undefined)
|
|
99
|
-
throw exceptional;
|
|
215
|
+
throw exceptional.error;
|
|
100
216
|
if (result === undefined)
|
|
101
217
|
throw new Error("target checkout reconcile produced no result");
|
|
102
218
|
if (releaseFailure !== undefined)
|
|
103
219
|
result = failed("effect", releaseFailure, result.effects, result.lag);
|
|
104
220
|
return result;
|
|
105
221
|
}
|
|
106
|
-
async function reconcileActiveManagedWorktree({ repository, hooks, retryHooks, place }, state, topology,
|
|
107
|
-
|
|
108
|
-
|
|
222
|
+
async function reconcileActiveManagedWorktree({ repository, hooks, retryHooks, place }, state, topology, acc) {
|
|
223
|
+
const { effects, lag, hookRuns } = acc;
|
|
224
|
+
if (place === undefined) {
|
|
225
|
+
acc.recordLag(missingPlaceLag(repository));
|
|
226
|
+
return complete(effects, lag);
|
|
227
|
+
}
|
|
109
228
|
const path = worktreePath(repository, place);
|
|
110
229
|
const desired = state.delivery?.data.tenderSnapshot ?? state.coordinates.start;
|
|
111
|
-
|
|
230
|
+
acc.recordEffect(await updateRef(repository, deliveryRefFor(state.id), desired));
|
|
112
231
|
const projection = await worktree(repository, topology, path, desired);
|
|
113
|
-
|
|
232
|
+
acc.recordEffect(projection);
|
|
114
233
|
const handoff = await retireConflictHandoff(repository, {
|
|
115
234
|
contractId: state.id,
|
|
116
235
|
place,
|
|
@@ -118,7 +237,7 @@ async function reconcileActiveManagedWorktree({ repository, hooks, retryHooks, p
|
|
|
118
237
|
consume: state.delivery !== null,
|
|
119
238
|
});
|
|
120
239
|
if (state.delivery !== null && handoff.kind === "retained") {
|
|
121
|
-
|
|
240
|
+
acc.recordLag({
|
|
122
241
|
kind: "reconcile-failed",
|
|
123
242
|
stage: "effect",
|
|
124
243
|
diagnostic: `conflict handoff retirement retained: ${handoff.reason}`,
|
|
@@ -128,14 +247,14 @@ async function reconcileActiveManagedWorktree({ repository, hooks, retryHooks, p
|
|
|
128
247
|
const hookRun = await runCreateHooks(path, hooks);
|
|
129
248
|
hookRuns.push(...hookRun.runs.map((name) => ({ phase: "create", name })));
|
|
130
249
|
if (hookRun.lag !== null)
|
|
131
|
-
|
|
250
|
+
acc.recordLag(hookRun.lag);
|
|
132
251
|
}
|
|
133
|
-
|
|
252
|
+
acc.recordEffect(await (state.delivery
|
|
134
253
|
? await updateRef(repository, candidatePinRefFor(state.id), state.currentIntegration?.snapshot ?? state.delivery.data.integration.snapshot)
|
|
135
254
|
: await removeRef(repository, candidatePinRefFor(state.id))));
|
|
136
255
|
return complete(effects, lag, hookRuns);
|
|
137
256
|
}
|
|
138
|
-
async function terminalHandoffRetained(input, state, topology,
|
|
257
|
+
async function terminalHandoffRetained(input, state, topology, acc) {
|
|
139
258
|
if (input.place === undefined)
|
|
140
259
|
return false;
|
|
141
260
|
const path = worktreePath(input.repository, input.place);
|
|
@@ -148,7 +267,7 @@ async function terminalHandoffRetained(input, state, topology, lag) {
|
|
|
148
267
|
consume: state.delivery !== null,
|
|
149
268
|
});
|
|
150
269
|
if (handoff.kind === "active") {
|
|
151
|
-
|
|
270
|
+
acc.recordLag({
|
|
152
271
|
kind: "reconcile-failed",
|
|
153
272
|
stage: "effect",
|
|
154
273
|
diagnostic: "conflict handoff retirement retained: active",
|
|
@@ -157,7 +276,7 @@ async function terminalHandoffRetained(input, state, topology, lag) {
|
|
|
157
276
|
}
|
|
158
277
|
if (handoff.kind !== "retained")
|
|
159
278
|
return false;
|
|
160
|
-
|
|
279
|
+
acc.recordLag({
|
|
161
280
|
kind: "reconcile-failed",
|
|
162
281
|
stage: "effect",
|
|
163
282
|
diagnostic: `conflict handoff retirement retained: ${handoff.reason}`,
|
|
@@ -166,22 +285,24 @@ async function terminalHandoffRetained(input, state, topology, lag) {
|
|
|
166
285
|
}
|
|
167
286
|
async function reconcileWithTopology(input, state, topology) {
|
|
168
287
|
const { repository } = input;
|
|
169
|
-
const
|
|
170
|
-
const lag =
|
|
171
|
-
const hookRuns = [];
|
|
288
|
+
const acc = reconcileAccumulation(input.onPhysical);
|
|
289
|
+
const { effects, lag, hookRuns } = acc;
|
|
172
290
|
try {
|
|
173
|
-
await removeCollectableScratch(repository, topology,
|
|
291
|
+
await removeCollectableScratch(repository, topology, acc);
|
|
174
292
|
if (!state)
|
|
175
293
|
return complete(effects, lag);
|
|
176
|
-
const targetCheckouts = await reconcileTargetCheckouts(repository, state);
|
|
177
|
-
|
|
178
|
-
|
|
294
|
+
const targetCheckouts = await reconcileTargetCheckouts(repository, state, input.onPhysical);
|
|
295
|
+
acc.recordEffect(...targetCheckouts.effects);
|
|
296
|
+
acc.recordLag(...targetCheckouts.lag);
|
|
179
297
|
if (state.terminal) {
|
|
180
|
-
if (await terminalHandoffRetained(input, state, topology,
|
|
298
|
+
if (await terminalHandoffRetained(input, state, topology, acc))
|
|
181
299
|
return complete(effects, lag, hookRuns);
|
|
182
|
-
return await reconcileTerminalManagedWorktree(input, state, topology,
|
|
300
|
+
return await reconcileTerminalManagedWorktree(input, state, topology, acc, {
|
|
301
|
+
ref: deliveryRefFor(state.id),
|
|
302
|
+
pin: candidatePinRefFor(state.id),
|
|
303
|
+
});
|
|
183
304
|
}
|
|
184
|
-
const result = await reconcileActiveManagedWorktree(input, state, topology,
|
|
305
|
+
const result = await reconcileActiveManagedWorktree(input, state, topology, acc);
|
|
185
306
|
return hookRuns.length === 0 ? result : { ...result, hookRuns };
|
|
186
307
|
}
|
|
187
308
|
catch (error) {
|
|
@@ -221,16 +342,24 @@ export async function reconcile(input) {
|
|
|
221
342
|
state,
|
|
222
343
|
result: await reconcileWithTopology(input, state, topology),
|
|
223
344
|
};
|
|
345
|
+
input.onPhysical?.(observation.result);
|
|
224
346
|
}
|
|
225
347
|
catch (error) {
|
|
226
|
-
|
|
227
|
-
exceptional = error;
|
|
228
|
-
else
|
|
348
|
+
try {
|
|
229
349
|
observation = { state: null, result: failed("observation", error) };
|
|
350
|
+
}
|
|
351
|
+
catch (unexpected) {
|
|
352
|
+
exceptional = { error: unexpected };
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
try {
|
|
356
|
+
observation = releaseFailure(held, observation);
|
|
357
|
+
}
|
|
358
|
+
catch (error) {
|
|
359
|
+
exceptional ??= { error };
|
|
230
360
|
}
|
|
231
|
-
observation = releaseFailure(held, observation);
|
|
232
361
|
if (exceptional !== undefined)
|
|
233
|
-
throw exceptional;
|
|
362
|
+
throw exceptional.error;
|
|
234
363
|
if (observation === undefined)
|
|
235
364
|
throw new Error("reconcile produced no observation");
|
|
236
365
|
return observation;
|
|
@@ -1,17 +1,20 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
1
2
|
import type { SnapshotId } from "../core/facts/types.js";
|
|
2
3
|
import { type GitRepository } from "./process.js";
|
|
3
4
|
export type MaterializedScratchCandidate = Readonly<{
|
|
4
5
|
cwd: string;
|
|
5
6
|
dispose: () => Promise<WorktreeLeak | null>;
|
|
6
7
|
}>;
|
|
7
|
-
export
|
|
8
|
-
path:
|
|
9
|
-
diagnostic:
|
|
10
|
-
}>;
|
|
8
|
+
export declare const worktreeLeakSchema: z.ZodObject<{
|
|
9
|
+
path: z.ZodString;
|
|
10
|
+
diagnostic: z.ZodString;
|
|
11
|
+
}, z.core.$strict>;
|
|
12
|
+
export type WorktreeLeak = z.infer<typeof worktreeLeakSchema>;
|
|
11
13
|
type CollectableScratchRemoval = Readonly<{
|
|
12
14
|
path: string;
|
|
13
15
|
action: "removed" | "unchanged";
|
|
14
16
|
retained: boolean;
|
|
17
|
+
diagnostic?: string;
|
|
15
18
|
}>;
|
|
16
19
|
/** Remove only abandoned Verification scratch worktrees whose ownership locks are held. */
|
|
17
20
|
export declare function removeCollectableScratchWorktrees(repository: GitRepository, paths: Set<string>): Promise<readonly CollectableScratchRemoval[]>;
|
package/build/src/git/scratch.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
1
2
|
import { randomBytes } from "node:crypto";
|
|
2
|
-
import { access, realpath } from "node:fs/promises";
|
|
3
|
+
import { access, realpath, unlink } from "node:fs/promises";
|
|
3
4
|
import { tmpdir } from "node:os";
|
|
4
5
|
import { basename, dirname, join } from "node:path";
|
|
5
6
|
import { tryAcquireSqliteTransactionLock, } from "../coordination/sqlite-transaction-lock.js";
|
|
@@ -8,6 +9,7 @@ import { runGit } from "./process.js";
|
|
|
8
9
|
const SCRATCH_PREFIX = "keiyaku-v4-verify-";
|
|
9
10
|
const SCRATCH_ROOT = await realpath(tmpdir());
|
|
10
11
|
const SCRATCH_PATTERN = /^keiyaku-v4-verify-([0-9a-f]{24})$/;
|
|
12
|
+
export const worktreeLeakSchema = z.object({ path: z.string(), diagnostic: z.string() }).strict();
|
|
11
13
|
function scratchPath() {
|
|
12
14
|
return join(SCRATCH_ROOT, `${SCRATCH_PREFIX}${randomBytes(12).toString("hex")}`);
|
|
13
15
|
}
|
|
@@ -17,6 +19,12 @@ function ownershipLockPath(path) {
|
|
|
17
19
|
const match = SCRATCH_PATTERN.exec(basename(path));
|
|
18
20
|
return match === null ? null : join(SCRATCH_ROOT, `.${SCRATCH_PREFIX}${match[1]}.owner.sqlite`);
|
|
19
21
|
}
|
|
22
|
+
async function removeOwnershipLock(lockPath) {
|
|
23
|
+
await unlink(lockPath).catch((error) => {
|
|
24
|
+
if (error.code !== "ENOENT")
|
|
25
|
+
throw error;
|
|
26
|
+
});
|
|
27
|
+
}
|
|
20
28
|
async function collectableScratchWorktrees(paths) {
|
|
21
29
|
const collectable = [];
|
|
22
30
|
for (const path of paths) {
|
|
@@ -25,7 +33,7 @@ async function collectableScratchWorktrees(paths) {
|
|
|
25
33
|
continue;
|
|
26
34
|
const lock = await tryAcquireSqliteTransactionLock({ path: lockPath, mode: "exclusive" });
|
|
27
35
|
if (lock !== null)
|
|
28
|
-
collectable.push({ path, release: () => lock.close() });
|
|
36
|
+
collectable.push({ path, lockPath, release: () => lock.close() });
|
|
29
37
|
}
|
|
30
38
|
return collectable;
|
|
31
39
|
}
|
|
@@ -34,24 +42,34 @@ const pathExists = (path) => access(path).then(() => true, () => false);
|
|
|
34
42
|
export async function removeCollectableScratchWorktrees(repository, paths) {
|
|
35
43
|
const removals = [];
|
|
36
44
|
for (const scratch of await collectableScratchWorktrees(paths)) {
|
|
45
|
+
let removed = false;
|
|
37
46
|
try {
|
|
38
47
|
if (!(await pathExists(scratch.path))) {
|
|
39
48
|
await runGit(repository, ["worktree", "remove", scratch.path]);
|
|
40
49
|
paths.delete(scratch.path);
|
|
50
|
+
removed = true;
|
|
41
51
|
removals.push({ path: scratch.path, action: "removed", retained: false });
|
|
42
52
|
continue;
|
|
43
53
|
}
|
|
44
54
|
try {
|
|
45
55
|
await runGit(repository, ["worktree", "remove", "--force", scratch.path]);
|
|
46
56
|
paths.delete(scratch.path);
|
|
57
|
+
removed = true;
|
|
47
58
|
removals.push({ path: scratch.path, action: "removed", retained: false });
|
|
48
59
|
}
|
|
49
|
-
catch {
|
|
50
|
-
removals.push({
|
|
60
|
+
catch (error) {
|
|
61
|
+
removals.push({
|
|
62
|
+
path: scratch.path,
|
|
63
|
+
action: "unchanged",
|
|
64
|
+
retained: true,
|
|
65
|
+
diagnostic: error instanceof Error ? error.message : String(error),
|
|
66
|
+
});
|
|
51
67
|
}
|
|
52
68
|
}
|
|
53
69
|
finally {
|
|
54
70
|
scratch.release();
|
|
71
|
+
if (removed)
|
|
72
|
+
await removeOwnershipLock(scratch.lockPath);
|
|
55
73
|
}
|
|
56
74
|
}
|
|
57
75
|
return removals;
|
|
@@ -73,6 +91,7 @@ export async function materializeScratchCandidate(repository, candidate) {
|
|
|
73
91
|
}
|
|
74
92
|
catch (error) {
|
|
75
93
|
ownership.close();
|
|
94
|
+
await removeOwnershipLock(lockPath);
|
|
76
95
|
throw error;
|
|
77
96
|
}
|
|
78
97
|
let disposed = false;
|
|
@@ -82,19 +101,22 @@ export async function materializeScratchCandidate(repository, candidate) {
|
|
|
82
101
|
if (disposed)
|
|
83
102
|
return null;
|
|
84
103
|
disposed = true;
|
|
104
|
+
let leak = null;
|
|
85
105
|
try {
|
|
86
106
|
await runGit({ ...repository, signal: AbortSignal.timeout(5_000) }, ["worktree", "remove", "--force", cwd]);
|
|
87
|
-
return null;
|
|
88
107
|
}
|
|
89
108
|
catch (error) {
|
|
90
|
-
|
|
109
|
+
leak = {
|
|
91
110
|
path: cwd,
|
|
92
111
|
diagnostic: error instanceof Error ? error.message : String(error),
|
|
93
112
|
};
|
|
94
113
|
}
|
|
95
114
|
finally {
|
|
96
115
|
ownership.close();
|
|
116
|
+
if (leak === null)
|
|
117
|
+
await removeOwnershipLock(lockPath);
|
|
97
118
|
}
|
|
119
|
+
return leak;
|
|
98
120
|
},
|
|
99
121
|
};
|
|
100
122
|
}
|
|
@@ -1,28 +1,35 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
1
2
|
import { type HeldSqliteTransactionLock } from "../coordination/sqlite-transaction-lock.js";
|
|
2
3
|
import type { ContractId, ContractState, SnapshotId } from "../core/facts/types.js";
|
|
3
4
|
import type { RefOperation } from "../core/facts/offer.js";
|
|
4
5
|
import { type GitRepository } from "./process.js";
|
|
5
|
-
export
|
|
6
|
-
kind: "checkout-not-followable"
|
|
7
|
-
contractId: ContractId
|
|
8
|
-
target:
|
|
9
|
-
path:
|
|
10
|
-
reason: "
|
|
11
|
-
paths:
|
|
12
|
-
}>;
|
|
6
|
+
export declare const checkoutNotFollowableRefusalSchema: z.ZodObject<{
|
|
7
|
+
kind: z.ZodLiteral<"checkout-not-followable">;
|
|
8
|
+
contractId: z.ZodPipe<z.ZodString, z.ZodTransform<ContractId, string>>;
|
|
9
|
+
target: z.ZodString;
|
|
10
|
+
path: z.ZodString;
|
|
11
|
+
reason: z.ZodLiteral<"untracked">;
|
|
12
|
+
paths: z.ZodReadonly<z.ZodArray<z.ZodString>>;
|
|
13
|
+
}, z.core.$strict>;
|
|
14
|
+
type CheckoutNotFollowableRefusal = z.infer<typeof checkoutNotFollowableRefusalSchema>;
|
|
13
15
|
export type TargetPlacementRefusal = CheckoutNotFollowableRefusal;
|
|
14
|
-
export
|
|
15
|
-
kind: "target-checkout"
|
|
16
|
-
path:
|
|
17
|
-
target:
|
|
18
|
-
action:
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
16
|
+
export declare const targetCheckoutEffectSchema: z.ZodObject<{
|
|
17
|
+
kind: z.ZodLiteral<"target-checkout">;
|
|
18
|
+
path: z.ZodString;
|
|
19
|
+
target: z.ZodString;
|
|
20
|
+
action: z.ZodEnum<{
|
|
21
|
+
followed: "followed";
|
|
22
|
+
recovered: "recovered";
|
|
23
|
+
}>;
|
|
24
|
+
}, z.core.$strict>;
|
|
25
|
+
type TargetCheckoutEffect = z.infer<typeof targetCheckoutEffectSchema>;
|
|
26
|
+
export declare const targetCheckoutLagSchema: z.ZodObject<{
|
|
27
|
+
kind: z.ZodLiteral<"target-checkout-retained">;
|
|
28
|
+
path: z.ZodString;
|
|
29
|
+
target: z.ZodString;
|
|
30
|
+
diagnostic: z.ZodString;
|
|
31
|
+
}, z.core.$strict>;
|
|
32
|
+
type TargetCheckoutLag = z.infer<typeof targetCheckoutLagSchema>;
|
|
26
33
|
export type TargetPlacementPhysicalResult = Readonly<{
|
|
27
34
|
effects: readonly TargetCheckoutEffect[];
|
|
28
35
|
lag: readonly TargetCheckoutLag[];
|
|
@@ -74,31 +81,39 @@ export type TargetPlacementObservation = Readonly<{
|
|
|
74
81
|
}>;
|
|
75
82
|
/** Observe whether registered target checkouts can follow a predecessor-to-candidate movement. */
|
|
76
83
|
export declare function observeTargetPlacement(repository: GitRepository, input: TargetPlacementObservationInput, changes?: TargetPlacementChanges): Promise<TargetPlacementObservation>;
|
|
77
|
-
export
|
|
78
|
-
kind: "placeable"
|
|
79
|
-
ref:
|
|
80
|
-
head: SnapshotId
|
|
81
|
-
}
|
|
82
|
-
kind: "moved"
|
|
83
|
-
ref:
|
|
84
|
-
expected: SnapshotId
|
|
85
|
-
observed: SnapshotId
|
|
86
|
-
}
|
|
87
|
-
kind: "refused"
|
|
88
|
-
refusal:
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
84
|
+
export declare const auditTargetAnswerSchema: z.ZodUnion<readonly [z.ZodObject<{
|
|
85
|
+
kind: z.ZodLiteral<"placeable">;
|
|
86
|
+
ref: z.ZodString;
|
|
87
|
+
head: z.ZodPipe<z.ZodString, z.ZodTransform<SnapshotId, string>>;
|
|
88
|
+
}, z.core.$strict>, z.ZodObject<{
|
|
89
|
+
kind: z.ZodLiteral<"moved">;
|
|
90
|
+
ref: z.ZodString;
|
|
91
|
+
expected: z.ZodPipe<z.ZodString, z.ZodTransform<SnapshotId, string>>;
|
|
92
|
+
observed: z.ZodNullable<z.ZodPipe<z.ZodString, z.ZodTransform<SnapshotId, string>>>;
|
|
93
|
+
}, z.core.$strict>, z.ZodObject<{
|
|
94
|
+
kind: z.ZodLiteral<"refused">;
|
|
95
|
+
refusal: z.ZodObject<{
|
|
96
|
+
kind: z.ZodLiteral<"checkout-not-followable">;
|
|
97
|
+
contractId: z.ZodPipe<z.ZodString, z.ZodTransform<ContractId, string>>;
|
|
98
|
+
target: z.ZodString;
|
|
99
|
+
path: z.ZodString;
|
|
100
|
+
reason: z.ZodLiteral<"untracked">;
|
|
101
|
+
paths: z.ZodReadonly<z.ZodArray<z.ZodString>>;
|
|
102
|
+
}, z.core.$strict>;
|
|
103
|
+
}, z.core.$strict>, z.ZodObject<{
|
|
104
|
+
kind: z.ZodLiteral<"failed">;
|
|
105
|
+
diagnostic: z.ZodString;
|
|
106
|
+
}, z.core.$strict>]>;
|
|
107
|
+
type AuditTargetAnswer = z.infer<typeof auditTargetAnswerSchema>;
|
|
93
108
|
/** Adjudicate the complete post-Verification audit target answer without placing. */
|
|
94
109
|
export declare function adjudicateAuditTarget(repository: GitRepository, input: TargetPlacementObservationInput): Promise<AuditTargetAnswer>;
|
|
95
110
|
export declare function prepareTargetPlacement(repository: GitRepository, state: ContractState, target: RefOperation, changes?: TargetPlacementChanges): Promise<TargetPlacementPreparation>;
|
|
96
|
-
export declare function followTargetPlacement(repository: GitRepository, prepared: PreparedTargetPlacement): Promise<TargetPlacementPhysicalResult>;
|
|
111
|
+
export declare function followTargetPlacement(repository: GitRepository, prepared: PreparedTargetPlacement, onPhysical?: (report: TargetPlacementPhysicalResult) => void): Promise<TargetPlacementPhysicalResult>;
|
|
97
112
|
/** Judge the target-checkout shape without mutating refs, worktrees, or indexes. */
|
|
98
113
|
export declare function observeTargetCheckoutShape(repository: GitRepository, input: Readonly<{
|
|
99
114
|
path: string;
|
|
100
115
|
predecessor: SnapshotId;
|
|
101
116
|
candidate: SnapshotId;
|
|
102
117
|
}>): Promise<"complete" | "recoverable" | "retained">;
|
|
103
|
-
export declare function recoverTargetPlacement(repository: GitRepository, state: ContractState): Promise<TargetPlacementPhysicalResult>;
|
|
118
|
+
export declare function recoverTargetPlacement(repository: GitRepository, state: ContractState, onPhysical?: (report: TargetPlacementPhysicalResult) => void): Promise<TargetPlacementPhysicalResult>;
|
|
104
119
|
export {};
|