@astrosheep/keiyaku 2.9.13 → 4.0.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/README.md +5 -132
- package/build/integrations/marketplace/.agents/plugins/marketplace.json +12 -0
- package/build/integrations/marketplace/.claude-plugin/marketplace.json +5 -0
- package/build/integrations/marketplace/plugins/keiyaku/.claude-plugin/plugin.json +7 -0
- package/build/integrations/marketplace/plugins/keiyaku/.codex-plugin/plugin.json +18 -0
- package/build/integrations/marketplace/plugins/keiyaku/opencode.js +16 -0
- package/build/integrations/marketplace/plugins/keiyaku/package.json +8 -0
- package/build/integrations/marketplace/plugins/keiyaku/skills/keiyaku/SKILL.md +42 -0
- package/build/integrations/marketplace/plugins/keiyaku/skills/keiyaku-akuma/SKILL.md +53 -0
- package/build/integrations/marketplace/plugins/keiyaku/skills/keiyaku-bind/SKILL.md +94 -0
- package/build/integrations/marketplace/plugins/keiyaku/skills/keiyaku-bind/agents/openai.yaml +4 -0
- package/build/integrations/marketplace/plugins/keiyaku/skills/keiyaku-task/SKILL.md +97 -0
- package/build/integrations/marketplace/plugins/keiyaku/skills/keiyaku-workflow/SKILL.md +189 -0
- package/build/src/akuma/akuma.d.ts +124 -0
- package/build/src/akuma/akuma.js +414 -0
- package/build/src/akuma/archetype.d.ts +39 -0
- package/build/src/akuma/archetype.js +207 -0
- package/build/src/akuma/body.d.ts +20 -0
- package/build/src/akuma/body.js +417 -0
- package/build/src/akuma/coordinate.d.ts +9 -0
- package/build/src/akuma/coordinate.js +22 -0
- package/build/src/akuma/heart/facts.d.ts +202 -0
- package/build/src/akuma/heart/facts.js +9 -0
- package/build/src/akuma/heart/index.d.ts +90 -0
- package/build/src/akuma/heart/index.js +240 -0
- package/build/src/akuma/heart/rows.d.ts +166 -0
- package/build/src/akuma/heart/rows.js +299 -0
- package/build/src/akuma/heart/schema.d.ts +5 -0
- package/build/src/akuma/heart/schema.js +160 -0
- package/build/src/akuma/heart/storage.d.ts +33 -0
- package/build/src/akuma/heart/storage.js +164 -0
- package/build/src/akuma/heart/tells.d.ts +12 -0
- package/build/src/akuma/heart/tells.js +79 -0
- package/build/src/akuma/heart/timeline.d.ts +15 -0
- package/build/src/akuma/heart/timeline.js +86 -0
- package/build/src/akuma/identity.d.ts +46 -0
- package/build/src/akuma/identity.js +89 -0
- package/build/src/akuma/index.d.ts +9 -0
- package/build/src/akuma/index.js +3 -0
- package/build/src/akuma/projection.d.ts +97 -0
- package/build/src/akuma/projection.js +145 -0
- package/build/src/akuma/provider.d.ts +169 -0
- package/build/src/akuma/provider.js +255 -0
- package/build/src/akuma/providers/claude/events.d.ts +52 -0
- package/build/src/akuma/providers/claude/events.js +185 -0
- package/build/src/akuma/providers/claude/index.d.ts +46 -0
- package/build/src/akuma/providers/claude/index.js +265 -0
- package/build/src/akuma/providers/claude/input.d.ts +13 -0
- package/build/src/akuma/providers/claude/input.js +109 -0
- package/build/src/akuma/providers/codex-app-server/events.d.ts +110 -0
- package/build/src/akuma/providers/codex-app-server/events.js +337 -0
- package/build/src/akuma/providers/codex-app-server/index.d.ts +29 -0
- package/build/src/akuma/providers/codex-app-server/index.js +213 -0
- package/build/src/akuma/providers/index.d.ts +4 -0
- package/build/src/akuma/providers/index.js +85 -0
- package/build/src/akuma/providers/opencode-sdk/events.d.ts +48 -0
- package/build/src/akuma/providers/opencode-sdk/events.js +116 -0
- package/build/src/akuma/providers/opencode-sdk/index.d.ts +32 -0
- package/build/src/akuma/providers/opencode-sdk/index.js +203 -0
- package/build/src/akuma/providers/opencode-sdk/session.d.ts +41 -0
- package/build/src/akuma/providers/opencode-sdk/session.js +62 -0
- package/build/src/akuma/providers/pi/events.d.ts +33 -0
- package/build/src/akuma/providers/pi/events.js +128 -0
- package/build/src/akuma/providers/pi/index.d.ts +11 -0
- package/build/src/akuma/providers/pi/index.js +162 -0
- package/build/src/akuma/publication.d.ts +10 -0
- package/build/src/akuma/publication.js +107 -0
- package/build/src/akuma/requests.d.ts +47 -0
- package/build/src/akuma/requests.js +391 -0
- package/build/src/alias/index.d.ts +18 -0
- package/build/src/alias/index.js +103 -0
- package/build/src/body/amend.d.ts +2 -0
- package/build/src/body/amend.js +289 -0
- package/build/src/body/arc.d.ts +2 -0
- package/build/src/body/arc.js +54 -0
- package/build/src/body/decode.d.ts +4 -0
- package/build/src/body/decode.js +146 -0
- package/build/src/body/keys.d.ts +4 -0
- package/build/src/body/keys.js +11 -0
- package/build/src/body/region.d.ts +6 -0
- package/build/src/body/region.js +139 -0
- package/build/src/body/render.d.ts +4 -0
- package/build/src/body/render.js +74 -0
- package/build/src/body/shape.d.ts +29 -0
- package/build/src/body/shape.js +22 -0
- package/build/src/body/types.d.ts +28 -0
- package/build/src/body/verification.d.ts +7 -0
- package/build/src/body/verification.js +40 -0
- package/build/src/cli/accepted.d.ts +18 -0
- package/build/src/cli/accepted.js +66 -0
- package/build/src/cli/actor.d.ts +8 -0
- package/build/src/cli/actor.js +11 -0
- package/build/src/cli/commands/akuma-invoke.d.ts +77 -0
- package/build/src/cli/commands/akuma-invoke.js +112 -0
- package/build/src/cli/commands/akuma.d.ts +50 -0
- package/build/src/cli/commands/akuma.js +262 -0
- package/build/src/cli/commands/amend.d.ts +13 -0
- package/build/src/cli/commands/amend.js +13 -0
- package/build/src/cli/commands/bind.d.ts +12 -0
- package/build/src/cli/commands/bind.js +17 -0
- package/build/src/cli/commands/contract.d.ts +142 -0
- package/build/src/cli/commands/contract.js +14 -0
- package/build/src/cli/commands/install.d.ts +25 -0
- package/build/src/cli/commands/install.js +105 -0
- package/build/src/cli/commands/task-invoke.d.ts +11 -0
- package/build/src/cli/commands/task-invoke.js +117 -0
- package/build/src/cli/commands/task.d.ts +16 -0
- package/build/src/cli/commands/task.js +144 -0
- package/build/src/cli/index.d.ts +2 -0
- package/build/src/cli/index.js +3 -0
- package/build/src/cli/invoke.d.ts +22 -0
- package/build/src/cli/invoke.js +463 -0
- package/build/src/cli/main.d.ts +1 -0
- package/build/src/cli/main.js +98 -0
- package/build/src/cli/parse.d.ts +107 -0
- package/build/src/cli/parse.js +348 -0
- package/build/src/cli/render/akuma-tool.d.ts +13 -0
- package/build/src/cli/render/akuma-tool.js +72 -0
- package/build/src/cli/render/akuma.d.ts +7 -0
- package/build/src/cli/render/akuma.js +194 -0
- package/build/src/cli/render/board.d.ts +2 -0
- package/build/src/cli/render/board.js +4 -0
- package/build/src/cli/render/catalog.d.ts +2 -0
- package/build/src/cli/render/catalog.js +16 -0
- package/build/src/cli/render/contract.d.ts +4 -0
- package/build/src/cli/render/contract.js +102 -0
- package/build/src/cli/render/kanshi.d.ts +3 -0
- package/build/src/cli/render/kanshi.js +252 -0
- package/build/src/cli/render/refusal.d.ts +2 -0
- package/build/src/cli/render/refusal.js +21 -0
- package/build/src/cli/render/settings.d.ts +3 -0
- package/build/src/cli/render/settings.js +30 -0
- package/build/src/cli/render/task.d.ts +6 -0
- package/build/src/cli/render/task.js +105 -0
- package/build/src/cli/render/terminal.d.ts +23 -0
- package/build/src/cli/render/terminal.js +151 -0
- package/build/src/cli/render/text.d.ts +3 -0
- package/build/src/cli/render/text.js +20 -0
- package/build/src/cli/result.d.ts +67 -0
- package/build/src/cli/selectors.d.ts +9 -0
- package/build/src/cli/selectors.js +66 -0
- package/build/src/cli/usage.d.ts +6 -0
- package/build/src/cli/usage.js +19 -0
- package/build/src/contract-worktree.d.ts +43 -0
- package/build/src/contract-worktree.js +213 -0
- package/build/src/coordination/durable-file.d.ts +4 -0
- package/build/src/coordination/durable-file.js +79 -0
- package/build/src/coordination/sqlite-transaction-lock.d.ts +14 -0
- package/build/src/coordination/sqlite-transaction-lock.js +119 -0
- package/build/src/core/decide.d.ts +45 -0
- package/build/src/core/facts/codec.d.ts +3 -0
- package/build/src/core/facts/codec.js +277 -0
- package/build/src/core/facts/eligibility.d.ts +7 -0
- package/build/src/core/facts/eligibility.js +26 -0
- package/build/src/core/facts/errors.d.ts +3 -0
- package/build/src/core/facts/errors.js +6 -0
- package/build/src/core/facts/fold.d.ts +2 -0
- package/build/src/core/facts/fold.js +97 -0
- package/build/src/core/facts/gate.d.ts +24 -0
- package/build/src/core/facts/gate.js +52 -0
- package/build/src/core/facts/observation.d.ts +15 -0
- package/build/src/core/facts/observation.js +35 -0
- package/build/src/core/facts/offer.d.ts +21 -0
- package/build/src/core/facts/types.d.ts +137 -0
- package/build/src/core/facts/types.js +66 -0
- package/build/src/core/subject.d.ts +21 -0
- package/build/src/core/subject.js +89 -0
- package/build/src/core/verbs/abandon.d.ts +13 -0
- package/build/src/core/verbs/abandon.js +17 -0
- package/build/src/core/verbs/amend.d.ts +14 -0
- package/build/src/core/verbs/amend.js +52 -0
- package/build/src/core/verbs/arc.d.ts +13 -0
- package/build/src/core/verbs/arc.js +25 -0
- package/build/src/core/verbs/attestation.d.ts +13 -0
- package/build/src/core/verbs/attestation.js +21 -0
- package/build/src/core/verbs/bind.d.ts +13 -0
- package/build/src/core/verbs/bind.js +26 -0
- package/build/src/core/verbs/deliver.d.ts +13 -0
- package/build/src/core/verbs/deliver.js +42 -0
- package/build/src/core/verbs/placement.d.ts +13 -0
- package/build/src/core/verbs/placement.js +37 -0
- package/build/src/dispatch/index.d.ts +33 -0
- package/build/src/dispatch/index.js +168 -0
- package/build/src/duration.d.ts +10 -0
- package/build/src/duration.js +22 -0
- package/build/src/git/admission.d.ts +18 -0
- package/build/src/git/admission.js +126 -0
- package/build/src/git/hooks.d.ts +49 -0
- package/build/src/git/hooks.js +310 -0
- package/build/src/git/identity.d.ts +17 -0
- package/build/src/git/identity.js +47 -0
- package/build/src/git/integration.d.ts +49 -0
- package/build/src/git/integration.js +214 -0
- package/build/src/git/observe.d.ts +50 -0
- package/build/src/git/observe.js +330 -0
- package/build/src/git/read-observation.d.ts +41 -0
- package/build/src/git/read-observation.js +361 -0
- package/build/src/git/reconcile.d.ts +59 -0
- package/build/src/git/reconcile.js +376 -0
- package/build/src/git/repository.d.ts +95 -0
- package/build/src/git/repository.js +490 -0
- package/build/src/git/scratch.d.ts +13 -0
- package/build/src/git/scratch.js +66 -0
- package/build/src/git/target-placement.d.ts +56 -0
- package/build/src/git/target-placement.js +255 -0
- package/build/src/git/tender.d.ts +48 -0
- package/build/src/git/tender.js +82 -0
- package/build/src/git/terminal-seal.d.ts +24 -0
- package/build/src/git/terminal-seal.js +87 -0
- package/build/src/git/tree.d.ts +34 -0
- package/build/src/git/tree.js +116 -0
- package/build/src/git/workspace.d.ts +21 -0
- package/build/src/git/workspace.js +104 -0
- package/build/src/identity/coordinates.d.ts +9 -0
- package/build/src/identity/coordinates.js +20 -0
- package/build/src/identity/normalize.d.ts +8 -0
- package/build/src/identity/normalize.js +45 -0
- package/build/src/identity/selector.d.ts +12 -0
- package/build/src/identity/selector.js +26 -0
- package/build/src/index.d.ts +6 -0
- package/build/src/index.js +3 -0
- package/build/src/kanshi/index.d.ts +5 -0
- package/build/src/kanshi/index.js +2 -0
- package/build/src/kanshi/read.d.ts +8 -0
- package/build/src/kanshi/read.js +209 -0
- package/build/src/kanshi/report.d.ts +60 -0
- package/build/src/kanshi/select.d.ts +8 -0
- package/build/src/kanshi/select.js +21 -0
- package/build/src/library/address.d.ts +48 -0
- package/build/src/library/address.js +134 -0
- package/build/src/library/akuma-creation.d.ts +83 -0
- package/build/src/library/akuma-creation.js +152 -0
- package/build/src/library/bind.d.ts +21 -0
- package/build/src/library/bind.js +56 -0
- package/build/src/library/catalog.d.ts +58 -0
- package/build/src/library/catalog.js +72 -0
- package/build/src/library/configuration.d.ts +17 -0
- package/build/src/library/configuration.js +97 -0
- package/build/src/library/contract.d.ts +120 -0
- package/build/src/library/contract.js +335 -0
- package/build/src/library/delivery.d.ts +23 -0
- package/build/src/library/delivery.js +21 -0
- package/build/src/library/fleet.d.ts +65 -0
- package/build/src/library/fleet.js +189 -0
- package/build/src/library/input.d.ts +16 -0
- package/build/src/library/input.js +101 -0
- package/build/src/library/keiyaku.d.ts +42 -0
- package/build/src/library/keiyaku.js +26 -0
- package/build/src/library/mutation.d.ts +38 -0
- package/build/src/library/mutation.js +39 -0
- package/build/src/library/refusal.d.ts +21 -0
- package/build/src/library/refusal.js +29 -0
- package/build/src/library/region.d.ts +18 -0
- package/build/src/library/region.js +30 -0
- package/build/src/library/repo.d.ts +36 -0
- package/build/src/library/repo.js +76 -0
- package/build/src/markdown/diff.d.ts +1 -0
- package/build/src/markdown/diff.js +4 -0
- package/build/src/markdown/lex.d.ts +3 -0
- package/build/src/markdown/lex.js +221 -0
- package/build/src/markdown/parse.d.ts +2 -0
- package/build/src/markdown/parse.js +221 -0
- package/build/src/markdown/query.d.ts +21 -0
- package/build/src/markdown/query.js +51 -0
- package/build/src/markdown/types.d.ts +118 -0
- package/build/src/markdown/types.js +6 -0
- package/build/src/protocol/attempt.d.ts +49 -0
- package/build/src/protocol/attempt.js +150 -0
- package/build/src/protocol/bind.d.ts +32 -0
- package/build/src/protocol/bind.js +70 -0
- package/build/src/protocol/intent.d.ts +76 -0
- package/build/src/protocol/intent.js +90 -0
- package/build/src/protocol/operations.d.ts +198 -0
- package/build/src/protocol/operations.js +485 -0
- package/build/src/protocol/outcome.d.ts +23 -0
- package/build/src/protocol/outcome.js +21 -0
- package/build/src/protocol/placement.d.ts +30 -0
- package/build/src/protocol/placement.js +114 -0
- package/build/src/protocol/read/audit.d.ts +31 -0
- package/build/src/protocol/read/audit.js +55 -0
- package/build/src/protocol/read/documents.d.ts +8 -0
- package/build/src/protocol/read/documents.js +16 -0
- package/build/src/protocol/read/status.d.ts +44 -0
- package/build/src/protocol/read/status.js +60 -0
- package/build/src/protocol/run.d.ts +81 -0
- package/build/src/protocol/run.js +64 -0
- package/build/src/runtime/proc/line-rpc.d.ts +38 -0
- package/build/src/runtime/proc/line-rpc.js +145 -0
- package/build/src/runtime/proc/run.d.ts +70 -0
- package/build/src/runtime/proc/run.js +226 -0
- package/build/src/settings.d.ts +51 -0
- package/build/src/settings.js +114 -0
- package/build/src/settlement/fence.d.ts +9 -0
- package/build/src/settlement/fence.js +23 -0
- package/build/src/settlement/holder.d.ts +36 -0
- package/build/src/settlement/holder.js +187 -0
- package/build/src/settlement/settle.d.ts +44 -0
- package/build/src/settlement/settle.js +165 -0
- package/build/src/task/board.d.ts +83 -0
- package/build/src/task/board.js +165 -0
- package/build/src/task/compose.d.ts +25 -0
- package/build/src/task/compose.js +232 -0
- package/build/src/task/context.d.ts +4 -0
- package/build/src/task/context.js +51 -0
- package/build/src/task/document.d.ts +24 -0
- package/build/src/task/document.js +118 -0
- package/build/src/task/identity.d.ts +12 -0
- package/build/src/task/identity.js +47 -0
- package/build/src/task/index.d.ts +90 -0
- package/build/src/task/index.js +182 -0
- package/build/src/task/operations.d.ts +134 -0
- package/build/src/task/operations.js +198 -0
- package/build/src/task/store.d.ts +20 -0
- package/build/src/task/store.js +114 -0
- package/build/src/verification/declaration.d.ts +23 -0
- package/build/src/verification/declaration.js +14 -0
- package/build/src/verification/execution.d.ts +49 -0
- package/build/src/verification/execution.js +104 -0
- package/build/src/world.d.ts +13 -0
- package/build/src/world.js +103 -0
- package/package.json +65 -44
- package/build/.tsbuildinfo +0 -1
- package/build/agents/call-terms.js +0 -32
- package/build/agents/harness/activity-values.js +0 -70
- package/build/agents/harness/control-types.js +0 -18
- package/build/agents/harness/event-channel.js +0 -213
- package/build/agents/harness/event-persistence.js +0 -220
- package/build/agents/harness/events.js +0 -48
- package/build/agents/harness/execution-handle.js +0 -172
- package/build/agents/harness/index.js +0 -11
- package/build/agents/harness/outcome-error.js +0 -81
- package/build/agents/harness/outcome.js +0 -220
- package/build/agents/harness/projection.js +0 -369
- package/build/agents/harness/provider-adapter.js +0 -58
- package/build/agents/harness/router.js +0 -30
- package/build/agents/harness/runtime.js +0 -85
- package/build/agents/harness/session.js +0 -15
- package/build/agents/launch-snapshot/model.js +0 -127
- package/build/agents/launch-snapshot/parse-helpers.js +0 -114
- package/build/agents/launch-snapshot/resolve.js +0 -46
- package/build/agents/opencode-sdk.js +0 -159
- package/build/agents/providers/claude-agent-sdk/adapter.js +0 -396
- package/build/agents/providers/claude-agent-sdk/events.js +0 -218
- package/build/agents/providers/claude-agent-sdk/registration.js +0 -225
- package/build/agents/providers/claude-agent-sdk/session-schema.js +0 -2
- package/build/agents/providers/claude-agent-sdk/session.js +0 -172
- package/build/agents/providers/codex-app-server/adapter.js +0 -387
- package/build/agents/providers/codex-app-server/events.js +0 -492
- package/build/agents/providers/codex-app-server/identity.js +0 -1
- package/build/agents/providers/codex-app-server/policy.js +0 -29
- package/build/agents/providers/codex-app-server/registration.js +0 -259
- package/build/agents/providers/codex-app-server/session-schema.js +0 -6
- package/build/agents/providers/codex-app-server/session.js +0 -273
- package/build/agents/providers/event-type-tail.js +0 -16
- package/build/agents/providers/opencode-sdk/adapter.js +0 -402
- package/build/agents/providers/opencode-sdk/events.js +0 -380
- package/build/agents/providers/opencode-sdk/registration.js +0 -146
- package/build/agents/providers/opencode-sdk/session-schema.js +0 -2
- package/build/agents/providers/opencode-sdk/session.js +0 -187
- package/build/agents/providers/pi/adapter.js +0 -285
- package/build/agents/providers/pi/checkpoint.js +0 -49
- package/build/agents/providers/pi/events.js +0 -285
- package/build/agents/providers/pi/registration.js +0 -160
- package/build/agents/providers/pi/session-schema.js +0 -6
- package/build/agents/providers/registration.js +0 -7
- package/build/agents/providers/registry.js +0 -76
- package/build/agents/selector.js +0 -120
- package/build/agents/session.js +0 -29
- package/build/agents/string-tail-buffer.js +0 -44
- package/build/agents/types.js +0 -30
- package/build/artifact-directories.js +0 -22
- package/build/cli/commands/akuma/akuma/handler.js +0 -5
- package/build/cli/commands/akuma/akuma/meta.js +0 -17
- package/build/cli/commands/akuma/catalog.js +0 -10
- package/build/cli/commands/akuma/list/handler.js +0 -15
- package/build/cli/commands/akuma/list/meta-list.js +0 -12
- package/build/cli/commands/akuma/list/meta-ls.js +0 -9
- package/build/cli/commands/akuma/show/handler.js +0 -27
- package/build/cli/commands/akuma/show/meta.js +0 -8
- package/build/cli/commands/akuma.js +0 -186
- package/build/cli/commands/contract/amend/handler.js +0 -17
- package/build/cli/commands/contract/amend/meta.js +0 -13
- package/build/cli/commands/contract/arc/handler.js +0 -16
- package/build/cli/commands/contract/arc/meta.js +0 -28
- package/build/cli/commands/contract/audit/handler.js +0 -42
- package/build/cli/commands/contract/audit/meta.js +0 -17
- package/build/cli/commands/contract/bind/handler.js +0 -39
- package/build/cli/commands/contract/bind/meta.js +0 -96
- package/build/cli/commands/contract/catalog.js +0 -18
- package/build/cli/commands/contract/forfeit/handler.js +0 -17
- package/build/cli/commands/contract/forfeit/meta.js +0 -12
- package/build/cli/commands/contract/log/handler.js +0 -12
- package/build/cli/commands/contract/log/meta.js +0 -12
- package/build/cli/commands/contract/petition/handler.js +0 -64
- package/build/cli/commands/contract/petition/meta.js +0 -23
- package/build/cli/commands/contract/renew/handler.js +0 -65
- package/build/cli/commands/contract/renew/meta.js +0 -19
- package/build/cli/commands/metadata.js +0 -68
- package/build/cli/commands/projection/call/handler.js +0 -43
- package/build/cli/commands/projection/call/meta.js +0 -12
- package/build/cli/commands/projection/catalog.js +0 -16
- package/build/cli/commands/projection/fork/handler.js +0 -61
- package/build/cli/commands/projection/fork/meta.js +0 -12
- package/build/cli/commands/projection/history/handler.js +0 -65
- package/build/cli/commands/projection/history/meta.js +0 -9
- package/build/cli/commands/projection/kill/handler.js +0 -20
- package/build/cli/commands/projection/kill/meta.js +0 -11
- package/build/cli/commands/projection/shared.js +0 -27
- package/build/cli/commands/projection/status/handler.js +0 -42
- package/build/cli/commands/projection/status/meta.js +0 -20
- package/build/cli/commands/projection/tell/handler.js +0 -32
- package/build/cli/commands/projection/tell/meta.js +0 -12
- package/build/cli/commands/projection/wait/handler.js +0 -80
- package/build/cli/commands/projection/wait/meta.js +0 -16
- package/build/cli/commands/registry.js +0 -48
- package/build/cli/commands/shared.js +0 -74
- package/build/cli/commands/skills/catalog.js +0 -6
- package/build/cli/commands/skills/install/handler.js +0 -7
- package/build/cli/commands/skills/install/meta.js +0 -9
- package/build/cli/commands/skills/skills/handler.js +0 -4
- package/build/cli/commands/skills/skills/meta.js +0 -10
- package/build/cli/commands/system/catalog.js +0 -10
- package/build/cli/commands/system/completion/handler.js +0 -10
- package/build/cli/commands/system/completion/meta.js +0 -9
- package/build/cli/commands/system/dump-env/handler.js +0 -3
- package/build/cli/commands/system/dump-env/meta.js +0 -10
- package/build/cli/commands/system/guide/handler.js +0 -4
- package/build/cli/commands/system/guide/meta.js +0 -9
- package/build/cli/commands/task/add/handler.js +0 -38
- package/build/cli/commands/task/add/meta.js +0 -31
- package/build/cli/commands/task/catalog.js +0 -32
- package/build/cli/commands/task/compose/handler.js +0 -18
- package/build/cli/commands/task/compose/meta.js +0 -10
- package/build/cli/commands/task/doctor/handler.js +0 -3
- package/build/cli/commands/task/doctor/meta.js +0 -8
- package/build/cli/commands/task/done/handler.js +0 -10
- package/build/cli/commands/task/done/meta.js +0 -8
- package/build/cli/commands/task/drop/handler.js +0 -8
- package/build/cli/commands/task/drop/meta.js +0 -11
- package/build/cli/commands/task/hold/handler.js +0 -3
- package/build/cli/commands/task/hold/meta.js +0 -8
- package/build/cli/commands/task/log/handler.js +0 -12
- package/build/cli/commands/task/log/meta.js +0 -8
- package/build/cli/commands/task/ls/handler.js +0 -17
- package/build/cli/commands/task/ls/meta.js +0 -8
- package/build/cli/commands/task/note/handler.js +0 -6
- package/build/cli/commands/task/note/meta.js +0 -11
- package/build/cli/commands/task/resume/handler.js +0 -3
- package/build/cli/commands/task/resume/meta.js +0 -8
- package/build/cli/commands/task/shared.js +0 -181
- package/build/cli/commands/task/show/handler.js +0 -13
- package/build/cli/commands/task/show/meta.js +0 -8
- package/build/cli/commands/task/start/handler.js +0 -3
- package/build/cli/commands/task/start/meta.js +0 -8
- package/build/cli/commands/task/stop/handler.js +0 -10
- package/build/cli/commands/task/stop/meta.js +0 -8
- package/build/cli/commands/task/task/handler.js +0 -5
- package/build/cli/commands/task/task/meta.js +0 -11
- package/build/cli/commands/task/update/handler.js +0 -21
- package/build/cli/commands/task/update/meta.js +0 -12
- package/build/cli/commands/verification/handler.js +0 -43
- package/build/cli/commands/verification/meta.js +0 -13
- package/build/cli/completion.js +0 -91
- package/build/cli/draft-artifact.js +0 -50
- package/build/cli/flags.js +0 -321
- package/build/cli/help.js +0 -99
- package/build/cli/index.js +0 -333
- package/build/cli/missing-subcommand.js +0 -7
- package/build/cli/output-stream-error-policy.js +0 -31
- package/build/cli/parse-flags.js +0 -301
- package/build/cli/parse-metadata.js +0 -132
- package/build/cli/parse-selectors.js +0 -83
- package/build/cli/parse.js +0 -250
- package/build/cli/projection-address.js +0 -105
- package/build/cli/render/address.js +0 -101
- package/build/cli/render/amendment-warning.js +0 -8
- package/build/cli/render/arc.js +0 -88
- package/build/cli/render/audit.js +0 -440
- package/build/cli/render/call.js +0 -70
- package/build/cli/render/compact-text.js +0 -3
- package/build/cli/render/errors.js +0 -101
- package/build/cli/render/format.js +0 -226
- package/build/cli/render/kanshi.js +0 -300
- package/build/cli/render/kill.js +0 -9
- package/build/cli/render/lifecycle.js +0 -56
- package/build/cli/render/line-width.js +0 -103
- package/build/cli/render/misc.js +0 -84
- package/build/cli/render/path-prefix-compaction.js +0 -131
- package/build/cli/render/petition.js +0 -85
- package/build/cli/render/projection-activity.js +0 -332
- package/build/cli/render/projection-history.js +0 -77
- package/build/cli/render/response-style.js +0 -27
- package/build/cli/render/shared.js +0 -232
- package/build/cli/render/skills.js +0 -10
- package/build/cli/render/status-indicator.js +0 -47
- package/build/cli/render/status.js +0 -243
- package/build/cli/render/success-response.js +0 -95
- package/build/cli/render/task.js +0 -175
- package/build/cli/render/tell.js +0 -11
- package/build/cli/render/terminal-failure.js +0 -65
- package/build/cli/render/tool-command-normalization.js +0 -137
- package/build/cli/render/tool-ledger-rollup.js +0 -74
- package/build/cli/render/tool-presentation.js +0 -98
- package/build/cli/render/types.js +0 -2
- package/build/cli/render/verification.js +0 -23
- package/build/cli/render/wait.js +0 -343
- package/build/cli/skills-install.js +0 -348
- package/build/cli/subagent-guard.js +0 -25
- package/build/cli/types.js +0 -2
- package/build/config/akuma-loader.js +0 -240
- package/build/config/env-keys.js +0 -57
- package/build/config/env.js +0 -304
- package/build/config/provider-policy-ownership.js +0 -10
- package/build/config/settings/disease.js +0 -33
- package/build/config/settings/knobs.js +0 -14
- package/build/config/settings/loader.js +0 -275
- package/build/config/settings/provider-instance-fields.js +0 -51
- package/build/config/settings/schema.js +0 -113
- package/build/core/address-carrier.js +0 -89
- package/build/core/addressing.js +0 -407
- package/build/core/amend.js +0 -321
- package/build/core/amendment-criteria.js +0 -17
- package/build/core/amendment-warning.js +0 -10
- package/build/core/arc.js +0 -293
- package/build/core/atomic-publish.js +0 -64
- package/build/core/audit/candidate.js +0 -141
- package/build/core/audit/coordinates.js +0 -230
- package/build/core/audit/evidence.js +0 -156
- package/build/core/audit/facade.js +0 -65
- package/build/core/audit/readiness.js +0 -4
- package/build/core/audit/report.js +0 -38
- package/build/core/audit.js +0 -1
- package/build/core/bind-reconciliation.js +0 -409
- package/build/core/bind-workspace.js +0 -115
- package/build/core/bind.js +0 -503
- package/build/core/call/call.js +0 -235
- package/build/core/call/context.js +0 -210
- package/build/core/call/execution.js +0 -255
- package/build/core/call/prompt.js +0 -27
- package/build/core/call/reference.js +0 -24
- package/build/core/call-persist.js +0 -76
- package/build/core/command-markdown.js +0 -45
- package/build/core/context.js +0 -104
- package/build/core/contract-carrier-runtime.js +0 -512
- package/build/core/contract-carrier.js +0 -353
- package/build/core/contract-view.js +0 -319
- package/build/core/contract.js +0 -19
- package/build/core/derived-replay.js +0 -340
- package/build/core/draft.js +0 -400
- package/build/core/execution-coordinate.js +0 -46
- package/build/core/execution-pact.js +0 -126
- package/build/core/forfeit.js +0 -132
- package/build/core/hints.js +0 -34
- package/build/core/identifier-slug.js +0 -116
- package/build/core/ids.js +0 -90
- package/build/core/lifecycle-history.js +0 -48
- package/build/core/lifecycle-recovery.js +0 -122
- package/build/core/lifecycle-runner.js +0 -377
- package/build/core/log.js +0 -50
- package/build/core/markdown/lex.js +0 -274
- package/build/core/markdown/parser.js +0 -260
- package/build/core/markdown/render.js +0 -68
- package/build/core/markdown/sections.js +0 -80
- package/build/core/markdown/titles.js +0 -9
- package/build/core/markdown/types.js +0 -6
- package/build/core/outcome-base.js +0 -185
- package/build/core/places.js +0 -175
- package/build/core/projection/akuma-name.js +0 -43
- package/build/core/projection/generation/database.js +0 -473
- package/build/core/projection/generation/identity.js +0 -84
- package/build/core/projection/generation/ledger.js +0 -91
- package/build/core/projection/generation/model.js +0 -261
- package/build/core/projection/generation/projection-generation-continuation.js +0 -84
- package/build/core/projection/generation/projection-generation-doorbell.js +0 -88
- package/build/core/projection/generation/projection-generation-execution.js +0 -241
- package/build/core/projection/generation/projection-generation-identity.js +0 -21
- package/build/core/projection/generation/projection-generation-launcher.js +0 -154
- package/build/core/projection/generation/projection-generation-process.js +0 -47
- package/build/core/projection/generation/projection-generation-runner.js +0 -489
- package/build/core/projection/generation/projection-generation-runtime.js +0 -46
- package/build/core/projection/generation/protocol.js +0 -68
- package/build/core/projection/generation/store.js +0 -108
- package/build/core/projection/generation/transitions.js +0 -463
- package/build/core/projection/heart.js +0 -9
- package/build/core/projection/index.js +0 -28
- package/build/core/projection/projection-activity.js +0 -273
- package/build/core/projection/projection-alias.js +0 -131
- package/build/core/projection/projection-coordinate.js +0 -61
- package/build/core/projection/projection-core.js +0 -127
- package/build/core/projection/projection-execution-observer.js +0 -270
- package/build/core/projection/projection-history.js +0 -474
- package/build/core/projection/projection-identity.js +0 -11
- package/build/core/projection/projection-kill.js +0 -112
- package/build/core/projection/projection-life-observer.js +0 -101
- package/build/core/projection/projection-mint.js +0 -170
- package/build/core/projection/projection-status-observation.js +0 -434
- package/build/core/projection/projection-status.js +0 -442
- package/build/core/projection/projection-terminal-failure.js +0 -111
- package/build/core/projection/projection-wait.js +0 -337
- package/build/core/projection/projection-wake.js +0 -298
- package/build/core/projection/tell/launch-store.js +0 -244
- package/build/core/projection/tell/model.js +0 -98
- package/build/core/projection/tell/store.js +0 -245
- package/build/core/provider-loader-ports.js +0 -4
- package/build/core/registry.js +0 -100
- package/build/core/renew-build.js +0 -554
- package/build/core/renew-plan.js +0 -264
- package/build/core/renew-rewrite.js +0 -118
- package/build/core/renew.js +0 -345
- package/build/core/repository-ledger/accepted-fold-read.js +0 -22
- package/build/core/repository-ledger/accepted-tail.js +0 -116
- package/build/core/repository-ledger/admission.js +0 -38
- package/build/core/repository-ledger/authoritative-transaction.js +0 -1
- package/build/core/repository-ledger/claim-evidence.js +0 -147
- package/build/core/repository-ledger/codec.js +0 -303
- package/build/core/repository-ledger/current-state-store.js +0 -968
- package/build/core/repository-ledger/fold-repository.js +0 -374
- package/build/core/repository-ledger/fold.js +0 -248
- package/build/core/repository-ledger/git-object-store.js +0 -243
- package/build/core/repository-ledger/history-read.js +0 -15
- package/build/core/repository-ledger/identity.js +0 -60
- package/build/core/repository-ledger/incremental-read.js +0 -153
- package/build/core/repository-ledger/index.js +0 -15
- package/build/core/repository-ledger/inventory-plan.js +0 -75
- package/build/core/repository-ledger/inventory.js +0 -310
- package/build/core/repository-ledger/publication-admission.js +0 -125
- package/build/core/repository-ledger/publication.js +0 -353
- package/build/core/repository-ledger/read-model.js +0 -517
- package/build/core/repository-ledger/transaction-membership.js +0 -78
- package/build/core/repository-ledger/traversal.js +0 -404
- package/build/core/repository-ledger/write-transaction.js +0 -346
- package/build/core/response-artifact-catalog-sqlite.js +0 -112
- package/build/core/response-artifact-catalog.js +0 -7
- package/build/core/response-artifact-id.js +0 -5
- package/build/core/run-control/connection-bound-close.js +0 -41
- package/build/core/run-control/detached-lease-bootstrap.js +0 -208
- package/build/core/run-control/detached-process.js +0 -14
- package/build/core/run-control/index.js +0 -6
- package/build/core/run-control/process-tree.js +0 -139
- package/build/core/run-control/runner-lease.js +0 -172
- package/build/core/run-control/sqlite-process-lifetime-lock.js +0 -174
- package/build/core/scope.js +0 -416
- package/build/core/seal.js +0 -364
- package/build/core/settlement/claim-delivery.js +0 -82
- package/build/core/settlement/claim.js +0 -258
- package/build/core/settlement/index.js +0 -19
- package/build/core/settlement/petition-claim-gates.js +0 -247
- package/build/core/settlement/petition-forfeit.js +0 -46
- package/build/core/settlement/petition-head-guard.js +0 -12
- package/build/core/settlement/petition-io.js +0 -1
- package/build/core/settlement/petition-preview.js +0 -125
- package/build/core/settlement/petition-window.js +0 -50
- package/build/core/settlement/petition.js +0 -315
- package/build/core/settlement/queue-read-model.js +0 -120
- package/build/core/settlement/queue-seat-allocation.js +0 -65
- package/build/core/settlement/queue.js +0 -6
- package/build/core/settlement/settlement.js +0 -385
- package/build/core/settlement/verdict.js +0 -126
- package/build/core/settlement/verification.js +0 -554
- package/build/core/status/board.js +0 -455
- package/build/core/status/drift.js +0 -113
- package/build/core/status/lifecycle.js +0 -11
- package/build/core/stored-agent-event.js +0 -129
- package/build/core/structured-query.js +0 -23
- package/build/core/target-ref.js +0 -10
- package/build/core/task/board.js +0 -248
- package/build/core/task/commands.js +0 -401
- package/build/core/task/compose.js +0 -328
- package/build/core/task/coordinate.js +0 -56
- package/build/core/task/document.js +0 -273
- package/build/core/task/index.js +0 -16
- package/build/core/task/model.js +0 -8
- package/build/core/task/query.js +0 -204
- package/build/core/task/settlement-git.js +0 -423
- package/build/core/task/settlement-policy.js +0 -137
- package/build/core/task/source-board.js +0 -104
- package/build/core/task/source-model.js +0 -1
- package/build/core/task/task-bind-preparation.js +0 -243
- package/build/core/task/task-contract.js +0 -371
- package/build/core/task/task-doctor.js +0 -14
- package/build/core/task/task-file-transaction.js +0 -171
- package/build/core/task/task-git-actor.js +0 -33
- package/build/core/task/task-git-runtime.js +0 -97
- package/build/core/task/task-git-store.js +0 -400
- package/build/core/task/task-repository.js +0 -1
- package/build/core/task/task-store-repository.js +0 -97
- package/build/core/task/task-store.js +0 -1
- package/build/core/task/task-worktree.js +0 -25
- package/build/core/task/task.js +0 -7
- package/build/core/task/tree.js +0 -37
- package/build/core/task/validation.js +0 -48
- package/build/core/transcripts.js +0 -485
- package/build/core/validation.js +0 -17
- package/build/core/verification-declaration.js +0 -95
- package/build/core/worktree-bootstrap.js +0 -195
- package/build/core/worktree-path.js +0 -371
- package/build/errno.js +0 -3
- package/build/flow-error.js +0 -191
- package/build/fs/durability.js +0 -27
- package/build/fs/path-coordinate.js +0 -16
- package/build/generated/version.js +0 -3
- package/build/git/branches.js +0 -84
- package/build/git/commits.js +0 -151
- package/build/git/core.js +0 -86
- package/build/git/diff/parsers.js +0 -181
- package/build/git/diff/pathspec.js +0 -3
- package/build/git/diff/preview.js +0 -38
- package/build/git/diff/read.js +0 -105
- package/build/git/diff/structured.js +0 -127
- package/build/git/diff/types.js +0 -1
- package/build/git/path-coordinate.js +0 -17
- package/build/git/process.js +0 -229
- package/build/git/refs.js +0 -250
- package/build/git/staging.js +0 -79
- package/build/git/streaming-batch.js +0 -354
- package/build/git/worktree.js +0 -175
- package/build/index.js +0 -67
- package/build/keiyaku-constants.js +0 -2
- package/build/keiyaku.js +0 -30
- package/build/telemetry/debug-log.js +0 -40
- package/build/telemetry/logger.js +0 -48
- package/skills/keiyaku/SKILL.md +0 -46
- package/skills/keiyaku-akuma/SKILL.md +0 -97
- package/skills/keiyaku-task/SKILL.md +0 -118
- package/skills/keiyaku-workflow/SKILL.md +0 -191
- /package/build/{agents/launch-snapshot → src/body}/types.js +0 -0
- /package/build/{agents/providers/claude-agent-sdk/terms.js → src/cli/result.js} +0 -0
- /package/build/{agents/providers/codex-app-server/terms.js → src/core/decide.js} +0 -0
- /package/build/{agents/providers/opencode-sdk/terms.js → src/core/facts/offer.js} +0 -0
- /package/build/{agents/providers/pi/terms.js → src/kanshi/report.js} +0 -0
|
@@ -0,0 +1,310 @@
|
|
|
1
|
+
import { mkdirSync, readFileSync } from "node:fs";
|
|
2
|
+
import { dirname, join } from "node:path";
|
|
3
|
+
import { fileURLToPath } from "node:url";
|
|
4
|
+
import { replaceFileDurably } from "../coordination/durable-file.js";
|
|
5
|
+
import { acquireSqliteTransactionLock } from "../coordination/sqlite-transaction-lock.js";
|
|
6
|
+
import { runProcess, runProcessToExit } from "../runtime/proc/run.js";
|
|
7
|
+
import { SettingsError } from "../settings.js";
|
|
8
|
+
const MARKER_VERSION = 1;
|
|
9
|
+
function object(value) {
|
|
10
|
+
return value !== null && typeof value === "object" && !Array.isArray(value);
|
|
11
|
+
}
|
|
12
|
+
export function worktreeHooksFrom(input) {
|
|
13
|
+
if (!object(input))
|
|
14
|
+
throw new TypeError("worktreeHooksFrom input must be an object");
|
|
15
|
+
const view = input.settings.namespace("worktree");
|
|
16
|
+
if (view.kind === "failed") {
|
|
17
|
+
throw new SettingsError(view.failures.map((failure) => `${failure.scope}: ${failure.diagnostic}`).join("; "));
|
|
18
|
+
}
|
|
19
|
+
for (const entry of view.entries) {
|
|
20
|
+
if (entry.name !== "create" && entry.name !== "destroy")
|
|
21
|
+
throw new SettingsError(`worktree has unknown entry: ${entry.name}`);
|
|
22
|
+
}
|
|
23
|
+
const commands = (phase) => {
|
|
24
|
+
const selected = view.entries.find((entry) => entry.name === phase);
|
|
25
|
+
if (selected === undefined)
|
|
26
|
+
return Object.freeze([]);
|
|
27
|
+
if (!Array.isArray(selected.value))
|
|
28
|
+
throw new SettingsError(`worktree.${phase} must be an array`);
|
|
29
|
+
return Object.freeze(selected.value.map((item, index) => {
|
|
30
|
+
if (!object(item))
|
|
31
|
+
throw new SettingsError(`worktree.${phase}[${index}] must be an object`);
|
|
32
|
+
const coordinate = `worktree.${phase}[${index}]`;
|
|
33
|
+
exactKeys(item, ["argv", "timeoutMs"], coordinate);
|
|
34
|
+
if (!Array.isArray(item.argv) || item.argv.length === 0 || !item.argv.every((value) => typeof value === "string")) {
|
|
35
|
+
throw new SettingsError(`${coordinate}.argv must be a nonempty string array`);
|
|
36
|
+
}
|
|
37
|
+
if (item.argv[0].trim().length === 0)
|
|
38
|
+
throw new SettingsError(`${coordinate}.argv[0] must be nonblank`);
|
|
39
|
+
if (!Number.isSafeInteger(item.timeoutMs) || item.timeoutMs < 1 || item.timeoutMs > 2_147_483_647) {
|
|
40
|
+
throw new SettingsError(`${coordinate}.timeoutMs must be an integer from 1 through 2147483647`);
|
|
41
|
+
}
|
|
42
|
+
return Object.freeze({ argv: Object.freeze([...item.argv]), timeoutMs: item.timeoutMs });
|
|
43
|
+
}));
|
|
44
|
+
};
|
|
45
|
+
return Object.freeze({ create: commands("create"), destroy: commands("destroy") });
|
|
46
|
+
}
|
|
47
|
+
function exactKeys(value, keys, coordinate) {
|
|
48
|
+
const actual = Object.keys(value).sort();
|
|
49
|
+
const expected = [...keys].sort();
|
|
50
|
+
if (actual.length !== expected.length || actual.some((key, index) => key !== expected[index])) {
|
|
51
|
+
throw new Error(`${coordinate} has invalid fields`);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
function decodeCommand(value, coordinate) {
|
|
55
|
+
if (!object(value))
|
|
56
|
+
throw new Error(`${coordinate} must be an object`);
|
|
57
|
+
exactKeys(value, ["argv", "timeoutMs"], coordinate);
|
|
58
|
+
if (!Array.isArray(value.argv) || value.argv.length === 0 || !value.argv.every((item) => typeof item === "string")) {
|
|
59
|
+
throw new Error(`${coordinate}.argv must be a nonempty string array`);
|
|
60
|
+
}
|
|
61
|
+
if (value.argv[0].trim().length === 0)
|
|
62
|
+
throw new Error(`${coordinate}.argv[0] must be nonblank`);
|
|
63
|
+
if (!Number.isSafeInteger(value.timeoutMs) || value.timeoutMs < 1 || value.timeoutMs > 2_147_483_647) {
|
|
64
|
+
throw new Error(`${coordinate}.timeoutMs is invalid`);
|
|
65
|
+
}
|
|
66
|
+
return { argv: value.argv, timeoutMs: value.timeoutMs };
|
|
67
|
+
}
|
|
68
|
+
function decodeCommands(value, coordinate) {
|
|
69
|
+
if (!Array.isArray(value))
|
|
70
|
+
throw new Error(`${coordinate} must be an array`);
|
|
71
|
+
return value.map((item, index) => decodeCommand(item, `${coordinate}[${index}]`));
|
|
72
|
+
}
|
|
73
|
+
function decodeFailure(value, coordinate) {
|
|
74
|
+
if (!object(value) || typeof value.kind !== "string")
|
|
75
|
+
throw new Error(`${coordinate} is invalid`);
|
|
76
|
+
switch (value.kind) {
|
|
77
|
+
case "exit":
|
|
78
|
+
exactKeys(value, ["kind", "code", "stdout", "stderr", "truncated"], coordinate);
|
|
79
|
+
if (!Number.isInteger(value.code) || typeof value.stdout !== "string" || typeof value.stderr !== "string" || typeof value.truncated !== "boolean") {
|
|
80
|
+
throw new Error(`${coordinate} is invalid`);
|
|
81
|
+
}
|
|
82
|
+
return { kind: "exit", code: value.code, stdout: value.stdout, stderr: value.stderr, truncated: value.truncated };
|
|
83
|
+
case "timeout":
|
|
84
|
+
case "unknown-exit":
|
|
85
|
+
exactKeys(value, ["kind"], coordinate);
|
|
86
|
+
return { kind: value.kind };
|
|
87
|
+
case "spawn-error":
|
|
88
|
+
exactKeys(value, ["kind", "diagnostic"], coordinate);
|
|
89
|
+
if (typeof value.diagnostic !== "string")
|
|
90
|
+
throw new Error(`${coordinate}.diagnostic must be a string`);
|
|
91
|
+
return { kind: "spawn-error", diagnostic: value.diagnostic };
|
|
92
|
+
default:
|
|
93
|
+
throw new Error(`${coordinate}.kind is invalid`);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
function decodeProgress(value, commands, coordinate) {
|
|
97
|
+
if (!object(value) || typeof value.status !== "string")
|
|
98
|
+
throw new Error(`${coordinate} is invalid`);
|
|
99
|
+
if (value.status === "ok") {
|
|
100
|
+
exactKeys(value, ["status"], coordinate);
|
|
101
|
+
return { status: "ok" };
|
|
102
|
+
}
|
|
103
|
+
if (value.status === "pending") {
|
|
104
|
+
exactKeys(value, ["status", "next"], coordinate);
|
|
105
|
+
if (!Number.isInteger(value.next) || value.next < 0 || value.next > commands) {
|
|
106
|
+
throw new Error(`${coordinate}.next is invalid`);
|
|
107
|
+
}
|
|
108
|
+
return { status: "pending", next: value.next };
|
|
109
|
+
}
|
|
110
|
+
if (value.status === "failed") {
|
|
111
|
+
exactKeys(value, ["status", "command", "failure"], coordinate);
|
|
112
|
+
if (!Number.isInteger(value.command) || value.command < 0 || value.command >= commands) {
|
|
113
|
+
throw new Error(`${coordinate}.command is invalid`);
|
|
114
|
+
}
|
|
115
|
+
return { status: "failed", command: value.command, failure: decodeFailure(value.failure, `${coordinate}.failure`) };
|
|
116
|
+
}
|
|
117
|
+
throw new Error(`${coordinate}.status is invalid`);
|
|
118
|
+
}
|
|
119
|
+
function decodeMarker(bytes) {
|
|
120
|
+
const value = JSON.parse(bytes);
|
|
121
|
+
if (!object(value))
|
|
122
|
+
throw new Error("worktree hook marker must be an object");
|
|
123
|
+
exactKeys(value, ["version", "commands", "create", "destroy"], "worktree hook marker");
|
|
124
|
+
if (value.version !== MARKER_VERSION)
|
|
125
|
+
throw new Error(`worktree hook marker version must be ${MARKER_VERSION}`);
|
|
126
|
+
if (!object(value.commands))
|
|
127
|
+
throw new Error("worktree hook marker commands must be an object");
|
|
128
|
+
exactKeys(value.commands, ["create", "destroy"], "worktree hook marker commands");
|
|
129
|
+
const commands = {
|
|
130
|
+
create: decodeCommands(value.commands.create, "worktree hook marker commands.create"),
|
|
131
|
+
destroy: decodeCommands(value.commands.destroy, "worktree hook marker commands.destroy"),
|
|
132
|
+
};
|
|
133
|
+
return {
|
|
134
|
+
version: MARKER_VERSION,
|
|
135
|
+
commands,
|
|
136
|
+
create: decodeProgress(value.create, commands.create.length, "worktree hook marker create"),
|
|
137
|
+
destroy: decodeProgress(value.destroy, commands.destroy.length, "worktree hook marker destroy"),
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
export function hookMarkerPath(administrationDirectory) {
|
|
141
|
+
return join(administrationDirectory, "keiyaku", "hooks.json");
|
|
142
|
+
}
|
|
143
|
+
function readMarker(administrationDirectory) {
|
|
144
|
+
try {
|
|
145
|
+
return decodeMarker(readFileSync(hookMarkerPath(administrationDirectory), "utf8"));
|
|
146
|
+
}
|
|
147
|
+
catch (error) {
|
|
148
|
+
if (error.code === "ENOENT")
|
|
149
|
+
return null;
|
|
150
|
+
throw error;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
function writeMarker(administrationDirectory, marker) {
|
|
154
|
+
const path = hookMarkerPath(administrationDirectory);
|
|
155
|
+
mkdirSync(dirname(path), { recursive: true });
|
|
156
|
+
replaceFileDurably(path, `${JSON.stringify(marker)}\n`);
|
|
157
|
+
}
|
|
158
|
+
function freshMarker(commands, createPending) {
|
|
159
|
+
return {
|
|
160
|
+
version: MARKER_VERSION,
|
|
161
|
+
commands,
|
|
162
|
+
create: createPending ? { status: "pending", next: 0 } : { status: "ok" },
|
|
163
|
+
destroy: { status: "pending", next: 0 },
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
function failedOutcome(outcome) {
|
|
167
|
+
if (outcome.kind === "terminal") {
|
|
168
|
+
return outcome.code === 0 ? null : {
|
|
169
|
+
kind: "exit",
|
|
170
|
+
code: outcome.code,
|
|
171
|
+
stdout: outcome.stdout,
|
|
172
|
+
stderr: outcome.stderr,
|
|
173
|
+
truncated: outcome.truncated,
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
return outcome;
|
|
177
|
+
}
|
|
178
|
+
/** Execute an ordered command list without lifecycle state. Scratch owns this policy. */
|
|
179
|
+
export async function runHookCommands(worktree, commands, signal) {
|
|
180
|
+
for (const [command, value] of commands.entries()) {
|
|
181
|
+
const outcome = await runProcess({
|
|
182
|
+
argv: value.argv,
|
|
183
|
+
timeoutMs: value.timeoutMs,
|
|
184
|
+
cwd: worktree,
|
|
185
|
+
...(signal === undefined ? {} : { signal }),
|
|
186
|
+
});
|
|
187
|
+
if (outcome.kind === "cancelled")
|
|
188
|
+
return outcome;
|
|
189
|
+
const failure = failedOutcome(outcome);
|
|
190
|
+
if (failure !== null)
|
|
191
|
+
return { kind: "failed", command, failure };
|
|
192
|
+
}
|
|
193
|
+
return { kind: "ok" };
|
|
194
|
+
}
|
|
195
|
+
function withProgress(marker, phase, progress) {
|
|
196
|
+
return { ...marker, [phase]: progress };
|
|
197
|
+
}
|
|
198
|
+
function hookExecutionLockPath(administrationDirectory) {
|
|
199
|
+
return join(administrationDirectory, "keiyaku", "hook-execution.sqlite");
|
|
200
|
+
}
|
|
201
|
+
function decodeRunnerInput(encoded) {
|
|
202
|
+
const value = JSON.parse(Buffer.from(encoded, "base64url").toString("utf8"));
|
|
203
|
+
if (!object(value))
|
|
204
|
+
throw new Error("Hook runner input must be an object");
|
|
205
|
+
exactKeys(value, ["administrationDirectory", "worktree", "phase", "command"], "Hook runner input");
|
|
206
|
+
if (typeof value.administrationDirectory !== "string" || value.administrationDirectory.length === 0) {
|
|
207
|
+
throw new Error("Hook runner administrationDirectory must be nonempty");
|
|
208
|
+
}
|
|
209
|
+
if (typeof value.worktree !== "string" || value.worktree.length === 0) {
|
|
210
|
+
throw new Error("Hook runner worktree must be nonempty");
|
|
211
|
+
}
|
|
212
|
+
if (value.phase !== "create" && value.phase !== "destroy")
|
|
213
|
+
throw new Error("Hook runner phase is invalid");
|
|
214
|
+
if (!Number.isSafeInteger(value.command) || value.command < 0) {
|
|
215
|
+
throw new Error("Hook runner command must be a nonnegative safe integer");
|
|
216
|
+
}
|
|
217
|
+
return {
|
|
218
|
+
administrationDirectory: value.administrationDirectory,
|
|
219
|
+
worktree: value.worktree,
|
|
220
|
+
phase: value.phase,
|
|
221
|
+
command: value.command,
|
|
222
|
+
};
|
|
223
|
+
}
|
|
224
|
+
async function executePendingCommand(input) {
|
|
225
|
+
const held = await acquireSqliteTransactionLock({
|
|
226
|
+
path: hookExecutionLockPath(input.administrationDirectory),
|
|
227
|
+
mode: "immediate",
|
|
228
|
+
});
|
|
229
|
+
try {
|
|
230
|
+
const marker = readMarker(input.administrationDirectory);
|
|
231
|
+
if (marker === null)
|
|
232
|
+
throw new Error("worktree hook marker disappeared before execution");
|
|
233
|
+
const progress = marker[input.phase];
|
|
234
|
+
if (progress.status !== "pending" || progress.next !== input.command)
|
|
235
|
+
return;
|
|
236
|
+
const command = marker.commands[input.phase][input.command];
|
|
237
|
+
if (command === undefined)
|
|
238
|
+
throw new Error("worktree hook marker pending index is out of range");
|
|
239
|
+
const result = await runHookCommands(input.worktree, [command]);
|
|
240
|
+
if (result.kind === "cancelled")
|
|
241
|
+
throw new Error("managed hook runner cancelled without a signal");
|
|
242
|
+
const failure = result.kind === "failed" ? result.failure : null;
|
|
243
|
+
const next = input.command + 1;
|
|
244
|
+
writeMarker(input.administrationDirectory, withProgress(marker, input.phase, failure === null
|
|
245
|
+
? next === marker.commands[input.phase].length ? { status: "ok" } : { status: "pending", next }
|
|
246
|
+
: { status: "failed", command: input.command, failure }));
|
|
247
|
+
}
|
|
248
|
+
finally {
|
|
249
|
+
held.close();
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
function runnerFailure(outcome) {
|
|
253
|
+
if (outcome.kind === "terminal") {
|
|
254
|
+
const detail = outcome.stderr.trim() || outcome.stdout.trim();
|
|
255
|
+
return new Error(detail.length === 0 ? `Hook runner exited ${outcome.code}` : `Hook runner exited ${outcome.code}: ${detail}`);
|
|
256
|
+
}
|
|
257
|
+
if (outcome.kind === "spawn-error")
|
|
258
|
+
return new Error(`Hook runner failed to spawn: ${outcome.diagnostic}`);
|
|
259
|
+
return new Error(`Hook runner ended with ${outcome.kind}`);
|
|
260
|
+
}
|
|
261
|
+
async function runPendingCommand(input) {
|
|
262
|
+
const encoded = Buffer.from(JSON.stringify(input), "utf8").toString("base64url");
|
|
263
|
+
const outcome = await runProcessToExit({
|
|
264
|
+
argv: [process.execPath, ...process.execArgv, fileURLToPath(import.meta.url), "--run-hook", encoded],
|
|
265
|
+
cwd: dirname(fileURLToPath(import.meta.url)),
|
|
266
|
+
});
|
|
267
|
+
if (outcome.kind !== "terminal" || outcome.code !== 0)
|
|
268
|
+
throw runnerFailure(outcome);
|
|
269
|
+
}
|
|
270
|
+
async function runPhase(worktree, administrationDirectory, hooks, phase, retryHooks) {
|
|
271
|
+
let marker = readMarker(administrationDirectory);
|
|
272
|
+
if (marker === null) {
|
|
273
|
+
marker = freshMarker(hooks, phase === "create");
|
|
274
|
+
writeMarker(administrationDirectory, marker);
|
|
275
|
+
}
|
|
276
|
+
let retryFailure = retryHooks && marker[phase].status === "failed";
|
|
277
|
+
for (;;) {
|
|
278
|
+
marker = readMarker(administrationDirectory);
|
|
279
|
+
if (marker === null)
|
|
280
|
+
throw new Error("worktree hook marker disappeared during execution");
|
|
281
|
+
const progress = marker[phase];
|
|
282
|
+
if (progress.status === "ok")
|
|
283
|
+
return null;
|
|
284
|
+
if (progress.status === "failed") {
|
|
285
|
+
if (!retryFailure) {
|
|
286
|
+
return { kind: "worktree-hook-failed", phase, path: worktree, command: progress.command, failure: progress.failure };
|
|
287
|
+
}
|
|
288
|
+
retryFailure = false;
|
|
289
|
+
writeMarker(administrationDirectory, withProgress(marker, phase, { status: "pending", next: progress.command }));
|
|
290
|
+
continue;
|
|
291
|
+
}
|
|
292
|
+
if (progress.next === marker.commands[phase].length) {
|
|
293
|
+
writeMarker(administrationDirectory, withProgress(marker, phase, { status: "ok" }));
|
|
294
|
+
continue;
|
|
295
|
+
}
|
|
296
|
+
await runPendingCommand({ administrationDirectory, worktree, phase, command: progress.next });
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
export function runCreateHooks(worktree, administrationDirectory, hooks, retryHooks) {
|
|
300
|
+
return runPhase(worktree, administrationDirectory, hooks, "create", retryHooks);
|
|
301
|
+
}
|
|
302
|
+
export function runDestroyHooks(worktree, administrationDirectory, hooks, retryHooks) {
|
|
303
|
+
return runPhase(worktree, administrationDirectory, hooks, "destroy", retryHooks);
|
|
304
|
+
}
|
|
305
|
+
if (process.argv[1] !== undefined && fileURLToPath(import.meta.url) === process.argv[1] && process.argv[2] === "--run-hook") {
|
|
306
|
+
const encoded = process.argv[3];
|
|
307
|
+
if (encoded === undefined)
|
|
308
|
+
throw new Error("Hook runner input is missing");
|
|
309
|
+
await executePendingCommand(decodeRunnerInput(encoded));
|
|
310
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { type ChangeId, type ContractHead, type ContractId, type SnapshotId } from "../core/facts/types.js";
|
|
2
|
+
declare const gitObjectIdBrand: unique symbol;
|
|
3
|
+
export type GitObjectId = string & {
|
|
4
|
+
readonly [gitObjectIdBrand]: "GitObjectId";
|
|
5
|
+
};
|
|
6
|
+
export declare function contractLocator(contract: ContractId): string;
|
|
7
|
+
export declare function gitRefLocator(ref: string): string;
|
|
8
|
+
export declare function contractPhysicalName(contract: ContractId): string;
|
|
9
|
+
export type ContractJournalClass = "active" | "terminal";
|
|
10
|
+
export declare function contractJournalPath(contract: ContractId, journalClass?: ContractJournalClass): string;
|
|
11
|
+
export declare function contractJournalPaths(contract: ContractId): readonly string[];
|
|
12
|
+
export declare function gitObjectId(value: string, label?: string): GitObjectId;
|
|
13
|
+
export declare function mintSnapshotId(value: string): SnapshotId;
|
|
14
|
+
export declare function mintChangeId(value: string): ChangeId;
|
|
15
|
+
export declare function mintContractHead(value: string): ContractHead;
|
|
16
|
+
export declare function gitObjectIdForSnapshot(value: SnapshotId): GitObjectId;
|
|
17
|
+
export {};
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { changeId, contractHead, contractId, snapshotId, } from "../core/facts/types.js";
|
|
3
|
+
const GIT_OBJECT_ID = /^(?:[0-9a-f]{40}|[0-9a-f]{64})$/;
|
|
4
|
+
function locator(value) {
|
|
5
|
+
return createHash("sha256").update(value, "utf8").digest("hex");
|
|
6
|
+
}
|
|
7
|
+
export function contractLocator(contract) {
|
|
8
|
+
return locator(contractId(contract));
|
|
9
|
+
}
|
|
10
|
+
export function gitRefLocator(ref) {
|
|
11
|
+
if (ref.length === 0)
|
|
12
|
+
throw new Error("Git ref locator input must be nonempty");
|
|
13
|
+
return locator(ref);
|
|
14
|
+
}
|
|
15
|
+
export function contractPhysicalName(contract) {
|
|
16
|
+
return contractId(contract).replace("/", "-");
|
|
17
|
+
}
|
|
18
|
+
function contractJournalSuffix(contract) {
|
|
19
|
+
const digest = contractLocator(contract);
|
|
20
|
+
return `${digest.slice(0, 2)}/${digest.slice(2, 4)}/${digest.slice(4)}.jsonl`;
|
|
21
|
+
}
|
|
22
|
+
export function contractJournalPath(contract, journalClass = "active") {
|
|
23
|
+
return `contracts/${journalClass}/${contractJournalSuffix(contract)}`;
|
|
24
|
+
}
|
|
25
|
+
export function contractJournalPaths(contract) {
|
|
26
|
+
return [
|
|
27
|
+
contractJournalPath(contract, "active"),
|
|
28
|
+
contractJournalPath(contract, "terminal"),
|
|
29
|
+
];
|
|
30
|
+
}
|
|
31
|
+
export function gitObjectId(value, label = "Git object ID") {
|
|
32
|
+
if (!GIT_OBJECT_ID.test(value))
|
|
33
|
+
throw new Error(`${label} is not a Git object ID: ${value}`);
|
|
34
|
+
return value;
|
|
35
|
+
}
|
|
36
|
+
export function mintSnapshotId(value) {
|
|
37
|
+
return snapshotId(gitObjectId(value, "snapshot"));
|
|
38
|
+
}
|
|
39
|
+
export function mintChangeId(value) {
|
|
40
|
+
return changeId(gitObjectId(value, "change"));
|
|
41
|
+
}
|
|
42
|
+
export function mintContractHead(value) {
|
|
43
|
+
return contractHead(gitObjectId(value, "contract head"));
|
|
44
|
+
}
|
|
45
|
+
export function gitObjectIdForSnapshot(value) {
|
|
46
|
+
return gitObjectId(value, "snapshot");
|
|
47
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import type { Preparation } from "../core/decide.js";
|
|
2
|
+
import type { ChangeId, ContractCoordinates, ContractId, SnapshotId } from "../core/facts/types.js";
|
|
3
|
+
import { type GitObjectId } from "./identity.js";
|
|
4
|
+
import { type GitRepository } from "./repository.js";
|
|
5
|
+
import type { TenderCapture } from "./tender.js";
|
|
6
|
+
import type { WorkspaceDirtyDelta } from "./tender.js";
|
|
7
|
+
declare const REQUIRED_GIT: "2.38";
|
|
8
|
+
export type IntegrationPreparationRefusal = Readonly<{
|
|
9
|
+
kind: "integration-failed";
|
|
10
|
+
contractId: ContractId;
|
|
11
|
+
reason: "not-based-on-target" | "unrelated-histories" | "conflict";
|
|
12
|
+
targetHead: SnapshotId;
|
|
13
|
+
conflictPaths?: readonly string[];
|
|
14
|
+
}> | Readonly<{
|
|
15
|
+
kind: "integration-unsupported";
|
|
16
|
+
contractId: ContractId;
|
|
17
|
+
requiredGit: typeof REQUIRED_GIT;
|
|
18
|
+
}>;
|
|
19
|
+
export type IntegrationCoordinates = Readonly<{
|
|
20
|
+
contractId: ContractId;
|
|
21
|
+
coordinates: ContractCoordinates;
|
|
22
|
+
}>;
|
|
23
|
+
export type IntegrationPlan = Readonly<{
|
|
24
|
+
predecessor: SnapshotId;
|
|
25
|
+
tree: GitObjectId;
|
|
26
|
+
changeId: ChangeId;
|
|
27
|
+
}>;
|
|
28
|
+
export type ReviewIntegration = Readonly<{
|
|
29
|
+
changeId: ChangeId;
|
|
30
|
+
workspace?: WorkspaceDirtyDelta;
|
|
31
|
+
}>;
|
|
32
|
+
/** Materialize the exact integration tree against its observed predecessor. */
|
|
33
|
+
export declare function materializeIntegrationSnapshot(repository: GitRepository, tree: GitObjectId, parent: SnapshotId, input: Readonly<{
|
|
34
|
+
contractId: ContractId;
|
|
35
|
+
title: string;
|
|
36
|
+
message?: string;
|
|
37
|
+
}>): SnapshotId;
|
|
38
|
+
export declare function planIntegration(repository: GitRepository, input: IntegrationCoordinates, tender: TenderCapture, requireBranchesToBeUpToDate: boolean): Preparation<IntegrationPlan, Readonly<{
|
|
39
|
+
kind: "target-missing";
|
|
40
|
+
contractId: ContractId;
|
|
41
|
+
}> | IntegrationPreparationRefusal>;
|
|
42
|
+
/** Prepare the integration-derived review subject from one captured tender. */
|
|
43
|
+
export declare function prepareReviewIntegration(repository: GitRepository, input: IntegrationCoordinates, tender: TenderCapture, workspace?: WorkspaceDirtyDelta): Preparation<ReviewIntegration, Readonly<{
|
|
44
|
+
kind: "target-missing";
|
|
45
|
+
contractId: ContractId;
|
|
46
|
+
}> | IntegrationPreparationRefusal>;
|
|
47
|
+
/** Read a recorded integration pair's patch, or null when Git no longer has it. */
|
|
48
|
+
export declare function readDeliveryDiff(repository: GitRepository, predecessor: SnapshotId, candidate: SnapshotId): string | null;
|
|
49
|
+
export {};
|
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
import { AuthorityCorruptionError } from "../core/facts/errors.js";
|
|
2
|
+
import { gitObjectId, gitObjectIdForSnapshot, mintChangeId, mintSnapshotId } from "./identity.js";
|
|
3
|
+
import { GitPlumbingError, readRef, runGit, runGitWithEnvironment, } from "./repository.js";
|
|
4
|
+
const REQUIRED_GIT = "2.38";
|
|
5
|
+
function runAllowingNonzero(repository, args, input) {
|
|
6
|
+
try {
|
|
7
|
+
return { stdout: runGit(repository, args, input), stderr: Buffer.alloc(0), status: 0 };
|
|
8
|
+
}
|
|
9
|
+
catch (error) {
|
|
10
|
+
if (!(error instanceof GitPlumbingError))
|
|
11
|
+
throw error;
|
|
12
|
+
return { stdout: error.stdout, stderr: error.stderr, status: error.status };
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
function stablePatchId(repository, predecessor, tree) {
|
|
16
|
+
const diff = runGit(repository, ["diff", "--binary", gitObjectIdForSnapshot(predecessor), tree]);
|
|
17
|
+
const output = runGit(repository, ["patch-id", "--stable"], diff).toString("utf8").trim();
|
|
18
|
+
const separator = output.indexOf(" ");
|
|
19
|
+
const identity = output.length === 0
|
|
20
|
+
? runGit(repository, ["hash-object", "-t", "blob", "--stdin"], diff).toString("utf8").trim()
|
|
21
|
+
: separator < 0 ? output : output.slice(0, separator);
|
|
22
|
+
return mintChangeId(identity);
|
|
23
|
+
}
|
|
24
|
+
/** Materialize the exact integration tree against its observed predecessor. */
|
|
25
|
+
export function materializeIntegrationSnapshot(repository, tree, parent, input) {
|
|
26
|
+
const commit = runGitWithEnvironment(repository, ["commit-tree", tree, "-p", gitObjectIdForSnapshot(parent)], `${input.message ?? `${input.contractId}: ${input.title}`}\n\nKeiyaku-Contract: ${input.contractId}\n`, {
|
|
27
|
+
GIT_AUTHOR_NAME: "Keiyaku",
|
|
28
|
+
GIT_AUTHOR_EMAIL: "keiyaku@localhost",
|
|
29
|
+
GIT_COMMITTER_NAME: "Keiyaku",
|
|
30
|
+
GIT_COMMITTER_EMAIL: "keiyaku@localhost",
|
|
31
|
+
GIT_AUTHOR_DATE: "Thu, 01 Jan 1970 00:00:00 +0000",
|
|
32
|
+
GIT_COMMITTER_DATE: "Thu, 01 Jan 1970 00:00:00 +0000",
|
|
33
|
+
}).toString("utf8").trim();
|
|
34
|
+
return mintSnapshotId(commit);
|
|
35
|
+
}
|
|
36
|
+
function isAncestor(repository, ancestor, descendant) {
|
|
37
|
+
const result = runAllowingNonzero(repository, [
|
|
38
|
+
"merge-base",
|
|
39
|
+
"--is-ancestor",
|
|
40
|
+
gitObjectIdForSnapshot(ancestor),
|
|
41
|
+
gitObjectIdForSnapshot(descendant),
|
|
42
|
+
]);
|
|
43
|
+
if (result.status === 0)
|
|
44
|
+
return true;
|
|
45
|
+
if (result.status === 1)
|
|
46
|
+
return false;
|
|
47
|
+
throw new GitPlumbingError({
|
|
48
|
+
stderr: result.stderr,
|
|
49
|
+
status: result.status,
|
|
50
|
+
message: "git merge-base --is-ancestor failed",
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
function commonAncestor(repository, left, right) {
|
|
54
|
+
const result = runAllowingNonzero(repository, [
|
|
55
|
+
"merge-base",
|
|
56
|
+
gitObjectIdForSnapshot(left),
|
|
57
|
+
gitObjectIdForSnapshot(right),
|
|
58
|
+
]);
|
|
59
|
+
if (result.status === 1)
|
|
60
|
+
return null;
|
|
61
|
+
if (result.status !== 0) {
|
|
62
|
+
throw new GitPlumbingError({
|
|
63
|
+
stderr: result.stderr,
|
|
64
|
+
status: result.status,
|
|
65
|
+
message: "git merge-base failed",
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
return mintSnapshotId(result.stdout.toString("utf8").trim());
|
|
69
|
+
}
|
|
70
|
+
function supportsMergeTree(repository) {
|
|
71
|
+
return runAllowingNonzero(repository, ["merge-tree", "--write-tree", "--stdin"], "").status === 0;
|
|
72
|
+
}
|
|
73
|
+
function nulFields(output) {
|
|
74
|
+
const fields = output.toString("utf8").split("\0");
|
|
75
|
+
if (fields.at(-1) !== "")
|
|
76
|
+
throw new Error("Git merge-tree output is not NUL terminated");
|
|
77
|
+
return fields.slice(0, -1);
|
|
78
|
+
}
|
|
79
|
+
function mergedTree(repository, contractId, base, targetHead, tenderTree) {
|
|
80
|
+
if (!supportsMergeTree(repository)) {
|
|
81
|
+
return { kind: "refused", refusal: { kind: "integration-unsupported", contractId, requiredGit: REQUIRED_GIT } };
|
|
82
|
+
}
|
|
83
|
+
const result = runAllowingNonzero(repository, [
|
|
84
|
+
"merge-tree",
|
|
85
|
+
"--write-tree",
|
|
86
|
+
"--no-messages",
|
|
87
|
+
"-z",
|
|
88
|
+
"--name-only",
|
|
89
|
+
"--merge-base",
|
|
90
|
+
gitObjectIdForSnapshot(base),
|
|
91
|
+
gitObjectIdForSnapshot(targetHead),
|
|
92
|
+
tenderTree,
|
|
93
|
+
]);
|
|
94
|
+
const fields = nulFields(result.stdout);
|
|
95
|
+
if (result.status === 0) {
|
|
96
|
+
if (fields.length !== 1)
|
|
97
|
+
throw new Error("successful Git merge-tree output has unexpected fields");
|
|
98
|
+
return { kind: "prepared", data: gitObjectId(fields[0], "integration tree") };
|
|
99
|
+
}
|
|
100
|
+
if (result.status === 1) {
|
|
101
|
+
if (fields.length < 2)
|
|
102
|
+
throw new Error("conflicted Git merge-tree output is missing paths");
|
|
103
|
+
return {
|
|
104
|
+
kind: "refused",
|
|
105
|
+
refusal: {
|
|
106
|
+
kind: "integration-failed",
|
|
107
|
+
contractId,
|
|
108
|
+
reason: "conflict",
|
|
109
|
+
targetHead,
|
|
110
|
+
conflictPaths: Object.freeze([...new Set(fields.slice(1))].sort()),
|
|
111
|
+
},
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
throw new GitPlumbingError({
|
|
115
|
+
stderr: result.stderr,
|
|
116
|
+
status: result.status,
|
|
117
|
+
message: "git merge-tree --write-tree failed",
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
export function planIntegration(repository, input, tender, requireBranchesToBeUpToDate) {
|
|
121
|
+
const target = input.coordinates.target;
|
|
122
|
+
if (target === undefined) {
|
|
123
|
+
return {
|
|
124
|
+
kind: "prepared",
|
|
125
|
+
data: {
|
|
126
|
+
predecessor: input.coordinates.start,
|
|
127
|
+
tree: tender.tree,
|
|
128
|
+
changeId: stablePatchId(repository, input.coordinates.start, tender.tree),
|
|
129
|
+
},
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
const observed = readRef(repository, target);
|
|
133
|
+
if (observed === null) {
|
|
134
|
+
return { kind: "refused", refusal: { kind: "target-missing", contractId: input.contractId } };
|
|
135
|
+
}
|
|
136
|
+
const targetHead = mintSnapshotId(observed);
|
|
137
|
+
let tree;
|
|
138
|
+
if (requireBranchesToBeUpToDate) {
|
|
139
|
+
if (!isAncestor(repository, targetHead, tender.head)) {
|
|
140
|
+
return {
|
|
141
|
+
kind: "refused",
|
|
142
|
+
refusal: {
|
|
143
|
+
kind: "integration-failed",
|
|
144
|
+
contractId: input.contractId,
|
|
145
|
+
reason: "not-based-on-target",
|
|
146
|
+
targetHead,
|
|
147
|
+
},
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
tree = tender.tree;
|
|
151
|
+
}
|
|
152
|
+
else {
|
|
153
|
+
const base = commonAncestor(repository, tender.head, targetHead);
|
|
154
|
+
if (base === null) {
|
|
155
|
+
return {
|
|
156
|
+
kind: "refused",
|
|
157
|
+
refusal: {
|
|
158
|
+
kind: "integration-failed",
|
|
159
|
+
contractId: input.contractId,
|
|
160
|
+
reason: "unrelated-histories",
|
|
161
|
+
targetHead,
|
|
162
|
+
},
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
const merged = mergedTree(repository, input.contractId, base, targetHead, tender.tree);
|
|
166
|
+
if (merged.kind === "refused")
|
|
167
|
+
return merged;
|
|
168
|
+
tree = merged.data;
|
|
169
|
+
}
|
|
170
|
+
return {
|
|
171
|
+
kind: "prepared",
|
|
172
|
+
data: {
|
|
173
|
+
predecessor: targetHead,
|
|
174
|
+
tree,
|
|
175
|
+
changeId: stablePatchId(repository, targetHead, tree),
|
|
176
|
+
},
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
/** Prepare the integration-derived review subject from one captured tender. */
|
|
180
|
+
export function prepareReviewIntegration(repository, input, tender, workspace) {
|
|
181
|
+
const integration = planIntegration(repository, input, tender, false);
|
|
182
|
+
return integration.kind === "refused"
|
|
183
|
+
? integration
|
|
184
|
+
: { kind: "prepared", data: { changeId: integration.data.changeId, ...(workspace === undefined ? {} : { workspace }) } };
|
|
185
|
+
}
|
|
186
|
+
function deliverySnapshotAvailability(repository, predecessor, candidate) {
|
|
187
|
+
const objects = [gitObjectIdForSnapshot(predecessor), gitObjectIdForSnapshot(candidate)];
|
|
188
|
+
const types = runGit(repository, ["cat-file", "--batch-check=%(objectname) %(objecttype)"], `${objects.join("\n")}\n`).toString("ascii").trimEnd().split("\n").map((record) => record.split(" ")[1]);
|
|
189
|
+
if (types.includes("missing"))
|
|
190
|
+
return "unavailable";
|
|
191
|
+
if (types.some((type) => type !== "commit")) {
|
|
192
|
+
throw new AuthorityCorruptionError("recorded delivery snapshot is not a Git commit");
|
|
193
|
+
}
|
|
194
|
+
return "available";
|
|
195
|
+
}
|
|
196
|
+
/** Read a recorded integration pair's patch, or null when Git no longer has it. */
|
|
197
|
+
export function readDeliveryDiff(repository, predecessor, candidate) {
|
|
198
|
+
if (deliverySnapshotAvailability(repository, predecessor, candidate) === "unavailable")
|
|
199
|
+
return null;
|
|
200
|
+
try {
|
|
201
|
+
return runGit(repository, [
|
|
202
|
+
"diff",
|
|
203
|
+
"--no-ext-diff",
|
|
204
|
+
"--no-color",
|
|
205
|
+
gitObjectIdForSnapshot(predecessor),
|
|
206
|
+
gitObjectIdForSnapshot(candidate),
|
|
207
|
+
]).toString("utf8");
|
|
208
|
+
}
|
|
209
|
+
catch (error) {
|
|
210
|
+
if (deliverySnapshotAvailability(repository, predecessor, candidate) === "unavailable")
|
|
211
|
+
return null;
|
|
212
|
+
throw error;
|
|
213
|
+
}
|
|
214
|
+
}
|