@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
package/.env.example CHANGED
@@ -15,12 +15,18 @@ TELEGRAM_BOT_TOKEN=123456789:replace-with-real-token
15
15
  OPENROUTER_API_KEY=sk-or-replace-with-real-key
16
16
 
17
17
  # --- Optional (app runtime) ---
18
+ # Discord bot token (enables Discord provider)
19
+ # DISCORD_BOT_TOKEN=replace-with-discord-token
20
+
18
21
  # Brave Search API key (enables WebSearch tool in the agent)
19
22
  BRAVE_SEARCH_API_KEY=replace-with-brave-key
20
23
 
21
24
  # Override host timezone (defaults to system TZ)
22
25
  TZ=America/New_York
23
26
 
27
+ # GitHub Personal Access Token (enables gh CLI in containers)
28
+ # GH_TOKEN=ghp_your_token_here
29
+
24
30
  # --- Optional: System (set in shell before starting) ---
25
31
  # Override DotClaw home directory (defaults to ~/.dotclaw)
26
32
  # DOTCLAW_HOME=~/.dotclaw
package/README.md CHANGED
@@ -1,19 +1,25 @@
1
1
  # DotClaw
2
2
 
3
- Personal OpenRouter-based assistant for Telegram. Each request runs inside an isolated Docker container with long-term memory, scheduling, and tool governance.
3
+ Personal OpenRouter-based assistant for Telegram and Discord. Each request runs inside an isolated Docker container with long-term memory, scheduling, and tool governance.
4
4
 
5
5
  ## Features
6
6
 
7
- - Telegram bot interface with per-group isolation
7
+ - Multi-provider messaging (Telegram + Discord) with per-group isolation
8
8
  - Containerized agent runtime with strict mounts
9
- - Rich Telegram I/O tools (file/photo/voice/audio/location/contact/poll/buttons/edit/delete)
9
+ - Rich I/O tools (file/photo/voice/audio/location/contact/poll/buttons/edit/delete)
10
10
  - Incoming media ingestion to workspace (`/workspace/group/inbox`) for agent processing
11
+ - Voice transcription and text-to-speech
12
+ - Browser automation (Chromium in-container)
13
+ - MCP server integration (stdio transport)
14
+ - Lifecycle hooks (message, agent, job, task, memory events)
15
+ - Multi-agent orchestration (parallel fan-out with aggregation)
16
+ - Declarative YAML/JSON workflows (multi-step pipelines)
11
17
  - Long-term memory with embeddings and semantic search
12
18
  - Scheduled tasks (cron and one-off)
13
19
  - Background jobs for long-running work
14
20
  - Tool policies and daily budgets
15
21
  - Plugin tools and Autotune optimization
16
- - Prometheus-compatible metrics
22
+ - Prometheus-compatible metrics and status dashboard
17
23
 
18
24
  ## Prerequisites
19
25
 
@@ -21,6 +27,7 @@ Personal OpenRouter-based assistant for Telegram. Each request runs inside an is
21
27
  - Docker (running)
22
28
  - Telegram bot token (from @BotFather)
23
29
  - OpenRouter API key
30
+ - Discord bot token (optional — for Discord provider)
24
31
 
25
32
  ## Quick Start
26
33
 
@@ -53,9 +60,9 @@ dotclaw restart # Restart the service
53
60
  dotclaw logs # View logs (add --follow to tail)
54
61
  dotclaw status # Show service status
55
62
  dotclaw doctor # Run diagnostics
56
- dotclaw register # Register a new Telegram chat
57
- dotclaw unregister # Remove a registered Telegram chat
58
- dotclaw groups # List registered Telegram chats
63
+ dotclaw register # Register a new chat (Telegram or Discord)
64
+ dotclaw unregister # Remove a registered chat
65
+ dotclaw groups # List registered chats
59
66
  dotclaw build # Build the Docker container image
60
67
  dotclaw add-instance # Create and start an isolated instance
61
68
  dotclaw instances # List discovered instances
@@ -1,21 +1,13 @@
1
- # Rain (Global)
1
+ # Global Notes
2
2
 
3
- You are Rain, a personal assistant. This file provides global guidance shared across all groups.
4
-
5
- ## Guidance
6
-
7
- - Be concise and action-oriented when possible.
8
- - Prefer tool use when it improves accuracy or saves time.
9
- - Ask clarifying questions if the request is underspecified.
3
+ Shared guidance across all groups.
10
4
 
11
5
  ## Long Tasks
