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,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Darwin — SQLite Memory Provider
|
|
3
|
+
*
|
|
4
|
+
* Persistent storage for experiments, prompt versions, learnings, and state.
|
|
5
|
+
* Uses better-sqlite3 for synchronous, fast, single-file storage.
|
|
6
|
+
*
|
|
7
|
+
* Database location: {dataDir}/.darwin/darwin.db
|
|
8
|
+
*/
|
|
9
|
+
import type { DarwinConfig, DarwinExperiment, DarwinState, Learning, MemoryProvider, PromptVersion } from '../types.js';
|
|
10
|
+
export declare class SqliteMemoryProvider implements MemoryProvider {
|
|
11
|
+
private db;
|
|
12
|
+
private readonly dbPath;
|
|
13
|
+
constructor(config: DarwinConfig);
|
|
14
|
+
init(): Promise<void>;
|
|
15
|
+
close(): Promise<void>;
|
|
16
|
+
saveExperiment(exp: DarwinExperiment): Promise<void>;
|
|
17
|
+
loadExperiments(agentName: string, limit?: number): Promise<DarwinExperiment[]>;
|
|
18
|
+
savePromptVersion(pv: PromptVersion): Promise<void>;
|
|
19
|
+
getActivePrompt(agentName: string): Promise<PromptVersion | null>;
|
|
20
|
+
getAllPromptVersions(agentName: string): Promise<PromptVersion[]>;
|
|
21
|
+
saveLearning(learning: Learning): Promise<void>;
|
|
22
|
+
searchLearnings(query: string, limit?: number): Promise<Learning[]>;
|
|
23
|
+
getState(): Promise<DarwinState>;
|
|
24
|
+
saveState(state: DarwinState): Promise<void>;
|
|
25
|
+
/**
|
|
26
|
+
* Atomically read-modify-write the Darwin state inside a single transaction.
|
|
27
|
+
* Prevents race conditions when multiple agents update state concurrently.
|
|
28
|
+
* Uses BEGIN IMMEDIATE to acquire a write lock before reading.
|
|
29
|
+
*/
|
|
30
|
+
updateState(fn: (state: DarwinState) => DarwinState): Promise<DarwinState>;
|
|
31
|
+
/** Get the database connection, throw if not initialized */
|
|
32
|
+
private getDb;
|
|
33
|
+
/** Create all tables and indexes */
|
|
34
|
+
private createTables;
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=sqlite-memory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sqlite-memory.d.ts","sourceRoot":"","sources":["../../src/memory/sqlite-memory.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAMH,OAAO,KAAK,EACV,YAAY,EACZ,gBAAgB,EAChB,WAAW,EACX,QAAQ,EACR,cAAc,EACd,aAAa,EAEd,MAAM,aAAa,CAAC;AAoErB,qBAAa,oBAAqB,YAAW,cAAc;IACzD,OAAO,CAAC,EAAE,CAAyB;IACnC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;gBAEpB,MAAM,EAAE,YAAY;IAQ1B,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IA6BrB,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;IAwCnD,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;IAmB/C,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,SAAK,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;IAoC/D,QAAQ,IAAI,OAAO,CAAC,WAAW,CAAC;IAchC,SAAS,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IASlD;;;;OAIG;IACG,WAAW,CAAC,EAAE,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC;IA2BhF,4DAA4D;IAC5D,OAAO,CAAC,KAAK;IAOb,oCAAoC;IACpC,OAAO,CAAC,YAAY;CAsErB"}
|
|
@@ -0,0 +1,380 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Darwin — SQLite Memory Provider
|
|
3
|
+
*
|
|
4
|
+
* Persistent storage for experiments, prompt versions, learnings, and state.
|
|
5
|
+
* Uses better-sqlite3 for synchronous, fast, single-file storage.
|
|
6
|
+
*
|
|
7
|
+
* Database location: {dataDir}/.darwin/darwin.db
|
|
8
|
+
*/
|
|
9
|
+
import { mkdirSync } from 'node:fs';
|
|
10
|
+
import { join } from 'node:path';
|
|
11
|
+
import { randomUUID } from 'node:crypto';
|
|
12
|
+
// ─── Default state for fresh installs ─────────────────
|
|
13
|
+
const DEFAULT_STATE = {
|
|
14
|
+
activeVersions: {},
|
|
15
|
+
abTests: {},
|
|
16
|
+
lastKnownGood: {},
|
|
17
|
+
consecutiveFailures: {},
|
|
18
|
+
experimentCounts: {},
|
|
19
|
+
};
|
|
20
|
+
// ─── SQLite Memory Provider ───────────────────────────
|
|
21
|
+
export class SqliteMemoryProvider {
|
|
22
|
+
db = null;
|
|
23
|
+
dbPath;
|
|
24
|
+
constructor(config) {
|
|
25
|
+
const dataDir = config.dataDir ?? process.cwd();
|
|
26
|
+
const darwinDir = join(dataDir, '.darwin');
|
|
27
|
+
this.dbPath = join(darwinDir, 'darwin.db');
|
|
28
|
+
}
|
|
29
|
+
// ─── Lifecycle ────────────────────────────────────
|
|
30
|
+
async init() {
|
|
31
|
+
// Ensure .darwin directory exists
|
|
32
|
+
const dir = join(this.dbPath, '..');
|
|
33
|
+
mkdirSync(dir, { recursive: true });
|
|
34
|
+
// Dynamic import — gives helpful error if better-sqlite3 is not installed
|
|
35
|
+
let DatabaseConstructor;
|
|
36
|
+
try {
|
|
37
|
+
const mod = await import('better-sqlite3');
|
|
38
|
+
DatabaseConstructor = mod.default;
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
throw new Error('[darwin] better-sqlite3 is required for SQLite storage.\n' +
|
|
42
|
+
' Install it: npm install better-sqlite3\n' +
|
|
43
|
+
' Or use PostgreSQL: set DARWIN_POSTGRES_URL environment variable');
|
|
44
|
+
}
|
|
45
|
+
// Open database with WAL mode for better concurrent read performance
|
|
46
|
+
this.db = new DatabaseConstructor(this.dbPath);
|
|
47
|
+
this.db.pragma('journal_mode = WAL');
|
|
48
|
+
this.db.pragma('foreign_keys = ON');
|
|
49
|
+
this.db.pragma('synchronous = NORMAL');
|
|
50
|
+
this.db.pragma('cache_size = -20000'); // 20MB
|
|
51
|
+
this.db.pragma('temp_store = MEMORY');
|
|
52
|
+
this.createTables();
|
|
53
|
+
}
|
|
54
|
+
async close() {
|
|
55
|
+
if (this.db) {
|
|
56
|
+
this.db.close();
|
|
57
|
+
this.db = null;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
// ─── Experiments ──────────────────────────────────
|
|
61
|
+
async saveExperiment(exp) {
|
|
62
|
+
const db = this.getDb();
|
|
63
|
+
const stmt = db.prepare(`
|
|
64
|
+
INSERT OR REPLACE INTO experiments (
|
|
65
|
+
id, agent_name, prompt_version, task, task_type,
|
|
66
|
+
started_at, completed_at, success,
|
|
67
|
+
quality_score, source_count, output_length, error_count, duration_ms,
|
|
68
|
+
feedback_score, feedback_report, feedback_evaluator, output
|
|
69
|
+
) VALUES (
|
|
70
|
+
@id, @agent_name, @prompt_version, @task, @task_type,
|
|
71
|
+
@started_at, @completed_at, @success,
|
|
72
|
+
@quality_score, @source_count, @output_length, @error_count, @duration_ms,
|
|
73
|
+
@feedback_score, @feedback_report, @feedback_evaluator, @output
|
|
74
|
+
)
|
|
75
|
+
`);
|
|
76
|
+
stmt.run({
|
|
77
|
+
id: exp.id,
|
|
78
|
+
agent_name: exp.agentName,
|
|
79
|
+
prompt_version: exp.promptVersion,
|
|
80
|
+
task: exp.task,
|
|
81
|
+
task_type: exp.taskType,
|
|
82
|
+
started_at: exp.startedAt,
|
|
83
|
+
completed_at: exp.completedAt,
|
|
84
|
+
success: exp.success ? 1 : 0,
|
|
85
|
+
quality_score: exp.metrics.qualityScore,
|
|
86
|
+
source_count: exp.metrics.sourceCount,
|
|
87
|
+
output_length: exp.metrics.outputLength,
|
|
88
|
+
error_count: exp.metrics.errorCount,
|
|
89
|
+
duration_ms: exp.metrics.durationMs,
|
|
90
|
+
feedback_score: exp.feedback?.score ?? null,
|
|
91
|
+
feedback_report: exp.feedback?.report ?? null,
|
|
92
|
+
feedback_evaluator: exp.feedback?.evaluator ?? null,
|
|
93
|
+
output: exp.output ?? null,
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
async loadExperiments(agentName, limit = 50) {
|
|
97
|
+
const db = this.getDb();
|
|
98
|
+
const stmt = db.prepare(`
|
|
99
|
+
SELECT * FROM experiments
|
|
100
|
+
WHERE agent_name = ?
|
|
101
|
+
ORDER BY started_at DESC
|
|
102
|
+
LIMIT ?
|
|
103
|
+
`);
|
|
104
|
+
const rows = stmt.all(agentName, limit);
|
|
105
|
+
return rows.map(rowToExperiment);
|
|
106
|
+
}
|
|
107
|
+
// ─── Prompt Versions ──────────────────────────────
|
|
108
|
+
async savePromptVersion(pv) {
|
|
109
|
+
const db = this.getDb();
|
|
110
|
+
// Deactivate all other versions for this agent, then insert/replace
|
|
111
|
+
const transaction = db.transaction(() => {
|
|
112
|
+
if (pv.active) {
|
|
113
|
+
db.prepare(`
|
|
114
|
+
UPDATE prompt_versions SET active = 0 WHERE agent_name = ?
|
|
115
|
+
`).run(pv.agentName);
|
|
116
|
+
}
|
|
117
|
+
db.prepare(`
|
|
118
|
+
INSERT OR REPLACE INTO prompt_versions (
|
|
119
|
+
version, agent_name, prompt_text, created_at, parent_version,
|
|
120
|
+
change_reason, active, total_runs, avg_quality, avg_duration,
|
|
121
|
+
success_rate, avg_source_count
|
|
122
|
+
) VALUES (
|
|
123
|
+
@version, @agent_name, @prompt_text, @created_at, @parent_version,
|
|
124
|
+
@change_reason, @active, @total_runs, @avg_quality, @avg_duration,
|
|
125
|
+
@success_rate, @avg_source_count
|
|
126
|
+
)
|
|
127
|
+
`).run({
|
|
128
|
+
version: pv.version,
|
|
129
|
+
agent_name: pv.agentName,
|
|
130
|
+
prompt_text: pv.promptText,
|
|
131
|
+
created_at: pv.createdAt,
|
|
132
|
+
parent_version: pv.parentVersion,
|
|
133
|
+
change_reason: pv.changeReason,
|
|
134
|
+
active: pv.active ? 1 : 0,
|
|
135
|
+
total_runs: pv.stats.totalRuns,
|
|
136
|
+
avg_quality: pv.stats.avgQuality,
|
|
137
|
+
avg_duration: pv.stats.avgDuration,
|
|
138
|
+
success_rate: pv.stats.successRate,
|
|
139
|
+
avg_source_count: pv.stats.avgSourceCount,
|
|
140
|
+
});
|
|
141
|
+
});
|
|
142
|
+
transaction();
|
|
143
|
+
}
|
|
144
|
+
async getActivePrompt(agentName) {
|
|
145
|
+
const db = this.getDb();
|
|
146
|
+
const stmt = db.prepare(`
|
|
147
|
+
SELECT * FROM prompt_versions
|
|
148
|
+
WHERE active = 1 AND agent_name = ?
|
|
149
|
+
`);
|
|
150
|
+
const row = stmt.get(agentName);
|
|
151
|
+
return row ? rowToPromptVersion(row) : null;
|
|
152
|
+
}
|
|
153
|
+
async getAllPromptVersions(agentName) {
|
|
154
|
+
const db = this.getDb();
|
|
155
|
+
const stmt = db.prepare(`
|
|
156
|
+
SELECT * FROM prompt_versions
|
|
157
|
+
WHERE agent_name = ?
|
|
158
|
+
ORDER BY created_at
|
|
159
|
+
`);
|
|
160
|
+
const rows = stmt.all(agentName);
|
|
161
|
+
return rows.map(rowToPromptVersion);
|
|
162
|
+
}
|
|
163
|
+
// ─── Learnings ────────────────────────────────────
|
|
164
|
+
async saveLearning(learning) {
|
|
165
|
+
const db = this.getDb();
|
|
166
|
+
const id = learning.id ?? randomUUID();
|
|
167
|
+
const tags = JSON.stringify(learning.tags);
|
|
168
|
+
const confidence = learning.confidence ?? 0.8;
|
|
169
|
+
db.prepare(`
|
|
170
|
+
INSERT INTO learnings (id, agent_name, content, category, tags, confidence)
|
|
171
|
+
VALUES (?, ?, ?, ?, ?, ?)
|
|
172
|
+
`).run(id, learning.agentName, learning.content, learning.category, tags, confidence);
|
|
173
|
+
// Sync FTS index
|
|
174
|
+
db.prepare(`
|
|
175
|
+
INSERT INTO learnings_fts (rowid, content, tags)
|
|
176
|
+
SELECT rowid, content, tags FROM learnings WHERE id = ?
|
|
177
|
+
`).run(id);
|
|
178
|
+
}
|
|
179
|
+
async searchLearnings(query, limit = 20) {
|
|
180
|
+
const db = this.getDb();
|
|
181
|
+
// Try FTS5 full-text search first
|
|
182
|
+
try {
|
|
183
|
+
const ftsStmt = db.prepare(`
|
|
184
|
+
SELECT l.* FROM learnings l
|
|
185
|
+
JOIN learnings_fts fts ON l.rowid = fts.rowid
|
|
186
|
+
WHERE learnings_fts MATCH ?
|
|
187
|
+
ORDER BY rank
|
|
188
|
+
LIMIT ?
|
|
189
|
+
`);
|
|
190
|
+
const rows = ftsStmt.all(query, limit);
|
|
191
|
+
if (rows.length > 0) {
|
|
192
|
+
return rows.map(rowToLearning);
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
catch {
|
|
196
|
+
// FTS query syntax error — fall through to LIKE
|
|
197
|
+
}
|
|
198
|
+
// Fallback: LIKE-based search
|
|
199
|
+
const likeStmt = db.prepare(`
|
|
200
|
+
SELECT * FROM learnings
|
|
201
|
+
WHERE content LIKE ? OR tags LIKE ?
|
|
202
|
+
ORDER BY created_at DESC
|
|
203
|
+
LIMIT ?
|
|
204
|
+
`);
|
|
205
|
+
const pattern = `%${query}%`;
|
|
206
|
+
const rows = likeStmt.all(pattern, pattern, limit);
|
|
207
|
+
return rows.map(rowToLearning);
|
|
208
|
+
}
|
|
209
|
+
// ─── State ────────────────────────────────────────
|
|
210
|
+
async getState() {
|
|
211
|
+
const db = this.getDb();
|
|
212
|
+
const row = db.prepare(`SELECT value FROM state WHERE key = ?`).get('darwin_state');
|
|
213
|
+
if (!row) {
|
|
214
|
+
return { ...DEFAULT_STATE };
|
|
215
|
+
}
|
|
216
|
+
return JSON.parse(row.value);
|
|
217
|
+
}
|
|
218
|
+
async saveState(state) {
|
|
219
|
+
const db = this.getDb();
|
|
220
|
+
db.prepare(`INSERT OR REPLACE INTO state (key, value) VALUES (?, ?)`).run('darwin_state', JSON.stringify(state));
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* Atomically read-modify-write the Darwin state inside a single transaction.
|
|
224
|
+
* Prevents race conditions when multiple agents update state concurrently.
|
|
225
|
+
* Uses BEGIN IMMEDIATE to acquire a write lock before reading.
|
|
226
|
+
*/
|
|
227
|
+
async updateState(fn) {
|
|
228
|
+
const db = this.getDb();
|
|
229
|
+
const transaction = db.transaction(() => {
|
|
230
|
+
const row = db.prepare(`SELECT value FROM state WHERE key = ?`).get('darwin_state');
|
|
231
|
+
const current = row
|
|
232
|
+
? JSON.parse(row.value)
|
|
233
|
+
: { ...DEFAULT_STATE };
|
|
234
|
+
const updated = fn(current);
|
|
235
|
+
db.prepare(`INSERT OR REPLACE INTO state (key, value) VALUES (?, ?)`).run('darwin_state', JSON.stringify(updated));
|
|
236
|
+
return updated;
|
|
237
|
+
});
|
|
238
|
+
return transaction.immediate();
|
|
239
|
+
}
|
|
240
|
+
// ─── Private ──────────────────────────────────────
|
|
241
|
+
/** Get the database connection, throw if not initialized */
|
|
242
|
+
getDb() {
|
|
243
|
+
if (!this.db) {
|
|
244
|
+
throw new Error('SqliteMemoryProvider not initialized. Call init() first.');
|
|
245
|
+
}
|
|
246
|
+
return this.db;
|
|
247
|
+
}
|
|
248
|
+
/** Create all tables and indexes */
|
|
249
|
+
createTables() {
|
|
250
|
+
const db = this.getDb();
|
|
251
|
+
db.exec(`
|
|
252
|
+
CREATE TABLE IF NOT EXISTS experiments (
|
|
253
|
+
id TEXT PRIMARY KEY,
|
|
254
|
+
agent_name TEXT NOT NULL,
|
|
255
|
+
prompt_version TEXT NOT NULL,
|
|
256
|
+
task TEXT NOT NULL,
|
|
257
|
+
task_type TEXT NOT NULL DEFAULT 'general',
|
|
258
|
+
started_at TEXT NOT NULL,
|
|
259
|
+
completed_at TEXT NOT NULL,
|
|
260
|
+
success INTEGER NOT NULL DEFAULT 1,
|
|
261
|
+
quality_score REAL,
|
|
262
|
+
source_count INTEGER DEFAULT 0,
|
|
263
|
+
output_length INTEGER DEFAULT 0,
|
|
264
|
+
error_count INTEGER DEFAULT 0,
|
|
265
|
+
duration_ms INTEGER DEFAULT 0,
|
|
266
|
+
feedback_score REAL,
|
|
267
|
+
feedback_report TEXT,
|
|
268
|
+
feedback_evaluator TEXT,
|
|
269
|
+
output TEXT,
|
|
270
|
+
created_at TEXT DEFAULT (datetime('now'))
|
|
271
|
+
);
|
|
272
|
+
|
|
273
|
+
CREATE TABLE IF NOT EXISTS prompt_versions (
|
|
274
|
+
version TEXT NOT NULL,
|
|
275
|
+
agent_name TEXT NOT NULL,
|
|
276
|
+
prompt_text TEXT NOT NULL,
|
|
277
|
+
created_at TEXT NOT NULL,
|
|
278
|
+
parent_version TEXT,
|
|
279
|
+
change_reason TEXT NOT NULL,
|
|
280
|
+
active INTEGER NOT NULL DEFAULT 0,
|
|
281
|
+
total_runs INTEGER DEFAULT 0,
|
|
282
|
+
avg_quality REAL DEFAULT 0,
|
|
283
|
+
avg_duration REAL DEFAULT 0,
|
|
284
|
+
success_rate REAL DEFAULT 0,
|
|
285
|
+
avg_source_count REAL DEFAULT 0,
|
|
286
|
+
PRIMARY KEY (agent_name, version)
|
|
287
|
+
);
|
|
288
|
+
|
|
289
|
+
CREATE TABLE IF NOT EXISTS learnings (
|
|
290
|
+
id TEXT PRIMARY KEY,
|
|
291
|
+
agent_name TEXT NOT NULL,
|
|
292
|
+
content TEXT NOT NULL,
|
|
293
|
+
category TEXT NOT NULL,
|
|
294
|
+
tags TEXT NOT NULL DEFAULT '[]',
|
|
295
|
+
confidence REAL DEFAULT 0.8,
|
|
296
|
+
created_at TEXT DEFAULT (datetime('now'))
|
|
297
|
+
);
|
|
298
|
+
|
|
299
|
+
CREATE TABLE IF NOT EXISTS state (
|
|
300
|
+
key TEXT PRIMARY KEY,
|
|
301
|
+
value TEXT NOT NULL
|
|
302
|
+
);
|
|
303
|
+
|
|
304
|
+
CREATE VIRTUAL TABLE IF NOT EXISTS learnings_fts USING fts5(
|
|
305
|
+
content, tags,
|
|
306
|
+
content=learnings,
|
|
307
|
+
content_rowid=rowid
|
|
308
|
+
);
|
|
309
|
+
|
|
310
|
+
CREATE INDEX IF NOT EXISTS idx_experiments_agent
|
|
311
|
+
ON experiments(agent_name);
|
|
312
|
+
CREATE INDEX IF NOT EXISTS idx_experiments_agent_version
|
|
313
|
+
ON experiments(agent_name, prompt_version);
|
|
314
|
+
CREATE INDEX IF NOT EXISTS idx_experiments_agent_started
|
|
315
|
+
ON experiments(agent_name, started_at DESC);
|
|
316
|
+
`);
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
// ─── Row → Domain Mappers ───────────────────────────
|
|
320
|
+
function rowToExperiment(row) {
|
|
321
|
+
const experiment = {
|
|
322
|
+
id: row.id,
|
|
323
|
+
agentName: row.agent_name,
|
|
324
|
+
promptVersion: row.prompt_version,
|
|
325
|
+
task: row.task,
|
|
326
|
+
taskType: row.task_type,
|
|
327
|
+
startedAt: row.started_at,
|
|
328
|
+
completedAt: row.completed_at,
|
|
329
|
+
success: row.success === 1,
|
|
330
|
+
metrics: {
|
|
331
|
+
qualityScore: row.quality_score,
|
|
332
|
+
sourceCount: row.source_count,
|
|
333
|
+
outputLength: row.output_length,
|
|
334
|
+
errorCount: row.error_count,
|
|
335
|
+
durationMs: row.duration_ms,
|
|
336
|
+
},
|
|
337
|
+
};
|
|
338
|
+
if (row.feedback_score !== null && row.feedback_report !== null && row.feedback_evaluator !== null) {
|
|
339
|
+
experiment.feedback = {
|
|
340
|
+
score: row.feedback_score,
|
|
341
|
+
report: row.feedback_report,
|
|
342
|
+
evaluator: row.feedback_evaluator,
|
|
343
|
+
};
|
|
344
|
+
}
|
|
345
|
+
if (row.output !== null) {
|
|
346
|
+
experiment.output = row.output;
|
|
347
|
+
}
|
|
348
|
+
return experiment;
|
|
349
|
+
}
|
|
350
|
+
function rowToPromptVersion(row) {
|
|
351
|
+
const stats = {
|
|
352
|
+
totalRuns: row.total_runs,
|
|
353
|
+
avgQuality: row.avg_quality,
|
|
354
|
+
avgDuration: row.avg_duration,
|
|
355
|
+
successRate: row.success_rate,
|
|
356
|
+
avgSourceCount: row.avg_source_count,
|
|
357
|
+
};
|
|
358
|
+
return {
|
|
359
|
+
version: row.version,
|
|
360
|
+
agentName: row.agent_name,
|
|
361
|
+
promptText: row.prompt_text,
|
|
362
|
+
createdAt: row.created_at,
|
|
363
|
+
parentVersion: row.parent_version,
|
|
364
|
+
changeReason: row.change_reason,
|
|
365
|
+
active: row.active === 1,
|
|
366
|
+
stats,
|
|
367
|
+
};
|
|
368
|
+
}
|
|
369
|
+
function rowToLearning(row) {
|
|
370
|
+
return {
|
|
371
|
+
id: row.id,
|
|
372
|
+
agentName: row.agent_name,
|
|
373
|
+
content: row.content,
|
|
374
|
+
category: row.category,
|
|
375
|
+
tags: JSON.parse(row.tags),
|
|
376
|
+
confidence: row.confidence,
|
|
377
|
+
createdAt: row.created_at,
|
|
378
|
+
};
|
|
379
|
+
}
|
|
380
|
+
//# sourceMappingURL=sqlite-memory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sqlite-memory.js","sourceRoot":"","sources":["../../src/memory/sqlite-memory.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Darwin — Anthropic API Provider
|
|
3
|
+
*
|
|
4
|
+
* Direct API calls to Anthropic's Messages API.
|
|
5
|
+
* No SDK dependency — uses native fetch (Node 20+).
|
|
6
|
+
*
|
|
7
|
+
* 10-100x faster than Claude CLI for non-MCP tasks.
|
|
8
|
+
*/
|
|
9
|
+
import type { LLMCallOptions, LLMCallResult, LLMProvider, ProviderConfig } from './types.js';
|
|
10
|
+
export declare class AnthropicProvider implements LLMProvider {
|
|
11
|
+
readonly name = "anthropic-api";
|
|
12
|
+
readonly supportsMcp = false;
|
|
13
|
+
private apiKey;
|
|
14
|
+
private baseUrl;
|
|
15
|
+
private defaultModel;
|
|
16
|
+
private defaultMaxTokens;
|
|
17
|
+
constructor(config: ProviderConfig);
|
|
18
|
+
run(options: LLMCallOptions): Promise<LLMCallResult>;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=anthropic.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"anthropic.d.ts","sourceRoot":"","sources":["../../src/providers/anthropic.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAwB7F,qBAAa,iBAAkB,YAAW,WAAW;IACnD,QAAQ,CAAC,IAAI,mBAAmB;IAChC,QAAQ,CAAC,WAAW,SAAS;IAE7B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,gBAAgB,CAAS;gBAErB,MAAM,EAAE,cAAc;IAW5B,GAAG,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC;CA2D3D"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Darwin — Anthropic API Provider
|
|
3
|
+
*
|
|
4
|
+
* Direct API calls to Anthropic's Messages API.
|
|
5
|
+
* No SDK dependency — uses native fetch (Node 20+).
|
|
6
|
+
*
|
|
7
|
+
* 10-100x faster than Claude CLI for non-MCP tasks.
|
|
8
|
+
*/
|
|
9
|
+
const DEFAULT_BASE_URL = 'https://api.anthropic.com';
|
|
10
|
+
const DEFAULT_MODEL = 'claude-sonnet-4-20250514';
|
|
11
|
+
const DEFAULT_MAX_TOKENS = 8192;
|
|
12
|
+
const API_VERSION = '2023-06-01';
|
|
13
|
+
export class AnthropicProvider {
|
|
14
|
+
name = 'anthropic-api';
|
|
15
|
+
supportsMcp = false;
|
|
16
|
+
apiKey;
|
|
17
|
+
baseUrl;
|
|
18
|
+
defaultModel;
|
|
19
|
+
defaultMaxTokens;
|
|
20
|
+
constructor(config) {
|
|
21
|
+
const key = config.apiKey ?? process.env.ANTHROPIC_API_KEY;
|
|
22
|
+
if (!key) {
|
|
23
|
+
throw new Error('Anthropic API key required. Set ANTHROPIC_API_KEY or pass apiKey in config.');
|
|
24
|
+
}
|
|
25
|
+
this.apiKey = key;
|
|
26
|
+
this.baseUrl = config.baseUrl ?? DEFAULT_BASE_URL;
|
|
27
|
+
this.defaultModel = config.defaultModel ?? DEFAULT_MODEL;
|
|
28
|
+
this.defaultMaxTokens = config.defaultMaxTokens ?? DEFAULT_MAX_TOKENS;
|
|
29
|
+
}
|
|
30
|
+
async run(options) {
|
|
31
|
+
const model = options.model ?? this.defaultModel;
|
|
32
|
+
const maxTokens = options.maxTokens ?? this.defaultMaxTokens;
|
|
33
|
+
const timeout = options.timeout ?? 300_000; // 5 min default
|
|
34
|
+
const messages = [
|
|
35
|
+
{ role: 'user', content: options.userMessage },
|
|
36
|
+
];
|
|
37
|
+
const body = {
|
|
38
|
+
model,
|
|
39
|
+
max_tokens: maxTokens,
|
|
40
|
+
system: options.systemPrompt,
|
|
41
|
+
messages,
|
|
42
|
+
...(options.temperature !== undefined ? { temperature: options.temperature } : {}),
|
|
43
|
+
};
|
|
44
|
+
const startTime = Date.now();
|
|
45
|
+
const controller = new AbortController();
|
|
46
|
+
const timer = setTimeout(() => controller.abort(), timeout);
|
|
47
|
+
try {
|
|
48
|
+
const response = await fetch(`${this.baseUrl}/v1/messages`, {
|
|
49
|
+
method: 'POST',
|
|
50
|
+
headers: {
|
|
51
|
+
'Content-Type': 'application/json',
|
|
52
|
+
'x-api-key': this.apiKey,
|
|
53
|
+
'anthropic-version': API_VERSION,
|
|
54
|
+
},
|
|
55
|
+
body: JSON.stringify(body),
|
|
56
|
+
signal: controller.signal,
|
|
57
|
+
});
|
|
58
|
+
if (!response.ok) {
|
|
59
|
+
const errorText = await response.text();
|
|
60
|
+
throw new Error(`Anthropic API error ${String(response.status)}: ${errorText}`);
|
|
61
|
+
}
|
|
62
|
+
const data = (await response.json());
|
|
63
|
+
const durationMs = Date.now() - startTime;
|
|
64
|
+
// Extract text from content blocks
|
|
65
|
+
const output = data.content
|
|
66
|
+
.filter((block) => block.type === 'text')
|
|
67
|
+
.map((block) => block.text)
|
|
68
|
+
.join('\n');
|
|
69
|
+
return {
|
|
70
|
+
output,
|
|
71
|
+
durationMs,
|
|
72
|
+
inputTokens: data.usage.input_tokens,
|
|
73
|
+
outputTokens: data.usage.output_tokens,
|
|
74
|
+
model: data.model,
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
finally {
|
|
78
|
+
clearTimeout(timer);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=anthropic.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"anthropic.js","sourceRoot":"","sources":["../../src/providers/anthropic.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Darwin — Claude CLI Provider
|
|
3
|
+
*
|
|
4
|
+
* Spawns `claude` CLI as a child process.
|
|
5
|
+
* The only provider that supports MCP tool use (via --mcp-config).
|
|
6
|
+
* Slower than direct API but enables full tool-augmented agents.
|
|
7
|
+
*/
|
|
8
|
+
import type { DarwinConfig, AgentDefinition } from '../types.js';
|
|
9
|
+
import type { LLMCallOptions, LLMCallResult, LLMProvider, ProviderConfig } from './types.js';
|
|
10
|
+
/** Extended options for Claude CLI (MCP, tools, etc.) */
|
|
11
|
+
export interface ClaudeCliRunOptions {
|
|
12
|
+
/** Agent definition (needed for MCP config and tools) */
|
|
13
|
+
agent?: AgentDefinition;
|
|
14
|
+
/** Darwin config (for MCP server definitions) */
|
|
15
|
+
darwinConfig?: DarwinConfig;
|
|
16
|
+
/** Max conversation turns */
|
|
17
|
+
maxTurns?: number;
|
|
18
|
+
/** Working directory for the CLI process */
|
|
19
|
+
cwd?: string;
|
|
20
|
+
/** Run in autonomous mode (bypass permissions) */
|
|
21
|
+
autonomous?: boolean;
|
|
22
|
+
}
|
|
23
|
+
export declare class ClaudeCliProvider implements LLMProvider {
|
|
24
|
+
readonly name = "claude-cli";
|
|
25
|
+
readonly supportsMcp = true;
|
|
26
|
+
private defaultModel;
|
|
27
|
+
/** Stashed CLI-specific options — set before run() via setRunOptions() */
|
|
28
|
+
private runOptions;
|
|
29
|
+
constructor(config: ProviderConfig);
|
|
30
|
+
/** Set CLI-specific options for the next run (MCP, tools, etc.) */
|
|
31
|
+
setRunOptions(opts: ClaudeCliRunOptions): void;
|
|
32
|
+
run(options: LLMCallOptions): Promise<LLMCallResult>;
|
|
33
|
+
private executeOnce;
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=claude-cli.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-cli.d.ts","sourceRoot":"","sources":["../../src/providers/claude-cli.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,KAAK,EAAE,YAAY,EAAE,eAAe,EAAmB,MAAM,aAAa,CAAC;AAClF,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAI7F,yDAAyD;AACzD,MAAM,WAAW,mBAAmB;IAClC,yDAAyD;IACzD,KAAK,CAAC,EAAE,eAAe,CAAC;IACxB,iDAAiD;IACjD,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,6BAA6B;IAC7B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,4CAA4C;IAC5C,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,kDAAkD;IAClD,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,qBAAa,iBAAkB,YAAW,WAAW;IACnD,QAAQ,CAAC,IAAI,gBAAgB;IAC7B,QAAQ,CAAC,WAAW,QAAQ;IAE5B,OAAO,CAAC,YAAY,CAAS;IAC7B,0EAA0E;IAC1E,OAAO,CAAC,UAAU,CAA2B;gBAEjC,MAAM,EAAE,cAAc;IAIlC,mEAAmE;IACnE,aAAa,CAAC,IAAI,EAAE,mBAAmB,GAAG,IAAI;IAIxC,GAAG,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC;YAwB5C,WAAW;CA8E1B"}
|