moltblock 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.
Files changed (68) hide show
  1. package/LICENSE +21 -0
  2. package/config/code_entity_graph.json +12 -0
  3. package/dist/agents.d.ts +24 -0
  4. package/dist/agents.d.ts.map +1 -0
  5. package/dist/agents.js +124 -0
  6. package/dist/agents.js.map +1 -0
  7. package/dist/cli.d.ts +6 -0
  8. package/dist/cli.d.ts.map +1 -0
  9. package/dist/cli.js +58 -0
  10. package/dist/cli.js.map +1 -0
  11. package/dist/config.d.ts +135 -0
  12. package/dist/config.d.ts.map +1 -0
  13. package/dist/config.js +139 -0
  14. package/dist/config.js.map +1 -0
  15. package/dist/entity.d.ts +31 -0
  16. package/dist/entity.d.ts.map +1 -0
  17. package/dist/entity.js +80 -0
  18. package/dist/entity.js.map +1 -0
  19. package/dist/gateway.d.ts +19 -0
  20. package/dist/gateway.d.ts.map +1 -0
  21. package/dist/gateway.js +63 -0
  22. package/dist/gateway.js.map +1 -0
  23. package/dist/governance.d.ts +46 -0
  24. package/dist/governance.d.ts.map +1 -0
  25. package/dist/governance.js +87 -0
  26. package/dist/governance.js.map +1 -0
  27. package/dist/graph-runner.d.ts +28 -0
  28. package/dist/graph-runner.d.ts.map +1 -0
  29. package/dist/graph-runner.js +103 -0
  30. package/dist/graph-runner.js.map +1 -0
  31. package/dist/graph-schema.d.ts +116 -0
  32. package/dist/graph-schema.d.ts.map +1 -0
  33. package/dist/graph-schema.js +137 -0
  34. package/dist/graph-schema.js.map +1 -0
  35. package/dist/handoff.d.ts +20 -0
  36. package/dist/handoff.d.ts.map +1 -0
  37. package/dist/handoff.js +38 -0
  38. package/dist/handoff.js.map +1 -0
  39. package/dist/improvement.d.ts +32 -0
  40. package/dist/improvement.d.ts.map +1 -0
  41. package/dist/improvement.js +67 -0
  42. package/dist/improvement.js.map +1 -0
  43. package/dist/index.d.ts +19 -0
  44. package/dist/index.d.ts.map +1 -0
  45. package/dist/index.js +31 -0
  46. package/dist/index.js.map +1 -0
  47. package/dist/memory.d.ts +28 -0
  48. package/dist/memory.d.ts.map +1 -0
  49. package/dist/memory.js +46 -0
  50. package/dist/memory.js.map +1 -0
  51. package/dist/persistence.d.ts +83 -0
  52. package/dist/persistence.d.ts.map +1 -0
  53. package/dist/persistence.js +295 -0
  54. package/dist/persistence.js.map +1 -0
  55. package/dist/signing.d.ts +16 -0
  56. package/dist/signing.d.ts.map +1 -0
  57. package/dist/signing.js +43 -0
  58. package/dist/signing.js.map +1 -0
  59. package/dist/types.d.ts +80 -0
  60. package/dist/types.d.ts.map +1 -0
  61. package/dist/types.js +5 -0
  62. package/dist/types.js.map +1 -0
  63. package/dist/verifier.d.ts +22 -0
  64. package/dist/verifier.d.ts.map +1 -0
  65. package/dist/verifier.js +198 -0
  66. package/dist/verifier.js.map +1 -0
  67. package/package.json +64 -0
  68. package/readme.md +125 -0