12
6
 
13
- If a request requires significant work, send a brief acknowledgement first using `mcp__dotclaw__send_message`.
7
+ For significant work, send a brief acknowledgement first using `mcp__dotclaw__send_message` before starting.
14
8
 
15
- ## Memory
9
+ ## Notes
16
10
 
17
- Use long-term memory tools for durable facts or preferences:
18
- - `mcp__dotclaw__memory_upsert`
19
- - `mcp__dotclaw__memory_search`
11
+ Add durable global notes below this line. The agent can edit this file to record stable guidance that applies to all groups.
20
12
 
21
- Update this `CLAUDE.md` only for stable, global guidance.
13
+ ---
@@ -1,47 +1,16 @@
1
- # Rain (Main Group)
1
+ # Main Group
2
2
 
3
- You are Rain, a personal assistant. You help with tasks, answer questions, and can schedule reminders.
4
-
5
- ## What You Can Do
6
-
7
- - Answer questions and have conversations
8
- - Search the web and fetch content from URLs
9
- - Read and write files in your workspace
10
- - Run bash commands in your sandbox
11
- - Schedule tasks to run later or on a recurring basis
12
- - Send messages back to the chat
3
+ This is the main (admin) group with elevated privileges: model changes, group management, and configuration.
13
4
 
14
5
  ## Long Tasks
15
6
 
16
- If a request requires significant work (research, multiple steps, file operations), use `mcp__dotclaw__send_message` to acknowledge first:
17
-
18
- 1. Send a brief message: what you understood and what you'll do
7
+ If a request requires significant work (research, multi-step operations, file processing), acknowledge first with `mcp__dotclaw__send_message`:
8
+ 1. Brief message: what you understood and what you'll do
19
9
  2. Do the work
20
- 3. Return the final answer
21
-
22
- ## Main Group Privileges
23
-
24
- The main group can manage other groups and change models:
25
-
26
- - `mcp__dotclaw__list_groups`
27
- - `mcp__dotclaw__register_group`
28
- - `mcp__dotclaw__remove_group`
29
- - `mcp__dotclaw__set_model`
30
-
31
- Available groups are also written to `/workspace/ipc/available_groups.json`.
32
-
33
- ## Workspace Layout (Container)
34
-
35
- - `/workspace/group` is your writable workspace
36
- - `/workspace/project` is the DotClaw package (read-only)
37
- - `/workspace/global` is the global group folder (read-only)
38
- - `/workspace/ipc` is for host IPC files
39
- - `/workspace/session` is for model sessions
10
+ 3. Return the final result
40
11
 
41
- ## Memory
12
+ ## Notes
42
13
 
43
- Use long-term memory tools for durable facts or preferences:
44
- - `mcp__dotclaw__memory_upsert`
45
- - `mcp__dotclaw__memory_search`
14
+ Add durable notes below this line. The agent can edit this file to record stable, high-level guidance.
46
15
 
47
- You can also update this `CLAUDE.md` for high-level, stable guidance.
16
+ ---
@@ -38,7 +38,7 @@
38
38
  "onToolLimit": true,
39
39
  "classifier": {
40
40
  "enabled": true,
41
- "model": "openai/gpt-5-nano",
41
+ "model": "deepseek/deepseek-v3.2",
42
42
  "timeoutMs": 3000,
43
43
  "maxOutputTokens": 32,
44
44
  "temperature": 0,
@@ -67,7 +67,7 @@
67
67
  },
68
68
  "plannerProbe": {
69
69
  "enabled": true,
70
- "model": "openai/gpt-5-nano",
70
+ "model": "deepseek/deepseek-v3.2",
71
71
  "timeoutMs": 3000,
72
72
  "maxOutputTokens": 120,
73
73
  "temperature": 0,
@@ -77,7 +77,7 @@
77
77
  },
