@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,191 @@
|
|
|
1
|
+
import { createAgentSession, DefaultResourceLoader, getAgentDir, ModelRuntime, SessionManager, } from "@earendil-works/pi-coding-agent";
|
|
2
|
+
import { abortable } from "../../abort.js";
|
|
3
|
+
import { AgentEventChannel } from "../../provider.js";
|
|
4
|
+
import { piTerminalFailure, translatePiEvent } from "./events.js";
|
|
5
|
+
const PI_THINKING_LEVELS = new Set(["minimal", "low", "medium", "high", "xhigh", "max"]);
|
|
6
|
+
const MODEL_PATTERN = /^[^/\s]+\/[^/\s]+$/u;
|
|
7
|
+
function diagnostic(error) { return error instanceof Error ? error.message : String(error); }
|
|
8
|
+
function admitPiOptions(options) {
|
|
9
|
+
if (options.network !== undefined)
|
|
10
|
+
return { kind: "refused", diagnostic: "Pi provider does not support the network option" };
|
|
11
|
+
if (options.model !== undefined && !MODEL_PATTERN.test(options.model)) {
|
|
12
|
+
return { kind: "refused", diagnostic: "Pi provider model must use <provider>/<id>" };
|
|
13
|
+
}
|
|
14
|
+
if (options.effort !== undefined && !PI_THINKING_LEVELS.has(options.effort)) {
|
|
15
|
+
return { kind: "refused", diagnostic: "Pi provider effort must be minimal, low, medium, high, xhigh, or max" };
|
|
16
|
+
}
|
|
17
|
+
return {
|
|
18
|
+
kind: "admitted",
|
|
19
|
+
options: Object.freeze({ ...options }),
|
|
20
|
+
...(options.readonly === undefined ? {} : { readonly: { enforcement: "native" } }),
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
async function piCreateOptions(sdk, input) {
|
|
24
|
+
let model;
|
|
25
|
+
let modelRuntime;
|
|
26
|
+
if (input.options.model !== undefined) {
|
|
27
|
+
const slash = input.options.model.indexOf("/");
|
|
28
|
+
modelRuntime = await sdk.ModelRuntime.create();
|
|
29
|
+
model = modelRuntime.getModel(input.options.model.slice(0, slash), input.options.model.slice(slash + 1));
|
|
30
|
+
if (model === undefined)
|
|
31
|
+
throw new Error(`Pi model '${input.options.model}' is unavailable`);
|
|
32
|
+
}
|
|
33
|
+
const resourceLoader = input.options.systemPrompt === undefined ? undefined : new sdk.DefaultResourceLoader({
|
|
34
|
+
cwd: input.cwd,
|
|
35
|
+
agentDir: sdk.getAgentDir(),
|
|
36
|
+
systemPromptOverride: () => input.options.systemPrompt,
|
|
37
|
+
});
|
|
38
|
+
await resourceLoader?.reload();
|
|
39
|
+
const sessionManager = input.session.kind === "fresh"
|
|
40
|
+
? sdk.SessionManager.create(input.cwd)
|
|
41
|
+
: "sessionFile" in input.session.coordinate
|
|
42
|
+
? sdk.SessionManager.open(input.session.coordinate.sessionFile)
|
|
43
|
+
: (() => { throw new Error("Pi resume requires sessionFile"); })();
|
|
44
|
+
return {
|
|
45
|
+
cwd: input.cwd,
|
|
46
|
+
sessionManager,
|
|
47
|
+
...(model === undefined || modelRuntime === undefined ? {} : { model, modelRuntime }),
|
|
48
|
+
...(resourceLoader === undefined ? {} : { resourceLoader }),
|
|
49
|
+
...(input.options.effort === undefined ? {} : { thinkingLevel: input.options.effort }),
|
|
50
|
+
...(input.options.readonly === undefined ? {} : { tools: ["read", "grep", "find", "ls"] }),
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
async function createPiSession(sdk, input, signal) {
|
|
54
|
+
const setup = piCreateOptions(sdk, input).then(async (options) => await sdk.createAgentSession(options));
|
|
55
|
+
return await abortable(setup, signal, (created) => created.session.dispose());
|
|
56
|
+
}
|
|
57
|
+
async function drivePi(sdk, input, signal) {
|
|
58
|
+
const created = await createPiSession(sdk, input, signal);
|
|
59
|
+
const native = created.session;
|
|
60
|
+
if (signal.aborted) {
|
|
61
|
+
native.dispose();
|
|
62
|
+
signal.throwIfAborted();
|
|
63
|
+
}
|
|
64
|
+
if (native.sessionFile === undefined || native.sessionFile.trim().length === 0) {
|
|
65
|
+
native.dispose();
|
|
66
|
+
throw new Error("Pi session admitted without sessionFile");
|
|
67
|
+
}
|
|
68
|
+
const events = new AgentEventChannel();
|
|
69
|
+
const state = { answer: "", assistantSeen: false, tools: new Map() };
|
|
70
|
+
let terminalFailure = null;
|
|
71
|
+
let disposed = false;
|
|
72
|
+
let abortRequest;
|
|
73
|
+
let aborting = false;
|
|
74
|
+
let settled = false;
|
|
75
|
+
const dispose = () => {
|
|
76
|
+
if (disposed)
|
|
77
|
+
return;
|
|
78
|
+
disposed = true;
|
|
79
|
+
try {
|
|
80
|
+
unsubscribe();
|
|
81
|
+
}
|
|
82
|
+
finally {
|
|
83
|
+
try {
|
|
84
|
+
native.dispose();
|
|
85
|
+
}
|
|
86
|
+
finally {
|
|
87
|
+
events.end();
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
};
|
|
91
|
+
const unsubscribe = native.subscribe((event) => {
|
|
92
|
+
if (event.type === "agent_end" && !event.willRetry)
|
|
93
|
+
terminalFailure = piTerminalFailure(event.messages);
|
|
94
|
+
for (const translated of translatePiEvent(event, state))
|
|
95
|
+
events.emit(translated);
|
|
96
|
+
});
|
|
97
|
+
events.emit({ type: "session", coordinate: { sessionFile: native.sessionFile, sessionId: native.sessionId } });
|
|
98
|
+
let settleCompletion;
|
|
99
|
+
const completion = new Promise((resolve) => { settleCompletion = resolve; });
|
|
100
|
+
const settle = (result) => {
|
|
101
|
+
if (settled)
|
|
102
|
+
return;
|
|
103
|
+
settled = true;
|
|
104
|
+
dispose();
|
|
105
|
+
settleCompletion(result);
|
|
106
|
+
};
|
|
107
|
+
void (async () => {
|
|
108
|
+
try {
|
|
109
|
+
await native.prompt([input.body, ...input.launchTells.map((tell) => tell.text)].join("\n\n"));
|
|
110
|
+
if (aborting) {
|
|
111
|
+
settle({ kind: "failed", diagnostic: "Pi session aborted" });
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
if (terminalFailure !== null) {
|
|
115
|
+
settle({ kind: "failed", diagnostic: terminalFailure });
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
if (!state.assistantSeen) {
|
|
119
|
+
settle({ kind: "failed", diagnostic: "Pi completed without a native assistant answer" });
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
const historyId = native.sessionManager.getLeafId();
|
|
123
|
+
settle({
|
|
124
|
+
kind: "answered",
|
|
125
|
+
answer: state.answer,
|
|
126
|
+
...(historyId === null ? {} : { historyId }),
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
catch (error) {
|
|
130
|
+
settle(aborting
|
|
131
|
+
? { kind: "failed", diagnostic: "Pi session aborted" }
|
|
132
|
+
: { kind: "failed", diagnostic: diagnostic(error) });
|
|
133
|
+
}
|
|
134
|
+
})();
|
|
135
|
+
return {
|
|
136
|
+
admission: { fence: native.sessionId }, events, completion,
|
|
137
|
+
abort: () => {
|
|
138
|
+
abortRequest ??= (async () => {
|
|
139
|
+
if (settled)
|
|
140
|
+
return;
|
|
141
|
+
aborting = true;
|
|
142
|
+
try {
|
|
143
|
+
await native.abort();
|
|
144
|
+
}
|
|
145
|
+
catch { /* prompt settlement still proves local cleanup */ }
|
|
146
|
+
settle({ kind: "failed", diagnostic: "Pi session aborted" });
|
|
147
|
+
})();
|
|
148
|
+
return abortRequest;
|
|
149
|
+
},
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
function piSessionFile(coordinate) {
|
|
153
|
+
if (!("sessionFile" in coordinate))
|
|
154
|
+
throw new Error("Pi requires sessionFile");
|
|
155
|
+
return coordinate.sessionFile;
|
|
156
|
+
}
|
|
157
|
+
async function forkPi(sdk, input) {
|
|
158
|
+
const sessionFile = piSessionFile(input.session);
|
|
159
|
+
const manager = sdk.SessionManager.open(sessionFile);
|
|
160
|
+
const child = manager.createBranchedSession(input.at);
|
|
161
|
+
if (child === undefined || child === sessionFile)
|
|
162
|
+
throw new Error("Pi fork did not create a distinct child session file");
|
|
163
|
+
return { session: { sessionFile: child } };
|
|
164
|
+
}
|
|
165
|
+
const defaultSdk = { createAgentSession, DefaultResourceLoader, getAgentDir, ModelRuntime, SessionManager };
|
|
166
|
+
export function createPiProvider(execution = { name: "pi", kind: "pi" }, load = async () => defaultSdk) {
|
|
167
|
+
if (execution.executable !== undefined || execution.config !== undefined) {
|
|
168
|
+
throw new TypeError("Pi provider does not support executable or config");
|
|
169
|
+
}
|
|
170
|
+
if (execution.env !== undefined && Object.keys(execution.env).length > 0) {
|
|
171
|
+
throw new TypeError("env injection not supported for provider pi");
|
|
172
|
+
}
|
|
173
|
+
const drive = async (input) => {
|
|
174
|
+
const signal = input.signal ?? new AbortController().signal;
|
|
175
|
+
signal.throwIfAborted();
|
|
176
|
+
return drivePi(await abortable(load(), signal), input, signal);
|
|
177
|
+
};
|
|
178
|
+
return {
|
|
179
|
+
confinement: ({ cwd }) => ({ kind: "declared", writableRoots: [cwd] }),
|
|
180
|
+
admitOptions: admitPiOptions,
|
|
181
|
+
start: drive,
|
|
182
|
+
resume: async (input) => {
|
|
183
|
+
piSessionFile(input.session.coordinate);
|
|
184
|
+
return drive(input);
|
|
185
|
+
},
|
|
186
|
+
fork: async (input) => {
|
|
187
|
+
piSessionFile(input.session);
|
|
188
|
+
return forkPi(await load(), input);
|
|
189
|
+
},
|
|
190
|
+
};
|
|
191
|
+
}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { type AllocatedAkuma } from "./identity.js";
|
|
2
|
-
import { type ProcessCollar } from "../runtime/proc/run.js";
|
|
3
2
|
export declare const BIRTH_TIMEOUT_MS = 5000;
|
|
4
3
|
export declare function publishAkuma(input: Readonly<{
|
|
5
4
|
worldPath: string;
|
|
6
5
|
archetype: string;
|
|
7
6
|
awaitAsleep?: boolean;
|
|
8
|
-
reserve?(allocated: AllocatedAkuma): void
|
|
9
|
-
launch(allocated: AllocatedAkuma): Promise<
|
|
7
|
+
reserve?(allocated: AllocatedAkuma): Promise<void>;
|
|
8
|
+
launch(allocated: AllocatedAkuma): Promise<void>;
|
|
9
|
+
signal?: AbortSignal;
|
|
10
10
|
}>): Promise<AllocatedAkuma>;
|
|
@@ -1,84 +1,69 @@
|
|
|
1
1
|
import { HeldAkumaLeash, initializeHeart, readHeart, readSoul, } from "./heart/index.js";
|
|
2
2
|
import { allocateAkumaDirectory, } from "./identity.js";
|
|
3
|
-
import {
|
|
3
|
+
import { abortableDelay } from "./abort.js";
|
|
4
4
|
const POLL_MS = 25;
|
|
5
5
|
export const BIRTH_TIMEOUT_MS = 5_000;
|
|
6
|
-
function wait(milliseconds) {
|
|
7
|
-
return new Promise((resolve) => setTimeout(resolve, milliseconds));
|
|
8
|
-
}
|
|
9
6
|
function diagnostic(error) {
|
|
10
7
|
return error instanceof Error ? error.message : String(error);
|
|
11
8
|
}
|
|
12
|
-
function settleTimedOutBirth(paths) {
|
|
13
|
-
const leash = HeldAkumaLeash.try(paths);
|
|
9
|
+
async function settleTimedOutBirth(paths) {
|
|
10
|
+
const leash = await HeldAkumaLeash.try(paths);
|
|
14
11
|
if (leash === null)
|
|
15
12
|
return null;
|
|
16
|
-
const result = leash.sealIfUnborn(paths, { evidence: "call-timeout", at: new Date().toISOString() });
|
|
13
|
+
const result = await leash.sealIfUnborn(paths, { evidence: "call-timeout", at: new Date().toISOString() });
|
|
17
14
|
if (result === "sealed")
|
|
18
15
|
throw new Error("Akuma body failed before birth");
|
|
19
16
|
leash.release();
|
|
20
|
-
const soul = readSoul(paths);
|
|
17
|
+
const soul = await readSoul(paths);
|
|
21
18
|
if (soul === null)
|
|
22
19
|
throw new Error("Akuma birth settled without a soul");
|
|
23
20
|
return soul;
|
|
24
21
|
}
|
|
25
|
-
async function awaitBirth(paths) {
|
|
22
|
+
async function awaitBirth(paths, signal) {
|
|
26
23
|
const deadline = performance.now() + BIRTH_TIMEOUT_MS;
|
|
27
24
|
for (;;) {
|
|
28
|
-
|
|
25
|
+
signal?.throwIfAborted();
|
|
26
|
+
const soul = await readSoul(paths);
|
|
29
27
|
if (soul !== null)
|
|
30
28
|
return soul;
|
|
31
29
|
if (performance.now() >= deadline) {
|
|
32
|
-
const settled = settleTimedOutBirth(paths);
|
|
30
|
+
const settled = await settleTimedOutBirth(paths);
|
|
33
31
|
if (settled !== null)
|
|
34
32
|
return settled;
|
|
35
33
|
}
|
|
36
|
-
await
|
|
34
|
+
await abortableDelay(POLL_MS, signal);
|
|
37
35
|
}
|
|
38
36
|
}
|
|
39
37
|
async function takeLeashUntil(paths, deadline) {
|
|
40
38
|
for (;;) {
|
|
41
|
-
const leash = HeldAkumaLeash.try(paths);
|
|
39
|
+
const leash = await HeldAkumaLeash.try(paths);
|
|
42
40
|
if (leash !== null)
|
|
43
41
|
return leash;
|
|
44
42
|
if (performance.now() >= deadline)
|
|
45
43
|
return null;
|
|
46
|
-
await
|
|
44
|
+
await abortableDelay(POLL_MS);
|
|
47
45
|
}
|
|
48
46
|
}
|
|
49
|
-
async function awaitAsleepBirth(paths
|
|
47
|
+
async function awaitAsleepBirth(paths) {
|
|
50
48
|
const leash = await takeLeashUntil(paths, performance.now() + BIRTH_TIMEOUT_MS);
|
|
51
49
|
if (leash === null)
|
|
52
50
|
throw new Error("Forked Akuma did not finish its birth body");
|
|
53
51
|
try {
|
|
54
|
-
if (readHeart(paths).latestBody?.end !== "exited") {
|
|
52
|
+
if ((await readHeart(paths)).latestBody?.end !== "exited") {
|
|
55
53
|
throw new Error("Forked Akuma birth body did not exit cleanly");
|
|
56
54
|
}
|
|
57
55
|
}
|
|
58
56
|
finally {
|
|
59
57
|
leash.release();
|
|
60
58
|
}
|
|
61
|
-
const deadline = performance.now() + BIRTH_TIMEOUT_MS;
|
|
62
|
-
for (;;) {
|
|
63
|
-
const probe = probeProcessTree(collar);
|
|
64
|
-
if (probe.kind === "gone")
|
|
65
|
-
return;
|
|
66
|
-
if (performance.now() >= deadline) {
|
|
67
|
-
if (probe.kind === "unverifiable") {
|
|
68
|
-
throw new Error(`Forked Akuma birth collar is unverifiable: ${probe.diagnostic}`);
|
|
69
|
-
}
|
|
70
|
-
throw new Error("Forked Akuma birth process did not exit");
|
|
71
|
-
}
|
|
72
|
-
await wait(POLL_MS);
|
|
73
|
-
}
|
|
74
59
|
}
|
|
75
|
-
function sealLocalFailure(allocated, error) {
|
|
60
|
+
async function sealLocalFailure(allocated, error) {
|
|
76
61
|
try {
|
|
77
|
-
const leash = HeldAkumaLeash.try(allocated.paths);
|
|
62
|
+
const leash = await HeldAkumaLeash.try(allocated.paths);
|
|
78
63
|
if (leash === null)
|
|
79
64
|
return;
|
|
80
65
|
try {
|
|
81
|
-
leash.sealIfUnborn(allocated.paths, { evidence: diagnostic(error), at: new Date().toISOString() });
|
|
66
|
+
await leash.sealIfUnborn(allocated.paths, { evidence: diagnostic(error), at: new Date().toISOString() });
|
|
82
67
|
}
|
|
83
68
|
finally {
|
|
84
69
|
leash.release();
|
|
@@ -87,21 +72,24 @@ function sealLocalFailure(allocated, error) {
|
|
|
87
72
|
catch { /* the original local publication failure remains authoritative */ }
|
|
88
73
|
}
|
|
89
74
|
export async function publishAkuma(input) {
|
|
90
|
-
|
|
91
|
-
|
|
75
|
+
input.signal?.throwIfAborted();
|
|
76
|
+
const allocated = await allocateAkumaDirectory({ worldRoot: input.worldPath, archetype: input.archetype });
|
|
92
77
|
try {
|
|
93
|
-
initializeHeart(allocated.paths);
|
|
94
|
-
input.
|
|
95
|
-
|
|
78
|
+
await initializeHeart(allocated.paths);
|
|
79
|
+
input.signal?.throwIfAborted();
|
|
80
|
+
await input.reserve?.(allocated);
|
|
81
|
+
input.signal?.throwIfAborted();
|
|
82
|
+
await input.launch(allocated);
|
|
83
|
+
input.signal?.throwIfAborted();
|
|
96
84
|
}
|
|
97
85
|
catch (error) {
|
|
98
|
-
sealLocalFailure(allocated, error);
|
|
86
|
+
await sealLocalFailure(allocated, error);
|
|
99
87
|
throw error;
|
|
100
88
|
}
|
|
101
|
-
const soul = await awaitBirth(allocated.paths);
|
|
89
|
+
const soul = await awaitBirth(allocated.paths, input.signal);
|
|
102
90
|
if (soul.id !== allocated.id)
|
|
103
91
|
throw new Error("Akuma birth returned a different identity");
|
|
104
92
|
if (input.awaitAsleep === true)
|
|
105
|
-
await awaitAsleepBirth(allocated.paths
|
|
93
|
+
await awaitAsleepBirth(allocated.paths);
|
|
106
94
|
return allocated;
|
|
107
95
|
}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { type RequestRecipe, type Soul } from "./heart/index.js";
|
|
2
2
|
import { type AkuId, type AkumaPaths } from "./identity.js";
|
|
3
|
-
import type { ProcessCollar } from "../runtime/proc/run.js";
|
|
4
3
|
type RequestClaim = Readonly<{
|
|
5
4
|
id: string;
|
|
6
5
|
world: string;
|
|
@@ -28,19 +27,23 @@ export declare class BodyRequestPump {
|
|
|
28
27
|
private readonly input;
|
|
29
28
|
readonly directory: string;
|
|
30
29
|
readonly failure: Promise<never>;
|
|
31
|
-
private
|
|
30
|
+
private readonly closeSignal;
|
|
32
31
|
private readonly handled;
|
|
33
32
|
private readonly running;
|
|
34
|
-
|
|
33
|
+
private readonly cancelAdmission;
|
|
34
|
+
private constructor();
|
|
35
|
+
static open(input: Readonly<{
|
|
35
36
|
paths: AkumaPaths;
|
|
36
37
|
parent: Soul;
|
|
37
38
|
bodySequence: number;
|
|
38
39
|
now(): string;
|
|
39
|
-
spawn(launch: RequestChildLaunch): Promise<
|
|
40
|
-
|
|
40
|
+
spawn(launch: RequestChildLaunch): Promise<void>;
|
|
41
|
+
signal: AbortSignal;
|
|
42
|
+
}>): Promise<BodyRequestPump>;
|
|
41
43
|
private run;
|
|
42
44
|
close(): Promise<void>;
|
|
43
45
|
stopAdmission(): void;
|
|
44
46
|
}
|
|
45
|
-
export declare function
|
|
47
|
+
export declare function clearBodyRequestTransport(paths: AkumaPaths): Promise<void>;
|
|
48
|
+
export declare function settleBodyRequests(paths: AkumaPaths, parent: Soul, now: () => string, signal?: AbortSignal): Promise<"settled" | "pending">;
|
|
46
49
|
export {};
|