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
@@ -0,0 +1,295 @@
1
+ /**
2
+ * Long-term verified memory and checkpoints (SQLite persistence).
3
+ */
4
+ import crypto from "node:crypto";
5
+ import fs from "node:fs";
6
+ import path from "node:path";
7
+ import Database from "better-sqlite3";
8
+ /**
9
+ * Persistence for verified memory (admission only after verification) and
10
+ * immutable checkpoints (entity version, graph hash, memory hash, artifact refs).
11
+ */
12
+ export class Store {
13
+ entityId;
14
+ path;
15
+ db;
16
+ constructor(options = {}) {
17
+ this.entityId = options.entityId ?? "default";
18
+ const p = options.path ?? path.join(".moltblock", "store.db");
19
+ this.path = p;
20
+ if (p !== ":memory:") {
21
+ const dir = path.dirname(p);
22
+ if (!fs.existsSync(dir)) {
23
+ fs.mkdirSync(dir, { recursive: true });
24
+ }
25
+ }
26
+ this.db = new Database(p);
27
+ this.initSchema();
28
+ }
29
+ initSchema() {
30
+ this.db.exec(`
31
+ CREATE TABLE IF NOT EXISTS verified_memory (
32
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
33
+ entity_id TEXT NOT NULL,
34
+ artifact_ref TEXT NOT NULL,
35
+ summary TEXT,
36
+ content_preview TEXT,
37
+ created_at REAL NOT NULL
38
+ )
39
+ `);
40
+ this.db.exec("CREATE INDEX IF NOT EXISTS idx_vm_entity ON verified_memory(entity_id)");
41
+ this.db.exec(`
42
+ CREATE TABLE IF NOT EXISTS checkpoints (
43
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
44
+ entity_id TEXT NOT NULL,
45
+ entity_version TEXT NOT NULL,
46
+ graph_hash TEXT NOT NULL,
47
+ memory_hash TEXT NOT NULL,
48
+ artifact_refs TEXT NOT NULL,
49
+ created_at REAL NOT NULL
50
+ )
51
+ `);
52
+ this.db.exec("CREATE INDEX IF NOT EXISTS idx_cp_entity ON checkpoints(entity_id)");
53
+ this.db.exec(`
54
+ CREATE TABLE IF NOT EXISTS outcomes (
55
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
56
+ entity_id TEXT NOT NULL,
57
+ task_ref TEXT,
58
+ verification_passed INTEGER NOT NULL,
59
+ latency_sec REAL,
60
+ created_at REAL NOT NULL
61
+ )
62
+ `);
63
+ this.db.exec("CREATE INDEX IF NOT EXISTS idx_out_entity ON outcomes(entity_id)");
64
+ this.db.exec(`
65
+ CREATE TABLE IF NOT EXISTS strategies (
66
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
67
+ entity_id TEXT NOT NULL,
68
+ role TEXT NOT NULL,
69
+ version INTEGER NOT NULL,
70
+ content TEXT NOT NULL,
71
+ created_at REAL NOT NULL
72
+ )
73
+ `);
74
+ this.db.exec("CREATE INDEX IF NOT EXISTS idx_strat_entity ON strategies(entity_id)");
75
+ this.db.exec(`
76
+ CREATE TABLE IF NOT EXISTS audit_log (
77
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
78
+ entity_id TEXT NOT NULL,
79
+ event_type TEXT NOT NULL,
80
+ detail TEXT,
81
+ created_at REAL NOT NULL
82
+ )
83
+ `);
84
+ this.db.exec("CREATE INDEX IF NOT EXISTS idx_audit_entity ON audit_log(entity_id)");
85
+ this.db.exec(`
86
+ CREATE TABLE IF NOT EXISTS governance_state (
87
+ entity_id TEXT NOT NULL,
88
+ key TEXT NOT NULL,
89
+ value TEXT NOT NULL,
90
+ updated_at REAL NOT NULL,
91
+ PRIMARY KEY (entity_id, key)
92
+ )
93
+ `);
94
+ this.db.exec(`
95
+ CREATE TABLE IF NOT EXISTS inbox (
96
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
97
+ entity_id TEXT NOT NULL,
98
+ from_entity_id TEXT NOT NULL,
99
+ artifact_ref TEXT NOT NULL,
100
+ payload_text TEXT,
101
+ payload_hash TEXT NOT NULL,
102
+ signature TEXT NOT NULL,
103
+ created_at REAL NOT NULL
104
+ )
105
+ `);
106
+ this.db.exec("CREATE INDEX IF NOT EXISTS idx_inbox_entity ON inbox(entity_id)");
107
+ }
108
+ /**
109
+ * Admit a verified artifact into long-term memory (call only after verification pass).
110
+ */
111
+ addVerified(artifactRef, summary, contentPreview) {
112
+ const stmt = this.db.prepare(`
113
+ INSERT INTO verified_memory (entity_id, artifact_ref, summary, content_preview, created_at)
114
+ VALUES (?, ?, ?, ?, ?)
115
+ `);
116
+ stmt.run(this.entityId, artifactRef, summary ?? null, (contentPreview ?? "").slice(0, 2000), Date.now() / 1000);
117
+ }
118
+ /**
119
+ * Return the k most recent verified entries for this entity (for agent context).
120
+ */
121
+ getRecentVerified(k = 5) {
122
+ const stmt = this.db.prepare(`
123
+ SELECT artifact_ref, summary, content_preview, created_at
124
+ FROM verified_memory WHERE entity_id = ? ORDER BY id DESC LIMIT ?
125
+ `);
126
+ const rows = stmt.all(this.entityId, k);
127
+ return rows.map((r) => ({
128
+ artifact_ref: r.artifact_ref,
129
+ summary: r.summary,
130
+ content_preview: r.content_preview,
131
+ created_at: r.created_at,
132
+ }));
133
+ }
134
+ /**
135
+ * Append an immutable checkpoint.
136
+ */
137
+ writeCheckpoint(entityVersion, graphHash, memoryHash, artifactRefs) {
138
+ const stmt = this.db.prepare(`
139
+ INSERT INTO checkpoints (entity_id, entity_version, graph_hash, memory_hash, artifact_refs, created_at)
140
+ VALUES (?, ?, ?, ?, ?, ?)
141
+ `);
142
+ stmt.run(this.entityId, entityVersion, graphHash, memoryHash, JSON.stringify(artifactRefs), Date.now() / 1000);
143
+ }
144
+ /**
145
+ * List recent checkpoints for this entity.
146
+ */
147
+ listCheckpoints(limit = 20) {
148
+ const stmt = this.db.prepare(`
149
+ SELECT entity_version, graph_hash, memory_hash, artifact_refs, created_at
150
+ FROM checkpoints WHERE entity_id = ? ORDER BY id DESC LIMIT ?
151
+ `);
152
+ const rows = stmt.all(this.entityId, limit);
153
+ return rows.map((r) => ({
154
+ entity_version: r.entity_version,
155
+ graph_hash: r.graph_hash,
156
+ memory_hash: r.memory_hash,
157
+ artifact_refs: JSON.parse(r.artifact_refs),
158
+ created_at: r.created_at,
159
+ }));
160
+ }
161
+ /** Get internal db for helper functions */
162
+ getDb() {
163
+ return this.db;
164
+ }
165
+ close() {
166
+ this.db.close();
167
+ }
168
+ }
169
+ /**
170
+ * Stable hash for graph config (for checkpoint).
171
+ */
172
+ export function hashGraph(graphConfig) {
173
+ const data = typeof graphConfig === "string" ? Buffer.from(graphConfig, "utf-8") : graphConfig;
174
+ return crypto.createHash("sha256").update(data).digest("hex").slice(0, 16);
175
+ }
176
+ /**
177
+ * Stable hash for memory state (e.g. last N artifact refs).
178
+ */
179
+ export function hashMemory(verifiedRefs) {
180
+ const data = JSON.stringify(verifiedRefs.sort());
181
+ return crypto.createHash("sha256").update(data).digest("hex").slice(0, 16);
182
+ }
183
+ // --- Audit and governance ---
184
+ /**
185
+ * Append an audit log entry (molt, veto, shutdown, etc.).
186
+ */
187
+ export function auditLog(store, eventType, detail) {
188
+ const db = store.getDb();
189
+ const stmt = db.prepare("INSERT INTO audit_log (entity_id, event_type, detail, created_at) VALUES (?, ?, ?, ?)");
190
+ stmt.run(store.entityId, eventType, detail ?? "", Date.now() / 1000);
191
+ }
192
+ /**
193
+ * Get a governance state value (e.g. last_molt_at, paused).
194
+ */
195
+ export function getGovernanceValue(store, key) {
196
+ const db = store.getDb();
197
+ const stmt = db.prepare("SELECT value FROM governance_state WHERE entity_id = ? AND key = ?");
198
+ const row = stmt.get(store.entityId, key);
199
+ return row?.value ?? null;
200
+ }
201
+ /**
202
+ * Set a governance state value.
203
+ */
204
+ export function setGovernanceValue(store, key, value) {
205
+ const db = store.getDb();
206
+ const stmt = db.prepare(`
207
+ INSERT OR REPLACE INTO governance_state (entity_id, key, value, updated_at)
208
+ VALUES (?, ?, ?, ?)
209
+ `);
210
+ stmt.run(store.entityId, key, value, Date.now() / 1000);
211
+ }
212
+ // --- Inbox (multi-entity handoff) ---
213
+ /**
214
+ * Add a signed artifact to this entity's inbox (store is the recipient).
215
+ */
216
+ export function putInbox(store, fromEntityId, artifactRef, payloadHash, signature, payloadText) {
217
+ const db = store.getDb();
218
+ const stmt = db.prepare(`
219
+ INSERT INTO inbox (entity_id, from_entity_id, artifact_ref, payload_text, payload_hash, signature, created_at)
220
+ VALUES (?, ?, ?, ?, ?, ?, ?)
221
+ `);
222
+ stmt.run(store.entityId, fromEntityId, artifactRef, payloadText ?? "", payloadHash, signature, Date.now() / 1000);
223
+ }
224
+ /**
225
+ * Return recent inbox entries for this entity (recipient).
226
+ */
227
+ export function getInbox(store, limit = 20) {
228
+ const db = store.getDb();
229
+ const stmt = db.prepare(`
230
+ SELECT from_entity_id, artifact_ref, payload_text, payload_hash, signature, created_at
231
+ FROM inbox WHERE entity_id = ? ORDER BY id DESC LIMIT ?
232
+ `);
233
+ const rows = stmt.all(store.entityId, limit);
234
+ return rows.map((r) => ({
235
+ from_entity_id: r.from_entity_id,
236
+ artifact_ref: r.artifact_ref,
237
+ payload_text: r.payload_text,
238
+ payload_hash: r.payload_hash,
239
+ signature: r.signature,
240
+ created_at: r.created_at,
241
+ }));
242
+ }
243
+ // --- Outcomes and strategies (recursive improvement) ---
244
+ /**
245
+ * Record one task outcome for measurement.
246
+ */
247
+ export function recordOutcome(store, verificationPassed, latencySec, taskRef) {
248
+ const db = store.getDb();
249
+ const stmt = db.prepare(`
250
+ INSERT INTO outcomes (entity_id, task_ref, verification_passed, latency_sec, created_at)
251
+ VALUES (?, ?, ?, ?, ?)
252
+ `);
253
+ stmt.run(store.entityId, taskRef ?? "", verificationPassed ? 1 : 0, latencySec ?? null, Date.now() / 1000);
254
+ }
255
+ /**
256
+ * Return the k most recent outcomes for this entity.
257
+ */
258
+ export function getRecentOutcomes(store, k = 20) {
259
+ const db = store.getDb();
260
+ const stmt = db.prepare(`
261
+ SELECT task_ref, verification_passed, latency_sec, created_at
262
+ FROM outcomes WHERE entity_id = ? ORDER BY id DESC LIMIT ?
263
+ `);
264
+ const rows = stmt.all(store.entityId, k);
265
+ return rows.map((r) => ({
266
+ task_ref: r.task_ref,
267
+ verification_passed: r.verification_passed === 1,
268
+ latency_sec: r.latency_sec,
269
+ created_at: r.created_at,
270
+ }));
271
+ }
272
+ /**
273
+ * Return current strategy (prompt) for role, or null if not set.
274
+ */
275
+ export function getStrategy(store, role) {
276
+ const db = store.getDb();
277
+ const stmt = db.prepare("SELECT content FROM strategies WHERE entity_id = ? AND role = ? ORDER BY version DESC LIMIT 1");
278
+ const row = stmt.get(store.entityId, role);
279
+ return row?.content ?? null;
280
+ }
281
+ /**
282
+ * Set strategy (prompt) for role; inserts new version.
283
+ */
284
+ export function setStrategy(store, role, content) {
285
+ const db = store.getDb();
286
+ const versionStmt = db.prepare("SELECT COALESCE(MAX(version), 0) as maxVersion FROM strategies WHERE entity_id = ? AND role = ?");
287
+ const versionRow = versionStmt.get(store.entityId, role);
288
+ const version = (versionRow?.maxVersion ?? 0) + 1;
289
+ const stmt = db.prepare(`
290
+ INSERT INTO strategies (entity_id, role, version, content, created_at)
291
+ VALUES (?, ?, ?, ?, ?)
292
+ `);
293
+ stmt.run(store.entityId, role, version, content, Date.now() / 1000);
294
+ }
295
+ //# sourceMappingURL=persistence.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"persistence.js","sourceRoot":"","sources":["../src/persistence.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Entity signing: sign artifacts for attribution and handoff between entities.
3
+ */
4
+ /**
5
+ * Sign an artifact payload; return base64-encoded signature.
6
+ */
7
+ export declare function signArtifact(entityId: string, payload: string | Buffer): string;
8
+ /**
9
+ * Verify a signed artifact. Returns true if valid.
10
+ */
11
+ export declare function verifyArtifact(entityId: string, payload: string | Buffer, signatureB64: string): boolean;
12
+ /**
13
+ * Stable hash of artifact content (for storage/reference).
14
+ */
15
+ export declare function artifactHash(payload: string | Buffer): string;
16
+ //# sourceMappingURL=signing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signing.d.ts","sourceRoot":"","sources":["../src/signing.ts"],"names":[],"mappings":"AAAA;;GAEG;AAgBH;;GAEG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAK/E;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,GAAG,MAAM,EACxB,YAAY,EAAE,MAAM,GACnB,OAAO,CAUT;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAG7D"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Entity signing: sign artifacts for attribution and handoff between entities.
3
+ */
4
+ import crypto from "node:crypto";
5
+ /**
6
+ * Secret for signing (from env MOLTBLOCK_SIGNING_KEY or entity-specific MOLTBLOCK_SIGNING_KEY_<id>).
7
+ */
8
+ function getSecret(entityId) {
9
+ const envKey = process.env[`MOLTBLOCK_SIGNING_KEY_${entityId.toUpperCase()}`] ??
10
+ process.env["MOLTBLOCK_SIGNING_KEY"] ??
11
+ "";
12
+ const key = envKey || `default-secret-${entityId}`;
13
+ return Buffer.from(key, "utf-8");
14
+ }
15
+ /**
16
+ * Sign an artifact payload; return base64-encoded signature.
17
+ */
18
+ export function signArtifact(entityId, payload) {
19
+ const data = typeof payload === "string" ? Buffer.from(payload, "utf-8") : payload;
20
+ const hmac = crypto.createHmac("sha256", getSecret(entityId));
21
+ hmac.update(data);
22
+ return hmac.digest("base64");
23
+ }
24
+ /**
25
+ * Verify a signed artifact. Returns true if valid.
26
+ */
27
+ export function verifyArtifact(entityId, payload, signatureB64) {
28
+ try {
29
+ const expected = signArtifact(entityId, payload);
30
+ return crypto.timingSafeEqual(Buffer.from(expected, "base64"), Buffer.from(signatureB64, "base64"));
31
+ }
32
+ catch {
33
+ return false;
34
+ }
35
+ }
36
+ /**
37
+ * Stable hash of artifact content (for storage/reference).
38
+ */
39
+ export function artifactHash(payload) {
40
+ const data = typeof payload === "string" ? Buffer.from(payload, "utf-8") : payload;
41
+ return crypto.createHash("sha256").update(data).digest("hex").slice(0, 32);
42
+ }
43
+ //# sourceMappingURL=signing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signing.js","sourceRoot":"","sources":["../src/signing.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,MAAM,MAAM,aAAa,CAAC;AAEjC;;GAEG;AACH,SAAS,SAAS,CAAC,QAAgB;IACjC,MAAM,MAAM,GACV,OAAO,CAAC,GAAG,CAAC,yBAAyB,QAAQ,CAAC,WAAW,EAAE,EAAE,CAAC;QAC9D,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC;QACpC,EAAE,CAAC;IACL,MAAM,GAAG,GAAG,MAAM,IAAI,kBAAkB,QAAQ,EAAE,CAAC;IACnD,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;AACnC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,QAAgB,EAAE,OAAwB;IACrE,MAAM,IAAI,GAAG,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;IACnF,MAAM,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC,QAAQ,EAAE,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC9D,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAClB,OAAO,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;AAC/B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAC5B,QAAgB,EAChB,OAAwB,EACxB,YAAoB;IAEpB,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACjD,OAAO,MAAM,CAAC,eAAe,CAC3B,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAC/B,MAAM,CAAC,IAAI,CAAC,YAAY,EAAE,QAAQ,CAAC,CACpC,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,OAAwB;IACnD,MAAM,IAAI,GAAG,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;IACnF,OAAO,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAC7E,CAAC"}
@@ -0,0 +1,80 @@
1
+ /**
2
+ * Shared TypeScript interfaces for Moltblock.
3
+ */
4
+ /** One role's LLM backend configuration */
5
+ export interface ModelBinding {
6
+ backend: string;
7
+ baseUrl: string;
8
+ apiKey: string | null;
9
+ model: string;
10
+ }
11
+ /** JSON config binding entry (from moltblock.json) */
12
+ export interface BindingEntry {
13
+ backend: string;
14
+ base_url: string;
15
+ model?: string;
16
+ api_key?: string | null;
17
+ }
18
+ /** Agent section in moltblock.json */
19
+ export interface AgentConfig {
20
+ bindings?: Record<string, BindingEntry>;
21
+ }
22
+ /** Root config schema for moltblock.json */
23
+ export interface MoltblockConfig {
24
+ agent?: AgentConfig;
25
+ }
26
+ /** Chat message format for LLM */
27
+ export interface ChatMessage {
28
+ role: "system" | "user" | "assistant";
29
+ content: string;
30
+ }
31
+ /** Verified memory entry from persistence */
32
+ export interface VerifiedMemoryEntry {
33
+ artifact_ref: string;
34
+ summary: string | null;
35
+ content_preview: string | null;
36
+ created_at: number;
37
+ }
38
+ /** Checkpoint entry from persistence */
39
+ export interface CheckpointEntry {
40
+ entity_version: string;
41
+ graph_hash: string;
42
+ memory_hash: string;
43
+ artifact_refs: string[];
44
+ created_at: number;
45
+ }
46
+ /** Outcome entry from persistence */
47
+ export interface OutcomeEntry {
48
+ task_ref: string;
49
+ verification_passed: boolean;
50
+ latency_sec: number | null;
51
+ created_at: number;
52
+ }
53
+ /** Inbox entry for multi-entity handoff */
54
+ export interface InboxEntry {
55
+ from_entity_id: string;
56
+ artifact_ref: string;
57
+ payload_text: string;
58
+ payload_hash: string;
59
+ signature: string;
60
+ created_at: number;
61
+ }
62
+ /** Strategy suggestion from improvement loop */
63
+ export interface StrategySuggestion {
64
+ role: string;
65
+ suggestion: string;
66
+ }
67
+ /** Result from artifact verification */
68
+ export interface ReceivedArtifact {
69
+ from_entity_id: string;
70
+ artifact_ref: string;
71
+ payload_text: string;
72
+ verified: boolean;
73
+ }
74
+ /** Governance configuration */
75
+ export interface GovernanceConfig {
76
+ moltRateLimitSec: number;
77
+ allowedMoltTriggers: string[];
78
+ humanVetoPaused: boolean;
79
+ }
80
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,2CAA2C;AAC3C,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,sDAAsD;AACtD,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAED,sCAAsC;AACtC,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;CACzC;AAED,4CAA4C;AAC5C,MAAM,WAAW,eAAe;IAC9B,KAAK,CAAC,EAAE,WAAW,CAAC;CACrB;AAED,kCAAkC;AAClC,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,WAAW,CAAC;IACtC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,6CAA6C;AAC7C,MAAM,WAAW,mBAAmB;IAClC,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,wCAAwC;AACxC,MAAM,WAAW,eAAe;IAC9B,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,qCAAqC;AACrC,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,mBAAmB,EAAE,OAAO,CAAC;IAC7B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,2CAA2C;AAC3C,MAAM,WAAW,UAAU;IACzB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,gDAAgD;AAChD,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,wCAAwC;AACxC,MAAM,WAAW,gBAAgB;IAC/B,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,+BAA+B;AAC/B,MAAM,WAAW,gBAAgB;IAC/B,gBAAgB,EAAE,MAAM,CAAC;IACzB,mBAAmB,EAAE,MAAM,EAAE,CAAC;IAC9B,eAAe,EAAE,OAAO,CAAC;CAC1B"}
package/dist/types.js ADDED
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Shared TypeScript interfaces for Moltblock.
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Verifier: run vitest on code artifact; gate authority and memory admission.
3
+ */
4
+ import { WorkingMemory } from "./memory.js";
5
+ /**
6
+ * Remove markdown code fence if present.
7
+ */
8
+ export declare function extractCodeBlock(text: string): string;
9
+ /**
10
+ * Write code (and optional test) to temp dir, run vitest, return (passed, stdout+stderr).
11
+ * If testCode is undefined, we only check that the code is syntactically valid (compiles).
12
+ */
13
+ export declare function runVitestOnCode(code: string, testCode?: string): Promise<{
14
+ passed: boolean;
15
+ output: string;
16
+ }>;
17
+ /**
18
+ * Run verification on final_candidate. For Code Entity: run vitest.
19
+ * Sets verification_passed and verification_evidence; if pass, sets authoritative_artifact.
20
+ */
21
+ export declare function runVerifier(memory: WorkingMemory, testCode?: string): Promise<void>;
22
+ //# sourceMappingURL=verifier.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verifier.d.ts","sourceRoot":"","sources":["../src/verifier.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAerD;AAED;;;GAGG;AACH,wBAAsB,eAAe,CACnC,IAAI,EAAE,MAAM,EACZ,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAsE9C;AAuFD;;;GAGG;AACH,wBAAsB,WAAW,CAAC,MAAM,EAAE,aAAa,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAuBzF"}