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
package/dist/sessions.js
ADDED
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
import Database from "better-sqlite3";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import fs from "node:fs";
|
|
4
|
+
import { chatCompletion } from "./llm.js";
|
|
5
|
+
import { tools, getTool } from "./tools/index.js";
|
|
6
|
+
import { getActiveModel } from "./llm/index.js";
|
|
7
|
+
import { logUsage, estimateCost } from "./usage.js";
|
|
8
|
+
import { getDataDir } from "./paths.js";
|
|
9
|
+
const DATA_DIR = getDataDir();
|
|
10
|
+
fs.mkdirSync(DATA_DIR, { recursive: true });
|
|
11
|
+
const DB_PATH = path.join(DATA_DIR, "cf-claw.db");
|
|
12
|
+
const db = new Database(DB_PATH);
|
|
13
|
+
db.exec(`
|
|
14
|
+
CREATE TABLE IF NOT EXISTS agent_sessions (
|
|
15
|
+
id TEXT PRIMARY KEY,
|
|
16
|
+
name TEXT NOT NULL,
|
|
17
|
+
system_prompt TEXT,
|
|
18
|
+
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
19
|
+
last_active TEXT NOT NULL DEFAULT (datetime('now'))
|
|
20
|
+
);
|
|
21
|
+
|
|
22
|
+
CREATE TABLE IF NOT EXISTS agent_session_messages (
|
|
23
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
24
|
+
session_id TEXT NOT NULL,
|
|
25
|
+
role TEXT NOT NULL CHECK(role IN ('user', 'assistant', 'tool')),
|
|
26
|
+
content TEXT NOT NULL,
|
|
27
|
+
tool_calls TEXT,
|
|
28
|
+
tool_call_id TEXT,
|
|
29
|
+
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
30
|
+
FOREIGN KEY (session_id) REFERENCES agent_sessions(id)
|
|
31
|
+
);
|
|
32
|
+
`);
|
|
33
|
+
const insertSession = db.prepare("INSERT INTO agent_sessions (id, name, system_prompt) VALUES (?, ?, ?)");
|
|
34
|
+
const getAllSessions = db.prepare("SELECT id, name, system_prompt, created_at, last_active FROM agent_sessions ORDER BY last_active DESC");
|
|
35
|
+
const getSession = db.prepare("SELECT id, name, system_prompt, created_at, last_active FROM agent_sessions WHERE id = ?");
|
|
36
|
+
const deleteSessionStmt = db.prepare("DELETE FROM agent_sessions WHERE id = ?");
|
|
37
|
+
const deleteSessionMsgs = db.prepare("DELETE FROM agent_session_messages WHERE session_id = ?");
|
|
38
|
+
const insertMsg = db.prepare("INSERT INTO agent_session_messages (session_id, role, content, tool_calls, tool_call_id) VALUES (?, ?, ?, ?, ?)");
|
|
39
|
+
const getSessionMsgs = db.prepare("SELECT role, content, tool_calls, tool_call_id FROM agent_session_messages WHERE session_id = ? ORDER BY id ASC LIMIT ?");
|
|
40
|
+
const updateLastActive = db.prepare("UPDATE agent_sessions SET last_active = datetime('now') WHERE id = ?");
|
|
41
|
+
export function sessionsCreate(name, systemPrompt) {
|
|
42
|
+
const id = `sess_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`;
|
|
43
|
+
insertSession.run(id, name, systemPrompt || null);
|
|
44
|
+
return {
|
|
45
|
+
id,
|
|
46
|
+
name,
|
|
47
|
+
systemPrompt: systemPrompt || undefined,
|
|
48
|
+
createdAt: new Date().toISOString(),
|
|
49
|
+
lastActive: new Date().toISOString(),
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
export function sessionsList() {
|
|
53
|
+
const rows = getAllSessions.all();
|
|
54
|
+
return rows.map((r) => ({
|
|
55
|
+
id: r.id,
|
|
56
|
+
name: r.name,
|
|
57
|
+
systemPrompt: r.system_prompt || undefined,
|
|
58
|
+
createdAt: r.created_at,
|
|
59
|
+
lastActive: r.last_active,
|
|
60
|
+
}));
|
|
61
|
+
}
|
|
62
|
+
export function sessionsHistory(sessionId, limit = 20) {
|
|
63
|
+
const rows = getSessionMsgs.all(sessionId, limit);
|
|
64
|
+
return rows.map((r) => ({
|
|
65
|
+
role: r.role,
|
|
66
|
+
content: r.content,
|
|
67
|
+
toolCalls: r.tool_calls || undefined,
|
|
68
|
+
toolCallId: r.tool_call_id || undefined,
|
|
69
|
+
}));
|
|
70
|
+
}
|
|
71
|
+
export function sessionsDelete(sessionId) {
|
|
72
|
+
deleteSessionMsgs.run(sessionId);
|
|
73
|
+
const result = deleteSessionStmt.run(sessionId);
|
|
74
|
+
return result.changes > 0;
|
|
75
|
+
}
|
|
76
|
+
export async function sessionsSend(sessionId, message) {
|
|
77
|
+
const session = getSession.get(sessionId);
|
|
78
|
+
if (!session) {
|
|
79
|
+
return `Error: Session "${sessionId}" not found. Use sessions_list to see available sessions.`;
|
|
80
|
+
}
|
|
81
|
+
insertMsg.run(sessionId, "user", message, null, null);
|
|
82
|
+
updateLastActive.run(sessionId);
|
|
83
|
+
const historyRows = getSessionMsgs.all(sessionId, 50);
|
|
84
|
+
const messages = [];
|
|
85
|
+
if (session.system_prompt) {
|
|
86
|
+
messages.push({ role: "system", content: session.system_prompt });
|
|
87
|
+
}
|
|
88
|
+
for (const row of historyRows) {
|
|
89
|
+
const msg = { role: row.role, content: row.content };
|
|
90
|
+
if (row.tool_calls) {
|
|
91
|
+
msg.tool_calls = JSON.parse(row.tool_calls);
|
|
92
|
+
}
|
|
93
|
+
if (row.tool_call_id) {
|
|
94
|
+
msg.tool_call_id = row.tool_call_id;
|
|
95
|
+
}
|
|
96
|
+
messages.push(msg);
|
|
97
|
+
}
|
|
98
|
+
const startTime = Date.now();
|
|
99
|
+
const response = await chatCompletion(messages, tools);
|
|
100
|
+
const latency = Date.now() - startTime;
|
|
101
|
+
const usage = response.usage;
|
|
102
|
+
if (usage) {
|
|
103
|
+
logUsage({
|
|
104
|
+
model: getActiveModel(),
|
|
105
|
+
promptTokens: usage.promptTokens ?? 0,
|
|
106
|
+
completionTokens: usage.completionTokens ?? 0,
|
|
107
|
+
totalTokens: (usage.promptTokens ?? 0) + (usage.completionTokens ?? 0),
|
|
108
|
+
costUsd: estimateCost(getActiveModel(), usage.promptTokens ?? 0, usage.completionTokens ?? 0),
|
|
109
|
+
latencyMs: latency,
|
|
110
|
+
toolCalls: 0,
|
|
111
|
+
source: "session",
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
const toolCalls = response.toolCalls;
|
|
115
|
+
if (!toolCalls || toolCalls.length === 0) {
|
|
116
|
+
const reply = response.content || "(no response)";
|
|
117
|
+
insertMsg.run(sessionId, "assistant", reply, null, null);
|
|
118
|
+
return reply;
|
|
119
|
+
}
|
|
120
|
+
const assistantToolCalls = toolCalls.map((tc) => ({
|
|
121
|
+
id: tc.id,
|
|
122
|
+
function: { name: tc.name, arguments: tc.arguments },
|
|
123
|
+
}));
|
|
124
|
+
insertMsg.run(sessionId, "assistant", response.content || "", JSON.stringify(assistantToolCalls), null);
|
|
125
|
+
for (const tc of toolCalls) {
|
|
126
|
+
const tool = getTool(tc.name);
|
|
127
|
+
if (!tool) {
|
|
128
|
+
insertMsg.run(sessionId, "tool", `Unknown tool: ${tc.name}`, null, tc.id);
|
|
129
|
+
continue;
|
|
130
|
+
}
|
|
131
|
+
try {
|
|
132
|
+
const args = JSON.parse(tc.arguments);
|
|
133
|
+
const result = await tool.execute(args);
|
|
134
|
+
insertMsg.run(sessionId, "tool", result, null, tc.id);
|
|
135
|
+
}
|
|
136
|
+
catch (err) {
|
|
137
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
138
|
+
insertMsg.run(sessionId, "tool", `Error: ${msg}`, null, tc.id);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
const newHistory = getSessionMsgs.all(sessionId, 60);
|
|
142
|
+
const newMessages = [];
|
|
143
|
+
if (session.system_prompt) {
|
|
144
|
+
newMessages.push({ role: "system", content: session.system_prompt });
|
|
145
|
+
}
|
|
146
|
+
for (const row of newHistory) {
|
|
147
|
+
const m = { role: row.role, content: row.content };
|
|
148
|
+
if (row.tool_calls)
|
|
149
|
+
m.tool_calls = JSON.parse(row.tool_calls);
|
|
150
|
+
if (row.tool_call_id)
|
|
151
|
+
m.tool_call_id = row.tool_call_id;
|
|
152
|
+
newMessages.push(m);
|
|
153
|
+
}
|
|
154
|
+
const followUpStart = Date.now();
|
|
155
|
+
const followUp = await chatCompletion(newMessages, tools);
|
|
156
|
+
const followUpLatency = Date.now() - followUpStart;
|
|
157
|
+
const fUsage = followUp.usage;
|
|
158
|
+
if (fUsage) {
|
|
159
|
+
logUsage({
|
|
160
|
+
model: getActiveModel(),
|
|
161
|
+
promptTokens: fUsage.promptTokens ?? 0,
|
|
162
|
+
completionTokens: fUsage.completionTokens ?? 0,
|
|
163
|
+
totalTokens: (fUsage.promptTokens ?? 0) + (fUsage.completionTokens ?? 0),
|
|
164
|
+
costUsd: estimateCost(getActiveModel(), fUsage.promptTokens ?? 0, fUsage.completionTokens ?? 0),
|
|
165
|
+
latencyMs: followUpLatency,
|
|
166
|
+
toolCalls: toolCalls.length,
|
|
167
|
+
source: "session",
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
const reply = followUp.content || "(no response)";
|
|
171
|
+
insertMsg.run(sessionId, "assistant", reply, null, null);
|
|
172
|
+
updateLastActive.run(sessionId);
|
|
173
|
+
return reply;
|
|
174
|
+
}
|
|
175
|
+
process.on("exit", () => db.close());
|
|
176
|
+
//# sourceMappingURL=sessions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sessions.js","sourceRoot":"","sources":["../src/sessions.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export interface Skill {
|
|
2
|
+
name: string;
|
|
3
|
+
description: string;
|
|
4
|
+
instructions: string;
|
|
5
|
+
filename: string;
|
|
6
|
+
source: "manual" | "agent";
|
|
7
|
+
}
|
|
8
|
+
export declare function loadSkills(): void;
|
|
9
|
+
export declare function reloadSkills(): void;
|
|
10
|
+
export declare function listLoadedSkills(): Skill[];
|
|
11
|
+
export declare function getSkillsIndex(): string;
|
|
12
|
+
export declare function getSkillsContext(): string;
|
|
13
|
+
export declare function getSkillByName(name: string): Skill | undefined;
|
|
14
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/skills/index.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,KAAK;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,QAAQ,GAAG,OAAO,CAAC;CAC5B;AA6ED,wBAAgB,UAAU,IAAI,IAAI,CA8BjC;AAED,wBAAgB,YAAY,IAAI,IAAI,CAEnC;AAED,wBAAgB,gBAAgB,IAAI,KAAK,EAAE,CAE1C;AAED,wBAAgB,cAAc,IAAI,MAAM,CAQvC;AAED,wBAAgB,gBAAgB,IAAI,MAAM,CAQzC;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,KAAK,GAAG,SAAS,CAK9D"}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { getSkillsDir, getAgentSkillsDir } from "../paths.js";
|
|
4
|
+
const MANUAL_SKILLS_DIR = getSkillsDir();
|
|
5
|
+
const AGENT_SKILLS_DIR = getAgentSkillsDir();
|
|
6
|
+
const loadedSkills = [];
|
|
7
|
+
let cacheValid = false;
|
|
8
|
+
function parseManualSkill(filePath, filename) {
|
|
9
|
+
try {
|
|
10
|
+
const content = fs.readFileSync(filePath, "utf-8");
|
|
11
|
+
const lines = content.split("\n");
|
|
12
|
+
let name = filename.replace(/\.md$/i, "");
|
|
13
|
+
let description = "";
|
|
14
|
+
let instructionsStart = 0;
|
|
15
|
+
for (let i = 0; i < lines.length; i++) {
|
|
16
|
+
const line = lines[i].trim();
|
|
17
|
+
if (line.startsWith("# ")) {
|
|
18
|
+
name = line.replace(/^#\s+/, "").trim();
|
|
19
|
+
continue;
|
|
20
|
+
}
|
|
21
|
+
if (line.toLowerCase().startsWith("description:") || line.toLowerCase().startsWith("desc:")) {
|
|
22
|
+
description = line.replace(/^(description|desc):\s*/i, "").trim();
|
|
23
|
+
continue;
|
|
24
|
+
}
|
|
25
|
+
if (line.startsWith("---")) {
|
|
26
|
+
instructionsStart = i + 1;
|
|
27
|
+
break;
|
|
28
|
+
}
|
|
29
|
+
if (line.length > 0 && !line.startsWith("#") && !description) {
|
|
30
|
+
description = line;
|
|
31
|
+
instructionsStart = i + 1;
|
|
32
|
+
break;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
const instructions = lines.slice(instructionsStart).join("\n").trim();
|
|
36
|
+
if (!instructions)
|
|
37
|
+
return null;
|
|
38
|
+
return { name, description: description || name, instructions, filename, source: "manual" };
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
return null;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
function parseAgentSkill(dirPath, dirName) {
|
|
45
|
+
try {
|
|
46
|
+
const skillFile = path.join(dirPath, "SKILL.md");
|
|
47
|
+
if (!fs.existsSync(skillFile))
|
|
48
|
+
return null;
|
|
49
|
+
const content = fs.readFileSync(skillFile, "utf-8");
|
|
50
|
+
const fmMatch = content.match(/^---\n([\s\S]*?)\n---\n?/);
|
|
51
|
+
let description = dirName;
|
|
52
|
+
let name = dirName;
|
|
53
|
+
if (fmMatch) {
|
|
54
|
+
const descMatch = fmMatch[1].match(/description:\s*(.+)/);
|
|
55
|
+
if (descMatch)
|
|
56
|
+
description = descMatch[1].trim();
|
|
57
|
+
const nameMatch = fmMatch[1].match(/name:\s*(.+)/);
|
|
58
|
+
if (nameMatch)
|
|
59
|
+
name = nameMatch[1].trim();
|
|
60
|
+
}
|
|
61
|
+
const instructions = fmMatch
|
|
62
|
+
? content.slice(fmMatch[0].length).trim()
|
|
63
|
+
: content.trim();
|
|
64
|
+
if (!instructions)
|
|
65
|
+
return null;
|
|
66
|
+
return { name, description, instructions, filename: `${dirName}/SKILL.md`, source: "agent" };
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
return null;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
export function loadSkills() {
|
|
73
|
+
loadedSkills.length = 0;
|
|
74
|
+
cacheValid = false;
|
|
75
|
+
if (!fs.existsSync(MANUAL_SKILLS_DIR)) {
|
|
76
|
+
fs.mkdirSync(MANUAL_SKILLS_DIR, { recursive: true });
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
const files = fs.readdirSync(MANUAL_SKILLS_DIR).filter((f) => f.endsWith(".md"));
|
|
80
|
+
for (const file of files) {
|
|
81
|
+
const skill = parseManualSkill(path.join(MANUAL_SKILLS_DIR, file), file);
|
|
82
|
+
if (skill)
|
|
83
|
+
loadedSkills.push(skill);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
if (fs.existsSync(AGENT_SKILLS_DIR)) {
|
|
87
|
+
try {
|
|
88
|
+
const entries = fs.readdirSync(AGENT_SKILLS_DIR, { withFileTypes: true });
|
|
89
|
+
for (const entry of entries) {
|
|
90
|
+
if (!entry.isDirectory())
|
|
91
|
+
continue;
|
|
92
|
+
const skill = parseAgentSkill(path.join(AGENT_SKILLS_DIR, entry.name), entry.name);
|
|
93
|
+
if (skill)
|
|
94
|
+
loadedSkills.push(skill);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
catch { }
|
|
98
|
+
}
|
|
99
|
+
cacheValid = true;
|
|
100
|
+
if (loadedSkills.length > 0) {
|
|
101
|
+
console.log(`📖 ${loadedSkills.length} skill(s) loaded (${loadedSkills.filter((s) => s.source === "manual").length} manual, ${loadedSkills.filter((s) => s.source === "agent").length} agent)`);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
export function reloadSkills() {
|
|
105
|
+
loadSkills();
|
|
106
|
+
}
|
|
107
|
+
export function listLoadedSkills() {
|
|
108
|
+
return loadedSkills;
|
|
109
|
+
}
|
|
110
|
+
export function getSkillsIndex() {
|
|
111
|
+
if (loadedSkills.length === 0)
|
|
112
|
+
return "";
|
|
113
|
+
const parts = loadedSkills.map((s) => `- **${s.name}**: ${s.description} [${s.source}]`);
|
|
114
|
+
return `## Available Skills\nUse skill_view to load a skill's full instructions.\n\n${parts.join("\n")}`;
|
|
115
|
+
}
|
|
116
|
+
export function getSkillsContext() {
|
|
117
|
+
if (loadedSkills.length === 0)
|
|
118
|
+
return "";
|
|
119
|
+
const parts = loadedSkills.map((s) => `### Skill: ${s.name}\n${s.instructions}`);
|
|
120
|
+
return `\n\n## Active Skills\n${parts.join("\n\n")}`;
|
|
121
|
+
}
|
|
122
|
+
export function getSkillByName(name) {
|
|
123
|
+
const lower = name.toLowerCase();
|
|
124
|
+
return loadedSkills.find((s) => s.name.toLowerCase() === lower || s.filename.toLowerCase().includes(lower));
|
|
125
|
+
}
|
|
126
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/skills/index.ts"],"names":[],"mappings":"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"}
|
package/dist/swarm.d.ts
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export interface SwarmResult {
|
|
2
|
+
text: string;
|
|
3
|
+
agents: {
|
|
4
|
+
name: string;
|
|
5
|
+
output: string;
|
|
6
|
+
toolCalls: number;
|
|
7
|
+
}[];
|
|
8
|
+
}
|
|
9
|
+
export declare function runSwarm(task: string, options?: {
|
|
10
|
+
agents?: string[];
|
|
11
|
+
team?: string;
|
|
12
|
+
}): Promise<SwarmResult>;
|
|
13
|
+
export declare function parseSwarmCommand(text: string): {
|
|
14
|
+
task: string;
|
|
15
|
+
agents?: string[];
|
|
16
|
+
team?: string;
|
|
17
|
+
} | null;
|
|
18
|
+
//# sourceMappingURL=swarm.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"swarm.d.ts","sourceRoot":"","sources":["../src/swarm.ts"],"names":[],"mappings":"AAgHA,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CAC/D;AAED,wBAAsB,QAAQ,CAC5B,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GAC7C,OAAO,CAAC,WAAW,CAAC,CA8CtB;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAgBzG"}
|
package/dist/swarm.js
ADDED
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import { chatCompletion as registryChatCompletion } from "./llm/index.js";
|
|
2
|
+
import { getTool, tools } from "./tools/index.js";
|
|
3
|
+
import { logUsage, estimateCost } from "./usage.js";
|
|
4
|
+
import { getActiveModel } from "./llm/index.js";
|
|
5
|
+
import { listAgents, getAgent } from "./agents.js";
|
|
6
|
+
function toolsToDefinitions(toolNames) {
|
|
7
|
+
return toolNames
|
|
8
|
+
.map((name) => {
|
|
9
|
+
const t = tools.find((tool) => tool.name === name);
|
|
10
|
+
if (!t)
|
|
11
|
+
return null;
|
|
12
|
+
return { name: t.name, description: t.description, parameters: t.input_schema };
|
|
13
|
+
})
|
|
14
|
+
.filter((t) => t !== null);
|
|
15
|
+
}
|
|
16
|
+
async function runSwarmAgentInternal(agentDef, task, contextFromPrevious, maxIterations = 5) {
|
|
17
|
+
const systemPrompt = agentDef.systemPrompt +
|
|
18
|
+
(agentDef.rules.length > 0
|
|
19
|
+
? `\n\n## Special Rules\n${agentDef.rules.map((r) => `- ${r}`).join("\n")}`
|
|
20
|
+
: "");
|
|
21
|
+
const toolDefs = toolsToDefinitions(agentDef.tools);
|
|
22
|
+
const messages = [
|
|
23
|
+
{
|
|
24
|
+
role: "system",
|
|
25
|
+
content: `${systemPrompt}\n\n## Context from previous agents\n${contextFromPrevious || "No previous context."}`,
|
|
26
|
+
},
|
|
27
|
+
{ role: "user", content: task },
|
|
28
|
+
];
|
|
29
|
+
let totalToolCalls = 0;
|
|
30
|
+
const startTime = Date.now();
|
|
31
|
+
for (let i = 0; i < maxIterations; i++) {
|
|
32
|
+
const iterStart = Date.now();
|
|
33
|
+
const response = await registryChatCompletion({
|
|
34
|
+
messages,
|
|
35
|
+
tools: toolDefs.length > 0 ? toolDefs : undefined,
|
|
36
|
+
});
|
|
37
|
+
const iterLatency = Date.now() - iterStart;
|
|
38
|
+
const usage = response.usage;
|
|
39
|
+
if (usage) {
|
|
40
|
+
logUsage({
|
|
41
|
+
model: getActiveModel(),
|
|
42
|
+
promptTokens: usage.promptTokens,
|
|
43
|
+
completionTokens: usage.completionTokens,
|
|
44
|
+
totalTokens: usage.promptTokens + usage.completionTokens,
|
|
45
|
+
costUsd: estimateCost(getActiveModel(), usage.promptTokens, usage.completionTokens),
|
|
46
|
+
latencyMs: iterLatency,
|
|
47
|
+
toolCalls: 0,
|
|
48
|
+
source: `swarm:${agentDef.name}`,
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
if (!response.toolCalls || response.toolCalls.length === 0) {
|
|
52
|
+
return {
|
|
53
|
+
agent: agentDef.name,
|
|
54
|
+
output: response.content || "(no response)",
|
|
55
|
+
toolCalls: totalToolCalls,
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
totalToolCalls += response.toolCalls.length;
|
|
59
|
+
messages.push({
|
|
60
|
+
role: "assistant",
|
|
61
|
+
content: response.content || null,
|
|
62
|
+
tool_calls: response.toolCalls.map((tc) => ({
|
|
63
|
+
id: tc.id,
|
|
64
|
+
function: { name: tc.name, arguments: tc.arguments },
|
|
65
|
+
})),
|
|
66
|
+
});
|
|
67
|
+
for (const tc of response.toolCalls) {
|
|
68
|
+
const tool = getTool(tc.name);
|
|
69
|
+
if (!tool) {
|
|
70
|
+
messages.push({ role: "tool", tool_call_id: tc.id, content: `Unknown tool: ${tc.name}` });
|
|
71
|
+
continue;
|
|
72
|
+
}
|
|
73
|
+
try {
|
|
74
|
+
const args = JSON.parse(tc.arguments);
|
|
75
|
+
const result = await tool.execute(args);
|
|
76
|
+
messages.push({ role: "tool", tool_call_id: tc.id, content: result });
|
|
77
|
+
}
|
|
78
|
+
catch (err) {
|
|
79
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
80
|
+
messages.push({ role: "tool", tool_call_id: tc.id, content: `Error: ${msg}` });
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
return {
|
|
85
|
+
agent: agentDef.name,
|
|
86
|
+
output: "Max iterations reached.",
|
|
87
|
+
toolCalls: totalToolCalls,
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
export async function runSwarm(task, options) {
|
|
91
|
+
let agentDefs;
|
|
92
|
+
if (options?.agents && options.agents.length > 0) {
|
|
93
|
+
agentDefs = options.agents
|
|
94
|
+
.map((name) => getAgent(name.toLowerCase()))
|
|
95
|
+
.filter((a) => a !== null);
|
|
96
|
+
}
|
|
97
|
+
else if (options?.team && options.team.length > 0) {
|
|
98
|
+
agentDefs = listAgents(options.team);
|
|
99
|
+
}
|
|
100
|
+
else {
|
|
101
|
+
agentDefs = listAgents();
|
|
102
|
+
}
|
|
103
|
+
if (agentDefs.length === 0) {
|
|
104
|
+
return { text: "No agents selected for the swarm.", agents: [] };
|
|
105
|
+
}
|
|
106
|
+
const results = [];
|
|
107
|
+
let context = "";
|
|
108
|
+
for (const agentDef of agentDefs) {
|
|
109
|
+
console.log(`🐝 Swarm agent "${agentDef.name}" starting`);
|
|
110
|
+
const result = await runSwarmAgentInternal(agentDef, task, context);
|
|
111
|
+
results.push(result);
|
|
112
|
+
context += `\n### ${agentDef.name} output:\n${result.output}\n`;
|
|
113
|
+
console.log(`🐝 Swarm agent "${agentDef.name}" done (${result.toolCalls} tool calls)`);
|
|
114
|
+
}
|
|
115
|
+
const synthesizerPrompt = `You are CF Claw. Synthesize the following agent outputs into a single, cohesive, helpful response for the user. Do not mention agents or internal process - just give the user a great answer.
|
|
116
|
+
|
|
117
|
+
## Task: ${task}
|
|
118
|
+
|
|
119
|
+
${results.map((r) => `### ${r.agent}:\n${r.output}`).join("\n\n")}
|
|
120
|
+
|
|
121
|
+
Provide a clear, comprehensive final answer:`;
|
|
122
|
+
const synthResponse = await registryChatCompletion({
|
|
123
|
+
messages: [{ role: "user", content: synthesizerPrompt }],
|
|
124
|
+
});
|
|
125
|
+
const finalText = synthResponse.content || results[results.length - 1]?.output || "No result.";
|
|
126
|
+
return {
|
|
127
|
+
text: finalText,
|
|
128
|
+
agents: results.map((r) => ({ name: r.agent, output: r.output, toolCalls: r.toolCalls })),
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
export function parseSwarmCommand(text) {
|
|
132
|
+
let agents;
|
|
133
|
+
let team;
|
|
134
|
+
const agentMatch = text.match(/--agents?\s+(\S+(?:,\S+)*)/);
|
|
135
|
+
const teamMatch = text.match(/--team\s+(\S+)/);
|
|
136
|
+
if (agentMatch)
|
|
137
|
+
agents = agentMatch[1].split(",");
|
|
138
|
+
if (teamMatch)
|
|
139
|
+
team = teamMatch[1];
|
|
140
|
+
const rest = text.replace(/^\/swarm\s*/, "").trim();
|
|
141
|
+
const cleaned = rest.replace(/--agents?\s+\S+/, "").replace(/--team\s+\S+/, "").trim();
|
|
142
|
+
if (!cleaned)
|
|
143
|
+
return null;
|
|
144
|
+
return { task: cleaned, agents: agents?.length ? agents : undefined, team };
|
|
145
|
+
}
|
|
146
|
+
//# sourceMappingURL=swarm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"swarm.js","sourceRoot":"","sources":["../src/swarm.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,IAAI,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AAC1E,OAAO,EAAE,OAAO,EAAE,KAAK,EAAa,MAAM,kBAAkB,CAAC;AAC7D,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAwB,MAAM,aAAa,CAAC;AAGzE,SAAS,kBAAkB,CAAC,SAAmB;IAC7C,OAAO,SAAS;SACb,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACZ,MAAM,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;QACnD,IAAI,CAAC,CAAC;YAAE,OAAO,IAAI,CAAC;QACpB,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC,WAAW,EAAE,UAAU,EAAE,CAAC,CAAC,YAAY,EAAE,CAAC;IAClF,CAAC,CAAC;SACD,MAAM,CAAC,CAAC,CAAC,EAAuB,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;AACpD,CAAC;AAQD,KAAK,UAAU,qBAAqB,CAClC,QAAyB,EACzB,IAAY,EACZ,mBAA2B,EAC3B,gBAAwB,CAAC;IAEzB,MAAM,YAAY,GAAG,QAAQ,CAAC,YAAY;QACxC,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC;YACxB,CAAC,CAAC,yBAAyB,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;YAC3E,CAAC,CAAC,EAAE,CAAC,CAAC;IAEV,MAAM,QAAQ,GAAG,kBAAkB,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IACpD,MAAM,QAAQ,GAA0B;QACtC;YACE,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE,GAAG,YAAY,wCAAwC,mBAAmB,IAAI,sBAAsB,EAAE;SAChH;QACD,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE;KAChC,CAAC;IAEF,IAAI,cAAc,GAAG,CAAC,CAAC;IACvB,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAE7B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,aAAa,EAAE,CAAC,EAAE,EAAE,CAAC;QACvC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC7B,MAAM,QAAQ,GAAG,MAAM,sBAAsB,CAAC;YAC5C,QAAQ;YACR,KAAK,EAAE,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS;SAClD,CAAC,CAAC;QACH,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;QAE3C,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC;QAC7B,IAAI,KAAK,EAAE,CAAC;YACV,QAAQ,CAAC;gBACP,KAAK,EAAE,cAAc,EAAE;gBACvB,YAAY,EAAE,KAAK,CAAC,YAAY;gBAChC,gBAAgB,EAAE,KAAK,CAAC,gBAAgB;gBACxC,WAAW,EAAE,KAAK,CAAC,YAAY,GAAG,KAAK,CAAC,gBAAgB;gBACxD,OAAO,EAAE,YAAY,CAAC,cAAc,EAAE,EAAE,KAAK,CAAC,YAAY,EAAE,KAAK,CAAC,gBAAgB,CAAC;gBACnF,SAAS,EAAE,WAAW;gBACtB,SAAS,EAAE,CAAC;gBACZ,MAAM,EAAE,SAAS,QAAQ,CAAC,IAAI,EAAE;aACjC,CAAC,CAAC;QACL,CAAC;QAED,IAAI,CAAC,QAAQ,CAAC,SAAS,IAAI,QAAQ,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3D,OAAO;gBACL,KAAK,EAAE,QAAQ,CAAC,IAAI;gBACpB,MAAM,EAAE,QAAQ,CAAC,OAAO,IAAI,eAAe;gBAC3C,SAAS,EAAE,cAAc;aAC1B,CAAC;QACJ,CAAC;QAED,cAAc,IAAI,QAAQ,CAAC,SAAS,CAAC,MAAM,CAAC;QAE5C,QAAQ,CAAC,IAAI,CAAC;YACZ,IAAI,EAAE,WAAW;YACjB,OAAO,EAAE,QAAQ,CAAC,OAAO,IAAI,IAAI;YACjC,UAAU,EAAE,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;gBAC1C,EAAE,EAAE,EAAE,CAAC,EAAE;gBACT,QAAQ,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,SAAS,EAAE,EAAE,CAAC,SAAS,EAAE;aACrD,CAAC,CAAC;SACJ,CAAC,CAAC;QAEH,KAAK,MAAM,EAAE,IAAI,QAAQ,CAAC,SAAS,EAAE,CAAC;YACpC,MAAM,IAAI,GAAG,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;YAC9B,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,iBAAiB,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;gBAC1F,SAAS;YACX,CAAC;YAED,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC;gBACtC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;gBACxC,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;YACxE,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBAC7D,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,UAAU,GAAG,EAAE,EAAE,CAAC,CAAC;YACjF,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO;QACL,KAAK,EAAE,QAAQ,CAAC,IAAI;QACpB,MAAM,EAAE,yBAAyB;QACjC,SAAS,EAAE,cAAc;KAC1B,CAAC;AACJ,CAAC;AAOD,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC5B,IAAY,EACZ,OAA8C;IAE9C,IAAI,SAA4B,CAAC;IAEjC,IAAI,OAAO,EAAE,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACjD,SAAS,GAAG,OAAO,CAAC,MAAM;aACvB,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;aAC3C,MAAM,CAAC,CAAC,CAAC,EAAwB,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;IACrD,CAAC;SAAM,IAAI,OAAO,EAAE,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpD,SAAS,GAAG,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACvC,CAAC;SAAM,CAAC;QACN,SAAS,GAAG,UAAU,EAAE,CAAC;IAC3B,CAAC;IAED,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3B,OAAO,EAAE,IAAI,EAAE,mCAAmC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;IACnE,CAAC;IAED,MAAM,OAAO,GAAqB,EAAE,CAAC;IACrC,IAAI,OAAO,GAAG,EAAE,CAAC;IAEjB,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QACjC,OAAO,CAAC,GAAG,CAAC,mBAAmB,QAAQ,CAAC,IAAI,YAAY,CAAC,CAAC;QAC1D,MAAM,MAAM,GAAG,MAAM,qBAAqB,CAAC,QAAQ,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;QACpE,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACrB,OAAO,IAAI,SAAS,QAAQ,CAAC,IAAI,aAAa,MAAM,CAAC,MAAM,IAAI,CAAC;QAChE,OAAO,CAAC,GAAG,CAAC,mBAAmB,QAAQ,CAAC,IAAI,WAAW,MAAM,CAAC,SAAS,cAAc,CAAC,CAAC;IACzF,CAAC;IAED,MAAM,iBAAiB,GAAG;;WAEjB,IAAI;;EAEb,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC;;6CAEpB,CAAC;IAE5C,MAAM,aAAa,GAAG,MAAM,sBAAsB,CAAC;QACjD,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,iBAAiB,EAAE,CAAC;KACzD,CAAC,CAAC;IAEH,MAAM,SAAS,GAAG,aAAa,CAAC,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,MAAM,IAAI,YAAY,CAAC;IAE/F,OAAO;QACL,IAAI,EAAE,SAAS;QACf,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;KAC1F,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,IAAY;IAC5C,IAAI,MAA4B,CAAC;IACjC,IAAI,IAAwB,CAAC;IAE7B,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC;IAC5D,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;IAE/C,IAAI,UAAU;QAAE,MAAM,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAClD,IAAI,SAAS;QAAE,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;IAEnC,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACpD,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAEvF,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAE1B,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,EAAE,IAAI,EAAE,CAAC;AAC9E,CAAC"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Task List Widget (US-3)
|
|
3
|
+
*
|
|
4
|
+
* Features:
|
|
5
|
+
* - Checkbox/toggle for each task item
|
|
6
|
+
* - Click handler updates task.completed in state
|
|
7
|
+
* - Visual indicator class (strikethrough + opacity) on completed tasks
|
|
8
|
+
* - Full keyboard accessibility
|
|
9
|
+
* - Proper label/checkbox association with id/for attributes
|
|
10
|
+
*
|
|
11
|
+
* NOTE: This widget is designed as a singleton. Calling mount() multiple times
|
|
12
|
+
* will unmount the previous instance. Only one instance is supported per page.
|
|
13
|
+
*/
|
|
14
|
+
interface Task {
|
|
15
|
+
id: string;
|
|
16
|
+
text: string;
|
|
17
|
+
completed: boolean;
|
|
18
|
+
}
|
|
19
|
+
type TaskInput = Partial<Task> & {
|
|
20
|
+
text: string;
|
|
21
|
+
};
|
|
22
|
+
/**
|
|
23
|
+
* Toggle the completed state of a task.
|
|
24
|
+
*
|
|
25
|
+
* Flow:
|
|
26
|
+
* 1. Find task in state array
|
|
27
|
+
* 2. Flip task.completed boolean
|
|
28
|
+
* 3. Update DOM: toggle visual indicator class
|
|
29
|
+
* 4. Update DOM: sync checkbox.checked property
|
|
30
|
+
* 5. Update DOM: sync aria-label for screen readers
|
|
31
|
+
* 6. Update count display
|
|
32
|
+
*/
|
|
33
|
+
declare function toggleCompleted(taskId: string): void;
|
|
34
|
+
/**
|
|
35
|
+
* Add a new task to the list.
|
|
36
|
+
*/
|
|
37
|
+
declare function addTask(text: string): Task;
|
|
38
|
+
/**
|
|
39
|
+
* Remove a task from the list.
|
|
40
|
+
*/
|
|
41
|
+
declare function removeTask(taskId: string): boolean;
|
|
42
|
+
/**
|
|
43
|
+
* Replace all tasks (e.g., for hydration from external source).
|
|
44
|
+
*/
|
|
45
|
+
declare function setTasks(newTasks: TaskInput[]): void;
|
|
46
|
+
/**
|
|
47
|
+
* Get a copy of the current tasks array.
|
|
48
|
+
*/
|
|
49
|
+
declare function getTasks(): Task[];
|
|
50
|
+
/**
|
|
51
|
+
* Mount the widget into a container element.
|
|
52
|
+
*
|
|
53
|
+
* NOTE: This widget is a singleton. Calling mount() multiple times will
|
|
54
|
+
* unmount any previous instance. Only one instance is supported per page.
|
|
55
|
+
*/
|
|
56
|
+
declare function mount(container: HTMLElement): void;
|
|
57
|
+
/**
|
|
58
|
+
* Unmount the widget and clean up.
|
|
59
|
+
*/
|
|
60
|
+
declare function unmount(): void;
|
|
61
|
+
interface TaskListWidgetAPI {
|
|
62
|
+
mount: typeof mount;
|
|
63
|
+
unmount: typeof unmount;
|
|
64
|
+
addTask: typeof addTask;
|
|
65
|
+
removeTask: typeof removeTask;
|
|
66
|
+
setTasks: typeof setTasks;
|
|
67
|
+
getTasks: typeof getTasks;
|
|
68
|
+
toggleCompleted: typeof toggleCompleted;
|
|
69
|
+
}
|
|
70
|
+
declare global {
|
|
71
|
+
interface Window {
|
|
72
|
+
__taskListWidget: TaskListWidgetAPI;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
export { mount, unmount, addTask, removeTask, setTasks, getTasks, toggleCompleted };
|
|
76
|
+
//# sourceMappingURL=taskListWidget.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"taskListWidget.d.ts","sourceRoot":"","sources":["../src/taskListWidget.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAIH,UAAU,IAAI;IACZ,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,KAAK,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAkHlD;;;;;;;;;;GAUG;AACH,iBAAS,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CA+B7C;AAED;;GAEG;AACH,iBAAS,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAUnC;AAED;;GAEG;AACH,iBAAS,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAkB3C;AAED;;GAEG;AACH,iBAAS,QAAQ,CAAC,QAAQ,EAAE,SAAS,EAAE,GAAG,IAAI,CAU7C;AAED;;GAEG;AACH,iBAAS,QAAQ,IAAI,IAAI,EAAE,CAE1B;AAED;;;;;GAKG;AACH,iBAAS,KAAK,CAAC,SAAS,EAAE,WAAW,GAAG,IAAI,CAiC3C;AAED;;GAEG;AACH,iBAAS,OAAO,IAAI,IAAI,CAQvB;AAID,UAAU,iBAAiB;IACzB,KAAK,EAAE,OAAO,KAAK,CAAC;IACpB,OAAO,EAAE,OAAO,OAAO,CAAC;IACxB,OAAO,EAAE,OAAO,OAAO,CAAC;IACxB,UAAU,EAAE,OAAO,UAAU,CAAC;IAC9B,QAAQ,EAAE,OAAO,QAAQ,CAAC;IAC1B,QAAQ,EAAE,OAAO,QAAQ,CAAC;IAC1B,eAAe,EAAE,OAAO,eAAe,CAAC;CACzC;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,MAAM;QACd,gBAAgB,EAAE,iBAAiB,CAAC;KACrC;CACF;AAmFD,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE,eAAe,EAAE,CAAC"}
|