@goah/cli 0.4.0 → 0.6.0
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/dist/cli.js +191 -13
- package/dist/cli.js.map +1 -1
- package/dist/console/assets/index-TOZF8bTI.js +50 -0
- package/dist/console/assets/index-TOZF8bTI.js.map +1 -0
- package/dist/console/assets/index-ouh3W9al.css +1 -0
- package/dist/console/goah-orbital-mark.png +0 -0
- package/dist/console/index.html +14 -0
- package/dist/control.d.ts +70 -0
- package/dist/control.d.ts.map +1 -0
- package/dist/control.js +173 -0
- package/dist/control.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/web-console.d.ts +33 -0
- package/dist/web-console.d.ts.map +1 -0
- package/dist/web-console.js +200 -0
- package/dist/web-console.js.map +1 -0
- package/node_modules/goah-ledger-contract/dist/execution.d.ts +10 -1
- package/node_modules/goah-ledger-contract/dist/execution.d.ts.map +1 -1
- package/node_modules/goah-ledger-contract/dist/execution.js +10 -3
- package/node_modules/goah-ledger-contract/dist/execution.js.map +1 -1
- package/node_modules/goah-ledger-contract/dist/kernel.d.ts +1 -1
- package/node_modules/goah-ledger-contract/dist/kernel.js +1 -1
- package/node_modules/goah-ledger-contract/package.json +2 -2
- package/node_modules/goah-ledger-sqlite/dist/index.d.ts +3 -2
- package/node_modules/goah-ledger-sqlite/dist/index.d.ts.map +1 -1
- package/node_modules/goah-ledger-sqlite/dist/index.js +52 -16
- package/node_modules/goah-ledger-sqlite/dist/index.js.map +1 -1
- package/node_modules/goah-ledger-sqlite/package.json +3 -3
- package/node_modules/goah-runner-pi/dist/pi-worker.d.ts.map +1 -1
- package/node_modules/goah-runner-pi/dist/pi-worker.js +33 -16
- package/node_modules/goah-runner-pi/dist/pi-worker.js.map +1 -1
- package/node_modules/goah-runner-pi/package.json +3 -3
- package/node_modules/goah-supervisor/dist/context-view.d.ts +1 -0
- package/node_modules/goah-supervisor/dist/context-view.d.ts.map +1 -1
- package/node_modules/goah-supervisor/dist/context-view.js +5 -1
- package/node_modules/goah-supervisor/dist/context-view.js.map +1 -1
- package/node_modules/goah-supervisor/dist/index.d.ts +5 -2
- package/node_modules/goah-supervisor/dist/index.d.ts.map +1 -1
- package/node_modules/goah-supervisor/dist/index.js +72 -32
- package/node_modules/goah-supervisor/dist/index.js.map +1 -1
- package/node_modules/goah-supervisor/dist/roles.d.ts.map +1 -1
- package/node_modules/goah-supervisor/dist/roles.js +4 -2
- package/node_modules/goah-supervisor/dist/roles.js.map +1 -1
- package/node_modules/goah-supervisor/package.json +3 -3
- package/node_modules/goah-testkit/dist/faux-runner-worker.js +17 -1
- package/node_modules/goah-testkit/dist/faux-runner-worker.js.map +1 -1
- package/node_modules/goah-testkit/dist/index.d.ts.map +1 -1
- package/node_modules/goah-testkit/dist/index.js +7 -5
- package/node_modules/goah-testkit/dist/index.js.map +1 -1
- package/node_modules/goah-testkit/package.json +6 -6
- package/package.json +7 -7
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import { chmodSync, existsSync, readFileSync, rmSync, statSync, writeFileSync } from "node:fs";
|
|
3
|
+
import { createServer } from "node:http";
|
|
4
|
+
import { extname, join, normalize } from "node:path";
|
|
5
|
+
import { fileURLToPath } from "node:url";
|
|
6
|
+
import { redactValue } from "./inspect.js";
|
|
7
|
+
const assetsDirectory = fileURLToPath(new URL("./console/", import.meta.url));
|
|
8
|
+
export function consoleMetadataPath(stateDir) { return join(stateDir, "console.json"); }
|
|
9
|
+
export function readConsoleMetadata(stateDir) {
|
|
10
|
+
const path = consoleMetadataPath(stateDir);
|
|
11
|
+
if (!existsSync(path))
|
|
12
|
+
return null;
|
|
13
|
+
try {
|
|
14
|
+
const value = JSON.parse(readFileSync(path, "utf8"));
|
|
15
|
+
if (!value.url || !Number.isInteger(value.port) || !value.token)
|
|
16
|
+
return null;
|
|
17
|
+
return value;
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
return null;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
export function consoleSnapshot(ledger, supervisor, now = new Date().toISOString()) {
|
|
24
|
+
const events = ledger.events().slice(-300).map((event) => redactValue(event));
|
|
25
|
+
return redactValue({
|
|
26
|
+
seq: ledger.events().at(-1)?.seq ?? 0,
|
|
27
|
+
now,
|
|
28
|
+
goals: ledger.goals(),
|
|
29
|
+
team: supervisor.teamList(now),
|
|
30
|
+
wakes: ledger.wakes(),
|
|
31
|
+
actions: ledger.actions(),
|
|
32
|
+
schedules: ledger.schedules(),
|
|
33
|
+
mailbox: ledger.mailbox(),
|
|
34
|
+
events,
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
export function organizationTrajectory(ledger, options = {}) {
|
|
38
|
+
const limit = Math.min(Math.max(options.limit ?? 100, 1), 200);
|
|
39
|
+
const beforeSeq = options.beforeSeq ?? Number.MAX_SAFE_INTEGER;
|
|
40
|
+
const wakeAgents = new Map(ledger.wakes().map((wake) => [wake.id, wake.agent]));
|
|
41
|
+
const candidates = ledger.events().filter((event) => {
|
|
42
|
+
if (event.seq >= beforeSeq || !isTrajectoryEvent(event.type))
|
|
43
|
+
return false;
|
|
44
|
+
const wakeId = event.streamId.startsWith("wake:") ? event.streamId.slice("wake:".length) : null;
|
|
45
|
+
const agent = wakeId ? wakeAgents.get(wakeId) ?? event.actor : event.actor;
|
|
46
|
+
if (options.agent && agent !== options.agent)
|
|
47
|
+
return false;
|
|
48
|
+
if (options.type && !event.type.startsWith(`${options.type}.`))
|
|
49
|
+
return false;
|
|
50
|
+
return true;
|
|
51
|
+
}).reverse();
|
|
52
|
+
const page = candidates.slice(0, limit);
|
|
53
|
+
return {
|
|
54
|
+
items: page.map((event) => {
|
|
55
|
+
const wakeId = event.streamId.startsWith("wake:") ? event.streamId.slice("wake:".length) : null;
|
|
56
|
+
return { event: redactValue(event), agent: wakeId ? wakeAgents.get(wakeId) ?? event.actor : event.actor, wakeId };
|
|
57
|
+
}),
|
|
58
|
+
nextBeforeSeq: candidates.length > limit ? page.at(-1)?.seq ?? null : null,
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
export async function runWebConsole(supervisor, ledger, stateDir, signal, options = {}) {
|
|
62
|
+
const host = options.host ?? "127.0.0.1";
|
|
63
|
+
const token = randomUUID();
|
|
64
|
+
const server = createServer((request, response) => { void route(request, response, supervisor, ledger, token); });
|
|
65
|
+
await new Promise((resolve, reject) => { server.once("error", reject); server.listen(options.port ?? 0, host, resolve); });
|
|
66
|
+
const address = server.address();
|
|
67
|
+
if (!address || typeof address === "string")
|
|
68
|
+
throw new Error("console server did not bind a TCP port");
|
|
69
|
+
const metadata = { url: `http://${host}:${address.port}/`, host, port: address.port, pid: process.pid, token };
|
|
70
|
+
const metadataPath = consoleMetadataPath(stateDir);
|
|
71
|
+
writeFileSync(metadataPath, `${JSON.stringify(metadata, null, 2)}\n`, { mode: 0o600 });
|
|
72
|
+
if (process.platform !== "win32")
|
|
73
|
+
chmodSync(metadataPath, 0o600);
|
|
74
|
+
options.onListening?.(metadata);
|
|
75
|
+
await new Promise((resolve) => {
|
|
76
|
+
const stop = () => server.close(() => resolve());
|
|
77
|
+
if (signal.aborted)
|
|
78
|
+
stop();
|
|
79
|
+
else
|
|
80
|
+
signal.addEventListener("abort", stop, { once: true });
|
|
81
|
+
});
|
|
82
|
+
rmSync(metadataPath, { force: true });
|
|
83
|
+
}
|
|
84
|
+
async function route(request, response, supervisor, ledger, token) {
|
|
85
|
+
setHeaders(response);
|
|
86
|
+
const url = new URL(request.url ?? "/", "http://127.0.0.1");
|
|
87
|
+
if (url.pathname.startsWith("/api/")) {
|
|
88
|
+
if (!authorized(request, url, token)) {
|
|
89
|
+
sendJson(response, 403, { error: "console authorization failed" });
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
if (request.method === "GET" && url.pathname === "/api/snapshot") {
|
|
93
|
+
sendJson(response, 200, consoleSnapshot(ledger, supervisor));
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
if (request.method === "GET" && url.pathname === "/api/trajectory") {
|
|
97
|
+
const options = {};
|
|
98
|
+
const beforeSeq = positiveInteger(url.searchParams.get("beforeSeq"));
|
|
99
|
+
if (beforeSeq)
|
|
100
|
+
options.beforeSeq = beforeSeq;
|
|
101
|
+
const limit = positiveInteger(url.searchParams.get("limit"));
|
|
102
|
+
if (limit)
|
|
103
|
+
options.limit = limit;
|
|
104
|
+
const agent = nonEmpty(url.searchParams.get("agent"));
|
|
105
|
+
if (agent)
|
|
106
|
+
options.agent = agent;
|
|
107
|
+
const type = nonEmpty(url.searchParams.get("type"));
|
|
108
|
+
if (type)
|
|
109
|
+
options.type = type;
|
|
110
|
+
sendJson(response, 200, organizationTrajectory(ledger, options));
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
if (request.method === "GET" && url.pathname.startsWith("/api/sessions/")) {
|
|
114
|
+
const wakeId = decodeURIComponent(url.pathname.slice("/api/sessions/".length));
|
|
115
|
+
const wake = ledger.wake(wakeId);
|
|
116
|
+
if (!wake) {
|
|
117
|
+
sendJson(response, 404, { error: "wake not found" });
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
sendJson(response, 200, redactValue({ wake, events: ledger.eventsForWake(wakeId) }));
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
if (request.method === "POST" && url.pathname === "/api/ceo") {
|
|
124
|
+
const body = await readBody(request);
|
|
125
|
+
const message = typeof body.message === "string" ? body.message.trim() : "";
|
|
126
|
+
if (!message) {
|
|
127
|
+
sendJson(response, 400, { error: "message is required" });
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
const root = ledger.goals().find((goal) => goal.parentId === null && goal.owner === "ceo" && goal.phase !== "complete");
|
|
131
|
+
sendJson(response, 202, root ? supervisor.sendToCeo({ message }) : supervisor.startGoal(message));
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
sendJson(response, 404, { error: "not found" });
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
if (request.method !== "GET" && request.method !== "HEAD") {
|
|
138
|
+
response.writeHead(405);
|
|
139
|
+
response.end();
|
|
140
|
+
return;
|
|
141
|
+
}
|
|
142
|
+
const relative = url.pathname === "/" ? "index.html" : normalize(url.pathname).replace(/^\/+/, "");
|
|
143
|
+
if (relative === "index.html")
|
|
144
|
+
response.setHeader("set-cookie", `goah_console=${token}; Path=/; HttpOnly; SameSite=Strict`);
|
|
145
|
+
const path = join(assetsDirectory, relative);
|
|
146
|
+
if (!path.startsWith(assetsDirectory) || !existsSync(path) || !statSync(path).isFile()) {
|
|
147
|
+
const fallback = join(assetsDirectory, "index.html");
|
|
148
|
+
if (!existsSync(fallback)) {
|
|
149
|
+
response.writeHead(503);
|
|
150
|
+
response.end("Console assets are not built. Run npm run build.");
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
153
|
+
serveFile(response, fallback, request.method === "HEAD");
|
|
154
|
+
return;
|
|
155
|
+
}
|
|
156
|
+
serveFile(response, path, request.method === "HEAD");
|
|
157
|
+
}
|
|
158
|
+
function isTrajectoryEvent(type) {
|
|
159
|
+
if (["wake.lease_renewed", "wake.runner_attached"].includes(type))
|
|
160
|
+
return false;
|
|
161
|
+
return ["goal.", "delegation.", "handoff.", "wake.", "mail.", "schedule.", "action.", "metric.", "observation.", "ceo.", "human."].some((prefix) => type.startsWith(prefix));
|
|
162
|
+
}
|
|
163
|
+
function positiveInteger(value) { const parsed = Number(value); return Number.isInteger(parsed) && parsed > 0 ? parsed : undefined; }
|
|
164
|
+
function nonEmpty(value) { const result = value?.trim(); return result ? result : undefined; }
|
|
165
|
+
function authorized(request, url, token) {
|
|
166
|
+
const supplied = request.headers.authorization?.replace(/^Bearer\s+/i, "") ?? url.searchParams.get("token");
|
|
167
|
+
if (supplied === token)
|
|
168
|
+
return true;
|
|
169
|
+
const cookieToken = request.headers.cookie?.split(";").map((value) => value.trim()).find((value) => value.startsWith("goah_console="))?.slice("goah_console=".length);
|
|
170
|
+
if (cookieToken === token)
|
|
171
|
+
return true;
|
|
172
|
+
const referer = request.headers.referer;
|
|
173
|
+
return Boolean(referer && referer.startsWith(`http://${request.headers.host}/`));
|
|
174
|
+
}
|
|
175
|
+
function serveFile(response, path, head) {
|
|
176
|
+
const types = { ".html": "text/html; charset=utf-8", ".js": "text/javascript; charset=utf-8", ".css": "text/css; charset=utf-8", ".png": "image/png", ".svg": "image/svg+xml", ".map": "application/json" };
|
|
177
|
+
response.writeHead(200, { "content-type": types[extname(path)] ?? "application/octet-stream", "cache-control": extname(path) === ".html" ? "no-store" : "public, max-age=31536000, immutable" });
|
|
178
|
+
response.end(head ? undefined : readFileSync(path));
|
|
179
|
+
}
|
|
180
|
+
function setHeaders(response) {
|
|
181
|
+
response.setHeader("content-security-policy", "default-src 'self'; script-src 'self'; style-src 'self'; img-src 'self' data:; connect-src 'self'; object-src 'none'; frame-ancestors 'none'; base-uri 'none'");
|
|
182
|
+
response.setHeader("referrer-policy", "no-referrer");
|
|
183
|
+
response.setHeader("x-content-type-options", "nosniff");
|
|
184
|
+
response.setHeader("x-frame-options", "DENY");
|
|
185
|
+
}
|
|
186
|
+
function sendJson(response, status, value) {
|
|
187
|
+
response.writeHead(status, { "content-type": "application/json; charset=utf-8", "cache-control": "no-store" });
|
|
188
|
+
response.end(`${JSON.stringify(value)}\n`);
|
|
189
|
+
}
|
|
190
|
+
async function readBody(request) {
|
|
191
|
+
let body = "";
|
|
192
|
+
for await (const chunk of request) {
|
|
193
|
+
body += chunk.toString();
|
|
194
|
+
if (body.length > 65_536)
|
|
195
|
+
throw new Error("request body is too large");
|
|
196
|
+
}
|
|
197
|
+
const parsed = JSON.parse(body || "{}");
|
|
198
|
+
return parsed && typeof parsed === "object" && !Array.isArray(parsed) ? parsed : {};
|
|
199
|
+
}
|
|
200
|
+
//# sourceMappingURL=web-console.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"web-console.js","sourceRoot":"","sources":["../src/web-console.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AAC9F,OAAO,EAAE,YAAY,EAA6C,MAAM,WAAW,CAAA;AACnF,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,WAAW,CAAA;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAGxC,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAM1C,MAAM,eAAe,GAAG,aAAa,CAAC,IAAI,GAAG,CAAC,YAAY,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA;AAE7E,MAAM,UAAU,mBAAmB,CAAC,QAAgB,IAAY,OAAO,IAAI,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAA,CAAC,CAAC;AAEvG,MAAM,UAAU,mBAAmB,CAAC,QAAgB;IAClD,MAAM,IAAI,GAAG,mBAAmB,CAAC,QAAQ,CAAC,CAAA;IAC1C,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAA;IAClC,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAoB,CAAA;QACvE,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK;YAAE,OAAO,IAAI,CAAA;QAC5E,OAAO,KAAK,CAAA;IACd,CAAC;IAAC,MAAM,CAAC;QAAC,OAAO,IAAI,CAAA;IAAC,CAAC;AACzB,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,MAAc,EAAE,UAAsB,EAAE,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;IACpG,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAA;IAC7E,OAAO,WAAW,CAAC;QACjB,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC;QACrC,GAAG;QACH,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE;QACrB,IAAI,EAAE,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC;QAC9B,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE;QACrB,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE;QACzB,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE;QAC7B,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE;QACzB,MAAM;KACP,CAAc,CAAA;AACjB,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,MAAc,EAAE,UAAiF,EAAE;IACxI,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,IAAI,GAAG,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;IAC9D,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,MAAM,CAAC,gBAAgB,CAAA;IAC9D,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;IAC/E,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;QAClD,IAAI,KAAK,CAAC,GAAG,IAAI,SAAS,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,IAAI,CAAC;YAAE,OAAO,KAAK,CAAA;QAC1E,MAAM,MAAM,GAAG,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;QAC/F,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAA;QAC1E,IAAI,OAAO,CAAC,KAAK,IAAI,KAAK,KAAK,OAAO,CAAC,KAAK;YAAE,OAAO,KAAK,CAAA;QAC1D,IAAI,OAAO,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,OAAO,CAAC,IAAI,GAAG,CAAC;YAAE,OAAO,KAAK,CAAA;QAC5E,OAAO,IAAI,CAAA;IACb,CAAC,CAAC,CAAC,OAAO,EAAE,CAAA;IACZ,MAAM,IAAI,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAA;IACvC,OAAO;QACL,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;YACxB,MAAM,MAAM,GAAG,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;YAC/F,OAAO,EAAE,KAAK,EAAE,WAAW,CAAC,KAAK,CAAc,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,CAAA;QAChI,CAAC,CAAC;QACF,aAAa,EAAE,UAAU,CAAC,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI;KAC3E,CAAA;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,UAAsB,EACtB,MAAc,EACd,QAAgB,EAChB,MAAmB,EACnB,UAA+F,EAAE;IAEjG,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,WAAW,CAAA;IACxC,MAAM,KAAK,GAAG,UAAU,EAAE,CAAA;IAC1B,MAAM,MAAM,GAAG,YAAY,CAAC,CAAC,OAAO,EAAE,QAAQ,EAAE,EAAE,GAAG,KAAK,KAAK,CAAC,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,CAAC,CAAA,CAAC,CAAC,CAAC,CAAA;IAChH,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,CAAA,CAAC,CAAC,CAAC,CAAA;IAC/H,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,EAAE,CAAA;IAChC,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ;QAAE,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAA;IACtG,MAAM,QAAQ,GAAoB,EAAE,GAAG,EAAE,UAAU,IAAI,IAAI,OAAO,CAAC,IAAI,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,KAAK,EAAE,CAAA;IAC/H,MAAM,YAAY,GAAG,mBAAmB,CAAC,QAAQ,CAAC,CAAA;IAClD,aAAa,CAAC,YAAY,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAA;IACtF,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO;QAAE,SAAS,CAAC,YAAY,EAAE,KAAK,CAAC,CAAA;IAChE,OAAO,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,CAAA;IAC/B,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;QAClC,MAAM,IAAI,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAA;QAChD,IAAI,MAAM,CAAC,OAAO;YAAE,IAAI,EAAE,CAAC;;YAAM,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAA;IACzF,CAAC,CAAC,CAAA;IACF,MAAM,CAAC,YAAY,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;AACvC,CAAC;AAED,KAAK,UAAU,KAAK,CAAC,OAAwB,EAAE,QAAwB,EAAE,UAAsB,EAAE,MAAc,EAAE,KAAa;IAC5H,UAAU,CAAC,QAAQ,CAAC,CAAA;IACpB,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,IAAI,GAAG,EAAE,kBAAkB,CAAC,CAAA;IAC3D,IAAI,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QACrC,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,EAAE,KAAK,CAAC,EAAE,CAAC;YAAC,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,8BAA8B,EAAE,CAAC,CAAC;YAAC,OAAM;QAAC,CAAC;QACpH,IAAI,OAAO,CAAC,MAAM,KAAK,KAAK,IAAI,GAAG,CAAC,QAAQ,KAAK,eAAe,EAAE,CAAC;YAAC,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE,eAAe,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC;YAAC,OAAM;QAAC,CAAC;QAC1I,IAAI,OAAO,CAAC,MAAM,KAAK,KAAK,IAAI,GAAG,CAAC,QAAQ,KAAK,iBAAiB,EAAE,CAAC;YACnE,MAAM,OAAO,GAA0E,EAAE,CAAA;YACzF,MAAM,SAAS,GAAG,eAAe,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC;YAAC,IAAI,SAAS;gBAAE,OAAO,CAAC,SAAS,GAAG,SAAS,CAAA;YAClH,MAAM,KAAK,GAAG,eAAe,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;YAAC,IAAI,KAAK;gBAAE,OAAO,CAAC,KAAK,GAAG,KAAK,CAAA;YAC9F,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;YAAC,IAAI,KAAK;gBAAE,OAAO,CAAC,KAAK,GAAG,KAAK,CAAA;YACvF,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;YAAC,IAAI,IAAI;gBAAE,OAAO,CAAC,IAAI,GAAG,IAAI,CAAA;YAClF,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE,sBAAsB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;YAChE,OAAM;QACR,CAAC;QACD,IAAI,OAAO,CAAC,MAAM,KAAK,KAAK,IAAI,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,gBAAgB,CAAC,EAAE,CAAC;YAC1E,MAAM,MAAM,GAAG,kBAAkB,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAA;YAC9E,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;YAChC,IAAI,CAAC,IAAI,EAAE,CAAC;gBAAC,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,gBAAgB,EAAE,CAAC,CAAC;gBAAC,OAAM;YAAC,CAAC;YAC3E,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE,WAAW,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAA;YACpF,OAAM;QACR,CAAC;QACD,IAAI,OAAO,CAAC,MAAM,KAAK,MAAM,IAAI,GAAG,CAAC,QAAQ,KAAK,UAAU,EAAE,CAAC;YAC7D,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,CAAA;YACpC,MAAM,OAAO,GAAG,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAA;YAC3E,IAAI,CAAC,OAAO,EAAE,CAAC;gBAAC,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,qBAAqB,EAAE,CAAC,CAAC;gBAAC,OAAM;YAAC,CAAC;YACnF,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,KAAK,IAAI,IAAI,IAAI,CAAC,KAAK,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,KAAK,UAAU,CAAC,CAAA;YACvH,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAA;YACjG,OAAM;QACR,CAAC;QACD,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC;QAAC,OAAM;IACzD,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,KAAK,KAAK,IAAI,OAAO,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;QAAC,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;QAAC,QAAQ,CAAC,GAAG,EAAE,CAAC;QAAC,OAAM;IAAC,CAAC;IAC9G,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ,KAAK,GAAG,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAA;IAClG,IAAI,QAAQ,KAAK,YAAY;QAAE,QAAQ,CAAC,SAAS,CAAC,YAAY,EAAE,gBAAgB,KAAK,qCAAqC,CAAC,CAAA;IAC3H,MAAM,IAAI,GAAG,IAAI,CAAC,eAAe,EAAE,QAAQ,CAAC,CAAA;IAC5C,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC;QACvF,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,EAAE,YAAY,CAAC,CAAA;QACpD,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAAC,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;YAAC,QAAQ,CAAC,GAAG,CAAC,kDAAkD,CAAC,CAAC;YAAC,OAAM;QAAC,CAAC;QAChI,SAAS,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,CAAC,MAAM,KAAK,MAAM,CAAC,CAAA;QACxD,OAAM;IACR,CAAC;IACD,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,OAAO,CAAC,MAAM,KAAK,MAAM,CAAC,CAAA;AACtD,CAAC;AAED,SAAS,iBAAiB,CAAC,IAAY;IACrC,IAAI,CAAC,oBAAoB,EAAE,sBAAsB,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO,KAAK,CAAA;IAC/E,OAAO,CAAC,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAA;AAC9K,CAAC;AAED,SAAS,eAAe,CAAC,KAAoB,IAAwB,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAA,CAAC,CAAC;AACvK,SAAS,QAAQ,CAAC,KAAoB,IAAwB,MAAM,MAAM,GAAG,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAA,CAAC,CAAC;AAEhI,SAAS,UAAU,CAAC,OAAwB,EAAE,GAAQ,EAAE,KAAa;IACnE,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,aAAa,EAAE,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;IAC3G,IAAI,QAAQ,KAAK,KAAK;QAAE,OAAO,IAAI,CAAA;IACnC,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC,EAAE,KAAK,CAAC,eAAe,CAAC,MAAM,CAAC,CAAA;IACrK,IAAI,WAAW,KAAK,KAAK;QAAE,OAAO,IAAI,CAAA;IACtC,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,CAAA;IACvC,OAAO,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,UAAU,CAAC,UAAU,OAAO,CAAC,OAAO,CAAC,IAAI,GAAG,CAAC,CAAC,CAAA;AAClF,CAAC;AAED,SAAS,SAAS,CAAC,QAAwB,EAAE,IAAY,EAAE,IAAa;IACtE,MAAM,KAAK,GAA2B,EAAE,OAAO,EAAE,0BAA0B,EAAE,KAAK,EAAE,gCAAgC,EAAE,MAAM,EAAE,yBAAyB,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,EAAE,kBAAkB,EAAE,CAAA;IACnO,QAAQ,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,0BAA0B,EAAE,eAAe,EAAE,OAAO,CAAC,IAAI,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,qCAAqC,EAAE,CAAC,CAAA;IAChM,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAA;AACrD,CAAC;AAED,SAAS,UAAU,CAAC,QAAwB;IAC1C,QAAQ,CAAC,SAAS,CAAC,yBAAyB,EAAE,+JAA+J,CAAC,CAAA;IAC9M,QAAQ,CAAC,SAAS,CAAC,iBAAiB,EAAE,aAAa,CAAC,CAAA;IACpD,QAAQ,CAAC,SAAS,CAAC,wBAAwB,EAAE,SAAS,CAAC,CAAA;IACvD,QAAQ,CAAC,SAAS,CAAC,iBAAiB,EAAE,MAAM,CAAC,CAAA;AAC/C,CAAC;AAED,SAAS,QAAQ,CAAC,QAAwB,EAAE,MAAc,EAAE,KAAc;IACxE,QAAQ,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,cAAc,EAAE,iCAAiC,EAAE,eAAe,EAAE,UAAU,EAAE,CAAC,CAAA;IAC9G,QAAQ,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;AAC5C,CAAC;AAED,KAAK,UAAU,QAAQ,CAAC,OAAwB;IAC9C,IAAI,IAAI,GAAG,EAAE,CAAA;IACb,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAClC,IAAI,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAA;QACxB,IAAI,IAAI,CAAC,MAAM,GAAG,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAA;IACxE,CAAC;IACD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,IAAI,CAAC,CAAA;IACvC,OAAO,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAiC,CAAC,CAAC,CAAC,EAAE,CAAA;AAChH,CAAC"}
|
|
@@ -7,6 +7,7 @@ export interface GoalSnapshot {
|
|
|
7
7
|
id: string;
|
|
8
8
|
parentId: string | null;
|
|
9
9
|
objective: string;
|
|
10
|
+
observationMethod: string | null;
|
|
10
11
|
owner: string;
|
|
11
12
|
phase: GoalPhase;
|
|
12
13
|
revision: number;
|
|
@@ -46,6 +47,7 @@ export interface DelegationRequest {
|
|
|
46
47
|
childGoal: {
|
|
47
48
|
id: string;
|
|
48
49
|
objective: string;
|
|
50
|
+
observationMethod: string;
|
|
49
51
|
owner: string;
|
|
50
52
|
};
|
|
51
53
|
brief: JsonValue;
|
|
@@ -72,6 +74,12 @@ export interface ReassignmentResult {
|
|
|
72
74
|
mail: MailSnapshot[];
|
|
73
75
|
wake: WakeSnapshot;
|
|
74
76
|
}
|
|
77
|
+
export interface GoalCompletionRequest {
|
|
78
|
+
goalId: string;
|
|
79
|
+
revision: number;
|
|
80
|
+
reason: string;
|
|
81
|
+
evidence: number[];
|
|
82
|
+
}
|
|
75
83
|
export type TeamMemberStatus = "running" | "queued" | "scheduled" | "waiting" | "blocked" | "idle_unplanned" | "retired";
|
|
76
84
|
export interface TeamMemberView {
|
|
77
85
|
agent: string;
|
|
@@ -124,7 +132,7 @@ export interface RunnerTraceEvent {
|
|
|
124
132
|
data: JsonValue;
|
|
125
133
|
}
|
|
126
134
|
export type AgentRole = "child" | "ceo" | "verifier" | "audit";
|
|
127
|
-
export type AgentCapability = "ledger.search" | "mail.send" | "schedule.set" | "action.submit" | "audit.ack" | "audit.write" | "goal.put" | "team.list" | "goal.delegate" | "goal.reassign" | "goal.pause" | "goal.resume" | "goal.complete" | "human.request";
|
|
135
|
+
export type AgentCapability = "ledger.search" | "mail.send" | "schedule.set" | "action.submit" | "audit.ack" | "audit.write" | "goal.put" | "team.list" | "goal.delegate" | "goal.reassign" | "goal.revise" | "goal.pause" | "goal.resume" | "goal.complete" | "human.request";
|
|
128
136
|
export interface AgentProfile {
|
|
129
137
|
agent: string;
|
|
130
138
|
role: AgentRole;
|
|
@@ -197,6 +205,7 @@ export interface Ledger extends EventStore {
|
|
|
197
205
|
putGoal(goal: GoalSnapshot, actor: string, wakeId?: string): EventRecord;
|
|
198
206
|
commitDelegation(request: DelegationRequest, actor: string, wakeId?: string): DelegationResult;
|
|
199
207
|
commitReassignment(request: ReassignmentRequest, actor: string, wakeId?: string): ReassignmentResult;
|
|
208
|
+
completeGoal(request: GoalCompletionRequest, actor: string, wakeId?: string): GoalSnapshot;
|
|
200
209
|
putSchedule(schedule: ScheduleSnapshot, actor: string, wakeId?: string): EventRecord;
|
|
201
210
|
enqueueWake(wake: WakeSnapshot, actor: string): {
|
|
202
211
|
event: EventRecord;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"execution.d.ts","sourceRoot":"","sources":["../src/execution.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,KAAK,UAAU,EAAE,KAAK,WAAW,EAAE,KAAK,UAAU,EAAE,KAAK,SAAS,EAAE,MAAM,aAAa,CAAC;AACnH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAEjD,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,MAAM,GAAG,UAAU,GAAG,eAAe,CAAC;AACjG,MAAM,MAAM,YAAY,GAAG,WAAW,GAAG,UAAU,GAAG,aAAa,GAAG,WAAW,GAAG,QAAQ,GAAG,SAAS,CAAC;AACzG,MAAM,MAAM,SAAS,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,UAAU,CAAC;AACrE,MAAM,WAAW,YAAY;IAAG,EAAE,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,SAAS,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE;
|
|
1
|
+
{"version":3,"file":"execution.d.ts","sourceRoot":"","sources":["../src/execution.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,KAAK,UAAU,EAAE,KAAK,WAAW,EAAE,KAAK,UAAU,EAAE,KAAK,SAAS,EAAE,MAAM,aAAa,CAAC;AACnH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAEjD,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,MAAM,GAAG,UAAU,GAAG,eAAe,CAAC;AACjG,MAAM,MAAM,YAAY,GAAG,WAAW,GAAG,UAAU,GAAG,aAAa,GAAG,WAAW,GAAG,QAAQ,GAAG,SAAS,CAAC;AACzG,MAAM,MAAM,SAAS,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,UAAU,CAAC;AACrE,MAAM,WAAW,YAAY;IAAG,EAAE,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,SAAS,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE;AAC7K,MAAM,WAAW,gBAAgB;IAAG,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE;AAClH,MAAM,WAAW,YAAY;IAAG,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,UAAU,CAAC;IAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE;AAC3Q,MAAM,MAAM,SAAS,GAAG,KAAK,GAAG,UAAU,GAAG,WAAW,CAAC;AACzD,MAAM,WAAW,YAAY;IAAG,EAAE,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,SAAS,CAAC;IAAC,IAAI,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE;AAChI,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,iBAAiB,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IACvF,KAAK,EAAE,SAAS,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AACD,MAAM,WAAW,gBAAgB;IAAG,YAAY,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,YAAY,CAAC;IAAC,IAAI,EAAE,YAAY,CAAC;IAAC,IAAI,EAAE,YAAY,CAAA;CAAE;AACtH,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,SAAS,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AACD,MAAM,WAAW,kBAAkB;IAAG,cAAc,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,YAAY,CAAC;IAAC,IAAI,EAAE,YAAY,EAAE,CAAC;IAAC,IAAI,EAAE,YAAY,CAAA;CAAE;AAC5H,MAAM,WAAW,qBAAqB;IAAG,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;CAAE;AAC/G,MAAM,MAAM,gBAAgB,GAAG,SAAS,GAAG,QAAQ,GAAG,WAAW,GAAG,SAAS,GAAG,SAAS,GAAG,gBAAgB,GAAG,SAAS,CAAC;AACzH,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,MAAM,EAAE,gBAAgB,CAAC;IACzB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,cAAc,EAAE,UAAU,GAAG,IAAI,CAAC;IAClC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AACD,MAAM,WAAW,WAAW;IAAG,EAAE,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,SAAS,CAAC;IAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;CAAE;AAC5F,MAAM,WAAW,cAAc;IAAG,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,EAAE,CAAC;IAAC,KAAK,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,YAAY,CAAC;IAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,WAAW,EAAE,WAAW,GAAG,IAAI,CAAC;IAAC,WAAW,EAAE,OAAO,CAAA;CAAE;AAC5S,MAAM,WAAW,OAAO;IAAG,YAAY,EAAE,MAAM,EAAE,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAC;IAAC,SAAS,EAAE,MAAM,EAAE,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAE;AACjI,MAAM,WAAW,SAAS;IAAG,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,SAAS,CAAC;IAAC,IAAI,EAAE,SAAS,CAAA;CAAE;AAC5E,MAAM,WAAW,UAAU;IAAG,OAAO,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,SAAS,EAAE,CAAC;IAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE;AAC9F,MAAM,WAAW,gBAAgB;IAAG,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,SAAS,CAAA;CAAE;AAEnE,MAAM,MAAM,SAAS,GAAG,OAAO,GAAG,KAAK,GAAG,UAAU,GAAG,OAAO,CAAC;AAC/D,MAAM,MAAM,eAAe,GAAG,eAAe,GAAG,WAAW,GAAG,cAAc,GAAG,eAAe,GAAG,WAAW,GAAG,aAAa,GAAG,UAAU,GACrI,WAAW,GAAG,eAAe,GAAG,eAAe,GAAG,aAAa,GAAG,YAAY,GAAG,aAAa,GAAG,eAAe,GAAG,eAAe,CAAC;AACvI,MAAM,WAAW,YAAY;IAAG,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,SAAS,CAAC;IAAC,YAAY,CAAC,EAAE,eAAe,EAAE,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAA;CAAE;AACzH,MAAM,WAAW,UAAU;IAAG,IAAI,EAAE,YAAY,CAAC;IAAC,OAAO,EAAE,SAAS,CAAC;IAAC,GAAG,IAAI,MAAM,CAAC;IAAC,IAAI,CAAC,KAAK,EAAE,gBAAgB,GAAG,IAAI,CAAC;IAAC,GAAG,CAAC,CAAC,MAAM,EAAE,eAAe,EAAE,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC,CAAA;CAAE;AAChM,MAAM,MAAM,YAAY,GAAG;IAAE,OAAO,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,UAAU,CAAA;CAAE,GAAG;IAAE,OAAO,EAAE,UAAU,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAChH,MAAM,WAAW,YAAY;IAAG,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,KAAK,IAAI,IAAI,CAAC;IAAC,MAAM,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;IAAC,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;CAAE;AAC9H,MAAM,WAAW,MAAM;IAAG,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC;IAAC,OAAO,CAAC,OAAO,EAAE,UAAU,GAAG,YAAY,CAAC;IAAC,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CAAE;AAEnJ,MAAM,WAAW,mBAAmB;IAAG,IAAI,EAAE,MAAM,CAAC;IAAC,iBAAiB,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,oBAAoB,GAAG,iBAAiB,GAAG,MAAM,CAAC;IAAC,cAAc,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,YAAY,GAAG,OAAO,GAAG,cAAc,CAAA;CAAE;AACnN,MAAM,WAAW,iBAAiB;IAAG,eAAe,EAAE,OAAO,gBAAgB,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,OAAO,CAAC;IAAC,YAAY,EAAE,mBAAmB,EAAE,CAAA;CAAE;AACxJ,MAAM,WAAW,uBAAuB;IAAG,MAAM,EAAE,WAAW,GAAG,QAAQ,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE;AACjG,MAAM,WAAW,oBAAoB;IAAG,MAAM,EAAE,WAAW,GAAG,QAAQ,GAAG,SAAS,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE;AAC1G,MAAM,WAAW,oBAAoB;IAAG,QAAQ,EAAE,iBAAiB,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE;AACxJ,MAAM,WAAW,aAAa;IAAG,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,UAAU,CAAC;IAAC,YAAY,EAAE,YAAY,EAAE,CAAC;IAAC,QAAQ,EAAE,gBAAgB,GAAG,IAAI,CAAA;CAAE;AAEjK,6EAA6E;AAC7E,MAAM,WAAW,MAAO,SAAQ,UAAU;IACxC,OAAO,CAAC,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,WAAW,CAAC;IACzE,gBAAgB,CAAC,OAAO,EAAE,iBAAiB,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,gBAAgB,CAAC;IAC/F,kBAAkB,CAAC,OAAO,EAAE,mBAAmB,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,kBAAkB,CAAC;IACrG,YAAY,CAAC,OAAO,EAAE,qBAAqB,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,YAAY,CAAC;IAC3F,WAAW,CAAC,QAAQ,EAAE,gBAAgB,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,WAAW,CAAC;IACrF,WAAW,CAAC,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,GAAG;QAAE,KAAK,EAAE,WAAW,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC;IACzF,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,CAAC;IACxF,eAAe,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,YAAY,CAAC;IAC3E,iBAAiB,CAAC,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,YAAY,CAAC;IAC1F,cAAc,CAAC,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,YAAY,CAAC;IAC9F,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,UAAU,GAAG,eAAe,EAAE,GAAG,EAAE,MAAM,GAAG,YAAY,CAAC;IACjG,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,YAAY,EAAE,CAAC;IAC1C,kBAAkB,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,YAAY,CAAC;IAC1D,iBAAiB,CAAC,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,GAAG,WAAW,CAAC;IACtE,aAAa,CAAC,MAAM,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,WAAW,CAAC;IACnF,aAAa,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,cAAc,CAAC;IAChG,YAAY,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,cAAc,CAAC;IAC/F,gBAAgB,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,KAAK,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,cAAc,EAAE,aAAa,GAAG,cAAc,CAAC,CAAC,GAAG,cAAc,CAAC;IAC1I,yBAAyB,IAAI,cAAc,EAAE,CAAC;IAC9C,cAAc,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,cAAc,CAAC;IAC7F,cAAc,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,cAAc,CAAC;IAC1D,OAAO,CAAC,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,WAAW,CAAC;IACzE,aAAa,CAAC,MAAM,EAAE,aAAa,GAAG,WAAW,CAAC;IAClD,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,gBAAgB,EAAE,CAAC;IAC9C,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,YAAY,EAAE,CAAC;IAC1C,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,cAAc,EAAE,CAAC;IACpD,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAAC;IAC3D,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,WAAW,EAAE,CAAC;IAC7C,IAAI,CAAC,EAAE,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,CAAC;IACtC,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,CAAC;IACtE,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,CAAC;IACvD,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI,CAAC;IAC1C,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,YAAY,EAAE,CAAC;IAC7C,IAAI,CAAC,EAAE,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,CAAC;IACtC,cAAc,IAAI,YAAY,EAAE,CAAC;IACjC,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,WAAW,EAAE,CAAC;IAC3D,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,YAAY,EAAE,CAAC;IAC9C,KAAK,IAAI,YAAY,EAAE,CAAC;IACxB,SAAS,IAAI,gBAAgB,EAAE,CAAC;IAChC,KAAK,IAAI,YAAY,EAAE,CAAC;IACxB,OAAO,IAAI,cAAc,EAAE,CAAC;IAC5B,OAAO,IAAI,YAAY,EAAE,CAAC;IAC1B,kBAAkB,IAAI,IAAI,CAAC;IAC3B,KAAK,IAAI,IAAI,CAAC;CACf;AAKD,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,UAAU,GAAG,IAAI,CAA2G;AACvL,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,YAAY,EAAE,EAAE,EAAE,YAAY,GAAG,IAAI,CAA+G;AACjM,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS,GAAG,IAAI,CAA0H;AACpM,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAA6M;AAChQ,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,cAAc,GAAG,IAAI,CAAyZ;AACzd,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,YAAY,GAAG,IAAI,CAK5D;AACD,wBAAgB,aAAa,CAAC,QAAQ,EAAE,iBAAiB,EAAE,IAAI,EAAE,MAAM,GAAG,mBAAmB,GAAG,IAAI,CAAyF"}
|
|
@@ -15,8 +15,15 @@ export function assertActionRequest(value) { if (!value.reason.trim())
|
|
|
15
15
|
throw new Error("new action must be requested"); if (!value.connector.trim())
|
|
16
16
|
throw new Error("action connector is required"); if (value.reconciledAt !== null)
|
|
17
17
|
throw new Error("requested action cannot be reconciled"); }
|
|
18
|
-
export function assertGoalSnapshot(value) {
|
|
19
|
-
|
|
20
|
-
|
|
18
|
+
export function assertGoalSnapshot(value) {
|
|
19
|
+
if (!value.objective.trim() || !value.owner.trim())
|
|
20
|
+
throw new Error("goal objective and owner are required");
|
|
21
|
+
if (value.observationMethod !== null && !value.observationMethod.trim())
|
|
22
|
+
throw new Error("goal observation method cannot be blank");
|
|
23
|
+
if (value.parentId !== null && value.observationMethod === null)
|
|
24
|
+
throw new Error("child goal observation method is required");
|
|
25
|
+
if (!["active", "paused", "blocked", "complete"].includes(value.phase))
|
|
26
|
+
throw new Error(`invalid goal phase: ${value.phase}`);
|
|
27
|
+
}
|
|
21
28
|
export function capabilityFor(manifest, kind) { return manifest.capabilities.find((capability) => capability.kind === kind) ?? null; }
|
|
22
29
|
//# sourceMappingURL=execution.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"execution.js","sourceRoot":"","sources":["../src/execution.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"execution.js","sourceRoot":"","sources":["../src/execution.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export declare const CONTRACT_VERSION: "0.
|
|
1
|
+
export declare const CONTRACT_VERSION: "0.5.0";
|
|
2
2
|
export declare const CONTRACT_STABILITY: "experimental";
|
|
3
3
|
export type JsonPrimitive = string | number | boolean | null;
|
|
4
4
|
export type JsonValue = JsonPrimitive | JsonValue[] | {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export const CONTRACT_VERSION = "0.
|
|
1
|
+
export const CONTRACT_VERSION = "0.5.0";
|
|
2
2
|
export const CONTRACT_STABILITY = "experimental";
|
|
3
3
|
export function wakeStream(wakeId) { return `wake:${wakeId}`; }
|
|
4
4
|
export function controlStream(actor = "supervisor") { return `control:${actor}`; }
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "goah-ledger-contract",
|
|
3
3
|
"private": true,
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.5.0",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"repository": {
|
|
7
7
|
"type": "git",
|
|
8
|
-
"url": "git+https://github.com/billc8128/
|
|
8
|
+
"url": "git+https://github.com/billc8128/opengoah.git",
|
|
9
9
|
"directory": "packages/ledger-contract"
|
|
10
10
|
},
|
|
11
11
|
"engines": {
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { DatabaseSync } from "node:sqlite";
|
|
2
|
-
import { type ActionSnapshot, type ActionStatus, type AuditAdvice, type Clock, type DelegationRequest, type DelegationResult, type EventInput, type EventRecord, type GoalSnapshot, type HandoffCommit, type Ledger, type MailSnapshot, type MetricSample, type ReassignmentRequest, type ReassignmentResult, type ScheduleSnapshot, type WakeSnapshot } from "goah-ledger-contract";
|
|
2
|
+
import { type ActionSnapshot, type ActionStatus, type AuditAdvice, type Clock, type DelegationRequest, type DelegationResult, type EventInput, type EventRecord, type GoalSnapshot, type GoalCompletionRequest, type HandoffCommit, type Ledger, type MailSnapshot, type MetricSample, type ReassignmentRequest, type ReassignmentResult, type ScheduleSnapshot, type WakeSnapshot } from "goah-ledger-contract";
|
|
3
3
|
type FaultPoint = "after_event_before_projection" | "after_delegation_event" | "after_reassignment_event";
|
|
4
4
|
type FaultInjector = (point: FaultPoint) => void;
|
|
5
|
-
export declare const SQLITE_SCHEMA_VERSION =
|
|
5
|
+
export declare const SQLITE_SCHEMA_VERSION = 8;
|
|
6
6
|
export interface SqliteLedgerOptions {
|
|
7
7
|
faultInjector?: FaultInjector;
|
|
8
8
|
clock?: Clock;
|
|
@@ -19,6 +19,7 @@ export declare class SqliteLedger implements Ledger {
|
|
|
19
19
|
putGoal(goal: GoalSnapshot, actor: string, wakeId?: string): EventRecord;
|
|
20
20
|
commitDelegation(request: DelegationRequest, actor: string, wakeId?: string): DelegationResult;
|
|
21
21
|
commitReassignment(request: ReassignmentRequest, actor: string, wakeId?: string): ReassignmentResult;
|
|
22
|
+
completeGoal(request: GoalCompletionRequest, actor: string, wakeId?: string): GoalSnapshot;
|
|
22
23
|
putSchedule(value: ScheduleSnapshot, actor: string, wakeId?: string): EventRecord;
|
|
23
24
|
enqueueWake(input: WakeSnapshot, actor: string): {
|
|
24
25
|
event: EventRecord;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAKL,KAAK,cAAc,EACnB,KAAK,YAAY,EACjB,KAAK,WAAW,EAChB,KAAK,KAAK,EAEV,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,EACrB,KAAK,UAAU,EACf,KAAK,WAAW,EAEhB,KAAK,YAAY,EACjB,KAAK,aAAa,EAElB,KAAK,MAAM,EACX,KAAK,YAAY,EACjB,KAAK,YAAY,EACjB,KAAK,mBAAmB,EACxB,KAAK,kBAAkB,EACvB,KAAK,gBAAgB,EACrB,KAAK,YAAY,EAElB,MAAM,sBAAsB,CAAC;AAE9B,KAAK,UAAU,GAAG,+BAA+B,GAAG,wBAAwB,GAAG,0BAA0B,CAAC;AAC1G,KAAK,aAAa,GAAG,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAC;AAIjD,eAAO,MAAM,qBAAqB,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import { DatabaseSync } from "node:sqlite";
|
|
2
2
|
import { assertActionRequest, assertActionTransition, assertGoalSnapshot, assertGoalTransition, controlStream, goalStream, wakeStream, } from "goah-ledger-contract";
|
|
3
|
-
export const SQLITE_SCHEMA_VERSION =
|
|
3
|
+
export const SQLITE_SCHEMA_VERSION = 8;
|
|
4
4
|
const createGoals = `CREATE TABLE IF NOT EXISTS goals (
|
|
5
5
|
id TEXT PRIMARY KEY,
|
|
6
6
|
parent_id TEXT REFERENCES goals(id),
|
|
7
7
|
objective TEXT NOT NULL,
|
|
8
|
+
observation_method TEXT CHECK(observation_method IS NULL OR length(trim(observation_method)) > 0),
|
|
8
9
|
owner TEXT NOT NULL,
|
|
9
10
|
phase TEXT NOT NULL CHECK(phase IN ('active','paused','blocked','complete')),
|
|
10
11
|
revision INTEGER NOT NULL CHECK(revision >= 0)
|
|
@@ -154,18 +155,16 @@ export class SqliteLedger {
|
|
|
154
155
|
if (current) {
|
|
155
156
|
if (goal.revision !== current.revision + 1)
|
|
156
157
|
throw new Error("goal revision CAS failed");
|
|
158
|
+
if (current.phase === "complete")
|
|
159
|
+
throw new Error("completed goal cannot be modified");
|
|
157
160
|
if (goal.parentId !== current.parentId)
|
|
158
161
|
throw new Error("goal reparenting is not supported");
|
|
162
|
+
if (goal.phase === "complete")
|
|
163
|
+
throw new Error("goal completion requires reason and evidence");
|
|
164
|
+
if (goal.objective !== current.objective && current.observationMethod !== null && goal.observationMethod === current.observationMethod)
|
|
165
|
+
throw new Error("objective revision must replace or invalidate the observation method");
|
|
159
166
|
assertGoalTransition(current.phase, goal.phase);
|
|
160
167
|
this.#assertGoalAuthority(current.parentId, actor);
|
|
161
|
-
if (current.parentId === null && goal.phase === "complete") {
|
|
162
|
-
const open = this.db.prepare(`WITH RECURSIVE descendants(id) AS (
|
|
163
|
-
SELECT id FROM goals WHERE parent_id=?
|
|
164
|
-
UNION ALL SELECT g.id FROM goals g JOIN descendants d ON g.parent_id=d.id
|
|
165
|
-
) SELECT 1 FROM goals WHERE id IN (SELECT id FROM descendants) AND phase<>'complete' LIMIT 1`).get(goal.id);
|
|
166
|
-
if (open)
|
|
167
|
-
throw new Error("root goal cannot complete while descendants remain non-complete");
|
|
168
|
-
}
|
|
169
168
|
}
|
|
170
169
|
else {
|
|
171
170
|
if (goal.revision !== 0)
|
|
@@ -177,13 +176,13 @@ export class SqliteLedger {
|
|
|
177
176
|
commitDelegation(request, actor, wakeId) {
|
|
178
177
|
const existing = this.#delegationResult(request.id);
|
|
179
178
|
if (existing) {
|
|
180
|
-
if (existing.goal.id !== request.childGoal.id || existing.goal.parentId !== request.parentGoalId || existing.goal.objective !== request.childGoal.objective || existing.goal.owner !== request.childGoal.owner)
|
|
179
|
+
if (existing.goal.id !== request.childGoal.id || existing.goal.parentId !== request.parentGoalId || existing.goal.objective !== request.childGoal.objective || existing.goal.observationMethod !== request.childGoal.observationMethod || existing.goal.owner !== request.childGoal.owner)
|
|
181
180
|
throw new Error("delegation id was reused with a different child goal");
|
|
182
181
|
return existing;
|
|
183
182
|
}
|
|
184
183
|
if (!request.id.trim() || !request.reason.trim())
|
|
185
184
|
throw new Error("delegation id and reason are required");
|
|
186
|
-
if (!request.childGoal.id.trim() || !request.childGoal.objective.trim() || !request.childGoal.owner.trim())
|
|
185
|
+
if (!request.childGoal.id.trim() || !request.childGoal.objective.trim() || !request.childGoal.observationMethod.trim() || !request.childGoal.owner.trim())
|
|
187
186
|
throw new Error("delegation child goal is incomplete");
|
|
188
187
|
this.#assertEvidenceExists(request.evidence);
|
|
189
188
|
const parent = this.#getGoal(request.parentGoalId);
|
|
@@ -202,7 +201,7 @@ export class SqliteLedger {
|
|
|
202
201
|
to: goal.owner,
|
|
203
202
|
from: actor,
|
|
204
203
|
level: "decision",
|
|
205
|
-
body: { type: "delegation", delegationId: request.id, goalId: goal.id, parentGoalId: request.parentGoalId, brief: request.brief, reason: request.reason, evidence: request.evidence },
|
|
204
|
+
body: { type: "delegation", delegationId: request.id, goalId: goal.id, parentGoalId: request.parentGoalId, objective: goal.objective, observationMethod: goal.observationMethod, brief: request.brief, reason: request.reason, evidence: request.evidence },
|
|
206
205
|
readAt: null,
|
|
207
206
|
};
|
|
208
207
|
const wakeBase = {
|
|
@@ -273,6 +272,34 @@ export class SqliteLedger {
|
|
|
273
272
|
return { reassignmentId: request.id, goal, mail, wake };
|
|
274
273
|
});
|
|
275
274
|
}
|
|
275
|
+
completeGoal(request, actor, wakeId) {
|
|
276
|
+
if (!request.reason.trim())
|
|
277
|
+
throw new Error("goal completion reason is required");
|
|
278
|
+
this.#assertEvidenceExists(request.evidence);
|
|
279
|
+
const current = this.#getGoal(request.goalId);
|
|
280
|
+
if (!current)
|
|
281
|
+
throw new Error("goal does not exist");
|
|
282
|
+
if (request.revision !== current.revision)
|
|
283
|
+
throw new Error("goal completion revision is stale");
|
|
284
|
+
if (current.phase === "complete")
|
|
285
|
+
return current;
|
|
286
|
+
if (current.observationMethod === null)
|
|
287
|
+
throw new Error("goal completion requires an observation method");
|
|
288
|
+
this.#assertGoalAuthority(current.parentId, actor);
|
|
289
|
+
if (current.parentId === null && this.#hasNonCompleteDescendant(current.id))
|
|
290
|
+
throw new Error("root goal cannot complete while descendants remain non-complete");
|
|
291
|
+
const source = this.db.prepare("SELECT seq FROM events WHERE stream_id=? AND type='goal.put' AND json_extract(data,'$.snapshot.revision')=? ORDER BY seq DESC LIMIT 1").get(goalStream(current.id), current.revision);
|
|
292
|
+
if (!source)
|
|
293
|
+
throw new Error("goal revision has no source event");
|
|
294
|
+
if (request.evidence.some((seq) => seq <= source.seq))
|
|
295
|
+
throw new Error("goal completion evidence predates the current revision");
|
|
296
|
+
return this.#transaction(() => {
|
|
297
|
+
this.#insertEvent({ streamId: goalStream(current.id), ts: this.#now(), actor, type: "goal.completion_decided", data: { goalId: current.id, revision: current.revision, observationMethod: current.observationMethod, reason: request.reason, evidence: request.evidence } });
|
|
298
|
+
const next = { ...current, phase: "complete", revision: current.revision + 1 };
|
|
299
|
+
this.#recordProjection("goals", next, actor, "goal.put", wakeId, undefined, undefined, goalStream(current.id));
|
|
300
|
+
return next;
|
|
301
|
+
});
|
|
302
|
+
}
|
|
276
303
|
putSchedule(value, actor, wakeId) {
|
|
277
304
|
if (actor !== "supervisor" && actor !== value.agent)
|
|
278
305
|
throw new Error("schedule may only be set by its agent or supervisor");
|
|
@@ -544,6 +571,12 @@ export class SqliteLedger {
|
|
|
544
571
|
if (parent.owner !== actor)
|
|
545
572
|
throw new Error("only the parent goal owner may modify a child goal");
|
|
546
573
|
}
|
|
574
|
+
#hasNonCompleteDescendant(goalId) {
|
|
575
|
+
return Boolean(this.db.prepare(`WITH RECURSIVE descendants(id) AS (
|
|
576
|
+
SELECT id FROM goals WHERE parent_id=?
|
|
577
|
+
UNION ALL SELECT g.id FROM goals g JOIN descendants d ON g.parent_id=d.id
|
|
578
|
+
) SELECT 1 FROM goals WHERE id IN (SELECT id FROM descendants) AND phase<>'complete' LIMIT 1`).get(goalId));
|
|
579
|
+
}
|
|
547
580
|
#assertEvidenceExists(evidence) {
|
|
548
581
|
const exists = this.db.prepare("SELECT 1 FROM events WHERE seq=?");
|
|
549
582
|
for (const seq of evidence)
|
|
@@ -583,8 +616,9 @@ export class SqliteLedger {
|
|
|
583
616
|
}
|
|
584
617
|
#applyProjection(projection, raw, sourceSeq) {
|
|
585
618
|
if (projection === "goals") {
|
|
586
|
-
const
|
|
587
|
-
|
|
619
|
+
const old = raw;
|
|
620
|
+
const v = { ...old, observationMethod: old.observationMethod ?? null };
|
|
621
|
+
this.db.prepare(`INSERT INTO goals VALUES (?,?,?,?,?,?,?) ON CONFLICT(id) DO UPDATE SET parent_id=excluded.parent_id,objective=excluded.objective,observation_method=excluded.observation_method,owner=excluded.owner,phase=excluded.phase,revision=excluded.revision`).run(v.id, v.parentId, v.objective, v.observationMethod, v.owner, v.phase, v.revision);
|
|
588
622
|
}
|
|
589
623
|
else if (projection === "schedule") {
|
|
590
624
|
const v = raw;
|
|
@@ -614,6 +648,8 @@ export class SqliteLedger {
|
|
|
614
648
|
}
|
|
615
649
|
#migrateLegacy() {
|
|
616
650
|
this.#transaction(() => {
|
|
651
|
+
const goalColumns = new Set(this.db.prepare("PRAGMA table_info(goals)").all().map((row) => row.name));
|
|
652
|
+
const observationSource = goalColumns.has("observation_method") ? "observation_method" : "NULL";
|
|
617
653
|
this.db.exec(`PRAGMA defer_foreign_keys=ON;
|
|
618
654
|
DROP TRIGGER IF EXISTS events_no_update; DROP TRIGGER IF EXISTS events_no_delete; DROP TRIGGER IF EXISTS events_fts_insert;
|
|
619
655
|
DROP TRIGGER IF EXISTS wakes_valid_transition; DROP TRIGGER IF EXISTS actions_valid_transition; DROP TRIGGER IF EXISTS goals_valid_transition;
|
|
@@ -623,7 +659,7 @@ export class SqliteLedger {
|
|
|
623
659
|
DROP TABLE IF EXISTS events_fts;
|
|
624
660
|
|
|
625
661
|
ALTER TABLE goals RENAME TO goals_legacy; ${createGoals}
|
|
626
|
-
INSERT INTO goals(id,parent_id,objective,owner,phase,revision) SELECT id,parent_id,objective,owner,phase,revision FROM goals_legacy;
|
|
662
|
+
INSERT INTO goals(id,parent_id,objective,observation_method,owner,phase,revision) SELECT id,parent_id,objective,${observationSource},owner,phase,revision FROM goals_legacy;
|
|
627
663
|
DROP TABLE goals_legacy;`);
|
|
628
664
|
const wakeColumns = new Set(this.db.prepare("PRAGMA table_info(wakes)").all().map((row) => row.name));
|
|
629
665
|
if (!wakeColumns.has("enqueued_seq")) {
|
|
@@ -679,7 +715,7 @@ export class SqliteLedger {
|
|
|
679
715
|
#now() { return this.#clock.now().toISOString(); }
|
|
680
716
|
}
|
|
681
717
|
function mapEvent(r) { return { seq: Number(r.seq), streamId: String(r.stream_id), streamSeq: Number(r.stream_seq), ts: String(r.ts), actor: String(r.actor), type: String(r.type), data: JSON.parse(String(r.data)), ...(Number(r.ignorable) === 1 ? { ignorable: true } : {}) }; }
|
|
682
|
-
function mapGoal(r) { return { id: String(r.id), parentId: r.parent_id === null ? null : String(r.parent_id), objective: String(r.objective), owner: String(r.owner), phase: String(r.phase), revision: Number(r.revision) }; }
|
|
718
|
+
function mapGoal(r) { return { id: String(r.id), parentId: r.parent_id === null ? null : String(r.parent_id), objective: String(r.objective), observationMethod: r.observation_method === null || r.observation_method === undefined ? null : String(r.observation_method), owner: String(r.owner), phase: String(r.phase), revision: Number(r.revision) }; }
|
|
683
719
|
function mapSchedule(r) { return { id: String(r.id), agent: String(r.agent), nextWakeAt: String(r.next_wake_at), reason: String(r.reason), setBy: String(r.set_by) }; }
|
|
684
720
|
function mapWake(r) { return { id: String(r.id), agent: String(r.agent), triggerRef: String(r.trigger_ref), status: String(r.status), leaseUntil: r.lease_until === null ? null : String(r.lease_until), attempt: Number(r.attempt), startedAt: r.started_at === null ? null : String(r.started_at), endedAt: r.ended_at === null ? null : String(r.ended_at), enqueuedSeq: Number(r.enqueued_seq), leaseToken: r.lease_token === null ? null : String(r.lease_token), runnerPid: r.runner_pid === null ? null : Number(r.runner_pid) }; }
|
|
685
721
|
function mapMail(r) { return { id: String(r.id), to: String(r.to_agent), from: String(r.from_agent), level: String(r.level), body: JSON.parse(String(r.body)), readAt: r.read_at === null ? null : String(r.read_at) }; }
|