@dotsetlabs/dotclaw 1.9.0 → 2.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 (171) hide show
  1. package/.env.example +6 -0
  2. package/README.md +13 -8
  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 +16 -122
  6. package/config-examples/tool-policy.json +2 -15
  7. package/container/agent-runner/package-lock.json +258 -0
  8. package/container/agent-runner/package.json +2 -1
  9. package/container/agent-runner/src/agent-config.ts +62 -47
  10. package/container/agent-runner/src/browser.ts +180 -0
  11. package/container/agent-runner/src/container-protocol.ts +4 -9
  12. package/container/agent-runner/src/id.ts +3 -2
  13. package/container/agent-runner/src/index.ts +331 -846
  14. package/container/agent-runner/src/ipc.ts +3 -33
  15. package/container/agent-runner/src/mcp-client.ts +222 -0
  16. package/container/agent-runner/src/mcp-registry.ts +163 -0
  17. package/container/agent-runner/src/skill-loader.ts +375 -0
  18. package/container/agent-runner/src/tools.ts +154 -184
  19. package/container/agent-runner/src/tts.ts +61 -0
  20. package/dist/admin-commands.d.ts.map +1 -1
  21. package/dist/admin-commands.js +12 -0
  22. package/dist/admin-commands.js.map +1 -1
  23. package/dist/agent-execution.d.ts +5 -9
  24. package/dist/agent-execution.d.ts.map +1 -1
  25. package/dist/agent-execution.js +32 -20
  26. package/dist/agent-execution.js.map +1 -1
  27. package/dist/cli.js +61 -16
  28. package/dist/cli.js.map +1 -1
  29. package/dist/config.d.ts +1 -4
  30. package/dist/config.d.ts.map +1 -1
  31. package/dist/config.js +2 -5
  32. package/dist/config.js.map +1 -1
  33. package/dist/container-protocol.d.ts +4 -9
  34. package/dist/container-protocol.d.ts.map +1 -1
  35. package/dist/container-runner.d.ts.map +1 -1
  36. package/dist/container-runner.js +3 -8
  37. package/dist/container-runner.js.map +1 -1
  38. package/dist/dashboard.d.ts +5 -6
  39. package/dist/dashboard.d.ts.map +1 -1
  40. package/dist/dashboard.js +12 -60
  41. package/dist/dashboard.js.map +1 -1
  42. package/dist/db.d.ts +1 -59
  43. package/dist/db.d.ts.map +1 -1
  44. package/dist/db.js +41 -262
  45. package/dist/db.js.map +1 -1
  46. package/dist/error-messages.d.ts.map +1 -1
  47. package/dist/error-messages.js +5 -1
  48. package/dist/error-messages.js.map +1 -1
  49. package/dist/hooks.d.ts +7 -0
  50. package/dist/hooks.d.ts.map +1 -0
  51. package/dist/hooks.js +93 -0
  52. package/dist/hooks.js.map +1 -0
  53. package/dist/id.d.ts.map +1 -1
  54. package/dist/id.js +2 -1
  55. package/dist/id.js.map +1 -1
  56. package/dist/index.js +673 -2790
  57. package/dist/index.js.map +1 -1
  58. package/dist/ipc-dispatcher.d.ts +26 -0
  59. package/dist/ipc-dispatcher.d.ts.map +1 -0
  60. package/dist/ipc-dispatcher.js +861 -0
  61. package/dist/ipc-dispatcher.js.map +1 -0
  62. package/dist/local-embeddings.d.ts +7 -0
  63. package/dist/local-embeddings.d.ts.map +1 -0
  64. package/dist/local-embeddings.js +60 -0
  65. package/dist/local-embeddings.js.map +1 -0
  66. package/dist/maintenance.d.ts.map +1 -1
  67. package/dist/maintenance.js +3 -7
  68. package/dist/maintenance.js.map +1 -1
  69. package/dist/memory-embeddings.d.ts +1 -1
  70. package/dist/memory-embeddings.d.ts.map +1 -1
  71. package/dist/memory-embeddings.js +59 -31
  72. package/dist/memory-embeddings.js.map +1 -1
  73. package/dist/memory-store.d.ts +0 -10
  74. package/dist/memory-store.d.ts.map +1 -1
  75. package/dist/memory-store.js +11 -27
  76. package/dist/memory-store.js.map +1 -1
  77. package/dist/message-pipeline.d.ts +47 -0
  78. package/dist/message-pipeline.d.ts.map +1 -0
  79. package/dist/message-pipeline.js +652 -0
  80. package/dist/message-pipeline.js.map +1 -0
  81. package/dist/metrics.d.ts +7 -10
  82. package/dist/metrics.d.ts.map +1 -1
  83. package/dist/metrics.js +2 -33
  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/paths.d.ts.map +1 -1
  90. package/dist/paths.js +2 -0
  91. package/dist/paths.js.map +1 -1
  92. package/dist/providers/discord/discord-format.d.ts +16 -0
  93. package/dist/providers/discord/discord-format.d.ts.map +1 -0
  94. package/dist/providers/discord/discord-format.js +153 -0
  95. package/dist/providers/discord/discord-format.js.map +1 -0
  96. package/dist/providers/discord/discord-provider.d.ts +50 -0
  97. package/dist/providers/discord/discord-provider.d.ts.map +1 -0
  98. package/dist/providers/discord/discord-provider.js +607 -0
  99. package/dist/providers/discord/discord-provider.js.map +1 -0
  100. package/dist/providers/discord/index.d.ts +4 -0
  101. package/dist/providers/discord/index.d.ts.map +1 -0
  102. package/dist/providers/discord/index.js +3 -0
  103. package/dist/providers/discord/index.js.map +1 -0
  104. package/dist/providers/registry.d.ts +14 -0
  105. package/dist/providers/registry.d.ts.map +1 -0
  106. package/dist/providers/registry.js +49 -0
  107. package/dist/providers/registry.js.map +1 -0
  108. package/dist/providers/telegram/index.d.ts +4 -0
  109. package/dist/providers/telegram/index.d.ts.map +1 -0
  110. package/dist/providers/telegram/index.js +3 -0
  111. package/dist/providers/telegram/index.js.map +1 -0
  112. package/dist/providers/telegram/telegram-format.d.ts +3 -0
  113. package/dist/providers/telegram/telegram-format.d.ts.map +1 -0
  114. package/dist/providers/telegram/telegram-format.js +215 -0
  115. package/dist/providers/telegram/telegram-format.js.map +1 -0
  116. package/dist/providers/telegram/telegram-provider.d.ts +51 -0
  117. package/dist/providers/telegram/telegram-provider.d.ts.map +1 -0
  118. package/dist/providers/telegram/telegram-provider.js +824 -0
  119. package/dist/providers/telegram/telegram-provider.js.map +1 -0
  120. package/dist/providers/types.d.ts +107 -0
  121. package/dist/providers/types.d.ts.map +1 -0
  122. package/dist/providers/types.js +2 -0
  123. package/dist/providers/types.js.map +1 -0
  124. package/dist/request-router.d.ts +9 -31
  125. package/dist/request-router.d.ts.map +1 -1
  126. package/dist/request-router.js +12 -142
  127. package/dist/request-router.js.map +1 -1
  128. package/dist/runtime-config.d.ts +79 -101
  129. package/dist/runtime-config.d.ts.map +1 -1
  130. package/dist/runtime-config.js +140 -208
  131. package/dist/runtime-config.js.map +1 -1
  132. package/dist/skill-manager.d.ts +39 -0
  133. package/dist/skill-manager.d.ts.map +1 -0
  134. package/dist/skill-manager.js +286 -0
  135. package/dist/skill-manager.js.map +1 -0
  136. package/dist/streaming.d.ts +58 -0
  137. package/dist/streaming.d.ts.map +1 -0
  138. package/dist/streaming.js +196 -0
  139. package/dist/streaming.js.map +1 -0
  140. package/dist/task-scheduler.d.ts.map +1 -1
  141. package/dist/task-scheduler.js +11 -45
  142. package/dist/task-scheduler.js.map +1 -1
  143. package/dist/tool-policy.d.ts.map +1 -1
  144. package/dist/tool-policy.js +13 -5
  145. package/dist/tool-policy.js.map +1 -1
  146. package/dist/transcription.d.ts +8 -0
  147. package/dist/transcription.d.ts.map +1 -0
  148. package/dist/transcription.js +174 -0
  149. package/dist/transcription.js.map +1 -0
  150. package/dist/types.d.ts +2 -50
  151. package/dist/types.d.ts.map +1 -1
  152. package/package.json +15 -4
  153. package/scripts/bootstrap.js +40 -4
  154. package/scripts/configure.js +129 -7
  155. package/scripts/doctor.js +30 -4
  156. package/scripts/init.js +13 -6
  157. package/scripts/install.sh +1 -1
  158. package/config-examples/plugin-http.json +0 -18
  159. package/container/skills/agent-browser.md +0 -159
  160. package/dist/background-job-classifier.d.ts +0 -20
  161. package/dist/background-job-classifier.d.ts.map +0 -1
  162. package/dist/background-job-classifier.js +0 -145
  163. package/dist/background-job-classifier.js.map +0 -1
  164. package/dist/background-jobs.d.ts +0 -56
  165. package/dist/background-jobs.d.ts.map +0 -1
  166. package/dist/background-jobs.js +0 -550
  167. package/dist/background-jobs.js.map +0 -1
  168. package/dist/planner-probe.d.ts +0 -14
  169. package/dist/planner-probe.d.ts.map +0 -1
  170. package/dist/planner-probe.js +0 -97
  171. package/dist/planner-probe.js.map +0 -1
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,23 @@
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, task, memory events)
15
+ - Real-time streaming responses with edit-in-place delivery
11
16
  - Long-term memory with embeddings and semantic search
