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.
- package/dist/agent.d.ts +15 -0
- package/dist/agent.d.ts.map +1 -0
- package/dist/agent.js +262 -0
- package/dist/agent.js.map +1 -0
- package/dist/agents.d.ts +51 -0
- package/dist/agents.d.ts.map +1 -0
- package/dist/agents.js +478 -0
- package/dist/agents.js.map +1 -0
- package/dist/api/routes.d.ts +3 -0
- package/dist/api/routes.d.ts.map +1 -0
- package/dist/api/routes.js +491 -0
- package/dist/api/routes.js.map +1 -0
- package/dist/bot.d.ts +4 -0
- package/dist/bot.d.ts.map +1 -0
- package/dist/bot.js +295 -0
- package/dist/bot.js.map +1 -0
- package/dist/canvas.d.ts +37 -0
- package/dist/canvas.d.ts.map +1 -0
- package/dist/canvas.js +47 -0
- package/dist/canvas.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +202 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands.d.ts +6 -0
- package/dist/commands.d.ts.map +1 -0
- package/dist/commands.js +384 -0
- package/dist/commands.js.map +1 -0
- package/dist/components/TaskList.d.ts +7 -0
- package/dist/components/TaskList.d.ts.map +1 -0
- package/dist/components/TaskList.js +37 -0
- package/dist/components/TaskList.js.map +1 -0
- package/dist/config/encryption.d.ts +10 -0
- package/dist/config/encryption.d.ts.map +1 -0
- package/dist/config/encryption.js +111 -0
- package/dist/config/encryption.js.map +1 -0
- package/dist/config/json-config.d.ts +114 -0
- package/dist/config/json-config.d.ts.map +1 -0
- package/dist/config/json-config.js +388 -0
- package/dist/config/json-config.js.map +1 -0
- package/dist/config.d.ts +51 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +137 -0
- package/dist/config.js.map +1 -0
- package/dist/context/pruning.d.ts +30 -0
- package/dist/context/pruning.d.ts.map +1 -0
- package/dist/context/pruning.js +132 -0
- package/dist/context/pruning.js.map +1 -0
- package/dist/dashboard/404/index.html +1 -0
- package/dist/dashboard/404.html +1 -0
- package/dist/dashboard/_next/static/chunks/117-c657912d4a6fa056.js +2 -0
- package/dist/dashboard/_next/static/chunks/191-a6922264096cb3ad.js +11 -0
- package/dist/dashboard/_next/static/chunks/343-71498a8257bc1e81.js +1 -0
- package/dist/dashboard/_next/static/chunks/app/_not-found/page-15cbe4395e02a084.js +1 -0
- package/dist/dashboard/_next/static/chunks/app/layout-191efbc962809bb4.js +1 -0
- package/dist/dashboard/_next/static/chunks/app/manual/page-3c401ecf89979cd7.js +1 -0
- package/dist/dashboard/_next/static/chunks/app/page-dff55e58941a3c4d.js +1 -0
- package/dist/dashboard/_next/static/chunks/fd9d1056-9583fa19bc194043.js +1 -0
- package/dist/dashboard/_next/static/chunks/framework-f66176bb897dc684.js +1 -0
- package/dist/dashboard/_next/static/chunks/main-2461f93106bcf687.js +1 -0
- package/dist/dashboard/_next/static/chunks/main-app-89f5ec28b3bb0e7f.js +1 -0
- package/dist/dashboard/_next/static/chunks/pages/_app-72b849fbd24ac258.js +1 -0
- package/dist/dashboard/_next/static/chunks/pages/_error-7ba65e1336b92748.js +1 -0
- package/dist/dashboard/_next/static/chunks/polyfills-42372ed130431b0a.js +1 -0
- package/dist/dashboard/_next/static/chunks/webpack-616e068a201ad621.js +1 -0
- package/dist/dashboard/_next/static/css/baff0f221c10680b.css +3 -0
- package/dist/dashboard/_next/static/pyqPyo6dkz4uTWdfdFAOJ/_buildManifest.js +1 -0
- package/dist/dashboard/_next/static/pyqPyo6dkz4uTWdfdFAOJ/_ssgManifest.js +1 -0
- package/dist/dashboard/index.html +1 -0
- package/dist/dashboard/index.txt +7 -0
- package/dist/dashboard/manual/index.html +1 -0
- package/dist/dashboard/manual/index.txt +7 -0
- package/dist/documents.d.ts +20 -0
- package/dist/documents.d.ts.map +1 -0
- package/dist/documents.js +227 -0
- package/dist/documents.js.map +1 -0
- package/dist/embeddings.d.ts +15 -0
- package/dist/embeddings.d.ts.map +1 -0
- package/dist/embeddings.js +40 -0
- package/dist/embeddings.js.map +1 -0
- package/dist/factory.d.ts +72 -0
- package/dist/factory.d.ts.map +1 -0
- package/dist/factory.js +2010 -0
- package/dist/factory.js.map +1 -0
- package/dist/groups.d.ts +13 -0
- package/dist/groups.d.ts.map +1 -0
- package/dist/groups.js +42 -0
- package/dist/groups.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +223 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/taskStorage.d.ts +4 -0
- package/dist/lib/taskStorage.d.ts.map +1 -0
- package/dist/lib/taskStorage.js +28 -0
- package/dist/lib/taskStorage.js.map +1 -0
- package/dist/llm/anthropic.d.ts +13 -0
- package/dist/llm/anthropic.d.ts.map +1 -0
- package/dist/llm/anthropic.js +96 -0
- package/dist/llm/anthropic.js.map +1 -0
- package/dist/llm/failover.d.ts +13 -0
- package/dist/llm/failover.d.ts.map +1 -0
- package/dist/llm/failover.js +42 -0
- package/dist/llm/failover.js.map +1 -0
- package/dist/llm/google.d.ts +13 -0
- package/dist/llm/google.d.ts.map +1 -0
- package/dist/llm/google.js +112 -0
- package/dist/llm/google.js.map +1 -0
- package/dist/llm/groq.d.ts +8 -0
- package/dist/llm/groq.d.ts.map +1 -0
- package/dist/llm/groq.js +13 -0
- package/dist/llm/groq.js.map +1 -0
- package/dist/llm/index.d.ts +11 -0
- package/dist/llm/index.d.ts.map +1 -0
- package/dist/llm/index.js +10 -0
- package/dist/llm/index.js.map +1 -0
- package/dist/llm/ollama.d.ts +9 -0
- package/dist/llm/ollama.d.ts.map +1 -0
- package/dist/llm/ollama.js +27 -0
- package/dist/llm/ollama.js.map +1 -0
- package/dist/llm/openai-compat.d.ts +17 -0
- package/dist/llm/openai-compat.d.ts.map +1 -0
- package/dist/llm/openai-compat.js +69 -0
- package/dist/llm/openai-compat.js.map +1 -0
- package/dist/llm/openrouter.d.ts +8 -0
- package/dist/llm/openrouter.d.ts.map +1 -0
- package/dist/llm/openrouter.js +20 -0
- package/dist/llm/openrouter.js.map +1 -0
- package/dist/llm/provider.d.ts +41 -0
- package/dist/llm/provider.d.ts.map +1 -0
- package/dist/llm/provider.js +2 -0
- package/dist/llm/provider.js.map +1 -0
- package/dist/llm/registry.d.ts +10 -0
- package/dist/llm/registry.d.ts.map +1 -0
- package/dist/llm/registry.js +90 -0
- package/dist/llm/registry.js.map +1 -0
- package/dist/llm/thinking.d.ts +7 -0
- package/dist/llm/thinking.d.ts.map +1 -0
- package/dist/llm/thinking.js +34 -0
- package/dist/llm/thinking.js.map +1 -0
- package/dist/llm.d.ts +17 -0
- package/dist/llm.d.ts.map +1 -0
- package/dist/llm.js +184 -0
- package/dist/llm.js.map +1 -0
- package/dist/logs.d.ts +11 -0
- package/dist/logs.d.ts.map +1 -0
- package/dist/logs.js +54 -0
- package/dist/logs.js.map +1 -0
- package/dist/memory/knowledge-graph.d.ts +34 -0
- package/dist/memory/knowledge-graph.d.ts.map +1 -0
- package/dist/memory/knowledge-graph.js +137 -0
- package/dist/memory/knowledge-graph.js.map +1 -0
- package/dist/memory.d.ts +73 -0
- package/dist/memory.d.ts.map +1 -0
- package/dist/memory.js +320 -0
- package/dist/memory.js.map +1 -0
- package/dist/mesh.d.ts +18 -0
- package/dist/mesh.d.ts.map +1 -0
- package/dist/mesh.js +120 -0
- package/dist/mesh.js.map +1 -0
- package/dist/paths.d.ts +11 -0
- package/dist/paths.d.ts.map +1 -0
- package/dist/paths.js +51 -0
- package/dist/paths.js.map +1 -0
- package/dist/proactive/heartbeat.d.ts +4 -0
- package/dist/proactive/heartbeat.d.ts.map +1 -0
- package/dist/proactive/heartbeat.js +56 -0
- package/dist/proactive/heartbeat.js.map +1 -0
- package/dist/proactive/recap.d.ts +12 -0
- package/dist/proactive/recap.d.ts.map +1 -0
- package/dist/proactive/recap.js +90 -0
- package/dist/proactive/recap.js.map +1 -0
- package/dist/proactive/recommendations.d.ts +11 -0
- package/dist/proactive/recommendations.d.ts.map +1 -0
- package/dist/proactive/recommendations.js +92 -0
- package/dist/proactive/recommendations.js.map +1 -0
- package/dist/projects.d.ts +44 -0
- package/dist/projects.d.ts.map +1 -0
- package/dist/projects.js +101 -0
- package/dist/projects.js.map +1 -0
- package/dist/scheduler/index.d.ts +17 -0
- package/dist/scheduler/index.d.ts.map +1 -0
- package/dist/scheduler/index.js +116 -0
- package/dist/scheduler/index.js.map +1 -0
- package/dist/sessions.d.ts +19 -0
- package/dist/sessions.d.ts.map +1 -0
- package/dist/sessions.js +176 -0
- package/dist/sessions.js.map +1 -0
- package/dist/skills/index.d.ts +14 -0
- package/dist/skills/index.d.ts.map +1 -0
- package/dist/skills/index.js +126 -0
- package/dist/skills/index.js.map +1 -0
- package/dist/swarm.d.ts +18 -0
- package/dist/swarm.d.ts.map +1 -0
- package/dist/swarm.js +146 -0
- package/dist/swarm.js.map +1 -0
- package/dist/taskListWidget.d.ts +76 -0
- package/dist/taskListWidget.d.ts.map +1 -0
- package/dist/taskListWidget.js +312 -0
- package/dist/taskListWidget.js.map +1 -0
- package/dist/tools/browser.d.ts +5 -0
- package/dist/tools/browser.d.ts.map +1 -0
- package/dist/tools/browser.js +104 -0
- package/dist/tools/browser.js.map +1 -0
- package/dist/tools/config-tools.d.ts +4 -0
- package/dist/tools/config-tools.d.ts.map +1 -0
- package/dist/tools/config-tools.js +154 -0
- package/dist/tools/config-tools.js.map +1 -0
- package/dist/tools/files.d.ts +3 -0
- package/dist/tools/files.d.ts.map +1 -0
- package/dist/tools/files.js +208 -0
- package/dist/tools/files.js.map +1 -0
- package/dist/tools/index.d.ts +11 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +1109 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/mcp-bridge.d.ts +5 -0
- package/dist/tools/mcp-bridge.d.ts.map +1 -0
- package/dist/tools/mcp-bridge.js +200 -0
- package/dist/tools/mcp-bridge.js.map +1 -0
- package/dist/tools/shell.d.ts +8 -0
- package/dist/tools/shell.d.ts.map +1 -0
- package/dist/tools/shell.js +78 -0
- package/dist/tools/shell.js.map +1 -0
- package/dist/tools/skills-manage.d.ts +25 -0
- package/dist/tools/skills-manage.d.ts.map +1 -0
- package/dist/tools/skills-manage.js +155 -0
- package/dist/tools/skills-manage.js.map +1 -0
- package/dist/tools/web-search.d.ts +4 -0
- package/dist/tools/web-search.d.ts.map +1 -0
- package/dist/tools/web-search.js +60 -0
- package/dist/tools/web-search.js.map +1 -0
- package/dist/tts.d.ts +6 -0
- package/dist/tts.d.ts.map +1 -0
- package/dist/tts.js +42 -0
- package/dist/tts.js.map +1 -0
- package/dist/types/task.d.ts +7 -0
- package/dist/types/task.d.ts.map +1 -0
- package/dist/types/task.js +2 -0
- package/dist/types/task.js.map +1 -0
- package/dist/typing.d.ts +18 -0
- package/dist/typing.d.ts.map +1 -0
- package/dist/typing.js +63 -0
- package/dist/typing.js.map +1 -0
- package/dist/usage.d.ts +28 -0
- package/dist/usage.d.ts.map +1 -0
- package/dist/usage.js +69 -0
- package/dist/usage.js.map +1 -0
- package/dist/voice.d.ts +6 -0
- package/dist/voice.d.ts.map +1 -0
- package/dist/voice.js +47 -0
- package/dist/voice.js.map +1 -0
- package/dist/webchat/index.d.ts +3 -0
- package/dist/webchat/index.d.ts.map +1 -0
- package/dist/webchat/index.js +3 -0
- package/dist/webchat/index.js.map +1 -0
- package/dist/webchat/public/index.html +344 -0
- package/dist/webchat/public/public/index.html +344 -0
- package/dist/webchat/public/public/task-list-widget.js +410 -0
- package/dist/webchat/public/task-list-widget.js +410 -0
- package/dist/webchat/server.d.ts +3 -0
- package/dist/webchat/server.d.ts.map +1 -0
- package/dist/webchat/server.js +80 -0
- package/dist/webchat/server.js.map +1 -0
- package/dist/webchat/ws.d.ts +4 -0
- package/dist/webchat/ws.d.ts.map +1 -0
- package/dist/webchat/ws.js +232 -0
- package/dist/webchat/ws.js.map +1 -0
- package/dist/webhooks/index.d.ts +14 -0
- package/dist/webhooks/index.d.ts.map +1 -0
- package/dist/webhooks/index.js +86 -0
- package/dist/webhooks/index.js.map +1 -0
- 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(/&/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(/&/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 @@
|
|
|
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
|
package/dist/tts.js.map
ADDED
|
@@ -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 @@
|
|
|
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 @@
|
|
|
1
|
+
{"version":3,"file":"task.js","sourceRoot":"","sources":["../../src/types/task.ts"],"names":[],"mappings":""}
|
package/dist/typing.d.ts
ADDED
|
@@ -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":"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"}
|
package/dist/usage.d.ts
ADDED
|
@@ -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":"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"}
|
package/dist/voice.d.ts
ADDED
|
@@ -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 @@
|
|
|
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 @@
|
|
|
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"}
|