darwin-agents 0.4.4
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/LICENSE +21 -0
- package/README.md +245 -0
- package/dist/agents/analyst.d.ts +11 -0
- package/dist/agents/analyst.d.ts.map +1 -0
- package/dist/agents/analyst.js +78 -0
- package/dist/agents/analyst.js.map +1 -0
- package/dist/agents/blog-writer.d.ts +13 -0
- package/dist/agents/blog-writer.d.ts.map +1 -0
- package/dist/agents/blog-writer.js +59 -0
- package/dist/agents/blog-writer.js.map +1 -0
- package/dist/agents/critic.d.ts +11 -0
- package/dist/agents/critic.d.ts.map +1 -0
- package/dist/agents/critic.js +57 -0
- package/dist/agents/critic.js.map +1 -0
- package/dist/agents/index.d.ts +15 -0
- package/dist/agents/index.d.ts.map +1 -0
- package/dist/agents/index.js +31 -0
- package/dist/agents/index.js.map +1 -0
- package/dist/agents/investigator-critic.d.ts +10 -0
- package/dist/agents/investigator-critic.d.ts.map +1 -0
- package/dist/agents/investigator-critic.js +78 -0
- package/dist/agents/investigator-critic.js.map +1 -0
- package/dist/agents/investigator.d.ts +13 -0
- package/dist/agents/investigator.d.ts.map +1 -0
- package/dist/agents/investigator.js +105 -0
- package/dist/agents/investigator.js.map +1 -0
- package/dist/agents/marketing.d.ts +13 -0
- package/dist/agents/marketing.d.ts.map +1 -0
- package/dist/agents/marketing.js +59 -0
- package/dist/agents/marketing.js.map +1 -0
- package/dist/agents/researcher.d.ts +11 -0
- package/dist/agents/researcher.d.ts.map +1 -0
- package/dist/agents/researcher.js +68 -0
- package/dist/agents/researcher.js.map +1 -0
- package/dist/agents/writer.d.ts +9 -0
- package/dist/agents/writer.d.ts.map +1 -0
- package/dist/agents/writer.js +47 -0
- package/dist/agents/writer.js.map +1 -0
- package/dist/cli/create.d.ts +11 -0
- package/dist/cli/create.d.ts.map +1 -0
- package/dist/cli/create.js +104 -0
- package/dist/cli/create.js.map +1 -0
- package/dist/cli/evolve.d.ts +13 -0
- package/dist/cli/evolve.d.ts.map +1 -0
- package/dist/cli/evolve.js +69 -0
- package/dist/cli/evolve.js.map +1 -0
- package/dist/cli/index.d.ts +13 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +84 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/init.d.ts +12 -0
- package/dist/cli/init.d.ts.map +1 -0
- package/dist/cli/init.js +68 -0
- package/dist/cli/init.js.map +1 -0
- package/dist/cli/run.d.ts +7 -0
- package/dist/cli/run.d.ts.map +1 -0
- package/dist/cli/run.js +371 -0
- package/dist/cli/run.js.map +1 -0
- package/dist/cli/status.d.ts +7 -0
- package/dist/cli/status.d.ts.map +1 -0
- package/dist/cli/status.js +123 -0
- package/dist/cli/status.js.map +1 -0
- package/dist/core/agent.d.ts +53 -0
- package/dist/core/agent.d.ts.map +1 -0
- package/dist/core/agent.js +172 -0
- package/dist/core/agent.js.map +1 -0
- package/dist/core/runner.d.ts +64 -0
- package/dist/core/runner.d.ts.map +1 -0
- package/dist/core/runner.js +203 -0
- package/dist/core/runner.js.map +1 -0
- package/dist/evolution/loop.d.ts +100 -0
- package/dist/evolution/loop.d.ts.map +1 -0
- package/dist/evolution/loop.js +424 -0
- package/dist/evolution/loop.js.map +1 -0
- package/dist/evolution/multi-critic.d.ts +58 -0
- package/dist/evolution/multi-critic.d.ts.map +1 -0
- package/dist/evolution/multi-critic.js +324 -0
- package/dist/evolution/multi-critic.js.map +1 -0
- package/dist/evolution/notifications.d.ts +32 -0
- package/dist/evolution/notifications.d.ts.map +1 -0
- package/dist/evolution/notifications.js +92 -0
- package/dist/evolution/notifications.js.map +1 -0
- package/dist/evolution/optimizer.d.ts +64 -0
- package/dist/evolution/optimizer.d.ts.map +1 -0
- package/dist/evolution/optimizer.js +223 -0
- package/dist/evolution/optimizer.js.map +1 -0
- package/dist/evolution/patterns.d.ts +63 -0
- package/dist/evolution/patterns.d.ts.map +1 -0
- package/dist/evolution/patterns.js +297 -0
- package/dist/evolution/patterns.js.map +1 -0
- package/dist/evolution/safety.d.ts +76 -0
- package/dist/evolution/safety.d.ts.map +1 -0
- package/dist/evolution/safety.js +182 -0
- package/dist/evolution/safety.js.map +1 -0
- package/dist/evolution/tracker.d.ts +48 -0
- package/dist/evolution/tracker.d.ts.map +1 -0
- package/dist/evolution/tracker.js +163 -0
- package/dist/evolution/tracker.js.map +1 -0
- package/dist/index.d.ts +32 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +35 -0
- package/dist/index.js.map +1 -0
- package/dist/memory/index.d.ts +32 -0
- package/dist/memory/index.d.ts.map +1 -0
- package/dist/memory/index.js +49 -0
- package/dist/memory/index.js.map +1 -0
- package/dist/memory/postgres-memory.d.ts +52 -0
- package/dist/memory/postgres-memory.d.ts.map +1 -0
- package/dist/memory/postgres-memory.js +515 -0
- package/dist/memory/postgres-memory.js.map +1 -0
- package/dist/memory/sqlite-memory.d.ts +36 -0
- package/dist/memory/sqlite-memory.d.ts.map +1 -0
- package/dist/memory/sqlite-memory.js +380 -0
- package/dist/memory/sqlite-memory.js.map +1 -0
- package/dist/providers/anthropic.d.ts +20 -0
- package/dist/providers/anthropic.d.ts.map +1 -0
- package/dist/providers/anthropic.js +82 -0
- package/dist/providers/anthropic.js.map +1 -0
- package/dist/providers/claude-cli.d.ts +35 -0
- package/dist/providers/claude-cli.d.ts.map +1 -0
- package/dist/providers/claude-cli.js +143 -0
- package/dist/providers/claude-cli.js.map +1 -0
- package/dist/providers/index.d.ts +39 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js +58 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/providers/ollama.d.ts +17 -0
- package/dist/providers/ollama.d.ts.map +1 -0
- package/dist/providers/ollama.js +64 -0
- package/dist/providers/ollama.js.map +1 -0
- package/dist/providers/openai.d.ts +19 -0
- package/dist/providers/openai.d.ts.map +1 -0
- package/dist/providers/openai.js +75 -0
- package/dist/providers/openai.js.map +1 -0
- package/dist/providers/types.d.ts +62 -0
- package/dist/providers/types.d.ts.map +1 -0
- package/dist/providers/types.js +9 -0
- package/dist/providers/types.js.map +1 -0
- package/dist/types.d.ts +221 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +19 -0
- package/dist/types.js.map +1 -0
- package/package.json +81 -0
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Darwin — Memory Factory
|
|
3
|
+
*
|
|
4
|
+
* Creates the appropriate MemoryProvider based on config.
|
|
5
|
+
* Supports SQLite (free) and PostgreSQL (pro).
|
|
6
|
+
*/
|
|
7
|
+
import { SqliteMemoryProvider } from './sqlite-memory.js';
|
|
8
|
+
import { PostgresMemoryProvider } from './postgres-memory.js';
|
|
9
|
+
/**
|
|
10
|
+
* Create a MemoryProvider based on the Darwin config.
|
|
11
|
+
*
|
|
12
|
+
* @param config - Darwin configuration with memory backend selection
|
|
13
|
+
* @returns An uninitialized MemoryProvider — call `init()` before use
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* ```ts
|
|
17
|
+
* // SQLite (default, zero-config)
|
|
18
|
+
* const memory = createMemory({ provider: 'claude-cli', memory: 'sqlite' });
|
|
19
|
+
*
|
|
20
|
+
* // PostgreSQL (production, concurrent agents)
|
|
21
|
+
* const memory = createMemory({
|
|
22
|
+
* provider: 'claude-cli',
|
|
23
|
+
* memory: 'postgres',
|
|
24
|
+
* postgresUrl: 'postgresql://user:pass@localhost:5432/darwin',
|
|
25
|
+
* });
|
|
26
|
+
*
|
|
27
|
+
* await memory.init();
|
|
28
|
+
* ```
|
|
29
|
+
*/
|
|
30
|
+
export function createMemory(config) {
|
|
31
|
+
switch (config.memory) {
|
|
32
|
+
case 'sqlite':
|
|
33
|
+
return new SqliteMemoryProvider(config);
|
|
34
|
+
case 'postgres':
|
|
35
|
+
return new PostgresMemoryProvider(config);
|
|
36
|
+
case 'custom':
|
|
37
|
+
if (!config.memoryProvider) {
|
|
38
|
+
throw new Error('Custom memory backend requires memoryProvider in config.');
|
|
39
|
+
}
|
|
40
|
+
return config.memoryProvider;
|
|
41
|
+
default: {
|
|
42
|
+
const exhaustive = config.memory;
|
|
43
|
+
throw new Error(`Unknown memory backend: ${String(exhaustive)}`);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
export { SqliteMemoryProvider } from './sqlite-memory.js';
|
|
48
|
+
export { PostgresMemoryProvider } from './postgres-memory.js';
|
|
49
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/memory/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAE9D;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,UAAU,YAAY,CAAC,MAAoB;IAC/C,QAAQ,MAAM,CAAC,MAAM,EAAE,CAAC;QACtB,KAAK,QAAQ;YACX,OAAO,IAAI,oBAAoB,CAAC,MAAM,CAAC,CAAC;QAE1C,KAAK,UAAU;YACb,OAAO,IAAI,sBAAsB,CAAC,MAAM,CAAC,CAAC;QAE5C,KAAK,QAAQ;YACX,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC;gBAC3B,MAAM,IAAI,KAAK,CAAC,0DAA0D,CAAC,CAAC;YAC9E,CAAC;YACD,OAAO,MAAM,CAAC,cAAc,CAAC;QAE/B,OAAO,CAAC,CAAC,CAAC;YACR,MAAM,UAAU,GAAU,MAAM,CAAC,MAAM,CAAC;YACxC,MAAM,IAAI,KAAK,CAAC,2BAA2B,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;QACnE,CAAC;IACH,CAAC;AACH,CAAC;AAED,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Darwin — PostgreSQL Memory Provider
|
|
3
|
+
*
|
|
4
|
+
* Production-grade storage for experiments, prompt versions, learnings, and state.
|
|
5
|
+
* Uses node-postgres (pg) with connection pooling. No ORM, no extra deps.
|
|
6
|
+
*
|
|
7
|
+
* Features over SQLite:
|
|
8
|
+
* - Connection pooling (concurrent agents)
|
|
9
|
+
* - Full-text search via tsvector (no FTS5 equivalent needed)
|
|
10
|
+
* - JSONB for state (queryable, indexable)
|
|
11
|
+
* - TIMESTAMPTZ for proper timezone handling
|
|
12
|
+
* - Row-level locking for updateState() atomicity
|
|
13
|
+
*
|
|
14
|
+
* Requires: DARWIN_POSTGRES_URL or config.postgresUrl
|
|
15
|
+
*/
|
|
16
|
+
import type { DarwinExperiment, DarwinState, Learning, MemoryProvider, PromptVersion, DarwinConfig } from '../types.js';
|
|
17
|
+
export declare class PostgresMemoryProvider implements MemoryProvider {
|
|
18
|
+
private pool;
|
|
19
|
+
private readonly connectionString;
|
|
20
|
+
private readonly dataDir;
|
|
21
|
+
constructor(config: DarwinConfig);
|
|
22
|
+
init(): Promise<void>;
|
|
23
|
+
close(): Promise<void>;
|
|
24
|
+
saveExperiment(exp: DarwinExperiment): Promise<void>;
|
|
25
|
+
loadExperiments(agentName: string, limit?: number): Promise<DarwinExperiment[]>;
|
|
26
|
+
savePromptVersion(pv: PromptVersion): Promise<void>;
|
|
27
|
+
getActivePrompt(agentName: string): Promise<PromptVersion | null>;
|
|
28
|
+
getAllPromptVersions(agentName: string): Promise<PromptVersion[]>;
|
|
29
|
+
saveLearning(learning: Learning): Promise<void>;
|
|
30
|
+
searchLearnings(query: string, limit?: number): Promise<Learning[]>;
|
|
31
|
+
getState(): Promise<DarwinState>;
|
|
32
|
+
saveState(state: DarwinState): Promise<void>;
|
|
33
|
+
/**
|
|
34
|
+
* Atomically read-modify-write the Darwin state.
|
|
35
|
+
* Uses SELECT FOR UPDATE to acquire a row-level lock.
|
|
36
|
+
*/
|
|
37
|
+
updateState(fn: (state: DarwinState) => DarwinState): Promise<DarwinState>;
|
|
38
|
+
private getPool;
|
|
39
|
+
private createTables;
|
|
40
|
+
/**
|
|
41
|
+
* Automatically migrate data from SQLite when:
|
|
42
|
+
* 1. A SQLite DB file exists at {dataDir}/.darwin/darwin.db
|
|
43
|
+
* 2. PostgreSQL has no prompt versions yet (fresh/empty)
|
|
44
|
+
*
|
|
45
|
+
* This prevents the data loss path where switching to postgres causes
|
|
46
|
+
* the system to re-seed v1 and lose the v2→v3 prompt history.
|
|
47
|
+
*
|
|
48
|
+
* Migration is idempotent: if postgres already has data, it's a no-op.
|
|
49
|
+
*/
|
|
50
|
+
private autoMigrateFromSqlite;
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=postgres-memory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"postgres-memory.d.ts","sourceRoot":"","sources":["../../src/memory/postgres-memory.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAMH,OAAO,KAAK,EACV,gBAAgB,EAChB,WAAW,EACX,QAAQ,EACR,cAAc,EACd,aAAa,EAEb,YAAY,EACb,MAAM,aAAa,CAAC;AAcrB,qBAAa,sBAAuB,YAAW,cAAc;IAC3D,OAAO,CAAC,IAAI,CAAwB;IACpC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;IAC1C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;gBAErB,MAAM,EAAE,YAAY;IAa1B,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAiCrB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAStB,cAAc,CAAC,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IAsCpD,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,SAAK,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAgB3E,iBAAiB,CAAC,EAAE,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAsDnD,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IAYjE,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IAejE,YAAY,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAc/C,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,SAAK,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;IAmC/D,QAAQ,IAAI,OAAO,CAAC,WAAW,CAAC;IAehC,SAAS,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAUlD;;;OAGG;IACG,WAAW,CAAC,EAAE,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC;IAqChF,OAAO,CAAC,OAAO;YAOD,YAAY;IA2E1B;;;;;;;;;OASG;YACW,qBAAqB;CAuLpC"}
|
|
@@ -0,0 +1,515 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Darwin — PostgreSQL Memory Provider
|
|
3
|
+
*
|
|
4
|
+
* Production-grade storage for experiments, prompt versions, learnings, and state.
|
|
5
|
+
* Uses node-postgres (pg) with connection pooling. No ORM, no extra deps.
|
|
6
|
+
*
|
|
7
|
+
* Features over SQLite:
|
|
8
|
+
* - Connection pooling (concurrent agents)
|
|
9
|
+
* - Full-text search via tsvector (no FTS5 equivalent needed)
|
|
10
|
+
* - JSONB for state (queryable, indexable)
|
|
11
|
+
* - TIMESTAMPTZ for proper timezone handling
|
|
12
|
+
* - Row-level locking for updateState() atomicity
|
|
13
|
+
*
|
|
14
|
+
* Requires: DARWIN_POSTGRES_URL or config.postgresUrl
|
|
15
|
+
*/
|
|
16
|
+
import { randomUUID } from 'node:crypto';
|
|
17
|
+
import { existsSync } from 'node:fs';
|
|
18
|
+
import { join } from 'node:path';
|
|
19
|
+
// ─── Default state for fresh installs ─────────────────
|
|
20
|
+
const DEFAULT_STATE = {
|
|
21
|
+
activeVersions: {},
|
|
22
|
+
abTests: {},
|
|
23
|
+
lastKnownGood: {},
|
|
24
|
+
consecutiveFailures: {},
|
|
25
|
+
experimentCounts: {},
|
|
26
|
+
};
|
|
27
|
+
// ─── PostgreSQL Memory Provider ───────────────────────
|
|
28
|
+
export class PostgresMemoryProvider {
|
|
29
|
+
pool = null;
|
|
30
|
+
connectionString;
|
|
31
|
+
dataDir;
|
|
32
|
+
constructor(config) {
|
|
33
|
+
const url = config.postgresUrl ?? process.env.DARWIN_POSTGRES_URL;
|
|
34
|
+
if (!url) {
|
|
35
|
+
throw new Error('PostgreSQL connection string required. Set DARWIN_POSTGRES_URL or config.postgresUrl.');
|
|
36
|
+
}
|
|
37
|
+
this.connectionString = url;
|
|
38
|
+
this.dataDir = config.dataDir ?? process.cwd();
|
|
39
|
+
}
|
|
40
|
+
// ─── Lifecycle ────────────────────────────────────
|
|
41
|
+
async init() {
|
|
42
|
+
let pgModule;
|
|
43
|
+
try {
|
|
44
|
+
pgModule = (await import('pg')).default;
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
throw new Error('[darwin] pg is required for PostgreSQL storage.\n' +
|
|
48
|
+
' Install it: npm install pg\n' +
|
|
49
|
+
' Or use SQLite (default): no extra install needed');
|
|
50
|
+
}
|
|
51
|
+
this.pool = new pgModule.Pool({
|
|
52
|
+
connectionString: this.connectionString,
|
|
53
|
+
max: 10,
|
|
54
|
+
idleTimeoutMillis: 30_000,
|
|
55
|
+
connectionTimeoutMillis: 5_000,
|
|
56
|
+
});
|
|
57
|
+
// Verify connection
|
|
58
|
+
const client = await this.pool.connect();
|
|
59
|
+
try {
|
|
60
|
+
await this.createTables(client);
|
|
61
|
+
}
|
|
62
|
+
finally {
|
|
63
|
+
client.release();
|
|
64
|
+
}
|
|
65
|
+
// Auto-migrate from SQLite if the postgres DB is empty but SQLite data exists.
|
|
66
|
+
// This prevents data loss when switching from sqlite to postgres:
|
|
67
|
+
// without migration, the system re-seeds v1 and loses v2→v3 history.
|
|
68
|
+
await this.autoMigrateFromSqlite();
|
|
69
|
+
}
|
|
70
|
+
async close() {
|
|
71
|
+
if (this.pool) {
|
|
72
|
+
await this.pool.end();
|
|
73
|
+
this.pool = null;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
// ─── Experiments ──────────────────────────────────
|
|
77
|
+
async saveExperiment(exp) {
|
|
78
|
+
const pool = this.getPool();
|
|
79
|
+
await pool.query(`INSERT INTO darwin_experiments (
|
|
80
|
+
id, agent_name, prompt_version, task, task_type,
|
|
81
|
+
started_at, completed_at, success,
|
|
82
|
+
quality_score, source_count, output_length, error_count, duration_ms,
|
|
83
|
+
feedback_score, feedback_report, feedback_evaluator, output
|
|
84
|
+
) VALUES ($1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14,$15,$16,$17)
|
|
85
|
+
ON CONFLICT (id) DO UPDATE SET
|
|
86
|
+
quality_score = EXCLUDED.quality_score,
|
|
87
|
+
feedback_score = EXCLUDED.feedback_score,
|
|
88
|
+
feedback_report = EXCLUDED.feedback_report,
|
|
89
|
+
feedback_evaluator = EXCLUDED.feedback_evaluator,
|
|
90
|
+
output = EXCLUDED.output`, [
|
|
91
|
+
exp.id,
|
|
92
|
+
exp.agentName,
|
|
93
|
+
exp.promptVersion,
|
|
94
|
+
exp.task,
|
|
95
|
+
exp.taskType,
|
|
96
|
+
exp.startedAt,
|
|
97
|
+
exp.completedAt,
|
|
98
|
+
exp.success,
|
|
99
|
+
exp.metrics.qualityScore,
|
|
100
|
+
exp.metrics.sourceCount,
|
|
101
|
+
exp.metrics.outputLength,
|
|
102
|
+
exp.metrics.errorCount,
|
|
103
|
+
exp.metrics.durationMs,
|
|
104
|
+
exp.feedback?.score ?? null,
|
|
105
|
+
exp.feedback?.report ?? null,
|
|
106
|
+
exp.feedback?.evaluator ?? null,
|
|
107
|
+
exp.output ?? null,
|
|
108
|
+
]);
|
|
109
|
+
}
|
|
110
|
+
async loadExperiments(agentName, limit = 50) {
|
|
111
|
+
const pool = this.getPool();
|
|
112
|
+
const { rows } = await pool.query(`SELECT * FROM darwin_experiments
|
|
113
|
+
WHERE agent_name = $1
|
|
114
|
+
ORDER BY started_at DESC
|
|
115
|
+
LIMIT $2`, [agentName, limit]);
|
|
116
|
+
return rows.map(rowToExperiment);
|
|
117
|
+
}
|
|
118
|
+
// ─── Prompt Versions ──────────────────────────────
|
|
119
|
+
async savePromptVersion(pv) {
|
|
120
|
+
const pool = this.getPool();
|
|
121
|
+
const client = await pool.connect();
|
|
122
|
+
try {
|
|
123
|
+
await client.query('BEGIN');
|
|
124
|
+
if (pv.active) {
|
|
125
|
+
await client.query(`UPDATE darwin_prompt_versions SET active = false WHERE agent_name = $1`, [pv.agentName]);
|
|
126
|
+
}
|
|
127
|
+
await client.query(`INSERT INTO darwin_prompt_versions (
|
|
128
|
+
version, agent_name, prompt_text, created_at, parent_version,
|
|
129
|
+
change_reason, active, total_runs, avg_quality, avg_duration,
|
|
130
|
+
success_rate, avg_source_count
|
|
131
|
+
) VALUES ($1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12)
|
|
132
|
+
ON CONFLICT (agent_name, version) DO UPDATE SET
|
|
133
|
+
prompt_text = EXCLUDED.prompt_text,
|
|
134
|
+
active = EXCLUDED.active,
|
|
135
|
+
change_reason = EXCLUDED.change_reason,
|
|
136
|
+
total_runs = EXCLUDED.total_runs,
|
|
137
|
+
avg_quality = EXCLUDED.avg_quality,
|
|
138
|
+
avg_duration = EXCLUDED.avg_duration,
|
|
139
|
+
success_rate = EXCLUDED.success_rate,
|
|
140
|
+
avg_source_count = EXCLUDED.avg_source_count`, [
|
|
141
|
+
pv.version,
|
|
142
|
+
pv.agentName,
|
|
143
|
+
pv.promptText,
|
|
144
|
+
pv.createdAt,
|
|
145
|
+
pv.parentVersion,
|
|
146
|
+
pv.changeReason,
|
|
147
|
+
pv.active,
|
|
148
|
+
pv.stats.totalRuns,
|
|
149
|
+
pv.stats.avgQuality,
|
|
150
|
+
pv.stats.avgDuration,
|
|
151
|
+
pv.stats.successRate,
|
|
152
|
+
pv.stats.avgSourceCount,
|
|
153
|
+
]);
|
|
154
|
+
await client.query('COMMIT');
|
|
155
|
+
}
|
|
156
|
+
catch (err) {
|
|
157
|
+
await client.query('ROLLBACK');
|
|
158
|
+
throw err;
|
|
159
|
+
}
|
|
160
|
+
finally {
|
|
161
|
+
client.release();
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
async getActivePrompt(agentName) {
|
|
165
|
+
const pool = this.getPool();
|
|
166
|
+
const { rows } = await pool.query(`SELECT * FROM darwin_prompt_versions
|
|
167
|
+
WHERE active = true AND agent_name = $1`, [agentName]);
|
|
168
|
+
return rows.length > 0 ? rowToPromptVersion(rows[0]) : null;
|
|
169
|
+
}
|
|
170
|
+
async getAllPromptVersions(agentName) {
|
|
171
|
+
const pool = this.getPool();
|
|
172
|
+
const { rows } = await pool.query(`SELECT * FROM darwin_prompt_versions
|
|
173
|
+
WHERE agent_name = $1
|
|
174
|
+
ORDER BY created_at`, [agentName]);
|
|
175
|
+
return rows.map(rowToPromptVersion);
|
|
176
|
+
}
|
|
177
|
+
// ─── Learnings ────────────────────────────────────
|
|
178
|
+
async saveLearning(learning) {
|
|
179
|
+
const pool = this.getPool();
|
|
180
|
+
const id = learning.id ?? randomUUID();
|
|
181
|
+
const tags = JSON.stringify(learning.tags);
|
|
182
|
+
const confidence = learning.confidence ?? 0.8;
|
|
183
|
+
await pool.query(`INSERT INTO darwin_learnings (id, agent_name, content, category, tags, confidence)
|
|
184
|
+
VALUES ($1, $2, $3, $4, $5, $6)`, [id, learning.agentName, learning.content, learning.category, tags, confidence]);
|
|
185
|
+
}
|
|
186
|
+
async searchLearnings(query, limit = 20) {
|
|
187
|
+
const pool = this.getPool();
|
|
188
|
+
// PostgreSQL full-text search with ts_rank
|
|
189
|
+
const { rows } = await pool.query(`SELECT *, ts_rank(search_vector, plainto_tsquery('english', $1)) AS rank
|
|
190
|
+
FROM darwin_learnings
|
|
191
|
+
WHERE search_vector @@ plainto_tsquery('english', $1)
|
|
192
|
+
ORDER BY rank DESC
|
|
193
|
+
LIMIT $2`, [query, limit]);
|
|
194
|
+
if (rows.length > 0) {
|
|
195
|
+
return rows.map(rowToLearning);
|
|
196
|
+
}
|
|
197
|
+
// Fallback: ILIKE search (handles partial matches, non-English).
|
|
198
|
+
// Escape LIKE-special characters to prevent query chars like % and _ from
|
|
199
|
+
// acting as wildcards (not a security issue with parameterized queries,
|
|
200
|
+
// but causes unexpected match behavior).
|
|
201
|
+
const escapedQuery = query.replace(/[%_\\]/g, '\\$&');
|
|
202
|
+
const { rows: likeRows } = await pool.query(`SELECT * FROM darwin_learnings
|
|
203
|
+
WHERE content ILIKE $1 ESCAPE '\\' OR tags ILIKE $1 ESCAPE '\\'
|
|
204
|
+
ORDER BY created_at DESC
|
|
205
|
+
LIMIT $2`, [`%${escapedQuery}%`, limit]);
|
|
206
|
+
return likeRows.map(rowToLearning);
|
|
207
|
+
}
|
|
208
|
+
// ─── State ────────────────────────────────────────
|
|
209
|
+
async getState() {
|
|
210
|
+
const pool = this.getPool();
|
|
211
|
+
const { rows } = await pool.query(`SELECT value FROM darwin_state WHERE key = $1`, ['darwin_state']);
|
|
212
|
+
if (rows.length === 0) {
|
|
213
|
+
return { ...DEFAULT_STATE };
|
|
214
|
+
}
|
|
215
|
+
return rows[0].value;
|
|
216
|
+
}
|
|
217
|
+
async saveState(state) {
|
|
218
|
+
const pool = this.getPool();
|
|
219
|
+
await pool.query(`INSERT INTO darwin_state (key, value) VALUES ($1, $2)
|
|
220
|
+
ON CONFLICT (key) DO UPDATE SET value = EXCLUDED.value`, ['darwin_state', JSON.stringify(state)]);
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* Atomically read-modify-write the Darwin state.
|
|
224
|
+
* Uses SELECT FOR UPDATE to acquire a row-level lock.
|
|
225
|
+
*/
|
|
226
|
+
async updateState(fn) {
|
|
227
|
+
const pool = this.getPool();
|
|
228
|
+
const client = await pool.connect();
|
|
229
|
+
try {
|
|
230
|
+
await client.query('BEGIN');
|
|
231
|
+
// Lock the row for update (or get nothing if first time)
|
|
232
|
+
const { rows } = await client.query(`SELECT value FROM darwin_state WHERE key = $1 FOR UPDATE`, ['darwin_state']);
|
|
233
|
+
const current = rows.length > 0
|
|
234
|
+
? rows[0].value
|
|
235
|
+
: { ...DEFAULT_STATE };
|
|
236
|
+
const updated = fn(current);
|
|
237
|
+
await client.query(`INSERT INTO darwin_state (key, value) VALUES ($1, $2)
|
|
238
|
+
ON CONFLICT (key) DO UPDATE SET value = EXCLUDED.value`, ['darwin_state', JSON.stringify(updated)]);
|
|
239
|
+
await client.query('COMMIT');
|
|
240
|
+
return updated;
|
|
241
|
+
}
|
|
242
|
+
catch (err) {
|
|
243
|
+
await client.query('ROLLBACK');
|
|
244
|
+
throw err;
|
|
245
|
+
}
|
|
246
|
+
finally {
|
|
247
|
+
client.release();
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
// ─── Private ──────────────────────────────────────
|
|
251
|
+
getPool() {
|
|
252
|
+
if (!this.pool) {
|
|
253
|
+
throw new Error('PostgresMemoryProvider not initialized. Call init() first.');
|
|
254
|
+
}
|
|
255
|
+
return this.pool;
|
|
256
|
+
}
|
|
257
|
+
async createTables(client) {
|
|
258
|
+
await client.query(`
|
|
259
|
+
CREATE TABLE IF NOT EXISTS darwin_experiments (
|
|
260
|
+
id TEXT PRIMARY KEY,
|
|
261
|
+
agent_name TEXT NOT NULL,
|
|
262
|
+
prompt_version TEXT NOT NULL,
|
|
263
|
+
task TEXT NOT NULL,
|
|
264
|
+
task_type TEXT NOT NULL DEFAULT 'general',
|
|
265
|
+
started_at TIMESTAMPTZ NOT NULL,
|
|
266
|
+
completed_at TIMESTAMPTZ NOT NULL,
|
|
267
|
+
success BOOLEAN NOT NULL DEFAULT true,
|
|
268
|
+
quality_score REAL,
|
|
269
|
+
source_count INTEGER DEFAULT 0,
|
|
270
|
+
output_length INTEGER DEFAULT 0,
|
|
271
|
+
error_count INTEGER DEFAULT 0,
|
|
272
|
+
duration_ms INTEGER DEFAULT 0,
|
|
273
|
+
feedback_score REAL,
|
|
274
|
+
feedback_report TEXT,
|
|
275
|
+
feedback_evaluator TEXT,
|
|
276
|
+
output TEXT,
|
|
277
|
+
created_at TIMESTAMPTZ DEFAULT NOW()
|
|
278
|
+
);
|
|
279
|
+
|
|
280
|
+
CREATE TABLE IF NOT EXISTS darwin_prompt_versions (
|
|
281
|
+
version TEXT NOT NULL,
|
|
282
|
+
agent_name TEXT NOT NULL,
|
|
283
|
+
prompt_text TEXT NOT NULL,
|
|
284
|
+
created_at TIMESTAMPTZ NOT NULL,
|
|
285
|
+
parent_version TEXT,
|
|
286
|
+
change_reason TEXT NOT NULL,
|
|
287
|
+
active BOOLEAN NOT NULL DEFAULT false,
|
|
288
|
+
total_runs INTEGER DEFAULT 0,
|
|
289
|
+
avg_quality REAL DEFAULT 0,
|
|
290
|
+
avg_duration REAL DEFAULT 0,
|
|
291
|
+
success_rate REAL DEFAULT 0,
|
|
292
|
+
avg_source_count REAL DEFAULT 0,
|
|
293
|
+
PRIMARY KEY (agent_name, version)
|
|
294
|
+
);
|
|
295
|
+
|
|
296
|
+
CREATE TABLE IF NOT EXISTS darwin_learnings (
|
|
297
|
+
id TEXT PRIMARY KEY,
|
|
298
|
+
agent_name TEXT NOT NULL,
|
|
299
|
+
content TEXT NOT NULL,
|
|
300
|
+
category TEXT NOT NULL,
|
|
301
|
+
tags TEXT NOT NULL DEFAULT '[]',
|
|
302
|
+
confidence REAL DEFAULT 0.8,
|
|
303
|
+
created_at TIMESTAMPTZ DEFAULT NOW(),
|
|
304
|
+
search_vector TSVECTOR GENERATED ALWAYS AS (
|
|
305
|
+
to_tsvector('english', content || ' ' || tags)
|
|
306
|
+
) STORED
|
|
307
|
+
);
|
|
308
|
+
|
|
309
|
+
CREATE TABLE IF NOT EXISTS darwin_state (
|
|
310
|
+
key TEXT PRIMARY KEY,
|
|
311
|
+
value JSONB NOT NULL
|
|
312
|
+
);
|
|
313
|
+
|
|
314
|
+
-- Indexes
|
|
315
|
+
CREATE INDEX IF NOT EXISTS idx_darwin_exp_agent
|
|
316
|
+
ON darwin_experiments(agent_name);
|
|
317
|
+
CREATE INDEX IF NOT EXISTS idx_darwin_exp_agent_version
|
|
318
|
+
ON darwin_experiments(agent_name, prompt_version);
|
|
319
|
+
CREATE INDEX IF NOT EXISTS idx_darwin_exp_agent_started
|
|
320
|
+
ON darwin_experiments(agent_name, started_at DESC);
|
|
321
|
+
CREATE INDEX IF NOT EXISTS idx_darwin_exp_task_type
|
|
322
|
+
ON darwin_experiments(agent_name, task_type);
|
|
323
|
+
CREATE INDEX IF NOT EXISTS idx_darwin_learnings_search
|
|
324
|
+
ON darwin_learnings USING GIN(search_vector);
|
|
325
|
+
CREATE INDEX IF NOT EXISTS idx_darwin_learnings_agent
|
|
326
|
+
ON darwin_learnings(agent_name);
|
|
327
|
+
`);
|
|
328
|
+
}
|
|
329
|
+
// ─── SQLite → PostgreSQL Auto-Migration ─────────────
|
|
330
|
+
/**
|
|
331
|
+
* Automatically migrate data from SQLite when:
|
|
332
|
+
* 1. A SQLite DB file exists at {dataDir}/.darwin/darwin.db
|
|
333
|
+
* 2. PostgreSQL has no prompt versions yet (fresh/empty)
|
|
334
|
+
*
|
|
335
|
+
* This prevents the data loss path where switching to postgres causes
|
|
336
|
+
* the system to re-seed v1 and lose the v2→v3 prompt history.
|
|
337
|
+
*
|
|
338
|
+
* Migration is idempotent: if postgres already has data, it's a no-op.
|
|
339
|
+
*/
|
|
340
|
+
async autoMigrateFromSqlite() {
|
|
341
|
+
const sqlitePath = join(this.dataDir, '.darwin', 'darwin.db');
|
|
342
|
+
// No SQLite file — nothing to migrate
|
|
343
|
+
if (!existsSync(sqlitePath)) {
|
|
344
|
+
return;
|
|
345
|
+
}
|
|
346
|
+
const pool = this.getPool();
|
|
347
|
+
// Check if postgres already has prompt versions (i.e., not a fresh DB)
|
|
348
|
+
const { rows: existingVersions } = await pool.query(`SELECT COUNT(*) AS cnt FROM darwin_prompt_versions`);
|
|
349
|
+
const pgVersionCount = parseInt(existingVersions[0]?.cnt ?? '0', 10);
|
|
350
|
+
if (pgVersionCount > 0) {
|
|
351
|
+
return; // Postgres already has data — no migration needed
|
|
352
|
+
}
|
|
353
|
+
// Check if postgres already has experiments
|
|
354
|
+
const { rows: existingExps } = await pool.query(`SELECT COUNT(*) AS cnt FROM darwin_experiments`);
|
|
355
|
+
const pgExpCount = parseInt(existingExps[0]?.cnt ?? '0', 10);
|
|
356
|
+
if (pgExpCount > 0) {
|
|
357
|
+
return; // Postgres has experiments — partial data already present
|
|
358
|
+
}
|
|
359
|
+
// Dynamic import of better-sqlite3 (only needed for migration)
|
|
360
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
361
|
+
let DatabaseCtor;
|
|
362
|
+
try {
|
|
363
|
+
const mod = await import('better-sqlite3');
|
|
364
|
+
DatabaseCtor = mod.default;
|
|
365
|
+
}
|
|
366
|
+
catch {
|
|
367
|
+
// better-sqlite3 not installed — cannot migrate
|
|
368
|
+
console.warn('[darwin] SQLite DB found but better-sqlite3 not available. Skipping migration.');
|
|
369
|
+
return;
|
|
370
|
+
}
|
|
371
|
+
console.log('[darwin] Migrating data from SQLite to PostgreSQL...');
|
|
372
|
+
const sqlite = new DatabaseCtor(sqlitePath, { readonly: true });
|
|
373
|
+
const client = await pool.connect();
|
|
374
|
+
try {
|
|
375
|
+
await client.query('BEGIN');
|
|
376
|
+
// ── Migrate prompt versions ────────────────────
|
|
377
|
+
const promptRows = sqlite.prepare(`SELECT * FROM prompt_versions ORDER BY created_at`).all();
|
|
378
|
+
for (const row of promptRows) {
|
|
379
|
+
await client.query(`INSERT INTO darwin_prompt_versions (
|
|
380
|
+
version, agent_name, prompt_text, created_at, parent_version,
|
|
381
|
+
change_reason, active, total_runs, avg_quality, avg_duration,
|
|
382
|
+
success_rate, avg_source_count
|
|
383
|
+
) VALUES ($1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12)
|
|
384
|
+
ON CONFLICT (agent_name, version) DO NOTHING`, [
|
|
385
|
+
row.version, row.agent_name, row.prompt_text, row.created_at,
|
|
386
|
+
row.parent_version, row.change_reason, row.active === 1,
|
|
387
|
+
row.total_runs, row.avg_quality, row.avg_duration,
|
|
388
|
+
row.success_rate, row.avg_source_count,
|
|
389
|
+
]);
|
|
390
|
+
}
|
|
391
|
+
// ── Migrate experiments ────────────────────────
|
|
392
|
+
const expRows = sqlite.prepare(`SELECT * FROM experiments ORDER BY started_at`).all();
|
|
393
|
+
for (const row of expRows) {
|
|
394
|
+
await client.query(`INSERT INTO darwin_experiments (
|
|
395
|
+
id, agent_name, prompt_version, task, task_type,
|
|
396
|
+
started_at, completed_at, success,
|
|
397
|
+
quality_score, source_count, output_length, error_count, duration_ms,
|
|
398
|
+
feedback_score, feedback_report, feedback_evaluator, output
|
|
399
|
+
) VALUES ($1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14,$15,$16,$17)
|
|
400
|
+
ON CONFLICT (id) DO NOTHING`, [
|
|
401
|
+
row.id, row.agent_name, row.prompt_version, row.task, row.task_type,
|
|
402
|
+
row.started_at, row.completed_at, row.success === 1,
|
|
403
|
+
row.quality_score, row.source_count, row.output_length,
|
|
404
|
+
row.error_count, row.duration_ms,
|
|
405
|
+
row.feedback_score, row.feedback_report, row.feedback_evaluator,
|
|
406
|
+
row.output,
|
|
407
|
+
]);
|
|
408
|
+
}
|
|
409
|
+
// ── Migrate state ──────────────────────────────
|
|
410
|
+
const stateRow = sqlite.prepare(`SELECT value FROM state WHERE key = ?`).get('darwin_state');
|
|
411
|
+
if (stateRow) {
|
|
412
|
+
await client.query(`INSERT INTO darwin_state (key, value) VALUES ($1, $2)
|
|
413
|
+
ON CONFLICT (key) DO NOTHING`, ['darwin_state', stateRow.value]);
|
|
414
|
+
}
|
|
415
|
+
// ── Migrate learnings ──────────────────────────
|
|
416
|
+
const learningRows = sqlite.prepare(`SELECT * FROM learnings ORDER BY created_at`).all();
|
|
417
|
+
for (const row of learningRows) {
|
|
418
|
+
await client.query(`INSERT INTO darwin_learnings (id, agent_name, content, category, tags, confidence, created_at)
|
|
419
|
+
VALUES ($1, $2, $3, $4, $5, $6, $7)
|
|
420
|
+
ON CONFLICT (id) DO NOTHING`, [row.id, row.agent_name, row.content, row.category, row.tags, row.confidence, row.created_at]);
|
|
421
|
+
}
|
|
422
|
+
await client.query('COMMIT');
|
|
423
|
+
console.log(`[darwin] Migration complete: ${promptRows.length} prompt versions, ` +
|
|
424
|
+
`${expRows.length} experiments, ${learningRows.length} learnings.`);
|
|
425
|
+
}
|
|
426
|
+
catch (err) {
|
|
427
|
+
try {
|
|
428
|
+
await client.query('ROLLBACK');
|
|
429
|
+
}
|
|
430
|
+
catch {
|
|
431
|
+
// ROLLBACK can fail if connection is already broken — ignore to avoid masking the real error
|
|
432
|
+
}
|
|
433
|
+
console.error('[darwin] Migration from SQLite failed:', err);
|
|
434
|
+
// Non-fatal: the system will still work, just without historical data
|
|
435
|
+
}
|
|
436
|
+
finally {
|
|
437
|
+
client.release();
|
|
438
|
+
sqlite.close();
|
|
439
|
+
}
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
function toISOString(val) {
|
|
443
|
+
if (val instanceof Date)
|
|
444
|
+
return val.toISOString();
|
|
445
|
+
return val;
|
|
446
|
+
}
|
|
447
|
+
function rowToExperiment(row) {
|
|
448
|
+
const experiment = {
|
|
449
|
+
id: row.id,
|
|
450
|
+
agentName: row.agent_name,
|
|
451
|
+
promptVersion: row.prompt_version,
|
|
452
|
+
task: row.task,
|
|
453
|
+
taskType: row.task_type,
|
|
454
|
+
startedAt: toISOString(row.started_at),
|
|
455
|
+
completedAt: toISOString(row.completed_at),
|
|
456
|
+
success: row.success,
|
|
457
|
+
metrics: {
|
|
458
|
+
qualityScore: row.quality_score,
|
|
459
|
+
sourceCount: row.source_count,
|
|
460
|
+
outputLength: row.output_length,
|
|
461
|
+
errorCount: row.error_count,
|
|
462
|
+
durationMs: row.duration_ms,
|
|
463
|
+
},
|
|
464
|
+
};
|
|
465
|
+
if (row.feedback_score !== null && row.feedback_report !== null && row.feedback_evaluator !== null) {
|
|
466
|
+
experiment.feedback = {
|
|
467
|
+
score: row.feedback_score,
|
|
468
|
+
report: row.feedback_report,
|
|
469
|
+
evaluator: row.feedback_evaluator,
|
|
470
|
+
};
|
|
471
|
+
}
|
|
472
|
+
if (row.output !== null) {
|
|
473
|
+
experiment.output = row.output;
|
|
474
|
+
}
|
|
475
|
+
return experiment;
|
|
476
|
+
}
|
|
477
|
+
function rowToPromptVersion(row) {
|
|
478
|
+
const stats = {
|
|
479
|
+
totalRuns: row.total_runs,
|
|
480
|
+
avgQuality: row.avg_quality,
|
|
481
|
+
avgDuration: row.avg_duration,
|
|
482
|
+
successRate: row.success_rate,
|
|
483
|
+
avgSourceCount: row.avg_source_count,
|
|
484
|
+
};
|
|
485
|
+
return {
|
|
486
|
+
version: row.version,
|
|
487
|
+
agentName: row.agent_name,
|
|
488
|
+
promptText: row.prompt_text,
|
|
489
|
+
createdAt: toISOString(row.created_at),
|
|
490
|
+
parentVersion: row.parent_version,
|
|
491
|
+
changeReason: row.change_reason,
|
|
492
|
+
active: row.active,
|
|
493
|
+
stats,
|
|
494
|
+
};
|
|
495
|
+
}
|
|
496
|
+
function rowToLearning(row) {
|
|
497
|
+
let tags;
|
|
498
|
+
try {
|
|
499
|
+
tags = JSON.parse(row.tags);
|
|
500
|
+
}
|
|
501
|
+
catch {
|
|
502
|
+
// Defensive: migrated or manually inserted rows may have malformed JSON
|
|
503
|
+
tags = [];
|
|
504
|
+
}
|
|
505
|
+
return {
|
|
506
|
+
id: row.id,
|
|
507
|
+
agentName: row.agent_name,
|
|
508
|
+
content: row.content,
|
|
509
|
+
category: row.category,
|
|
510
|
+
tags,
|
|
511
|
+
confidence: row.confidence,
|
|
512
|
+
createdAt: toISOString(row.created_at),
|
|
513
|
+
};
|
|
514
|
+
}
|
|
515
|
+
//# sourceMappingURL=postgres-memory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"postgres-memory.js","sourceRoot":"","sources":["../../src/memory/postgres-memory.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAGH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAWjC,yDAAyD;AAEzD,MAAM,aAAa,GAAgB;IACjC,cAAc,EAAE,EAAE;IAClB,OAAO,EAAE,EAAE;IACX,aAAa,EAAE,EAAE;IACjB,mBAAmB,EAAE,EAAE;IACvB,gBAAgB,EAAE,EAAE;CACrB,CAAC;AAEF,yDAAyD;AAEzD,MAAM,OAAO,sBAAsB;IACzB,IAAI,GAAmB,IAAI,CAAC;IACnB,gBAAgB,CAAS;IACzB,OAAO,CAAS;IAEjC,YAAY,MAAoB;QAC9B,MAAM,GAAG,GAAG,MAAM,CAAC,WAAW,IAAI,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC;QAClE,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,MAAM,IAAI,KAAK,CACb,uFAAuF,CACxF,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,gBAAgB,GAAG,GAAG,CAAC;QAC5B,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IACjD,CAAC;IAED,qDAAqD;IAErD,KAAK,CAAC,IAAI;QACR,IAAI,QAAmB,CAAC;QACxB,IAAI,CAAC;YACH,QAAQ,GAAG,CAAC,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC;QAC1C,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,IAAI,KAAK,CACb,mDAAmD;gBACnD,gCAAgC;gBAChC,oDAAoD,CACrD,CAAC;QACJ,CAAC;QAED,IAAI,CAAC,IAAI,GAAG,IAAI,QAAQ,CAAC,IAAI,CAAC;YAC5B,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;YACvC,GAAG,EAAE,EAAE;YACP,iBAAiB,EAAE,MAAM;YACzB,uBAAuB,EAAE,KAAK;SAC/B,CAAC,CAAC;QAEH,oBAAoB;QACpB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;QACzC,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QAClC,CAAC;gBAAS,CAAC;YACT,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,CAAC;QAED,+EAA+E;QAC/E,kEAAkE;QAClE,qEAAqE;QACrE,MAAM,IAAI,CAAC,qBAAqB,EAAE,CAAC;IACrC,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;YACtB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACnB,CAAC;IACH,CAAC;IAED,qDAAqD;IAErD,KAAK,CAAC,cAAc,CAAC,GAAqB;QACxC,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;QAE5B,MAAM,IAAI,CAAC,KAAK,CACd;;;;;;;;;;;iCAW2B,EAC3B;YACE,GAAG,CAAC,EAAE;YACN,GAAG,CAAC,SAAS;YACb,GAAG,CAAC,aAAa;YACjB,GAAG,CAAC,IAAI;YACR,GAAG,CAAC,QAAQ;YACZ,GAAG,CAAC,SAAS;YACb,GAAG,CAAC,WAAW;YACf,GAAG,CAAC,OAAO;YACX,GAAG,CAAC,OAAO,CAAC,YAAY;YACxB,GAAG,CAAC,OAAO,CAAC,WAAW;YACvB,GAAG,CAAC,OAAO,CAAC,YAAY;YACxB,GAAG,CAAC,OAAO,CAAC,UAAU;YACtB,GAAG,CAAC,OAAO,CAAC,UAAU;YACtB,GAAG,CAAC,QAAQ,EAAE,KAAK,IAAI,IAAI;YAC3B,GAAG,CAAC,QAAQ,EAAE,MAAM,IAAI,IAAI;YAC5B,GAAG,CAAC,QAAQ,EAAE,SAAS,IAAI,IAAI;YAC/B,GAAG,CAAC,MAAM,IAAI,IAAI;SACnB,CACF,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,SAAiB,EAAE,KAAK,GAAG,EAAE;QACjD,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;QAE5B,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAC/B;;;gBAGU,EACV,CAAC,SAAS,EAAE,KAAK,CAAC,CACnB,CAAC;QAEF,OAAO,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;IACnC,CAAC;IAED,qDAAqD;IAErD,KAAK,CAAC,iBAAiB,CAAC,EAAiB;QACvC,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;QAC5B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;QAEpC,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAE5B,IAAI,EAAE,CAAC,MAAM,EAAE,CAAC;gBACd,MAAM,MAAM,CAAC,KAAK,CAChB,wEAAwE,EACxE,CAAC,EAAE,CAAC,SAAS,CAAC,CACf,CAAC;YACJ,CAAC;YAED,MAAM,MAAM,CAAC,KAAK,CAChB;;;;;;;;;;;;;uDAa+C,EAC/C;gBACE,EAAE,CAAC,OAAO;gBACV,EAAE,CAAC,SAAS;gBACZ,EAAE,CAAC,UAAU;gBACb,EAAE,CAAC,SAAS;gBACZ,EAAE,CAAC,aAAa;gBAChB,EAAE,CAAC,YAAY;gBACf,EAAE,CAAC,MAAM;gBACT,EAAE,CAAC,KAAK,CAAC,SAAS;gBAClB,EAAE,CAAC,KAAK,CAAC,UAAU;gBACnB,EAAE,CAAC,KAAK,CAAC,WAAW;gBACpB,EAAE,CAAC,KAAK,CAAC,WAAW;gBACpB,EAAE,CAAC,KAAK,CAAC,cAAc;aACxB,CACF,CAAC;YAEF,MAAM,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC/B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;YAC/B,MAAM,GAAG,CAAC;QACZ,CAAC;gBAAS,CAAC;YACT,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,CAAC;IACH,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,SAAiB;QACrC,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;QAE5B,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAC/B;+CACyC,EACzC,CAAC,SAAS,CAAC,CACZ,CAAC;QAEF,OAAO,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC9D,CAAC;IAED,KAAK,CAAC,oBAAoB,CAAC,SAAiB;QAC1C,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;QAE5B,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAC/B;;2BAEqB,EACrB,CAAC,SAAS,CAAC,CACZ,CAAC;QAEF,OAAO,IAAI,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;IACtC,CAAC;IAED,qDAAqD;IAErD,KAAK,CAAC,YAAY,CAAC,QAAkB;QACnC,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;QAE5B,MAAM,EAAE,GAAG,QAAQ,CAAC,EAAE,IAAI,UAAU,EAAE,CAAC;QACvC,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC3C,MAAM,UAAU,GAAG,QAAQ,CAAC,UAAU,IAAI,GAAG,CAAC;QAE9C,MAAM,IAAI,CAAC,KAAK,CACd;uCACiC,EACjC,CAAC,EAAE,EAAE,QAAQ,CAAC,SAAS,EAAE,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,QAAQ,EAAE,IAAI,EAAE,UAAU,CAAC,CAChF,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,KAAa,EAAE,KAAK,GAAG,EAAE;QAC7C,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;QAE5B,2CAA2C;QAC3C,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAC/B;;;;gBAIU,EACV,CAAC,KAAK,EAAE,KAAK,CAAC,CACf,CAAC;QAEF,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACpB,OAAO,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;QACjC,CAAC;QAED,iEAAiE;QACjE,0EAA0E;QAC1E,wEAAwE;QACxE,yCAAyC;QACzC,MAAM,YAAY,GAAG,KAAK,CAAC,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QACtD,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CACzC;;;gBAGU,EACV,CAAC,IAAI,YAAY,GAAG,EAAE,KAAK,CAAC,CAC7B,CAAC;QAEF,OAAO,QAAQ,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;IACrC,CAAC;IAED,qDAAqD;IAErD,KAAK,CAAC,QAAQ;QACZ,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;QAE5B,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAC/B,+CAA+C,EAC/C,CAAC,cAAc,CAAC,CACjB,CAAC;QAEF,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtB,OAAO,EAAE,GAAG,aAAa,EAAE,CAAC;QAC9B,CAAC;QAED,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,KAAoB,CAAC;IACtC,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,KAAkB;QAChC,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;QAE5B,MAAM,IAAI,CAAC,KAAK,CACd;8DACwD,EACxD,CAAC,cAAc,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CACxC,CAAC;IACJ,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,WAAW,CAAC,EAAuC;QACvD,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;QAC5B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;QAEpC,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAE5B,yDAAyD;YACzD,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,KAAK,CACjC,0DAA0D,EAC1D,CAAC,cAAc,CAAC,CACjB,CAAC;YAEF,MAAM,OAAO,GAAgB,IAAI,CAAC,MAAM,GAAG,CAAC;gBAC1C,CAAC,CAAE,IAAI,CAAC,CAAC,CAAC,CAAC,KAAqB;gBAChC,CAAC,CAAC,EAAE,GAAG,aAAa,EAAE,CAAC;YAEzB,MAAM,OAAO,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC;YAE5B,MAAM,MAAM,CAAC,KAAK,CAChB;gEACwD,EACxD,CAAC,cAAc,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAC1C,CAAC;YAEF,MAAM,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YAC7B,OAAO,OAAO,CAAC;QACjB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;YAC/B,MAAM,GAAG,CAAC;QACZ,CAAC;gBAAS,CAAC;YACT,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,CAAC;IACH,CAAC;IAED,qDAAqD;IAE7C,OAAO;QACb,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,4DAA4D,CAAC,CAAC;QAChF,CAAC;QACD,OAAO,IAAI,CAAC,IAAI,CAAC;IACnB,CAAC;IAEO,KAAK,CAAC,YAAY,CAAC,MAAqB;QAC9C,MAAM,MAAM,CAAC,KAAK,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAqElB,CAAC,CAAC;IACL,CAAC;IAED,uDAAuD;IAEvD;;;;;;;;;OASG;IACK,KAAK,CAAC,qBAAqB;QACjC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC;QAE9D,sCAAsC;QACtC,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC5B,OAAO;QACT,CAAC;QAED,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;QAE5B,uEAAuE;QACvE,MAAM,EAAE,IAAI,EAAE,gBAAgB,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CACjD,oDAAoD,CACrD,CAAC;QACF,MAAM,cAAc,GAAG,QAAQ,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,GAAG,EAAE,EAAE,CAAC,CAAC;QACrE,IAAI,cAAc,GAAG,CAAC,EAAE,CAAC;YACvB,OAAO,CAAC,kDAAkD;QAC5D,CAAC;QAED,4CAA4C;QAC5C,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAC7C,gDAAgD,CACjD,CAAC;QACF,MAAM,UAAU,GAAG,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,GAAG,EAAE,EAAE,CAAC,CAAC;QAC7D,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;YACnB,OAAO,CAAC,0DAA0D;QACpE,CAAC;QAED,+DAA+D;QAC/D,8DAA8D;QAC9D,IAAI,YAGH,CAAC;QACF,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAqC,CAAC;YAC/E,YAAY,GAAG,GAAG,CAAC,OAAO,CAAC;QAC7B,CAAC;QAAC,MAAM,CAAC;YACP,gDAAgD;YAChD,OAAO,CAAC,IAAI,CAAC,gFAAgF,CAAC,CAAC;YAC/F,OAAO;QACT,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,sDAAsD,CAAC,CAAC;QAEpE,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC,UAAU,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QAChE,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;QAEpC,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAE5B,kDAAkD;YAClD,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAC/B,mDAAmD,CACpD,CAAC,GAAG,EAaH,CAAC;YAEH,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;gBAC7B,MAAM,MAAM,CAAC,KAAK,CAChB;;;;;uDAK6C,EAC7C;oBACE,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,WAAW,EAAE,GAAG,CAAC,UAAU;oBAC5D,GAAG,CAAC,cAAc,EAAE,GAAG,CAAC,aAAa,EAAE,GAAG,CAAC,MAAM,KAAK,CAAC;oBACvD,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,WAAW,EAAE,GAAG,CAAC,YAAY;oBACjD,GAAG,CAAC,YAAY,EAAE,GAAG,CAAC,gBAAgB;iBACvC,CACF,CAAC;YACJ,CAAC;YAED,kDAAkD;YAClD,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAC5B,+CAA+C,CAChD,CAAC,GAAG,EAkBH,CAAC;YAEH,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;gBAC1B,MAAM,MAAM,CAAC,KAAK,CAChB;;;;;;sCAM4B,EAC5B;oBACE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,cAAc,EAAE,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,SAAS;oBACnE,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,YAAY,EAAE,GAAG,CAAC,OAAO,KAAK,CAAC;oBACnD,GAAG,CAAC,aAAa,EAAE,GAAG,CAAC,YAAY,EAAE,GAAG,CAAC,aAAa;oBACtD,GAAG,CAAC,WAAW,EAAE,GAAG,CAAC,WAAW;oBAChC,GAAG,CAAC,cAAc,EAAE,GAAG,CAAC,eAAe,EAAE,GAAG,CAAC,kBAAkB;oBAC/D,GAAG,CAAC,MAAM;iBACX,CACF,CAAC;YACJ,CAAC;YAED,kDAAkD;YAClD,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAC7B,uCAAuC,CACxC,CAAC,GAAG,CAAC,cAAc,CAAkC,CAAC;YAEvD,IAAI,QAAQ,EAAE,CAAC;gBACb,MAAM,MAAM,CAAC,KAAK,CAChB;wCAC8B,EAC9B,CAAC,cAAc,EAAE,QAAQ,CAAC,KAAK,CAAC,CACjC,CAAC;YACJ,CAAC;YAED,kDAAkD;YAClD,MAAM,YAAY,GAAG,MAAM,CAAC,OAAO,CACjC,6CAA6C,CAC9C,CAAC,GAAG,EAQH,CAAC;YAEH,KAAK,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;gBAC/B,MAAM,MAAM,CAAC,KAAK,CAChB;;uCAE6B,EAC7B,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,UAAU,CAAC,CAC9F,CAAC;YACJ,CAAC;YAED,MAAM,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YAE7B,OAAO,CAAC,GAAG,CACT,gCAAgC,UAAU,CAAC,MAAM,oBAAoB;gBACrE,GAAG,OAAO,CAAC,MAAM,iBAAiB,YAAY,CAAC,MAAM,aAAa,CACnE,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC;gBACH,MAAM,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;YACjC,CAAC;YAAC,MAAM,CAAC;gBACP,6FAA6F;YAC/F,CAAC;YACD,OAAO,CAAC,KAAK,CAAC,wCAAwC,EAAE,GAAG,CAAC,CAAC;YAC7D,sEAAsE;QACxE,CAAC;gBAAS,CAAC;YACT,MAAM,CAAC,OAAO,EAAE,CAAC;YACjB,MAAM,CAAC,KAAK,EAAE,CAAC;QACjB,CAAC;IACH,CAAC;CACF;AAiDD,SAAS,WAAW,CAAC,GAAkB;IACrC,IAAI,GAAG,YAAY,IAAI;QAAE,OAAO,GAAG,CAAC,WAAW,EAAE,CAAC;IAClD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,eAAe,CAAC,GAAoB;IAC3C,MAAM,UAAU,GAAqB;QACnC,EAAE,EAAE,GAAG,CAAC,EAAE;QACV,SAAS,EAAE,GAAG,CAAC,UAAU;QACzB,aAAa,EAAE,GAAG,CAAC,cAAc;QACjC,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,QAAQ,EAAE,GAAG,CAAC,SAAS;QACvB,SAAS,EAAE,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC;QACtC,WAAW,EAAE,WAAW,CAAC,GAAG,CAAC,YAAY,CAAC;QAC1C,OAAO,EAAE,GAAG,CAAC,OAAO;QACpB,OAAO,EAAE;YACP,YAAY,EAAE,GAAG,CAAC,aAAa;YAC/B,WAAW,EAAE,GAAG,CAAC,YAAY;YAC7B,YAAY,EAAE,GAAG,CAAC,aAAa;YAC/B,UAAU,EAAE,GAAG,CAAC,WAAW;YAC3B,UAAU,EAAE,GAAG,CAAC,WAAW;SAC5B;KACF,CAAC;IAEF,IAAI,GAAG,CAAC,cAAc,KAAK,IAAI,IAAI,GAAG,CAAC,eAAe,KAAK,IAAI,IAAI,GAAG,CAAC,kBAAkB,KAAK,IAAI,EAAE,CAAC;QACnG,UAAU,CAAC,QAAQ,GAAG;YACpB,KAAK,EAAE,GAAG,CAAC,cAAc;YACzB,MAAM,EAAE,GAAG,CAAC,eAAe;YAC3B,SAAS,EAAE,GAAG,CAAC,kBAAkB;SAClC,CAAC;IACJ,CAAC;IAED,IAAI,GAAG,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC;QACxB,UAAU,CAAC,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC;IACjC,CAAC;IAED,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,SAAS,kBAAkB,CAAC,GAAuB;IACjD,MAAM,KAAK,GAAuB;QAChC,SAAS,EAAE,GAAG,CAAC,UAAU;QACzB,UAAU,EAAE,GAAG,CAAC,WAAW;QAC3B,WAAW,EAAE,GAAG,CAAC,YAAY;QAC7B,WAAW,EAAE,GAAG,CAAC,YAAY;QAC7B,cAAc,EAAE,GAAG,CAAC,gBAAgB;KACrC,CAAC;IAEF,OAAO;QACL,OAAO,EAAE,GAAG,CAAC,OAAO;QACpB,SAAS,EAAE,GAAG,CAAC,UAAU;QACzB,UAAU,EAAE,GAAG,CAAC,WAAW;QAC3B,SAAS,EAAE,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC;QACtC,aAAa,EAAE,GAAG,CAAC,cAAc;QACjC,YAAY,EAAE,GAAG,CAAC,aAAa;QAC/B,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,KAAK;KACN,CAAC;AACJ,CAAC;AAED,SAAS,aAAa,CAAC,GAAkB;IACvC,IAAI,IAAc,CAAC;IACnB,IAAI,CAAC;QACH,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAa,CAAC;IAC1C,CAAC;IAAC,MAAM,CAAC;QACP,wEAAwE;QACxE,IAAI,GAAG,EAAE,CAAC;IACZ,CAAC;IAED,OAAO;QACL,EAAE,EAAE,GAAG,CAAC,EAAE;QACV,SAAS,EAAE,GAAG,CAAC,UAAU;QACzB,OAAO,EAAE,GAAG,CAAC,OAAO;QACpB,QAAQ,EAAE,GAAG,CAAC,QAAgC;QAC9C,IAAI;QACJ,UAAU,EAAE,GAAG,CAAC,UAAU;QAC1B,SAAS,EAAE,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC;KACvC,CAAC;AACJ,CAAC"}
|