@dotsetlabs/dotclaw 1.9.0 → 2.0.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 (167) hide show
  1. package/.env.example +6 -0
  2. package/README.md +14 -7
  3. package/config-examples/groups/global/CLAUDE.md +6 -14
  4. package/config-examples/groups/main/CLAUDE.md +8 -39
  5. package/config-examples/runtime.json +4 -4
  6. package/container/agent-runner/package-lock.json +258 -0
  7. package/container/agent-runner/package.json +2 -1
  8. package/container/agent-runner/src/agent-config.ts +57 -8
  9. package/container/agent-runner/src/browser.ts +180 -0
  10. package/container/agent-runner/src/container-protocol.ts +2 -0
  11. package/container/agent-runner/src/id.ts +3 -2
  12. package/container/agent-runner/src/index.ts +167 -436
  13. package/container/agent-runner/src/ipc.ts +33 -1
  14. package/container/agent-runner/src/mcp-client.ts +222 -0
  15. package/container/agent-runner/src/mcp-registry.ts +163 -0
  16. package/container/agent-runner/src/skill-loader.ts +375 -0
  17. package/container/agent-runner/src/tools.ts +249 -21
  18. package/container/agent-runner/src/tts.ts +61 -0
  19. package/dist/admin-commands.d.ts.map +1 -1
  20. package/dist/admin-commands.js +12 -0
  21. package/dist/admin-commands.js.map +1 -1
  22. package/dist/agent-execution.d.ts +3 -1
  23. package/dist/agent-execution.d.ts.map +1 -1
  24. package/dist/agent-execution.js +20 -0
  25. package/dist/agent-execution.js.map +1 -1
  26. package/dist/background-job-classifier.d.ts +1 -1
  27. package/dist/background-job-classifier.d.ts.map +1 -1
  28. package/dist/background-jobs.d.ts.map +1 -1
  29. package/dist/background-jobs.js +9 -0
  30. package/dist/background-jobs.js.map +1 -1
  31. package/dist/cli.js +61 -16
  32. package/dist/cli.js.map +1 -1
  33. package/dist/config.d.ts +0 -2
  34. package/dist/config.d.ts.map +1 -1
  35. package/dist/config.js +1 -3
  36. package/dist/config.js.map +1 -1
  37. package/dist/container-protocol.d.ts +2 -0
  38. package/dist/container-protocol.d.ts.map +1 -1
  39. package/dist/container-runner.d.ts.map +1 -1
  40. package/dist/container-runner.js +3 -8
  41. package/dist/container-runner.js.map +1 -1
  42. package/dist/dashboard.d.ts +5 -0
  43. package/dist/dashboard.d.ts.map +1 -1
  44. package/dist/dashboard.js +11 -5
  45. package/dist/dashboard.js.map +1 -1
  46. package/dist/db.d.ts +0 -13
  47. package/dist/db.d.ts.map +1 -1
  48. package/dist/db.js +41 -70
  49. package/dist/db.js.map +1 -1
  50. package/dist/hooks.d.ts +7 -0
  51. package/dist/hooks.d.ts.map +1 -0
  52. package/dist/hooks.js +93 -0
  53. package/dist/hooks.js.map +1 -0
  54. package/dist/id.d.ts.map +1 -1
  55. package/dist/id.js +2 -1
  56. package/dist/id.js.map +1 -1
  57. package/dist/index.js +741 -2812
  58. package/dist/index.js.map +1 -1
  59. package/dist/ipc-dispatcher.d.ts +26 -0
  60. package/dist/ipc-dispatcher.d.ts.map +1 -0
  61. package/dist/ipc-dispatcher.js +1044 -0
  62. package/dist/ipc-dispatcher.js.map +1 -0
  63. package/dist/local-embeddings.d.ts +7 -0
  64. package/dist/local-embeddings.d.ts.map +1 -0
  65. package/dist/local-embeddings.js +60 -0
  66. package/dist/local-embeddings.js.map +1 -0
  67. package/dist/maintenance.d.ts.map +1 -1
  68. package/dist/maintenance.js +7 -1
  69. package/dist/maintenance.js.map +1 -1
  70. package/dist/memory-embeddings.d.ts +1 -1
  71. package/dist/memory-embeddings.d.ts.map +1 -1
  72. package/dist/memory-embeddings.js +59 -31
  73. package/dist/memory-embeddings.js.map +1 -1
  74. package/dist/memory-store.d.ts +0 -10
  75. package/dist/memory-store.d.ts.map +1 -1
  76. package/dist/memory-store.js +11 -27
  77. package/dist/memory-store.js.map +1 -1
  78. package/dist/message-pipeline.d.ts +47 -0
  79. package/dist/message-pipeline.d.ts.map +1 -0
  80. package/dist/message-pipeline.js +876 -0
  81. package/dist/message-pipeline.js.map +1 -0
  82. package/dist/metrics.d.ts +8 -8
  83. package/dist/metrics.d.ts.map +1 -1
  84. package/dist/metrics.js.map +1 -1
  85. package/dist/model-registry.d.ts +0 -14
  86. package/dist/model-registry.d.ts.map +1 -1
  87. package/dist/model-registry.js +0 -36
  88. package/dist/model-registry.js.map +1 -1
  89. package/dist/orchestration.d.ts +39 -0
  90. package/dist/orchestration.d.ts.map +1 -0
  91. package/dist/orchestration.js +136 -0
  92. package/dist/orchestration.js.map +1 -0
  93. package/dist/paths.d.ts.map +1 -1
  94. package/dist/paths.js +2 -0
  95. package/dist/paths.js.map +1 -1
  96. package/dist/providers/discord/discord-format.d.ts +16 -0
  97. package/dist/providers/discord/discord-format.d.ts.map +1 -0
  98. package/dist/providers/discord/discord-format.js +153 -0
  99. package/dist/providers/discord/discord-format.js.map +1 -0
  100. package/dist/providers/discord/discord-provider.d.ts +50 -0
  101. package/dist/providers/discord/discord-provider.d.ts.map +1 -0
  102. package/dist/providers/discord/discord-provider.js +604 -0
  103. package/dist/providers/discord/discord-provider.js.map +1 -0
  104. package/dist/providers/discord/index.d.ts +4 -0
  105. package/dist/providers/discord/index.d.ts.map +1 -0
  106. package/dist/providers/discord/index.js +3 -0
  107. package/dist/providers/discord/index.js.map +1 -0
  108. package/dist/providers/registry.d.ts +14 -0
  109. package/dist/providers/registry.d.ts.map +1 -0
  110. package/dist/providers/registry.js +49 -0
  111. package/dist/providers/registry.js.map +1 -0
  112. package/dist/providers/telegram/index.d.ts +4 -0
  113. package/dist/providers/telegram/index.d.ts.map +1 -0
  114. package/dist/providers/telegram/index.js +3 -0
  115. package/dist/providers/telegram/index.js.map +1 -0
  116. package/dist/providers/telegram/telegram-format.d.ts +3 -0
  117. package/dist/providers/telegram/telegram-format.d.ts.map +1 -0
  118. package/dist/providers/telegram/telegram-format.js +215 -0
  119. package/dist/providers/telegram/telegram-format.js.map +1 -0
  120. package/dist/providers/telegram/telegram-provider.d.ts +51 -0
  121. package/dist/providers/telegram/telegram-provider.d.ts.map +1 -0
  122. package/dist/providers/telegram/telegram-provider.js +824 -0
  123. package/dist/providers/telegram/telegram-provider.js.map +1 -0
  124. package/dist/providers/types.d.ts +107 -0
  125. package/dist/providers/types.d.ts.map +1 -0
  126. package/dist/providers/types.js +2 -0
  127. package/dist/providers/types.js.map +1 -0
  128. package/dist/request-router.d.ts.map +1 -1
  129. package/dist/request-router.js +12 -26
  130. package/dist/request-router.js.map +1 -1
  131. package/dist/runtime-config.d.ts +70 -6
  132. package/dist/runtime-config.d.ts.map +1 -1
  133. package/dist/runtime-config.js +119 -65
  134. package/dist/runtime-config.js.map +1 -1
  135. package/dist/skill-manager.d.ts +39 -0
  136. package/dist/skill-manager.d.ts.map +1 -0
  137. package/dist/skill-manager.js +286 -0
  138. package/dist/skill-manager.js.map +1 -0
  139. package/dist/task-scheduler.d.ts.map +1 -1
  140. package/dist/task-scheduler.js +4 -0
  141. package/dist/task-scheduler.js.map +1 -1
  142. package/dist/tool-intent-probe.d.ts +11 -0
  143. package/dist/tool-intent-probe.d.ts.map +1 -0
  144. package/dist/tool-intent-probe.js +63 -0
  145. package/dist/tool-intent-probe.js.map +1 -0
  146. package/dist/tool-policy.d.ts.map +1 -1
  147. package/dist/tool-policy.js +18 -0
  148. package/dist/tool-policy.js.map +1 -1
  149. package/dist/transcription.d.ts +8 -0
  150. package/dist/transcription.d.ts.map +1 -0
  151. package/dist/transcription.js +174 -0
  152. package/dist/transcription.js.map +1 -0
  153. package/dist/types.d.ts +2 -9
  154. package/dist/types.d.ts.map +1 -1
  155. package/dist/workflow-engine.d.ts +51 -0
  156. package/dist/workflow-engine.d.ts.map +1 -0
  157. package/dist/workflow-engine.js +281 -0
  158. package/dist/workflow-engine.js.map +1 -0
  159. package/dist/workflow-store.d.ts +39 -0
  160. package/dist/workflow-store.d.ts.map +1 -0
  161. package/dist/workflow-store.js +173 -0
  162. package/dist/workflow-store.js.map +1 -0
  163. package/package.json +15 -3
  164. package/scripts/bootstrap.js +40 -4
  165. package/scripts/configure.js +48 -7
  166. package/scripts/doctor.js +30 -4
  167. package/scripts/init.js +13 -6