12
17
  - Scheduled tasks (cron and one-off)
13
- - Background jobs for long-running work
14
18
  - Tool policies and daily budgets
15
19
  - Plugin tools and Autotune optimization
16
- - Prometheus-compatible metrics
20
+ - Prometheus-compatible metrics and status dashboard
17
21
 
18
22
  ## Prerequisites
19
23
 
@@ -21,6 +25,7 @@ Personal OpenRouter-based assistant for Telegram. Each request runs inside an is
21
25
  - Docker (running)
22
26
  - Telegram bot token (from @BotFather)
23
27
  - OpenRouter API key
28
+ - Discord bot token (optional — for Discord provider)
24
29
 
25
30
  ## Quick Start
26
31
 
@@ -53,9 +58,9 @@ dotclaw restart # Restart the service
53
58
  dotclaw logs # View logs (add --follow to tail)
54
59
  dotclaw status # Show service status
55
60
  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
61
+ dotclaw register # Register a new chat (Telegram or Discord)
62
+ dotclaw unregister # Remove a registered chat
63
+ dotclaw groups # List registered chats
59
64
  dotclaw build # Build the Docker container image
60
65
  dotclaw add-instance # Create and start an isolated instance
61
66
  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
+ ---
@@ -19,114 +19,20 @@
19
19
  "enabled": true