78
78
  "profiles": {
79
79
  "fast": {
80
- "model": "openai/gpt-5-nano",
80
+ "model": "deepseek/deepseek-v3.2",
81
81
  "maxOutputTokens": 4096,
82
82
  "maxToolSteps": 12,
83
83
  "recallMaxResults": 0,
@@ -90,7 +90,7 @@
90
90
  "progress": { "enabled": false }
91
91
  },
92
92
  "standard": {
93
- "model": "openai/gpt-5-mini",
93
+ "model": "moonshotai/kimi-k2.5",
94
94
  "maxOutputTokens": 4096,
95
95
  "maxToolSteps": 48,
96
96
  "recallMaxResults": 6,
@@ -10,6 +10,7 @@
10
10
  "dependencies": {
11
11
  "@openrouter/sdk": "^0.3.0",
12
12
  "cron-parser": "^5.0.0",
13
+ "node-edge-tts": "^1.2.10",
13
14
  "zod": "^4.0.0"
14
15
  },
15
16
  "devDependencies": {
@@ -37,6 +38,71 @@
37
38
  "undici-types": "~6.21.0"
38
39
  }
39
40
  },
41
+ "node_modules/agent-base": {
42
+ "version": "7.1.4",
43
+ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz",
44
+ "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==",
45
+ "license": "MIT",
46
+ "engines": {
47
+ "node": ">= 14"
48
+ }
49
+ },
50
+ "node_modules/ansi-regex": {
51
+ "version": "5.0.1",
52
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
53
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
54
+ "license": "MIT",
55
+ "engines": {
56
+ "node": ">=8"
57
+ }
58
+ },
59
+ "node_modules/ansi-styles": {
60
+ "version": "4.3.0",
61
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
62
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
63
+ "license": "MIT",
64
+ "dependencies": {
65
+ "color-convert": "^2.0.1"
66
+ },
67
+ "engines": {
68
+ "node": ">=8"
69
+ },
70
+ "funding": {
71
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
72
+ }
73
+ },
74
+ "node_modules/cliui": {
75
+ "version": "8.0.1",
76
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz",
77
+ "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==",
78
+ "license": "ISC",
79
+ "dependencies": {
80
+ "string-width": "^4.2.0",
81
+ "strip-ansi": "^6.0.1",
82
+ "wrap-ansi": "^7.0.0"
83
+ },
84
+ "engines": {
85
+ "node": ">=12"
86
+ }
87
+ },
88
+ "node_modules/color-convert": {
89
+ "version": "2.0.1",
90
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
91
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
92
+ "license": "MIT",
93
+ "dependencies": {
94
+ "color-name": "~1.1.4"
95
+ },
96
+ "engines": {
97
+ "node": ">=7.0.0"
98
+ }
99
+ },
100
+ "node_modules/color-name": {
101
+ "version": "1.1.4",
102
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
103
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
104
+ "license": "MIT"
105
+ },
40
106
  "node_modules/cron-parser": {
41
107
  "version": "5.5.0",
42
108
  "resolved": "https://registry.npmjs.org/cron-parser/-/cron-parser-5.5.0.tgz",
@@ -49,6 +115,69 @@
49
115
  "node": ">=18"
50
116
  }
51
117
  },
118
+ "node_modules/debug": {
119
+ "version": "4.4.3",
120
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
121
+ "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
122
+ "license": "MIT",
123
+ "dependencies": {
124
+ "ms": "^2.1.3"
125
+ },
126
+ "engines": {
127
+ "node": ">=6.0"
128
+ },
129
+ "peerDependenciesMeta": {
130
+ "supports-color": {
131
+ "optional": true
132
+ }
133
+ }
134
+ },
135
+ "node_modules/emoji-regex": {
136
+ "version": "8.0.0",
137
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
138
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
139
+ "license": "MIT"
140
+ },
141
+ "node_modules/escalade": {
142
+ "version": "3.2.0",
143
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
144
+ "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
145
+ "license": "MIT",
146
+ "engines": {
147
+ "node": ">=6"
148
+ }
149
+ },
150
+ "node_modules/get-caller-file": {
151
+ "version": "2.0.5",
152
+ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
153
+ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
154
+ "license": "ISC",
155
+ "engines": {
156
+ "node": "6.* || 8.* || >= 10.*"
157
+ }
158
+ },
159
+ "node_modules/https-proxy-agent": {
160
+ "version": "7.0.6",
161
+ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz",
162
+ "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==",
163
+ "license": "MIT",
164
+ "dependencies": {
165
+ "agent-base": "^7.1.2",
166
+ "debug": "4"
167
+ },
168
+ "engines": {
169
+ "node": ">= 14"
170
+ }
171
+ },
172
+ "node_modules/is-fullwidth-code-point": {
173
+ "version": "3.0.0",
174
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
175
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
176
+ "license": "MIT",
177
+ "engines": {
178
+ "node": ">=8"
179
+ }
180
+ },
52
181
  "node_modules/luxon": {
53
182
  "version": "3.7.2",
54
183
  "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.7.2.tgz",
@@ -58,6 +187,61 @@
58
187
  "node": ">=12"
59
188
  }
