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.
Files changed (157) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +233 -0
  3. package/cli.js +2 -0
  4. package/config/agent-chains.json +16 -0
  5. package/config/agent-dags.json +16 -0
  6. package/config/agents.json +46 -0
  7. package/config/bot-prompt.json +3 -0
  8. package/config/folders.json +66 -0
  9. package/config/prompts.json +92 -0
  10. package/config/repos.json +86 -0
  11. package/config/telegram-config.json +17 -0
  12. package/config/workflows.json +90 -0
  13. package/db.js +1198 -0
  14. package/package.json +55 -0
  15. package/plugins/claude-editor/client.css +171 -0
  16. package/plugins/claude-editor/client.js +183 -0
  17. package/plugins/event-stream/client.css +207 -0
  18. package/plugins/event-stream/client.js +271 -0
  19. package/plugins/linear/client.css +345 -0
  20. package/plugins/linear/client.js +380 -0
  21. package/plugins/linear/config.json +5 -0
  22. package/plugins/linear/server.js +312 -0
  23. package/plugins/repos/client.css +549 -0
  24. package/plugins/repos/client.js +663 -0
  25. package/plugins/repos/server.js +232 -0
  26. package/plugins/sudoku/client.css +196 -0
  27. package/plugins/sudoku/client.js +329 -0
  28. package/plugins/tasks/client.css +414 -0
  29. package/plugins/tasks/client.js +394 -0
  30. package/plugins/tasks/server.js +116 -0
  31. package/plugins/tic-tac-toe/client.css +167 -0
  32. package/plugins/tic-tac-toe/client.js +241 -0
  33. package/public/css/core/components.css +232 -0
  34. package/public/css/core/layout.css +330 -0
  35. package/public/css/core/print.css +18 -0
  36. package/public/css/core/reset.css +36 -0
  37. package/public/css/core/responsive.css +378 -0
  38. package/public/css/core/theme.css +116 -0
  39. package/public/css/core/variables.css +93 -0
  40. package/public/css/features/agent-monitor.css +297 -0
  41. package/public/css/features/agent-sidebar.css +525 -0
  42. package/public/css/features/agents.css +996 -0
  43. package/public/css/features/analytics.css +181 -0
  44. package/public/css/features/background-sessions.css +321 -0
  45. package/public/css/features/cost-dashboard.css +168 -0
  46. package/public/css/features/home.css +313 -0
  47. package/public/css/features/retro-terminal.css +88 -0
  48. package/public/css/features/telegram.css +127 -0
  49. package/public/css/features/tour.css +148 -0
  50. package/public/css/features/voice-input.css +60 -0
  51. package/public/css/features/welcome.css +241 -0
  52. package/public/css/panels/assistant-bot.css +442 -0
  53. package/public/css/panels/dev-docs.css +292 -0
  54. package/public/css/panels/file-explorer.css +322 -0
  55. package/public/css/panels/git-panel.css +221 -0
  56. package/public/css/panels/mcp-manager.css +199 -0
  57. package/public/css/panels/tips-feed.css +353 -0
  58. package/public/css/ui/commands.css +273 -0
  59. package/public/css/ui/context-gauge.css +76 -0
  60. package/public/css/ui/file-picker.css +69 -0
  61. package/public/css/ui/image-attachments.css +106 -0
  62. package/public/css/ui/messages.css +884 -0
  63. package/public/css/ui/modals.css +122 -0
  64. package/public/css/ui/parallel.css +217 -0
  65. package/public/css/ui/permissions.css +110 -0
  66. package/public/css/ui/right-panel.css +481 -0
  67. package/public/css/ui/sessions.css +689 -0
  68. package/public/css/ui/status-bar.css +425 -0
  69. package/public/css/ui/toolbox.css +206 -0
  70. package/public/data/tips.json +218 -0
  71. package/public/icons/favicon.png +0 -0
  72. package/public/icons/icon-192.png +0 -0
  73. package/public/icons/icon-512.png +0 -0
  74. package/public/icons/whaly.png +0 -0
  75. package/public/index.html +1140 -0
  76. package/public/js/core/api.js +591 -0
  77. package/public/js/core/constants.js +3 -0
  78. package/public/js/core/dom.js +270 -0
  79. package/public/js/core/events.js +10 -0
  80. package/public/js/core/plugin-loader.js +153 -0
  81. package/public/js/core/store.js +39 -0
  82. package/public/js/core/utils.js +25 -0
  83. package/public/js/core/ws.js +64 -0
  84. package/public/js/features/agent-monitor.js +222 -0
  85. package/public/js/features/agents.js +1209 -0
  86. package/public/js/features/analytics.js +397 -0
  87. package/public/js/features/attachments.js +251 -0
  88. package/public/js/features/background-sessions.js +475 -0
  89. package/public/js/features/chat.js +589 -0
  90. package/public/js/features/cost-dashboard.js +152 -0
  91. package/public/js/features/dag-editor.js +399 -0
  92. package/public/js/features/easter-egg.js +46 -0
  93. package/public/js/features/home.js +270 -0
  94. package/public/js/features/projects.js +372 -0
  95. package/public/js/features/prompts.js +228 -0
  96. package/public/js/features/sessions.js +332 -0
  97. package/public/js/features/telegram.js +131 -0
  98. package/public/js/features/tour.js +210 -0
  99. package/public/js/features/voice-input.js +185 -0
  100. package/public/js/features/welcome.js +43 -0
  101. package/public/js/features/workflows.js +277 -0
  102. package/public/js/main.js +51 -0
  103. package/public/js/panels/assistant-bot.js +445 -0
  104. package/public/js/panels/dev-docs.js +380 -0
  105. package/public/js/panels/file-explorer.js +486 -0
  106. package/public/js/panels/git-panel.js +285 -0
  107. package/public/js/panels/mcp-manager.js +311 -0
  108. package/public/js/panels/tips-feed.js +303 -0
  109. package/public/js/ui/commands.js +114 -0
  110. package/public/js/ui/context-gauge.js +100 -0
  111. package/public/js/ui/diff.js +124 -0
  112. package/public/js/ui/disabled-tools.js +36 -0
  113. package/public/js/ui/export.js +74 -0
  114. package/public/js/ui/formatting.js +206 -0
  115. package/public/js/ui/header-dropdowns.js +72 -0
  116. package/public/js/ui/input-meta.js +71 -0
  117. package/public/js/ui/max-turns.js +21 -0
  118. package/public/js/ui/messages.js +387 -0
  119. package/public/js/ui/model-selector.js +20 -0
  120. package/public/js/ui/notifications.js +232 -0
  121. package/public/js/ui/parallel.js +176 -0
  122. package/public/js/ui/permissions.js +168 -0
  123. package/public/js/ui/right-panel.js +173 -0
  124. package/public/js/ui/shortcuts.js +143 -0
  125. package/public/js/ui/sidebar-toggle.js +29 -0
  126. package/public/js/ui/status-bar.js +172 -0
  127. package/public/js/ui/tab-sdk.js +623 -0
  128. package/public/js/ui/theme.js +38 -0
  129. package/public/manifest.json +13 -0
  130. package/public/offline.html +190 -0
  131. package/public/style.css +42 -0
  132. package/public/sw.js +91 -0
  133. package/server/agent-loop.js +385 -0
  134. package/server/dag-executor.js +265 -0
  135. package/server/orchestrator.js +514 -0
  136. package/server/paths.js +61 -0
  137. package/server/plugin-mount.js +56 -0
  138. package/server/push-sender.js +31 -0
  139. package/server/routes/agents.js +294 -0
  140. package/server/routes/bot.js +45 -0
  141. package/server/routes/exec.js +35 -0
  142. package/server/routes/files.js +218 -0
  143. package/server/routes/mcp.js +82 -0
  144. package/server/routes/messages.js +36 -0
  145. package/server/routes/notifications.js +37 -0
  146. package/server/routes/projects.js +207 -0
  147. package/server/routes/prompts.js +53 -0
  148. package/server/routes/sessions.js +103 -0
  149. package/server/routes/stats.js +143 -0
  150. package/server/routes/telegram.js +71 -0
  151. package/server/routes/tips.js +135 -0
  152. package/server/routes/workflows.js +81 -0
  153. package/server/summarizer.js +55 -0
  154. package/server/telegram-poller.js +205 -0
  155. package/server/telegram-sender.js +304 -0
  156. package/server/ws-handler.js +926 -0
  157. 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
+ });