20
20
  }
21
21
  },
22
- "backgroundJobs": {
23
- "enabled": true,
24
- "maxConcurrent": 2,
25
- "maxRuntimeMs": 2400000,
26
- "maxToolSteps": 256,
27
- "toolDeny": ["mcp__dotclaw__spawn_job"],
28
- "progress": {
29
- "enabled": false,
30
- "startDelayMs": 30000,
31
- "intervalMs": 120000,
32
- "maxUpdates": 3
33
- },
34
- "autoSpawn": {
35
- "enabled": true,
36
- "foregroundTimeoutMs": 90000,
37
- "onTimeout": true,
38
- "onToolLimit": true,
39
- "classifier": {
40
- "enabled": true,
41
- "model": "openai/gpt-5-nano",
42
- "timeoutMs": 3000,
43
- "maxOutputTokens": 32,
44
- "temperature": 0,
45
- "confidenceThreshold": 0.6,
46
- "adaptive": {
47
- "enabled": true,
48
- "minThreshold": 0.55,
49
- "maxThreshold": 0.65,
50
- "queueDepthLow": 0,
51
- "queueDepthHigh": 4
52
- }
53
- }
54
- }
55
- },
56
22
  "routing": {
23
+ "model": "moonshotai/kimi-k2.5",
24
+ "fallbacks": ["anthropic/claude-sonnet-4-5", "openai/gpt-4.1"],
25
+ "maxOutputTokens": 4096,
26
+ "maxToolSteps": 50,
27
+ "temperature": 0.2,
28
+ "recallMaxResults": 8,
29
+ "recallMaxTokens": 1500
30
+ },
31
+ "streaming": {
57
32
  "enabled": true,
58
- "maxFastChars": 200,
59
- "maxStandardChars": 1200,
60
- "backgroundMinChars": 2000,
61
- "fastKeywords": ["hi", "hello", "hey", "who are you", "what can you do", "help", "thanks", "thank you"],
62
- "deepKeywords": ["research", "analysis", "analyze", "report", "dashboard", "vibe", "refactor", "architecture", "design", "spec", "strategy", "migration", "benchmark", "investigate", "evaluate", "summarize", "long-running"],
63
- "backgroundKeywords": ["background", "long-running", "research", "deep dive", "multi-step", "multi step", "dashboard", "refactor", "benchmark", "report", "analysis", "survey", "crawl", "scrape", "codebase"],
64
- "classifierFallback": {
65
- "enabled": true,
66
- "minChars": 600
67
- },
68
- "plannerProbe": {
69
- "enabled": true,
70
- "model": "openai/gpt-5-nano",
71
- "timeoutMs": 3000,
72
- "maxOutputTokens": 120,
73
- "temperature": 0,
74
- "minChars": 700,
75
- "minSteps": 4,
76
- "minTools": 3
77
- },
78
- "profiles": {
79
- "fast": {
80
- "model": "openai/gpt-5-nano",
81
- "maxOutputTokens": 4096,
82
- "maxToolSteps": 12,
83
- "recallMaxResults": 0,
84
- "recallMaxTokens": 0,
85
- "enablePlanner": false,
86
- "enableValidation": false,
87
- "responseValidationMaxRetries": 0,
88
- "enableMemoryRecall": false,
89
- "enableMemoryExtraction": false,
90
- "progress": { "enabled": false }
91
- },
92
- "standard": {
93
- "model": "openai/gpt-5-mini",
94
- "maxOutputTokens": 4096,
95
- "maxToolSteps": 48,
96
- "recallMaxResults": 6,
97
- "recallMaxTokens": 1500,
98
- "enablePlanner": true,
99
- "enableValidation": true,
100
- "responseValidationMaxRetries": 1,
101
- "enableMemoryRecall": true,
102
- "enableMemoryExtraction": true
103
- },
104
- "deep": {
105
- "model": "moonshotai/kimi-k2.5",
106
- "maxOutputTokens": 4096,
107
- "maxToolSteps": 128,
108
- "recallMaxResults": 12,
109
- "recallMaxTokens": 2500,
110
- "enablePlanner": true,
111
- "enableValidation": true,
112
- "responseValidationMaxRetries": 2,
113
- "enableMemoryRecall": true,
114
- "enableMemoryExtraction": true
115
- },
116
- "background": {
117
- "model": "moonshotai/kimi-k2.5",
118
- "maxOutputTokens": 4096,
119
- "maxToolSteps": 256,
120
- "recallMaxResults": 16,
121
- "recallMaxTokens": 4000,
122
- "enablePlanner": true,
123
- "enableValidation": true,
124
- "responseValidationMaxRetries": 2,
125
- "enableMemoryRecall": true,
126
- "enableMemoryExtraction": true,
127
- "progress": { "enabled": true, "initialMs": 15000, "intervalMs": 60000, "maxUpdates": 3 }
128
- }
129
- }
33
+ "chunkFlushIntervalMs": 200,
34
+ "editIntervalMs": 400,
35
+ "maxEditLength": 3800
130
36
  },
