dipclaw 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. package/config.example.json +26 -0
  2. package/dist/agent/agent.d.ts +85 -0
  3. package/dist/agent/agent.js +725 -0
  4. package/dist/agent/agent.js.map +1 -0
  5. package/dist/agent/memory.d.ts +17 -0
  6. package/dist/agent/memory.js +92 -0
  7. package/dist/agent/memory.js.map +1 -0
  8. package/dist/agent/scheduler.d.ts +35 -0
  9. package/dist/agent/scheduler.js +154 -0
  10. package/dist/agent/scheduler.js.map +1 -0
  11. package/dist/agent/skill-generator.d.ts +37 -0
  12. package/dist/agent/skill-generator.js +263 -0
  13. package/dist/agent/skill-generator.js.map +1 -0
  14. package/dist/agent/task-runner.d.ts +31 -0
  15. package/dist/agent/task-runner.js +242 -0
  16. package/dist/agent/task-runner.js.map +1 -0
  17. package/dist/browser/actions.d.ts +28 -0
  18. package/dist/browser/actions.js +212 -0
  19. package/dist/browser/actions.js.map +1 -0
  20. package/dist/browser/manager.d.ts +17 -0
  21. package/dist/browser/manager.js +249 -0
  22. package/dist/browser/manager.js.map +1 -0
  23. package/dist/browser/script-runner.d.ts +49 -0
  24. package/dist/browser/script-runner.js +137 -0
  25. package/dist/browser/script-runner.js.map +1 -0
  26. package/dist/browser/snapshot.d.ts +15 -0
  27. package/dist/browser/snapshot.js +38 -0
  28. package/dist/browser/snapshot.js.map +1 -0
  29. package/dist/config/types.d.ts +62 -0
  30. package/dist/config/types.js +47 -0
  31. package/dist/config/types.js.map +1 -0
  32. package/dist/index.d.ts +2 -0
  33. package/dist/index.js +219 -0
  34. package/dist/index.js.map +1 -0
  35. package/dist/llm/client.d.ts +3 -0
  36. package/dist/llm/client.js +503 -0
  37. package/dist/llm/client.js.map +1 -0
  38. package/dist/llm/tools.d.ts +5 -0
  39. package/dist/llm/tools.js +94 -0
  40. package/dist/llm/tools.js.map +1 -0
  41. package/dist/llm/types.d.ts +49 -0
  42. package/dist/llm/types.js +2 -0
  43. package/dist/llm/types.js.map +1 -0
  44. package/dist/logging/logger.d.ts +17 -0
  45. package/dist/logging/logger.js +46 -0
  46. package/dist/logging/logger.js.map +1 -0
  47. package/dist/telegram/bot.d.ts +15 -0
  48. package/dist/telegram/bot.js +279 -0
  49. package/dist/telegram/bot.js.map +1 -0
  50. package/dist/tui/tui.d.ts +12 -0
  51. package/dist/tui/tui.js +176 -0
  52. package/dist/tui/tui.js.map +1 -0
  53. package/package.json +53 -0
