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
package/server.js
ADDED
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
import { userDir, userPluginsDir } from "./server/paths.js";
|
|
2
|
+
import { mountPluginRoutes } from "./server/plugin-mount.js";
|
|
3
|
+
import dotenv from "dotenv";
|
|
4
|
+
dotenv.config({ path: join(userDir, ".env") });
|
|
5
|
+
import express from "express";
|
|
6
|
+
import { createServer } from "http";
|
|
7
|
+
import { WebSocketServer } from "ws";
|
|
8
|
+
import { join, dirname } from "path";
|
|
9
|
+
import { fileURLToPath } from "url";
|
|
10
|
+
import { appendFileSync, readdirSync, existsSync, statSync } from "fs";
|
|
11
|
+
import webpush from "web-push";
|
|
12
|
+
import { getDb, allClaudeSessions } from "./db.js";
|
|
13
|
+
import { initPushSender } from "./server/push-sender.js";
|
|
14
|
+
import { initTelegramSender } from "./server/telegram-sender.js";
|
|
15
|
+
import { startTelegramPoller, stopTelegramPoller } from "./server/telegram-poller.js";
|
|
16
|
+
import telegramRouter from "./server/routes/telegram.js";
|
|
17
|
+
|
|
18
|
+
// Route modules
|
|
19
|
+
import projectsRouter from "./server/routes/projects.js";
|
|
20
|
+
import sessionsRouter, { setSessionIds } from "./server/routes/sessions.js";
|
|
21
|
+
import messagesRouter from "./server/routes/messages.js";
|
|
22
|
+
import promptsRouter from "./server/routes/prompts.js";
|
|
23
|
+
import statsRouter from "./server/routes/stats.js";
|
|
24
|
+
import filesRouter from "./server/routes/files.js";
|
|
25
|
+
import workflowsRouter from "./server/routes/workflows.js";
|
|
26
|
+
import agentsRouter from "./server/routes/agents.js";
|
|
27
|
+
import execRouter from "./server/routes/exec.js";
|
|
28
|
+
import mcpRouter from "./server/routes/mcp.js";
|
|
29
|
+
import tipsRouter from "./server/routes/tips.js";
|
|
30
|
+
import botRouter from "./server/routes/bot.js";
|
|
31
|
+
import notificationsRouter, { setVapidPublicKey } from "./server/routes/notifications.js";
|
|
32
|
+
import { setupWebSocket } from "./server/ws-handler.js";
|
|
33
|
+
|
|
34
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
35
|
+
const __dirname = dirname(__filename);
|
|
36
|
+
|
|
37
|
+
const app = express();
|
|
38
|
+
const server = createServer(app);
|
|
39
|
+
const wss = new WebSocketServer({ server, path: "/ws" });
|
|
40
|
+
|
|
41
|
+
app.use(express.static(join(__dirname, "public")));
|
|
42
|
+
app.use(express.json());
|
|
43
|
+
|
|
44
|
+
// ── Web Push (VAPID) setup ──────────────────────────────────
|
|
45
|
+
{
|
|
46
|
+
let vapidPublic = process.env.VAPID_PUBLIC_KEY;
|
|
47
|
+
let vapidPrivate = process.env.VAPID_PRIVATE_KEY;
|
|
48
|
+
|
|
49
|
+
if (!vapidPublic || !vapidPrivate) {
|
|
50
|
+
const generated = webpush.generateVAPIDKeys();
|
|
51
|
+
vapidPublic = generated.publicKey;
|
|
52
|
+
vapidPrivate = generated.privateKey;
|
|
53
|
+
// Persist to .env so keys survive restarts
|
|
54
|
+
appendFileSync(join(userDir, ".env"), `\nVAPID_PUBLIC_KEY="${vapidPublic}"\nVAPID_PRIVATE_KEY="${vapidPrivate}"\n`);
|
|
55
|
+
console.log("Generated and saved VAPID keys to ~/.claudeck/.env");
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
webpush.setVapidDetails("mailto:push@claudeck.local", vapidPublic, vapidPrivate);
|
|
59
|
+
setVapidPublicKey(vapidPublic);
|
|
60
|
+
initPushSender(webpush);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
// ── Telegram notifications + poller ──
|
|
64
|
+
initTelegramSender().then(() => startTelegramPoller());
|
|
65
|
+
|
|
66
|
+
// Restore session mappings from DB on startup
|
|
67
|
+
const sessionIds = new Map();
|
|
68
|
+
{
|
|
69
|
+
const db = getDb();
|
|
70
|
+
const rows = db
|
|
71
|
+
.prepare("SELECT id, claude_session_id FROM sessions WHERE claude_session_id IS NOT NULL")
|
|
72
|
+
.all();
|
|
73
|
+
for (const row of rows) {
|
|
74
|
+
sessionIds.set(row.id, row.claude_session_id);
|
|
75
|
+
}
|
|
76
|
+
const csRows = allClaudeSessions();
|
|
77
|
+
for (const row of csRows) {
|
|
78
|
+
const key = row.chat_id ? `${row.session_id}::${row.chat_id}` : row.session_id;
|
|
79
|
+
sessionIds.set(key, row.claude_session_id);
|
|
80
|
+
}
|
|
81
|
+
console.log(`Restored ${sessionIds.size} session mappings from DB`);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
// Share sessionIds with sessions router
|
|
85
|
+
setSessionIds(sessionIds);
|
|
86
|
+
|
|
87
|
+
// Mount routes
|
|
88
|
+
app.use("/api/projects", projectsRouter);
|
|
89
|
+
app.use("/api/sessions", sessionsRouter);
|
|
90
|
+
app.use("/api/sessions", messagesRouter);
|
|
91
|
+
app.use("/api/prompts", promptsRouter);
|
|
92
|
+
app.use("/api/stats", statsRouter);
|
|
93
|
+
app.get("/api/account", (req, res, next) => {
|
|
94
|
+
// Forward to stats router which handles /account
|
|
95
|
+
req.url = "/account";
|
|
96
|
+
statsRouter(req, res, next);
|
|
97
|
+
});
|
|
98
|
+
app.use("/api/files", filesRouter);
|
|
99
|
+
app.use("/api/workflows", workflowsRouter);
|
|
100
|
+
app.use("/api/agents", agentsRouter);
|
|
101
|
+
app.use("/api/exec", execRouter);
|
|
102
|
+
app.use("/api/mcp", mcpRouter);
|
|
103
|
+
app.use("/api/notifications", notificationsRouter);
|
|
104
|
+
app.use("/api/tips", tipsRouter);
|
|
105
|
+
app.use("/api/bot", botRouter);
|
|
106
|
+
app.use("/api/telegram", telegramRouter);
|
|
107
|
+
|
|
108
|
+
// Serve full-stack plugin client assets
|
|
109
|
+
const fullStackPluginsDir = join(__dirname, "plugins");
|
|
110
|
+
app.use("/plugins", express.static(fullStackPluginsDir));
|
|
111
|
+
|
|
112
|
+
// Serve user plugins from ~/.claudeck/plugins/
|
|
113
|
+
app.use("/user-plugins", express.static(userPluginsDir));
|
|
114
|
+
|
|
115
|
+
// Plugin discovery — merge built-in + user plugins
|
|
116
|
+
app.get("/api/plugins", (req, res) => {
|
|
117
|
+
const plugins = [];
|
|
118
|
+
|
|
119
|
+
// 1. Built-in full-stack plugins from plugins/ (project root)
|
|
120
|
+
if (existsSync(fullStackPluginsDir)) {
|
|
121
|
+
for (const name of readdirSync(fullStackPluginsDir)) {
|
|
122
|
+
const dir = join(fullStackPluginsDir, name);
|
|
123
|
+
if (!statSync(dir).isDirectory()) continue;
|
|
124
|
+
if (!existsSync(join(dir, "client.js"))) continue;
|
|
125
|
+
const hasCss = existsSync(join(dir, "client.css"));
|
|
126
|
+
const hasServer = existsSync(join(dir, "server.js"));
|
|
127
|
+
plugins.push({
|
|
128
|
+
name,
|
|
129
|
+
js: `plugins/${name}/client.js`,
|
|
130
|
+
css: hasCss ? `plugins/${name}/client.css` : null,
|
|
131
|
+
source: "builtin",
|
|
132
|
+
apiBase: hasServer ? `/api/plugins/${name}` : null,
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
// 2. User plugins from ~/.claudeck/plugins/
|
|
138
|
+
if (existsSync(userPluginsDir)) {
|
|
139
|
+
for (const entry of readdirSync(userPluginsDir)) {
|
|
140
|
+
const dir = join(userPluginsDir, entry);
|
|
141
|
+
if (!existsSync(dir) || !statSync(dir).isDirectory() || !existsSync(join(dir, "client.js"))) continue;
|
|
142
|
+
if (plugins.some(p => p.name === entry)) continue;
|
|
143
|
+
const hasCss = existsSync(join(dir, "client.css"));
|
|
144
|
+
const allowUserServer = process.env.CLAUDECK_USER_SERVER_PLUGINS === "true";
|
|
145
|
+
const hasServer = allowUserServer && existsSync(join(dir, "server.js"));
|
|
146
|
+
plugins.push({
|
|
147
|
+
name: entry,
|
|
148
|
+
js: `user-plugins/${entry}/client.js`,
|
|
149
|
+
css: hasCss ? `user-plugins/${entry}/client.css` : null,
|
|
150
|
+
source: "user",
|
|
151
|
+
apiBase: hasServer ? `/api/plugins/${entry}` : null,
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
res.json(plugins);
|
|
157
|
+
});
|
|
158
|
+
|
|
159
|
+
// WebSocket
|
|
160
|
+
setupWebSocket(wss, sessionIds);
|
|
161
|
+
|
|
162
|
+
const PORT = process.env.PORT || 9009;
|
|
163
|
+
|
|
164
|
+
// Mount full-stack plugin routes, then start server
|
|
165
|
+
mountPluginRoutes(app, fullStackPluginsDir).then(() => {
|
|
166
|
+
server.listen(PORT, () => {
|
|
167
|
+
console.log(`Claudeck running at http://localhost:${PORT}`);
|
|
168
|
+
});
|
|
169
|
+
});
|
|
170
|
+
|
|
171
|
+
// Graceful shutdown
|
|
172
|
+
process.on("SIGINT", () => {
|
|
173
|
+
stopTelegramPoller();
|
|
174
|
+
process.exit(0);
|
|
175
|
+
});
|
|
176
|
+
process.on("SIGTERM", () => {
|
|
177
|
+
stopTelegramPoller();
|
|
178
|
+
process.exit(0);
|
|
179
|
+
});
|