131
37
  "toolBudgets": {
132
38
  "enabled": false
@@ -134,26 +40,14 @@
134
40
  },
135
41
  "agent": {
136
42
  "assistantName": "Rain",
43
+ "reasoning": { "effort": "low" },
137
44
  "promptPacks": {
138
45
  "enabled": true
139
46
  },
140
- "planner": {
141
- "enabled": true,
142
- "mode": "auto"
143
- },
144
- "responseValidation": {
145
- "enabled": true,
146
- "minPromptTokens": 400,
147
- "minResponseTokens": 160
148
- },
149
47
  "tools": {
150
- "progress": {
151
- "enabled": true,
152
- "minIntervalMs": 30000,
153
- "notifyTools": [],
154
- "notifyOnStart": false,
155
- "notifyOnError": false
156
- }
48
+ "enableBash": true,
49
+ "enableWebSearch": true,
50
+ "enableWebFetch": true
157
51
  }
158
52
  }
159
53
  }
@@ -12,6 +12,7 @@
12
12
  "WebFetch",
13
13
  "Bash",
14
14
  "Python",
15
+ "Browser",
15
16
  "mcp__dotclaw__send_message",
16
17
  "mcp__dotclaw__send_file",
17
18
  "mcp__dotclaw__send_photo",
@@ -24,6 +25,7 @@
24
25
  "mcp__dotclaw__edit_message",
25
26
  "mcp__dotclaw__delete_message",
26
27
  "mcp__dotclaw__download_url",
28
+ "mcp__dotclaw__text_to_speech",
27
29
  "mcp__dotclaw__schedule_task",
28
30
  "mcp__dotclaw__run_task",
29
31
  "mcp__dotclaw__list_tasks",
@@ -31,11 +33,6 @@
31
33
  "mcp__dotclaw__resume_task",
32
34
  "mcp__dotclaw__cancel_task",
33
35
  "mcp__dotclaw__update_task",
34
- "mcp__dotclaw__spawn_job",
35
- "mcp__dotclaw__job_status",
36
- "mcp__dotclaw__list_jobs",
37
- "mcp__dotclaw__cancel_job",
38
- "mcp__dotclaw__job_update",
39
36
  "mcp__dotclaw__register_group",
40
37
  "mcp__dotclaw__remove_group",
41
38
  "mcp__dotclaw__list_groups",
@@ -54,15 +51,5 @@
54
51
  "WebFetch": 60
55
52
  },
56
53
  "default_max_per_run": 256
57
- },
58
- "groups": {
59
- "main": {
60
- "allow": ["Bash", "WebSearch", "WebFetch"]
61
- }
62
- },
63
- "users": {
64
- "123456789": {
65
- "deny": ["Bash"]
66
- }
67
54
  }
68
55
  }
@@ -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": {