@@ -0,0 +1,137 @@
1
+ import { browserTool } from "../llm/tools.js";
2
+ /**
3
+ * Runs a skill script step-by-step.
4
+ * Each step tries direct execution first; on failure, falls back to LLM.
5
+ */
6
+ export class ScriptRunner {
7
+ actions;
8
+ llmClient;
9
+ logger;
10
+ constructor(actions, llmClient, logger) {
11
+ this.actions = actions;
12
+ this.llmClient = llmClient;
13
+ this.logger = logger;
14
+ }
15
+ async run(script, variables = {}) {
16
+ const stepResults = [];
17
+ this.logger.log("script_start", {
18
+ skill: script.name,
19
+ totalSteps: script.steps.length,
20
+ });
21
+ let failedCount = 0;
22
+ for (let i = 0; i < script.steps.length; i++) {
23
+ const step = script.steps[i];
24
+ const resolvedParams = this.resolveVariables(step.params, variables);
25
+ console.log(` Step ${i + 1}/${script.steps.length}: ${step.action} ${step.description || ""}`);
26
+ try {
27
+ await this.executeStep(step.action, resolvedParams);
28
+ stepResults.push({
29
+ index: i,
30
+ action: step.action,
31
+ success: true,
32
+ usedFallback: false,
33
+ });
34
+ }
35
+ catch (err) {
36
+ const msg = err instanceof Error ? err.message : String(err);
37
+ console.log(` Step ${i + 1} failed, falling back to LLM: ${msg}`);
38
+ try {
39
+ const fallbackResult = await this.llmFallback(step, resolvedParams, msg);
40
+ stepResults.push({
41
+ index: i,
42
+ action: step.action,
43
+ success: true,
44
+ usedFallback: true,
45
+ fallbackAction: fallbackResult,
46
+ });
47
+ }
48
+ catch (fallbackErr) {
49
+ failedCount++;
50
+ stepResults.push({
51
+ index: i,
52
+ action: step.action,
53
+ success: false,
54
+ usedFallback: true,
55
+ error: fallbackErr instanceof Error ? fallbackErr.message : String(fallbackErr),
56
+ });
57
+ }
58
+ }
59
+ }
60
+ const report = {
61
+ skillName: script.name,
62
+ totalSteps: script.steps.length,
63
+ successCount: stepResults.filter((s) => s.success).length,
64
+ fallbackCount: stepResults.filter((s) => s.usedFallback).length,
65
+ failedCount,
66
+ steps: stepResults,
67
+ completed: failedCount === 0,
68
+ };
69
+ this.logger.log("script_end", {
70
+ skill: script.name,
71
+ completed: report.completed,
72
+ fallbackCount: report.fallbackCount,
73
+ failedCount: report.failedCount,
74
+ });
75
+ return report;
76
+ }
77
+ async executeStep(action, params) {
78
+ switch (action) {
79
+ case "navigate":
80
+ return await this.actions.navigate(params.url);
81
+ case "click":
82
+ return await this.actions.click(params.ref);
83
+ case "type":
84
+ return await this.actions.type(params.ref, params.text, params.clear);
85
+ case "scroll":
86
+ return await this.actions.scroll(params.direction, params.amount);
87
+ case "screenshot":
88
+ const ss = await this.actions.screenshot(params.fullPage);
89
+ return ss.text;
90
+ case "evaluate":
91
+ return await this.actions.evaluate(params.script);
92
+ case "wait":
93
+ return await this.actions.wait(params);
94
+ case "snapshot":
95
+ return await this.actions.snapshot();
96
+ case "press":
97
+ return await this.actions.pressKey(params.key);
98
+ case "select":
99
+ return await this.actions.selectOption(params.ref, params.value);
100
+ default:
101
+ throw new Error(`Unknown action: ${action}`);
102
+ }
103
+ }
104
+ async llmFallback(step, params, error) {
105
+ // Get current page state
106
+ const snapshot = await this.actions.snapshot();
107
+ const response = await this.llmClient.chat([
108
+ {
109
+ role: "user",
110
+ content: `I'm executing a script step that failed. Here's the context:
111
+
112
+ Step: ${step.action} with params: ${JSON.stringify(params)}
113
+ Description: ${step.description || "N/A"}
114
+ Error: ${error}
115
+
116
+ Current page state:
117
+ ${snapshot}
118
+
119
+ Please use the browser tool to accomplish what this step was trying to do.`,
120
+ },
121
+ ], [browserTool], "You are a browser automation assistant. A script step failed and you need to accomplish the same goal using the browser tool. Be concise.");
122
+ return response.content || "LLM fallback completed";
123
+ }
124
+ resolveVariables(params, variables) {
125
+ const resolved = {};
126
+ for (const [key, value] of Object.entries(params)) {
127
+ if (typeof value === "string") {
128
+ resolved[key] = value.replace(/\{\{(\w+)\}\}/g, (_, varName) => variables[varName] || `{{${varName}}}`);
129
+ }
130
+ else {
131
+ resolved[key] = value;
132
+ }
133
+ }
134
+ return resolved;
135
+ }
136
+ }
137
+ //# sourceMappingURL=script-runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"script-runner.js","sourceRoot":"","sources":["../../src/browser/script-runner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type { Page } from "playwright";
2
+ interface ElementRef {
3
+ ref: string;
4
+ role: string;
5
+ name: string;
6
+ }
7
+ interface SnapshotResult {
8
+ text: string;
9
+ elementRefs: Map<string, ElementRef>;
10
+ }
11
+ export declare function resetRefs(): void;
12
+ export declare function getElementRef(ref: string): ElementRef | undefined;
13
+ export declare function getAllRefs(): Map<string, ElementRef>;
14
+ export declare function takeSnapshot(page: Page): Promise<SnapshotResult>;
15
+ export {};
@@ -0,0 +1,38 @@
1
+ let currentRefs = new Map();
2
+ export function resetRefs() {
3
+ currentRefs = new Map();
4
+ }
5
+ export function getElementRef(ref) {
6
+ return currentRefs.get(ref);
7
+ }
8
+ export function getAllRefs() {
9
+ return currentRefs;
10
+ }
11
+ export async function takeSnapshot(page) {
12
+ resetRefs();
13
+ // Use Playwright's ariaSnapshot with AI mode for element references
14
+ const snapshot = await page.ariaSnapshot({ mode: "ai" });
15
+ // Parse refs from the AI snapshot (format: [ref=e1], [ref=e2], etc.)
16
+ const refPattern = /\[ref=(e\d+)\]\s*(\w+)\s*"([^"]*)"/g;
17
+ let match;
18
+ while ((match = refPattern.exec(snapshot)) !== null) {
19
+ currentRefs.set(match[1], {
20
+ ref: match[1],
21
+ role: match[2],
22
+ name: match[3],
23
+ });
24
+ }
25
+ // Also parse simpler patterns like: - button "Submit" [ref=e5]
26
+ const altPattern = /-\s+(\w+)\s+"([^"]*)"\s*\[ref=(e\d+)\]/g;
27
+ while ((match = altPattern.exec(snapshot)) !== null) {
28
+ if (!currentRefs.has(match[3])) {
29
+ currentRefs.set(match[3], {
30
+ ref: match[3],
31
+ role: match[1],
32
+ name: match[2],
33
+ });
34
+ }
35
+ }
36
+ return { text: snapshot, elementRefs: currentRefs };
37
+ }
38
+ //# sourceMappingURL=snapshot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snapshot.js","sourceRoot":"","sources":["../../src/browser/snapshot.ts"],"names":[],"mappings":"AAaA,IAAI,WAAW,GAAG,IAAI,GAAG,EAAsB,CAAC;AAEhD,MAAM,UAAU,SAAS;IACvB,WAAW,GAAG,IAAI,GAAG,EAAE,CAAC;AAC1B,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,GAAW;IACvC,OAAO,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AAC9B,CAAC;AAED,MAAM,UAAU,UAAU;IACxB,OAAO,WAAW,CAAC;AACrB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,IAAU;IAC3C,SAAS,EAAE,CAAC;IAEZ,oEAAoE;IACpE,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IAEzD,qEAAqE;IACrE,MAAM,UAAU,GAAG,qCAAqC,CAAC;IACzD,IAAI,KAAK,CAAC;IACV,OAAO,CAAC,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QACpD,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE;YACxB,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC;YACb,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;YACd,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;SACf,CAAC,CAAC;IACL,CAAC;IAED,+DAA+D;IAC/D,MAAM,UAAU,GAAG,yCAAyC,CAAC;IAC7D,OAAO,CAAC,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QACpD,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/B,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE;gBACxB,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC;gBACb,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;gBACd,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;aACf,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,WAAW,EAAE,CAAC;AACtD,CAAC"}
@@ -0,0 +1,62 @@
1
+ import { z } from "zod/v4";
2
+ export declare const LlmProtocol: z.ZodEnum<{
3
+ openai: "openai";
4
+ claude: "claude";
5
+ }>;
6
+ export type LlmProtocol = z.infer<typeof LlmProtocol>;
7
+ export declare const ProxyConfig: z.ZodObject<{
8
+ protocol: z.ZodEnum<{
9
+ socks5: "socks5";
10
+ socks4: "socks4";
11
+ http: "http";
12
+ https: "https";
13
+ }>;
14
+ host: z.ZodString;
15
+ port: z.ZodNumber;
16
+ username: z.ZodOptional<z.ZodString>;
17
+ password: z.ZodOptional<z.ZodString>;
18
+ }, z.core.$strip>;
19
+ export type ProxyConfig = z.infer<typeof ProxyConfig>;
20
+ /** Build a proxy URL string from structured config */
21
+ export declare function proxyConfigToUrl(proxy: ProxyConfig): string;
22
+ export declare const DipclawConfig: z.ZodObject<{
23
+ name: z.ZodString;
24
+ workspace: z.ZodString;
25
+ llm: z.ZodObject<{
26
+ protocol: z.ZodEnum<{
27
+ openai: "openai";
28
+ claude: "claude";
29
+ }>;
30
+ baseUrl: z.ZodString;
31
+ apiKey: z.ZodString;
32
+ model: z.ZodString;
33
+ maxTokens: z.ZodOptional<z.ZodNumber>;
34
+ }, z.core.$strip>;
35
+ telegram: z.ZodOptional<z.ZodObject<{
36
+ botToken: z.ZodString;
37
+ allowedUsers: z.ZodArray<z.ZodNumber>;
38
+ }, z.core.$strip>>;
39
+ maxIterations: z.ZodDefault<z.ZodNumber>;
40
+ debug: z.ZodDefault<z.ZodBoolean>;
41
+ tui: z.ZodDefault<z.ZodBoolean>;
42
+ browser: z.ZodObject<{
43
+ headless: z.ZodDefault<z.ZodBoolean>;
44
+ proxy: z.ZodOptional<z.ZodObject<{
45
+ protocol: z.ZodEnum<{
46
+ socks5: "socks5";
47
+ socks4: "socks4";
48
+ http: "http";
49
+ https: "https";
50
+ }>;
51
+ host: z.ZodString;
52
+ port: z.ZodNumber;
53
+ username: z.ZodOptional<z.ZodString>;
54
+ password: z.ZodOptional<z.ZodString>;
55
+ }, z.core.$strip>>;
56
+ viewport: z.ZodOptional<z.ZodObject<{
57
+ width: z.ZodNumber;
58
+ height: z.ZodNumber;
59
+ }, z.core.$strip>>;
60
+ }, z.core.$strip>;
61
+ }, z.core.$strip>;
62
+ export type DipclawConfig = z.infer<typeof DipclawConfig>;
@@ -0,0 +1,47 @@
1
+ import { z } from "zod/v4";
2
+ export const LlmProtocol = z.enum(["openai", "claude"]);
3
+ export const ProxyConfig = z.object({
4
+ protocol: z.enum(["socks5", "socks4", "http", "https"]),
5
+ host: z.string().min(1),
6
+ port: z.number().int().positive(),
7
+ username: z.string().optional(),
8
+ password: z.string().optional(),
9
+ });
10
+ /** Build a proxy URL string from structured config */
11
+ export function proxyConfigToUrl(proxy) {
12
+ const auth = proxy.username && proxy.password
13
+ ? `${encodeURIComponent(proxy.username)}:${encodeURIComponent(proxy.password)}@`
14
+ : "";
15
+ return `${proxy.protocol}://${auth}${proxy.host}:${proxy.port}`;
16
+ }
17
+ export const DipclawConfig = z.object({
18
+ name: z.string().min(1),
19
+ workspace: z.string().min(1),
20
+ llm: z.object({
21
+ protocol: LlmProtocol,
22
+ baseUrl: z.string().min(1),
23
+ apiKey: z.string().min(1),
24
+ model: z.string().min(1),
25
+ maxTokens: z.number().int().positive().optional(),
26
+ }),
27
+ telegram: z
28
+ .object({
29
+ botToken: z.string().min(1),
30
+ allowedUsers: z.array(z.number().int()),
31
+ })
32
+ .optional(),
33
+ maxIterations: z.number().int().positive().default(90),
34
+ debug: z.boolean().default(false),
35
+ tui: z.boolean().default(false),
36
+ browser: z.object({
37
+ headless: z.boolean().default(false),
38
+ proxy: ProxyConfig.optional(),
39
+ viewport: z
40
+ .object({
41
+ width: z.number().int().positive(),
42
+ height: z.number().int().positive(),
43
+ })
44
+ .optional(),
45
+ }),
46
+ });
47
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/config/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
package/dist/index.js ADDED
@@ -0,0 +1,219 @@
1
+ #!/usr/bin/env node
2
+ import { Command } from "commander";
3
+ import { DipclawConfig } from "./config/types.js";
4
+ import { Agent } from "./agent/agent.js";
5
+ import fs from "node:fs";
6
+ import path from "node:path";
7
+ const program = new Command();
8
+ program
9
+ .name("dipclaw")
10
+ .description("Simplified browser automation agent")
11
+ .version("0.1.0")
12
+ .option("-c, --config <path>", "Path to config file (JSON or YAML)")
13
+ .option("--name <name>", "Agent name (also browser profile name)")
14
+ .option("--workspace <path>", "Workspace directory path")
15
+ .option("--llm-protocol <protocol>", "LLM protocol: openai or claude", process.env.DIPCLAW_LLM_PROTOCOL)
16
+ .option("--llm-url <url>", "LLM API base URL", process.env.DIPCLAW_LLM_URL)
17
+ .option("--llm-key <key>", "LLM API key", process.env.DIPCLAW_LLM_KEY)
18
+ .option("--llm-model <model>", "LLM model name", process.env.DIPCLAW_LLM_MODEL)
19
+ .option("--telegram-token <token>", "Telegram bot token", process.env.DIPCLAW_TELEGRAM_TOKEN)
20
+ .option("--telegram-users <ids>", "Allowed Telegram user IDs (comma-separated)", process.env.DIPCLAW_TELEGRAM_USERS)
21
+ .option("--max-iterations <n>", "Maximum tool-calling iterations per chat (default: 90)")
22
+ .option("--debug", "Enable debug mode (log LLM requests/responses)", false)
23
+ .option("--headless", "Run browser in headless mode", false)
24
+ .option("--proxy <url>", "Browser proxy (e.g. socks5://127.0.0.1:1080)", process.env.DIPCLAW_PROXY)
25
+ .option("--viewport <size>", "Browser viewport size (WxH, default: maximized)")
26
+ .option("--tui", "Enable interactive terminal UI (default: off)")
27
+ .parse(process.argv);
28
+ const opts = program.opts();
29
+ function parseViewport(vp) {
30
+ const [w, h] = vp.split("x").map(Number);
31
+ if (!w || !h) {
32
+ console.error(`Invalid viewport format: ${vp}. Expected WxH (e.g., 1280x720)`);
33
+ process.exit(1);
34
+ }
35
+ return { width: w, height: h };
36
+ }
37
+ /** Parse a proxy URL string into structured config */
38
+ function parseProxyString(proxy) {
39
+ try {
40
+ const url = new URL(proxy);
41
+ return {
42
+ protocol: url.protocol.replace(":", ""),
43
+ host: url.hostname,
44
+ port: parseInt(url.port, 10),
45
+ ...(url.username ? { username: decodeURIComponent(url.username) } : {}),
46
+ ...(url.password ? { password: decodeURIComponent(url.password) } : {}),
47
+ };
48
+ }
49
+ catch {
50
+ console.error(`Invalid proxy URL: ${proxy}. Expected format: protocol://[user:pass@]host:port`);
51
+ process.exit(1);
52
+ }
53
+ }
54
+ /**
55
+ * Load config from a JSON file.
56
+ * Supports ${ENV_VAR} and $ENV_VAR syntax for environment variable substitution.
57
+ */
58
+ function loadConfigFile(filePath) {
59
+ const absPath = path.resolve(filePath);
60
+ if (!fs.existsSync(absPath)) {
61
+ console.error(`Config file not found: ${absPath}`);
62
+ process.exit(1);
63
+ }
64
+ let content = fs.readFileSync(absPath, "utf-8");
65
+ // Substitute environment variables: ${VAR} or $VAR
66
+ content = content.replace(/\$\{([A-Za-z_][A-Za-z0-9_]*)\}|\$([A-Za-z_][A-Za-z0-9_]*)/g, (_, braced, bare) => {
67
+ const varName = braced || bare;
68
+ return process.env[varName] ?? "";
69
+ });
70
+ try {
71
+ return JSON.parse(content);
72
+ }
73
+ catch (err) {
74
+ console.error(`Failed to parse config file: ${err instanceof Error ? err.message : err}`);
75
+ process.exit(1);
76
+ }
77
+ }
78
+ /** Build rawConfig from CLI flags + env vars (original behavior) */
79
+ function buildConfigFromCli() {
80
+ if (!opts.name || !opts.workspace) {
81
+ console.error("Error: --name and --workspace are required when not using --config");
82
+ process.exit(1);
83
+ }
84
+ return {
85
+ name: opts.name,
86
+ workspace: path.resolve(opts.workspace),
87
+ llm: {
88
+ protocol: opts.llmProtocol,
89
+ baseUrl: opts.llmUrl,
90
+ apiKey: opts.llmKey,
91
+ model: opts.llmModel,
92
+ },
93
+ debug: opts.debug,
94
+ tui: opts.tui || false,
95
+ telegram: opts.telegramToken
96
+ ? {
97
+ botToken: opts.telegramToken,
98
+ allowedUsers: opts.telegramUsers
99
+ ? opts.telegramUsers.split(",").map(Number)
100
+ : [],
101
+ }
102
+ : undefined,
103
+ browser: {
104
+ headless: opts.headless,
105
+ proxy: opts.proxy ? parseProxyString(opts.proxy) : undefined,
106
+ viewport: opts.viewport ? parseViewport(opts.viewport) : undefined,
107
+ },
108
+ };
109
+ }
110
+ /** Merge file config with CLI overrides. CLI flags take precedence. */
111
+ function buildConfig() {
112
+ let base = {};
113
+ if (opts.config) {
114
+ base = loadConfigFile(opts.config);
115
+ // Resolve workspace relative to config file directory
116
+ if (typeof base.workspace === "string" && !path.isAbsolute(base.workspace)) {
117
+ base.workspace = path.resolve(path.dirname(path.resolve(opts.config)), base.workspace);
118
+ }
119
+ }
120
+ // CLI overrides on top of file config
121
+ if (opts.name)
122
+ base.name = opts.name;
123
+ if (opts.workspace)
124
+ base.workspace = path.resolve(opts.workspace);
125
+ const hasLlmCli = opts.llmProtocol || opts.llmUrl || opts.llmKey || opts.llmModel;
126
+ if (hasLlmCli) {
127
+ const fileLlm = base.llm || {};
128
+ base.llm = {
129
+ ...fileLlm,
130
+ ...(opts.llmProtocol ? { protocol: opts.llmProtocol } : {}),
131
+ ...(opts.llmUrl ? { baseUrl: opts.llmUrl } : {}),
132
+ ...(opts.llmKey ? { apiKey: opts.llmKey } : {}),
133
+ ...(opts.llmModel ? { model: opts.llmModel } : {}),
134
+ };
135
+ }
136
+ if (opts.telegramToken) {
137
+ base.telegram = {
138
+ botToken: opts.telegramToken,
139
+ allowedUsers: opts.telegramUsers
140
+ ? opts.telegramUsers.split(",").map(Number)
141
+ : [],
142
+ };
143
+ }
144
+ const hasBrowserCli = opts.headless || opts.proxy || opts.viewport;
145
+ if (hasBrowserCli) {
146
+ const fileBrowser = base.browser || {};
147
+ base.browser = {
148
+ ...fileBrowser,
149
+ ...(opts.headless ? { headless: true } : {}),
150
+ ...(opts.proxy ? { proxy: parseProxyString(opts.proxy) } : {}),
151
+ ...(opts.viewport ? { viewport: parseViewport(opts.viewport) } : {}),
152
+ };
153
+ }
154
+ if (opts.maxIterations)
155
+ base.maxIterations = parseInt(opts.maxIterations, 10);
156
+ if (opts.debug)
157
+ base.debug = true;
158
+ if (opts.tui)
159
+ base.tui = true;
160
+ if (!base.name || !base.workspace) {
161
+ console.error("Error: 'name' and 'workspace' are required (via --config file or CLI flags)");
162
+ process.exit(1);
163
+ }
164
+ return base;
165
+ }
166
+ const rawConfig = buildConfig();
167
+ const parseResult = DipclawConfig.safeParse(rawConfig);
168
+ if (!parseResult.success) {
169
+ console.error("Invalid configuration:");
170
+ console.error(parseResult.error.issues.map((i) => ` - ${i.path.join(".")}: ${i.message}`).join("\n"));
171
+ process.exit(1);
172
+ }
173
+ const config = parseResult.data;
174
+ // Ensure workspace directories exist
175
+ const dirs = [
176
+ config.workspace,
177
+ path.join(config.workspace, "browser-data"),
178
+ path.join(config.workspace, "skills"),
179
+ path.join(config.workspace, "logs"),
180
+ path.join(config.workspace, "tasks"),
181
+ path.join(config.workspace, "memory"),
182
+ path.join(config.workspace, "sessions"),
183
+ ];
184
+ for (const dir of dirs) {
185
+ fs.mkdirSync(dir, { recursive: true });
186
+ }
187
+ // Initialize tasks.json if not exists
188
+ const tasksFile = path.join(config.workspace, "tasks", "tasks.json");
189
+ if (!fs.existsSync(tasksFile)) {
190
+ fs.writeFileSync(tasksFile, "[]", "utf-8");
191
+ }
192
+ // Initialize MEMORY.md if not exists
193
+ const memoryIndex = path.join(config.workspace, "memory", "MEMORY.md");
194
+ if (!fs.existsSync(memoryIndex)) {
195
+ fs.writeFileSync(memoryIndex, "# Agent Memory\n\n", "utf-8");
196
+ }
197
+ async function main() {
198
+ console.log(`šŸ¤– Starting dipclaw agent: ${config.name}`);
199
+ console.log(`šŸ“ Workspace: ${config.workspace}`);
200
+ console.log(`🧠 LLM: ${config.llm.protocol} @ ${config.llm.baseUrl} (${config.llm.model})`);
201
+ const agent = new Agent(config);
202
+ let stopping = false;
203
+ const shutdown = async (signal) => {
204
+ if (stopping)
205
+ return;
206
+ stopping = true;
207
+ console.log(`\nšŸ›‘ Received ${signal}, shutting down...`);
208
+ await agent.stop();
209
+ process.exit(0);
210
+ };
211
+ process.on("SIGINT", () => shutdown("SIGINT"));
212
+ process.on("SIGTERM", () => shutdown("SIGTERM"));
213
+ await agent.start();
214
+ }
215
+ main().catch((err) => {
216
+ console.error("Fatal error:", err);
217
+ process.exit(1);
218
+ });
219
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,SAAS,CAAC;KACf,WAAW,CAAC,qCAAqC,CAAC;KAClD,OAAO,CAAC,OAAO,CAAC;KAChB,MAAM,CAAC,qBAAqB,EAAE,oCAAoC,CAAC;KACnE,MAAM,CAAC,eAAe,EAAE,wCAAwC,CAAC;KACjE,MAAM,CAAC,oBAAoB,EAAE,0BAA0B,CAAC;KACxD,MAAM,CACL,2BAA2B,EAC3B,gCAAgC,EAChC,OAAO,CAAC,GAAG,CAAC,oBAAoB,CACjC;KACA,MAAM,CACL,iBAAiB,EACjB,kBAAkB,EAClB,OAAO,CAAC,GAAG,CAAC,eAAe,CAC5B;KACA,MAAM,CACL,iBAAiB,EACjB,aAAa,EACb,OAAO,CAAC,GAAG,CAAC,eAAe,CAC5B;KACA,MAAM,CACL,qBAAqB,EACrB,gBAAgB,EAChB,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAC9B;KACA,MAAM,CACL,0BAA0B,EAC1B,oBAAoB,EACpB,OAAO,CAAC,GAAG,CAAC,sBAAsB,CACnC;KACA,MAAM,CACL,wBAAwB,EACxB,6CAA6C,EAC7C,OAAO,CAAC,GAAG,CAAC,sBAAsB,CACnC;KACA,MAAM,CAAC,sBAAsB,EAAE,wDAAwD,CAAC;KACxF,MAAM,CAAC,SAAS,EAAE,gDAAgD,EAAE,KAAK,CAAC;KAC1E,MAAM,CAAC,YAAY,EAAE,8BAA8B,EAAE,KAAK,CAAC;KAC3D,MAAM,CAAC,eAAe,EAAE,8CAA8C,EAAE,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC;KAClG,MAAM,CAAC,mBAAmB,EAAE,iDAAiD,CAAC;KAC9E,MAAM,CAAC,OAAO,EAAE,+CAA+C,CAAC;KAChE,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AAEvB,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;AAE5B,SAAS,aAAa,CAAC,EAAU;IAC/B,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACzC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,4BAA4B,EAAE,iCAAiC,CAAC,CAAC;QAC/E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;AACjC,CAAC;AAED,sDAAsD;AACtD,SAAS,gBAAgB,CAAC,KAAa;IACrC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC;QAC3B,OAAO;YACL,QAAQ,EAAE,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC;YACvC,IAAI,EAAE,GAAG,CAAC,QAAQ;YAClB,IAAI,EAAE,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC;YAC5B,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,kBAAkB,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACvE,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,kBAAkB,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACxE,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,KAAK,CAAC,sBAAsB,KAAK,qDAAqD,CAAC,CAAC;QAChG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,SAAS,cAAc,CAAC,QAAgB;IACtC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACvC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5B,OAAO,CAAC,KAAK,CAAC,0BAA0B,OAAO,EAAE,CAAC,CAAC;QACnD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAEhD,mDAAmD;IACnD,OAAO,GAAG,OAAO,CAAC,OAAO,CACvB,4DAA4D,EAC5D,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE;QAClB,MAAM,OAAO,GAAG,MAAM,IAAI,IAAI,CAAC;QAC/B,OAAO,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;IACpC,CAAC,CACF,CAAC;IAEF,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC7B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,gCAAgC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;QAC1F,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,oEAAoE;AACpE,SAAS,kBAAkB;IACzB,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;QAClC,OAAO,CAAC,KAAK,CAAC,oEAAoE,CAAC,CAAC;QACpF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,OAAO;QACL,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC;QACvC,GAAG,EAAE;YACH,QAAQ,EAAE,IAAI,CAAC,WAAW;YAC1B,OAAO,EAAE,IAAI,CAAC,MAAM;YACpB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,KAAK,EAAE,IAAI,CAAC,QAAQ;SACrB;QACD,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,GAAG,EAAE,IAAI,CAAC,GAAG,IAAI,KAAK;QACtB,QAAQ,EAAE,IAAI,CAAC,aAAa;YAC1B,CAAC,CAAC;gBACE,QAAQ,EAAE,IAAI,CAAC,aAAa;gBAC5B,YAAY,EAAE,IAAI,CAAC,aAAa;oBAC9B,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC;oBAC3C,CAAC,CAAC,EAAE;aACP;YACH,CAAC,CAAC,SAAS;QACb,OAAO,EAAE;YACP,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS;YAC5D,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS;SACnE;KACF,CAAC;AACJ,CAAC;AAED,uEAAuE;AACvE,SAAS,WAAW;IAClB,IAAI,IAAI,GAA4B,EAAE,CAAC;IAEvC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QAChB,IAAI,GAAG,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAEnC,sDAAsD;QACtD,IAAI,OAAO,IAAI,CAAC,SAAS,KAAK,QAAQ,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;YAC3E,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QACzF,CAAC;IACH,CAAC;IAED,sCAAsC;IACtC,IAAI,IAAI,CAAC,IAAI;QAAE,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;IACrC,IAAI,IAAI,CAAC,SAAS;QAAE,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAElE,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,QAAQ,CAAC;IAClF,IAAI,SAAS,EAAE,CAAC;QACd,MAAM,OAAO,GAAI,IAAI,CAAC,GAA+B,IAAI,EAAE,CAAC;QAC5D,IAAI,CAAC,GAAG,GAAG;YACT,GAAG,OAAO;YACV,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC3D,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAChD,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/C,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACnD,CAAC;IACJ,CAAC;IAED,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;QACvB,IAAI,CAAC,QAAQ,GAAG;YACd,QAAQ,EAAE,IAAI,CAAC,aAAa;YAC5B,YAAY,EAAE,IAAI,CAAC,aAAa;gBAC9B,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC;gBAC3C,CAAC,CAAC,EAAE;SACP,CAAC;IACJ,CAAC;IAED,MAAM,aAAa,GAAG,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,QAAQ,CAAC;IACnE,IAAI,aAAa,EAAE,CAAC;QAClB,MAAM,WAAW,GAAI,IAAI,CAAC,OAAmC,IAAI,EAAE,CAAC;QACpE,IAAI,CAAC,OAAO,GAAG;YACb,GAAG,WAAW;YACd,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC5C,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC9D,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACrE,CAAC;IACJ,CAAC;IAED,IAAI,IAAI,CAAC,aAAa;QAAE,IAAI,CAAC,aAAa,GAAG,QAAQ,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC;IAC9E,IAAI,IAAI,CAAC,KAAK;QAAE,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;IAClC,IAAI,IAAI,CAAC,GAAG;QAAE,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC;IAE9B,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;QAClC,OAAO,CAAC,KAAK,CAAC,6EAA6E,CAAC,CAAC;QAC7F,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,SAAS,GAAG,WAAW,EAAE,CAAC;AAEhC,MAAM,WAAW,GAAG,aAAa,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;AACvD,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;IACzB,OAAO,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC;IACxC,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IACvG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,CAAC;AAEhC,qCAAqC;AACrC,MAAM,IAAI,GAAG;IACX,MAAM,CAAC,SAAS;IAChB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,cAAc,CAAC;IAC3C,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,QAAQ,CAAC;IACrC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC;IACnC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC;IACpC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,QAAQ,CAAC;IACrC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,UAAU,CAAC;CACxC,CAAC;AAEF,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;IACvB,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AACzC,CAAC;AAED,sCAAsC;AACtC,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC;AACrE,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;IAC9B,EAAE,CAAC,aAAa,CAAC,SAAS,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;AAC7C,CAAC;AAED,qCAAqC;AACrC,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC;AACvE,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;IAChC,EAAE,CAAC,aAAa,CAAC,WAAW,EAAE,oBAAoB,EAAE,OAAO,CAAC,CAAC;AAC/D,CAAC;AAED,KAAK,UAAU,IAAI;IACjB,OAAO,CAAC,GAAG,CAAC,8BAA8B,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;IACzD,OAAO,CAAC,GAAG,CAAC,iBAAiB,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC;IACjD,OAAO,CAAC,GAAG,CAAC,WAAW,MAAM,CAAC,GAAG,CAAC,QAAQ,MAAM,MAAM,CAAC,GAAG,CAAC,OAAO,KAAK,MAAM,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC;IAE5F,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC;IAEhC,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,MAAM,QAAQ,GAAG,KAAK,EAAE,MAAc,EAAE,EAAE;QACxC,IAAI,QAAQ;YAAE,OAAO;QACrB,QAAQ,GAAG,IAAI,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,iBAAiB,MAAM,oBAAoB,CAAC,CAAC;QACzD,MAAM,KAAK,CAAC,IAAI,EAAE,CAAC;QACnB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC;IAEF,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC/C,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC;IAEjD,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC;AACtB,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACnB,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC;IACnC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { DipclawConfig } from "../config/types.js";
2
+ import type { LlmClient } from "./types.js";
3
+ export declare function createLlmClient(config: DipclawConfig): LlmClient;