60
189
  },
190
+ "node_modules/ms": {
191
+ "version": "2.1.3",
192
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
193
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
194
+ "license": "MIT"
195
+ },
196
+ "node_modules/node-edge-tts": {
197
+ "version": "1.2.10",
198
+ "resolved": "https://registry.npmjs.org/node-edge-tts/-/node-edge-tts-1.2.10.tgz",
199
+ "integrity": "sha512-bV2i4XU54D45+US0Zm1HcJRkifuB3W438dWyuJEHLQdKxnuqlI1kim2MOvR6Q3XUQZvfF9PoDyR1Rt7aeXhPdQ==",
200
+ "license": "MIT",
201
+ "dependencies": {
202
+ "https-proxy-agent": "^7.0.1",
203
+ "ws": "^8.13.0",
204
+ "yargs": "^17.7.2"
205
+ },
206
+ "bin": {
207
+ "node-edge-tts": "bin.js"
208
+ }
209
+ },
210
+ "node_modules/require-directory": {
211
+ "version": "2.1.1",
212
+ "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
213
+ "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
214
+ "license": "MIT",
215
+ "engines": {
216
+ "node": ">=0.10.0"
217
+ }
218
+ },
219
+ "node_modules/string-width": {
220
+ "version": "4.2.3",
221
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
222
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
223
+ "license": "MIT",
224
+ "dependencies": {
225
+ "emoji-regex": "^8.0.0",
226
+ "is-fullwidth-code-point": "^3.0.0",
227
+ "strip-ansi": "^6.0.1"
228
+ },
229
+ "engines": {
230
+ "node": ">=8"
231
+ }
232
+ },
233
+ "node_modules/strip-ansi": {
234
+ "version": "6.0.1",
235
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
236
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
237
+ "license": "MIT",
238
+ "dependencies": {
239
+ "ansi-regex": "^5.0.1"
240
+ },
241
+ "engines": {
242
+ "node": ">=8"
243
+ }
244
+ },
61
245
  "node_modules/typescript": {
62
246
  "version": "5.9.3",
63
247
  "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz",
@@ -79,6 +263,80 @@
79
263
  "dev": true,
80
264
  "license": "MIT"
81
265
  },
266
+ "node_modules/wrap-ansi": {
267
+ "version": "7.0.0",
268
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
269
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
270
+ "license": "MIT",
271
+ "dependencies": {
272
+ "ansi-styles": "^4.0.0",
273
+ "string-width": "^4.1.0",
274
+ "strip-ansi": "^6.0.0"
275
+ },
276
+ "engines": {
277
+ "node": ">=10"
278
+ },
279
+ "funding": {
280
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
281
+ }
282
+ },
283
+ "node_modules/ws": {
284
+ "version": "8.19.0",
285
+ "resolved": "https://registry.npmjs.org/ws/-/ws-8.19.0.tgz",
286
+ "integrity": "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==",
287
+ "license": "MIT",
288
+ "engines": {
289
+ "node": ">=10.0.0"
290
+ },
291
+ "peerDependencies": {
292
+ "bufferutil": "^4.0.1",
293
+ "utf-8-validate": ">=5.0.2"
294
+ },
295
+ "peerDependenciesMeta": {
296
+ "bufferutil": {
297
+ "optional": true
298
+ },
299
+ "utf-8-validate": {
300
+ "optional": true
301
+ }
302
+ }
303
+ },
304
+ "node_modules/y18n": {
305
+ "version": "5.0.8",
306
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
307
+ "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
308
+ "license": "ISC",
309
+ "engines": {
310
+ "node": ">=10"
311
+ }
312
+ },
313
+ "node_modules/yargs": {
314
+ "version": "17.7.2",
315
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz",
316
+ "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==",
317
+ "license": "MIT",
318
+ "dependencies": {
319
+ "cliui": "^8.0.1",
320
+ "escalade": "^3.1.1",
321
+ "get-caller-file": "^2.0.5",
322
+ "require-directory": "^2.1.1",
323
+ "string-width": "^4.2.3",
324
+ "y18n": "^5.0.5",
325
+ "yargs-parser": "^21.1.1"
326
+ },
327
+ "engines": {
328
+ "node": ">=12"
329
+ }
330
+ },
331
+ "node_modules/yargs-parser": {
332
+ "version": "21.1.1",
333
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz",
334
+ "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==",
335
+ "license": "ISC",
336
+ "engines": {
337
+ "node": ">=12"
338
+ }
339
+ },
82
340
  "node_modules/zod": {
83
341
  "version": "4.3.6",
84
342
  "resolved": "https://registry.npmjs.org/zod/-/zod-4.3.6.tgz",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dotclaw-agent-runner",
3
- "version": "1.9.0",
3
+ "version": "2.0.0",
4
4
  "type": "module",
5
5
  "description": "Container-side agent runner for DotClaw",
6
6
  "main": "dist/index.js",
@@ -11,6 +11,7 @@
11
11
  "dependencies": {
12
12
  "@openrouter/sdk": "^0.3.0",
13
13
  "cron-parser": "^5.0.0",
14
+ "node-edge-tts": "^1.2.10",
14
15
  "zod": "^4.0.0"
15
16
  },
16
17
  "devDependencies": {
@@ -113,6 +113,34 @@ export type AgentRuntimeConfig = {
113
113
  tokensPerMessage: number;
114
114
  tokensPerRequest: number;
115
115
  };
116
+ tts: {
117
+ enabled: boolean;
118
+ model: string;
119
+ baseUrl: string;
120
+ defaultVoice: string;
121
+ };
122
+ browser: {
123
+ enabled: boolean;
124
+ timeoutMs: number;
125
+ screenshotQuality: number;
126
+ };
127
+ mcp: {
128
+ enabled: boolean;
129
+ servers: Array<{
130
+ name: string;
131
+ transport: 'stdio';
132
+ command?: string;
133
+ args?: string[];
134
+ env?: Record<string, string>;
135
+ url?: string;
136
+ }>;
137
+ connectionTimeoutMs: number;
138
+ };
139
+ skills: {
140
+ enabled: boolean;
141
+ maxSkills: number;
142
+ maxSummaryChars: number;
143
+ };
116
144
  };
117
145
  };
