@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
|
@@ -1,16 +1,16 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { readFile, readdir } from "node:fs/promises";
|
|
2
2
|
import { dirname, join } from "node:path";
|
|
3
3
|
import { parseDocument } from "yaml";
|
|
4
4
|
import { archetypeName } from "./identity.js";
|
|
5
|
-
import { decodeProviderOptions } from "./provider.js";
|
|
6
|
-
import {
|
|
5
|
+
import { decodeProviderOptions, decodeProviderRecipe, } from "./provider-recipe.js";
|
|
6
|
+
import { resolveProviderExecution } from "./providers/index.js";
|
|
7
7
|
export class AkumaArchetypeError extends Error {
|
|
8
8
|
archetype;
|
|
9
9
|
searched;
|
|
10
10
|
reason;
|
|
11
11
|
kind = "akuma-archetype";
|
|
12
|
-
constructor(archetype, searched, reason) {
|
|
13
|
-
super(
|
|
12
|
+
constructor(archetype, searched, reason, guidance) {
|
|
13
|
+
super([`\`${archetype}\` ${reason}`, ...(guidance === undefined ? [] : [guidance])].join("\n"));
|
|
14
14
|
this.archetype = archetype;
|
|
15
15
|
this.searched = searched;
|
|
16
16
|
this.reason = reason;
|
|
@@ -21,27 +21,24 @@ function archetypeDirectory(settings) {
|
|
|
21
21
|
const userPath = settings.scopes.user.path;
|
|
22
22
|
return userPath === undefined ? null : join(dirname(userPath), "akuma");
|
|
23
23
|
}
|
|
24
|
-
|
|
25
|
-
const directory = archetypeDirectory(
|
|
24
|
+
async function archetypePaths(settings) {
|
|
25
|
+
const directory = archetypeDirectory(settings);
|
|
26
26
|
if (directory === null)
|
|
27
27
|
return [];
|
|
28
28
|
try {
|
|
29
|
-
return
|
|
29
|
+
return (await readdir(directory, { withFileTypes: true }))
|
|
30
30
|
.flatMap((entry) => {
|
|
31
|
-
if (!entry.isFile())
|
|
32
|
-
return [];
|
|
33
|
-
const filename = entry.name;
|
|
34
|
-
if (!filename.endsWith(".md"))
|
|
31
|
+
if (!entry.isFile() || !entry.name.endsWith(".md"))
|
|
35
32
|
return [];
|
|
36
|
-
const name =
|
|
33
|
+
const name = entry.name.slice(0, -3);
|
|
37
34
|
try {
|
|
38
|
-
return [archetypeName(name)];
|
|
35
|
+
return [{ name: archetypeName(name), path: join(directory, entry.name) }];
|
|
39
36
|
}
|
|
40
37
|
catch {
|
|
41
38
|
return [];
|
|
42
39
|
}
|
|
43
40
|
})
|
|
44
|
-
.sort((left, right) => Buffer.compare(Buffer.from(left), Buffer.from(right)));
|
|
41
|
+
.sort((left, right) => Buffer.compare(Buffer.from(left.name), Buffer.from(right.name)));
|
|
45
42
|
}
|
|
46
43
|
catch (error) {
|
|
47
44
|
if (error.code === "ENOENT")
|
|
@@ -49,12 +46,15 @@ export function listArchetypes(input) {
|
|
|
49
46
|
throw error;
|
|
50
47
|
}
|
|
51
48
|
}
|
|
49
|
+
export async function listArchetypes(input) {
|
|
50
|
+
return (await archetypePaths(input.settings)).map(({ name }) => name);
|
|
51
|
+
}
|
|
52
52
|
function archetypeField(values, key, required = false) {
|
|
53
53
|
const value = values[key];
|
|
54
54
|
if (value === undefined && !required)
|
|
55
55
|
return undefined;
|
|
56
56
|
if (typeof value !== "string" || value.trim().length === 0) {
|
|
57
|
-
throw new TypeError(`
|
|
57
|
+
throw new TypeError(`Akuma ${key} must be a nonblank string`);
|
|
58
58
|
}
|
|
59
59
|
return value;
|
|
60
60
|
}
|
|
@@ -63,28 +63,37 @@ function archetypeEnum(values, key, allowed) {
|
|
|
63
63
|
if (value === undefined)
|
|
64
64
|
return undefined;
|
|
65
65
|
if (!allowed.includes(value))
|
|
66
|
-
throw new TypeError(`
|
|
66
|
+
throw new TypeError(`Akuma ${key} must be one of ${allowed.join(", ")}`);
|
|
67
67
|
return value;
|
|
68
68
|
}
|
|
69
|
+
function archetypeReadonly(values) {
|
|
70
|
+
if (!("readonly" in values))
|
|
71
|
+
return undefined;
|
|
72
|
+
if (values.readonly !== true)
|
|
73
|
+
throw new TypeError("Akuma readonly must be true");
|
|
74
|
+
return true;
|
|
75
|
+
}
|
|
69
76
|
function decodeArchetype(name, path, markdown) {
|
|
70
77
|
const lines = markdown.split(/\r?\n/u);
|
|
71
78
|
if (lines[0]?.trim() !== "---")
|
|
72
|
-
throw new TypeError("
|
|
79
|
+
throw new TypeError("Akuma configuration must begin with YAML frontmatter");
|
|
73
80
|
const closing = lines.findIndex((line, index) => index > 0 && line.trim() === "---");
|
|
74
81
|
if (closing < 0)
|
|
75
|
-
throw new TypeError("
|
|
82
|
+
throw new TypeError("Akuma frontmatter is not closed");
|
|
76
83
|
const document = parseDocument(lines.slice(1, closing).join("\n"), { uniqueKeys: true });
|
|
77
84
|
if (document.errors.length > 0)
|
|
78
|
-
throw new TypeError(`
|
|
85
|
+
throw new TypeError(`Akuma frontmatter is invalid: ${document.errors[0].message}`);
|
|
79
86
|
const decoded = document.toJS();
|
|
80
87
|
if (decoded === null || typeof decoded !== "object" || Array.isArray(decoded)) {
|
|
81
|
-
throw new TypeError("
|
|
88
|
+
throw new TypeError("Akuma frontmatter must be one mapping");
|
|
82
89
|
}
|
|
83
90
|
const values = decoded;
|
|
84
91
|
const provider = archetypeField(values, "provider", true);
|
|
92
|
+
if ("access" in values)
|
|
93
|
+
throw new TypeError("Akuma access is not supported; use readonly: true");
|
|
85
94
|
const model = archetypeField(values, "model");
|
|
86
95
|
const effort = archetypeField(values, "effort");
|
|
87
|
-
const
|
|
96
|
+
const readonly = archetypeReadonly(values);
|
|
88
97
|
const network = archetypeEnum(values, "network", ["disabled", "enabled"]);
|
|
89
98
|
const description = archetypeField(values, "description");
|
|
90
99
|
const systemPrompt = lines.slice(closing + 1).join("\n");
|
|
@@ -96,12 +105,33 @@ function decodeArchetype(name, path, markdown) {
|
|
|
96
105
|
options: decodeProviderOptions({
|
|
97
106
|
...(model === undefined ? {} : { model }),
|
|
98
107
|
...(effort === undefined ? {} : { effort }),
|
|
99
|
-
...(
|
|
108
|
+
...(readonly === undefined ? {} : { readonly }),
|
|
100
109
|
...(network === undefined ? {} : { network }),
|
|
101
|
-
systemPrompt,
|
|
110
|
+
...(systemPrompt.length === 0 ? {} : { systemPrompt }),
|
|
102
111
|
}),
|
|
103
112
|
});
|
|
104
113
|
}
|
|
114
|
+
export async function listArchetypeDefinitions(input) {
|
|
115
|
+
// Reads still run concurrently, but the reported failure is the first invalid
|
|
116
|
+
// definition in catalog byte order, not whichever read happened to finish first.
|
|
117
|
+
const settled = await Promise.allSettled((await archetypePaths(input.settings)).map(async ({ name, path }) => {
|
|
118
|
+
try {
|
|
119
|
+
const definition = decodeArchetype(name, path, await readFile(path, "utf8"));
|
|
120
|
+
return Object.freeze({
|
|
121
|
+
name: definition.name,
|
|
122
|
+
...(definition.options.model === undefined ? {} : { model: definition.options.model }),
|
|
123
|
+
...(definition.description === undefined ? {} : { description: definition.description }),
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
catch (error) {
|
|
127
|
+
throw new AkumaArchetypeError(name, [path], `is invalid: ${error instanceof Error ? error.message : String(error)}`);
|
|
128
|
+
}
|
|
129
|
+
}));
|
|
130
|
+
const firstInvalid = settled.find((result) => result.status === "rejected");
|
|
131
|
+
if (firstInvalid !== undefined)
|
|
132
|
+
throw firstInvalid.reason;
|
|
133
|
+
return settled.map((result) => result.value);
|
|
134
|
+
}
|
|
105
135
|
function record(value) {
|
|
106
136
|
return value !== null && typeof value === "object" && !Array.isArray(value)
|
|
107
137
|
? value : null;
|
|
@@ -123,7 +153,7 @@ function configuredProvider(name, selected) {
|
|
|
123
153
|
if (unknown !== undefined)
|
|
124
154
|
throw new TypeError(`provider ${name} has unknown field ${unknown}`);
|
|
125
155
|
optionalProviderText(value, name, "description");
|
|
126
|
-
return
|
|
156
|
+
return decodeProviderRecipe({
|
|
127
157
|
name,
|
|
128
158
|
kind: value.kind,
|
|
129
159
|
...(value.executable === undefined ? {} : { executable: value.executable }),
|
|
@@ -131,6 +161,16 @@ function configuredProvider(name, selected) {
|
|
|
131
161
|
...(value.env === undefined ? {} : { env: value.env }),
|
|
132
162
|
});
|
|
133
163
|
}
|
|
164
|
+
const BUILTIN_EXECUTIONS = {
|
|
165
|
+
claude: { kind: "claude-agent-sdk" },
|
|
166
|
+
"codex-app-server": { kind: "codex-app-server" },
|
|
167
|
+
"opencode-sdk": { kind: "opencode-sdk" },
|
|
168
|
+
pi: { kind: "pi" },
|
|
169
|
+
"grok-build": {
|
|
170
|
+
kind: "grok-build",
|
|
171
|
+
executable: "grok",
|
|
172
|
+
},
|
|
173
|
+
};
|
|
134
174
|
function providerExecution(settings, name) {
|
|
135
175
|
const view = settings.namespace("providers");
|
|
136
176
|
if (view.kind === "failed")
|
|
@@ -138,43 +178,49 @@ function providerExecution(settings, name) {
|
|
|
138
178
|
const selected = view.entries.find((entry) => entry.name === name)?.value;
|
|
139
179
|
if (selected !== undefined)
|
|
140
180
|
return configuredProvider(name, selected);
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
return Object.freeze({ name, kind: "codex-app-server" });
|
|
181
|
+
const builtin = BUILTIN_EXECUTIONS[name];
|
|
182
|
+
if (builtin !== undefined)
|
|
183
|
+
return decodeProviderRecipe({ name, ...builtin });
|
|
145
184
|
throw new TypeError(`unknown provider ${name}`);
|
|
146
185
|
}
|
|
147
186
|
function admitArchetype(archetype, settings) {
|
|
148
|
-
let
|
|
187
|
+
let selected;
|
|
149
188
|
try {
|
|
150
|
-
|
|
189
|
+
selected = resolveProviderExecution(providerExecution(settings, archetype.provider));
|
|
151
190
|
}
|
|
152
191
|
catch (error) {
|
|
153
192
|
if (error instanceof TypeError)
|
|
154
193
|
throw new AkumaArchetypeError(archetype.name, [archetype.path], `uses ${error.message}`);
|
|
155
194
|
throw error;
|
|
156
195
|
}
|
|
157
|
-
const
|
|
196
|
+
const execution = selected.execution;
|
|
197
|
+
const adapter = selected.adapter;
|
|
158
198
|
const admission = adapter.admitOptions(archetype.options);
|
|
159
199
|
if (admission.kind === "refused") {
|
|
160
200
|
throw new AkumaArchetypeError(archetype.name, [archetype.path], `is unsupported: ${admission.diagnostic}`);
|
|
161
201
|
}
|
|
162
|
-
return Object.freeze({
|
|
202
|
+
return Object.freeze({
|
|
203
|
+
...archetype,
|
|
204
|
+
provider: execution,
|
|
205
|
+
adapter,
|
|
206
|
+
options: admission.options,
|
|
207
|
+
...(admission.readonly === undefined ? {} : { readonly: admission.readonly }),
|
|
208
|
+
});
|
|
163
209
|
}
|
|
164
|
-
export function loadArchetype(input) {
|
|
210
|
+
export async function loadArchetype(input) {
|
|
165
211
|
const name = archetypeName(input.name);
|
|
166
212
|
const directory = archetypeDirectory(input.settings);
|
|
213
|
+
const missing = () => new AkumaArchetypeError(name, directory === null ? [] : [join(directory, `${name}.md`)], "was not found", "use `keiyaku ls aku/` to list available Akuma");
|
|
167
214
|
if (directory === null)
|
|
168
|
-
throw
|
|
215
|
+
throw missing();
|
|
169
216
|
const path = join(directory, `${name}.md`);
|
|
170
217
|
let markdown;
|
|
171
218
|
try {
|
|
172
|
-
markdown =
|
|
219
|
+
markdown = await readFile(path, "utf8");
|
|
173
220
|
}
|
|
174
221
|
catch (error) {
|
|
175
|
-
if (error.code === "ENOENT")
|
|
176
|
-
throw
|
|
177
|
-
}
|
|
222
|
+
if (error.code === "ENOENT")
|
|
223
|
+
throw missing();
|
|
178
224
|
throw new AkumaArchetypeError(name, [path], `could not be read: ${error instanceof Error ? error.message : String(error)}`);
|
|
179
225
|
}
|
|
180
226
|
try {
|
|
@@ -2,7 +2,7 @@ import { type SessionFact, type Soul } from "./heart/index.js";
|
|
|
2
2
|
import type { AkumaPaths } from "./identity.js";
|
|
3
3
|
import { type ProviderAdapter } from "./provider.js";
|
|
4
4
|
import { type RequestChildLaunch } from "./requests.js";
|
|
5
|
-
|
|
5
|
+
export declare const CONTROL_RESPONSE_MS = 1000;
|
|
6
6
|
export type BodyLaunch = Readonly<{
|
|
7
7
|
paths: AkumaPaths;
|
|
8
8
|
seed?: Omit<Soul, "createdAt">;
|
|
@@ -10,11 +10,9 @@ export type BodyLaunch = Readonly<{
|
|
|
10
10
|
initialBody?: string;
|
|
11
11
|
}>;
|
|
12
12
|
type BodyRuntime = Readonly<{
|
|
13
|
-
collar: ProcessCollar;
|
|
14
13
|
now(): string;
|
|
15
|
-
|
|
16
|
-
spawnChild?(launch: RequestChildLaunch): Promise<ProcessCollar>;
|
|
14
|
+
spawnChild?(launch: RequestChildLaunch): Promise<void>;
|
|
17
15
|
}>;
|
|
18
16
|
export declare function driveAkumaBody(launch: BodyLaunch, adapter?: ProviderAdapter, runtime?: BodyRuntime): Promise<void>;
|
|
19
|
-
export declare function spawnAkumaBody(launch: BodyLaunch): Promise<
|
|
17
|
+
export declare function spawnAkumaBody(launch: BodyLaunch): Promise<void>;
|
|
20
18
|
export {};
|