@astrosheep/keiyaku 4.0.0 → 4.0.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/README.md +133 -8
- package/build/integrations/marketplace/plugins/keiyaku/.claude-plugin/plugin.json +2 -2
- package/build/integrations/marketplace/plugins/keiyaku/.codex-plugin/plugin.json +4 -4
- package/build/integrations/marketplace/plugins/keiyaku/opencode.js +2 -2
- package/build/integrations/marketplace/plugins/keiyaku/package.json +2 -2
- package/build/integrations/marketplace/plugins/keiyaku/skills/keiyaku/SKILL.md +13 -5
- package/build/integrations/marketplace/plugins/keiyaku/skills/keiyaku-akuma/SKILL.md +91 -32
- package/build/integrations/marketplace/plugins/keiyaku/skills/keiyaku-bind/SKILL.md +134 -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 +41 -6
- package/build/integrations/marketplace/plugins/keiyaku/skills/keiyaku-workflow/SKILL.md +262 -46
- package/build/src/akuma/abort.d.ts +2 -0
- package/build/src/akuma/abort.js +50 -0
- package/build/src/akuma/akuma.d.ts +50 -33
- package/build/src/akuma/akuma.js +175 -127
- package/build/src/akuma/archetype.d.ts +14 -5
- package/build/src/akuma/archetype.js +85 -39
- package/build/src/akuma/body.d.ts +3 -5
- package/build/src/akuma/body.js +490 -183
- 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 +88 -45
- package/build/src/akuma/heart/facts.js +19 -8
- package/build/src/akuma/heart/index.d.ts +64 -55
- package/build/src/akuma/heart/index.js +172 -252
- package/build/src/akuma/heart/rows.d.ts +38 -83
- package/build/src/akuma/heart/rows.js +117 -155
- package/build/src/akuma/heart/schema.d.ts +1 -1
- package/build/src/akuma/heart/schema.js +61 -22
- package/build/src/akuma/heart/soul.d.ts +8 -0
- package/build/src/akuma/heart/soul.js +136 -0
- package/build/src/akuma/heart/storage.d.ts +47 -0
- package/build/src/akuma/heart/storage.js +224 -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 +2 -2
- package/build/src/akuma/identity.js +9 -9
- package/build/src/akuma/index.d.ts +10 -3
- package/build/src/akuma/index.js +7 -1
- package/build/src/akuma/projection.d.ts +176 -0
- package/build/src/akuma/projection.js +256 -0
- package/build/src/akuma/provider-recipe.d.ts +24 -0
- package/build/src/akuma/provider-recipe.js +100 -0
- package/build/src/akuma/provider.d.ts +67 -13
- package/build/src/akuma/provider.js +172 -105
- package/build/src/akuma/providers/acp/core.d.ts +19 -0
- package/build/src/akuma/providers/acp/core.js +159 -0
- package/build/src/akuma/providers/acp/events.d.ts +20 -0
- package/build/src/akuma/providers/acp/events.js +73 -0
- package/build/src/akuma/providers/acp/index.d.ts +12 -0
- package/build/src/akuma/providers/acp/index.js +94 -0
- package/build/src/akuma/providers/{claude.d.ts → claude/events.d.ts} +9 -41
- package/build/src/akuma/providers/claude/events.js +238 -0
- package/build/src/akuma/providers/claude/index.d.ts +47 -0
- package/build/src/akuma/providers/claude/index.js +279 -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 +1 -1
- package/build/src/akuma/providers/codex-app-server/events.js +15 -12
- package/build/src/akuma/providers/codex-app-server/index.d.ts +15 -13
- package/build/src/akuma/providers/codex-app-server/index.js +77 -33
- package/build/src/akuma/providers/grok-build/index.d.ts +4 -0
- package/build/src/akuma/providers/grok-build/index.js +70 -0
- package/build/src/akuma/providers/index.d.ts +5 -3
- package/build/src/akuma/providers/index.js +35 -56
- package/build/src/akuma/providers/opencode-sdk/events.d.ts +54 -0
- package/build/src/akuma/providers/opencode-sdk/events.js +235 -0
- package/build/src/akuma/providers/opencode-sdk/index.d.ts +33 -0
- package/build/src/akuma/providers/opencode-sdk/index.js +308 -0
- package/build/src/akuma/providers/opencode-sdk/session.d.ts +26 -0
- package/build/src/akuma/providers/opencode-sdk/session.js +63 -0
- package/build/src/akuma/providers/pi/events.d.ts +33 -0
- package/build/src/akuma/providers/pi/events.js +166 -0
- package/build/src/akuma/providers/pi/index.d.ts +11 -0
- package/build/src/akuma/providers/pi/index.js +191 -0
- package/build/src/akuma/publication.d.ts +3 -3
- package/build/src/akuma/publication.js +28 -40
- package/build/src/akuma/requests.d.ts +9 -6
- package/build/src/akuma/requests.js +95 -65
- package/build/src/alias/index.d.ts +4 -3
- package/build/src/alias/index.js +12 -13
- package/build/src/body/decode.js +7 -1
- package/build/src/body/region.d.ts +2 -0
- package/build/src/body/region.js +77 -7
- package/build/src/body/render.js +2 -1
- package/build/src/body/shape.js +7 -1
- package/build/src/body/verification.js +19 -4
- package/build/src/cli/accepted.d.ts +18 -12
- package/build/src/cli/accepted.js +73 -34
- package/build/src/cli/actor.js +3 -3
- package/build/src/cli/commands/akuma-invoke.d.ts +44 -19
- package/build/src/cli/commands/akuma-invoke.js +101 -52
- package/build/src/cli/commands/akuma.d.ts +27 -9
- package/build/src/cli/commands/akuma.js +151 -80
- package/build/src/cli/commands/contract.d.ts +155 -0
- package/build/src/cli/commands/contract.js +20 -0
- package/build/src/cli/commands/install.js +2 -0
- package/build/src/cli/commands/task-invoke.d.ts +19 -4
- package/build/src/cli/commands/task-invoke.js +65 -17
- package/build/src/cli/commands/task-query.d.ts +5 -0
- package/build/src/cli/commands/task-query.js +247 -0
- package/build/src/cli/commands/task.d.ts +3 -1
- package/build/src/cli/commands/task.js +52 -14
- package/build/src/cli/coordinates.d.ts +18 -0
- package/build/src/cli/coordinates.js +120 -0
- package/build/src/cli/draft.d.ts +8 -0
- package/build/src/cli/draft.js +96 -0
- package/build/src/cli/invoke.d.ts +9 -3
- package/build/src/cli/invoke.js +287 -108
- package/build/src/cli/main.js +54 -7
- package/build/src/cli/parse.d.ts +21 -117
- package/build/src/cli/parse.js +79 -84
- package/build/src/cli/render/akuma-tool-command.d.ts +6 -0
- package/build/src/cli/render/akuma-tool-command.js +144 -0
- package/build/src/cli/render/akuma-tool.d.ts +4 -2
- package/build/src/cli/render/akuma-tool.js +35 -5
- package/build/src/cli/render/akuma.d.ts +3 -1
- package/build/src/cli/render/akuma.js +247 -212
- package/build/src/cli/render/audit.d.ts +3 -0
- package/build/src/cli/render/audit.js +104 -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 +3 -3
- package/build/src/cli/render/contract.js +200 -54
- package/build/src/cli/render/kanshi.js +272 -129
- package/build/src/cli/render/receipt.d.ts +19 -0
- package/build/src/cli/render/receipt.js +106 -0
- package/build/src/cli/render/refusal.d.ts +16 -2
- package/build/src/cli/render/refusal.js +88 -3
- package/build/src/cli/render/region.d.ts +2 -0
- package/build/src/cli/render/region.js +17 -0
- package/build/src/cli/render/task.d.ts +2 -1
- package/build/src/cli/render/task.js +223 -60
- package/build/src/cli/render/terminal.d.ts +20 -0
- package/build/src/cli/render/terminal.js +121 -0
- package/build/src/cli/render/text.js +11 -3
- package/build/src/cli/result.d.ts +126 -19
- package/build/src/cli/usage.d.ts +1 -0
- package/build/src/cli/usage.js +3 -0
- package/build/src/contract-worktree.d.ts +44 -0
- package/build/src/contract-worktree.js +251 -0
- package/build/src/coordination/durable-file.d.ts +5 -1
- package/build/src/coordination/durable-file.js +57 -10
- package/build/src/coordination/sqlite-transaction-lock.d.ts +4 -0
- package/build/src/coordination/sqlite-transaction-lock.js +22 -5
- package/build/src/core/facts/codec.js +23 -4
- package/build/src/core/facts/eligibility.d.ts +1 -10
- package/build/src/core/facts/eligibility.js +0 -49
- package/build/src/core/facts/fold.js +1 -6
- package/build/src/core/facts/gate.d.ts +1 -0
- package/build/src/core/facts/gate.js +1 -0
- package/build/src/core/facts/observation.d.ts +3 -0
- package/build/src/core/facts/observation.js +12 -0
- package/build/src/core/facts/types.d.ts +10 -3
- package/build/src/core/subject.js +2 -2
- package/build/src/core/verbs/amend.d.ts +1 -1
- package/build/src/core/verbs/amend.js +3 -18
- package/build/src/core/verbs/bind.js +2 -16
- package/build/src/core/verbs/deliver.d.ts +1 -1
- package/build/src/core/verbs/deliver.js +14 -4
- package/build/src/core/verbs/placement.d.ts +1 -1
- package/build/src/core/verbs/placement.js +7 -9
- package/build/src/dispatch/index.d.ts +5 -3
- package/build/src/dispatch/index.js +30 -21
- package/build/src/duration.d.ts +10 -0
- package/build/src/duration.js +22 -0
- package/build/src/git/admission.d.ts +2 -2
- package/build/src/git/admission.js +33 -23
- package/build/src/git/hooks.d.ts +15 -0
- package/build/src/git/hooks.js +70 -18
- package/build/src/git/identity.d.ts +5 -1
- package/build/src/git/identity.js +23 -4
- package/build/src/git/integration.d.ts +48 -0
- package/build/src/git/integration.js +250 -0
- package/build/src/git/observe.d.ts +29 -15
- package/build/src/git/observe.js +185 -76
- 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 +17 -5
- package/build/src/git/reconcile.js +305 -109
- package/build/src/git/repository.d.ts +41 -18
- package/build/src/git/repository.js +220 -114
- package/build/src/git/scratch.d.ts +17 -0
- package/build/src/git/scratch.js +73 -0
- package/build/src/git/target-placement.d.ts +92 -0
- package/build/src/git/target-placement.js +375 -0
- package/build/src/git/tender.d.ts +49 -0
- package/build/src/git/tender.js +63 -0
- package/build/src/git/terminal-seal.d.ts +24 -0
- package/build/src/git/terminal-seal.js +89 -0
- package/build/src/git/tree.d.ts +2 -2
- package/build/src/git/tree.js +4 -0
- package/build/src/git/workspace.d.ts +53 -0
- package/build/src/git/workspace.js +139 -0
- package/build/src/identity/selector.d.ts +6 -0
- package/build/src/identity/selector.js +19 -0
- package/build/src/index.d.ts +4 -2
- package/build/src/index.js +2 -1
- package/build/src/kanshi/index.d.ts +2 -2
- package/build/src/kanshi/index.js +1 -1
- package/build/src/kanshi/read.d.ts +7 -3
- package/build/src/kanshi/read.js +245 -45
- package/build/src/kanshi/report.d.ts +81 -6
- package/build/src/kanshi/select.d.ts +5 -0
- package/build/src/kanshi/select.js +33 -1
- package/build/src/library/address.d.ts +57 -0
- package/build/src/library/address.js +165 -0
- package/build/src/library/akuma-creation.d.ts +16 -7
- package/build/src/library/akuma-creation.js +96 -22
- package/build/src/library/audit.d.ts +18 -0
- package/build/src/library/audit.js +44 -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 +69 -0
- package/build/src/library/configuration.d.ts +6 -15
- package/build/src/library/configuration.js +14 -17
- package/build/src/library/contract.d.ts +23 -49
- package/build/src/library/contract.js +171 -185
- package/build/src/library/delivery.d.ts +24 -0
- package/build/src/library/delivery.js +21 -0
- package/build/src/library/fleet.d.ts +65 -0
- package/build/src/library/fleet.js +153 -0
- package/build/src/library/input.d.ts +3 -0
- package/build/src/library/input.js +19 -0
- package/build/src/library/keiyaku.d.ts +18 -3
- package/build/src/library/keiyaku.js +12 -1
- package/build/src/library/mutation.d.ts +39 -0
- package/build/src/library/mutation.js +37 -0
- package/build/src/library/reconcile.d.ts +29 -0
- package/build/src/library/reconcile.js +179 -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 +14 -1
- package/build/src/library/region.js +18 -4
- package/build/src/library/repo.d.ts +4 -13
- package/build/src/library/repo.js +14 -24
- package/build/src/protocol/attempt.d.ts +16 -3
- package/build/src/protocol/attempt.js +41 -10
- package/build/src/protocol/bind.d.ts +9 -2
- package/build/src/protocol/bind.js +48 -40
- package/build/src/protocol/intent.d.ts +57 -20
- package/build/src/protocol/intent.js +55 -79
- package/build/src/protocol/operations.d.ts +152 -43
- package/build/src/protocol/operations.js +482 -166
- package/build/src/protocol/outcome.d.ts +14 -3
- package/build/src/protocol/outcome.js +11 -3
- package/build/src/protocol/placement.d.ts +41 -0
- package/build/src/protocol/placement.js +147 -0
- package/build/src/protocol/read/documents.d.ts +2 -2
- package/build/src/protocol/read/documents.js +4 -4
- package/build/src/protocol/read/status.d.ts +18 -5
- package/build/src/protocol/read/status.js +73 -13
- package/build/src/protocol/run.d.ts +49 -7
- package/build/src/protocol/run.js +53 -25
- package/build/src/runtime/proc/line-rpc.d.ts +4 -8
- package/build/src/runtime/proc/line-rpc.js +22 -28
- package/build/src/runtime/proc/run.d.ts +23 -21
- package/build/src/runtime/proc/run.js +123 -89
- package/build/src/runtime/proc/stdio.d.ts +18 -0
- package/build/src/runtime/proc/stdio.js +58 -0
- package/build/src/settings.d.ts +7 -1
- package/build/src/settings.js +32 -17
- package/build/src/settlement/fence.d.ts +5 -0
- package/build/src/settlement/fence.js +14 -0
- package/build/src/settlement/holder.d.ts +35 -4
- package/build/src/settlement/holder.js +127 -28
- package/build/src/settlement/settle.d.ts +9 -1
- package/build/src/settlement/settle.js +74 -37
- package/build/src/task/board.d.ts +23 -5
- package/build/src/task/board.js +17 -10
- package/build/src/task/compose.d.ts +2 -2
- package/build/src/task/compose.js +18 -10
- package/build/src/task/context.d.ts +3 -3
- package/build/src/task/context.js +15 -20
- package/build/src/task/document.d.ts +2 -1
- package/build/src/task/document.js +15 -5
- package/build/src/task/index.d.ts +27 -15
- package/build/src/task/index.js +57 -35
- package/build/src/task/operations.d.ts +38 -13
- package/build/src/task/operations.js +80 -46
- package/build/src/task/query.d.ts +67 -0
- package/build/src/task/query.js +279 -0
- package/build/src/task/store.d.ts +5 -7
- package/build/src/task/store.js +43 -28
- package/build/src/verification/declaration.d.ts +1 -0
- package/build/src/verification/execution.d.ts +51 -0
- package/build/src/verification/execution.js +108 -0
- package/build/src/workspace-place.d.ts +41 -0
- package/build/src/workspace-place.js +386 -0
- package/build/src/world.d.ts +24 -0
- package/build/src/world.js +136 -0
- package/package.json +8 -4
- package/build/src/akuma/activity.d.ts +0 -66
- package/build/src/akuma/activity.js +0 -139
- package/build/src/akuma/providers/claude.js +0 -305
- package/build/src/context-root.d.ts +0 -4
- package/build/src/context-root.js +0 -15
- package/build/src/git/delivery.d.ts +0 -20
- package/build/src/git/delivery.js +0 -109
- package/build/src/git/verification.d.ts +0 -14
- package/build/src/git/verification.js +0 -56
- package/build/src/protocol/read/audit.d.ts +0 -25
- package/build/src/protocol/read/audit.js +0 -39
- package/build/src/verification/producer.d.ts +0 -23
- package/build/src/verification/producer.js +0 -54
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import { realpath } from "node:fs/promises";
|
|
2
|
+
import { resolve } from "node:path";
|
|
3
|
+
import { NoGitWorldError, Repo } from "../index.js";
|
|
4
|
+
import { World, WorldError } from "../world.js";
|
|
5
|
+
import { CliUsageError } from "./parse.js";
|
|
6
|
+
async function canonicalInvocationCwd(input) {
|
|
7
|
+
try {
|
|
8
|
+
return await realpath(input);
|
|
9
|
+
}
|
|
10
|
+
catch {
|
|
11
|
+
throw new CliUsageError(`invocation cwd is not an existing directory: ${input}`);
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
async function discoverRepoAt(coordinate) {
|
|
15
|
+
try {
|
|
16
|
+
return { kind: "present", repo: await Repo.at({ path: coordinate }) };
|
|
17
|
+
}
|
|
18
|
+
catch (error) {
|
|
19
|
+
if (error instanceof NoGitWorldError)
|
|
20
|
+
return { kind: "absent", error };
|
|
21
|
+
throw error;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
function repoPolicy(command) {
|
|
25
|
+
switch (command.command) {
|
|
26
|
+
case "bind":
|
|
27
|
+
case "amend":
|
|
28
|
+
case "deliver":
|
|
29
|
+
case "review":
|
|
30
|
+
case "arc":
|
|
31
|
+
case "abandon":
|
|
32
|
+
case "audit":
|
|
33
|
+
case "reconcile":
|
|
34
|
+
case "show":
|
|
35
|
+
case "region":
|
|
36
|
+
return { use: "required", acceptsExplicit: true };
|
|
37
|
+
case "ls":
|
|
38
|
+
return { use: command.query.kind === "contracts" ? "required" : "none", acceptsExplicit: false };
|
|
39
|
+
case "status":
|
|
40
|
+
case "tell":
|
|
41
|
+
case "history":
|
|
42
|
+
return { use: "optional", acceptsExplicit: false };
|
|
43
|
+
case "fork":
|
|
44
|
+
return { use: "optional", acceptsExplicit: true };
|
|
45
|
+
case "wait":
|
|
46
|
+
case "kill": {
|
|
47
|
+
const contractSelector = command.akuma.some((selector) => selector.startsWith("kei/"));
|
|
48
|
+
return { use: contractSelector ? "required" : "optional", acceptsExplicit: contractSelector };
|
|
49
|
+
}
|
|
50
|
+
case "call":
|
|
51
|
+
return {
|
|
52
|
+
use: command.contract === undefined ? "none" : "required",
|
|
53
|
+
acceptsExplicit: command.contract !== undefined,
|
|
54
|
+
};
|
|
55
|
+
case "settings":
|
|
56
|
+
case "task":
|
|
57
|
+
case "install":
|
|
58
|
+
return { use: "none", acceptsExplicit: false };
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
function refuseUnusedRepo(command) {
|
|
62
|
+
if (command.command === "call")
|
|
63
|
+
throw new CliUsageError("--repo has no consumer without --contract");
|
|
64
|
+
throw new CliUsageError(`--repo has no consumer for ${command.command}`);
|
|
65
|
+
}
|
|
66
|
+
export function assertExplicitRepoUse(command, repo) {
|
|
67
|
+
if (repo !== undefined && !repoPolicy(command).acceptsExplicit)
|
|
68
|
+
refuseUnusedRepo(command);
|
|
69
|
+
}
|
|
70
|
+
function repoFor(use, discovery) {
|
|
71
|
+
if (use === "none")
|
|
72
|
+
return undefined;
|
|
73
|
+
if (discovery.kind === "present")
|
|
74
|
+
return discovery.repo;
|
|
75
|
+
if (use === "required")
|
|
76
|
+
throw discovery.error;
|
|
77
|
+
return undefined;
|
|
78
|
+
}
|
|
79
|
+
async function resolveWorld(cwd, repo) {
|
|
80
|
+
try {
|
|
81
|
+
const resolution = await World.resolve({ cwd, ...(repo === undefined ? {} : { repositoryRoot: repo.root }) });
|
|
82
|
+
return {
|
|
83
|
+
root: resolution.root,
|
|
84
|
+
candidate: resolution.candidate,
|
|
85
|
+
async establish() {
|
|
86
|
+
try {
|
|
87
|
+
return await resolution.establish();
|
|
88
|
+
}
|
|
89
|
+
catch (error) {
|
|
90
|
+
if (error instanceof WorldError)
|
|
91
|
+
throw new CliUsageError(error.message);
|
|
92
|
+
throw error;
|
|
93
|
+
}
|
|
94
|
+
},
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
catch (error) {
|
|
98
|
+
if (error instanceof WorldError)
|
|
99
|
+
throw new CliUsageError(error.message);
|
|
100
|
+
throw error;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
export async function resolveCliCoordinates(input) {
|
|
104
|
+
const processCwd = resolve(input.processCwd ?? ".");
|
|
105
|
+
const cwd = await canonicalInvocationCwd(resolve(processCwd, input.cwd ?? "."));
|
|
106
|
+
const invocationRepo = await discoverRepoAt(cwd);
|
|
107
|
+
const selectedRepo = input.repo === undefined
|
|
108
|
+
? invocationRepo
|
|
109
|
+
: await discoverRepoAt(resolve(cwd, input.repo));
|
|
110
|
+
const worldRepo = invocationRepo.kind === "present" ? invocationRepo.repo : undefined;
|
|
111
|
+
const repo = repoFor(repoPolicy(input.command).use, selectedRepo);
|
|
112
|
+
const world = await resolveWorld(cwd, worldRepo);
|
|
113
|
+
return {
|
|
114
|
+
cwd,
|
|
115
|
+
...(repo === undefined ? {} : { repo }),
|
|
116
|
+
world: world.root,
|
|
117
|
+
candidateWorld: world.candidate,
|
|
118
|
+
establishWorld: world.establish,
|
|
119
|
+
};
|
|
120
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { WorldRoot } from "../world.js";
|
|
2
|
+
import type { BindDraftReceipt } from "./result.js";
|
|
3
|
+
export declare class BindDraftError extends Error {
|
|
4
|
+
readonly original: unknown;
|
|
5
|
+
readonly draft: BindDraftReceipt;
|
|
6
|
+
constructor(original: unknown, draft: BindDraftReceipt);
|
|
7
|
+
}
|
|
8
|
+
export declare function preserveBindDraft(world: WorldRoot, markdown: string, now?: number): Promise<BindDraftReceipt>;
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { lstatSync, mkdirSync, readFileSync, readdirSync, unlinkSync, utimesSync } from "node:fs";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
import { repairDerivedFile, replaceFileDurably } from "../coordination/durable-file.js";
|
|
5
|
+
const RETENTION_MS = 7 * 24 * 60 * 60 * 1_000;
|
|
6
|
+
const DRAFT_NAME = /^bind-[0-9a-f]{64}\.md$/u;
|
|
7
|
+
export class BindDraftError extends Error {
|
|
8
|
+
original;
|
|
9
|
+
draft;
|
|
10
|
+
constructor(original, draft) {
|
|
11
|
+
super(original instanceof Error ? original.message : String(original));
|
|
12
|
+
this.name = "BindDraftError";
|
|
13
|
+
this.original = original;
|
|
14
|
+
this.draft = draft;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
function diagnostic(error) {
|
|
18
|
+
return error instanceof Error ? error.message : String(error);
|
|
19
|
+
}
|
|
20
|
+
function sweep(directory, now) {
|
|
21
|
+
for (const entry of readdirSync(directory, { withFileTypes: true })) {
|
|
22
|
+
if (!entry.isFile() || !DRAFT_NAME.test(entry.name))
|
|
23
|
+
continue;
|
|
24
|
+
const path = join(directory, entry.name);
|
|
25
|
+
try {
|
|
26
|
+
if (now - lstatSync(path).mtimeMs > RETENTION_MS)
|
|
27
|
+
unlinkSync(path);
|
|
28
|
+
}
|
|
29
|
+
catch (error) {
|
|
30
|
+
if (error.code !== "ENOENT")
|
|
31
|
+
throw error;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
export async function preserveBindDraft(world, markdown, now = Date.now()) {
|
|
36
|
+
const digest = createHash("sha256").update(markdown, "utf8").digest("hex");
|
|
37
|
+
const name = `bind-${digest}.md`;
|
|
38
|
+
const relativePath = `.keiyaku/draft/${name}`;
|
|
39
|
+
const directory = join(world, ".keiyaku", "draft");
|
|
40
|
+
const path = join(directory, name);
|
|
41
|
+
const warnings = [];
|
|
42
|
+
try {
|
|
43
|
+
mkdirSync(directory, { recursive: true });
|
|
44
|
+
}
|
|
45
|
+
catch (error) {
|
|
46
|
+
return { warning: `bind draft could not be preserved: ${diagnostic(error)}` };
|
|
47
|
+
}
|
|
48
|
+
try {
|
|
49
|
+
await repairDerivedFile(join(directory, ".gitignore"), "*\n");
|
|
50
|
+
}
|
|
51
|
+
catch (error) {
|
|
52
|
+
warnings.push(`bind draft ignore could not be maintained: ${diagnostic(error)}`);
|
|
53
|
+
}
|
|
54
|
+
try {
|
|
55
|
+
let equal = false;
|
|
56
|
+
try {
|
|
57
|
+
const status = lstatSync(path);
|
|
58
|
+
equal = status.isFile() && !status.isSymbolicLink() && readFileSync(path).equals(Buffer.from(markdown));
|
|
59
|
+
}
|
|
60
|
+
catch (error) {
|
|
61
|
+
if (error.code !== "ENOENT")
|
|
62
|
+
throw error;
|
|
63
|
+
}
|
|
64
|
+
if (equal) {
|
|
65
|
+
try {
|
|
66
|
+
const touched = new Date(now);
|
|
67
|
+
utimesSync(path, touched, touched);
|
|
68
|
+
}
|
|
69
|
+
catch (error) {
|
|
70
|
+
if (error.code !== "ENOENT")
|
|
71
|
+
throw error;
|
|
72
|
+
await replaceFileDurably(path, markdown);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
await replaceFileDurably(path, markdown);
|
|
77
|
+
}
|
|
78
|
+
if (!readFileSync(path).equals(Buffer.from(markdown))) {
|
|
79
|
+
throw new Error(`bind draft bytes do not match their content address: ${relativePath}`);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
catch (error) {
|
|
83
|
+
warnings.push(`bind draft could not be preserved: ${diagnostic(error)}`);
|
|
84
|
+
return { warning: warnings.join("; ") };
|
|
85
|
+
}
|
|
86
|
+
try {
|
|
87
|
+
sweep(directory, now);
|
|
88
|
+
}
|
|
89
|
+
catch (error) {
|
|
90
|
+
warnings.push(`bind draft sweep failed: ${diagnostic(error)}`);
|
|
91
|
+
}
|
|
92
|
+
return {
|
|
93
|
+
path: relativePath,
|
|
94
|
+
...(warnings.length === 0 ? {} : { warning: warnings.join("; ") }),
|
|
95
|
+
};
|
|
96
|
+
}
|
|
@@ -1,17 +1,23 @@
|
|
|
1
|
-
import { type Settings } from "../index.js";
|
|
1
|
+
import { type ActorId, type ContractId, type Settings } from "../index.js";
|
|
2
2
|
import { type AkumaInvocationResult } from "./commands/akuma-invoke.js";
|
|
3
3
|
import { type InstallInvocationResult } from "./commands/install.js";
|
|
4
4
|
import { type TaskInvocationResult } from "./commands/task-invoke.js";
|
|
5
5
|
import { type ParsedExecution } from "./parse.js";
|
|
6
6
|
import type { InvocationResult } from "./result.js";
|
|
7
|
-
export type { AcceptedFact,
|
|
7
|
+
export type { AcceptedFact, InvocationResult, Lag } from "./result.js";
|
|
8
8
|
type InvokeRuntime = Readonly<{
|
|
9
9
|
cwd?: string;
|
|
10
10
|
environment?: NodeJS.ProcessEnv;
|
|
11
|
-
readStdin?: () => string
|
|
11
|
+
readStdin?: () => Promise<string>;
|
|
12
|
+
actor?: ActorId;
|
|
12
13
|
}>;
|
|
13
14
|
export type SettingsInvocationResult = Readonly<{
|
|
14
15
|
kind: "settings";
|
|
15
16
|
value: Settings;
|
|
16
17
|
}>;
|
|
18
|
+
export type GuidanceInvocationResult = Readonly<{
|
|
19
|
+
kind: "guidance";
|
|
20
|
+
contract: ContractId;
|
|
21
|
+
guidance: string;
|
|
22
|
+
}>;
|
|
17
23
|
export declare function invoke(invocation: ParsedExecution, runtime?: InvokeRuntime): Promise<InvocationResult | TaskInvocationResult | AkumaInvocationResult | SettingsInvocationResult | InstallInvocationResult>;
|