cf-claw 3.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 (273) hide show
  1. package/dist/agent.d.ts +15 -0
  2. package/dist/agent.d.ts.map +1 -0
  3. package/dist/agent.js +262 -0
  4. package/dist/agent.js.map +1 -0
  5. package/dist/agents.d.ts +51 -0
  6. package/dist/agents.d.ts.map +1 -0
  7. package/dist/agents.js +478 -0
  8. package/dist/agents.js.map +1 -0
  9. package/dist/api/routes.d.ts +3 -0
  10. package/dist/api/routes.d.ts.map +1 -0
  11. package/dist/api/routes.js +491 -0
  12. package/dist/api/routes.js.map +1 -0
  13. package/dist/bot.d.ts +4 -0
  14. package/dist/bot.d.ts.map +1 -0
  15. package/dist/bot.js +295 -0
  16. package/dist/bot.js.map +1 -0
  17. package/dist/canvas.d.ts +37 -0
  18. package/dist/canvas.d.ts.map +1 -0
  19. package/dist/canvas.js +47 -0
  20. package/dist/canvas.js.map +1 -0
  21. package/dist/cli.d.ts +3 -0
  22. package/dist/cli.d.ts.map +1 -0
  23. package/dist/cli.js +202 -0
  24. package/dist/cli.js.map +1 -0
  25. package/dist/commands.d.ts +6 -0
  26. package/dist/commands.d.ts.map +1 -0
  27. package/dist/commands.js +384 -0
  28. package/dist/commands.js.map +1 -0
  29. package/dist/components/TaskList.d.ts +7 -0
  30. package/dist/components/TaskList.d.ts.map +1 -0
  31. package/dist/components/TaskList.js +37 -0
  32. package/dist/components/TaskList.js.map +1 -0
  33. package/dist/config/encryption.d.ts +10 -0
  34. package/dist/config/encryption.d.ts.map +1 -0
  35. package/dist/config/encryption.js +111 -0
  36. package/dist/config/encryption.js.map +1 -0
  37. package/dist/config/json-config.d.ts +114 -0
  38. package/dist/config/json-config.d.ts.map +1 -0
  39. package/dist/config/json-config.js +388 -0
  40. package/dist/config/json-config.js.map +1 -0
  41. package/dist/config.d.ts +51 -0
  42. package/dist/config.d.ts.map +1 -0
  43. package/dist/config.js +137 -0
  44. package/dist/config.js.map +1 -0
  45. package/dist/context/pruning.d.ts +30 -0
  46. package/dist/context/pruning.d.ts.map +1 -0
  47. package/dist/context/pruning.js +132 -0
  48. package/dist/context/pruning.js.map +1 -0
  49. package/dist/dashboard/404/index.html +1 -0
  50. package/dist/dashboard/404.html +1 -0
  51. package/dist/dashboard/_next/static/chunks/117-c657912d4a6fa056.js +2 -0
  52. package/dist/dashboard/_next/static/chunks/191-a6922264096cb3ad.js +11 -0
  53. package/dist/dashboard/_next/static/chunks/343-71498a8257bc1e81.js +1 -0
  54. package/dist/dashboard/_next/static/chunks/app/_not-found/page-15cbe4395e02a084.js +1 -0
  55. package/dist/dashboard/_next/static/chunks/app/layout-191efbc962809bb4.js +1 -0
  56. package/dist/dashboard/_next/static/chunks/app/manual/page-3c401ecf89979cd7.js +1 -0
  57. package/dist/dashboard/_next/static/chunks/app/page-dff55e58941a3c4d.js +1 -0
  58. package/dist/dashboard/_next/static/chunks/fd9d1056-9583fa19bc194043.js +1 -0
  59. package/dist/dashboard/_next/static/chunks/framework-f66176bb897dc684.js +1 -0
  60. package/dist/dashboard/_next/static/chunks/main-2461f93106bcf687.js +1 -0
  61. package/dist/dashboard/_next/static/chunks/main-app-89f5ec28b3bb0e7f.js +1 -0
  62. package/dist/dashboard/_next/static/chunks/pages/_app-72b849fbd24ac258.js +1 -0
  63. package/dist/dashboard/_next/static/chunks/pages/_error-7ba65e1336b92748.js +1 -0
  64. package/dist/dashboard/_next/static/chunks/polyfills-42372ed130431b0a.js +1 -0
  65. package/dist/dashboard/_next/static/chunks/webpack-616e068a201ad621.js +1 -0
  66. package/dist/dashboard/_next/static/css/baff0f221c10680b.css +3 -0
  67. package/dist/dashboard/_next/static/pyqPyo6dkz4uTWdfdFAOJ/_buildManifest.js +1 -0
  68. package/dist/dashboard/_next/static/pyqPyo6dkz4uTWdfdFAOJ/_ssgManifest.js +1 -0
  69. package/dist/dashboard/index.html +1 -0
  70. package/dist/dashboard/index.txt +7 -0
  71. package/dist/dashboard/manual/index.html +1 -0
  72. package/dist/dashboard/manual/index.txt +7 -0
  73. package/dist/documents.d.ts +20 -0
  74. package/dist/documents.d.ts.map +1 -0
  75. package/dist/documents.js +227 -0
  76. package/dist/documents.js.map +1 -0
  77. package/dist/embeddings.d.ts +15 -0
  78. package/dist/embeddings.d.ts.map +1 -0
  79. package/dist/embeddings.js +40 -0
  80. package/dist/embeddings.js.map +1 -0
  81. package/dist/factory.d.ts +72 -0
  82. package/dist/factory.d.ts.map +1 -0
  83. package/dist/factory.js +2010 -0
  84. package/dist/factory.js.map +1 -0
  85. package/dist/groups.d.ts +13 -0
  86. package/dist/groups.d.ts.map +1 -0
  87. package/dist/groups.js +42 -0
  88. package/dist/groups.js.map +1 -0
  89. package/dist/index.d.ts +2 -0
  90. package/dist/index.d.ts.map +1 -0
  91. package/dist/index.js +223 -0
  92. package/dist/index.js.map +1 -0
  93. package/dist/lib/taskStorage.d.ts +4 -0
  94. package/dist/lib/taskStorage.d.ts.map +1 -0
  95. package/dist/lib/taskStorage.js +28 -0
  96. package/dist/lib/taskStorage.js.map +1 -0
  97. package/dist/llm/anthropic.d.ts +13 -0
  98. package/dist/llm/anthropic.d.ts.map +1 -0
  99. package/dist/llm/anthropic.js +96 -0
  100. package/dist/llm/anthropic.js.map +1 -0
  101. package/dist/llm/failover.d.ts +13 -0
  102. package/dist/llm/failover.d.ts.map +1 -0
  103. package/dist/llm/failover.js +42 -0
  104. package/dist/llm/failover.js.map +1 -0
  105. package/dist/llm/google.d.ts +13 -0
  106. package/dist/llm/google.d.ts.map +1 -0
  107. package/dist/llm/google.js +112 -0
  108. package/dist/llm/google.js.map +1 -0
  109. package/dist/llm/groq.d.ts +8 -0
  110. package/dist/llm/groq.d.ts.map +1 -0
  111. package/dist/llm/groq.js +13 -0
  112. package/dist/llm/groq.js.map +1 -0
  113. package/dist/llm/index.d.ts +11 -0
  114. package/dist/llm/index.d.ts.map +1 -0
  115. package/dist/llm/index.js +10 -0
  116. package/dist/llm/index.js.map +1 -0
  117. package/dist/llm/ollama.d.ts +9 -0
  118. package/dist/llm/ollama.d.ts.map +1 -0
  119. package/dist/llm/ollama.js +27 -0
  120. package/dist/llm/ollama.js.map +1 -0
  121. package/dist/llm/openai-compat.d.ts +17 -0
  122. package/dist/llm/openai-compat.d.ts.map +1 -0
  123. package/dist/llm/openai-compat.js +69 -0
  124. package/dist/llm/openai-compat.js.map +1 -0
  125. package/dist/llm/openrouter.d.ts +8 -0
  126. package/dist/llm/openrouter.d.ts.map +1 -0
  127. package/dist/llm/openrouter.js +20 -0
  128. package/dist/llm/openrouter.js.map +1 -0
  129. package/dist/llm/provider.d.ts +41 -0
  130. package/dist/llm/provider.d.ts.map +1 -0
  131. package/dist/llm/provider.js +2 -0
  132. package/dist/llm/provider.js.map +1 -0
  133. package/dist/llm/registry.d.ts +10 -0
  134. package/dist/llm/registry.d.ts.map +1 -0
  135. package/dist/llm/registry.js +90 -0
  136. package/dist/llm/registry.js.map +1 -0
  137. package/dist/llm/thinking.d.ts +7 -0
  138. package/dist/llm/thinking.d.ts.map +1 -0
  139. package/dist/llm/thinking.js +34 -0
  140. package/dist/llm/thinking.js.map +1 -0
  141. package/dist/llm.d.ts +17 -0
  142. package/dist/llm.d.ts.map +1 -0
  143. package/dist/llm.js +184 -0
  144. package/dist/llm.js.map +1 -0
  145. package/dist/logs.d.ts +11 -0
  146. package/dist/logs.d.ts.map +1 -0
  147. package/dist/logs.js +54 -0
  148. package/dist/logs.js.map +1 -0
  149. package/dist/memory/knowledge-graph.d.ts +34 -0
  150. package/dist/memory/knowledge-graph.d.ts.map +1 -0
  151. package/dist/memory/knowledge-graph.js +137 -0
  152. package/dist/memory/knowledge-graph.js.map +1 -0
  153. package/dist/memory.d.ts +73 -0
  154. package/dist/memory.d.ts.map +1 -0
  155. package/dist/memory.js +320 -0
  156. package/dist/memory.js.map +1 -0
  157. package/dist/mesh.d.ts +18 -0
  158. package/dist/mesh.d.ts.map +1 -0
  159. package/dist/mesh.js +120 -0
  160. package/dist/mesh.js.map +1 -0
  161. package/dist/paths.d.ts +11 -0
  162. package/dist/paths.d.ts.map +1 -0
  163. package/dist/paths.js +51 -0
  164. package/dist/paths.js.map +1 -0
  165. package/dist/proactive/heartbeat.d.ts +4 -0
  166. package/dist/proactive/heartbeat.d.ts.map +1 -0
  167. package/dist/proactive/heartbeat.js +56 -0
  168. package/dist/proactive/heartbeat.js.map +1 -0
  169. package/dist/proactive/recap.d.ts +12 -0
  170. package/dist/proactive/recap.d.ts.map +1 -0
  171. package/dist/proactive/recap.js +90 -0
  172. package/dist/proactive/recap.js.map +1 -0
  173. package/dist/proactive/recommendations.d.ts +11 -0
  174. package/dist/proactive/recommendations.d.ts.map +1 -0
  175. package/dist/proactive/recommendations.js +92 -0
  176. package/dist/proactive/recommendations.js.map +1 -0
  177. package/dist/projects.d.ts +44 -0
  178. package/dist/projects.d.ts.map +1 -0
  179. package/dist/projects.js +101 -0
  180. package/dist/projects.js.map +1 -0
  181. package/dist/scheduler/index.d.ts +17 -0
  182. package/dist/scheduler/index.d.ts.map +1 -0
  183. package/dist/scheduler/index.js +116 -0
  184. package/dist/scheduler/index.js.map +1 -0
  185. package/dist/sessions.d.ts +19 -0
  186. package/dist/sessions.d.ts.map +1 -0
  187. package/dist/sessions.js +176 -0
  188. package/dist/sessions.js.map +1 -0
  189. package/dist/skills/index.d.ts +14 -0
  190. package/dist/skills/index.d.ts.map +1 -0
  191. package/dist/skills/index.js +126 -0
  192. package/dist/skills/index.js.map +1 -0
  193. package/dist/swarm.d.ts +18 -0
  194. package/dist/swarm.d.ts.map +1 -0
  195. package/dist/swarm.js +146 -0
  196. package/dist/swarm.js.map +1 -0
  197. package/dist/taskListWidget.d.ts +76 -0
  198. package/dist/taskListWidget.d.ts.map +1 -0
  199. package/dist/taskListWidget.js +312 -0
  200. package/dist/taskListWidget.js.map +1 -0
  201. package/dist/tools/browser.d.ts +5 -0
  202. package/dist/tools/browser.d.ts.map +1 -0
  203. package/dist/tools/browser.js +104 -0
  204. package/dist/tools/browser.js.map +1 -0
  205. package/dist/tools/config-tools.d.ts +4 -0
  206. package/dist/tools/config-tools.d.ts.map +1 -0
  207. package/dist/tools/config-tools.js +154 -0
  208. package/dist/tools/config-tools.js.map +1 -0
  209. package/dist/tools/files.d.ts +3 -0
  210. package/dist/tools/files.d.ts.map +1 -0
  211. package/dist/tools/files.js +208 -0
  212. package/dist/tools/files.js.map +1 -0
  213. package/dist/tools/index.d.ts +11 -0
  214. package/dist/tools/index.d.ts.map +1 -0
  215. package/dist/tools/index.js +1109 -0
  216. package/dist/tools/index.js.map +1 -0
  217. package/dist/tools/mcp-bridge.d.ts +5 -0
  218. package/dist/tools/mcp-bridge.d.ts.map +1 -0
  219. package/dist/tools/mcp-bridge.js +200 -0
  220. package/dist/tools/mcp-bridge.js.map +1 -0
  221. package/dist/tools/shell.d.ts +8 -0
  222. package/dist/tools/shell.d.ts.map +1 -0
  223. package/dist/tools/shell.js +78 -0
  224. package/dist/tools/shell.js.map +1 -0
  225. package/dist/tools/skills-manage.d.ts +25 -0
  226. package/dist/tools/skills-manage.d.ts.map +1 -0
  227. package/dist/tools/skills-manage.js +155 -0
  228. package/dist/tools/skills-manage.js.map +1 -0
  229. package/dist/tools/web-search.d.ts +4 -0
  230. package/dist/tools/web-search.d.ts.map +1 -0
  231. package/dist/tools/web-search.js +60 -0
  232. package/dist/tools/web-search.js.map +1 -0
  233. package/dist/tts.d.ts +6 -0
  234. package/dist/tts.d.ts.map +1 -0
  235. package/dist/tts.js +42 -0
  236. package/dist/tts.js.map +1 -0
  237. package/dist/types/task.d.ts +7 -0
  238. package/dist/types/task.d.ts.map +1 -0
  239. package/dist/types/task.js +2 -0
  240. package/dist/types/task.js.map +1 -0
  241. package/dist/typing.d.ts +18 -0
  242. package/dist/typing.d.ts.map +1 -0
  243. package/dist/typing.js +63 -0
  244. package/dist/typing.js.map +1 -0
  245. package/dist/usage.d.ts +28 -0
  246. package/dist/usage.d.ts.map +1 -0
  247. package/dist/usage.js +69 -0
  248. package/dist/usage.js.map +1 -0
  249. package/dist/voice.d.ts +6 -0
  250. package/dist/voice.d.ts.map +1 -0
  251. package/dist/voice.js +47 -0
  252. package/dist/voice.js.map +1 -0
  253. package/dist/webchat/index.d.ts +3 -0
  254. package/dist/webchat/index.d.ts.map +1 -0
  255. package/dist/webchat/index.js +3 -0
  256. package/dist/webchat/index.js.map +1 -0
  257. package/dist/webchat/public/index.html +344 -0
  258. package/dist/webchat/public/public/index.html +344 -0
  259. package/dist/webchat/public/public/task-list-widget.js +410 -0
  260. package/dist/webchat/public/task-list-widget.js +410 -0
  261. package/dist/webchat/server.d.ts +3 -0
  262. package/dist/webchat/server.d.ts.map +1 -0
  263. package/dist/webchat/server.js +80 -0
  264. package/dist/webchat/server.js.map +1 -0
  265. package/dist/webchat/ws.d.ts +4 -0
  266. package/dist/webchat/ws.d.ts.map +1 -0
  267. package/dist/webchat/ws.js +232 -0
  268. package/dist/webchat/ws.js.map +1 -0
  269. package/dist/webhooks/index.d.ts +14 -0
  270. package/dist/webhooks/index.d.ts.map +1 -0
  271. package/dist/webhooks/index.js +86 -0
  272. package/dist/webhooks/index.js.map +1 -0
  273. package/package.json +53 -0
