claudeck 1.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/LICENSE +21 -0
- package/README.md +233 -0
- package/cli.js +2 -0
- package/config/agent-chains.json +16 -0
- package/config/agent-dags.json +16 -0
- package/config/agents.json +46 -0
- package/config/bot-prompt.json +3 -0
- package/config/folders.json +66 -0
- package/config/prompts.json +92 -0
- package/config/repos.json +86 -0
- package/config/telegram-config.json +17 -0
- package/config/workflows.json +90 -0
- package/db.js +1198 -0
- package/package.json +55 -0
- package/plugins/claude-editor/client.css +171 -0
- package/plugins/claude-editor/client.js +183 -0
- package/plugins/event-stream/client.css +207 -0
- package/plugins/event-stream/client.js +271 -0
- package/plugins/linear/client.css +345 -0
- package/plugins/linear/client.js +380 -0
- package/plugins/linear/config.json +5 -0
- package/plugins/linear/server.js +312 -0
- package/plugins/repos/client.css +549 -0
- package/plugins/repos/client.js +663 -0
- package/plugins/repos/server.js +232 -0
- package/plugins/sudoku/client.css +196 -0
- package/plugins/sudoku/client.js +329 -0
- package/plugins/tasks/client.css +414 -0
- package/plugins/tasks/client.js +394 -0
- package/plugins/tasks/server.js +116 -0
- package/plugins/tic-tac-toe/client.css +167 -0
- package/plugins/tic-tac-toe/client.js +241 -0
- package/public/css/core/components.css +232 -0
- package/public/css/core/layout.css +330 -0
- package/public/css/core/print.css +18 -0
- package/public/css/core/reset.css +36 -0
- package/public/css/core/responsive.css +378 -0
- package/public/css/core/theme.css +116 -0
- package/public/css/core/variables.css +93 -0
- package/public/css/features/agent-monitor.css +297 -0
- package/public/css/features/agent-sidebar.css +525 -0
- package/public/css/features/agents.css +996 -0
- package/public/css/features/analytics.css +181 -0
- package/public/css/features/background-sessions.css +321 -0
- package/public/css/features/cost-dashboard.css +168 -0
- package/public/css/features/home.css +313 -0
- package/public/css/features/retro-terminal.css +88 -0
- package/public/css/features/telegram.css +127 -0
- package/public/css/features/tour.css +148 -0
- package/public/css/features/voice-input.css +60 -0
- package/public/css/features/welcome.css +241 -0
- package/public/css/panels/assistant-bot.css +442 -0
- package/public/css/panels/dev-docs.css +292 -0
- package/public/css/panels/file-explorer.css +322 -0
- package/public/css/panels/git-panel.css +221 -0
- package/public/css/panels/mcp-manager.css +199 -0
- package/public/css/panels/tips-feed.css +353 -0
- package/public/css/ui/commands.css +273 -0
- package/public/css/ui/context-gauge.css +76 -0
- package/public/css/ui/file-picker.css +69 -0
- package/public/css/ui/image-attachments.css +106 -0
- package/public/css/ui/messages.css +884 -0
- package/public/css/ui/modals.css +122 -0
- package/public/css/ui/parallel.css +217 -0
- package/public/css/ui/permissions.css +110 -0
- package/public/css/ui/right-panel.css +481 -0
- package/public/css/ui/sessions.css +689 -0
- package/public/css/ui/status-bar.css +425 -0
- package/public/css/ui/toolbox.css +206 -0
- package/public/data/tips.json +218 -0
- package/public/icons/favicon.png +0 -0
- package/public/icons/icon-192.png +0 -0
- package/public/icons/icon-512.png +0 -0
- package/public/icons/whaly.png +0 -0
- package/public/index.html +1140 -0
- package/public/js/core/api.js +591 -0
- package/public/js/core/constants.js +3 -0
- package/public/js/core/dom.js +270 -0
- package/public/js/core/events.js +10 -0
- package/public/js/core/plugin-loader.js +153 -0
- package/public/js/core/store.js +39 -0
- package/public/js/core/utils.js +25 -0
- package/public/js/core/ws.js +64 -0
- package/public/js/features/agent-monitor.js +222 -0
- package/public/js/features/agents.js +1209 -0
- package/public/js/features/analytics.js +397 -0
- package/public/js/features/attachments.js +251 -0
- package/public/js/features/background-sessions.js +475 -0
- package/public/js/features/chat.js +589 -0
- package/public/js/features/cost-dashboard.js +152 -0
- package/public/js/features/dag-editor.js +399 -0
- package/public/js/features/easter-egg.js +46 -0
- package/public/js/features/home.js +270 -0
- package/public/js/features/projects.js +372 -0
- package/public/js/features/prompts.js +228 -0
- package/public/js/features/sessions.js +332 -0
- package/public/js/features/telegram.js +131 -0
- package/public/js/features/tour.js +210 -0
- package/public/js/features/voice-input.js +185 -0
- package/public/js/features/welcome.js +43 -0
- package/public/js/features/workflows.js +277 -0
- package/public/js/main.js +51 -0
- package/public/js/panels/assistant-bot.js +445 -0
- package/public/js/panels/dev-docs.js +380 -0
- package/public/js/panels/file-explorer.js +486 -0
- package/public/js/panels/git-panel.js +285 -0
- package/public/js/panels/mcp-manager.js +311 -0
- package/public/js/panels/tips-feed.js +303 -0
- package/public/js/ui/commands.js +114 -0
- package/public/js/ui/context-gauge.js +100 -0
- package/public/js/ui/diff.js +124 -0
- package/public/js/ui/disabled-tools.js +36 -0
- package/public/js/ui/export.js +74 -0
- package/public/js/ui/formatting.js +206 -0
- package/public/js/ui/header-dropdowns.js +72 -0
- package/public/js/ui/input-meta.js +71 -0
- package/public/js/ui/max-turns.js +21 -0
- package/public/js/ui/messages.js +387 -0
- package/public/js/ui/model-selector.js +20 -0
- package/public/js/ui/notifications.js +232 -0
- package/public/js/ui/parallel.js +176 -0
- package/public/js/ui/permissions.js +168 -0
- package/public/js/ui/right-panel.js +173 -0
- package/public/js/ui/shortcuts.js +143 -0
- package/public/js/ui/sidebar-toggle.js +29 -0
- package/public/js/ui/status-bar.js +172 -0
- package/public/js/ui/tab-sdk.js +623 -0
- package/public/js/ui/theme.js +38 -0
- package/public/manifest.json +13 -0
- package/public/offline.html +190 -0
- package/public/style.css +42 -0
- package/public/sw.js +91 -0
- package/server/agent-loop.js +385 -0
- package/server/dag-executor.js +265 -0
- package/server/orchestrator.js +514 -0
- package/server/paths.js +61 -0
- package/server/plugin-mount.js +56 -0
- package/server/push-sender.js +31 -0
- package/server/routes/agents.js +294 -0
- package/server/routes/bot.js +45 -0
- package/server/routes/exec.js +35 -0
- package/server/routes/files.js +218 -0
- package/server/routes/mcp.js +82 -0
- package/server/routes/messages.js +36 -0
- package/server/routes/notifications.js +37 -0
- package/server/routes/projects.js +207 -0
- package/server/routes/prompts.js +53 -0
- package/server/routes/sessions.js +103 -0
- package/server/routes/stats.js +143 -0
- package/server/routes/telegram.js +71 -0
- package/server/routes/tips.js +135 -0
- package/server/routes/workflows.js +81 -0
- package/server/summarizer.js +55 -0
- package/server/telegram-poller.js +205 -0
- package/server/telegram-sender.js +304 -0
- package/server/ws-handler.js +926 -0
- package/server.js +179 -0
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
// Agent Monitor — multi-agent monitoring dashboard
|
|
2
|
+
import { $ } from '../core/dom.js';
|
|
3
|
+
import { escapeHtml } from '../core/utils.js';
|
|
4
|
+
import * as api from '../core/api.js';
|
|
5
|
+
import { registerCommand } from '../ui/commands.js';
|
|
6
|
+
|
|
7
|
+
function formatDuration(ms) {
|
|
8
|
+
if (!ms) return "0s";
|
|
9
|
+
const secs = Math.round(ms / 1000);
|
|
10
|
+
if (secs < 60) return `${secs}s`;
|
|
11
|
+
const mins = Math.floor(secs / 60);
|
|
12
|
+
const s = secs % 60;
|
|
13
|
+
return s > 0 ? `${mins}m ${s}s` : `${mins}m`;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
function formatCost(n) {
|
|
17
|
+
if (!n) return "$0.00";
|
|
18
|
+
if (n < 0.01) return "$" + n.toFixed(4);
|
|
19
|
+
return "$" + n.toFixed(2);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
function formatTokens(n) {
|
|
23
|
+
if (!n) return "0";
|
|
24
|
+
if (n >= 1_000_000) return (n / 1_000_000).toFixed(1) + "M";
|
|
25
|
+
if (n >= 1_000) return (n / 1_000).toFixed(1) + "k";
|
|
26
|
+
return String(n);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
function pct(n, total) {
|
|
30
|
+
if (!total) return "0%";
|
|
31
|
+
return Math.round((n / total) * 100) + "%";
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export async function openAgentMonitor() {
|
|
35
|
+
$.agentMonitorModal.classList.remove("hidden");
|
|
36
|
+
try {
|
|
37
|
+
const data = await api.fetchAgentMetrics();
|
|
38
|
+
renderMonitor(data);
|
|
39
|
+
} catch (err) {
|
|
40
|
+
$.agentMonitorContent.innerHTML = `<div class="am-empty">Failed to load metrics</div>`;
|
|
41
|
+
console.error("Agent monitor error:", err);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
function closeAgentMonitor() {
|
|
46
|
+
$.agentMonitorModal.classList.add("hidden");
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
function renderMonitor(data) {
|
|
50
|
+
const el = $.agentMonitorContent;
|
|
51
|
+
const ov = data.overview || {};
|
|
52
|
+
const agents = data.agents || [];
|
|
53
|
+
const byType = data.byType || [];
|
|
54
|
+
const daily = data.daily || [];
|
|
55
|
+
const recent = data.recent || [];
|
|
56
|
+
|
|
57
|
+
const successRate = ov.total_runs > 0
|
|
58
|
+
? Math.round((ov.completed / ov.total_runs) * 100)
|
|
59
|
+
: 0;
|
|
60
|
+
|
|
61
|
+
let html = "";
|
|
62
|
+
|
|
63
|
+
// ── Summary cards ──
|
|
64
|
+
html += `<div class="am-cards">
|
|
65
|
+
<div class="am-card">
|
|
66
|
+
<div class="am-card-label">Total Runs</div>
|
|
67
|
+
<div class="am-card-value">${ov.total_runs || 0}</div>
|
|
68
|
+
</div>
|
|
69
|
+
<div class="am-card">
|
|
70
|
+
<div class="am-card-label">Total Cost</div>
|
|
71
|
+
<div class="am-card-value">${formatCost(ov.total_cost)}</div>
|
|
72
|
+
</div>
|
|
73
|
+
<div class="am-card">
|
|
74
|
+
<div class="am-card-label">Avg Duration</div>
|
|
75
|
+
<div class="am-card-value">${formatDuration(ov.avg_duration)}</div>
|
|
76
|
+
</div>
|
|
77
|
+
<div class="am-card">
|
|
78
|
+
<div class="am-card-label">Success Rate</div>
|
|
79
|
+
<div class="am-card-value ${successRate >= 80 ? 'am-success' : successRate >= 50 ? 'am-warn' : 'am-error'}">${successRate}%</div>
|
|
80
|
+
</div>
|
|
81
|
+
<div class="am-card">
|
|
82
|
+
<div class="am-card-label">Avg Turns</div>
|
|
83
|
+
<div class="am-card-value">${Math.round(ov.avg_turns || 0)}</div>
|
|
84
|
+
</div>
|
|
85
|
+
<div class="am-card">
|
|
86
|
+
<div class="am-card-label">Tokens</div>
|
|
87
|
+
<div class="am-card-value">${formatTokens((ov.total_input_tokens || 0) + (ov.total_output_tokens || 0))}</div>
|
|
88
|
+
</div>
|
|
89
|
+
</div>`;
|
|
90
|
+
|
|
91
|
+
// ── Run type breakdown ──
|
|
92
|
+
if (byType.length > 0) {
|
|
93
|
+
html += `<div class="am-section">
|
|
94
|
+
<div class="am-section-title">By Run Type</div>
|
|
95
|
+
<div class="am-type-grid">
|
|
96
|
+
${byType.map(t => `
|
|
97
|
+
<div class="am-type-card">
|
|
98
|
+
<span class="am-type-label">${escapeHtml(t.run_type)}</span>
|
|
99
|
+
<span class="am-type-runs">${t.runs} runs</span>
|
|
100
|
+
<span class="am-type-cost">${formatCost(t.cost)}</span>
|
|
101
|
+
</div>
|
|
102
|
+
`).join("")}
|
|
103
|
+
</div>
|
|
104
|
+
</div>`;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
// ── Agent leaderboard ──
|
|
108
|
+
if (agents.length > 0) {
|
|
109
|
+
html += `<div class="am-section">
|
|
110
|
+
<div class="am-section-title">Agent Leaderboard</div>
|
|
111
|
+
<table class="am-table">
|
|
112
|
+
<thead>
|
|
113
|
+
<tr>
|
|
114
|
+
<th>Agent</th>
|
|
115
|
+
<th>Runs</th>
|
|
116
|
+
<th>Success</th>
|
|
117
|
+
<th>Avg Duration</th>
|
|
118
|
+
<th>Avg Cost</th>
|
|
119
|
+
<th>Total Cost</th>
|
|
120
|
+
<th>Avg Turns</th>
|
|
121
|
+
</tr>
|
|
122
|
+
</thead>
|
|
123
|
+
<tbody>
|
|
124
|
+
${agents.map(a => {
|
|
125
|
+
const rate = a.runs > 0 ? Math.round((a.successes / a.runs) * 100) : 0;
|
|
126
|
+
return `<tr>
|
|
127
|
+
<td class="am-agent-name">${escapeHtml(a.agent_title)}</td>
|
|
128
|
+
<td>${a.runs}</td>
|
|
129
|
+
<td class="${rate >= 80 ? 'am-success' : rate >= 50 ? 'am-warn' : 'am-error'}">${rate}%</td>
|
|
130
|
+
<td>${formatDuration(a.avg_duration)}</td>
|
|
131
|
+
<td>${formatCost(a.avg_cost)}</td>
|
|
132
|
+
<td>${formatCost(a.total_cost)}</td>
|
|
133
|
+
<td>${Math.round(a.avg_turns)}</td>
|
|
134
|
+
</tr>`;
|
|
135
|
+
}).join("")}
|
|
136
|
+
</tbody>
|
|
137
|
+
</table>
|
|
138
|
+
</div>`;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
// ── Cost by agent bar chart ──
|
|
142
|
+
if (agents.length > 0) {
|
|
143
|
+
const maxCost = Math.max(...agents.map(a => a.total_cost), 0.001);
|
|
144
|
+
html += `<div class="am-section">
|
|
145
|
+
<div class="am-section-title">Cost by Agent</div>
|
|
146
|
+
<div class="am-bar-chart">
|
|
147
|
+
${agents.map(a => {
|
|
148
|
+
const w = Math.round((a.total_cost / maxCost) * 100);
|
|
149
|
+
return `<div class="am-bar-row">
|
|
150
|
+
<span class="am-bar-label">${escapeHtml(a.agent_title)}</span>
|
|
151
|
+
<div class="am-bar-bg"><div class="am-bar" style="width: ${w}%"></div></div>
|
|
152
|
+
<span class="am-bar-value">${formatCost(a.total_cost)}</span>
|
|
153
|
+
</div>`;
|
|
154
|
+
}).join("")}
|
|
155
|
+
</div>
|
|
156
|
+
</div>`;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
// ── Daily activity chart ──
|
|
160
|
+
if (daily.length > 0) {
|
|
161
|
+
const maxRuns = Math.max(...daily.map(d => d.runs), 1);
|
|
162
|
+
html += `<div class="am-section">
|
|
163
|
+
<div class="am-section-title">Daily Activity (Last 30 Days)</div>
|
|
164
|
+
<div class="am-bar-chart">
|
|
165
|
+
${daily.map(d => {
|
|
166
|
+
const w = Math.round((d.runs / maxRuns) * 100);
|
|
167
|
+
return `<div class="am-bar-row">
|
|
168
|
+
<span class="am-bar-label">${d.date.slice(5)}</span>
|
|
169
|
+
<div class="am-bar-bg">
|
|
170
|
+
<div class="am-bar" style="width: ${w}%"></div>
|
|
171
|
+
</div>
|
|
172
|
+
<span class="am-bar-value">${d.runs} runs / ${formatCost(d.cost)}</span>
|
|
173
|
+
</div>`;
|
|
174
|
+
}).join("")}
|
|
175
|
+
</div>
|
|
176
|
+
</div>`;
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
// ── Recent runs ──
|
|
180
|
+
if (recent.length > 0) {
|
|
181
|
+
html += `<div class="am-section">
|
|
182
|
+
<div class="am-section-title">Recent Runs</div>
|
|
183
|
+
<div class="am-recent">
|
|
184
|
+
${recent.map(r => {
|
|
185
|
+
const statusClass = r.status === 'completed' ? 'am-success'
|
|
186
|
+
: r.status === 'error' ? 'am-error'
|
|
187
|
+
: r.status === 'aborted' ? 'am-warn' : '';
|
|
188
|
+
const time = new Date(r.started_at * 1000).toLocaleString();
|
|
189
|
+
return `<div class="am-recent-row">
|
|
190
|
+
<span class="am-recent-agent">${escapeHtml(r.agent_title)}</span>
|
|
191
|
+
<span class="am-recent-type">${escapeHtml(r.run_type)}</span>
|
|
192
|
+
<span class="am-recent-status ${statusClass}">${r.status}</span>
|
|
193
|
+
<span class="am-recent-duration">${formatDuration(r.duration_ms)}</span>
|
|
194
|
+
<span class="am-recent-cost">${formatCost(r.cost_usd)}</span>
|
|
195
|
+
<span class="am-recent-time">${time}</span>
|
|
196
|
+
</div>`;
|
|
197
|
+
}).join("")}
|
|
198
|
+
</div>
|
|
199
|
+
</div>`;
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
if (!agents.length && !recent.length) {
|
|
203
|
+
html += `<div class="am-empty">No agent runs recorded yet. Run an agent, chain, or DAG to see metrics here.</div>`;
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
el.innerHTML = html;
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
// ── Event bindings ──
|
|
210
|
+
$.agentMonitorClose?.addEventListener("click", closeAgentMonitor);
|
|
211
|
+
$.agentMonitorModal?.addEventListener("click", (e) => {
|
|
212
|
+
if (e.target === $.agentMonitorModal) closeAgentMonitor();
|
|
213
|
+
});
|
|
214
|
+
|
|
215
|
+
// Register /monitor command
|
|
216
|
+
registerCommand("monitor", {
|
|
217
|
+
category: "agent",
|
|
218
|
+
description: "Open multi-agent monitoring dashboard",
|
|
219
|
+
execute() {
|
|
220
|
+
openAgentMonitor();
|
|
221
|
+
},
|
|
222
|
+
});
|