darwin-agents 0.4.9 → 0.5.0-alpha.2
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/CHANGELOG.md +85 -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 +75 -0
- package/dist/core/runner.d.ts.map +1 -0
- package/dist/core/runner.js +255 -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 +326 -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 +153 -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/src/core/trace-capture.d.ts +107 -0
- package/dist/src/core/trace-capture.d.ts.map +1 -0
- package/dist/src/core/trace-capture.js +183 -0
- package/dist/src/core/trace-capture.js.map +1 -0
- package/dist/src/evolution/optimizer-gepa.d.ts +149 -0
- package/dist/src/evolution/optimizer-gepa.d.ts.map +1 -0
- package/dist/src/evolution/optimizer-gepa.js +198 -0
- package/dist/src/evolution/optimizer-gepa.js.map +1 -0
- package/dist/src/evolution/pareto.d.ts +116 -0
- package/dist/src/evolution/pareto.d.ts.map +1 -0
- package/dist/src/evolution/pareto.js +140 -0
- package/dist/src/evolution/pareto.js.map +1 -0
- package/dist/src/evolution/reflector.d.ts +107 -0
- package/dist/src/evolution/reflector.d.ts.map +1 -0
- package/dist/src/evolution/reflector.js +158 -0
- package/dist/src/evolution/reflector.js.map +1 -0
- package/dist/src/evolution/run-prompt-fn.d.ts +11 -0
- package/dist/src/evolution/run-prompt-fn.d.ts.map +1 -0
- package/dist/src/evolution/run-prompt-fn.js +11 -0
- package/dist/src/evolution/run-prompt-fn.js.map +1 -0
- package/dist/src/index.d.ts +7 -1
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +6 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/memory/postgres-memory.d.ts.map +1 -1
- package/dist/src/memory/postgres-memory.js +38 -3
- package/dist/src/memory/postgres-memory.js.map +1 -1
- package/dist/src/memory/sqlite-memory.d.ts.map +1 -1
- package/dist/src/memory/sqlite-memory.js +47 -2
- package/dist/src/memory/sqlite-memory.js.map +1 -1
- package/dist/src/types.d.ts +136 -0
- package/dist/src/types.d.ts.map +1 -1
- package/dist/src/types.js.map +1 -1
- 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 +1 -1
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Darwin — Agent Definition & Config
|
|
3
|
+
*
|
|
4
|
+
* Factory functions for creating validated agent definitions
|
|
5
|
+
* and merging config with sensible defaults.
|
|
6
|
+
*/
|
|
7
|
+
import { existsSync } from 'node:fs';
|
|
8
|
+
import { join } from 'node:path';
|
|
9
|
+
import { pathToFileURL } from 'node:url';
|
|
10
|
+
// ─── Defaults ────────────────────────────────────────
|
|
11
|
+
const DEFAULT_MAX_TURNS = 10;
|
|
12
|
+
const DEFAULT_MODEL = 'claude-sonnet-4-20250514';
|
|
13
|
+
const AGENT_NAME_PATTERN = /^[a-z][a-z0-9-]*$/;
|
|
14
|
+
/**
|
|
15
|
+
* Auto-detect the best available provider.
|
|
16
|
+
* Priority: ANTHROPIC_API_KEY > OPENAI_API_KEY > claude-cli
|
|
17
|
+
*/
|
|
18
|
+
function detectDefaultProvider() {
|
|
19
|
+
if (process.env.ANTHROPIC_API_KEY)
|
|
20
|
+
return 'anthropic-api';
|
|
21
|
+
if (process.env.OPENAI_API_KEY)
|
|
22
|
+
return 'openai';
|
|
23
|
+
return 'claude-cli';
|
|
24
|
+
}
|
|
25
|
+
const DEFAULT_CONFIG = {
|
|
26
|
+
provider: detectDefaultProvider(),
|
|
27
|
+
memory: 'sqlite',
|
|
28
|
+
evolution: {
|
|
29
|
+
enabled: false,
|
|
30
|
+
minRuns: 5,
|
|
31
|
+
safetyGate: true,
|
|
32
|
+
},
|
|
33
|
+
dataDir: undefined,
|
|
34
|
+
};
|
|
35
|
+
// ─── Validation Helpers ──────────────────────────────
|
|
36
|
+
function validateAgentName(name) {
|
|
37
|
+
if (!name || name.length === 0) {
|
|
38
|
+
throw new Error('Agent name is required');
|
|
39
|
+
}
|
|
40
|
+
if (!AGENT_NAME_PATTERN.test(name)) {
|
|
41
|
+
throw new Error(`Agent name "${name}" is invalid. Must be lowercase, start with a letter, ` +
|
|
42
|
+
`and contain only letters, digits, and hyphens.`);
|
|
43
|
+
}
|
|
44
|
+
if (name.length > 64) {
|
|
45
|
+
throw new Error(`Agent name "${name}" exceeds 64 character limit`);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
function validateSystemPrompt(prompt, agentName) {
|
|
49
|
+
if (!prompt || prompt.trim().length === 0) {
|
|
50
|
+
throw new Error(`Agent "${agentName}" requires a non-empty systemPrompt`);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
function validateSystemAgent(def) {
|
|
54
|
+
if (def.type === 'system' && typeof def.handler !== 'function') {
|
|
55
|
+
throw new Error(`System agent "${def.name}" requires a handler function`);
|
|
56
|
+
}
|
|
57
|
+
if (def.type !== 'system' && def.handler) {
|
|
58
|
+
throw new Error(`Agent "${def.name}" has a handler but type is "${def.type ?? 'llm'}". ` +
|
|
59
|
+
`Set type: 'system' to use a handler.`);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
// ─── Public API ──────────────────────────────────────
|
|
63
|
+
/**
|
|
64
|
+
* Define and validate an agent definition.
|
|
65
|
+
* Returns the definition with defaults applied for optional fields.
|
|
66
|
+
*
|
|
67
|
+
* @example
|
|
68
|
+
* ```ts
|
|
69
|
+
* const researcher = defineAgent({
|
|
70
|
+
* name: 'researcher',
|
|
71
|
+
* role: 'Deep Research Agent',
|
|
72
|
+
* description: 'Researches topics with web sources',
|
|
73
|
+
* systemPrompt: 'You are a research agent...',
|
|
74
|
+
* mcp: ['tavily', 'memory'],
|
|
75
|
+
* tools: ['Read', 'Glob', 'Grep'],
|
|
76
|
+
* });
|
|
77
|
+
* ```
|
|
78
|
+
*/
|
|
79
|
+
export function defineAgent(def) {
|
|
80
|
+
// Validate required fields
|
|
81
|
+
validateAgentName(def.name);
|
|
82
|
+
validateSystemPrompt(def.systemPrompt, def.name);
|
|
83
|
+
validateSystemAgent(def);
|
|
84
|
+
if (!def.role || def.role.trim().length === 0) {
|
|
85
|
+
throw new Error(`Agent "${def.name}" requires a non-empty role`);
|
|
86
|
+
}
|
|
87
|
+
if (!def.description || def.description.trim().length === 0) {
|
|
88
|
+
throw new Error(`Agent "${def.name}" requires a non-empty description`);
|
|
89
|
+
}
|
|
90
|
+
// Return with defaults applied
|
|
91
|
+
return {
|
|
92
|
+
...def,
|
|
93
|
+
type: def.type ?? 'llm',
|
|
94
|
+
maxTurns: def.maxTurns ?? DEFAULT_MAX_TURNS,
|
|
95
|
+
model: def.model ?? DEFAULT_MODEL,
|
|
96
|
+
mcp: def.mcp ?? [],
|
|
97
|
+
tools: def.tools ?? [],
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Define a Darwin configuration by merging partial overrides with defaults.
|
|
102
|
+
*
|
|
103
|
+
* @example
|
|
104
|
+
* ```ts
|
|
105
|
+
* const config = defineConfig({
|
|
106
|
+
* memory: 'postgres',
|
|
107
|
+
* postgresUrl: 'postgresql://...',
|
|
108
|
+
* evolution: { enabled: true },
|
|
109
|
+
* });
|
|
110
|
+
* ```
|
|
111
|
+
*/
|
|
112
|
+
export function defineConfig(config) {
|
|
113
|
+
return {
|
|
114
|
+
...DEFAULT_CONFIG,
|
|
115
|
+
...config,
|
|
116
|
+
// Deep-merge evolution settings so partial overrides don't wipe defaults
|
|
117
|
+
evolution: {
|
|
118
|
+
enabled: config.evolution?.enabled ?? DEFAULT_CONFIG.evolution?.enabled ?? false,
|
|
119
|
+
minRuns: config.evolution?.minRuns ?? DEFAULT_CONFIG.evolution?.minRuns,
|
|
120
|
+
safetyGate: config.evolution?.safetyGate ?? DEFAULT_CONFIG.evolution?.safetyGate,
|
|
121
|
+
},
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Load config from darwin.config.ts in the current working directory.
|
|
126
|
+
* Falls back to defaults if no config file is found.
|
|
127
|
+
*
|
|
128
|
+
* Also checks for DARWIN_POSTGRES_URL env var and auto-sets
|
|
129
|
+
* memory: 'postgres' + postgresUrl when present.
|
|
130
|
+
*/
|
|
131
|
+
export async function loadConfig() {
|
|
132
|
+
let config = { ...DEFAULT_CONFIG };
|
|
133
|
+
// Try loading darwin.config.ts from cwd
|
|
134
|
+
const configPath = join(process.cwd(), 'darwin.config.ts');
|
|
135
|
+
if (existsSync(configPath)) {
|
|
136
|
+
try {
|
|
137
|
+
const configUrl = pathToFileURL(configPath).href;
|
|
138
|
+
const imported = await import(configUrl);
|
|
139
|
+
if (imported.default) {
|
|
140
|
+
config = defineConfig(imported.default);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
catch {
|
|
144
|
+
// Config file exists but failed to load — use defaults
|
|
145
|
+
console.warn(`[darwin] Warning: Failed to load ${configPath}, using defaults`);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
// Auto-detect postgres from env var
|
|
149
|
+
const postgresUrl = process.env['DARWIN_POSTGRES_URL'];
|
|
150
|
+
if (postgresUrl) {
|
|
151
|
+
config.memory = 'postgres';
|
|
152
|
+
config.postgresUrl = postgresUrl;
|
|
153
|
+
}
|
|
154
|
+
return config;
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Synchronous config loader — returns defaults only.
|
|
158
|
+
* Used by callers that cannot await (kept for backward compatibility).
|
|
159
|
+
*
|
|
160
|
+
* @deprecated Use loadConfig() (async) instead.
|
|
161
|
+
*/
|
|
162
|
+
export function loadConfigSync() {
|
|
163
|
+
const config = { ...DEFAULT_CONFIG };
|
|
164
|
+
// Auto-detect postgres from env var
|
|
165
|
+
const postgresUrl = process.env['DARWIN_POSTGRES_URL'];
|
|
166
|
+
if (postgresUrl) {
|
|
167
|
+
config.memory = 'postgres';
|
|
168
|
+
config.postgresUrl = postgresUrl;
|
|
169
|
+
}
|
|
170
|
+
return config;
|
|
171
|
+
}
|
|
172
|
+
//# sourceMappingURL=agent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent.js","sourceRoot":"","sources":["../../src/core/agent.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Darwin — Agent Runner
|
|
3
|
+
*
|
|
4
|
+
* Executes agents via pluggable LLM providers.
|
|
5
|
+
* Supports: Claude CLI (with MCP), Anthropic API, OpenAI, Ollama.
|
|
6
|
+
*
|
|
7
|
+
* The runner handles metrics, experiment records, and reports.
|
|
8
|
+
* The provider handles the actual LLM call.
|
|
9
|
+
*/
|
|
10
|
+
import type { AgentDefinition, DarwinConfig, RunResult } from '../types.js';
|
|
11
|
+
import type { LLMProvider } from '../providers/types.js';
|
|
12
|
+
/** Options for a single agent run */
|
|
13
|
+
export interface RunOptions {
|
|
14
|
+
/** Override the agent's model for this run */
|
|
15
|
+
model?: string;
|
|
16
|
+
/** Override max turns for this run */
|
|
17
|
+
maxTurns?: number;
|
|
18
|
+
/** Task category for experiment tracking */
|
|
19
|
+
taskType?: string;
|
|
20
|
+
/** Darwin config (for MCP servers, data dir, etc.) */
|
|
21
|
+
config?: DarwinConfig;
|
|
22
|
+
/** Prompt version identifier for experiment tracking */
|
|
23
|
+
promptVersion?: string;
|
|
24
|
+
/** Working directory for the Claude CLI process */
|
|
25
|
+
cwd?: string;
|
|
26
|
+
/** Timeout in milliseconds (default: 600_000 = 10 minutes) */
|
|
27
|
+
timeout?: number;
|
|
28
|
+
/** Run in autonomous mode with bypassed permissions */
|
|
29
|
+
autonomous?: boolean;
|
|
30
|
+
/** Explicit LLM provider (overrides config.provider) */
|
|
31
|
+
provider?: LLMProvider;
|
|
32
|
+
}
|
|
33
|
+
/** Override the per-process run cap (0 = disabled). Primarily for tests. */
|
|
34
|
+
export declare function setMaxRunsPerProcess(n: number): void;
|
|
35
|
+
/** Override the wall-clock cap in ms (0 = disabled). Primarily for tests. */
|
|
36
|
+
export declare function setMaxRunWallMs(ms: number): void;
|
|
37
|
+
/** Reset the process run counter + wall-clock start. Primarily for tests. */
|
|
38
|
+
export declare function resetRunCounters(): void;
|
|
39
|
+
/** Error thrown when a process-lifetime budget cap is exceeded. */
|
|
40
|
+
export declare class DarwinBudgetError extends Error {
|
|
41
|
+
readonly budget: 'runs' | 'wall';
|
|
42
|
+
constructor(message: string, budget: 'runs' | 'wall');
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Run an agent using the configured LLM provider.
|
|
46
|
+
*
|
|
47
|
+
* For Claude CLI: spawns a child process with MCP support.
|
|
48
|
+
* For API providers: makes a direct HTTP call (10-100x faster).
|
|
49
|
+
*
|
|
50
|
+
* @example
|
|
51
|
+
* ```ts
|
|
52
|
+
* // Default: uses Claude CLI
|
|
53
|
+
* const result = await runAgent(writer, 'Write a landing page', {
|
|
54
|
+
* taskType: 'market',
|
|
55
|
+
* config: darwinConfig,
|
|
56
|
+
* });
|
|
57
|
+
*
|
|
58
|
+
* // Explicit provider: Anthropic API (faster, no MCP)
|
|
59
|
+
* import { createProvider } from '../providers/index.js';
|
|
60
|
+
* const result = await runAgent(critic, 'Evaluate this output', {
|
|
61
|
+
* provider: createProvider({ type: 'anthropic-api' }),
|
|
62
|
+
* });
|
|
63
|
+
* ```
|
|
64
|
+
*/
|
|
65
|
+
export declare function runAgent(agent: AgentDefinition, task: string, opts?: RunOptions): Promise<RunResult>;
|
|
66
|
+
/**
|
|
67
|
+
* Error thrown when an LLM provider fails.
|
|
68
|
+
* Preserves the exit code (CLI) and any partial output for debugging.
|
|
69
|
+
*/
|
|
70
|
+
export declare class RunnerError extends Error {
|
|
71
|
+
readonly exitCode: number | null;
|
|
72
|
+
readonly partialOutput: string;
|
|
73
|
+
constructor(message: string, exitCode: number | null, partialOutput: string);
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=runner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/core/runner.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAKH,OAAO,KAAK,EACV,eAAe,EACf,YAAY,EAGZ,SAAS,EACV,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAMzD,qCAAqC;AACrC,MAAM,WAAW,UAAU;IACzB,8CAA8C;IAC9C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,sCAAsC;IACtC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,4CAA4C;IAC5C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,sDAAsD;IACtD,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,wDAAwD;IACxD,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,mDAAmD;IACnD,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,8DAA8D;IAC9D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,uDAAuD;IACvD,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,wDAAwD;IACxD,QAAQ,CAAC,EAAE,WAAW,CAAC;CACxB;AAgCD,4EAA4E;AAC5E,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI,CAEpD;AACD,6EAA6E;AAC7E,wBAAgB,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAEhD;AACD,6EAA6E;AAC7E,wBAAgB,gBAAgB,IAAI,IAAI,CAGvC;AAED,mEAAmE;AACnE,qBAAa,iBAAkB,SAAQ,KAAK;aACG,MAAM,EAAE,MAAM,GAAG,MAAM;gBAAxD,OAAO,EAAE,MAAM,EAAkB,MAAM,EAAE,MAAM,GAAG,MAAM;CAIrE;AA8JD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAsB,QAAQ,CAC5B,KAAK,EAAE,eAAe,EACtB,IAAI,EAAE,MAAM,EACZ,IAAI,GAAE,UAAe,GACpB,OAAO,CAAC,SAAS,CAAC,CAwEpB;AAID;;;GAGG;AACH,qBAAa,WAAY,SAAQ,KAAK;aAGlB,QAAQ,EAAE,MAAM,GAAG,IAAI;aACvB,aAAa,EAAE,MAAM;gBAFrC,OAAO,EAAE,MAAM,EACC,QAAQ,EAAE,MAAM,GAAG,IAAI,EACvB,aAAa,EAAE,MAAM;CAKxC"}
|
|
@@ -0,0 +1,255 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Darwin — Agent Runner
|
|
3
|
+
*
|
|
4
|
+
* Executes agents via pluggable LLM providers.
|
|
5
|
+
* Supports: Claude CLI (with MCP), Anthropic API, OpenAI, Ollama.
|
|
6
|
+
*
|
|
7
|
+
* The runner handles metrics, experiment records, and reports.
|
|
8
|
+
* The provider handles the actual LLM call.
|
|
9
|
+
*/
|
|
10
|
+
import { mkdirSync, writeFileSync } from 'node:fs';
|
|
11
|
+
import { join, resolve } from 'node:path';
|
|
12
|
+
import { ClaudeCliProvider } from '../providers/claude-cli.js';
|
|
13
|
+
import { createProvider } from '../providers/index.js';
|
|
14
|
+
// ─── Constants ───────────────────────────────────────
|
|
15
|
+
const DEFAULT_TIMEOUT = 600_000; // 10 minutes
|
|
16
|
+
const DEFAULT_MODEL = 'claude-sonnet-4-20250514';
|
|
17
|
+
const DEFAULT_MAX_TURNS = 10;
|
|
18
|
+
const DEFAULT_DATA_DIR = '.darwin';
|
|
19
|
+
const DEFAULT_TASK_TYPE = 'general';
|
|
20
|
+
// ─── Process-lifetime budget caps ────────────────────
|
|
21
|
+
//
|
|
22
|
+
// Self-evolving agent loops (A/B tests, multi-model critics, convergence
|
|
23
|
+
// bugs) can fan out into hundreds of provider calls if nothing stops them,
|
|
24
|
+
// and each call hits the billed API. These caps short-circuit the runner
|
|
25
|
+
// before the next LLM call so a runaway loop tops out at a known ceiling.
|
|
26
|
+
// Both are opt-out (`0` = disabled), overridable via env or the explicit
|
|
27
|
+
// setters below. Original feature landed in 29c4367; Round-4 added the
|
|
28
|
+
// DarwinBudgetError class + test helpers so regressions can be asserted.
|
|
29
|
+
const DEFAULT_MAX_RUNS_PER_PROCESS = 100;
|
|
30
|
+
const DEFAULT_MAX_RUN_WALL_MS = 60 * 60 * 1000; // 1 h
|
|
31
|
+
let maxRunsPerProcess = Number(process.env.DARWIN_MAX_RUNS_PER_PROCESS ?? DEFAULT_MAX_RUNS_PER_PROCESS);
|
|
32
|
+
let maxRunWallMs = Number(process.env.DARWIN_MAX_RUN_WALL_MS ?? DEFAULT_MAX_RUN_WALL_MS);
|
|
33
|
+
let runsThisProcess = 0;
|
|
34
|
+
let processStartMs = Date.now();
|
|
35
|
+
/** Override the per-process run cap (0 = disabled). Primarily for tests. */
|
|
36
|
+
export function setMaxRunsPerProcess(n) {
|
|
37
|
+
maxRunsPerProcess = n;
|
|
38
|
+
}
|
|
39
|
+
/** Override the wall-clock cap in ms (0 = disabled). Primarily for tests. */
|
|
40
|
+
export function setMaxRunWallMs(ms) {
|
|
41
|
+
maxRunWallMs = ms;
|
|
42
|
+
}
|
|
43
|
+
/** Reset the process run counter + wall-clock start. Primarily for tests. */
|
|
44
|
+
export function resetRunCounters() {
|
|
45
|
+
runsThisProcess = 0;
|
|
46
|
+
processStartMs = Date.now();
|
|
47
|
+
}
|
|
48
|
+
/** Error thrown when a process-lifetime budget cap is exceeded. */
|
|
49
|
+
export class DarwinBudgetError extends Error {
|
|
50
|
+
budget;
|
|
51
|
+
constructor(message, budget) {
|
|
52
|
+
super(message);
|
|
53
|
+
this.budget = budget;
|
|
54
|
+
this.name = 'DarwinBudgetError';
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
function enforceBudget() {
|
|
58
|
+
if (maxRunsPerProcess > 0 && runsThisProcess >= maxRunsPerProcess) {
|
|
59
|
+
throw new DarwinBudgetError(`Darwin run cap reached: ${String(runsThisProcess)}/${String(maxRunsPerProcess)} runs in this process. ` +
|
|
60
|
+
`Set DARWIN_MAX_RUNS_PER_PROCESS=0 to disable or raise the limit.`, 'runs');
|
|
61
|
+
}
|
|
62
|
+
const elapsed = Date.now() - processStartMs;
|
|
63
|
+
if (maxRunWallMs > 0 && elapsed >= maxRunWallMs) {
|
|
64
|
+
throw new DarwinBudgetError(`Darwin wall-clock cap reached: ${String(Math.round(elapsed / 1000))}s / ${String(Math.round(maxRunWallMs / 1000))}s. ` +
|
|
65
|
+
`Restart the process, or set DARWIN_MAX_RUN_WALL_MS=0 to disable.`, 'wall');
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
// Matches common URL patterns for source counting
|
|
69
|
+
const URL_PATTERN = /https?:\/\/[^\s)>\]"'`]+/g;
|
|
70
|
+
// ─── Metrics Parser ──────────────────────────────────
|
|
71
|
+
/**
|
|
72
|
+
* Parse basic metrics from agent output.
|
|
73
|
+
* - sourceCount: number of unique URLs found in output
|
|
74
|
+
* - outputLength: character count of the output
|
|
75
|
+
*/
|
|
76
|
+
function parseMetrics(output, durationMs) {
|
|
77
|
+
const urls = output.match(URL_PATTERN);
|
|
78
|
+
const uniqueUrls = urls ? new Set(urls) : new Set();
|
|
79
|
+
return {
|
|
80
|
+
qualityScore: null, // Set later by evaluator
|
|
81
|
+
sourceCount: uniqueUrls.size,
|
|
82
|
+
outputLength: output.length,
|
|
83
|
+
errorCount: 0,
|
|
84
|
+
durationMs,
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
// ─── Experiment Factory ──────────────────────────────
|
|
88
|
+
function generateExperimentId(agentName) {
|
|
89
|
+
const date = new Date().toISOString().slice(0, 10);
|
|
90
|
+
const random = Math.random().toString(36).slice(2, 10);
|
|
91
|
+
return `exp-${agentName}-${date}-${random}`;
|
|
92
|
+
}
|
|
93
|
+
function createExperiment(agent, task, output, startedAt, completedAt, success, metrics, opts) {
|
|
94
|
+
return {
|
|
95
|
+
id: generateExperimentId(agent.name),
|
|
96
|
+
agentName: agent.name,
|
|
97
|
+
promptVersion: opts.promptVersion ?? 'v1',
|
|
98
|
+
task,
|
|
99
|
+
taskType: opts.taskType ?? DEFAULT_TASK_TYPE,
|
|
100
|
+
startedAt,
|
|
101
|
+
completedAt,
|
|
102
|
+
success,
|
|
103
|
+
metrics,
|
|
104
|
+
output,
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
// ─── Report Writer ───────────────────────────────────
|
|
108
|
+
function saveReport(experiment, dataDir) {
|
|
109
|
+
const reportsDir = resolve(join(dataDir, 'reports'));
|
|
110
|
+
mkdirSync(reportsDir, { recursive: true });
|
|
111
|
+
const filename = `${experiment.id}.md`;
|
|
112
|
+
const filepath = join(reportsDir, filename);
|
|
113
|
+
const durationSec = (experiment.metrics.durationMs / 1000).toFixed(1);
|
|
114
|
+
const report = `# ${experiment.id}
|
|
115
|
+
|
|
116
|
+
## Meta
|
|
117
|
+
- **Agent:** ${experiment.agentName}
|
|
118
|
+
- **Task Type:** ${experiment.taskType}
|
|
119
|
+
- **Prompt Version:** ${experiment.promptVersion}
|
|
120
|
+
- **Started:** ${experiment.startedAt}
|
|
121
|
+
- **Completed:** ${experiment.completedAt}
|
|
122
|
+
- **Duration:** ${durationSec}s
|
|
123
|
+
- **Success:** ${experiment.success ? 'Yes' : 'No'}
|
|
124
|
+
|
|
125
|
+
## Metrics
|
|
126
|
+
| Metric | Value |
|
|
127
|
+
|--------|-------|
|
|
128
|
+
| Quality Score | ${experiment.metrics.qualityScore ?? 'pending'} |
|
|
129
|
+
| Source Count | ${experiment.metrics.sourceCount} |
|
|
130
|
+
| Output Length | ${experiment.metrics.outputLength} chars |
|
|
131
|
+
| Error Count | ${experiment.metrics.errorCount} |
|
|
132
|
+
| Duration | ${durationSec}s |
|
|
133
|
+
|
|
134
|
+
## Task
|
|
135
|
+
${experiment.task}
|
|
136
|
+
|
|
137
|
+
## Output
|
|
138
|
+
${experiment.output ?? 'No output captured'}
|
|
139
|
+
`;
|
|
140
|
+
writeFileSync(filepath, report, 'utf-8');
|
|
141
|
+
return filepath;
|
|
142
|
+
}
|
|
143
|
+
// ─── Provider Resolution ─────────────────────────────
|
|
144
|
+
/**
|
|
145
|
+
* Resolve which LLM provider to use for a given agent and options.
|
|
146
|
+
*
|
|
147
|
+
* Priority: opts.provider > config.provider > 'claude-cli' (default)
|
|
148
|
+
*
|
|
149
|
+
* Auto-fallback: If agent uses MCP tools and provider doesn't support MCP,
|
|
150
|
+
* automatically falls back to Claude CLI with a warning.
|
|
151
|
+
*/
|
|
152
|
+
function resolveProvider(agent, opts) {
|
|
153
|
+
// Explicit provider passed in options
|
|
154
|
+
if (opts.provider) {
|
|
155
|
+
return opts.provider;
|
|
156
|
+
}
|
|
157
|
+
// Determine provider type from config
|
|
158
|
+
const providerType = opts.config?.provider ?? 'claude-cli';
|
|
159
|
+
const provider = createProvider({ type: providerType });
|
|
160
|
+
// Auto-fallback: if agent needs MCP but provider doesn't support it
|
|
161
|
+
const needsMcp = agent.mcp && agent.mcp.length > 0;
|
|
162
|
+
if (needsMcp && !provider.supportsMcp) {
|
|
163
|
+
console.warn(`⚠ Agent "${agent.name}" uses MCP tools but provider "${provider.name}" doesn't support MCP. Falling back to claude-cli.`);
|
|
164
|
+
return createProvider({ type: 'claude-cli' });
|
|
165
|
+
}
|
|
166
|
+
return provider;
|
|
167
|
+
}
|
|
168
|
+
// ─── Runner ──────────────────────────────────────────
|
|
169
|
+
/**
|
|
170
|
+
* Run an agent using the configured LLM provider.
|
|
171
|
+
*
|
|
172
|
+
* For Claude CLI: spawns a child process with MCP support.
|
|
173
|
+
* For API providers: makes a direct HTTP call (10-100x faster).
|
|
174
|
+
*
|
|
175
|
+
* @example
|
|
176
|
+
* ```ts
|
|
177
|
+
* // Default: uses Claude CLI
|
|
178
|
+
* const result = await runAgent(writer, 'Write a landing page', {
|
|
179
|
+
* taskType: 'market',
|
|
180
|
+
* config: darwinConfig,
|
|
181
|
+
* });
|
|
182
|
+
*
|
|
183
|
+
* // Explicit provider: Anthropic API (faster, no MCP)
|
|
184
|
+
* import { createProvider } from '../providers/index.js';
|
|
185
|
+
* const result = await runAgent(critic, 'Evaluate this output', {
|
|
186
|
+
* provider: createProvider({ type: 'anthropic-api' }),
|
|
187
|
+
* });
|
|
188
|
+
* ```
|
|
189
|
+
*/
|
|
190
|
+
export async function runAgent(agent, task, opts = {}) {
|
|
191
|
+
// System agents don't use LLM providers
|
|
192
|
+
if (agent.type === 'system') {
|
|
193
|
+
throw new Error(`Agent "${agent.name}" is a system agent. ` +
|
|
194
|
+
`System agents must be run through their handler, not the CLI runner.`);
|
|
195
|
+
}
|
|
196
|
+
// Hard-stop before paying for the next provider call if the process has
|
|
197
|
+
// blown through its budget (run count or wall-clock).
|
|
198
|
+
enforceBudget();
|
|
199
|
+
const startedAt = new Date().toISOString();
|
|
200
|
+
const dataDir = opts.config?.dataDir ?? DEFAULT_DATA_DIR;
|
|
201
|
+
const model = opts.model ?? agent.model ?? DEFAULT_MODEL;
|
|
202
|
+
const timeout = opts.timeout ?? DEFAULT_TIMEOUT;
|
|
203
|
+
runsThisProcess += 1;
|
|
204
|
+
// Resolve provider
|
|
205
|
+
const provider = resolveProvider(agent, opts);
|
|
206
|
+
// Configure Claude CLI-specific options
|
|
207
|
+
if (provider instanceof ClaudeCliProvider) {
|
|
208
|
+
provider.setRunOptions({
|
|
209
|
+
agent,
|
|
210
|
+
darwinConfig: opts.config,
|
|
211
|
+
maxTurns: opts.maxTurns ?? agent.maxTurns ?? DEFAULT_MAX_TURNS,
|
|
212
|
+
cwd: opts.cwd,
|
|
213
|
+
autonomous: opts.autonomous,
|
|
214
|
+
});
|
|
215
|
+
}
|
|
216
|
+
// Execute via provider
|
|
217
|
+
const result = await provider.run({
|
|
218
|
+
model,
|
|
219
|
+
systemPrompt: agent.systemPrompt,
|
|
220
|
+
userMessage: task,
|
|
221
|
+
timeout,
|
|
222
|
+
});
|
|
223
|
+
const output = result.output;
|
|
224
|
+
const completedAt = new Date().toISOString();
|
|
225
|
+
// Parse metrics from output
|
|
226
|
+
const metrics = parseMetrics(output, result.durationMs);
|
|
227
|
+
// Detect truncated runs (max turns reached = not a real success)
|
|
228
|
+
const isMaxTurns = output.startsWith('Error: Reached max turns');
|
|
229
|
+
const success = !isMaxTurns && output.length > 50;
|
|
230
|
+
// Create experiment record
|
|
231
|
+
const experiment = createExperiment(agent, task, output, startedAt, completedAt, success, metrics, opts);
|
|
232
|
+
// Save report to disk
|
|
233
|
+
const reportPath = saveReport(experiment, dataDir);
|
|
234
|
+
return {
|
|
235
|
+
experiment,
|
|
236
|
+
output,
|
|
237
|
+
reportPath,
|
|
238
|
+
};
|
|
239
|
+
}
|
|
240
|
+
// ─── Error Type ──────────────────────────────────────
|
|
241
|
+
/**
|
|
242
|
+
* Error thrown when an LLM provider fails.
|
|
243
|
+
* Preserves the exit code (CLI) and any partial output for debugging.
|
|
244
|
+
*/
|
|
245
|
+
export class RunnerError extends Error {
|
|
246
|
+
exitCode;
|
|
247
|
+
partialOutput;
|
|
248
|
+
constructor(message, exitCode, partialOutput) {
|
|
249
|
+
super(message);
|
|
250
|
+
this.exitCode = exitCode;
|
|
251
|
+
this.partialOutput = partialOutput;
|
|
252
|
+
this.name = 'RunnerError';
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
//# sourceMappingURL=runner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/core/runner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Darwin — Evolution Loop
|
|
3
|
+
*
|
|
4
|
+
* The core evolution cycle. Called after every agent run, it:
|
|
5
|
+
* 1. Records the experiment
|
|
6
|
+
* 2. Checks for failure rollback
|
|
7
|
+
* 3. Manages A/B tests between prompt versions
|
|
8
|
+
* 4. Triggers prompt optimization when enough data exists
|
|
9
|
+
*
|
|
10
|
+
* This is the brain of Darwin's self-evolution.
|
|
11
|
+
*/
|
|
12
|
+
import type { AgentDefinition, DarwinExperiment, DarwinPattern, MemoryProvider } from '../types.js';
|
|
13
|
+
import type { ExperimentTracker } from './tracker.js';
|
|
14
|
+
import type { PromptOptimizer } from './optimizer.js';
|
|
15
|
+
import type { SafetyGate } from './safety.js';
|
|
16
|
+
import type { PatternDetector } from './patterns.js';
|
|
17
|
+
import type { NotificationConfig } from './notifications.js';
|
|
18
|
+
export interface EvolutionResult {
|
|
19
|
+
patternsFound: DarwinPattern[];
|
|
20
|
+
promptEvolved: boolean;
|
|
21
|
+
abTestStarted: boolean;
|
|
22
|
+
abTestCompleted: boolean;
|
|
23
|
+
rolledBack: boolean;
|
|
24
|
+
newVersion?: string;
|
|
25
|
+
message: string;
|
|
26
|
+
}
|
|
27
|
+
interface DarwinLoopDeps {
|
|
28
|
+
memory: MemoryProvider;
|
|
29
|
+
tracker: ExperimentTracker;
|
|
30
|
+
optimizer: PromptOptimizer;
|
|
31
|
+
safety: SafetyGate;
|
|
32
|
+
patterns: PatternDetector;
|
|
33
|
+
/** Agent definition — used to pass tool context to optimizer */
|
|
34
|
+
agent?: AgentDefinition;
|
|
35
|
+
/** Notification config (Telegram alerts) — auto-loaded from env if not set */
|
|
36
|
+
notifications?: NotificationConfig;
|
|
37
|
+
}
|
|
38
|
+
export declare class DarwinLoop {
|
|
39
|
+
private memory;
|
|
40
|
+
private tracker;
|
|
41
|
+
private optimizer;
|
|
42
|
+
private safety;
|
|
43
|
+
private patterns;
|
|
44
|
+
private agent?;
|
|
45
|
+
private notifications;
|
|
46
|
+
constructor(deps: DarwinLoopDeps);
|
|
47
|
+
/**
|
|
48
|
+
* Called AFTER every agent run. Drives the evolution cycle.
|
|
49
|
+
*
|
|
50
|
+
* Flow:
|
|
51
|
+
* 0. Detect incomplete runs (skip them)
|
|
52
|
+
* 1. Record experiment
|
|
53
|
+
* 2. Rollback check (consecutive failures)
|
|
54
|
+
* 3. A/B test management (if active)
|
|
55
|
+
* 4. Validate data quality before evolving
|
|
56
|
+
* 5. Evolution trigger (if enough data and no active test)
|
|
57
|
+
*/
|
|
58
|
+
afterRun(experiment: DarwinExperiment): Promise<EvolutionResult>;
|
|
59
|
+
private handleABTest;
|
|
60
|
+
/**
|
|
61
|
+
* Roll back to the last known good prompt version.
|
|
62
|
+
* Returns true if a rollback was performed.
|
|
63
|
+
*/
|
|
64
|
+
private rollback;
|
|
65
|
+
/**
|
|
66
|
+
* Activate a specific prompt version and deactivate all others.
|
|
67
|
+
*/
|
|
68
|
+
private activateVersion;
|
|
69
|
+
/**
|
|
70
|
+
* Extract recent critic feedback reports from experiments.
|
|
71
|
+
*
|
|
72
|
+
* Returns up to `limit` feedback report texts from the most recent experiments
|
|
73
|
+
* that have critic feedback. Experiments are already ordered by started_at DESC
|
|
74
|
+
* from loadExperiments(), so we just filter for ones with feedback.
|
|
75
|
+
*/
|
|
76
|
+
private getRecentFeedback;
|
|
77
|
+
/**
|
|
78
|
+
* Increment version string: "v1" -> "v2", "v12" -> "v13".
|
|
79
|
+
*/
|
|
80
|
+
private nextVersion;
|
|
81
|
+
/**
|
|
82
|
+
* Check if a run is incomplete (agent ran out of turns or produced no real output).
|
|
83
|
+
* Incomplete runs are NOT recorded as experiments to avoid poisoning the data.
|
|
84
|
+
*
|
|
85
|
+
* Checks output length regardless of success flag — a 300-char "successful" run
|
|
86
|
+
* is still garbage data that shouldn't influence evolution.
|
|
87
|
+
*/
|
|
88
|
+
private isIncompleteRun;
|
|
89
|
+
/**
|
|
90
|
+
* Validate that experiment data is clean enough for evolution.
|
|
91
|
+
* Prevents garbage-in-garbage-out (e.g., broken search backend producing 0 sources).
|
|
92
|
+
*/
|
|
93
|
+
private validateDataQuality;
|
|
94
|
+
/**
|
|
95
|
+
* Build a human-readable change reason from detected patterns.
|
|
96
|
+
*/
|
|
97
|
+
private buildChangeReason;
|
|
98
|
+
}
|
|
99
|
+
export {};
|
|
100
|
+
//# sourceMappingURL=loop.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loop.d.ts","sourceRoot":"","sources":["../../src/evolution/loop.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAEV,eAAe,EACf,gBAAgB,EAChB,aAAa,EACb,cAAc,EAEf,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACtD,OAAO,KAAK,EAAE,eAAe,EAAoB,MAAM,gBAAgB,CAAC;AACxE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAK7D,MAAM,WAAW,eAAe;IAC9B,aAAa,EAAE,aAAa,EAAE,CAAC;IAC/B,aAAa,EAAE,OAAO,CAAC;IACvB,aAAa,EAAE,OAAO,CAAC;IACvB,eAAe,EAAE,OAAO,CAAC;IACzB,UAAU,EAAE,OAAO,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;CACjB;AAID,UAAU,cAAc;IACtB,MAAM,EAAE,cAAc,CAAC;IACvB,OAAO,EAAE,iBAAiB,CAAC;IAC3B,SAAS,EAAE,eAAe,CAAC;IAC3B,MAAM,EAAE,UAAU,CAAC;IACnB,QAAQ,EAAE,eAAe,CAAC;IAC1B,gEAAgE;IAChE,KAAK,CAAC,EAAE,eAAe,CAAC;IACxB,8EAA8E;IAC9E,aAAa,CAAC,EAAE,kBAAkB,CAAC;CACpC;AAYD,qBAAa,UAAU;IACrB,OAAO,CAAC,MAAM,CAAiB;IAC/B,OAAO,CAAC,OAAO,CAAoB;IACnC,OAAO,CAAC,SAAS,CAAkB;IACnC,OAAO,CAAC,MAAM,CAAa;IAC3B,OAAO,CAAC,QAAQ,CAAkB;IAClC,OAAO,CAAC,KAAK,CAAC,CAAkB;IAChC,OAAO,CAAC,aAAa,CAAqB;gBAE9B,IAAI,EAAE,cAAc;IAUhC;;;;;;;;;;OAUG;IACG,QAAQ,CAAC,UAAU,EAAE,gBAAgB,GAAG,OAAO,CAAC,eAAe,CAAC;YA4NxD,YAAY;IAiG1B;;;OAGG;YACW,QAAQ;IA8BtB;;OAEG;YACW,eAAe;IAe7B;;;;;;OAMG;YACW,iBAAiB;IAe/B;;OAEG;IACH,OAAO,CAAC,WAAW;IAWnB;;;;;;OAMG;IACH,OAAO,CAAC,eAAe;IAKvB;;;OAGG;YACW,mBAAmB;IAiDjC;;OAEG;IACH,OAAO,CAAC,iBAAiB;CAsB1B"}
|