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.
Files changed (143) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +245 -0
  3. package/dist/agents/analyst.d.ts +11 -0
  4. package/dist/agents/analyst.d.ts.map +1 -0
  5. package/dist/agents/analyst.js +78 -0
  6. package/dist/agents/analyst.js.map +1 -0
  7. package/dist/agents/blog-writer.d.ts +13 -0
  8. package/dist/agents/blog-writer.d.ts.map +1 -0
  9. package/dist/agents/blog-writer.js +59 -0
  10. package/dist/agents/blog-writer.js.map +1 -0
  11. package/dist/agents/critic.d.ts +11 -0
  12. package/dist/agents/critic.d.ts.map +1 -0
  13. package/dist/agents/critic.js +57 -0
  14. package/dist/agents/critic.js.map +1 -0
  15. package/dist/agents/index.d.ts +15 -0
  16. package/dist/agents/index.d.ts.map +1 -0
  17. package/dist/agents/index.js +31 -0
  18. package/dist/agents/index.js.map +1 -0
  19. package/dist/agents/investigator-critic.d.ts +10 -0
  20. package/dist/agents/investigator-critic.d.ts.map +1 -0
  21. package/dist/agents/investigator-critic.js +78 -0
  22. package/dist/agents/investigator-critic.js.map +1 -0
  23. package/dist/agents/investigator.d.ts +13 -0
  24. package/dist/agents/investigator.d.ts.map +1 -0
  25. package/dist/agents/investigator.js +105 -0
  26. package/dist/agents/investigator.js.map +1 -0
  27. package/dist/agents/marketing.d.ts +13 -0
  28. package/dist/agents/marketing.d.ts.map +1 -0
  29. package/dist/agents/marketing.js +59 -0
  30. package/dist/agents/marketing.js.map +1 -0
  31. package/dist/agents/researcher.d.ts +11 -0
  32. package/dist/agents/researcher.d.ts.map +1 -0
  33. package/dist/agents/researcher.js +68 -0
  34. package/dist/agents/researcher.js.map +1 -0
  35. package/dist/agents/writer.d.ts +9 -0
  36. package/dist/agents/writer.d.ts.map +1 -0
  37. package/dist/agents/writer.js +47 -0
  38. package/dist/agents/writer.js.map +1 -0
  39. package/dist/cli/create.d.ts +11 -0
  40. package/dist/cli/create.d.ts.map +1 -0
  41. package/dist/cli/create.js +104 -0
  42. package/dist/cli/create.js.map +1 -0
  43. package/dist/cli/evolve.d.ts +13 -0
  44. package/dist/cli/evolve.d.ts.map +1 -0
  45. package/dist/cli/evolve.js +69 -0
  46. package/dist/cli/evolve.js.map +1 -0
  47. package/dist/cli/index.d.ts +13 -0
  48. package/dist/cli/index.d.ts.map +1 -0
  49. package/dist/cli/index.js +84 -0
  50. package/dist/cli/index.js.map +1 -0
  51. package/dist/cli/init.d.ts +12 -0
  52. package/dist/cli/init.d.ts.map +1 -0
  53. package/dist/cli/init.js +68 -0
  54. package/dist/cli/init.js.map +1 -0
  55. package/dist/cli/run.d.ts +7 -0
  56. package/dist/cli/run.d.ts.map +1 -0
  57. package/dist/cli/run.js +371 -0
  58. package/dist/cli/run.js.map +1 -0
  59. package/dist/cli/status.d.ts +7 -0
  60. package/dist/cli/status.d.ts.map +1 -0
  61. package/dist/cli/status.js +123 -0
  62. package/dist/cli/status.js.map +1 -0
  63. package/dist/core/agent.d.ts +53 -0
  64. package/dist/core/agent.d.ts.map +1 -0
  65. package/dist/core/agent.js +172 -0
  66. package/dist/core/agent.js.map +1 -0
  67. package/dist/core/runner.d.ts +64 -0
  68. package/dist/core/runner.d.ts.map +1 -0
  69. package/dist/core/runner.js +203 -0
  70. package/dist/core/runner.js.map +1 -0
  71. package/dist/evolution/loop.d.ts +100 -0
  72. package/dist/evolution/loop.d.ts.map +1 -0
  73. package/dist/evolution/loop.js +424 -0
  74. package/dist/evolution/loop.js.map +1 -0
  75. package/dist/evolution/multi-critic.d.ts +58 -0
  76. package/dist/evolution/multi-critic.d.ts.map +1 -0
  77. package/dist/evolution/multi-critic.js +324 -0
  78. package/dist/evolution/multi-critic.js.map +1 -0
  79. package/dist/evolution/notifications.d.ts +32 -0
  80. package/dist/evolution/notifications.d.ts.map +1 -0
  81. package/dist/evolution/notifications.js +92 -0
  82. package/dist/evolution/notifications.js.map +1 -0
  83. package/dist/evolution/optimizer.d.ts +64 -0
  84. package/dist/evolution/optimizer.d.ts.map +1 -0
  85. package/dist/evolution/optimizer.js +223 -0
  86. package/dist/evolution/optimizer.js.map +1 -0
  87. package/dist/evolution/patterns.d.ts +63 -0
  88. package/dist/evolution/patterns.d.ts.map +1 -0
  89. package/dist/evolution/patterns.js +297 -0
  90. package/dist/evolution/patterns.js.map +1 -0
  91. package/dist/evolution/safety.d.ts +76 -0
  92. package/dist/evolution/safety.d.ts.map +1 -0
  93. package/dist/evolution/safety.js +182 -0
  94. package/dist/evolution/safety.js.map +1 -0
  95. package/dist/evolution/tracker.d.ts +48 -0
  96. package/dist/evolution/tracker.d.ts.map +1 -0
  97. package/dist/evolution/tracker.js +163 -0
  98. package/dist/evolution/tracker.js.map +1 -0
  99. package/dist/index.d.ts +32 -0
  100. package/dist/index.d.ts.map +1 -0
  101. package/dist/index.js +35 -0
  102. package/dist/index.js.map +1 -0
  103. package/dist/memory/index.d.ts +32 -0
  104. package/dist/memory/index.d.ts.map +1 -0
  105. package/dist/memory/index.js +49 -0
  106. package/dist/memory/index.js.map +1 -0
  107. package/dist/memory/postgres-memory.d.ts +52 -0
  108. package/dist/memory/postgres-memory.d.ts.map +1 -0
  109. package/dist/memory/postgres-memory.js +515 -0
  110. package/dist/memory/postgres-memory.js.map +1 -0
  111. package/dist/memory/sqlite-memory.d.ts +36 -0
  112. package/dist/memory/sqlite-memory.d.ts.map +1 -0
  113. package/dist/memory/sqlite-memory.js +380 -0
  114. package/dist/memory/sqlite-memory.js.map +1 -0
  115. package/dist/providers/anthropic.d.ts +20 -0
  116. package/dist/providers/anthropic.d.ts.map +1 -0
  117. package/dist/providers/anthropic.js +82 -0
  118. package/dist/providers/anthropic.js.map +1 -0
  119. package/dist/providers/claude-cli.d.ts +35 -0
  120. package/dist/providers/claude-cli.d.ts.map +1 -0
  121. package/dist/providers/claude-cli.js +143 -0
  122. package/dist/providers/claude-cli.js.map +1 -0
  123. package/dist/providers/index.d.ts +39 -0
  124. package/dist/providers/index.d.ts.map +1 -0
  125. package/dist/providers/index.js +58 -0
  126. package/dist/providers/index.js.map +1 -0
  127. package/dist/providers/ollama.d.ts +17 -0
  128. package/dist/providers/ollama.d.ts.map +1 -0
  129. package/dist/providers/ollama.js +64 -0
  130. package/dist/providers/ollama.js.map +1 -0
  131. package/dist/providers/openai.d.ts +19 -0
  132. package/dist/providers/openai.d.ts.map +1 -0
  133. package/dist/providers/openai.js +75 -0
  134. package/dist/providers/openai.js.map +1 -0
  135. package/dist/providers/types.d.ts +62 -0
  136. package/dist/providers/types.d.ts.map +1 -0
  137. package/dist/providers/types.js +9 -0
  138. package/dist/providers/types.js.map +1 -0
  139. package/dist/types.d.ts +221 -0
  140. package/dist/types.d.ts.map +1 -0
  141. package/dist/types.js +19 -0
  142. package/dist/types.js.map +1 -0
  143. 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":"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"}