@guyghost/swarm-dao-product 0.2.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/README.md +29 -0
- package/dist/cli.d.ts +10 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +48 -0
- package/dist/cli.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -0
- package/dist/runner.d.ts +38 -0
- package/dist/runner.d.ts.map +1 -0
- package/dist/runner.js +155 -0
- package/dist/runner.js.map +1 -0
- package/dist/signal.d.ts +20 -0
- package/dist/signal.d.ts.map +1 -0
- package/dist/signal.js +376 -0
- package/dist/signal.js.map +1 -0
- package/package.json +53 -0
package/README.md
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# @guyghost/swarm-dao-product
|
|
2
|
+
|
|
3
|
+
Swarm DAO product-loop run executor.
|
|
4
|
+
|
|
5
|
+
Runs the frozen product-loop machine (in `@guyghost/swarm-dao-core`) as
|
|
6
|
+
journal-replayed runs on disk. Every submitted signal is validated against the
|
|
7
|
+
producer-bound authority table: a producer may only emit the event types its
|
|
8
|
+
graph node declares, AI signals never carry owner-authority keys, and system
|
|
9
|
+
evaluation events are emitted by the runner only.
|
|
10
|
+
|
|
11
|
+
## Usage
|
|
12
|
+
|
|
13
|
+
```ts
|
|
14
|
+
import { createProductRunner } from "@guyghost/swarm-dao-product";
|
|
15
|
+
|
|
16
|
+
const runner = await createProductRunner({ evidenceRoot: ".dao/product-loops", runId: "my-run" });
|
|
17
|
+
const result = await runner.submit(signal);
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
Or through the CLI entry:
|
|
21
|
+
|
|
22
|
+
```ts
|
|
23
|
+
import { runProductCli } from "@guyghost/swarm-dao-product";
|
|
24
|
+
const code = await runProductCli(["status", "--run-id", "my-run"]); // 0 | 1 | 2
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
The `swarm-dao` CLI exposes the same surface as `swarm-dao product
|
|
28
|
+
<init|status|submit>`; exit codes are 0 (success), 2 (machine rejection),
|
|
29
|
+
1 (usage or execution error).
|
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export interface ProductCliDefaults {
|
|
2
|
+
/** Evidence root used when --evidence-root is absent (resolved from cwd). */
|
|
3
|
+
evidenceRoot?: string;
|
|
4
|
+
}
|
|
5
|
+
/**
|
|
6
|
+
* Entry point for the `product:*` repo scripts and the swarm-dao CLI.
|
|
7
|
+
* Exit codes: 0 success, 2 machine rejection, 1 usage or execution error.
|
|
8
|
+
*/
|
|
9
|
+
export declare const runProductCli: (argv: readonly string[], defaults?: ProductCliDefaults) => Promise<number>;
|
|
10
|
+
//# sourceMappingURL=cli.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAaA,MAAM,WAAW,kBAAkB;IACjC,6EAA6E;IAC7E,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAMD;;;GAGG;AACH,eAAO,MAAM,aAAa,GAAU,MAAM,SAAS,MAAM,EAAE,EAAE,WAAU,kBAAuB,KAAG,OAAO,CAAC,MAAM,CA6B9G,CAAC"}
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
// Swarm DAO — Product loop run CLI.
|
|
2
|
+
//
|
|
3
|
+
// Thin host entry over ProductRunner: init/status/submit with the same
|
|
4
|
+
// exit-code contract as the graph and improvement CLIs (0 success, 2 machine
|
|
5
|
+
// rejection, 1 usage or execution error). Hosts stay free of transition
|
|
6
|
+
// rules — every submitted signal passes through validateProductSignal and the
|
|
7
|
+
// frozen product-loop machine.
|
|
8
|
+
import { readFile } from "node:fs/promises";
|
|
9
|
+
import { resolve } from "node:path";
|
|
10
|
+
import { parseArgs } from "node:util";
|
|
11
|
+
import { createProductRunner } from "./runner.js";
|
|
12
|
+
const usage = `Usage:
|
|
13
|
+
product <init|status|submit> --run-id <id> [--evidence-root <path>]
|
|
14
|
+
product submit --run-id <id> --signal <file> [--evidence-root <path>]`;
|
|
15
|
+
/**
|
|
16
|
+
* Entry point for the `product:*` repo scripts and the swarm-dao CLI.
|
|
17
|
+
* Exit codes: 0 success, 2 machine rejection, 1 usage or execution error.
|
|
18
|
+
*/
|
|
19
|
+
export const runProductCli = async (argv, defaults = {}) => {
|
|
20
|
+
const command = argv[0];
|
|
21
|
+
if (command !== "init" && command !== "status" && command !== "submit")
|
|
22
|
+
throw new Error(usage);
|
|
23
|
+
const { values } = parseArgs({
|
|
24
|
+
args: argv.slice(1),
|
|
25
|
+
strict: true,
|
|
26
|
+
options: {
|
|
27
|
+
"run-id": { type: "string" },
|
|
28
|
+
"evidence-root": { type: "string" },
|
|
29
|
+
signal: { type: "string" },
|
|
30
|
+
},
|
|
31
|
+
});
|
|
32
|
+
const runId = values["run-id"];
|
|
33
|
+
if (!runId)
|
|
34
|
+
throw new Error(`--run-id is required\n${usage}`);
|
|
35
|
+
const evidenceRoot = resolve(values["evidence-root"] ?? defaults.evidenceRoot ?? ".dao/product-loops");
|
|
36
|
+
if (command === "submit" && !values.signal)
|
|
37
|
+
throw new Error(`--signal is required\n${usage}`);
|
|
38
|
+
const runner = await createProductRunner({ evidenceRoot, runId });
|
|
39
|
+
if (command === "init" || command === "status") {
|
|
40
|
+
process.stdout.write(`${JSON.stringify(runner.snapshot(), null, 2)}\n`);
|
|
41
|
+
return 0;
|
|
42
|
+
}
|
|
43
|
+
const signal = JSON.parse(await readFile(resolve(values.signal), "utf8"));
|
|
44
|
+
const result = await runner.submit(signal);
|
|
45
|
+
process.stdout.write(`${JSON.stringify(result, null, 2)}\n`);
|
|
46
|
+
return result.accepted ? 0 : 2;
|
|
47
|
+
};
|
|
48
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA,oCAAoC;AACpC,EAAE;AACF,uEAAuE;AACvE,6EAA6E;AAC7E,wEAAwE;AACxE,8EAA8E;AAC9E,+BAA+B;AAE/B,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAOlD,MAAM,KAAK,GAAG;;wEAE0D,CAAC;AAEzE;;;GAGG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,KAAK,EAAE,IAAuB,EAAE,WAA+B,EAAE,EAAmB,EAAE;IACjH,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACxB,IAAI,OAAO,KAAK,MAAM,IAAI,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,QAAQ;QAAE,MAAM,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC;IAE/F,MAAM,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;QAC3B,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;QACnB,MAAM,EAAE,IAAI;QACZ,OAAO,EAAE;YACP,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;YAC5B,eAAe,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;YACnC,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;SAC3B;KACF,CAAC,CAAC;IACH,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC/B,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,KAAK,EAAE,CAAC,CAAC;IAE9D,MAAM,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,eAAe,CAAC,IAAI,QAAQ,CAAC,YAAY,IAAI,oBAAoB,CAAC,CAAC;IACvG,IAAI,OAAO,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,KAAK,EAAE,CAAC,CAAC;IAC9F,MAAM,MAAM,GAAG,MAAM,mBAAmB,CAAC,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC,CAAC;IAElE,IAAI,OAAO,KAAK,MAAM,IAAI,OAAO,KAAK,QAAQ,EAAE,CAAC;QAC/C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;QACxE,OAAO,CAAC,CAAC;IACX,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,MAAgB,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;IACpF,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC3C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;IAC7D,OAAO,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACjC,CAAC,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAKA,cAAc,UAAU,CAAC;AACzB,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
// @guyghost/swarm-dao-product — executor for Swarm DAO product-loop runs:
|
|
2
|
+
// journal-replayed runs over the frozen machine in @guyghost/swarm-dao-core,
|
|
3
|
+
// with strict signal validation (producer-bound authority; AI signals never
|
|
4
|
+
// carry votes, approvals, retries, or cancellations).
|
|
5
|
+
export * from "./cli.js";
|
|
6
|
+
export * from "./runner.js";
|
|
7
|
+
export * from "./signal.js";
|
|
8
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,6EAA6E;AAC7E,4EAA4E;AAC5E,sDAAsD;AAEtD,cAAc,UAAU,CAAC;AACzB,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC"}
|
package/dist/runner.d.ts
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { type ProductContext } from "@guyghost/swarm-dao-core";
|
|
2
|
+
export type PersistedProductSnapshot = Readonly<{
|
|
3
|
+
runId: string;
|
|
4
|
+
state: string;
|
|
5
|
+
status: string;
|
|
6
|
+
context: ProductContext;
|
|
7
|
+
}>;
|
|
8
|
+
export type ProductSubmissionResult = Readonly<{
|
|
9
|
+
accepted: boolean;
|
|
10
|
+
issues: readonly string[];
|
|
11
|
+
snapshot: PersistedProductSnapshot;
|
|
12
|
+
}>;
|
|
13
|
+
type RunnerOptions = Readonly<{
|
|
14
|
+
evidenceRoot: string;
|
|
15
|
+
runId: string;
|
|
16
|
+
}>;
|
|
17
|
+
/**
|
|
18
|
+
* Journal-based runner for the product loop. A cycle's identity is its runId;
|
|
19
|
+
* unlike improvement-loop there is no caller-supplied reference hash, because
|
|
20
|
+
* the product loop does not supervise a single external model hash. Instead the
|
|
21
|
+
* frozen model is pinned at validation time (see contract.ts) and re-checked by
|
|
22
|
+
* the anchor-reality gate before any run reaches `ship`.
|
|
23
|
+
*
|
|
24
|
+
* System evaluation events (VOTE_EVALUATE / VERIFY_EVALUATE /
|
|
25
|
+
* OBSERVATION_EVALUATE) are emitted by this runner — never by an AI signal —
|
|
26
|
+
* after the tool producer has recorded its evidence. This keeps every
|
|
27
|
+
* transition deterministic and owned by the model, not by an LLM.
|
|
28
|
+
*/
|
|
29
|
+
export declare class ProductRunner {
|
|
30
|
+
#private;
|
|
31
|
+
private constructor();
|
|
32
|
+
static create(options: RunnerOptions): Promise<ProductRunner>;
|
|
33
|
+
snapshot(): PersistedProductSnapshot;
|
|
34
|
+
submit(input: unknown): Promise<ProductSubmissionResult>;
|
|
35
|
+
}
|
|
36
|
+
export declare const createProductRunner: (options: RunnerOptions) => Promise<ProductRunner>;
|
|
37
|
+
export {};
|
|
38
|
+
//# sourceMappingURL=runner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../src/runner.ts"],"names":[],"mappings":"AAEA,OAAO,EAAyC,KAAK,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAGtG,MAAM,MAAM,wBAAwB,GAAG,QAAQ,CAAC;IAC9C,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,cAAc,CAAC;CACzB,CAAC,CAAC;AAEH,MAAM,MAAM,uBAAuB,GAAG,QAAQ,CAAC;IAC7C,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IAC1B,QAAQ,EAAE,wBAAwB,CAAC;CACpC,CAAC,CAAC;AAeH,KAAK,aAAa,GAAG,QAAQ,CAAC;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;CACf,CAAC,CAAC;AAyBH;;;;;;;;;;;GAWG;AACH,qBAAa,aAAa;;IAQxB,OAAO;WAOM,MAAM,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC;IAcnE,QAAQ,IAAI,wBAAwB;IAIpC,MAAM,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,uBAAuB,CAAC;CA8FzD;AAED,eAAO,MAAM,mBAAmB,GAAI,SAAS,aAAa,KAAG,OAAO,CAAC,aAAa,CAAkC,CAAC"}
|
package/dist/runner.js
ADDED
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
import { appendFile, mkdir, readFile, writeFile } from "node:fs/promises";
|
|
2
|
+
import { resolve, sep } from "node:path";
|
|
3
|
+
import { createProductActor } from "@guyghost/swarm-dao-core";
|
|
4
|
+
import { validateProductSignal } from "./signal.js";
|
|
5
|
+
const validRunId = (runId) => /^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/.test(runId) && !runId.includes("..");
|
|
6
|
+
const eventTypeFrom = (input) => {
|
|
7
|
+
if (typeof input !== "object" || input === null || !("type" in input))
|
|
8
|
+
return null;
|
|
9
|
+
return typeof input.type === "string" ? input.type : null;
|
|
10
|
+
};
|
|
11
|
+
const serializeSnapshot = (actor) => {
|
|
12
|
+
const snapshot = actor.getSnapshot();
|
|
13
|
+
return {
|
|
14
|
+
runId: snapshot.context.runId,
|
|
15
|
+
state: String(snapshot.value),
|
|
16
|
+
status: snapshot.status,
|
|
17
|
+
context: structuredClone(snapshot.context),
|
|
18
|
+
};
|
|
19
|
+
};
|
|
20
|
+
const snapshotChanged = (before, after) => before.state !== after.state ||
|
|
21
|
+
before.status !== after.status ||
|
|
22
|
+
JSON.stringify(before.context) !== JSON.stringify(after.context);
|
|
23
|
+
/**
|
|
24
|
+
* Journal-based runner for the product loop. A cycle's identity is its runId;
|
|
25
|
+
* unlike improvement-loop there is no caller-supplied reference hash, because
|
|
26
|
+
* the product loop does not supervise a single external model hash. Instead the
|
|
27
|
+
* frozen model is pinned at validation time (see contract.ts) and re-checked by
|
|
28
|
+
* the anchor-reality gate before any run reaches `ship`.
|
|
29
|
+
*
|
|
30
|
+
* System evaluation events (VOTE_EVALUATE / VERIFY_EVALUATE /
|
|
31
|
+
* OBSERVATION_EVALUATE) are emitted by this runner — never by an AI signal —
|
|
32
|
+
* after the tool producer has recorded its evidence. This keeps every
|
|
33
|
+
* transition deterministic and owned by the model, not by an LLM.
|
|
34
|
+
*/
|
|
35
|
+
export class ProductRunner {
|
|
36
|
+
#runId;
|
|
37
|
+
#runDirectory;
|
|
38
|
+
#clock;
|
|
39
|
+
#actor;
|
|
40
|
+
#sequence = 0;
|
|
41
|
+
#tail = Promise.resolve();
|
|
42
|
+
constructor(options, runDirectory) {
|
|
43
|
+
this.#runId = options.runId;
|
|
44
|
+
this.#runDirectory = runDirectory;
|
|
45
|
+
this.#clock = () => new Date().toISOString();
|
|
46
|
+
this.#actor = createProductActor({ runId: options.runId });
|
|
47
|
+
}
|
|
48
|
+
static async create(options) {
|
|
49
|
+
if (!validRunId(options.runId))
|
|
50
|
+
throw new Error("runId must be a safe non-empty filesystem identifier");
|
|
51
|
+
const root = resolve(options.evidenceRoot);
|
|
52
|
+
const runDirectory = resolve(root, options.runId);
|
|
53
|
+
if (!runDirectory.startsWith(`${root}${sep}`))
|
|
54
|
+
throw new Error("runId resolves outside the evidence root");
|
|
55
|
+
await mkdir(runDirectory, { recursive: true });
|
|
56
|
+
const runner = new ProductRunner(options, runDirectory);
|
|
57
|
+
await runner.#restoreJournal();
|
|
58
|
+
await runner.#persistSnapshot(serializeSnapshot(runner.#actor));
|
|
59
|
+
return runner;
|
|
60
|
+
}
|
|
61
|
+
snapshot() {
|
|
62
|
+
return serializeSnapshot(this.#actor);
|
|
63
|
+
}
|
|
64
|
+
submit(input) {
|
|
65
|
+
const operation = this.#tail.then(() => this.#submitNow(input));
|
|
66
|
+
this.#tail = operation.then(() => undefined, () => undefined);
|
|
67
|
+
return operation;
|
|
68
|
+
}
|
|
69
|
+
async #submitNow(input) {
|
|
70
|
+
const before = serializeSnapshot(this.#actor);
|
|
71
|
+
const validation = validateProductSignal(input);
|
|
72
|
+
let accepted = false;
|
|
73
|
+
let issues = [];
|
|
74
|
+
let signal;
|
|
75
|
+
if (!validation.ok) {
|
|
76
|
+
issues = validation.issues;
|
|
77
|
+
}
|
|
78
|
+
else if (validation.signal.runId !== this.#runId) {
|
|
79
|
+
issues = [`signal runId must match ${this.#runId}`];
|
|
80
|
+
signal = validation.signal;
|
|
81
|
+
}
|
|
82
|
+
else {
|
|
83
|
+
signal = validation.signal;
|
|
84
|
+
this.#actor.send(validation.event);
|
|
85
|
+
accepted = snapshotChanged(before, serializeSnapshot(this.#actor));
|
|
86
|
+
if (!accepted)
|
|
87
|
+
issues = ["machine rejected event for the current state or guards"];
|
|
88
|
+
}
|
|
89
|
+
const after = serializeSnapshot(this.#actor);
|
|
90
|
+
const entry = {
|
|
91
|
+
sequence: ++this.#sequence,
|
|
92
|
+
runId: this.#runId,
|
|
93
|
+
receivedAt: this.#clock(),
|
|
94
|
+
eventType: eventTypeFrom(input),
|
|
95
|
+
producer: signal?.producer ?? null,
|
|
96
|
+
accepted,
|
|
97
|
+
issues,
|
|
98
|
+
beforeState: before.state,
|
|
99
|
+
afterState: after.state,
|
|
100
|
+
...(signal ? { signal } : {}),
|
|
101
|
+
};
|
|
102
|
+
await appendFile(resolve(this.#runDirectory, "journal.ndjson"), `${JSON.stringify(entry)}\n`, "utf8");
|
|
103
|
+
await this.#persistSnapshot(after);
|
|
104
|
+
return { accepted, issues, snapshot: after };
|
|
105
|
+
}
|
|
106
|
+
async #persistSnapshot(snapshot) {
|
|
107
|
+
await writeFile(resolve(this.#runDirectory, "snapshot.json"), `${JSON.stringify(snapshot, null, 2)}\n`, "utf8");
|
|
108
|
+
}
|
|
109
|
+
async #restoreJournal() {
|
|
110
|
+
const journalPath = resolve(this.#runDirectory, "journal.ndjson");
|
|
111
|
+
let content;
|
|
112
|
+
try {
|
|
113
|
+
content = await readFile(journalPath, "utf8");
|
|
114
|
+
}
|
|
115
|
+
catch (error) {
|
|
116
|
+
if (typeof error === "object" && error !== null && "code" in error && error.code === "ENOENT")
|
|
117
|
+
return;
|
|
118
|
+
throw error;
|
|
119
|
+
}
|
|
120
|
+
const lines = content.split("\n").filter((line) => line.trim().length > 0);
|
|
121
|
+
for (const [index, line] of lines.entries()) {
|
|
122
|
+
let entry;
|
|
123
|
+
try {
|
|
124
|
+
entry = JSON.parse(line);
|
|
125
|
+
}
|
|
126
|
+
catch {
|
|
127
|
+
throw new Error(`journal line ${index + 1} is not valid JSON`);
|
|
128
|
+
}
|
|
129
|
+
if (typeof entry !== "object" ||
|
|
130
|
+
entry === null ||
|
|
131
|
+
!("sequence" in entry) ||
|
|
132
|
+
entry.sequence !== index + 1 ||
|
|
133
|
+
!("accepted" in entry) ||
|
|
134
|
+
typeof entry.accepted !== "boolean") {
|
|
135
|
+
throw new Error(`journal line ${index + 1} violates sequence contract`);
|
|
136
|
+
}
|
|
137
|
+
this.#sequence = entry.sequence;
|
|
138
|
+
if (!entry.accepted)
|
|
139
|
+
continue;
|
|
140
|
+
if (!("signal" in entry))
|
|
141
|
+
throw new Error(`accepted journal line ${index + 1} has no signal`);
|
|
142
|
+
const validation = validateProductSignal(entry.signal);
|
|
143
|
+
if (!validation.ok || validation.signal.runId !== this.#runId) {
|
|
144
|
+
throw new Error(`accepted journal line ${index + 1} has an invalid signal`);
|
|
145
|
+
}
|
|
146
|
+
const before = serializeSnapshot(this.#actor);
|
|
147
|
+
this.#actor.send(validation.event);
|
|
148
|
+
if (!snapshotChanged(before, serializeSnapshot(this.#actor))) {
|
|
149
|
+
throw new Error(`accepted journal line ${index + 1} cannot be replayed deterministically`);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
export const createProductRunner = (options) => ProductRunner.create(options);
|
|
155
|
+
//# sourceMappingURL=runner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../src/runner.ts"],"names":[],"mappings":"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"}
|
package/dist/signal.d.ts
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { type ProductEvent, type ProductSignalSource } from "@guyghost/swarm-dao-core";
|
|
2
|
+
export type ProductSignal = Readonly<{
|
|
3
|
+
runId: string;
|
|
4
|
+
type: string;
|
|
5
|
+
source: ProductSignalSource;
|
|
6
|
+
producer: string;
|
|
7
|
+
occurredAt: string;
|
|
8
|
+
payload: Readonly<Record<string, unknown>>;
|
|
9
|
+
evidence: readonly string[];
|
|
10
|
+
}>;
|
|
11
|
+
export type ProductSignalValidation = Readonly<{
|
|
12
|
+
ok: true;
|
|
13
|
+
signal: ProductSignal;
|
|
14
|
+
event: ProductEvent;
|
|
15
|
+
}> | Readonly<{
|
|
16
|
+
ok: false;
|
|
17
|
+
issues: readonly string[];
|
|
18
|
+
}>;
|
|
19
|
+
export declare const validateProductSignal: (input: unknown) => ProductSignalValidation;
|
|
20
|
+
//# sourceMappingURL=signal.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signal.d.ts","sourceRoot":"","sources":["../src/signal.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,YAAY,EACjB,KAAK,mBAAmB,EACzB,MAAM,0BAA0B,CAAC;AAElC,MAAM,MAAM,aAAa,GAAG,QAAQ,CAAC;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,mBAAmB,CAAC;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAC3C,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;CAC7B,CAAC,CAAC;AAEH,MAAM,MAAM,uBAAuB,GAC/B,QAAQ,CAAC;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,aAAa,CAAC;IAAC,KAAK,EAAE,YAAY,CAAA;CAAE,CAAC,GAClE,QAAQ,CAAC;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,CAAC,CAAC;AAqUvD,eAAO,MAAM,qBAAqB,GAAI,OAAO,OAAO,KAAG,uBAuEtD,CAAC"}
|
package/dist/signal.js
ADDED
|
@@ -0,0 +1,376 @@
|
|
|
1
|
+
import { isRequiredProductAnchor, PRODUCT_ALLOWED_CATEGORIES, } from "@guyghost/swarm-dao-core";
|
|
2
|
+
// Event type -> the sole permitted source kind. Mirrors the authority table in
|
|
3
|
+
// models/product-loop.md. A caller-supplied `source` label is rejected if it
|
|
4
|
+
// disagrees with this table.
|
|
5
|
+
const EVENT_SOURCES = {
|
|
6
|
+
AGENT_SIGNAL: "ai",
|
|
7
|
+
FEEDBACK_AGGREGATED: "ai",
|
|
8
|
+
PROPOSAL_DRAFTED: "ai",
|
|
9
|
+
OPEN_PROPOSITION: "tool",
|
|
10
|
+
QUALIFICATION_RUN: "tool",
|
|
11
|
+
VOTE_OPENED: "tool",
|
|
12
|
+
VOTE_CAST: "tool",
|
|
13
|
+
VOTE_EVALUATE: "system",
|
|
14
|
+
VOTE_EXPIRED: "tool",
|
|
15
|
+
BUDGET_CHARGE: "tool",
|
|
16
|
+
EXECUTION_DONE: "tool",
|
|
17
|
+
VERIFY_RUN: "tool",
|
|
18
|
+
VERIFY_EVALUATE: "system",
|
|
19
|
+
OBSERVATION_SAMPLE: "tool",
|
|
20
|
+
OBSERVATION_EVALUATE: "system",
|
|
21
|
+
ANCHOR_RECORDED: "tool",
|
|
22
|
+
CORRECTIVE_PROPOSITION_OPENED: "tool",
|
|
23
|
+
REVIEW_RESOLVED: "human",
|
|
24
|
+
RETRY_VERIFICATION_AUTHORIZED: "human",
|
|
25
|
+
CONTACT_VOTE_OPENED: "tool",
|
|
26
|
+
CONTACT_VOTE_QUORUM: "tool",
|
|
27
|
+
CONTACT_RELAY_AUTHORIZED: "human",
|
|
28
|
+
PERMISSION_DENIED: "tool",
|
|
29
|
+
CANCEL: "human",
|
|
30
|
+
};
|
|
31
|
+
// System-emitted evaluation events have no graph producer node (the runner emits
|
|
32
|
+
// them after recording evidence). Every other event must come from a declared
|
|
33
|
+
// producer node whose authority is bound in models/product-loop.graph.json.
|
|
34
|
+
const SYSTEM_EVENTS = new Set(["VOTE_EVALUATE", "VERIFY_EVALUATE", "OBSERVATION_EVALUATE"]);
|
|
35
|
+
// Producer node -> { declared source, emitted event types }. Mirrors the frozen
|
|
36
|
+
// graph so a signal's authority is bound to its producer's declared node, not to
|
|
37
|
+
// a caller-supplied `source` label. An AI producer ("explorer") therefore can
|
|
38
|
+
// never emit a human-authority event (CANCEL / REVIEW_RESOLVED / CONTACT_RELAY).
|
|
39
|
+
const PRODUCER_EMISSIONS = {
|
|
40
|
+
explorer: { source: "ai", emits: new Set(["AGENT_SIGNAL", "FEEDBACK_AGGREGATED", "PROPOSAL_DRAFTED"]) },
|
|
41
|
+
"feedback-aggregator": { source: "ai", emits: new Set(["FEEDBACK_AGGREGATED"]) },
|
|
42
|
+
proposer: { source: "ai", emits: new Set(["PROPOSAL_DRAFTED"]) },
|
|
43
|
+
"proposition-gate": { source: "tool", emits: new Set(["OPEN_PROPOSITION"]) },
|
|
44
|
+
qualifier: { source: "tool", emits: new Set(["QUALIFICATION_RUN", "PERMISSION_DENIED"]) },
|
|
45
|
+
"vote-tally": { source: "tool", emits: new Set(["VOTE_OPENED", "VOTE_CAST", "VOTE_EXPIRED"]) },
|
|
46
|
+
"budget-ledger": { source: "tool", emits: new Set(["BUDGET_CHARGE", "EXECUTION_DONE"]) },
|
|
47
|
+
verifier: { source: "tool", emits: new Set(["VERIFY_RUN", "ANCHOR_RECORDED", "PERMISSION_DENIED"]) },
|
|
48
|
+
"observation-gate": { source: "tool", emits: new Set(["OBSERVATION_SAMPLE"]) },
|
|
49
|
+
"rollback-opener": { source: "tool", emits: new Set(["CORRECTIVE_PROPOSITION_OPENED"]) },
|
|
50
|
+
"contact-relay": { source: "tool", emits: new Set(["CONTACT_VOTE_OPENED", "CONTACT_VOTE_QUORUM"]) },
|
|
51
|
+
"human-owner": {
|
|
52
|
+
source: "human",
|
|
53
|
+
emits: new Set(["REVIEW_RESOLVED", "RETRY_VERIFICATION_AUTHORIZED", "CONTACT_RELAY_AUTHORIZED", "CANCEL"]),
|
|
54
|
+
},
|
|
55
|
+
};
|
|
56
|
+
// No signal may carry a state-transition target. AI signals additionally may
|
|
57
|
+
// not carry any owner-authority key — the LLM produces a signal, never a
|
|
58
|
+
// decision. The model decides every transition.
|
|
59
|
+
const FORBIDDEN_TRANSITION_KEYS = new Set(["nextState", "targetState", "transition", "target"]);
|
|
60
|
+
const FORBIDDEN_AI_AUTHORITY_KEYS = new Set([
|
|
61
|
+
"approval",
|
|
62
|
+
"approve",
|
|
63
|
+
"expandedBudget",
|
|
64
|
+
"resolution",
|
|
65
|
+
"retry",
|
|
66
|
+
"cancel",
|
|
67
|
+
"permission",
|
|
68
|
+
"relay",
|
|
69
|
+
"quorum",
|
|
70
|
+
"vote",
|
|
71
|
+
"favorable",
|
|
72
|
+
]);
|
|
73
|
+
const isRecord = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
|
|
74
|
+
const nonEmptyString = (value) => typeof value === "string" && value.trim().length > 0;
|
|
75
|
+
const findForbiddenKeys = (value, forbidden, path = "signal") => {
|
|
76
|
+
if (Array.isArray(value)) {
|
|
77
|
+
return value.flatMap((entry, index) => findForbiddenKeys(entry, forbidden, `${path}[${index}]`));
|
|
78
|
+
}
|
|
79
|
+
if (!isRecord(value))
|
|
80
|
+
return [];
|
|
81
|
+
return Object.entries(value).flatMap(([key, entry]) => [
|
|
82
|
+
...(forbidden.has(key) ? [`${path}.${key} is forbidden`] : []),
|
|
83
|
+
...findForbiddenKeys(entry, forbidden, `${path}.${key}`),
|
|
84
|
+
]);
|
|
85
|
+
};
|
|
86
|
+
const requiredString = (payload, key, issues) => {
|
|
87
|
+
const value = payload[key];
|
|
88
|
+
if (!nonEmptyString(value)) {
|
|
89
|
+
issues.push(`payload.${key} must be a non-empty string`);
|
|
90
|
+
return "";
|
|
91
|
+
}
|
|
92
|
+
return value;
|
|
93
|
+
};
|
|
94
|
+
const firstEvidence = (evidence, issues) => {
|
|
95
|
+
const value = evidence.find(nonEmptyString);
|
|
96
|
+
if (!value) {
|
|
97
|
+
issues.push("evidence must contain at least one non-empty entry");
|
|
98
|
+
return "";
|
|
99
|
+
}
|
|
100
|
+
return value;
|
|
101
|
+
};
|
|
102
|
+
const asCategory = (value, issues, path) => {
|
|
103
|
+
if (typeof value !== "string" || !PRODUCT_ALLOWED_CATEGORIES.includes(value)) {
|
|
104
|
+
issues.push(`${path} must be one of the allowed product categories`);
|
|
105
|
+
return "performance";
|
|
106
|
+
}
|
|
107
|
+
return value;
|
|
108
|
+
};
|
|
109
|
+
const buildEvent = (type, source, payload, evidence, issues) => {
|
|
110
|
+
switch (type) {
|
|
111
|
+
case "AGENT_SIGNAL":
|
|
112
|
+
return { type, source, note: requiredString(payload, "note", issues) };
|
|
113
|
+
case "FEEDBACK_AGGREGATED":
|
|
114
|
+
return { type, source, summary: requiredString(payload, "summary", issues) };
|
|
115
|
+
case "PROPOSAL_DRAFTED": {
|
|
116
|
+
const draft = payload.draft;
|
|
117
|
+
if (!isRecord(draft)) {
|
|
118
|
+
issues.push("payload.draft must be a ProposalDraft object");
|
|
119
|
+
return { type, source, draft: emptyDraft() };
|
|
120
|
+
}
|
|
121
|
+
// touchesSensitive MUST be an explicit boolean. Defaulting silently to
|
|
122
|
+
// false would let a malformed sensitive draft bypass human deploy review.
|
|
123
|
+
const touchesSensitive = draft.touchesSensitive;
|
|
124
|
+
if (typeof touchesSensitive !== "boolean") {
|
|
125
|
+
issues.push("payload.draft.touchesSensitive must be an explicit boolean");
|
|
126
|
+
}
|
|
127
|
+
return {
|
|
128
|
+
type,
|
|
129
|
+
source,
|
|
130
|
+
draft: {
|
|
131
|
+
scope: requiredString(draft, "scope", issues),
|
|
132
|
+
category: asCategory(draft.category, issues, "payload.draft.category"),
|
|
133
|
+
touchesSensitive: typeof touchesSensitive === "boolean" ? touchesSensitive : false,
|
|
134
|
+
dependencies: Array.isArray(draft.dependencies)
|
|
135
|
+
? draft.dependencies.filter((d) => nonEmptyString(d))
|
|
136
|
+
: [],
|
|
137
|
+
budgetAllocation: typeof draft.budgetAllocation === "number" ? draft.budgetAllocation : 0,
|
|
138
|
+
rollbackArtifact: requiredString(draft, "rollbackArtifact", issues),
|
|
139
|
+
evidence: requiredString(draft, "evidence", issues),
|
|
140
|
+
},
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
case "OPEN_PROPOSITION":
|
|
144
|
+
return { type, source };
|
|
145
|
+
case "QUALIFICATION_RUN": {
|
|
146
|
+
// Qualification carries an affirmative, evidence-backed permission
|
|
147
|
+
// clearance. It never passes on the mere absence of a denial.
|
|
148
|
+
const permissionCleared = payload.permissionCleared;
|
|
149
|
+
const permissionEvidence = payload.permissionEvidence;
|
|
150
|
+
if (typeof permissionCleared !== "boolean") {
|
|
151
|
+
issues.push("payload.permissionCleared must be a boolean");
|
|
152
|
+
}
|
|
153
|
+
if (typeof permissionEvidence !== "string" || permissionEvidence.trim() === "") {
|
|
154
|
+
issues.push("payload.permissionEvidence must be a non-empty string");
|
|
155
|
+
}
|
|
156
|
+
return {
|
|
157
|
+
type,
|
|
158
|
+
source,
|
|
159
|
+
permissionCleared: permissionCleared === true,
|
|
160
|
+
permissionEvidence: typeof permissionEvidence === "string" ? permissionEvidence : "",
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
case "VOTE_OPENED": {
|
|
164
|
+
const config = payload.config;
|
|
165
|
+
if (!isRecord(config)) {
|
|
166
|
+
issues.push("payload.config must be a VoteConfig object");
|
|
167
|
+
return { type, source, config: { quorum: 1, kind: "standard", expiryHours: 72 } };
|
|
168
|
+
}
|
|
169
|
+
return {
|
|
170
|
+
type,
|
|
171
|
+
source,
|
|
172
|
+
config: {
|
|
173
|
+
quorum: typeof config.quorum === "number" ? config.quorum : 1,
|
|
174
|
+
kind: config.kind === "criticalSecurity" ? "criticalSecurity" : "standard",
|
|
175
|
+
expiryHours: typeof config.expiryHours === "number" ? config.expiryHours : 72,
|
|
176
|
+
},
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
case "VOTE_CAST":
|
|
180
|
+
return { type, source, favorable: typeof payload.favorable === "number" ? payload.favorable : 0 };
|
|
181
|
+
case "VOTE_EVALUATE":
|
|
182
|
+
return { type, source };
|
|
183
|
+
case "VOTE_EXPIRED":
|
|
184
|
+
return { type, source };
|
|
185
|
+
case "BUDGET_CHARGE": {
|
|
186
|
+
const action = payload.action;
|
|
187
|
+
if (!isRecord(action)) {
|
|
188
|
+
issues.push("payload.action must be a BudgetAction object");
|
|
189
|
+
return { type, source, action: { amount: 0, description: "", evidence: "" } };
|
|
190
|
+
}
|
|
191
|
+
return {
|
|
192
|
+
type,
|
|
193
|
+
source,
|
|
194
|
+
action: {
|
|
195
|
+
amount: typeof action.amount === "number" ? action.amount : 0,
|
|
196
|
+
description: requiredString(action, "description", issues),
|
|
197
|
+
evidence: requiredString(action, "evidence", issues),
|
|
198
|
+
},
|
|
199
|
+
};
|
|
200
|
+
}
|
|
201
|
+
case "EXECUTION_DONE":
|
|
202
|
+
return { type, source };
|
|
203
|
+
case "VERIFY_RUN": {
|
|
204
|
+
const control = payload.control;
|
|
205
|
+
if (!isRecord(control)) {
|
|
206
|
+
issues.push("payload.control must be a ControlResult object");
|
|
207
|
+
return { type, source, control: { name: "", status: "failed", evidence: "" } };
|
|
208
|
+
}
|
|
209
|
+
return {
|
|
210
|
+
type,
|
|
211
|
+
source,
|
|
212
|
+
control: {
|
|
213
|
+
name: requiredString(control, "name", issues),
|
|
214
|
+
status: control.status === "passed" ? "passed" : "failed",
|
|
215
|
+
evidence: requiredString(control, "evidence", issues),
|
|
216
|
+
},
|
|
217
|
+
};
|
|
218
|
+
}
|
|
219
|
+
case "VERIFY_EVALUATE":
|
|
220
|
+
return { type, source };
|
|
221
|
+
case "OBSERVATION_SAMPLE": {
|
|
222
|
+
const sample = payload.sample;
|
|
223
|
+
if (!isRecord(sample)) {
|
|
224
|
+
issues.push("payload.sample must be an ObservationSample object");
|
|
225
|
+
return { type, source, sample: { metric: "errors", value: 0, threshold: 0, exceeded: false, evidence: "" } };
|
|
226
|
+
}
|
|
227
|
+
const metric = ["errors", "aiCost", "latency", "satisfaction"].includes(String(sample.metric))
|
|
228
|
+
? String(sample.metric)
|
|
229
|
+
: "errors";
|
|
230
|
+
return {
|
|
231
|
+
type,
|
|
232
|
+
source,
|
|
233
|
+
sample: {
|
|
234
|
+
metric,
|
|
235
|
+
value: typeof sample.value === "number" ? sample.value : 0,
|
|
236
|
+
threshold: typeof sample.threshold === "number" ? sample.threshold : 0,
|
|
237
|
+
exceeded: typeof sample.exceeded === "boolean" ? sample.exceeded : false,
|
|
238
|
+
evidence: requiredString(sample, "evidence", issues),
|
|
239
|
+
},
|
|
240
|
+
};
|
|
241
|
+
}
|
|
242
|
+
case "OBSERVATION_EVALUATE":
|
|
243
|
+
return { type, source, windowElapsed: payload.windowElapsed === true };
|
|
244
|
+
case "ANCHOR_RECORDED": {
|
|
245
|
+
const anchor = payload.anchor;
|
|
246
|
+
if (!isRequiredProductAnchor(anchor)) {
|
|
247
|
+
issues.push("payload.anchor must be a required product anchor");
|
|
248
|
+
}
|
|
249
|
+
const status = payload.status;
|
|
250
|
+
if (status !== "passed" && status !== "failed") {
|
|
251
|
+
issues.push('payload.status must be "passed" or "failed"');
|
|
252
|
+
}
|
|
253
|
+
return {
|
|
254
|
+
type,
|
|
255
|
+
source,
|
|
256
|
+
anchor: isRequiredProductAnchor(anchor) ? anchor : "regression",
|
|
257
|
+
status: status === "failed" ? "failed" : "passed",
|
|
258
|
+
evidence: firstEvidence(evidence, issues),
|
|
259
|
+
};
|
|
260
|
+
}
|
|
261
|
+
case "CORRECTIVE_PROPOSITION_OPENED":
|
|
262
|
+
return { type, source };
|
|
263
|
+
case "REVIEW_RESOLVED": {
|
|
264
|
+
const resolution = payload.resolution;
|
|
265
|
+
if (resolution !== "scope-reduced" && resolution !== "budget-expanded" && resolution !== "abandoned") {
|
|
266
|
+
issues.push("payload.resolution must be scope-reduced, budget-expanded, or abandoned");
|
|
267
|
+
}
|
|
268
|
+
return {
|
|
269
|
+
type,
|
|
270
|
+
source,
|
|
271
|
+
resolution: resolution === "budget-expanded"
|
|
272
|
+
? "budget-expanded"
|
|
273
|
+
: resolution === "scope-reduced"
|
|
274
|
+
? "scope-reduced"
|
|
275
|
+
: "abandoned",
|
|
276
|
+
expandedBudget: typeof payload.expandedBudget === "number" ? payload.expandedBudget : undefined,
|
|
277
|
+
};
|
|
278
|
+
}
|
|
279
|
+
case "RETRY_VERIFICATION_AUTHORIZED":
|
|
280
|
+
return { type, source };
|
|
281
|
+
case "CONTACT_VOTE_OPENED":
|
|
282
|
+
return { type, source };
|
|
283
|
+
case "CONTACT_VOTE_QUORUM":
|
|
284
|
+
return { type, source, reached: payload.reached === true };
|
|
285
|
+
case "CONTACT_RELAY_AUTHORIZED":
|
|
286
|
+
return { type, source };
|
|
287
|
+
case "PERMISSION_DENIED":
|
|
288
|
+
return { type, source, reason: requiredString(payload, "reason", issues) };
|
|
289
|
+
case "CANCEL":
|
|
290
|
+
return { type, source, reason: requiredString(payload, "reason", issues) };
|
|
291
|
+
}
|
|
292
|
+
};
|
|
293
|
+
const emptyDraft = () => ({
|
|
294
|
+
scope: "",
|
|
295
|
+
category: "performance",
|
|
296
|
+
touchesSensitive: false,
|
|
297
|
+
dependencies: [],
|
|
298
|
+
budgetAllocation: 0,
|
|
299
|
+
rollbackArtifact: "",
|
|
300
|
+
evidence: "",
|
|
301
|
+
});
|
|
302
|
+
export const validateProductSignal = (input) => {
|
|
303
|
+
const issues = [];
|
|
304
|
+
if (!isRecord(input))
|
|
305
|
+
return { ok: false, issues: ["signal must be an object"] };
|
|
306
|
+
if (!nonEmptyString(input.runId))
|
|
307
|
+
issues.push("runId must be a non-empty string");
|
|
308
|
+
if (!nonEmptyString(input.producer))
|
|
309
|
+
issues.push("producer must be a non-empty string");
|
|
310
|
+
if (!nonEmptyString(input.occurredAt) || Number.isNaN(Date.parse(input.occurredAt))) {
|
|
311
|
+
issues.push("occurredAt must be a valid ISO timestamp");
|
|
312
|
+
}
|
|
313
|
+
if (!isRecord(input.payload))
|
|
314
|
+
issues.push("payload must be an object");
|
|
315
|
+
if (!Array.isArray(input.evidence) || !input.evidence.every((entry) => typeof entry === "string")) {
|
|
316
|
+
issues.push("evidence must be an array of strings");
|
|
317
|
+
}
|
|
318
|
+
const type = input.type;
|
|
319
|
+
// Use an own-property lookup so an unknown event whose type collides with an
|
|
320
|
+
// inherited key (e.g. "toString", "__proto__") is never misclassified as known.
|
|
321
|
+
const knownType = typeof type === "string" && Object.hasOwn(EVENT_SOURCES, type) ? type : null;
|
|
322
|
+
if (!knownType)
|
|
323
|
+
issues.push("type must be a known product event");
|
|
324
|
+
const source = input.source;
|
|
325
|
+
const validSource = source === "ai" || source === "tool" || source === "human" || source === "system";
|
|
326
|
+
if (!validSource)
|
|
327
|
+
issues.push("source must be ai, tool, human, or system");
|
|
328
|
+
if (knownType && validSource && EVENT_SOURCES[knownType] !== source) {
|
|
329
|
+
issues.push(`source for ${knownType} must be ${EVENT_SOURCES[knownType]}`);
|
|
330
|
+
}
|
|
331
|
+
// Bind the event's authority to the producer's declared graph node. System
|
|
332
|
+
// evaluation events are emitted by the runner and have no producer node.
|
|
333
|
+
// Own-property lookup so a caller-supplied prototype key (e.g. "__proto__")
|
|
334
|
+
// can never resolve to a real producer declaration.
|
|
335
|
+
const producer = typeof input.producer === "string" ? input.producer : "";
|
|
336
|
+
if (knownType && !SYSTEM_EVENTS.has(knownType)) {
|
|
337
|
+
const declared = Object.hasOwn(PRODUCER_EMISSIONS, producer) ? PRODUCER_EMISSIONS[producer] : null;
|
|
338
|
+
if (!declared) {
|
|
339
|
+
issues.push(`producer ${producer || "?"} is not a declared graph producer for ${knownType}`);
|
|
340
|
+
}
|
|
341
|
+
else {
|
|
342
|
+
if (!declared.emits.has(knownType)) {
|
|
343
|
+
issues.push(`producer ${producer} is not declared to emit ${knownType}`);
|
|
344
|
+
}
|
|
345
|
+
if (validSource && declared.source !== source) {
|
|
346
|
+
issues.push(`producer ${producer} must use source ${declared.source}, not ${source}`);
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
// No signal may carry a state target. AI signals may not carry any
|
|
351
|
+
// owner-authority field. The model — never the signal — decides transitions.
|
|
352
|
+
issues.push(...findForbiddenKeys(input, FORBIDDEN_TRANSITION_KEYS));
|
|
353
|
+
if (source === "ai")
|
|
354
|
+
issues.push(...findForbiddenKeys(input, FORBIDDEN_AI_AUTHORITY_KEYS));
|
|
355
|
+
const payload = isRecord(input.payload) ? input.payload : {};
|
|
356
|
+
const evidence = Array.isArray(input.evidence)
|
|
357
|
+
? input.evidence.filter((entry) => typeof entry === "string")
|
|
358
|
+
: [];
|
|
359
|
+
const event = knownType && validSource ? buildEvent(knownType, source, payload, evidence, issues) : null;
|
|
360
|
+
if (issues.length > 0 || !event || !knownType)
|
|
361
|
+
return { ok: false, issues };
|
|
362
|
+
return {
|
|
363
|
+
ok: true,
|
|
364
|
+
signal: {
|
|
365
|
+
runId: input.runId,
|
|
366
|
+
type: knownType,
|
|
367
|
+
source: source,
|
|
368
|
+
producer: input.producer,
|
|
369
|
+
occurredAt: input.occurredAt,
|
|
370
|
+
payload,
|
|
371
|
+
evidence,
|
|
372
|
+
},
|
|
373
|
+
event,
|
|
374
|
+
};
|
|
375
|
+
};
|
|
376
|
+
//# sourceMappingURL=signal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signal.js","sourceRoot":"","sources":["../src/signal.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,uBAAuB,EACvB,0BAA0B,GAI3B,MAAM,0BAA0B,CAAC;AAgBlC,+EAA+E;AAC/E,6EAA6E;AAC7E,6BAA6B;AAC7B,MAAM,aAAa,GAAG;IACpB,YAAY,EAAE,IAAI;IAClB,mBAAmB,EAAE,IAAI;IACzB,gBAAgB,EAAE,IAAI;IACtB,gBAAgB,EAAE,MAAM;IACxB,iBAAiB,EAAE,MAAM;IACzB,WAAW,EAAE,MAAM;IACnB,SAAS,EAAE,MAAM;IACjB,aAAa,EAAE,QAAQ;IACvB,YAAY,EAAE,MAAM;IACpB,aAAa,EAAE,MAAM;IACrB,cAAc,EAAE,MAAM;IACtB,UAAU,EAAE,MAAM;IAClB,eAAe,EAAE,QAAQ;IACzB,kBAAkB,EAAE,MAAM;IAC1B,oBAAoB,EAAE,QAAQ;IAC9B,eAAe,EAAE,MAAM;IACvB,6BAA6B,EAAE,MAAM;IACrC,eAAe,EAAE,OAAO;IACxB,6BAA6B,EAAE,OAAO;IACtC,mBAAmB,EAAE,MAAM;IAC3B,mBAAmB,EAAE,MAAM;IAC3B,wBAAwB,EAAE,OAAO;IACjC,iBAAiB,EAAE,MAAM;IACzB,MAAM,EAAE,OAAO;CACqD,CAAC;AAIvE,iFAAiF;AACjF,8EAA8E;AAC9E,4EAA4E;AAC5E,MAAM,aAAa,GAAG,IAAI,GAAG,CAAiB,CAAC,eAAe,EAAE,iBAAiB,EAAE,sBAAsB,CAAC,CAAC,CAAC;AAE5G,gFAAgF;AAChF,iFAAiF;AACjF,8EAA8E;AAC9E,iFAAiF;AACjF,MAAM,kBAAkB,GAEpB;IACF,QAAQ,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,GAAG,CAAC,CAAC,cAAc,EAAE,qBAAqB,EAAE,kBAAkB,CAAC,CAAC,EAAE;IACvG,qBAAqB,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,GAAG,CAAC,CAAC,qBAAqB,CAAC,CAAC,EAAE;IAChF,QAAQ,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,GAAG,CAAC,CAAC,kBAAkB,CAAC,CAAC,EAAE;IAChE,kBAAkB,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,GAAG,CAAC,CAAC,kBAAkB,CAAC,CAAC,EAAE;IAC5E,SAAS,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,GAAG,CAAC,CAAC,mBAAmB,EAAE,mBAAmB,CAAC,CAAC,EAAE;IACzF,YAAY,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,GAAG,CAAC,CAAC,aAAa,EAAE,WAAW,EAAE,cAAc,CAAC,CAAC,EAAE;IAC9F,eAAe,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,GAAG,CAAC,CAAC,eAAe,EAAE,gBAAgB,CAAC,CAAC,EAAE;IACxF,QAAQ,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,GAAG,CAAC,CAAC,YAAY,EAAE,iBAAiB,EAAE,mBAAmB,CAAC,CAAC,EAAE;IACpG,kBAAkB,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,GAAG,CAAC,CAAC,oBAAoB,CAAC,CAAC,EAAE;IAC9E,iBAAiB,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,GAAG,CAAC,CAAC,+BAA+B,CAAC,CAAC,EAAE;IACxF,eAAe,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,GAAG,CAAC,CAAC,qBAAqB,EAAE,qBAAqB,CAAC,CAAC,EAAE;IACnG,aAAa,EAAE;QACb,MAAM,EAAE,OAAO;QACf,KAAK,EAAE,IAAI,GAAG,CAAC,CAAC,iBAAiB,EAAE,+BAA+B,EAAE,0BAA0B,EAAE,QAAQ,CAAC,CAAC;KAC3G;CACF,CAAC;AAEF,6EAA6E;AAC7E,yEAAyE;AACzE,gDAAgD;AAChD,MAAM,yBAAyB,GAAG,IAAI,GAAG,CAAC,CAAC,WAAW,EAAE,aAAa,EAAE,YAAY,EAAE,QAAQ,CAAC,CAAC,CAAC;AAChG,MAAM,2BAA2B,GAAG,IAAI,GAAG,CAAC;IAC1C,UAAU;IACV,SAAS;IACT,gBAAgB;IAChB,YAAY;IACZ,OAAO;IACP,QAAQ;IACR,YAAY;IACZ,OAAO;IACP,QAAQ;IACR,MAAM;IACN,WAAW;CACZ,CAAC,CAAC;AAEH,MAAM,QAAQ,GAAG,CAAC,KAAc,EAAoC,EAAE,CACpE,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAEvE,MAAM,cAAc,GAAG,CAAC,KAAc,EAAmB,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;AAEjH,MAAM,iBAAiB,GAAG,CAAC,KAAc,EAAE,SAA8B,EAAE,IAAI,GAAG,QAAQ,EAAY,EAAE;IACtG,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,KAAK,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,iBAAiB,CAAC,KAAK,EAAE,SAAS,EAAE,GAAG,IAAI,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC;IACnG,CAAC;IACD,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAChC,OAAO,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC;QACrD,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9D,GAAG,iBAAiB,CAAC,KAAK,EAAE,SAAS,EAAE,GAAG,IAAI,IAAI,GAAG,EAAE,CAAC;KACzD,CAAC,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,cAAc,GAAG,CAAC,OAA0C,EAAE,GAAW,EAAE,MAAgB,EAAU,EAAE;IAC3G,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IAC3B,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,CAAC;QAC3B,MAAM,CAAC,IAAI,CAAC,WAAW,GAAG,6BAA6B,CAAC,CAAC;QACzD,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC,CAAC;AAEF,MAAM,aAAa,GAAG,CAAC,QAA2B,EAAE,MAAgB,EAAU,EAAE;IAC9E,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IAC5C,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,CAAC,IAAI,CAAC,oDAAoD,CAAC,CAAC;QAClE,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC,CAAC;AAEF,MAAM,UAAU,GAAG,CAAC,KAAc,EAAE,MAAgB,EAAE,IAAY,EAAmB,EAAE;IACrF,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAE,0BAAgD,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACpG,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,gDAAgD,CAAC,CAAC;QACrE,OAAO,aAAa,CAAC;IACvB,CAAC;IACD,OAAO,KAAwB,CAAC;AAClC,CAAC,CAAC;AAEF,MAAM,UAAU,GAAG,CACjB,IAAoB,EACpB,MAA2B,EAC3B,OAA0C,EAC1C,QAA2B,EAC3B,MAAgB,EACF,EAAE;IAChB,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,cAAc;YACjB,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC;QACzE,KAAK,qBAAqB;YACxB,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,CAAC,OAAO,EAAE,SAAS,EAAE,MAAM,CAAC,EAAE,CAAC;QAC/E,KAAK,kBAAkB,CAAC,CAAC,CAAC;YACxB,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;YAC5B,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;gBACrB,MAAM,CAAC,IAAI,CAAC,8CAA8C,CAAC,CAAC;gBAC5D,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE,CAAC;YAC/C,CAAC;YACD,uEAAuE;YACvE,0EAA0E;YAC1E,MAAM,gBAAgB,GAAG,KAAK,CAAC,gBAAgB,CAAC;YAChD,IAAI,OAAO,gBAAgB,KAAK,SAAS,EAAE,CAAC;gBAC1C,MAAM,CAAC,IAAI,CAAC,4DAA4D,CAAC,CAAC;YAC5E,CAAC;YACD,OAAO;gBACL,IAAI;gBACJ,MAAM;gBACN,KAAK,EAAE;oBACL,KAAK,EAAE,cAAc,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC;oBAC7C,QAAQ,EAAE,UAAU,CAAC,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,wBAAwB,CAAC;oBACtE,gBAAgB,EAAE,OAAO,gBAAgB,KAAK,SAAS,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,KAAK;oBAClF,YAAY,EAAE,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC;wBAC7C,CAAC,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;wBAClE,CAAC,CAAC,EAAE;oBACN,gBAAgB,EAAE,OAAO,KAAK,CAAC,gBAAgB,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC;oBACzF,gBAAgB,EAAE,cAAc,CAAC,KAAK,EAAE,kBAAkB,EAAE,MAAM,CAAC;oBACnE,QAAQ,EAAE,cAAc,CAAC,KAAK,EAAE,UAAU,EAAE,MAAM,CAAC;iBACpD;aACF,CAAC;QACJ,CAAC;QACD,KAAK,kBAAkB;YACrB,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;QAC1B,KAAK,mBAAmB,CAAC,CAAC,CAAC;YACzB,mEAAmE;YACnE,8DAA8D;YAC9D,MAAM,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,CAAC;YACpD,MAAM,kBAAkB,GAAG,OAAO,CAAC,kBAAkB,CAAC;YACtD,IAAI,OAAO,iBAAiB,KAAK,SAAS,EAAE,CAAC;gBAC3C,MAAM,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC;YAC7D,CAAC;YACD,IAAI,OAAO,kBAAkB,KAAK,QAAQ,IAAI,kBAAkB,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;gBAC/E,MAAM,CAAC,IAAI,CAAC,uDAAuD,CAAC,CAAC;YACvE,CAAC;YACD,OAAO;gBACL,IAAI;gBACJ,MAAM;gBACN,iBAAiB,EAAE,iBAAiB,KAAK,IAAI;gBAC7C,kBAAkB,EAAE,OAAO,kBAAkB,KAAK,QAAQ,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,EAAE;aACrF,CAAC;QACJ,CAAC;QACD,KAAK,aAAa,CAAC,CAAC,CAAC;YACnB,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;YAC9B,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;gBACtB,MAAM,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAC;gBAC1D,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,WAAW,EAAE,EAAE,EAAE,EAAE,CAAC;YACpF,CAAC;YACD,OAAO;gBACL,IAAI;gBACJ,MAAM;gBACN,MAAM,EAAE;oBACN,MAAM,EAAE,OAAO,MAAM,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;oBAC7D,IAAI,EAAE,MAAM,CAAC,IAAI,KAAK,kBAAkB,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,UAAU;oBAC1E,WAAW,EAAE,OAAO,MAAM,CAAC,WAAW,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE;iBAC9E;aACF,CAAC;QACJ,CAAC;QACD,KAAK,WAAW;YACd,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,OAAO,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACpG,KAAK,eAAe;YAClB,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;QAC1B,KAAK,cAAc;YACjB,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;QAC1B,KAAK,eAAe,CAAC,CAAC,CAAC;YACrB,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;YAC9B,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;gBACtB,MAAM,CAAC,IAAI,CAAC,8CAA8C,CAAC,CAAC;gBAC5D,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,WAAW,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,EAAE,CAAC;YAChF,CAAC;YACD,OAAO;gBACL,IAAI;gBACJ,MAAM;gBACN,MAAM,EAAE;oBACN,MAAM,EAAE,OAAO,MAAM,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;oBAC7D,WAAW,EAAE,cAAc,CAAC,MAAM,EAAE,aAAa,EAAE,MAAM,CAAC;oBAC1D,QAAQ,EAAE,cAAc,CAAC,MAAM,EAAE,UAAU,EAAE,MAAM,CAAC;iBACrD;aACF,CAAC;QACJ,CAAC;QACD,KAAK,gBAAgB;YACnB,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;QAC1B,KAAK,YAAY,CAAC,CAAC,CAAC;YAClB,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;YAChC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;gBACvB,MAAM,CAAC,IAAI,CAAC,gDAAgD,CAAC,CAAC;gBAC9D,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,EAAE,EAAE,CAAC;YACjF,CAAC;YACD,OAAO;gBACL,IAAI;gBACJ,MAAM;gBACN,OAAO,EAAE;oBACP,IAAI,EAAE,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC;oBAC7C,MAAM,EAAE,OAAO,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ;oBACzD,QAAQ,EAAE,cAAc,CAAC,OAAO,EAAE,UAAU,EAAE,MAAM,CAAC;iBACtD;aACF,CAAC;QACJ,CAAC;QACD,KAAK,iBAAiB;YACpB,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;QAC1B,KAAK,oBAAoB,CAAC,CAAC,CAAC;YAC1B,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;YAC9B,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;gBACtB,MAAM,CAAC,IAAI,CAAC,oDAAoD,CAAC,CAAC;gBAClE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE,EAAE,CAAC;YAC/G,CAAC;YACD,MAAM,MAAM,GAAG,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,cAAc,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;gBAC5F,CAAC,CAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAsD;gBAC7E,CAAC,CAAC,QAAQ,CAAC;YACb,OAAO;gBACL,IAAI;gBACJ,MAAM;gBACN,MAAM,EAAE;oBACN,MAAM;oBACN,KAAK,EAAE,OAAO,MAAM,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;oBAC1D,SAAS,EAAE,OAAO,MAAM,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;oBACtE,QAAQ,EAAE,OAAO,MAAM,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK;oBACxE,QAAQ,EAAE,cAAc,CAAC,MAAM,EAAE,UAAU,EAAE,MAAM,CAAC;iBACrD;aACF,CAAC;QACJ,CAAC;QACD,KAAK,sBAAsB;YACzB,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,aAAa,EAAE,OAAO,CAAC,aAAa,KAAK,IAAI,EAAE,CAAC;QACzE,KAAK,iBAAiB,CAAC,CAAC,CAAC;YACvB,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;YAC9B,IAAI,CAAC,uBAAuB,CAAC,MAAM,CAAC,EAAE,CAAC;gBACrC,MAAM,CAAC,IAAI,CAAC,kDAAkD,CAAC,CAAC;YAClE,CAAC;YACD,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;YAC9B,IAAI,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;gBAC/C,MAAM,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC;YAC7D,CAAC;YACD,OAAO;gBACL,IAAI;gBACJ,MAAM;gBACN,MAAM,EAAE,uBAAuB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,YAAY;gBAC/D,MAAM,EAAE,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ;gBACjD,QAAQ,EAAE,aAAa,CAAC,QAAQ,EAAE,MAAM,CAAC;aAC1C,CAAC;QACJ,CAAC;QACD,KAAK,+BAA+B;YAClC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;QAC1B,KAAK,iBAAiB,CAAC,CAAC,CAAC;YACvB,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;YACtC,IAAI,UAAU,KAAK,eAAe,IAAI,UAAU,KAAK,iBAAiB,IAAI,UAAU,KAAK,WAAW,EAAE,CAAC;gBACrG,MAAM,CAAC,IAAI,CAAC,yEAAyE,CAAC,CAAC;YACzF,CAAC;YACD,OAAO;gBACL,IAAI;gBACJ,MAAM;gBACN,UAAU,EACR,UAAU,KAAK,iBAAiB;oBAC9B,CAAC,CAAC,iBAAiB;oBACnB,CAAC,CAAC,UAAU,KAAK,eAAe;wBAC9B,CAAC,CAAC,eAAe;wBACjB,CAAC,CAAC,WAAW;gBACnB,cAAc,EAAE,OAAO,OAAO,CAAC,cAAc,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,SAAS;aAChG,CAAC;QACJ,CAAC;QACD,KAAK,+BAA+B;YAClC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;QAC1B,KAAK,qBAAqB;YACxB,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;QAC1B,KAAK,qBAAqB;YACxB,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;QAC7D,KAAK,0BAA0B;YAC7B,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;QAC1B,KAAK,mBAAmB;YACtB,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,CAAC,OAAO,EAAE,QAAQ,EAAE,MAAM,CAAC,EAAE,CAAC;QAC7E,KAAK,QAAQ;YACX,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,CAAC,OAAO,EAAE,QAAQ,EAAE,MAAM,CAAC,EAAE,CAAC;IAC/E,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,UAAU,GAAG,GAAG,EAAE,CAAC,CAAC;IACxB,KAAK,EAAE,EAAE;IACT,QAAQ,EAAE,aAAgC;IAC1C,gBAAgB,EAAE,KAAK;IACvB,YAAY,EAAE,EAAuB;IACrC,gBAAgB,EAAE,CAAC;IACnB,gBAAgB,EAAE,EAAE;IACpB,QAAQ,EAAE,EAAE;CACb,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,KAAc,EAA2B,EAAE;IAC/E,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,0BAA0B,CAAC,EAAE,CAAC;IAEjF,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,KAAK,CAAC;QAAE,MAAM,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;IAClF,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,QAAQ,CAAC;QAAE,MAAM,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC;IACxF,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC;QACpF,MAAM,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAC;IAC1D,CAAC;IACD,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC;QAAE,MAAM,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;IACvE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,CAAC,EAAE,CAAC;QAClG,MAAM,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAC;IACtD,CAAC;IAED,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;IACxB,6EAA6E;IAC7E,gFAAgF;IAChF,MAAM,SAAS,GAAG,OAAO,IAAI,KAAK,QAAQ,IAAI,MAAM,CAAC,MAAM,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC,CAAC,CAAE,IAAuB,CAAC,CAAC,CAAC,IAAI,CAAC;IACnH,IAAI,CAAC,SAAS;QAAE,MAAM,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC;IAElE,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;IAC5B,MAAM,WAAW,GAAG,MAAM,KAAK,IAAI,IAAI,MAAM,KAAK,MAAM,IAAI,MAAM,KAAK,OAAO,IAAI,MAAM,KAAK,QAAQ,CAAC;IACtG,IAAI,CAAC,WAAW;QAAE,MAAM,CAAC,IAAI,CAAC,2CAA2C,CAAC,CAAC;IAC3E,IAAI,SAAS,IAAI,WAAW,IAAI,aAAa,CAAC,SAAS,CAAC,KAAK,MAAM,EAAE,CAAC;QACpE,MAAM,CAAC,IAAI,CAAC,cAAc,SAAS,YAAY,aAAa,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;IAC7E,CAAC;IAED,2EAA2E;IAC3E,yEAAyE;IACzE,4EAA4E;IAC5E,oDAAoD;IACpD,MAAM,QAAQ,GAAG,OAAO,KAAK,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;IAC1E,IAAI,SAAS,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;QAC/C,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,kBAAkB,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QACnG,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,CAAC,IAAI,CAAC,YAAY,QAAQ,IAAI,GAAG,yCAAyC,SAAS,EAAE,CAAC,CAAC;QAC/F,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;gBACnC,MAAM,CAAC,IAAI,CAAC,YAAY,QAAQ,4BAA4B,SAAS,EAAE,CAAC,CAAC;YAC3E,CAAC;YACD,IAAI,WAAW,IAAI,QAAQ,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;gBAC9C,MAAM,CAAC,IAAI,CAAC,YAAY,QAAQ,oBAAoB,QAAQ,CAAC,MAAM,SAAS,MAAM,EAAE,CAAC,CAAC;YACxF,CAAC;QACH,CAAC;IACH,CAAC;IAED,mEAAmE;IACnE,6EAA6E;IAC7E,MAAM,CAAC,IAAI,CAAC,GAAG,iBAAiB,CAAC,KAAK,EAAE,yBAAyB,CAAC,CAAC,CAAC;IACpE,IAAI,MAAM,KAAK,IAAI;QAAE,MAAM,CAAC,IAAI,CAAC,GAAG,iBAAiB,CAAC,KAAK,EAAE,2BAA2B,CAAC,CAAC,CAAC;IAE3F,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;IAC7D,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC;QAC5C,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,KAAK,EAAmB,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,CAAC;QAC9E,CAAC,CAAC,EAAE,CAAC;IACP,MAAM,KAAK,GAAG,SAAS,IAAI,WAAW,CAAC,CAAC,CAAC,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAEzG,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,SAAS;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IAC5E,OAAO;QACL,EAAE,EAAE,IAAI;QACR,MAAM,EAAE;YACN,KAAK,EAAE,KAAK,CAAC,KAAe;YAC5B,IAAI,EAAE,SAAS;YACf,MAAM,EAAE,MAA6B;YACrC,QAAQ,EAAE,KAAK,CAAC,QAAkB;YAClC,UAAU,EAAE,KAAK,CAAC,UAAoB;YACtC,OAAO;YACP,QAAQ;SACT;QACD,KAAK;KACN,CAAC;AACJ,CAAC,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@guyghost/swarm-dao-product",
|
|
3
|
+
"version": "0.2.0",
|
|
4
|
+
"description": "Swarm DAO product-loop executor — journal-replayed product runs (proposition, qualification, vote, execution, verification, observation) with producer-bound signal validation",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.js",
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
|
+
"sideEffects": false,
|
|
9
|
+
"files": [
|
|
10
|
+
"dist",
|
|
11
|
+
"README.md"
|
|
12
|
+
],
|
|
13
|
+
"exports": {
|
|
14
|
+
".": {
|
|
15
|
+
"types": "./dist/index.d.ts",
|
|
16
|
+
"import": "./dist/index.js"
|
|
17
|
+
}
|
|
18
|
+
},
|
|
19
|
+
"scripts": {
|
|
20
|
+
"build": "tsc",
|
|
21
|
+
"test": "bun test",
|
|
22
|
+
"lint": "biome check .",
|
|
23
|
+
"typecheck": "tsc --noEmit",
|
|
24
|
+
"prepublishOnly": "bun run build"
|
|
25
|
+
},
|
|
26
|
+
"dependencies": {
|
|
27
|
+
"@guyghost/swarm-dao-core": "^0.10.2"
|
|
28
|
+
},
|
|
29
|
+
"devDependencies": {
|
|
30
|
+
"@types/bun": "1.3.14",
|
|
31
|
+
"@types/node": "^26.0.1"
|
|
32
|
+
},
|
|
33
|
+
"keywords": [
|
|
34
|
+
"swarm-dao",
|
|
35
|
+
"product-loop",
|
|
36
|
+
"dao",
|
|
37
|
+
"xstate"
|
|
38
|
+
],
|
|
39
|
+
"author": "guyghost",
|
|
40
|
+
"license": "MIT",
|
|
41
|
+
"repository": {
|
|
42
|
+
"type": "git",
|
|
43
|
+
"url": "git+https://github.com/guyghost/swarm-dao.git",
|
|
44
|
+
"directory": "packages/product-loop"
|
|
45
|
+
},
|
|
46
|
+
"bugs": {
|
|
47
|
+
"url": "https://github.com/guyghost/swarm-dao/issues"
|
|
48
|
+
},
|
|
49
|
+
"homepage": "https://github.com/guyghost/swarm-dao#readme",
|
|
50
|
+
"publishConfig": {
|
|
51
|
+
"access": "public"
|
|
52
|
+
}
|
|
53
|
+
}
|