package/dist/entity.js ADDED
@@ -0,0 +1,80 @@
1
+ /**
2
+ * Entity: minimal runnable loop — task in -> graph (Generator/Critic/Judge) -> Verifier -> artifact out.
3
+ */
4
+ import { runCritic, runGenerator, runJudge } from "./agents.js";
5
+ import { defaultCodeEntityBindings } from "./config.js";
6
+ import { LLMGateway } from "./gateway.js";
7
+ import { GraphRunner } from "./graph-runner.js";
8
+ import { AgentGraph } from "./graph-schema.js";
9
+ import { WorkingMemory } from "./memory.js";
10
+ import { hashMemory, recordOutcome } from "./persistence.js";
11
+ import { runVerifier } from "./verifier.js";
12
+ /**
13
+ * Code Entity: Generator -> Critic -> Judge -> Verifier.
14
+ * Uses working memory and per-role LLM gateways.
15
+ */
16
+ export class CodeEntity {
17
+ gateways;
18
+ constructor(bindings) {
19
+ const resolvedBindings = bindings ?? defaultCodeEntityBindings();
20
+ this.gateways = {
21
+ generator: new LLMGateway(resolvedBindings["generator"]),
22
+ critic: new LLMGateway(resolvedBindings["critic"]),
23
+ judge: new LLMGateway(resolvedBindings["judge"]),
24
+ };
25
+ }
26
+ /**
27
+ * One full loop: task in -> Generator -> Critic -> Judge -> Verifier -> gating.
28
+ * If store is provided and verification passed: admit to verified memory; optionally write checkpoint.
29
+ * Returns working memory with authoritative_artifact set only if verification passed.
30
+ */
31
+ async run(task, options = {}) {
32
+ const { testCode, store, entityVersion = "0.2.0", writeCheckpointAfter = false, } = options;
33
+ const t0 = performance.now();
34
+ const memory = new WorkingMemory();
35
+ memory.setTask(task);
36
+ // Inject long-term context from verified memory
37
+ if (store) {
38
+ const recent = store.getRecentVerified(5);
39
+ const parts = [];
40
+ for (const e of recent) {
41
+ if (e.content_preview) {
42
+ parts.push(e.content_preview.slice(0, 500));
43
+ }
44
+ else if (e.summary) {
45
+ parts.push(e.summary);
46
+ }
47
+ }
48
+ memory.longTermContext = parts.length > 0 ? parts.join("\n---\n") : "";
49
+ }
50
+ // Run the agent pipeline
51
+ await runGenerator(this.gateways["generator"], memory, store ?? null);
52
+ await runCritic(this.gateways["critic"], memory, store ?? null);
53
+ await runJudge(this.gateways["judge"], memory, store ?? null);
54
+ await runVerifier(memory, testCode);
55
+ // Record outcome and persist if verification passed
56
+ const latencySec = (performance.now() - t0) / 1000;
57
+ if (store) {
58
+ recordOutcome(store, memory.verificationPassed, latencySec, task.slice(0, 100));
59
+ }
60
+ if (store && memory.verificationPassed && memory.authoritativeArtifact) {
61
+ const artifactRef = `artifact_${Date.now()}`;
62
+ store.addVerified(artifactRef, `Verified artifact (${memory.authoritativeArtifact.length} chars)`, memory.authoritativeArtifact.slice(0, 2000));
63
+ if (writeCheckpointAfter) {
64
+ const graphHash = "fixed-code-entity";
65
+ const refs = [artifactRef];
66
+ const memHash = hashMemory(refs);
67
+ store.writeCheckpoint(entityVersion, graphHash, memHash, refs);
68
+ }
69
+ }
70
+ return memory;
71
+ }
72
+ }
73
+ /**
74
+ * Load an Entity from a declarative graph (JSON/YAML). Returns a GraphRunner.
75
+ */
76
+ export function loadEntityWithGraph(graphPath, bindings) {
77
+ const graph = AgentGraph.load(graphPath);
78
+ return new GraphRunner(graph, bindings);
79
+ }
80
+ //# sourceMappingURL=entity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entity.js","sourceRoot":"","sources":["../src/entity.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * LLM gateway: single interface for local (LM Studio/llama.cpp) and Z.ai / OpenAI-compatible APIs.
3
+ */
4
+ import type { ModelBinding, ChatMessage } from "./types.js";
5
+ /**
6
+ * One client per role; uses OpenAI-compatible API with base_url and optional api_key.
7
+ */
8
+ export declare class LLMGateway {
9
+ private client;
10
+ private model;
11
+ private modelResolved;
12
+ private binding;
13
+ constructor(binding: ModelBinding);
14
+ /**
15
+ * Send chat completion request; return assistant content.
16
+ */
17
+ complete(messages: ChatMessage[], maxTokens?: number): Promise<string>;
18
+ }
19
+ //# sourceMappingURL=gateway.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gateway.d.ts","sourceRoot":"","sources":["../src/gateway.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AA4B5D;;GAEG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,OAAO,CAAe;gBAElB,OAAO,EAAE,YAAY;IASjC;;OAEG;IACG,QAAQ,CAAC,QAAQ,EAAE,WAAW,EAAE,EAAE,SAAS,SAAO,GAAG,OAAO,CAAC,MAAM,CAAC;CAkB3E"}
@@ -0,0 +1,63 @@
1
+ /**
2
+ * LLM gateway: single interface for local (LM Studio/llama.cpp) and Z.ai / OpenAI-compatible APIs.
3
+ */
4
+ import OpenAI from "openai";
5
+ /**
6
+ * If model is 'local' or empty and base_url is localhost, use first available model from API.
7
+ */
8
+ async function resolveLocalModel(client, baseUrl, configured) {
9
+ if (configured && configured !== "local") {
10
+ return configured;
11
+ }
12
+ if (!baseUrl.includes("localhost") && !baseUrl.includes("127.0.0.1")) {
13
+ return configured || "default";
14
+ }
15
+ try {
16
+ const models = await client.models.list();
17
+ const firstModel = models.data[0];
18
+ if (firstModel?.id) {
19
+ return firstModel.id;
20
+ }
21
+ }
22
+ catch {
23
+ // Ignore errors, use default
24
+ }
25
+ return configured || "default";
26
+ }
27
+ /**
28
+ * One client per role; uses OpenAI-compatible API with base_url and optional api_key.
29
+ */
30
+ export class LLMGateway {
31
+ client;
32
+ model;
33
+ modelResolved = false;
34
+ binding;
35
+ constructor(binding) {
36
+ this.binding = binding;
37
+ this.client = new OpenAI({
38
+ baseURL: binding.baseUrl,
39
+ apiKey: binding.apiKey ?? "not-needed",
40
+ });
41
+ this.model = binding.model;
42
+ }
43
+ /**
44
+ * Send chat completion request; return assistant content.
45
+ */
46
+ async complete(messages, maxTokens = 2048) {
47
+ if (!this.modelResolved) {
48
+ this.model = await resolveLocalModel(this.client, this.binding.baseUrl, this.model);
49
+ this.modelResolved = true;
50
+ }
51
+ const resp = await this.client.chat.completions.create({
52
+ model: this.model,
53
+ messages: messages.map((m) => ({ role: m.role, content: m.content })),
54
+ max_tokens: maxTokens,
55
+ });
56
+ const choice = resp.choices[0];
57
+ if (!choice?.message) {
58
+ return "";
59
+ }
60
+ return choice.message.content ?? "";
61
+ }
62
+ }
63
+ //# sourceMappingURL=gateway.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gateway.js","sourceRoot":"","sources":["../src/gateway.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,MAAM,MAAM,QAAQ,CAAC;AAG5B;;GAEG;AACH,KAAK,UAAU,iBAAiB,CAC9B,MAAc,EACd,OAAe,EACf,UAAkB;IAElB,IAAI,UAAU,IAAI,UAAU,KAAK,OAAO,EAAE,CAAC;QACzC,OAAO,UAAU,CAAC;IACpB,CAAC;IACD,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;QACrE,OAAO,UAAU,IAAI,SAAS,CAAC;IACjC,CAAC;IACD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QAC1C,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClC,IAAI,UAAU,EAAE,EAAE,EAAE,CAAC;YACnB,OAAO,UAAU,CAAC,EAAE,CAAC;QACvB,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,6BAA6B;IAC/B,CAAC;IACD,OAAO,UAAU,IAAI,SAAS,CAAC;AACjC,CAAC;AAED;;GAEG;AACH,MAAM,OAAO,UAAU;IACb,MAAM,CAAS;IACf,KAAK,CAAS;IACd,aAAa,GAAG,KAAK,CAAC;IACtB,OAAO,CAAe;IAE9B,YAAY,OAAqB;QAC/B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,MAAM,GAAG,IAAI,MAAM,CAAC;YACvB,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,YAAY;SACvC,CAAC,CAAC;QACH,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;IAC7B,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,QAAQ,CAAC,QAAuB,EAAE,SAAS,GAAG,IAAI;QACtD,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;YACxB,IAAI,CAAC,KAAK,GAAG,MAAM,iBAAiB,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;YACpF,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;QAC5B,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;YACrD,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,QAAQ,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;YACrE,UAAU,EAAE,SAAS;SACtB,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAC/B,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC;YACrB,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,OAAO,MAAM,CAAC,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC;IACtC,CAAC;CACF"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Governance: molt rate limits, human veto, audit. Enforced outside the cognitive loop.
3
+ */
4
+ import type { GovernanceConfig } from "./types.js";
5
+ import { Store } from "./persistence.js";
6
+ /**
7
+ * Create a governance config with defaults.
8
+ */
9
+ export declare function createGovernanceConfig(overrides?: Partial<GovernanceConfig>): GovernanceConfig;
10
+ /**
11
+ * Return [allowed, reason]. Checks rate limit and veto.
12
+ */
13
+ export declare function canMolt(store: Store, config: GovernanceConfig): {
14
+ allowed: boolean;
15
+ reason: string;
16
+ };
17
+ /**
18
+ * Trigger a molt: validate governance, write checkpoint, bump version, audit.
19
+ * New graph/bindings/prompts are applied by the caller (e.g. load new graph).
20
+ * Returns { success, message }.
21
+ */
22
+ export declare function triggerMolt(store: Store, entityVersion: string, config: GovernanceConfig, options?: {
23
+ graphHash?: string;
24
+ memoryHash?: string;
25
+ artifactRefs?: string[];
26
+ }): {
27
+ success: boolean;
28
+ message: string;
29
+ };
30
+ /**
31
+ * Human veto: pause the entity (no further work until resumed).
32
+ */
33
+ export declare function pause(store: Store): void;
34
+ /**
35
+ * Resume after pause.
36
+ */
37
+ export declare function resume(store: Store): void;
38
+ /**
39
+ * Return true if entity is paused.
40
+ */
41
+ export declare function isPaused(store: Store): boolean;
42
+ /**
43
+ * Record emergency shutdown in audit log.
44
+ */
45
+ export declare function emergencyShutdown(store: Store): void;
46
+ //# sourceMappingURL=governance.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"governance.d.ts","sourceRoot":"","sources":["../src/governance.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,EACL,KAAK,EAIN,MAAM,kBAAkB,CAAC;AAE1B;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,SAAS,GAAE,OAAO,CAAC,gBAAgB,CAAM,GACxC,gBAAgB,CAMlB;AAED;;GAEG;AACH,wBAAgB,OAAO,CACrB,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,gBAAgB,GACvB;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAyBtC;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CACzB,KAAK,EAAE,KAAK,EACZ,aAAa,EAAE,MAAM,EACrB,MAAM,EAAE,gBAAgB,EACxB,OAAO,GAAE;IACP,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;CACpB,GACL;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAqBvC;AAED;;GAEG;AACH,wBAAgB,KAAK,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAGxC;AAED;;GAEG;AACH,wBAAgB,MAAM,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAGzC;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAE9C;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAEpD"}
@@ -0,0 +1,87 @@
1
+ /**
2
+ * Governance: molt rate limits, human veto, audit. Enforced outside the cognitive loop.
3
+ */
4
+ import { auditLog, getGovernanceValue, setGovernanceValue, } from "./persistence.js";
5
+ /**
6
+ * Create a governance config with defaults.
7
+ */
8
+ export function createGovernanceConfig(overrides = {}) {
9
+ return {
10
+ moltRateLimitSec: overrides.moltRateLimitSec ?? 60.0,
11
+ allowedMoltTriggers: overrides.allowedMoltTriggers ?? ["system", "human"],
12
+ humanVetoPaused: overrides.humanVetoPaused ?? false,
13
+ };
14
+ }
15
+ /**
16
+ * Return [allowed, reason]. Checks rate limit and veto.
17
+ */
18
+ export function canMolt(store, config) {
19
+ if (config.humanVetoPaused) {
20
+ const paused = getGovernanceValue(store, "paused");
21
+ if (paused === "1") {
22
+ return { allowed: false, reason: "Entity is paused (human veto)" };
23
+ }
24
+ }
25
+ const last = getGovernanceValue(store, "last_molt_at");
26
+ if (last) {
27
+ try {
28
+ const t = parseFloat(last);
29
+ const now = Date.now() / 1000;
30
+ if (now - t < config.moltRateLimitSec) {
31
+ return {
32
+ allowed: false,
33
+ reason: `Molt rate limit: wait ${config.moltRateLimitSec}s between molts`,
34
+ };
35
+ }
36
+ }
37
+ catch {
38
+ // Ignore parse errors
39
+ }
40
+ }
41
+ return { allowed: true, reason: "" };
42
+ }
43
+ /**
44
+ * Trigger a molt: validate governance, write checkpoint, bump version, audit.
45
+ * New graph/bindings/prompts are applied by the caller (e.g. load new graph).
46
+ * Returns { success, message }.
47
+ */
48
+ export function triggerMolt(store, entityVersion, config, options = {}) {
49
+ const { graphHash = "", memoryHash = "", artifactRefs = [] } = options;
50
+ const { allowed, reason } = canMolt(store, config);
51
+ if (!allowed) {
52
+ return { success: false, message: reason };
53
+ }
54
+ store.writeCheckpoint(entityVersion, graphHash || "molt", memoryHash || "", artifactRefs);
55
+ const now = Date.now() / 1000;
56
+ setGovernanceValue(store, "last_molt_at", now.toString());
57
+ setGovernanceValue(store, "entity_version", entityVersion);
58
+ auditLog(store, "molt", `version=${entityVersion} graph_hash=${graphHash}`);
59
+ return { success: true, message: "Molt completed" };
60
+ }
61
+ /**
62
+ * Human veto: pause the entity (no further work until resumed).
63
+ */
64
+ export function pause(store) {
65
+ setGovernanceValue(store, "paused", "1");
66
+ auditLog(store, "pause", "human veto");
67
+ }
68
+ /**
69
+ * Resume after pause.
70
+ */
71
+ export function resume(store) {
72
+ setGovernanceValue(store, "paused", "0");
73
+ auditLog(store, "resume", "");
74
+ }
75
+ /**
76
+ * Return true if entity is paused.
77
+ */
78
+ export function isPaused(store) {
79
+ return getGovernanceValue(store, "paused") === "1";
80
+ }
81
+ /**
82
+ * Record emergency shutdown in audit log.
83
+ */
84
+ export function emergencyShutdown(store) {
85
+ auditLog(store, "emergency_shutdown", "");
86
+ }
87
+ //# sourceMappingURL=governance.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"governance.js","sourceRoot":"","sources":["../src/governance.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Execute an agent graph: load DAG, run nodes in topological order, then verifier.
3
+ */
4
+ import { type ModelBinding } from "./config.js";
5
+ import { AgentGraph } from "./graph-schema.js";
6
+ import { WorkingMemory } from "./memory.js";
7
+ import { Store } from "./persistence.js";
8
+ /**
9
+ * Runs a declarative agent graph: nodes (role + binding), edges (data flow).
10
+ * After all nodes run, verifier runs on the final node's output and gating is applied.
11
+ */
12
+ export declare class GraphRunner {
13
+ private graph;
14
+ private gateways;
15
+ constructor(graph: AgentGraph, bindings?: Record<string, ModelBinding>);
16
+ /**
17
+ * Execute graph: task in -> run nodes in topo order -> run verifier on final node -> gating.
18
+ * If store is provided and verification passed: admit to verified memory; optionally write checkpoint.
19
+ * Returns working memory with slots filled and authoritative_artifact set iff verification passed.
20
+ */
21
+ run(task: string, options?: {
22
+ testCode?: string;
23
+ store?: Store;
24
+ entityVersion?: string;
25
+ writeCheckpointAfter?: boolean;
26
+ }): Promise<WorkingMemory>;
27
+ }
28
+ //# sourceMappingURL=graph-runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph-runner.d.ts","sourceRoot":"","sources":["../src/graph-runner.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAA6B,KAAK,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3E,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,KAAK,EAAwC,MAAM,kBAAkB,CAAC;AAG/E;;;GAGG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,KAAK,CAAa;IAC1B,OAAO,CAAC,QAAQ,CAAsC;gBAE1C,KAAK,EAAE,UAAU,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC;IAmBtE;;;;OAIG;IACG,GAAG,CACP,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE;QACP,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,KAAK,CAAC,EAAE,KAAK,CAAC;QACd,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,oBAAoB,CAAC,EAAE,OAAO,CAAC;KAC3B,GACL,OAAO,CAAC,aAAa,CAAC;CA0F1B"}
@@ -0,0 +1,103 @@
1
+ /**
2
+ * Execute an agent graph: load DAG, run nodes in topological order, then verifier.
3
+ */
4
+ import { runRole } from "./agents.js";
5
+ import { defaultCodeEntityBindings } from "./config.js";
6
+ import { LLMGateway } from "./gateway.js";
7
+ import { WorkingMemory } from "./memory.js";
8
+ import { hashGraph, hashMemory, recordOutcome } from "./persistence.js";
9
+ import { runVerifier } from "./verifier.js";
10
+ /**
11
+ * Runs a declarative agent graph: nodes (role + binding), edges (data flow).
12
+ * After all nodes run, verifier runs on the final node's output and gating is applied.
13
+ */
14
+ export class GraphRunner {
15
+ graph;
16
+ gateways = new Map();
17
+ constructor(graph, bindings) {
18
+ this.graph = graph;
19
+ const resolvedBindings = bindings ?? defaultCodeEntityBindings();
20
+ for (const node of graph.nodes) {
21
+ if (node.role === "verifier") {
22
+ continue;
23
+ }
24
+ const key = node.binding;
25
+ if (!this.gateways.has(key)) {
26
+ const binding = resolvedBindings[key];
27
+ if (!binding) {
28
+ throw new Error(`Binding key '${key}' not in bindings`);
29
+ }
30
+ this.gateways.set(key, new LLMGateway(binding));
31
+ }
32
+ }
33
+ }
34
+ /**
35
+ * Execute graph: task in -> run nodes in topo order -> run verifier on final node -> gating.
36
+ * If store is provided and verification passed: admit to verified memory; optionally write checkpoint.
37
+ * Returns working memory with slots filled and authoritative_artifact set iff verification passed.
38
+ */
39
+ async run(task, options = {}) {
40
+ const { testCode, store, entityVersion = "0.2.0", writeCheckpointAfter = false, } = options;
41
+ const t0 = performance.now();
42
+ const memory = new WorkingMemory();
43
+ memory.setTask(task);
44
+ // Inject long-term context from verified memory
45
+ if (store) {
46
+ const recent = store.getRecentVerified(5);
47
+ const parts = [];
48
+ for (const e of recent) {
49
+ if (e.content_preview) {
50
+ parts.push(e.content_preview.slice(0, 500));
51
+ }
52
+ else if (e.summary) {
53
+ parts.push(e.summary);
54
+ }
55
+ }
56
+ memory.longTermContext = parts.length > 0 ? parts.join("\n---\n") : "";
57
+ }
58
+ // Run nodes in topological order
59
+ const order = this.graph.topologicalOrder();
60
+ for (const nodeId of order) {
61
+ const node = this.graph.nodes.find((n) => n.id === nodeId);
62
+ if (!node || node.role === "verifier") {
63
+ continue;
64
+ }
65
+ const preds = this.graph.predecessors(nodeId);
66
+ const inputs = {};
67
+ for (const p of preds) {
68
+ inputs[p] = memory.getSlot(p);
69
+ }
70
+ const gateway = this.gateways.get(node.binding);
71
+ if (!gateway) {
72
+ throw new Error(`No gateway for binding '${node.binding}'`);
73
+ }
74
+ const out = await runRole(node.role, gateway, task, inputs, memory.longTermContext, store ?? null);
75
+ memory.setSlot(nodeId, out);
76
+ }
77
+ // Set final candidate from final node
78
+ const finalId = this.graph.getFinalNodeId();
79
+ if (finalId) {
80
+ memory.finalCandidate = memory.getSlot(finalId);
81
+ }
82
+ // Run verification
83
+ await runVerifier(memory, testCode);
84
+ // Record outcome and persist if verification passed
85
+ const latencySec = (performance.now() - t0) / 1000;
86
+ if (store) {
87
+ recordOutcome(store, memory.verificationPassed, latencySec, task.slice(0, 100));
88
+ }
89
+ if (store && memory.verificationPassed && memory.authoritativeArtifact) {
90
+ const artifactRef = `artifact_${Date.now()}`;
91
+ store.addVerified(artifactRef, `Verified artifact (${memory.authoritativeArtifact.length} chars)`, memory.authoritativeArtifact.slice(0, 2000));
92
+ if (writeCheckpointAfter) {
93
+ const graphConfig = this.graph.toJSON();
94
+ const graphHashVal = hashGraph(graphConfig);
95
+ const refs = [artifactRef];
96
+ const memHash = hashMemory(refs);
97
+ store.writeCheckpoint(entityVersion, graphHashVal, memHash, refs);
98
+ }
99
+ }
100
+ return memory;
101
+ }
102
+ }
103
+ //# sourceMappingURL=graph-runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph-runner.js","sourceRoot":"","sources":["../src/graph-runner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,116 @@
1
+ /**
2
+ * Agent graph schema: DAG of nodes (role + model_binding) and edges (data flow).
3
+ */
4
+ import { z } from "zod";
5
+ export declare const GraphNodeSchema: z.ZodObject<{
6
+ id: z.ZodString;
7
+ role: z.ZodString;
8
+ binding: z.ZodString;
9
+ }, "strip", z.ZodTypeAny, {
10
+ id: string;
11
+ role: string;
12
+ binding: string;
13
+ }, {
14
+ id: string;
15
+ role: string;
16
+ binding: string;
17
+ }>;
18
+ export type GraphNode = z.infer<typeof GraphNodeSchema>;
19
+ export declare const GraphEdgeSchema: z.ZodObject<{
20
+ from: z.ZodString;
21
+ to: z.ZodString;
22
+ }, "strip", z.ZodTypeAny, {
23
+ from: string;
24
+ to: string;
25
+ }, {
26
+ from: string;
27
+ to: string;
28
+ }>;
29
+ export type GraphEdge = z.infer<typeof GraphEdgeSchema>;
30
+ export declare const AgentGraphSchema: z.ZodObject<{
31
+ nodes: z.ZodDefault<z.ZodArray<z.ZodObject<{
32
+ id: z.ZodString;
33
+ role: z.ZodString;
34
+ binding: z.ZodString;
35
+ }, "strip", z.ZodTypeAny, {
36
+ id: string;
37
+ role: string;
38
+ binding: string;
39
+ }, {
40
+ id: string;
41
+ role: string;
42
+ binding: string;
43
+ }>, "many">>;
44
+ edges: z.ZodDefault<z.ZodArray<z.ZodObject<{
45
+ from: z.ZodString;
46
+ to: z.ZodString;
47
+ }, "strip", z.ZodTypeAny, {
48
+ from: string;
49
+ to: string;
50
+ }, {
51
+ from: string;
52
+ to: string;
53
+ }>, "many">>;
54
+ final_node: z.ZodOptional<z.ZodNullable<z.ZodString>>;
55
+ }, "strip", z.ZodTypeAny, {
56
+ nodes: {
57
+ id: string;
58
+ role: string;
59
+ binding: string;
60
+ }[];
61
+ edges: {
62
+ from: string;
63
+ to: string;
64
+ }[];
65
+ final_node?: string | null | undefined;
66
+ }, {
67
+ nodes?: {
68
+ id: string;
69
+ role: string;
70
+ binding: string;
71
+ }[] | undefined;
72
+ edges?: {
73
+ from: string;
74
+ to: string;
75
+ }[] | undefined;
76
+ final_node?: string | null | undefined;
77
+ }>;
78
+ export type AgentGraphData = z.infer<typeof AgentGraphSchema>;
79
+ /**
80
+ * Declarative agent graph: nodes and edges. Verifier runs on final node(s) output.
81
+ */
82
+ export declare class AgentGraph {
83
+ readonly nodes: GraphNode[];
84
+ readonly edges: GraphEdge[];
85
+ readonly finalNode: string | null;
86
+ constructor(data: AgentGraphData);
87
+ /**
88
+ * Return list of node ids that have an edge into nodeId.
89
+ */
90
+ predecessors(nodeId: string): string[];
91
+ /**
92
+ * Return list of node ids that nodeId has an edge to.
93
+ */
94
+ successors(nodeId: string): string[];
95
+ /**
96
+ * Return node ids in topological order (inputs before outputs).
97
+ */
98
+ topologicalOrder(): string[];
99
+ /**
100
+ * Node whose output goes to verifier. Explicit final_node or single node with no outgoing edges.
101
+ */
102
+ getFinalNodeId(): string | null;
103
+ /**
104
+ * Serialize to JSON string.
105
+ */
106
+ toJSON(): string;
107
+ /**
108
+ * Load graph from JSON or YAML file.
109
+ */
110
+ static load(filePath: string): AgentGraph;
111
+ /**
112
+ * Create graph from data object.
113
+ */
114
+ static fromData(data: AgentGraphData): AgentGraph;
115
+ }
116
+ //# sourceMappingURL=graph-schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph-schema.d.ts","sourceRoot":"","sources":["../src/graph-schema.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,eAAe;;;;;;;;;;;;EAI1B,CAAC;AAEH,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AAExD,eAAO,MAAM,eAAe;;;;;;;;;EAG1B,CAAC;AAEH,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AAExD,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAU3B,CAAC;AAEH,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAE9D;;GAEG;AACH,qBAAa,UAAU;IACrB,QAAQ,CAAC,KAAK,EAAE,SAAS,EAAE,CAAC;IAC5B,QAAQ,CAAC,KAAK,EAAE,SAAS,EAAE,CAAC;IAC5B,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;gBAEtB,IAAI,EAAE,cAAc;IAMhC;;OAEG;IACH,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE;IAItC;;OAEG;IACH,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE;IAIpC;;OAEG;IACH,gBAAgB,IAAI,MAAM,EAAE;IAgC5B;;OAEG;IACH,cAAc,IAAI,MAAM,GAAG,IAAI;IAU/B;;OAEG;IACH,MAAM,IAAI,MAAM;IAQhB;;OAEG;IACH,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,UAAU;IA0BzC;;OAEG;IACH,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,cAAc,GAAG,UAAU;CAGlD"}