118
146
 
@@ -126,8 +154,8 @@ const DEFAULT_AGENT_CONFIG: AgentRuntimeConfig['agent'] = {
126
154
  openrouter: {
127
155
  timeoutMs: 180_000,
128
156
  retry: true,
129
- siteUrl: '',
130
- siteName: ''
157
+ siteUrl: 'https://github.com/dotsetlabs/dotclaw',
158
+ siteName: 'DotClaw'
131
159
  },
132
160
  promptPacks: {
133
161
  enabled: true,
@@ -158,11 +186,11 @@ const DEFAULT_AGENT_CONFIG: AgentRuntimeConfig['agent'] = {
158
186
  extractScheduled: false
159
187
  },
160
188
  models: {
161
- summary: 'openai/gpt-5-nano',
162
- memory: 'openai/gpt-5-mini',
163
- planner: 'openai/gpt-5-nano',
164
- responseValidation: 'openai/gpt-5-nano',
165
- toolSummary: 'openai/gpt-5-nano'
189
+ summary: 'deepseek/deepseek-v3.2',
190
+ memory: 'deepseek/deepseek-v3.2',
191
+ planner: 'deepseek/deepseek-v3.2',
192
+ responseValidation: 'deepseek/deepseek-v3.2',
193
+ toolSummary: 'deepseek/deepseek-v3.2'
166
194
  },
167
195
  planner: {
168
196
  enabled: true,
@@ -222,13 +250,34 @@ const DEFAULT_AGENT_CONFIG: AgentRuntimeConfig['agent'] = {
222
250
  }
223
251
  },
224
252
  ipc: {
225
- requestTimeoutMs: 6000,
253
+ requestTimeoutMs: 30_000,
226
254
  requestPollMs: 150
227
255
  },
228
256
  tokenEstimate: {
229
257
  tokensPerChar: 0.25,
230
258
  tokensPerMessage: 3,
231
259
  tokensPerRequest: 0
260
+ },
261
+ tts: {
262
+ enabled: true,
263
+ model: 'edge-tts',
264
+ baseUrl: '',
265
+ defaultVoice: 'en-US-AriaNeural'
266
+ },
267
+ browser: {
268
+ enabled: true,
269
+ timeoutMs: 30_000,
270
+ screenshotQuality: 80
271
+ },
272
+ mcp: {
273
+ enabled: false,
274
+ servers: [],
275
+ connectionTimeoutMs: 10_000
276
+ },
277
+ skills: {
278
+ enabled: true,
279
+ maxSkills: 32,
280
+ maxSummaryChars: 4000,
232
281
  }
233
282
  };
234
283