@@ -0,0 +1,180 @@
1
+ import { spawn } from 'child_process';
2
+ import fs from 'fs';
3
+ import path from 'path';
4
+
5
+ const SCREENSHOTS_DIR = '/workspace/group/screenshots';
6
+ const BROWSER_CMD = 'agent-browser';
7
+
8
+ export interface BrowserResult {
9
+ success: boolean;
10
+ title?: string;
11
+ url?: string;
12
+ elements?: unknown[];
13
+ text?: string;
14
+ html?: string;
15
+ result?: unknown;
16
+ path?: string;
17
+ width?: number;
18
+ height?: number;
19
+ error?: string;
20
+ }
21
+
22
+ export class BrowserSession {
23
+ private timeoutMs: number;
24
+ private screenshotQuality: number;
25
+
26
+ constructor(options?: { timeoutMs?: number; screenshotQuality?: number }) {
27
+ this.timeoutMs = options?.timeoutMs ?? 30_000;
28
+ this.screenshotQuality = options?.screenshotQuality ?? 80;
29
+ }
30
+
31
+ private async exec(args: string[]): Promise<string> {
32
+ return new Promise((resolve, reject) => {
33
+ const proc = spawn(BROWSER_CMD, args, {
34
+ timeout: this.timeoutMs,
35
+ stdio: ['pipe', 'pipe', 'pipe'],
36
+ env: { ...process.env, BROWSER_JSON_OUTPUT: '1' }
37
+ });
38
+
39
+ let stdout = '';
40
+ let stderr = '';
41
+
42
+ proc.stdout?.on('data', (data: Buffer) => {
43
+ stdout += data.toString();
44
+ });
45
+ proc.stderr?.on('data', (data: Buffer) => {
46
+ stderr += data.toString();
47
+ });
48
+
49
+ proc.on('close', (code) => {
50
+ if (code !== 0) {
51
+ reject(new Error(stderr.trim() || `Browser command exited with code ${code}`));
52
+ } else {
53
+ resolve(stdout);
54
+ }
55
+ });
56
+
57
+ proc.on('error', (err) => {
58
+ reject(new Error(`Browser command failed: ${err.message}`));
59
+ });
60
+ });
61
+ }
62
+
63
+ private parseOutput(raw: string): unknown {
64
+ try {
65
+ return JSON.parse(raw);
66
+ } catch {
67
+ return { text: raw.trim() };
68
+ }
69
+ }
70
+
71
+ async navigate(url: string): Promise<BrowserResult> {
72
+ try {
73
+ const output = await this.exec(['navigate', url]);
74
+ const parsed = this.parseOutput(output) as Record<string, unknown>;
75
+ return {
76
+ success: true,
77
+ title: parsed.title as string | undefined,
78
+ url: parsed.url as string | undefined
79
+ };
80
+ } catch (err) {
81
+ return { success: false, error: err instanceof Error ? err.message : String(err) };
82
+ }
83
+ }
84
+
85
+ async snapshot(interactive?: boolean): Promise<BrowserResult> {
86
+ try {
87
+ const args = ['snapshot'];
88
+ if (interactive) args.push('--interactive');
89
+ const output = await this.exec(args);
90
+ const parsed = this.parseOutput(output) as Record<string, unknown>;
91
+ return {
92
+ success: true,
93
+ elements: parsed.elements as unknown[] | undefined,
94
+ text: parsed.text as string | undefined
95
+ };
96
+ } catch (err) {
97
+ return { success: false, error: err instanceof Error ? err.message : String(err) };
98
+ }
99
+ }
100
+
101
+ async click(ref: string): Promise<BrowserResult> {
102
+ try {
103
+ const output = await this.exec(['click', ref]);
104
+ const parsed = this.parseOutput(output) as Record<string, unknown>;
105
+ return {
106
+ success: true,
107
+ url: parsed.url as string | undefined
108
+ };
109
+ } catch (err) {
110
+ return { success: false, error: err instanceof Error ? err.message : String(err) };
111
+ }
112
+ }
113
+
114
+ async fill(ref: string, text: string): Promise<BrowserResult> {
115
+ try {
116
+ await this.exec(['fill', ref, text]);
117
+ return { success: true };
118
+ } catch (err) {
119
+ return { success: false, error: err instanceof Error ? err.message : String(err) };
120
+ }
121
+ }
122
+
123
+ async screenshot(fullPage?: boolean): Promise<BrowserResult> {
124
+ try {
125
+ fs.mkdirSync(SCREENSHOTS_DIR, { recursive: true });
126
+ const filename = `screenshot_${Date.now()}.png`;
127
+ const filepath = path.join(SCREENSHOTS_DIR, filename);
128
+ const args = ['screenshot', '--output', filepath, '--quality', String(this.screenshotQuality)];
129
+ if (fullPage) args.push('--full-page');
130
+ await this.exec(args);
131
+ if (!fs.existsSync(filepath)) {
132
+ return { success: false, error: 'Screenshot file not created' };
133
+ }
134
+ return {
135
+ success: true,
136
+ path: filepath
137
+ };
138
+ } catch (err) {
139
+ return { success: false, error: err instanceof Error ? err.message : String(err) };
140
+ }
141
+ }
142
+
143
+ async extract(selector?: string): Promise<BrowserResult> {
144
+ try {
145
+ const args = ['extract'];
146
+ if (selector) args.push('--selector', selector);
147
+ const output = await this.exec(args);
148
+ const parsed = this.parseOutput(output) as Record<string, unknown>;
149
+ return {
150
+ success: true,
151
+ text: parsed.text as string | undefined,
152
+ html: parsed.html as string | undefined
153
+ };
154
+ } catch (err) {
155
+ return { success: false, error: err instanceof Error ? err.message : String(err) };
156
+ }
157
+ }
158
+
159
+ async evaluate(js: string): Promise<BrowserResult> {
160
+ try {
161
+ const output = await this.exec(['evaluate', js]);
162
+ const parsed = this.parseOutput(output);
163
+ return {
164
+ success: true,
165
+ result: parsed
166
+ };
167
+ } catch (err) {
168
+ return { success: false, error: err instanceof Error ? err.message : String(err) };
169
+ }
170
+ }
171
+
172
+ async close(): Promise<BrowserResult> {
173
+ try {
174
+ await this.exec(['close']);
175
+ return { success: true };
176
+ } catch (err) {
177
+ return { success: false, error: err instanceof Error ? err.message : String(err) };
178
+ }
179
+ }
180
+ }
@@ -46,6 +46,7 @@ export interface ContainerInput {
46
46
  disableResponseValidation?: boolean;
47
47
  responseValidationMaxRetries?: number;
48
48
  disableMemoryExtraction?: boolean;
49
+ profile?: 'fast' | 'standard' | 'deep' | 'background';
49
50
  attachments?: Array<{
50
51
  type: 'photo' | 'document' | 'voice' | 'video' | 'audio';
51
52
  path: string;
@@ -55,6 +56,7 @@ export interface ContainerInput {
55
56
  duration?: number;
56
57
  width?: number;
57
58
  height?: number;
59
+ transcript?: string;
58
60
  }>;
59
61
  }
60
62
 
@@ -1,4 +1,5 @@
1
+ import { randomUUID } from 'crypto';
2
+
1
3
  export function generateId(prefix: string): string {
2
- if (!prefix) return `${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
3
- return `${prefix}-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
4
+ return prefix ? `${prefix}-${randomUUID()}` : randomUUID();
4
5
  }