@agentplugged/claw 0.1.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 (149) hide show
  1. package/dist/cli.d.ts +11 -0
  2. package/dist/cli.d.ts.map +1 -0
  3. package/dist/cli.js +111 -0
  4. package/dist/cli.js.map +1 -0
  5. package/dist/config.d.ts +29 -0
  6. package/dist/config.d.ts.map +1 -0
  7. package/dist/config.js +94 -0
  8. package/dist/config.js.map +1 -0
  9. package/dist/index.d.ts +17 -0
  10. package/dist/index.d.ts.map +1 -0
  11. package/dist/index.js +54 -0
  12. package/dist/index.js.map +1 -0
  13. package/dist/memory/capture.d.ts +13 -0
  14. package/dist/memory/capture.d.ts.map +1 -0
  15. package/dist/memory/capture.js +102 -0
  16. package/dist/memory/capture.js.map +1 -0
  17. package/dist/memory/db.d.ts +56 -0
  18. package/dist/memory/db.d.ts.map +1 -0
  19. package/dist/memory/db.js +206 -0
  20. package/dist/memory/db.js.map +1 -0
  21. package/dist/memory/index.d.ts +8 -0
  22. package/dist/memory/index.d.ts.map +1 -0
  23. package/dist/memory/index.js +42 -0
  24. package/dist/memory/index.js.map +1 -0
  25. package/dist/memory/llm-extract.d.ts +13 -0
  26. package/dist/memory/llm-extract.d.ts.map +1 -0
  27. package/dist/memory/llm-extract.js +135 -0
  28. package/dist/memory/llm-extract.js.map +1 -0
  29. package/dist/memory/recall.d.ts +16 -0
  30. package/dist/memory/recall.d.ts.map +1 -0
  31. package/dist/memory/recall.js +131 -0
  32. package/dist/memory/recall.js.map +1 -0
  33. package/dist/observability/collector.d.ts +40 -0
  34. package/dist/observability/collector.d.ts.map +1 -0
  35. package/dist/observability/collector.js +119 -0
  36. package/dist/observability/collector.js.map +1 -0
  37. package/dist/observability/db.d.ts +60 -0
  38. package/dist/observability/db.d.ts.map +1 -0
  39. package/dist/observability/db.js +189 -0
  40. package/dist/observability/db.js.map +1 -0
  41. package/dist/observability/index.d.ts +7 -0
  42. package/dist/observability/index.d.ts.map +1 -0
  43. package/dist/observability/index.js +35 -0
  44. package/dist/observability/index.js.map +1 -0
  45. package/dist/observability/queries.d.ts +54 -0
  46. package/dist/observability/queries.d.ts.map +1 -0
  47. package/dist/observability/queries.js +181 -0
  48. package/dist/observability/queries.js.map +1 -0
  49. package/dist/router/classifier.d.ts +8 -0
  50. package/dist/router/classifier.d.ts.map +1 -0
  51. package/dist/router/classifier.js +90 -0
  52. package/dist/router/classifier.js.map +1 -0
  53. package/dist/router/fallback.d.ts +18 -0
  54. package/dist/router/fallback.d.ts.map +1 -0
  55. package/dist/router/fallback.js +102 -0
  56. package/dist/router/fallback.js.map +1 -0
  57. package/dist/router/index.d.ts +5 -0
  58. package/dist/router/index.d.ts.map +1 -0
  59. package/dist/router/index.js +214 -0
  60. package/dist/router/index.js.map +1 -0
  61. package/dist/router/leak-detector.d.ts +33 -0
  62. package/dist/router/leak-detector.d.ts.map +1 -0
  63. package/dist/router/leak-detector.js +320 -0
  64. package/dist/router/leak-detector.js.map +1 -0
  65. package/dist/router/logger.d.ts +18 -0
  66. package/dist/router/logger.d.ts.map +1 -0
  67. package/dist/router/logger.js +130 -0
  68. package/dist/router/logger.js.map +1 -0
  69. package/dist/router/models.d.ts +5 -0
  70. package/dist/router/models.d.ts.map +1 -0
  71. package/dist/router/models.js +96 -0
  72. package/dist/router/models.js.map +1 -0
  73. package/dist/router/providers.d.ts +4 -0
  74. package/dist/router/providers.d.ts.map +1 -0
  75. package/dist/router/providers.js +323 -0
  76. package/dist/router/providers.js.map +1 -0
  77. package/dist/router/strategy.d.ts +29 -0
  78. package/dist/router/strategy.d.ts.map +1 -0
  79. package/dist/router/strategy.js +169 -0
  80. package/dist/router/strategy.js.map +1 -0
  81. package/dist/router/types.d.ts +63 -0
  82. package/dist/router/types.d.ts.map +1 -0
  83. package/dist/router/types.js +3 -0
  84. package/dist/router/types.js.map +1 -0
  85. package/dist/sidecar/auth.d.ts +7 -0
  86. package/dist/sidecar/auth.d.ts.map +1 -0
  87. package/dist/sidecar/auth.js +36 -0
  88. package/dist/sidecar/auth.js.map +1 -0
  89. package/dist/sidecar/index.d.ts +2 -0
  90. package/dist/sidecar/index.d.ts.map +1 -0
  91. package/dist/sidecar/index.js +336 -0
  92. package/dist/sidecar/index.js.map +1 -0
  93. package/dist/sidecar/routes/addons.d.ts +6 -0
  94. package/dist/sidecar/routes/addons.d.ts.map +1 -0
  95. package/dist/sidecar/routes/addons.js +332 -0
  96. package/dist/sidecar/routes/addons.js.map +1 -0
  97. package/dist/sidecar/routes/backup.d.ts +7 -0
  98. package/dist/sidecar/routes/backup.d.ts.map +1 -0
  99. package/dist/sidecar/routes/backup.js +204 -0
  100. package/dist/sidecar/routes/backup.js.map +1 -0
  101. package/dist/sidecar/routes/channels.d.ts +4 -0
  102. package/dist/sidecar/routes/channels.d.ts.map +1 -0
  103. package/dist/sidecar/routes/channels.js +120 -0
  104. package/dist/sidecar/routes/channels.js.map +1 -0
  105. package/dist/sidecar/routes/health.d.ts +5 -0
  106. package/dist/sidecar/routes/health.d.ts.map +1 -0
  107. package/dist/sidecar/routes/health.js +28 -0
  108. package/dist/sidecar/routes/health.js.map +1 -0
  109. package/dist/sidecar/routes/memory.d.ts +7 -0
  110. package/dist/sidecar/routes/memory.d.ts.map +1 -0
  111. package/dist/sidecar/routes/memory.js +234 -0
  112. package/dist/sidecar/routes/memory.js.map +1 -0
  113. package/dist/sidecar/routes/metrics.d.ts +5 -0
  114. package/dist/sidecar/routes/metrics.d.ts.map +1 -0
  115. package/dist/sidecar/routes/metrics.js +273 -0
  116. package/dist/sidecar/routes/metrics.js.map +1 -0
  117. package/dist/sidecar/routes/restart.d.ts +4 -0
  118. package/dist/sidecar/routes/restart.d.ts.map +1 -0
  119. package/dist/sidecar/routes/restart.js +81 -0
  120. package/dist/sidecar/routes/restart.js.map +1 -0
  121. package/dist/sidecar/routes/router-config.d.ts +5 -0
  122. package/dist/sidecar/routes/router-config.d.ts.map +1 -0
  123. package/dist/sidecar/routes/router-config.js +150 -0
  124. package/dist/sidecar/routes/router-config.js.map +1 -0
  125. package/dist/sidecar/routes/security.d.ts +8 -0
  126. package/dist/sidecar/routes/security.d.ts.map +1 -0
  127. package/dist/sidecar/routes/security.js +308 -0
  128. package/dist/sidecar/routes/security.js.map +1 -0
  129. package/dist/sidecar/routes/skills.d.ts +5 -0
  130. package/dist/sidecar/routes/skills.d.ts.map +1 -0
  131. package/dist/sidecar/routes/skills.js +146 -0
  132. package/dist/sidecar/routes/skills.js.map +1 -0
  133. package/dist/sidecar/routes/soul.d.ts +4 -0
  134. package/dist/sidecar/routes/soul.d.ts.map +1 -0
  135. package/dist/sidecar/routes/soul.js +115 -0
  136. package/dist/sidecar/routes/soul.js.map +1 -0
  137. package/dist/sidecar/routes/team.d.ts +4 -0
  138. package/dist/sidecar/routes/team.d.ts.map +1 -0
  139. package/dist/sidecar/routes/team.js +139 -0
  140. package/dist/sidecar/routes/team.js.map +1 -0
  141. package/dist/sidecar/routes/update.d.ts +4 -0
  142. package/dist/sidecar/routes/update.d.ts.map +1 -0
  143. package/dist/sidecar/routes/update.js +96 -0
  144. package/dist/sidecar/routes/update.js.map +1 -0
  145. package/dist/sidecar/utils.d.ts +9 -0
  146. package/dist/sidecar/utils.d.ts.map +1 -0
  147. package/dist/sidecar/utils.js +57 -0
  148. package/dist/sidecar/utils.js.map +1 -0
  149. package/package.json +45 -0