@@ -0,0 +1,60 @@
1
+ const webSearch = {
2
+ name: "web_search",
3
+ description: "Search the web using DuckDuckGo. Returns top results with titles, snippets, and URLs.",
4
+ input_schema: {
5
+ type: "object",
6
+ properties: {
7
+ query: { type: "string", description: "Search query." },
8
+ max_results: { type: "number", description: "Max results to return (default: 5, max: 10)." },
9
+ },
10
+ required: ["query"],
11
+ },
12
+ execute: async (input) => {
13
+ const query = input.query;
14
+ const maxResults = Math.min(input.max_results || 5, 10);
15
+ try {
16
+ const url = `https://html.duckduckgo.com/html/?q=${encodeURIComponent(query)}`;
17
+ const response = await fetch(url, {
18
+ headers: {
19
+ "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36",
20
+ },
21
+ });
22
+ if (!response.ok) {
23
+ return `Error: Search failed (${response.status})`;
24
+ }
25
+ const html = await response.text();
26
+ const results = [];
27
+ const resultRegex = /<a rel="nofollow" class="result__a" href="([^"]+)">(.*?)<\/a>.*?<a class="result__snippet"[^>]*>(.*?)<\/a>/gs;
28
+ let match;
29
+ while ((match = resultRegex.exec(html)) !== null && results.length < maxResults) {
30
+ const resultUrl = match[1].replace(/&amp;/g, "&");
31
+ const title = match[2].replace(/<[^>]+>/g, "").trim();
32
+ const snippet = match[3].replace(/<[^>]+>/g, "").trim();
33
+ if (title && resultUrl) {
34
+ results.push({ title, snippet, url: resultUrl });
35
+ }
36
+ }
37
+ if (results.length === 0) {
38
+ const altRegex = /<a[^>]*class="result__a"[^>]*href="([^"]+)"[^>]*>(.*?)<\/a>/gs;
39
+ while ((match = altRegex.exec(html)) !== null && results.length < maxResults) {
40
+ const resultUrl = match[1].replace(/&amp;/g, "&");
41
+ const title = match[2].replace(/<[^>]+>/g, "").trim();
42
+ if (title && resultUrl) {
43
+ results.push({ title, snippet: "", url: resultUrl });
44
+ }
45
+ }
46
+ }
47
+ if (results.length === 0) {
48
+ return "No results found.";
49
+ }
50
+ return results
51
+ .map((r, i) => `${i + 1}. **${r.title}**\n ${r.url}\n ${r.snippet}`)
52
+ .join("\n\n");
53
+ }
54
+ catch (err) {
55
+ return `Error: ${err.message}`;
56
+ }
57
+ },
58
+ };
59
+ export default webSearch;
60
+ //# sourceMappingURL=web-search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web-search.js","sourceRoot":"","sources":["../../src/tools/web-search.ts"],"names":[],"mappings":"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"}
package/dist/tts.d.ts ADDED
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Converts text to speech using ElevenLabs API.
3
+ * Returns the path to a temporary .mp3 file.
4
+ */
5
+ export declare function textToSpeech(text: string): Promise<string>;
6
+ //# sourceMappingURL=tts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tts.d.ts","sourceRoot":"","sources":["../src/tts.ts"],"names":[],"mappings":"AAOA;;;GAGG;AACH,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAuChE"}
package/dist/tts.js ADDED
@@ -0,0 +1,42 @@
1
+ import { config } from "./config.js";
2
+ import fs from "node:fs";
3
+ import path from "node:path";
4
+ import os from "node:os";
5
+ const ELEVENLABS_API = "https://api.elevenlabs.io/v1";
6
+ /**
7
+ * Converts text to speech using ElevenLabs API.
8
+ * Returns the path to a temporary .mp3 file.
9
+ */
10
+ export async function textToSpeech(text) {
11
+ if (!config.elevenlabsApiKey) {
12
+ throw new Error("ELEVENLABS_API_KEY is not configured");
13
+ }
14
+ const voiceId = config.elevenlabsVoiceId || "21m00Tcm4TlvDq8ikWAM"; // Default: Rachel
15
+ const response = await fetch(`${ELEVENLABS_API}/text-to-speech/${voiceId}`, {
16
+ method: "POST",
17
+ headers: {
18
+ "Content-Type": "application/json",
19
+ "xi-api-key": config.elevenlabsApiKey,
20
+ },
21
+ body: JSON.stringify({
22
+ text,
23
+ model_id: "eleven_multilingual_v2",
24
+ voice_settings: {
25
+ stability: 0.5,
26
+ similarity_boost: 0.75,
27
+ style: 0.0,
28
+ use_speaker_boost: true,
29
+ },
30
+ }),
31
+ });
32
+ if (!response.ok) {
33
+ const errorText = await response.text();
34
+ throw new Error(`ElevenLabs API error (${response.status}): ${errorText}`);
35
+ }
36
+ // Save audio to temp file
37
+ const tempPath = path.join(os.tmpdir(), `cf-claw-tts-${Date.now()}.mp3`);
38
+ const buffer = Buffer.from(await response.arrayBuffer());
39
+ fs.writeFileSync(tempPath, buffer);
40
+ return tempPath;
41
+ }
42
+ //# sourceMappingURL=tts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tts.js","sourceRoot":"","sources":["../src/tts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AAEzB,MAAM,cAAc,GAAG,8BAA8B,CAAC;AAEtD;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,IAAY;IAC7C,IAAI,CAAC,MAAM,CAAC,gBAAgB,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;IAC1D,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,CAAC,iBAAiB,IAAI,sBAAsB,CAAC,CAAC,kBAAkB;IAEtF,MAAM,QAAQ,GAAG,MAAM,KAAK,CAC1B,GAAG,cAAc,mBAAmB,OAAO,EAAE,EAC7C;QACE,MAAM,EAAE,MAAM;QACd,OAAO,EAAE;YACP,cAAc,EAAE,kBAAkB;YAClC,YAAY,EAAE,MAAM,CAAC,gBAAgB;SACtC;QACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;YACnB,IAAI;YACJ,QAAQ,EAAE,wBAAwB;YAClC,cAAc,EAAE;gBACd,SAAS,EAAE,GAAG;gBACd,gBAAgB,EAAE,IAAI;gBACtB,KAAK,EAAE,GAAG;gBACV,iBAAiB,EAAE,IAAI;aACxB;SACF,CAAC;KACH,CACF,CAAC;IAEF,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QACxC,MAAM,IAAI,KAAK,CAAC,yBAAyB,QAAQ,CAAC,MAAM,MAAM,SAAS,EAAE,CAAC,CAAC;IAC7E,CAAC;IAED,0BAA0B;IAC1B,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,eAAe,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IACzE,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC;IACzD,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAEnC,OAAO,QAAQ,CAAC;AAClB,CAAC"}
@@ -0,0 +1,7 @@
1
+ export interface Task {
2
+ id: string;
3
+ title: string;
4
+ completed: boolean;
5
+ createdAt: number;
6
+ }
7
+ //# sourceMappingURL=task.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task.d.ts","sourceRoot":"","sources":["../../src/types/task.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,IAAI;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACnB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=task.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task.js","sourceRoot":"","sources":["../../src/types/task.ts"],"names":[],"mappings":""}
@@ -0,0 +1,18 @@
1
+ export declare class TypingIndicator {
2
+ private timer;
3
+ private ttlTimer;
4
+ private consecutiveFailures;
5
+ private tripped;
6
+ private readonly maxConsecutiveFailures;
7
+ private readonly maxDurationMs;
8
+ start(sendTyping: () => Promise<void>, intervalMs?: number): void;
9
+ private fire;
10
+ stop(): void;
11
+ }
12
+ export declare function createTelegramTyping(ctx: {
13
+ replyWithChatAction: (action: "typing") => Promise<void>;
14
+ }): TypingIndicator;
15
+ export declare function createWebchatTyping(ws: {
16
+ send: (data: string) => void;
17
+ }): TypingIndicator;
18
+ //# sourceMappingURL=typing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"typing.d.ts","sourceRoot":"","sources":["../src/typing.ts"],"names":[],"mappings":"AAAA,qBAAa,eAAe;IAC1B,OAAO,CAAC,KAAK,CAA+C;IAC5D,OAAO,CAAC,QAAQ,CAA8C;IAC9D,OAAO,CAAC,mBAAmB,CAAK;IAChC,OAAO,CAAC,OAAO,CAAS;IAExB,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAAK;IAC5C,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAU;IAExC,KAAK,CAAC,UAAU,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,EAAE,UAAU,GAAE,MAAa,GAAG,IAAI;YAkBzD,IAAI;IAqBlB,IAAI,IAAI,IAAI;CAUb;AAED,wBAAgB,oBAAoB,CAAC,GAAG,EAAE;IAAE,mBAAmB,EAAE,CAAC,MAAM,EAAE,QAAQ,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;CAAE,GAAG,eAAe,CAEvH;AAED,wBAAgB,mBAAmB,CAAC,EAAE,EAAE;IAAE,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;CAAE,GAAG,eAAe,CAUzF"}
package/dist/typing.js ADDED
@@ -0,0 +1,63 @@
1
+ export class TypingIndicator {
2
+ timer = null;
3
+ ttlTimer = null;
4
+ consecutiveFailures = 0;
5
+ tripped = false;
6
+ maxConsecutiveFailures = 2;
7
+ maxDurationMs = 60_000;
8
+ start(sendTyping, intervalMs = 3000) {
9
+ this.stop();
10
+ this.consecutiveFailures = 0;
11
+ this.tripped = false;
12
+ this.fire(sendTyping);
13
+ this.timer = setInterval(() => {
14
+ if (this.tripped)
15
+ return;
16
+ this.fire(sendTyping);
17
+ }, intervalMs);
18
+ this.ttlTimer = setTimeout(() => {
19
+ console.log("⌨️ Typing indicator TTL reached (60s), stopping");
20
+ this.stop();
21
+ }, this.maxDurationMs);
22
+ }
23
+ async fire(sendTyping) {
24
+ try {
25
+ const t0 = Date.now();
26
+ await sendTyping();
27
+ const ms = Date.now() - t0;
28
+ console.log(`📤 sendChatAction delivered OK (${ms}ms)`);
29
+ this.consecutiveFailures = 0;
30
+ }
31
+ catch (err) {
32
+ this.consecutiveFailures++;
33
+ console.warn(`⚠️ Typing action failed (${this.consecutiveFailures}/${this.maxConsecutiveFailures}):`, err instanceof Error ? err.message : err);
34
+ if (this.consecutiveFailures >= this.maxConsecutiveFailures) {
35
+ console.warn("⚠️ Typing indicator circuit breaker tripped, stopping");
36
+ this.tripped = true;
37
+ this.stop();
38
+ }
39
+ }
40
+ }
41
+ stop() {
42
+ if (this.timer) {
43
+ clearInterval(this.timer);
44
+ this.timer = null;
45
+ }
46
+ if (this.ttlTimer) {
47
+ clearTimeout(this.ttlTimer);
48
+ this.ttlTimer = null;
49
+ }
50
+ }
51
+ }
52
+ export function createTelegramTyping(ctx) {
53
+ return new TypingIndicator();
54
+ }
55
+ export function createWebchatTyping(ws) {
56
+ const indicator = new TypingIndicator();
57
+ const originalStart = indicator.start.bind(indicator);
58
+ indicator.start = (sendTyping, intervalMs) => {
59
+ originalStart(async () => { ws.send(JSON.stringify({ type: "typing" })); }, intervalMs);
60
+ };
61
+ return indicator;
62
+ }
63
+ //# sourceMappingURL=typing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"typing.js","sourceRoot":"","sources":["../src/typing.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,eAAe;IAClB,KAAK,GAA0C,IAAI,CAAC;IACpD,QAAQ,GAAyC,IAAI,CAAC;IACtD,mBAAmB,GAAG,CAAC,CAAC;IACxB,OAAO,GAAG,KAAK,CAAC;IAEP,sBAAsB,GAAG,CAAC,CAAC;IAC3B,aAAa,GAAG,MAAM,CAAC;IAExC,KAAK,CAAC,UAA+B,EAAE,aAAqB,IAAI;QAC9D,IAAI,CAAC,IAAI,EAAE,CAAC;QACZ,IAAI,CAAC,mBAAmB,GAAG,CAAC,CAAC;QAC7B,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;QAErB,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAEtB,IAAI,CAAC,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE;YAC5B,IAAI,IAAI,CAAC,OAAO;gBAAE,OAAO;YACzB,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACxB,CAAC,EAAE,UAAU,CAAC,CAAC;QAEf,IAAI,CAAC,QAAQ,GAAG,UAAU,CAAC,GAAG,EAAE;YAC9B,OAAO,CAAC,GAAG,CAAC,iDAAiD,CAAC,CAAC;YAC/D,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,CAAC,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;IACzB,CAAC;IAEO,KAAK,CAAC,IAAI,CAAC,UAA+B;QAChD,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YACtB,MAAM,UAAU,EAAE,CAAC;YACnB,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC;YAC3B,OAAO,CAAC,GAAG,CAAC,mCAAmC,EAAE,KAAK,CAAC,CAAC;YACxD,IAAI,CAAC,mBAAmB,GAAG,CAAC,CAAC;QAC/B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,mBAAmB,EAAE,CAAC;YAC3B,OAAO,CAAC,IAAI,CACV,4BAA4B,IAAI,CAAC,mBAAmB,IAAI,IAAI,CAAC,sBAAsB,IAAI,EACvF,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CACzC,CAAC;YACF,IAAI,IAAI,CAAC,mBAAmB,IAAI,IAAI,CAAC,sBAAsB,EAAE,CAAC;gBAC5D,OAAO,CAAC,IAAI,CAAC,uDAAuD,CAAC,CAAC;gBACtE,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;gBACpB,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI;QACF,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC1B,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QACpB,CAAC;QACD,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC5B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACvB,CAAC;IACH,CAAC;CACF;AAED,MAAM,UAAU,oBAAoB,CAAC,GAAiE;IACpG,OAAO,IAAI,eAAe,EAAE,CAAC;AAC/B,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,EAAoC;IACtE,MAAM,SAAS,GAAG,IAAI,eAAe,EAAE,CAAC;IACxC,MAAM,aAAa,GAAG,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACtD,SAAS,CAAC,KAAK,GAAG,CAAC,UAAgC,EAAE,UAAmB,EAAE,EAAE;QAC1E,aAAa,CACX,KAAK,IAAI,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAC5D,UAAU,CACX,CAAC;IACJ,CAAC,CAAC;IACF,OAAO,SAAS,CAAC;AACnB,CAAC"}
@@ -0,0 +1,28 @@
1
+ export interface UsageEntry {
2
+ model: string;
3
+ promptTokens: number;
4
+ completionTokens: number;
5
+ totalTokens: number;
6
+ costUsd: number;
7
+ latencyMs: number;
8
+ toolCalls: number;
9
+ source: string;
10
+ }
11
+ export interface UsageSummary {
12
+ totalCalls: number;
13
+ totalTokens: number;
14
+ totalCost: number;
15
+ avgLatencyMs: number;
16
+ byModel: {
17
+ model: string;
18
+ calls: number;
19
+ tokens: number;
20
+ cost: number;
21
+ }[];
22
+ period: string;
23
+ }
24
+ export declare function logUsage(entry: UsageEntry): void;
25
+ export declare function estimateCost(model: string, promptTokens: number, completionTokens: number): number;
26
+ export declare function getUsageSummary(hours?: number): UsageSummary;
27
+ export declare function getRecentUsage(limit?: number): UsageEntry[];
28
+ //# sourceMappingURL=usage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usage.d.ts","sourceRoot":"","sources":["../src/usage.ts"],"names":[],"mappings":"AAoDA,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,YAAY;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC1E,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI,CAWhD;AAED,wBAAgB,YAAY,CAC1B,KAAK,EAAE,MAAM,EACb,YAAY,EAAE,MAAM,EACpB,gBAAgB,EAAE,MAAM,GACvB,MAAM,CAGR;AAED,wBAAgB,eAAe,CAAC,KAAK,GAAE,MAAW,GAAG,YAAY,CAmBhE;AAED,wBAAgB,cAAc,CAAC,KAAK,GAAE,MAAW,GAAG,UAAU,EAAE,CAI/D"}
package/dist/usage.js ADDED
@@ -0,0 +1,69 @@
1
+ import Database from "better-sqlite3";
2
+ import path from "node:path";
3
+ import fs from "node:fs";
4
+ import { getDataDir } from "./paths.js";
5
+ const DATA_DIR = getDataDir();
6
+ fs.mkdirSync(DATA_DIR, { recursive: true });
7
+ const DB_PATH = path.join(DATA_DIR, "cf-claw.db");
8
+ const db = new Database(DB_PATH);
9
+ db.exec(`
10
+ CREATE TABLE IF NOT EXISTS usage_logs (
11
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
12
+ model TEXT NOT NULL,
13
+ prompt_tokens INTEGER DEFAULT 0,
14
+ completion_tokens INTEGER DEFAULT 0,
15
+ total_tokens INTEGER DEFAULT 0,
16
+ cost_usd REAL DEFAULT 0,
17
+ latency_ms INTEGER DEFAULT 0,
18
+ tool_calls INTEGER DEFAULT 0,
19
+ source TEXT DEFAULT 'agent',
20
+ created_at TEXT NOT NULL DEFAULT (datetime('now'))
21
+ );
22
+ `);
23
+ const insertLog = db.prepare("INSERT INTO usage_logs (model, prompt_tokens, completion_tokens, total_tokens, cost_usd, latency_ms, tool_calls, source) VALUES (?, ?, ?, ?, ?, ?, ?, ?)");
24
+ const MODEL_COSTS = {
25
+ "gpt-4o": { input: 2.5 / 1_000_000, output: 10 / 1_000_000 },
26
+ "gpt-4o-mini": { input: 0.15 / 1_000_000, output: 0.6 / 1_000_000 },
27
+ "gpt-4-turbo": { input: 10 / 1_000_000, output: 30 / 1_000_000 },
28
+ "o1-mini": { input: 3 / 1_000_000, output: 12 / 1_000_000 },
29
+ "o3-mini": { input: 1.1 / 1_000_000, output: 4.4 / 1_000_000 },
30
+ "claude-sonnet-4-20250514": { input: 3 / 1_000_000, output: 15 / 1_000_000 },
31
+ "gemini-2.0-flash": { input: 0.1 / 1_000_000, output: 0.4 / 1_000_000 },
32
+ "deepseek-chat": { input: 0.14 / 1_000_000, output: 0.28 / 1_000_000 },
33
+ "glm-5": { input: 0.5 / 1_000_000, output: 1.5 / 1_000_000 },
34
+ "glm-5.1": { input: 0.5 / 1_000_000, output: 1.5 / 1_000_000 },
35
+ "kilo-auto/frontier": { input: 3 / 1_000_000, output: 15 / 1_000_000 },
36
+ "kilo-auto/balanced": { input: 0.5 / 1_000_000, output: 1.5 / 1_000_000 },
37
+ "kilo-auto/free": { input: 0, output: 0 },
38
+ "anthropic/claude-sonnet-4.6": { input: 3 / 1_000_000, output: 15 / 1_000_000 },
39
+ "anthropic/claude-opus-4.6": { input: 15 / 1_000_000, output: 75 / 1_000_000 },
40
+ "openai/gpt-5.2": { input: 2.5 / 1_000_000, output: 10 / 1_000_000 },
41
+ "google/gemini-3-pro-preview": { input: 1.25 / 1_000_000, output: 10 / 1_000_000 },
42
+ "minimax/minimax-m2.5:free": { input: 0, output: 0 },
43
+ "z-ai/glm-5:free": { input: 0, output: 0 },
44
+ };
45
+ export function logUsage(entry) {
46
+ insertLog.run(entry.model, entry.promptTokens, entry.completionTokens, entry.totalTokens, entry.costUsd, entry.latencyMs, entry.toolCalls, entry.source);
47
+ }
48
+ export function estimateCost(model, promptTokens, completionTokens) {
49
+ const costs = MODEL_COSTS[model] || { input: 0.5 / 1_000_000, output: 1.5 / 1_000_000 };
50
+ return promptTokens * costs.input + completionTokens * costs.output;
51
+ }
52
+ export function getUsageSummary(hours = 24) {
53
+ const since = new Date(Date.now() - hours * 60 * 60 * 1000).toISOString();
54
+ const totalRow = db.prepare("SELECT COUNT(*) as totalCalls, COALESCE(SUM(total_tokens), 0) as totalTokens, COALESCE(SUM(cost_usd), 0) as totalCost, COALESCE(AVG(latency_ms), 0) as avgLatency FROM usage_logs WHERE created_at >= ?").get(since);
55
+ const byModel = db.prepare("SELECT model, COUNT(*) as calls, COALESCE(SUM(total_tokens), 0) as tokens, COALESCE(SUM(cost_usd), 0) as cost FROM usage_logs WHERE created_at >= ? GROUP BY model ORDER BY cost DESC").all(since);
56
+ return {
57
+ totalCalls: totalRow.totalCalls,
58
+ totalTokens: totalRow.totalTokens,
59
+ totalCost: totalRow.totalCost,
60
+ avgLatencyMs: Math.round(totalRow.avgLatency),
61
+ byModel,
62
+ period: `${hours}h`,
63
+ };
64
+ }
65
+ export function getRecentUsage(limit = 10) {
66
+ return db.prepare("SELECT model, prompt_tokens as promptTokens, completion_tokens as completionTokens, total_tokens as totalTokens, cost_usd as costUsd, latency_ms as latencyMs, tool_calls as toolCalls, source FROM usage_logs ORDER BY id DESC LIMIT ?").all(limit);
67
+ }
68
+ process.on("exit", () => db.close());
69
+ //# sourceMappingURL=usage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usage.js","sourceRoot":"","sources":["../src/usage.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AACtC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAExC,MAAM,QAAQ,GAAG,UAAU,EAAE,CAAC;AAC9B,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AAE5C,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;AAClD,MAAM,EAAE,GAAG,IAAI,QAAQ,CAAC,OAAO,CAAC,CAAC;AAEjC,EAAE,CAAC,IAAI,CAAC;;;;;;;;;;;;;CAaP,CAAC,CAAC;AAEH,MAAM,SAAS,GAAG,EAAE,CAAC,OAAO,CAC1B,0JAA0J,CAC3J,CAAC;AAEF,MAAM,WAAW,GAAsD;IACrE,QAAQ,EAAE,EAAE,KAAK,EAAE,GAAG,GAAG,SAAS,EAAE,MAAM,EAAE,EAAE,GAAG,SAAS,EAAE;IAC5D,aAAa,EAAE,EAAE,KAAK,EAAE,IAAI,GAAG,SAAS,EAAE,MAAM,EAAE,GAAG,GAAG,SAAS,EAAE;IACnE,aAAa,EAAE,EAAE,KAAK,EAAE,EAAE,GAAG,SAAS,EAAE,MAAM,EAAE,EAAE,GAAG,SAAS,EAAE;IAChE,SAAS,EAAE,EAAE,KAAK,EAAE,CAAC,GAAG,SAAS,EAAE,MAAM,EAAE,EAAE,GAAG,SAAS,EAAE;IAC3D,SAAS,EAAE,EAAE,KAAK,EAAE,GAAG,GAAG,SAAS,EAAE,MAAM,EAAE,GAAG,GAAG,SAAS,EAAE;IAC9D,0BAA0B,EAAE,EAAE,KAAK,EAAE,CAAC,GAAG,SAAS,EAAE,MAAM,EAAE,EAAE,GAAG,SAAS,EAAE;IAC5E,kBAAkB,EAAE,EAAE,KAAK,EAAE,GAAG,GAAG,SAAS,EAAE,MAAM,EAAE,GAAG,GAAG,SAAS,EAAE;IACvE,eAAe,EAAE,EAAE,KAAK,EAAE,IAAI,GAAG,SAAS,EAAE,MAAM,EAAE,IAAI,GAAG,SAAS,EAAE;IACtE,OAAO,EAAE,EAAE,KAAK,EAAE,GAAG,GAAG,SAAS,EAAE,MAAM,EAAE,GAAG,GAAG,SAAS,EAAE;IAC5D,SAAS,EAAE,EAAE,KAAK,EAAE,GAAG,GAAG,SAAS,EAAE,MAAM,EAAE,GAAG,GAAG,SAAS,EAAE;IAC9D,oBAAoB,EAAE,EAAE,KAAK,EAAE,CAAC,GAAG,SAAS,EAAE,MAAM,EAAE,EAAE,GAAG,SAAS,EAAE;IACtE,oBAAoB,EAAE,EAAE,KAAK,EAAE,GAAG,GAAG,SAAS,EAAE,MAAM,EAAE,GAAG,GAAG,SAAS,EAAE;IACzE,gBAAgB,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE;IACzC,6BAA6B,EAAE,EAAE,KAAK,EAAE,CAAC,GAAG,SAAS,EAAE,MAAM,EAAE,EAAE,GAAG,SAAS,EAAE;IAC/E,2BAA2B,EAAE,EAAE,KAAK,EAAE,EAAE,GAAG,SAAS,EAAE,MAAM,EAAE,EAAE,GAAG,SAAS,EAAE;IAC9E,gBAAgB,EAAE,EAAE,KAAK,EAAE,GAAG,GAAG,SAAS,EAAE,MAAM,EAAE,EAAE,GAAG,SAAS,EAAE;IACpE,6BAA6B,EAAE,EAAE,KAAK,EAAE,IAAI,GAAG,SAAS,EAAE,MAAM,EAAE,EAAE,GAAG,SAAS,EAAE;IAClF,2BAA2B,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE;IACpD,iBAAiB,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE;CAC3C,CAAC;AAsBF,MAAM,UAAU,QAAQ,CAAC,KAAiB;IACxC,SAAS,CAAC,GAAG,CACX,KAAK,CAAC,KAAK,EACX,KAAK,CAAC,YAAY,EAClB,KAAK,CAAC,gBAAgB,EACtB,KAAK,CAAC,WAAW,EACjB,KAAK,CAAC,OAAO,EACb,KAAK,CAAC,SAAS,EACf,KAAK,CAAC,SAAS,EACf,KAAK,CAAC,MAAM,CACb,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,YAAY,CAC1B,KAAa,EACb,YAAoB,EACpB,gBAAwB;IAExB,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,GAAG,SAAS,EAAE,MAAM,EAAE,GAAG,GAAG,SAAS,EAAE,CAAC;IACxF,OAAO,YAAY,GAAG,KAAK,CAAC,KAAK,GAAG,gBAAgB,GAAG,KAAK,CAAC,MAAM,CAAC;AACtE,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,QAAgB,EAAE;IAChD,MAAM,KAAK,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;IAE1E,MAAM,QAAQ,GAAG,EAAE,CAAC,OAAO,CACzB,yMAAyM,CAC1M,CAAC,GAAG,CAAC,KAAK,CAAuF,CAAC;IAEnG,MAAM,OAAO,GAAG,EAAE,CAAC,OAAO,CACxB,uLAAuL,CACxL,CAAC,GAAG,CAAC,KAAK,CAAqE,CAAC;IAEjF,OAAO;QACL,UAAU,EAAE,QAAQ,CAAC,UAAU;QAC/B,WAAW,EAAE,QAAQ,CAAC,WAAW;QACjC,SAAS,EAAE,QAAQ,CAAC,SAAS;QAC7B,YAAY,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC;QAC7C,OAAO;QACP,MAAM,EAAE,GAAG,KAAK,GAAG;KACpB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,QAAgB,EAAE;IAC/C,OAAO,EAAE,CAAC,OAAO,CACf,yOAAyO,CAC1O,CAAC,GAAG,CAAC,KAAK,CAAiB,CAAC;AAC/B,CAAC;AAED,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Downloads a Telegram voice file and transcribes it using Groq Whisper.
3
+ * Returns the transcribed text.
4
+ */
5
+ export declare function transcribeVoice(fileUrl: string, fileName: string): Promise<string>;
6
+ //# sourceMappingURL=voice.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"voice.d.ts","sourceRoot":"","sources":["../src/voice.ts"],"names":[],"mappings":"AAWA;;;GAGG;AACH,wBAAsB,eAAe,CACnC,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,MAAM,CAAC,CAkCjB"}
package/dist/voice.js ADDED
@@ -0,0 +1,47 @@
1
+ import OpenAI from "openai";
2
+ import { config } from "./config.js";
3
+ import fs from "node:fs";
4
+ import path from "node:path";
5
+ import os from "node:os";
6
+ const groq = new OpenAI({
7
+ apiKey: config.groqApiKey,
8
+ baseURL: "https://api.groq.com/openai/v1",
9
+ });
10
+ /**
11
+ * Downloads a Telegram voice file and transcribes it using Groq Whisper.
12
+ * Returns the transcribed text.
13
+ */
14
+ export async function transcribeVoice(fileUrl, fileName) {
15
+ // Download the voice file to a temp location
16
+ let safeName = path.basename(fileName);
17
+ // Telegram uses .oga extension, but Groq Whisper expects .ogg (same codec)
18
+ if (safeName.endsWith(".oga")) {
19
+ safeName = safeName.replace(/\.oga$/, ".ogg");
20
+ }
21
+ const tempPath = path.join(os.tmpdir(), `cf-claw-${Date.now()}-${safeName}`);
22
+ try {
23
+ const response = await fetch(fileUrl);
24
+ if (!response.ok) {
25
+ throw new Error(`Failed to download voice file: ${response.statusText}`);
26
+ }
27
+ const buffer = Buffer.from(await response.arrayBuffer());
28
+ fs.writeFileSync(tempPath, buffer);
29
+ // Send to Groq Whisper for transcription
30
+ const transcription = await groq.audio.transcriptions.create({
31
+ file: fs.createReadStream(tempPath),
32
+ model: "whisper-large-v3",
33
+ language: "sv", // Swedish as default, Whisper auto-detects well
34
+ });
35
+ return transcription.text;
36
+ }
37
+ finally {
38
+ // Clean up temp file
39
+ try {
40
+ fs.unlinkSync(tempPath);
41
+ }
42
+ catch {
43
+ // ignore cleanup errors
44
+ }
45
+ }
46
+ }
47
+ //# sourceMappingURL=voice.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"voice.js","sourceRoot":"","sources":["../src/voice.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AAEzB,MAAM,IAAI,GAAG,IAAI,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC,UAAU;IACzB,OAAO,EAAE,gCAAgC;CAC1C,CAAC,CAAC;AAEH;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,OAAe,EACf,QAAgB;IAEhB,6CAA6C;IAC7C,IAAI,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACvC,2EAA2E;IAC3E,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QAC9B,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAChD,CAAC;IACD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,WAAW,IAAI,CAAC,GAAG,EAAE,IAAI,QAAQ,EAAE,CAAC,CAAC;IAE7E,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,CAAC;QACtC,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,kCAAkC,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;QAC3E,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC;QACzD,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAEnC,yCAAyC;QACzC,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC;YAC3D,IAAI,EAAE,EAAE,CAAC,gBAAgB,CAAC,QAAQ,CAAC;YACnC,KAAK,EAAE,kBAAkB;YACzB,QAAQ,EAAE,IAAI,EAAE,gDAAgD;SACjE,CAAC,CAAC;QAEH,OAAO,aAAa,CAAC,IAAI,CAAC;IAC5B,CAAC;YAAS,CAAC;QACT,qBAAqB;QACrB,IAAI,CAAC;YACH,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QAC1B,CAAC;QAAC,MAAM,CAAC;YACP,wBAAwB;QAC1B,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { startWebchatServer } from "./server.js";
2
+ export { startWebchatServer };
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/webchat/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAEjD,OAAO,EAAE,kBAAkB,EAAE,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { startWebchatServer } from "./server.js";
2
+ export { startWebchatServer };
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/webchat/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAEjD,OAAO,EAAE,kBAAkB,EAAE,CAAC"}