@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,3 +1,5 @@
|
|
|
1
|
+
import { contractIdSchema, snapshotIdSchema } from "./identity.js";
|
|
2
|
+
import { z } from "zod";
|
|
1
3
|
import { StringDecoder } from "node:string_decoder";
|
|
2
4
|
import { lstat } from "node:fs/promises";
|
|
3
5
|
import { resolve } from "node:path";
|
|
@@ -6,6 +8,32 @@ import { gitObjectId, gitObjectIdForSnapshot, gitRefLocator, mintSnapshotId } fr
|
|
|
6
8
|
import { commonGitDirectory, decodeGitNameOnly, readRef, registeredWorktrees } from "./repository.js";
|
|
7
9
|
import { consumeGitStdout, GitPlumbingError, runGit } from "./process.js";
|
|
8
10
|
import { captureWorkspaceTree } from "./workspace.js";
|
|
11
|
+
export const checkoutNotFollowableRefusalSchema = z
|
|
12
|
+
.object({
|
|
13
|
+
kind: z.literal("checkout-not-followable"),
|
|
14
|
+
contractId: contractIdSchema,
|
|
15
|
+
target: z.string().refine((value) => value.trim() !== ""),
|
|
16
|
+
path: z.string().refine((value) => value.trim() !== ""),
|
|
17
|
+
reason: z.literal("untracked"),
|
|
18
|
+
paths: z.array(z.string().refine((value) => value.trim() !== "")).readonly(),
|
|
19
|
+
})
|
|
20
|
+
.strict();
|
|
21
|
+
export const targetCheckoutEffectSchema = z
|
|
22
|
+
.object({
|
|
23
|
+
kind: z.literal("target-checkout"),
|
|
24
|
+
path: z.string().refine((value) => value.trim() !== ""),
|
|
25
|
+
target: z.string().refine((value) => value.trim() !== ""),
|
|
26
|
+
action: z.enum(["followed", "recovered"]),
|
|
27
|
+
})
|
|
28
|
+
.strict();
|
|
29
|
+
export const targetCheckoutLagSchema = z
|
|
30
|
+
.object({
|
|
31
|
+
kind: z.literal("target-checkout-retained"),
|
|
32
|
+
path: z.string().refine((value) => value.trim() !== ""),
|
|
33
|
+
target: z.string().refine((value) => value.trim() !== ""),
|
|
34
|
+
diagnostic: z.string().refine((value) => value.trim() !== ""),
|
|
35
|
+
})
|
|
36
|
+
.strict();
|
|
9
37
|
export async function observeTargetHead(repository, target) {
|
|
10
38
|
const value = await readRef(repository, target);
|
|
11
39
|
return value === null ? null : mintSnapshotId(value);
|
|
@@ -67,37 +95,6 @@ export async function prepareTargetPlacementChanges(repository, target) {
|
|
|
67
95
|
writes.sort((left, right) => (left.path < right.path ? -1 : left.path > right.path ? 1 : 0));
|
|
68
96
|
return { predecessor: target.expectedOid, candidate: target.newOid, paths, writes };
|
|
69
97
|
}
|
|
70
|
-
async function dryRunRefusal(input, scopes) {
|
|
71
|
-
const { repository, contractId, target, path, predecessor, changes } = input;
|
|
72
|
-
const pathspecs = changes.paths.map(literalPath);
|
|
73
|
-
if (pathspecs.length === 0)
|
|
74
|
-
return null;
|
|
75
|
-
const unmerged = await gitPaths(repository, path, [
|
|
76
|
-
"diff",
|
|
77
|
-
"--name-only",
|
|
78
|
-
"--diff-filter=U",
|
|
79
|
-
"-z",
|
|
80
|
-
"--",
|
|
81
|
-
...pathspecs,
|
|
82
|
-
]);
|
|
83
|
-
if (unmerged.length > 0)
|
|
84
|
-
return checkoutRefusal(contractId, target, path, "unmerged", unmerged);
|
|
85
|
-
const staged = await gitPaths(repository, path, [
|
|
86
|
-
"diff",
|
|
87
|
-
"--cached",
|
|
88
|
-
"--name-only",
|
|
89
|
-
"-z",
|
|
90
|
-
predecessor,
|
|
91
|
-
"--",
|
|
92
|
-
...pathspecs,
|
|
93
|
-
]);
|
|
94
|
-
if (staged.length > 0)
|
|
95
|
-
return checkoutRefusal(contractId, target, path, "staged", staged);
|
|
96
|
-
const dirty = await gitPaths(repository, path, ["diff-files", "--name-only", "-z", "--", ...pathspecs]);
|
|
97
|
-
if (dirty.length > 0)
|
|
98
|
-
return checkoutRefusal(contractId, target, path, "dirty-tracked", dirty);
|
|
99
|
-
return await untrackedRefusalWithinScopes(input, scopes, false);
|
|
100
|
-
}
|
|
101
98
|
async function physicalScope(candidatePath, metadata) {
|
|
102
99
|
const components = candidatePath.split("/");
|
|
103
100
|
for (let index = 0; index < components.length; index += 1) {
|
|
@@ -135,20 +132,12 @@ async function destructionScopes(worktree, writes) {
|
|
|
135
132
|
}
|
|
136
133
|
return [...scopes.values()].sort((left, right) => left.path.localeCompare(right.path));
|
|
137
134
|
}
|
|
138
|
-
function untrackedArgs(
|
|
139
|
-
return [
|
|
140
|
-
"ls-files",
|
|
141
|
-
"--others",
|
|
142
|
-
...(ignored ? ["--ignored"] : []),
|
|
143
|
-
"--exclude-standard",
|
|
144
|
-
"--directory",
|
|
145
|
-
"--no-empty",
|
|
146
|
-
"-z",
|
|
147
|
-
];
|
|
135
|
+
function untrackedArgs() {
|
|
136
|
+
return ["ls-files", "--others", "--ignored", "--exclude-standard", "--directory", "--no-empty", "-z"];
|
|
148
137
|
}
|
|
149
|
-
async function untrackedRefusalWithinScopes(input, scopes
|
|
138
|
+
async function untrackedRefusalWithinScopes(input, scopes) {
|
|
150
139
|
const { repository, contractId, target, path } = input;
|
|
151
|
-
const args = untrackedArgs(
|
|
140
|
+
const args = untrackedArgs();
|
|
152
141
|
const leaves = scopes.filter((scope) => scope.kind === "leaf");
|
|
153
142
|
if (leaves.length > 0) {
|
|
154
143
|
const collisions = await gitPaths(repository, path, [
|
|
@@ -208,27 +197,25 @@ async function workspaceMatchesTreeOnPaths(repository, path, tree, workspaceTree
|
|
|
208
197
|
...paths.map(literalPath),
|
|
209
198
|
])).length === 0);
|
|
210
199
|
}
|
|
200
|
+
/**
|
|
201
|
+
* A checkout that git cannot carry is judged by the physical follow, which records its own lag.
|
|
202
|
+
* The one collision read-tree cannot report is a candidate write over an ignored worktree entry:
|
|
203
|
+
* git carries that by silently destroying the entry, so it is refused here instead.
|
|
204
|
+
*/
|
|
211
205
|
async function ordinaryPrecheck(repository, contractId, target, path, changes) {
|
|
212
206
|
const predecessor = gitObjectIdForSnapshot(target.expectedOid);
|
|
213
207
|
const candidate = gitObjectIdForSnapshot(target.newOid);
|
|
214
208
|
const observation = { repository, contractId, target, path, predecessor, candidate, changes };
|
|
215
|
-
let dryRunError;
|
|
216
209
|
try {
|
|
217
210
|
await runGit(repository, ["-C", path, "read-tree", "--dry-run", "-m", "-u", predecessor, candidate]);
|
|
218
211
|
}
|
|
219
212
|
catch (error) {
|
|
220
213
|
if (!(error instanceof GitPlumbingError) || repository.signal?.aborted === true)
|
|
221
214
|
throw error;
|
|
222
|
-
|
|
215
|
+
return null;
|
|
223
216
|
}
|
|
224
217
|
const scopes = await destructionScopes(path, changes.writes);
|
|
225
|
-
|
|
226
|
-
const refusal = await dryRunRefusal(observation, scopes);
|
|
227
|
-
if (refusal !== null)
|
|
228
|
-
return refusal;
|
|
229
|
-
throw dryRunError;
|
|
230
|
-
}
|
|
231
|
-
return await untrackedRefusalWithinScopes(observation, scopes, true);
|
|
218
|
+
return await untrackedRefusalWithinScopes(observation, scopes);
|
|
232
219
|
}
|
|
233
220
|
export async function acquireTargetPlacementFence(repository, target) {
|
|
234
221
|
const locator = gitRefLocator(target);
|
|
@@ -261,6 +248,25 @@ export async function observeTargetPlacement(repository, input, changes) {
|
|
|
261
248
|
}
|
|
262
249
|
return { kind: "ready", arms };
|
|
263
250
|
}
|
|
251
|
+
export const auditTargetAnswerSchema = z.union([
|
|
252
|
+
z
|
|
253
|
+
.object({
|
|
254
|
+
kind: z.literal("placeable"),
|
|
255
|
+
ref: z.string().refine((value) => value.trim() !== ""),
|
|
256
|
+
head: snapshotIdSchema,
|
|
257
|
+
})
|
|
258
|
+
.strict(),
|
|
259
|
+
z
|
|
260
|
+
.object({
|
|
261
|
+
kind: z.literal("moved"),
|
|
262
|
+
ref: z.string().refine((value) => value.trim() !== ""),
|
|
263
|
+
expected: snapshotIdSchema,
|
|
264
|
+
observed: snapshotIdSchema.nullable(),
|
|
265
|
+
})
|
|
266
|
+
.strict(),
|
|
267
|
+
z.object({ kind: z.literal("refused"), refusal: checkoutNotFollowableRefusalSchema }).strict(),
|
|
268
|
+
z.object({ kind: z.literal("failed"), diagnostic: z.string().refine((value) => value.trim() !== "") }).strict(),
|
|
269
|
+
]);
|
|
264
270
|
/** Adjudicate the complete post-Verification audit target answer without placing. */
|
|
265
271
|
export async function adjudicateAuditTarget(repository, input) {
|
|
266
272
|
const ref = input.coordinates.target;
|
|
@@ -297,17 +303,20 @@ export async function prepareTargetPlacement(repository, state, target, changes)
|
|
|
297
303
|
? observation
|
|
298
304
|
: { kind: "prepared", placement: { target, arms: observation.arms } };
|
|
299
305
|
}
|
|
300
|
-
export async function followTargetPlacement(repository, prepared) {
|
|
306
|
+
export async function followTargetPlacement(repository, prepared, onPhysical) {
|
|
301
307
|
const effects = [];
|
|
302
308
|
const lag = [];
|
|
303
309
|
const predecessor = gitObjectIdForSnapshot(prepared.target.expectedOid);
|
|
304
310
|
const candidate = gitObjectIdForSnapshot(prepared.target.newOid);
|
|
305
311
|
for (const arm of prepared.arms) {
|
|
312
|
+
const beforeEffects = effects.length, beforeLag = lag.length;
|
|
306
313
|
try {
|
|
307
314
|
await runGit(repository, ["-C", arm.path, "read-tree", "-m", "-u", predecessor, candidate]);
|
|
308
315
|
effects.push({ kind: "target-checkout", path: arm.path, target: prepared.target.target, action: "followed" });
|
|
309
316
|
}
|
|
310
317
|
catch (error) {
|
|
318
|
+
if (!(error instanceof GitPlumbingError))
|
|
319
|
+
throw error;
|
|
311
320
|
lag.push({
|
|
312
321
|
kind: "target-checkout-retained",
|
|
313
322
|
path: arm.path,
|
|
@@ -315,6 +324,7 @@ export async function followTargetPlacement(repository, prepared) {
|
|
|
315
324
|
diagnostic: diagnostic(error),
|
|
316
325
|
});
|
|
317
326
|
}
|
|
327
|
+
onPhysical?.({ effects: effects.slice(beforeEffects), lag: lag.slice(beforeLag) });
|
|
318
328
|
}
|
|
319
329
|
return { effects, lag };
|
|
320
330
|
}
|
|
@@ -377,7 +387,7 @@ async function recoverCheckout(input) {
|
|
|
377
387
|
]);
|
|
378
388
|
return "recovered";
|
|
379
389
|
}
|
|
380
|
-
export async function recoverTargetPlacement(repository, state) {
|
|
390
|
+
export async function recoverTargetPlacement(repository, state, onPhysical) {
|
|
381
391
|
const target = state.coordinates.target;
|
|
382
392
|
const delivery = state.delivery;
|
|
383
393
|
if (state.terminal?.kind !== "claimed" || target === undefined || delivery === null)
|
|
@@ -393,6 +403,7 @@ export async function recoverTargetPlacement(repository, state) {
|
|
|
393
403
|
const effects = [];
|
|
394
404
|
const lag = [];
|
|
395
405
|
for (const worktree of worktrees) {
|
|
406
|
+
const beforeEffects = effects.length, beforeLag = lag.length;
|
|
396
407
|
try {
|
|
397
408
|
const recovery = await recoverCheckout({
|
|
398
409
|
repository,
|
|
@@ -404,6 +415,7 @@ export async function recoverTargetPlacement(repository, state) {
|
|
|
404
415
|
});
|
|
405
416
|
if (recovery === "retained") {
|
|
406
417
|
lag.push(recoveryLag(worktree.path, target, "target checkout entries are neither predecessor nor candidate"));
|
|
418
|
+
onPhysical?.({ effects: [], lag: lag.slice(beforeLag) });
|
|
407
419
|
continue;
|
|
408
420
|
}
|
|
409
421
|
if (recovery === "recovered") {
|
|
@@ -411,8 +423,11 @@ export async function recoverTargetPlacement(repository, state) {
|
|
|
411
423
|
}
|
|
412
424
|
}
|
|
413
425
|
catch (error) {
|
|
426
|
+
if (!(error instanceof GitPlumbingError))
|
|
427
|
+
throw error;
|
|
414
428
|
lag.push(recoveryLag(worktree.path, target, diagnostic(error)));
|
|
415
429
|
}
|
|
430
|
+
onPhysical?.({ effects: effects.slice(beforeEffects), lag: lag.slice(beforeLag) });
|
|
416
431
|
}
|
|
417
432
|
return { effects, lag };
|
|
418
433
|
}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
1
2
|
import type { Preparation } from "../core/decide.js";
|
|
2
3
|
import type { ActorId, ContractCoordinates, ContractId, SnapshotId } from "../core/facts/types.js";
|
|
3
4
|
import { type GitObjectId } from "./identity.js";
|
|
@@ -12,34 +13,42 @@ export type TenderCaptureCoordinates = Readonly<{
|
|
|
12
13
|
/** Opt-in real-index UU refusal. Omit or false when authorized capture must read current worktree bytes. */
|
|
13
14
|
rejectUnmerged?: boolean;
|
|
14
15
|
}>;
|
|
15
|
-
export
|
|
16
|
-
kind: "worktree-missing"
|
|
17
|
-
contractId: ContractId
|
|
18
|
-
}>;
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
16
|
+
export declare const worktreeMissingRefusalSchema: z.ZodObject<{
|
|
17
|
+
kind: z.ZodLiteral<"worktree-missing">;
|
|
18
|
+
contractId: z.ZodPipe<z.ZodString, z.ZodTransform<ContractId, string>>;
|
|
19
|
+
}, z.core.$strict>;
|
|
20
|
+
type WorktreeMissingRefusal = z.infer<typeof worktreeMissingRefusalSchema>;
|
|
21
|
+
export declare const unmergedPathsRefusalSchema: z.ZodObject<{
|
|
22
|
+
kind: z.ZodLiteral<"unmerged-paths">;
|
|
23
|
+
contractId: z.ZodPipe<z.ZodString, z.ZodTransform<ContractId, string>>;
|
|
24
|
+
paths: z.ZodReadonly<z.ZodArray<z.ZodString>>;
|
|
25
|
+
}, z.core.$strict>;
|
|
26
|
+
export type TenderCaptureRefusal = WorktreeMissingRefusal | z.infer<typeof unmergedPathsRefusalSchema>;
|
|
27
|
+
export declare const workspaceDirtyDeltaSchema: z.ZodObject<{
|
|
28
|
+
staged: z.ZodReadonly<z.ZodArray<z.ZodString>>;
|
|
29
|
+
unstaged: z.ZodReadonly<z.ZodArray<z.ZodString>>;
|
|
30
|
+
untracked: z.ZodReadonly<z.ZodArray<z.ZodString>>;
|
|
31
|
+
shortStat: z.ZodObject<{
|
|
32
|
+
filesChanged: z.ZodNumber;
|
|
33
|
+
insertions: z.ZodNumber;
|
|
34
|
+
deletions: z.ZodNumber;
|
|
35
|
+
}, z.core.$strict>;
|
|
36
|
+
}, z.core.$strict>;
|
|
37
|
+
type WorkspaceDirtyDelta = z.infer<typeof workspaceDirtyDeltaSchema>;
|
|
38
|
+
export declare const dirtyWorkspaceRefusalSchema: z.ZodObject<{
|
|
39
|
+
kind: z.ZodLiteral<"dirty-workspace">;
|
|
40
|
+
contractId: z.ZodPipe<z.ZodString, z.ZodTransform<ContractId, string>>;
|
|
41
|
+
staged: z.ZodReadonly<z.ZodArray<z.ZodString>>;
|
|
42
|
+
unstaged: z.ZodReadonly<z.ZodArray<z.ZodString>>;
|
|
43
|
+
untracked: z.ZodReadonly<z.ZodArray<z.ZodString>>;
|
|
44
|
+
submodules: z.ZodReadonly<z.ZodArray<z.ZodString>>;
|
|
45
|
+
shortStat: z.ZodObject<{
|
|
46
|
+
filesChanged: z.ZodNumber;
|
|
47
|
+
insertions: z.ZodNumber;
|
|
48
|
+
deletions: z.ZodNumber;
|
|
49
|
+
}, z.core.$strict>;
|
|
50
|
+
}, z.core.$strict>;
|
|
51
|
+
export type DirtyWorkspaceRefusal = z.infer<typeof dirtyWorkspaceRefusalSchema>;
|
|
43
52
|
export type TenderCapture = Readonly<{
|
|
44
53
|
tree: GitObjectId;
|
|
45
54
|
head: SnapshotId;
|
package/build/src/git/tender.js
CHANGED
|
@@ -1,8 +1,47 @@
|
|
|
1
|
+
import { contractIdSchema } from "./identity.js";
|
|
2
|
+
import { z } from "zod";
|
|
1
3
|
import { access } from "node:fs/promises";
|
|
2
4
|
import { gitObjectIdForSnapshot, mintSnapshotId } from "./identity.js";
|
|
3
5
|
import { decodeGitNumstat, registeredWorktreePaths } from "./repository.js";
|
|
4
6
|
import { GitPlumbingError, runGit, runGitWithEnvironment } from "./process.js";
|
|
5
7
|
import { captureWorkspaceTree, unmergedWorkspacePaths, workspaceMergeHead, worktreePath } from "./workspace.js";
|
|
8
|
+
export const worktreeMissingRefusalSchema = z
|
|
9
|
+
.object({ kind: z.literal("worktree-missing"), contractId: contractIdSchema })
|
|
10
|
+
.strict();
|
|
11
|
+
export const unmergedPathsRefusalSchema = z
|
|
12
|
+
.object({
|
|
13
|
+
kind: z.literal("unmerged-paths"),
|
|
14
|
+
contractId: contractIdSchema,
|
|
15
|
+
paths: z.array(z.string().refine((value) => value.trim() !== "")).readonly(),
|
|
16
|
+
})
|
|
17
|
+
.strict();
|
|
18
|
+
export const workspaceDirtyDeltaSchema = z
|
|
19
|
+
.object({
|
|
20
|
+
staged: z.array(z.string()).readonly(),
|
|
21
|
+
unstaged: z.array(z.string()).readonly(),
|
|
22
|
+
untracked: z.array(z.string()).readonly(),
|
|
23
|
+
shortStat: z
|
|
24
|
+
.object({ filesChanged: z.number().int(), insertions: z.number().int(), deletions: z.number().int() })
|
|
25
|
+
.strict(),
|
|
26
|
+
})
|
|
27
|
+
.strict();
|
|
28
|
+
export const dirtyWorkspaceRefusalSchema = z
|
|
29
|
+
.object({
|
|
30
|
+
kind: z.literal("dirty-workspace"),
|
|
31
|
+
contractId: contractIdSchema,
|
|
32
|
+
staged: z.array(z.string().refine((value) => value.trim() !== "")).readonly(),
|
|
33
|
+
unstaged: z.array(z.string().refine((value) => value.trim() !== "")).readonly(),
|
|
34
|
+
untracked: z.array(z.string().refine((value) => value.trim() !== "")).readonly(),
|
|
35
|
+
submodules: z.array(z.string().refine((value) => value.trim() !== "")).readonly(),
|
|
36
|
+
shortStat: z
|
|
37
|
+
.object({
|
|
38
|
+
filesChanged: z.number().int().nonnegative(),
|
|
39
|
+
insertions: z.number().int().nonnegative(),
|
|
40
|
+
deletions: z.number().int().nonnegative(),
|
|
41
|
+
})
|
|
42
|
+
.strict(),
|
|
43
|
+
})
|
|
44
|
+
.strict();
|
|
6
45
|
async function workspaceExists(repository, path) {
|
|
7
46
|
const exists = await access(path).then(() => true, () => false);
|
|
8
47
|
return exists && (await registeredWorktreePaths(repository)).includes(path);
|
|
@@ -25,7 +25,9 @@ async function removeTerminalWorktree(repository, topology, path) {
|
|
|
25
25
|
try {
|
|
26
26
|
await runGit(repository, ["worktree", "remove", ...(present ? ["--force"] : []), path]);
|
|
27
27
|
}
|
|
28
|
-
catch {
|
|
28
|
+
catch (error) {
|
|
29
|
+
if (!(error instanceof GitPlumbingError))
|
|
30
|
+
throw error;
|
|
29
31
|
return { effect: { kind: "worktree", path, action: "unchanged" }, retained: true };
|
|
30
32
|
}
|
|
31
33
|
topology.paths.delete(path);
|
|
@@ -112,10 +114,10 @@ function fromPrimaryWorktree(repository) {
|
|
|
112
114
|
function complete(effects = [], lag = [], hookRuns = []) {
|
|
113
115
|
return hookRuns.length === 0 ? { effects, lag } : { effects, lag, hookRuns };
|
|
114
116
|
}
|
|
115
|
-
function retainTerminalWorktree(path, retainedLag,
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
return complete(effects, lag, hookRuns);
|
|
117
|
+
function retainTerminalWorktree(path, retainedLag, acc) {
|
|
118
|
+
acc.recordEffect({ kind: "worktree", path, action: "unchanged" });
|
|
119
|
+
acc.recordLag(retainedLag);
|
|
120
|
+
return complete(acc.effects, acc.lag, acc.hookRuns);
|
|
119
121
|
}
|
|
120
122
|
async function terminalSealExpectations(channel, state) {
|
|
121
123
|
const snapshots = terminalSealSnapshots(state);
|
|
@@ -144,11 +146,7 @@ async function removeSealedTerminalWorktree({ repository, topology, path, state,
|
|
|
144
146
|
snapshot,
|
|
145
147
|
retention: "ephemeral",
|
|
146
148
|
};
|
|
147
|
-
|
|
148
|
-
if (existing < 0)
|
|
149
|
-
acc.effects.push(effect);
|
|
150
|
-
else
|
|
151
|
-
acc.effects[existing] = effect;
|
|
149
|
+
acc.recordEffect(effect);
|
|
152
150
|
return { snapshot, workspace };
|
|
153
151
|
};
|
|
154
152
|
const before = await observeTerminalWorkspace(repository, path, expected);
|
|
@@ -186,7 +184,7 @@ async function removeSealedTerminalWorktree({ repository, topology, path, state,
|
|
|
186
184
|
if (removal.retained)
|
|
187
185
|
return retainTerminalWorktree(path, { kind: "worktree-retained", path }, acc);
|
|
188
186
|
if (removal.effect !== undefined)
|
|
189
|
-
acc.
|
|
187
|
+
acc.recordEffect(removal.effect);
|
|
190
188
|
return null;
|
|
191
189
|
}
|
|
192
190
|
async function targetCustodyForClaimedIntegration(repository, state, integration) {
|
|
@@ -204,19 +202,19 @@ function sealedTree(expected, snapshot) {
|
|
|
204
202
|
throw new Error(`terminal seal tree was not resolved: ${snapshot}`);
|
|
205
203
|
return tree;
|
|
206
204
|
}
|
|
207
|
-
async function releaseTerminalCustody({ repository, state, resolveSeal, ref, pin, acc
|
|
205
|
+
async function releaseTerminalCustody({ repository, state, resolveSeal, ref, pin, acc, }) {
|
|
208
206
|
const [deliveryRef, candidatePin] = await Promise.all([readRef(repository, ref), readRef(repository, pin)]);
|
|
209
207
|
if (deliveryRef === null && candidatePin === null)
|
|
210
208
|
return;
|
|
211
209
|
if (state.delivery === null) {
|
|
212
210
|
const custodian = await snapshotCustodian(repository, state.coordinates.start);
|
|
213
211
|
if (deliveryRef !== null) {
|
|
214
|
-
|
|
212
|
+
acc.recordEffect(custodian === null
|
|
215
213
|
? retainedRefEffect(ref, deliveryRef)
|
|
216
214
|
: await removeRefWithCustody(repository, ref, custodian.ref, custodian.oid));
|
|
217
215
|
}
|
|
218
216
|
if (candidatePin !== null)
|
|
219
|
-
|
|
217
|
+
acc.recordEffect(await removeRef(repository, pin));
|
|
220
218
|
return;
|
|
221
219
|
}
|
|
222
220
|
const tender = state.delivery.data.tenderSnapshot;
|
|
@@ -224,29 +222,29 @@ async function releaseTerminalCustody({ repository, state, resolveSeal, ref, pin
|
|
|
224
222
|
const target = await targetCustodyForClaimedIntegration(repository, state, integration);
|
|
225
223
|
if (deliveryRef !== null && target !== null) {
|
|
226
224
|
if (tender === integration) {
|
|
227
|
-
|
|
225
|
+
acc.recordEffect(await removeRefWithCustody(repository, ref, target.ref, target.oid));
|
|
228
226
|
}
|
|
229
227
|
else {
|
|
230
228
|
const expected = await resolveSeal();
|
|
231
229
|
if (sealedTree(expected, tender) === sealedTree(expected, integration)) {
|
|
232
|
-
|
|
230
|
+
acc.recordEffect(await removeRefWithCustody(repository, ref, target.ref, target.oid));
|
|
233
231
|
}
|
|
234
232
|
else {
|
|
235
|
-
|
|
233
|
+
acc.recordEffect(retainedRefEffect(ref, deliveryRef));
|
|
236
234
|
}
|
|
237
235
|
}
|
|
238
236
|
}
|
|
239
237
|
else if (deliveryRef !== null) {
|
|
240
|
-
|
|
238
|
+
acc.recordEffect(retainedRefEffect(ref, deliveryRef));
|
|
241
239
|
}
|
|
242
240
|
if (candidatePin !== null) {
|
|
243
241
|
if (target !== null || (tender === integration && deliveryRef !== null)) {
|
|
244
|
-
|
|
242
|
+
acc.recordEffect(target !== null
|
|
245
243
|
? await removeRefWithCustody(repository, pin, target.ref, target.oid)
|
|
246
244
|
: await removeRefWithCustody(repository, pin, ref, tender));
|
|
247
245
|
}
|
|
248
246
|
else {
|
|
249
|
-
|
|
247
|
+
acc.recordEffect(retainedRefEffect(pin, candidatePin));
|
|
250
248
|
}
|
|
251
249
|
}
|
|
252
250
|
}
|
|
@@ -261,13 +259,13 @@ export async function reconcileTerminalManagedWorktree({ repository, channel, ho
|
|
|
261
259
|
return complete(acc.effects, acc.lag, acc.hookRuns);
|
|
262
260
|
}
|
|
263
261
|
const expected = await resolveSeal();
|
|
264
|
-
acc.
|
|
262
|
+
acc.recordEffect(await updateRef(primary, ref, state.delivery?.data.tenderSnapshot ?? state.coordinates.start));
|
|
265
263
|
if (state.delivery !== null) {
|
|
266
|
-
acc.
|
|
264
|
+
acc.recordEffect(await updateRef(primary, pin, state.currentIntegration?.snapshot ?? state.delivery.data.integration.snapshot));
|
|
267
265
|
}
|
|
268
266
|
if (retainTerminalWorktree === true) {
|
|
269
267
|
if (topology.paths.has(path) && (await pathExists(path))) {
|
|
270
|
-
acc.
|
|
268
|
+
acc.recordEffect({ kind: "worktree", path, action: "unchanged" });
|
|
271
269
|
}
|
|
272
270
|
return complete(acc.effects, acc.lag);
|
|
273
271
|
}
|
|
@@ -1,14 +1,16 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
1
2
|
import type { ContractState, SnapshotId } from "../core/facts/types.js";
|
|
2
3
|
import { type GitObjectId } from "./identity.js";
|
|
3
4
|
import type { GitOid } from "./repository.js";
|
|
4
5
|
import { type GitRepository } from "./process.js";
|
|
5
6
|
import { captureWorkspaceTree } from "./workspace.js";
|
|
6
|
-
export
|
|
7
|
-
kind: "unsealed-bytes"
|
|
8
|
-
path:
|
|
9
|
-
paths:
|
|
10
|
-
head
|
|
11
|
-
}>;
|
|
7
|
+
export declare const unsealedBytesSchema: z.ZodObject<{
|
|
8
|
+
kind: z.ZodLiteral<"unsealed-bytes">;
|
|
9
|
+
path: z.ZodString;
|
|
10
|
+
paths: z.ZodReadonly<z.ZodArray<z.ZodString>>;
|
|
11
|
+
head: z.ZodOptional<z.ZodPipe<z.ZodString, z.ZodTransform<SnapshotId, string>>>;
|
|
12
|
+
}, z.core.$strict>;
|
|
13
|
+
type UnsealedBytes = z.infer<typeof unsealedBytesSchema>;
|
|
12
14
|
export type TerminalSealExpectations = Readonly<{
|
|
13
15
|
heads: readonly SnapshotId[];
|
|
14
16
|
trees: readonly GitObjectId[];
|
|
@@ -1,6 +1,16 @@
|
|
|
1
|
+
import { mintedSnapshotInputSchema } from "./identity.js";
|
|
2
|
+
import { z } from "zod";
|
|
1
3
|
import { gitObjectId, gitObjectIdForSnapshot, mintSnapshotId } from "./identity.js";
|
|
2
4
|
import { runGit } from "./process.js";
|
|
3
5
|
import { captureWorkspaceTree } from "./workspace.js";
|
|
6
|
+
export const unsealedBytesSchema = z
|
|
7
|
+
.object({
|
|
8
|
+
kind: z.literal("unsealed-bytes"),
|
|
9
|
+
path: z.string().refine((value) => value.trim() !== ""),
|
|
10
|
+
paths: z.array(z.string().refine((value) => value.trim() !== "")).readonly(),
|
|
11
|
+
head: mintedSnapshotInputSchema.optional(),
|
|
12
|
+
})
|
|
13
|
+
.strict();
|
|
4
14
|
export function terminalSealSnapshots(state) {
|
|
5
15
|
return [
|
|
6
16
|
...new Set([
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
1
2
|
import type { ContractId, SnapshotId } from "../core/facts/types.js";
|
|
2
3
|
import { type GitObjectId } from "./identity.js";
|
|
3
4
|
import { type GitRepository } from "./process.js";
|
|
@@ -47,11 +48,12 @@ export type WorkspaceChangeCounts = Readonly<{
|
|
|
47
48
|
untracked: number;
|
|
48
49
|
submodules: number;
|
|
49
50
|
}>;
|
|
50
|
-
export
|
|
51
|
-
materialize: "deliver --materialize-conflict --include-dirty"
|
|
52
|
-
deliver: "deliver --include-dirty"
|
|
53
|
-
staging: "not-required"
|
|
54
|
-
}>;
|
|
51
|
+
export declare const conflictRecoverySchema: z.ZodObject<{
|
|
52
|
+
materialize: z.ZodLiteral<"deliver --materialize-conflict --include-dirty">;
|
|
53
|
+
deliver: z.ZodLiteral<"deliver --include-dirty">;
|
|
54
|
+
staging: z.ZodLiteral<"not-required">;
|
|
55
|
+
}, z.core.$strict>;
|
|
56
|
+
type ConflictRecovery = z.infer<typeof conflictRecoverySchema>;
|
|
55
57
|
export declare const conflictRecovery: ConflictRecovery;
|
|
56
58
|
export type ContractWorkspaceMerge = Readonly<{
|
|
57
59
|
head: SnapshotId;
|
|
@@ -73,16 +75,27 @@ export type ContractWorkspaceObservation = Readonly<{
|
|
|
73
75
|
kind: "failed";
|
|
74
76
|
diagnostic: string;
|
|
75
77
|
}>;
|
|
76
|
-
export
|
|
77
|
-
kind: "
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
kind: "
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
78
|
+
export declare const worktreeWorkspaceSchema: z.ZodObject<{
|
|
79
|
+
kind: z.ZodLiteral<"worktree">;
|
|
80
|
+
path: z.ZodString;
|
|
81
|
+
}, z.core.$strict>;
|
|
82
|
+
export declare const contractTargetLagSchema: z.ZodUnion<readonly [z.ZodObject<{
|
|
83
|
+
kind: z.ZodLiteral<"none">;
|
|
84
|
+
}, z.core.$strict>, z.ZodObject<{
|
|
85
|
+
kind: z.ZodLiteral<"unknown">;
|
|
86
|
+
subject: z.ZodOptional<z.ZodObject<{
|
|
87
|
+
kind: z.ZodLiteral<"worktree">;
|
|
88
|
+
path: z.ZodString;
|
|
89
|
+
}, z.core.$strict>>;
|
|
90
|
+
}, z.core.$strict>, z.ZodObject<{
|
|
91
|
+
kind: z.ZodLiteral<"counted">;
|
|
92
|
+
behind: z.ZodNumber;
|
|
93
|
+
subject: z.ZodOptional<z.ZodObject<{
|
|
94
|
+
kind: z.ZodLiteral<"worktree">;
|
|
95
|
+
path: z.ZodString;
|
|
96
|
+
}, z.core.$strict>>;
|
|
97
|
+
}, z.core.$strict>]>;
|
|
98
|
+
export type ContractTargetLag = z.infer<typeof contractTargetLagSchema>;
|
|
86
99
|
export declare function observeWorkspace(repository: GitRepository, location: ContractWorkspaceLocation, workspace: string): Promise<ContractWorkspaceObservation>;
|
|
87
100
|
export declare function observeTargetLag(repository: GitRepository, workspace: string, head: SnapshotId | null | undefined): Promise<ContractTargetLag>;
|
|
88
101
|
/** Capture tracked and untracked workspace bytes without changing its real index. */
|
|
@@ -114,3 +127,4 @@ export declare function retireConflictHandoff(repository: GitRepository, input:
|
|
|
114
127
|
workspace: string;
|
|
115
128
|
consume: boolean;
|
|
116
129
|
}>): Promise<HandoffRetirement>;
|
|
130
|
+
export {};
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
1
2
|
import { access, mkdtemp, rm } from "node:fs/promises";
|
|
2
3
|
import { tmpdir } from "node:os";
|
|
3
4
|
import { join, resolve } from "node:path";
|
|
@@ -193,11 +194,32 @@ export async function workspaceMergeStatePresent(repository, workspace) {
|
|
|
193
194
|
export async function unmergedWorkspacePaths(repository, workspace) {
|
|
194
195
|
return (await workspaceStatus(repository, workspace)).unmergedPaths;
|
|
195
196
|
}
|
|
197
|
+
export const conflictRecoverySchema = z
|
|
198
|
+
.object({
|
|
199
|
+
materialize: z.literal("deliver --materialize-conflict --include-dirty"),
|
|
200
|
+
deliver: z.literal("deliver --include-dirty"),
|
|
201
|
+
staging: z.literal("not-required"),
|
|
202
|
+
})
|
|
203
|
+
.strict();
|
|
196
204
|
export const conflictRecovery = Object.freeze({
|
|
197
205
|
materialize: "deliver --materialize-conflict --include-dirty",
|
|
198
206
|
deliver: "deliver --include-dirty",
|
|
199
207
|
staging: "not-required",
|
|
200
208
|
});
|
|
209
|
+
export const worktreeWorkspaceSchema = z
|
|
210
|
+
.object({ kind: z.literal("worktree"), path: z.string().refine((value) => value.trim() !== "") })
|
|
211
|
+
.strict();
|
|
212
|
+
export const contractTargetLagSchema = z.union([
|
|
213
|
+
z.object({ kind: z.literal("none") }).strict(),
|
|
214
|
+
z.object({ kind: z.literal("unknown"), subject: worktreeWorkspaceSchema.optional() }).strict(),
|
|
215
|
+
z
|
|
216
|
+
.object({
|
|
217
|
+
kind: z.literal("counted"),
|
|
218
|
+
behind: z.number().int().nonnegative(),
|
|
219
|
+
subject: worktreeWorkspaceSchema.optional(),
|
|
220
|
+
})
|
|
221
|
+
.strict(),
|
|
222
|
+
]);
|
|
201
223
|
function countsOf(changes) {
|
|
202
224
|
return {
|
|
203
225
|
staged: changes.staged.length,
|
|
@@ -215,7 +237,9 @@ export async function observeWorkspace(repository, location, workspace) {
|
|
|
215
237
|
const merge = head === undefined ? null : { head, unmergedPaths: status.unmergedPaths };
|
|
216
238
|
return { kind: dirty ? "dirty" : "clean", location, counts, merge };
|
|
217
239
|
}
|
|
218
|
-
catch {
|
|
240
|
+
catch (error) {
|
|
241
|
+
if (!(error instanceof GitPlumbingError))
|
|
242
|
+
throw error;
|
|
219
243
|
return { kind: "unavailable", location };
|
|
220
244
|
}
|
|
221
245
|
}
|
|
@@ -233,7 +257,9 @@ export async function observeTargetLag(repository, workspace, head) {
|
|
|
233
257
|
return { kind: "unknown", subject };
|
|
234
258
|
return { kind: "counted", behind: Number(text), subject };
|
|
235
259
|
}
|
|
236
|
-
catch {
|
|
260
|
+
catch (error) {
|
|
261
|
+
if (!(error instanceof GitPlumbingError))
|
|
262
|
+
throw error;
|
|
237
263
|
return { kind: "unknown", subject };
|
|
238
264
|
}
|
|
239
265
|
}
|