@@ -0,0 +1,273 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.handleMetrics = handleMetrics;
40
+ exports.handleRouterMetrics = handleRouterMetrics;
41
+ exports.handleLiveMetrics = handleLiveMetrics;
42
+ const better_sqlite3_1 = __importDefault(require("better-sqlite3"));
43
+ const fs = __importStar(require("fs"));
44
+ const utils_1 = require("../utils");
45
+ function openDb(dbPath) {
46
+ if (!fs.existsSync(dbPath)) {
47
+ return null;
48
+ }
49
+ try {
50
+ return new better_sqlite3_1.default(dbPath, { readonly: true });
51
+ }
52
+ catch {
53
+ return null;
54
+ }
55
+ }
56
+ function queryRouterStats(db) {
57
+ const today = db
58
+ .prepare(`SELECT
59
+ COUNT(*) as total_requests,
60
+ SUM(inputTokens) as total_input_tokens,
61
+ SUM(outputTokens) as total_output_tokens,
62
+ SUM(cost) as total_cost,
63
+ AVG(latencyMs) as avg_latency,
64
+ SUM(CASE WHEN success = 0 THEN 1 ELSE 0 END) as error_count
65
+ FROM router_logs
66
+ WHERE timestamp >= datetime('now', '-1 day')`)
67
+ .get() ?? null;
68
+ const week = db
69
+ .prepare(`SELECT
70
+ COUNT(*) as total_requests,
71
+ SUM(cost) as total_cost
72
+ FROM router_logs
73
+ WHERE timestamp >= datetime('now', '-7 days')`)
74
+ .get() ?? null;
75
+ const month = db
76
+ .prepare(`SELECT
77
+ COUNT(*) as total_requests,
78
+ SUM(cost) as total_cost
79
+ FROM router_logs
80
+ WHERE timestamp >= datetime('now', '-30 days')`)
81
+ .get() ?? null;
82
+ const models = db
83
+ .prepare(`SELECT
84
+ model,
85
+ COUNT(*) as count,
86
+ SUM(cost) as total_cost,
87
+ SUM(inputTokens + outputTokens) as total_tokens
88
+ FROM router_logs
89
+ WHERE timestamp >= datetime('now', '-30 days')
90
+ GROUP BY model
91
+ ORDER BY total_cost DESC`)
92
+ .all();
93
+ return { today, week, month, models };
94
+ }
95
+ function handleMetrics(routerDbPath, metricsDbPath) {
96
+ return async (_req, res) => {
97
+ const routerDb = openDb(routerDbPath);
98
+ const metricsDb = openDb(metricsDbPath);
99
+ if (!routerDb && !metricsDb) {
100
+ (0, utils_1.sendError)(res, 503, "No database available");
101
+ return;
102
+ }
103
+ let routerStats = {
104
+ today: null,
105
+ week: null,
106
+ month: null,
107
+ models: [],
108
+ };
109
+ let metricsRow = null;
110
+ try {
111
+ if (routerDb) {
112
+ routerStats = queryRouterStats(routerDb);
113
+ routerDb.close();
114
+ }
115
+ if (metricsDb) {
116
+ metricsRow = metricsDb
117
+ .prepare(`SELECT
118
+ COUNT(*) as total_requests,
119
+ AVG(latency_ms) as avg_latency,
120
+ AVG(CASE WHEN error = 1 THEN 1.0 ELSE 0.0 END) as error_rate
121
+ FROM metrics
122
+ WHERE created_at >= datetime('now', '-1 day')`)
123
+ .get() ?? null;
124
+ metricsDb.close();
125
+ }
126
+ }
127
+ catch (err) {
128
+ (0, utils_1.sendError)(res, 500, `Database query failed: ${err.message}`);
129
+ return;
130
+ }
131
+ const today = routerStats.today;
132
+ const totalRequests = today?.total_requests ?? 0;
133
+ const errorCount = today?.error_count ?? 0;
134
+ // Build model distribution percentages
135
+ const totalModelRequests = routerStats.models.reduce((sum, m) => sum + m.count, 0);
136
+ const modelDistribution = routerStats.models.map((m) => ({
137
+ model: m.model,
138
+ percentage: totalModelRequests > 0
139
+ ? Math.round((m.count / totalModelRequests) * 100 * 10) / 10
140
+ : 0,
141
+ totalCost: m.total_cost ?? 0,
142
+ totalTokens: m.total_tokens ?? 0,
143
+ }));
144
+ (0, utils_1.sendJson)(res, 200, {
145
+ today: {
146
+ requests: totalRequests,
147
+ inputTokens: today?.total_input_tokens ?? 0,
148
+ outputTokens: today?.total_output_tokens ?? 0,
149
+ totalTokens: (today?.total_input_tokens ?? 0) + (today?.total_output_tokens ?? 0),
150
+ cost: today?.total_cost ?? 0,
151
+ avgLatencyMs: today?.avg_latency ?? 0,
152
+ errorRate: totalRequests > 0
153
+ ? Math.round((errorCount / totalRequests) * 100 * 10) / 10
154
+ : 0,
155
+ },
156
+ week: {
157
+ requests: routerStats.week?.total_requests ?? 0,
158
+ cost: routerStats.week?.total_cost ?? 0,
159
+ },
160
+ month: {
161
+ requests: routerStats.month?.total_requests ?? 0,
162
+ cost: routerStats.month?.total_cost ?? 0,
163
+ },
164
+ models: {
165
+ distribution: modelDistribution,
166
+ topByCost: routerStats.models.slice(0, 5),
167
+ },
168
+ observability: metricsRow,
169
+ });
170
+ };
171
+ }
172
+ function handleRouterMetrics(routerDbPath) {
173
+ return async (_req, res) => {
174
+ const db = openDb(routerDbPath);
175
+ if (!db) {
176
+ (0, utils_1.sendError)(res, 503, "Router database not available");
177
+ return;
178
+ }
179
+ try {
180
+ const stats = queryRouterStats(db);
181
+ db.close();
182
+ const today = stats.today;
183
+ const totalRequests = today?.total_requests ?? 0;
184
+ const errorCount = today?.error_count ?? 0;
185
+ const totalModelRequests = stats.models.reduce((sum, m) => sum + m.count, 0);
186
+ (0, utils_1.sendJson)(res, 200, {
187
+ requests: {
188
+ today: totalRequests,
189
+ week: stats.week?.total_requests ?? 0,
190
+ month: stats.month?.total_requests ?? 0,
191
+ },
192
+ tokens: {
193
+ inputToday: today?.total_input_tokens ?? 0,
194
+ outputToday: today?.total_output_tokens ?? 0,
195
+ totalToday: (today?.total_input_tokens ?? 0) +
196
+ (today?.total_output_tokens ?? 0),
197
+ },
198
+ cost: {
199
+ today: today?.total_cost ?? 0,
200
+ week: stats.week?.total_cost ?? 0,
201
+ month: stats.month?.total_cost ?? 0,
202
+ },
203
+ performance: {
204
+ avgLatencyMs: today?.avg_latency ?? 0,
205
+ errorRate: totalRequests > 0
206
+ ? Math.round((errorCount / totalRequests) * 100 * 10) / 10
207
+ : 0,
208
+ },
209
+ modelDistribution: stats.models.map((m) => ({
210
+ model: m.model,
211
+ count: m.count,
212
+ percentage: totalModelRequests > 0
213
+ ? Math.round((m.count / totalModelRequests) * 100 * 10) / 10
214
+ : 0,
215
+ cost: m.total_cost ?? 0,
216
+ })),
217
+ });
218
+ }
219
+ catch (err) {
220
+ (0, utils_1.sendError)(res, 500, `Query failed: ${err.message}`);
221
+ }
222
+ };
223
+ }
224
+ function handleLiveMetrics(routerDbPath) {
225
+ return async (_req, res) => {
226
+ const db = openDb(routerDbPath);
227
+ if (!db) {
228
+ (0, utils_1.sendError)(res, 503, "Router database not available");
229
+ return;
230
+ }
231
+ try {
232
+ const live = db
233
+ .prepare(`SELECT
234
+ COUNT(*) as messages_today,
235
+ SUM(inputTokens + outputTokens) as tokens_today,
236
+ SUM(cost) as cost_today
237
+ FROM router_logs
238
+ WHERE timestamp >= datetime('now', 'start of day')`)
239
+ .get() ?? null;
240
+ // Sessions: requests in the last 5 minutes grouped by some session identifier
241
+ // If there's no session column, we approximate by recent request count
242
+ let activeSessions = 0;
243
+ try {
244
+ const sessionRow = db
245
+ .prepare(`SELECT COUNT(DISTINCT session_id) as active_sessions
246
+ FROM router_logs
247
+ WHERE timestamp >= datetime('now', '-5 minutes')`)
248
+ .get();
249
+ activeSessions = sessionRow?.active_sessions ?? 0;
250
+ }
251
+ catch {
252
+ const countRow = db
253
+ .prepare(`SELECT COUNT(*) as cnt
254
+ FROM router_logs
255
+ WHERE timestamp >= datetime('now', '-5 minutes')`)
256
+ .get();
257
+ activeSessions = countRow?.cnt ?? 0;
258
+ }
259
+ db.close();
260
+ (0, utils_1.sendJson)(res, 200, {
261
+ activeSessions,
262
+ messagesToday: live?.messages_today ?? 0,
263
+ tokensToday: live?.tokens_today ?? 0,
264
+ costToday: live?.cost_today ?? 0,
265
+ timestamp: new Date().toISOString(),
266
+ });
267
+ }
268
+ catch (err) {
269
+ (0, utils_1.sendError)(res, 500, `Query failed: ${err.message}`);
270
+ }
271
+ };
272
+ }
273
+ //# sourceMappingURL=metrics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metrics.js","sourceRoot":"","sources":["../../../src/sidecar/routes/metrics.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { ClawConfig } from "../../config";
2
+ import { RouteHandler } from "./health";
3
+ export declare function handleRestart(_config: ClawConfig): RouteHandler;
4
+ //# sourceMappingURL=restart.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"restart.d.ts","sourceRoot":"","sources":["../../../src/sidecar/routes/restart.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAMxC,wBAAgB,aAAa,CAAC,OAAO,EAAE,UAAU,GAAG,YAAY,CA4C/D"}
@@ -0,0 +1,81 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.handleRestart = handleRestart;
37
+ const utils_1 = require("../utils");
38
+ function handleRestart(_config) {
39
+ return async (req, res) => {
40
+ let body = {};
41
+ try {
42
+ const parsed = await Promise.resolve().then(() => __importStar(require("../utils"))).then((m) => m.parseBody(req));
43
+ body = parsed ?? {};
44
+ }
45
+ catch {
46
+ // Body is optional for restart
47
+ }
48
+ const service = body.service ?? "openclaw";
49
+ const results = {};
50
+ const restart = async (svc) => {
51
+ try {
52
+ const { stdout, stderr } = await (0, utils_1.execCommand)(`systemctl restart ${svc}`);
53
+ results[svc] = stdout || stderr || "restarted";
54
+ }
55
+ catch (err) {
56
+ results[svc] = `failed: ${err.message}`;
57
+ }
58
+ };
59
+ try {
60
+ if (service === "all") {
61
+ await restart("openclaw");
62
+ await restart("claw-router");
63
+ }
64
+ else if (service === "router") {
65
+ await restart("claw-router");
66
+ }
67
+ else {
68
+ await restart("openclaw");
69
+ }
70
+ (0, utils_1.sendJson)(res, 200, {
71
+ restarted: true,
72
+ service,
73
+ results,
74
+ });
75
+ }
76
+ catch (err) {
77
+ (0, utils_1.sendError)(res, 500, `Restart failed: ${err.message}`);
78
+ }
79
+ };
80
+ }
81
+ //# sourceMappingURL=restart.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"restart.js","sourceRoot":"","sources":["../../../src/sidecar/routes/restart.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AASA,sCA4CC;AAnDD,oCAA4D;AAO5D,SAAgB,aAAa,CAAC,OAAmB;IAC/C,OAAO,KAAK,EAAE,GAAoB,EAAE,GAAmB,EAAiB,EAAE;QACxE,IAAI,IAAI,GAAgB,EAAE,CAAC;QAE3B,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,kDAAO,UAAU,IAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;YACtE,IAAI,GAAI,MAAsB,IAAI,EAAE,CAAC;QACvC,CAAC;QAAC,MAAM,CAAC;YACP,+BAA+B;QACjC,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,UAAU,CAAC;QAC3C,MAAM,OAAO,GAA2B,EAAE,CAAC;QAE3C,MAAM,OAAO,GAAG,KAAK,EAAE,GAAW,EAAiB,EAAE;YACnD,IAAI,CAAC;gBACH,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,IAAA,mBAAW,EAC1C,qBAAqB,GAAG,EAAE,CAC3B,CAAC;gBACF,OAAO,CAAC,GAAG,CAAC,GAAG,MAAM,IAAI,MAAM,IAAI,WAAW,CAAC;YACjD,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO,CAAC,GAAG,CAAC,GAAG,WAAY,GAAa,CAAC,OAAO,EAAE,CAAC;YACrD,CAAC;QACH,CAAC,CAAC;QAEF,IAAI,CAAC;YACH,IAAI,OAAO,KAAK,KAAK,EAAE,CAAC;gBACtB,MAAM,OAAO,CAAC,UAAU,CAAC,CAAC;gBAC1B,MAAM,OAAO,CAAC,aAAa,CAAC,CAAC;YAC/B,CAAC;iBAAM,IAAI,OAAO,KAAK,QAAQ,EAAE,CAAC;gBAChC,MAAM,OAAO,CAAC,aAAa,CAAC,CAAC;YAC/B,CAAC;iBAAM,CAAC;gBACN,MAAM,OAAO,CAAC,UAAU,CAAC,CAAC;YAC5B,CAAC;YAED,IAAA,gBAAQ,EAAC,GAAG,EAAE,GAAG,EAAE;gBACjB,SAAS,EAAE,IAAI;gBACf,OAAO;gBACP,OAAO;aACR,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAA,iBAAS,EAAC,GAAG,EAAE,GAAG,EAAE,mBAAoB,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;QACnE,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,5 @@
1
+ import { ClawConfig } from "../../config";
2
+ import { RouteHandler } from "./health";
3
+ export declare function handleGetRouterConfig(config: ClawConfig): RouteHandler;
4
+ export declare function handleUpdateStrategy(config: ClawConfig): RouteHandler;
5
+ //# sourceMappingURL=router-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"router-config.d.ts","sourceRoot":"","sources":["../../../src/sidecar/routes/router-config.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAkCxC,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,UAAU,GAAG,YAAY,CA+BtE;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,UAAU,GAAG,YAAY,CA8ErE"}
@@ -0,0 +1,150 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.handleGetRouterConfig = handleGetRouterConfig;
37
+ exports.handleUpdateStrategy = handleUpdateStrategy;
38
+ const fs = __importStar(require("fs/promises"));
39
+ const path = __importStar(require("path"));
40
+ const utils_1 = require("../utils");
41
+ const VALID_STRATEGIES = ["economy", "balanced", "quality"];
42
+ /**
43
+ * Signal the router to reload by writing a .reload sentinel file.
44
+ * The router watches this file and reloads configuration on change.
45
+ */
46
+ async function signalRouterReload(runtimeDir) {
47
+ const reloadFile = path.join(runtimeDir, "data", ".reload");
48
+ try {
49
+ await fs.mkdir(path.dirname(reloadFile), { recursive: true });
50
+ await fs.writeFile(reloadFile, new Date().toISOString(), "utf-8");
51
+ return "reload signal sent";
52
+ }
53
+ catch {
54
+ // Fall back to restarting the router service
55
+ try {
56
+ const { stdout, stderr } = await (0, utils_1.execCommand)("systemctl reload-or-restart claw-router");
57
+ return stdout || stderr || "router restarted";
58
+ }
59
+ catch (err) {
60
+ return `reload failed: ${err.message}`;
61
+ }
62
+ }
63
+ }
64
+ function handleGetRouterConfig(config) {
65
+ return async (_req, res) => {
66
+ // Read the config file to get the persisted strategy, if any
67
+ let fileStrategy;
68
+ try {
69
+ const raw = await fs.readFile(config.configFile, "utf-8");
70
+ const cleaned = raw
71
+ .replace(/\/\/[^\n]*/g, "")
72
+ .replace(/,\s*([\]}])/g, "$1");
73
+ const parsed = JSON.parse(cleaned);
74
+ if (typeof parsed["strategy"] === "string") {
75
+ fileStrategy = parsed["strategy"];
76
+ }
77
+ }
78
+ catch {
79
+ // Config file missing or unreadable — fall back to runtime config
80
+ }
81
+ const strategy = fileStrategy ?? config.strategy;
82
+ const providers = config.providers.map((p) => ({
83
+ name: p.name,
84
+ enabled: p.enabled,
85
+ models: p.models.map((m) => m.id),
86
+ }));
87
+ (0, utils_1.sendJson)(res, 200, {
88
+ strategy,
89
+ providers,
90
+ });
91
+ };
92
+ }
93
+ function handleUpdateStrategy(config) {
94
+ return async (req, res) => {
95
+ let body;
96
+ try {
97
+ body = (await (0, utils_1.parseBody)(req));
98
+ }
99
+ catch {
100
+ (0, utils_1.sendError)(res, 400, "Invalid JSON body");
101
+ return;
102
+ }
103
+ if (!body.strategy) {
104
+ (0, utils_1.sendError)(res, 422, "'strategy' field is required");
105
+ return;
106
+ }
107
+ if (!VALID_STRATEGIES.includes(body.strategy)) {
108
+ (0, utils_1.sendError)(res, 422, `Invalid strategy '${body.strategy}'. Valid values: ${VALID_STRATEGIES.join(", ")}`);
109
+ return;
110
+ }
111
+ // Read existing config
112
+ let existingConfig = {};
113
+ try {
114
+ const raw = await fs.readFile(config.configFile, "utf-8");
115
+ // Basic JSON5 parsing — strip single-line comments and trailing commas
116
+ const cleaned = raw
117
+ .replace(/\/\/[^\n]*/g, "")
118
+ .replace(/,\s*([\]}])/g, "$1");
119
+ existingConfig = JSON.parse(cleaned);
120
+ }
121
+ catch (err) {
122
+ const error = err;
123
+ if (error.code !== "ENOENT") {
124
+ (0, utils_1.sendError)(res, 500, `Failed to read config file: ${error.message}`);
125
+ return;
126
+ }
127
+ }
128
+ // Update strategy
129
+ existingConfig["strategy"] = body.strategy;
130
+ // Write back
131
+ try {
132
+ await fs.mkdir(path.dirname(config.configFile), { recursive: true });
133
+ await fs.writeFile(config.configFile, JSON.stringify(existingConfig, null, 2), "utf-8");
134
+ }
135
+ catch (err) {
136
+ (0, utils_1.sendError)(res, 500, `Failed to write config: ${err.message}`);
137
+ return;
138
+ }
139
+ // Signal router to reload
140
+ const reloadResult = await signalRouterReload(config.runtimeDir);
141
+ (0, utils_1.sendJson)(res, 200, {
142
+ updated: true,
143
+ strategy: body.strategy,
144
+ previousStrategy: config.strategy,
145
+ configFile: config.configFile,
146
+ reload: reloadResult,
147
+ });
148
+ };
149
+ }
150
+ //# sourceMappingURL=router-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"router-config.js","sourceRoot":"","sources":["../../../src/sidecar/routes/router-config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import { ClawConfig } from "../../config";
2
+ import { RouteHandler } from "./health";
3
+ export declare function handleListVault(config: ClawConfig): RouteHandler;
4
+ export declare function handleAddVault(config: ClawConfig): RouteHandler;
5
+ export declare function handleListAllowlist(config: ClawConfig): RouteHandler;
6
+ export declare function handleAddAllowlist(config: ClawConfig): RouteHandler;
7
+ export declare function handleSecurityAlerts(config: ClawConfig): RouteHandler;
8
+ //# sourceMappingURL=security.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"security.d.ts","sourceRoot":"","sources":["../../../src/sidecar/routes/security.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAsFxC,wBAAgB,eAAe,CAAC,MAAM,EAAE,UAAU,GAAG,YAAY,CAsChE;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,UAAU,GAAG,YAAY,CA8C/D;AAMD,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,UAAU,GAAG,YAAY,CA2CpE;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,UAAU,GAAG,YAAY,CAgDnE;AAMD,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,UAAU,GAAG,YAAY,CAqErE"}