@agentplugged/claw 0.1.0 → 0.2.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 (87) hide show
  1. package/dist/cli.js +3 -7
  2. package/dist/cli.js.map +1 -1
  3. package/dist/config.d.ts +1 -2
  4. package/dist/config.d.ts.map +1 -1
  5. package/dist/config.js +5 -5
  6. package/dist/config.js.map +1 -1
  7. package/dist/index.d.ts +0 -9
  8. package/dist/index.d.ts.map +1 -1
  9. package/dist/index.js +21 -40
  10. package/dist/index.js.map +1 -1
  11. package/dist/router/index.d.ts.map +1 -1
  12. package/dist/router/index.js +363 -77
  13. package/dist/router/index.js.map +1 -1
  14. package/dist/router/logger.d.ts +3 -0
  15. package/dist/router/logger.d.ts.map +1 -1
  16. package/dist/router/logger.js +8 -5
  17. package/dist/router/logger.js.map +1 -1
  18. package/dist/router/types.d.ts +6 -9
  19. package/dist/router/types.d.ts.map +1 -1
  20. package/dist/sidecar/auth.d.ts.map +1 -1
  21. package/dist/sidecar/auth.js +7 -11
  22. package/dist/sidecar/auth.js.map +1 -1
  23. package/dist/sidecar/index.js +104 -21
  24. package/dist/sidecar/index.js.map +1 -1
  25. package/dist/sidecar/routes/addons.d.ts.map +1 -1
  26. package/dist/sidecar/routes/addons.js +3 -13
  27. package/dist/sidecar/routes/addons.js.map +1 -1
  28. package/dist/sidecar/routes/api-keys.d.ts +4 -0
  29. package/dist/sidecar/routes/api-keys.d.ts.map +1 -0
  30. package/dist/sidecar/routes/api-keys.js +221 -0
  31. package/dist/sidecar/routes/api-keys.js.map +1 -0
  32. package/dist/sidecar/routes/bindings.d.ts +5 -0
  33. package/dist/sidecar/routes/bindings.d.ts.map +1 -0
  34. package/dist/sidecar/routes/bindings.js +64 -0
  35. package/dist/sidecar/routes/bindings.js.map +1 -0
  36. package/dist/sidecar/routes/channels.d.ts.map +1 -1
  37. package/dist/sidecar/routes/channels.js +71 -75
  38. package/dist/sidecar/routes/channels.js.map +1 -1
  39. package/dist/sidecar/routes/crons.d.ts +5 -0
  40. package/dist/sidecar/routes/crons.d.ts.map +1 -0
  41. package/dist/sidecar/routes/crons.js +81 -0
  42. package/dist/sidecar/routes/crons.js.map +1 -0
  43. package/dist/sidecar/routes/health.d.ts.map +1 -1
  44. package/dist/sidecar/routes/health.js +1 -5
  45. package/dist/sidecar/routes/health.js.map +1 -1
  46. package/dist/sidecar/routes/kitchen-proxy.d.ts +5 -0
  47. package/dist/sidecar/routes/kitchen-proxy.d.ts.map +1 -0
  48. package/dist/sidecar/routes/kitchen-proxy.js +29 -0
  49. package/dist/sidecar/routes/kitchen-proxy.js.map +1 -0
  50. package/dist/sidecar/routes/memory.d.ts +0 -2
  51. package/dist/sidecar/routes/memory.d.ts.map +1 -1
  52. package/dist/sidecar/routes/memory.js +116 -113
  53. package/dist/sidecar/routes/memory.js.map +1 -1
  54. package/dist/sidecar/routes/metrics.js +5 -5
  55. package/dist/sidecar/routes/restart.d.ts.map +1 -1
  56. package/dist/sidecar/routes/restart.js +11 -2
  57. package/dist/sidecar/routes/restart.js.map +1 -1
  58. package/dist/sidecar/routes/router-config.d.ts +0 -1
  59. package/dist/sidecar/routes/router-config.d.ts.map +1 -1
  60. package/dist/sidecar/routes/router-config.js +2 -139
  61. package/dist/sidecar/routes/router-config.js.map +1 -1
  62. package/dist/sidecar/routes/skills.d.ts.map +1 -1
  63. package/dist/sidecar/routes/skills.js +23 -19
  64. package/dist/sidecar/routes/skills.js.map +1 -1
  65. package/dist/sidecar/routes/soul.d.ts +11 -0
  66. package/dist/sidecar/routes/soul.d.ts.map +1 -1
  67. package/dist/sidecar/routes/soul.js +59 -34
  68. package/dist/sidecar/routes/soul.js.map +1 -1
  69. package/dist/sidecar/routes/system.d.ts +7 -0
  70. package/dist/sidecar/routes/system.d.ts.map +1 -0
  71. package/dist/sidecar/routes/system.js +49 -0
  72. package/dist/sidecar/routes/system.js.map +1 -0
  73. package/dist/sidecar/routes/team.d.ts.map +1 -1
  74. package/dist/sidecar/routes/team.js +121 -74
  75. package/dist/sidecar/routes/team.js.map +1 -1
  76. package/dist/sidecar/routes/update.d.ts.map +1 -1
  77. package/dist/sidecar/routes/update.js +24 -10
  78. package/dist/sidecar/routes/update.js.map +1 -1
  79. package/dist/sidecar/routes/workflow.d.ts +8 -0
  80. package/dist/sidecar/routes/workflow.d.ts.map +1 -0
  81. package/dist/sidecar/routes/workflow.js +232 -0
  82. package/dist/sidecar/routes/workflow.js.map +1 -0
  83. package/dist/sidecar/utils.d.ts +14 -0
  84. package/dist/sidecar/utils.d.ts.map +1 -1
  85. package/dist/sidecar/utils.js +35 -1
  86. package/dist/sidecar/utils.js.map +1 -1
  87. package/package.json +1 -1
@@ -32,142 +32,143 @@ var __importStar = (this && this.__importStar) || (function () {
32
32
  return result;
33
33
  };
34
34
  })();
35
- var __importDefault = (this && this.__importDefault) || function (mod) {
36
- return (mod && mod.__esModule) ? mod : { "default": mod };
37
- };
38
35
  Object.defineProperty(exports, "__esModule", { value: true });
39
36
  exports.handleListMemory = handleListMemory;
40
- exports.handleCreateMemory = handleCreateMemory;
41
- exports.handleDeleteMemory = handleDeleteMemory;
42
37
  exports.handleListSessions = handleListSessions;
43
- const better_sqlite3_1 = __importDefault(require("better-sqlite3"));
44
38
  const fs = __importStar(require("fs"));
45
39
  const url = __importStar(require("url"));
46
40
  const utils_1 = require("../utils");
41
+ /**
42
+ * Counts rows in a SQLite table without loading all data.
43
+ * Returns 0 if the DB or table doesn't exist.
44
+ */
45
+ function countRows(dbPath, table) {
46
+ if (!fs.existsSync(dbPath))
47
+ return 0;
48
+ let db = null;
49
+ try {
50
+ const Database = require("better-sqlite3");
51
+ db = new Database(dbPath, { readonly: true });
52
+ // Check table exists
53
+ const row = db
54
+ .prepare("SELECT name FROM sqlite_master WHERE type='table' AND name=?")
55
+ .get(table);
56
+ if (!row)
57
+ return 0;
58
+ const countRow = db.prepare(`SELECT COUNT(*) as cnt FROM "${table}"`).get();
59
+ return countRow?.cnt ?? 0;
60
+ }
61
+ catch {
62
+ return 0;
63
+ }
64
+ finally {
65
+ if (db)
66
+ db.close();
67
+ }
68
+ }
69
+ // ---------------------------------------------------------------------------
70
+ // GET /memory — return memory stats from all sources (read-only)
71
+ // ---------------------------------------------------------------------------
47
72
  function handleListMemory(config) {
48
73
  return async (req, res) => {
49
- const memoryDb = `${config.runtimeDir}/data/memory.db`;
50
- if (!fs.existsSync(memoryDb)) {
51
- (0, utils_1.sendJson)(res, 200, { memories: [], total: 0, page: 1, pageSize: 20 });
52
- return;
53
- }
54
- // Parse pagination from query string
55
74
  const parsedUrl = url.parse(req.url ?? "", true);
56
- const page = Math.max(1, parseInt(parsedUrl.query["page"] ?? "1", 10));
57
- const pageSize = Math.min(100, Math.max(1, parseInt(parsedUrl.query["pageSize"] ?? "20", 10)));
58
- const offset = (page - 1) * pageSize;
59
- let db = null;
60
- try {
61
- db = new better_sqlite3_1.default(memoryDb, { readonly: true });
62
- const countRow = db
63
- .prepare("SELECT COUNT(*) as total FROM memories")
64
- .get();
65
- const total = countRow?.total ?? 0;
66
- const memories = db
67
- .prepare(`SELECT id, content, metadata, created_at, updated_at
68
- FROM memories
69
- ORDER BY created_at DESC
70
- LIMIT ? OFFSET ?`)
71
- .all(pageSize, offset);
72
- db.close();
73
- (0, utils_1.sendJson)(res, 200, {
74
- memories: memories.map((m) => ({
75
- id: m.id,
76
- content: m.content,
77
- metadata: m.metadata ? JSON.parse(m.metadata) : null,
78
- createdAt: m.created_at,
79
- updatedAt: m.updated_at,
80
- })),
81
- total,
82
- page,
83
- pageSize,
84
- totalPages: Math.ceil(total / pageSize),
85
- });
86
- }
87
- catch (err) {
88
- db?.close();
89
- (0, utils_1.sendError)(res, 500, `Failed to query memory: ${err.message}`);
75
+ const mode = parsedUrl.query["mode"] ?? "stats";
76
+ const workspaceDir = `${config.runtimeDir}/workspace`;
77
+ const vectorStoreDbPath = `${workspaceDir}/vector_store.db`;
78
+ const legacyMemoryDbPath = `${config.dataDir}/memory.db`;
79
+ const openclawMemoryDb = `${config.dataDir}/.openclaw/memory/main.sqlite`;
80
+ const sources = [
81
+ {
82
+ source: "mem0",
83
+ count: countRows(vectorStoreDbPath, "vectors"),
84
+ available: fs.existsSync(vectorStoreDbPath),
85
+ },
86
+ {
87
+ source: "legacy",
88
+ count: countRows(legacyMemoryDbPath, "memories"),
89
+ available: fs.existsSync(legacyMemoryDbPath),
90
+ },
91
+ {
92
+ source: "openclaw",
93
+ count: countRows(openclawMemoryDb, "chunks"),
94
+ available: fs.existsSync(openclawMemoryDb),
95
+ },
96
+ ];
97
+ const total = sources.reduce((sum, s) => sum + s.count, 0);
98
+ if (mode === "stats") {
99
+ (0, utils_1.sendJson)(res, 200, { total, sources });
100
+ return;
90
101
  }
91
- };
92
- }
93
- function handleCreateMemory(config) {
94
- return async (req, res) => {
95
- const memoryDbPath = `${config.runtimeDir}/data/memory.db`;
96
- let db = null;
97
- try {
98
- const chunks = [];
99
- for await (const chunk of req)
100
- chunks.push(chunk);
101
- const body = JSON.parse(Buffer.concat(chunks).toString());
102
- if (!body.content || typeof body.content !== "string" || !body.content.trim()) {
103
- (0, utils_1.sendError)(res, 400, "content is required and must be a non-empty string");
104
- return;
102
+ // For mode=full, read actual memories from mem0 (primary source)
103
+ // This is for the dashboard memory viewer — read-only
104
+ if (mode === "full" && fs.existsSync(vectorStoreDbPath)) {
105
+ const page = Math.max(1, parseInt(parsedUrl.query["page"] ?? "1", 10));
106
+ const pageSize = Math.min(100, Math.max(1, parseInt(parsedUrl.query["pageSize"] ?? "20", 10)));
107
+ const offset = (page - 1) * pageSize;
108
+ let db = null;
109
+ try {
110
+ const Database = require("better-sqlite3");
111
+ db = new Database(vectorStoreDbPath, { readonly: true });
112
+ const rows = db
113
+ .prepare("SELECT id, payload FROM vectors LIMIT ? OFFSET ?")
114
+ .all(pageSize, offset);
115
+ const memories = rows.map((r) => {
116
+ try {
117
+ const payload = JSON.parse(r.payload);
118
+ return {
119
+ id: `mem0:${r.id}`,
120
+ content: payload.data ?? "",
121
+ type: "fact",
122
+ source: `mem0/${payload.runId ?? payload.userId ?? "default"}`,
123
+ createdAt: payload.createdAt ?? null,
124
+ };
125
+ }
126
+ catch {
127
+ return {
128
+ id: `mem0:${r.id}`,
129
+ content: r.payload,
130
+ type: "fact",
131
+ source: "mem0/unknown",
132
+ createdAt: null,
133
+ };
134
+ }
135
+ });
136
+ (0, utils_1.sendJson)(res, 200, {
137
+ memories,
138
+ total,
139
+ page,
140
+ pageSize,
141
+ totalPages: Math.ceil(total / pageSize),
142
+ sources,
143
+ });
105
144
  }
106
- const type = body.type ?? "fact";
107
- const source = body.source ?? "dashboard";
108
- const confidence = body.confidence ?? 1.0;
109
- const content = body.content.trim();
110
- db = new better_sqlite3_1.default(memoryDbPath);
111
- const result = db
112
- .prepare("INSERT INTO memories (type, content, source, confidence) VALUES (?, ?, ?, ?)")
113
- .run(type, content, source, confidence);
114
- const inserted = db
115
- .prepare("SELECT id, type, content, source, confidence, created_at FROM memories WHERE id = ?")
116
- .get(result.lastInsertRowid);
117
- (0, utils_1.sendJson)(res, 201, {
118
- ok: true,
119
- id: result.lastInsertRowid,
120
- memory: inserted,
121
- });
122
- }
123
- catch (err) {
124
- (0, utils_1.sendError)(res, 500, `Failed to create memory: ${err.message}`);
125
- }
126
- finally {
127
- db?.close();
128
- }
129
- };
130
- }
131
- function handleDeleteMemory(config) {
132
- return async (req, res) => {
133
- const memoryDbPath = `${config.runtimeDir}/data/memory.db`;
134
- let db = null;
135
- try {
136
- const match = req.url?.match(/\/memory\/(\d+)/);
137
- if (!match) {
138
- (0, utils_1.sendError)(res, 400, "Invalid URL — expected /memory/:id");
139
- return;
145
+ catch (err) {
146
+ (0, utils_1.sendError)(res, 500, `Failed to read memories: ${err.message}`);
140
147
  }
141
- const parsedId = parseInt(match[1], 10);
142
- db = new better_sqlite3_1.default(memoryDbPath);
143
- const result = db
144
- .prepare("DELETE FROM memories WHERE id = ?")
145
- .run(parsedId);
146
- if (result.changes === 0) {
147
- (0, utils_1.sendError)(res, 404, "Memory not found");
148
- return;
148
+ finally {
149
+ if (db)
150
+ db.close();
149
151
  }
150
- (0, utils_1.sendJson)(res, 200, { ok: true, id: parsedId });
151
- }
152
- catch (err) {
153
- (0, utils_1.sendError)(res, 500, `Failed to delete memory: ${err.message}`);
154
- }
155
- finally {
156
- db?.close();
152
+ return;
157
153
  }
154
+ // Default: just stats
155
+ (0, utils_1.sendJson)(res, 200, { total, sources });
158
156
  };
159
157
  }
158
+ // ---------------------------------------------------------------------------
159
+ // GET /sessions — list recent sessions from router.db (unchanged)
160
+ // ---------------------------------------------------------------------------
160
161
  function handleListSessions(config) {
161
162
  return async (_req, res) => {
162
- const routerDb = `${config.runtimeDir}/data/router.db`;
163
+ const routerDb = `${config.dataDir}/router.db`;
163
164
  if (!fs.existsSync(routerDb)) {
164
165
  (0, utils_1.sendJson)(res, 200, { sessions: [], total: 0 });
165
166
  return;
166
167
  }
167
168
  let db = null;
168
169
  try {
169
- db = new better_sqlite3_1.default(routerDb, { readonly: true });
170
- // Try to query by session_id if that column exists
170
+ const Database = require("better-sqlite3");
171
+ db = new Database(routerDb, { readonly: true });
171
172
  let sessions = [];
172
173
  try {
173
174
  sessions = db
@@ -210,6 +211,7 @@ function handleListSessions(config) {
210
211
  return;
211
212
  }
212
213
  db.close();
214
+ db = null;
213
215
  (0, utils_1.sendJson)(res, 200, {
214
216
  sessions: sessions.map((s) => ({
215
217
  sessionId: s.session_id,
@@ -226,7 +228,8 @@ function handleListSessions(config) {
226
228
  });
227
229
  }
228
230
  catch (err) {
229
- db?.close();
231
+ if (db)
232
+ db.close();
230
233
  (0, utils_1.sendError)(res, 500, `Failed to query sessions: ${err.message}`);
231
234
  }
232
235
  };
@@ -1 +1 @@
1
- {"version":3,"file":"memory.js","sourceRoot":"","sources":["../../../src/sidecar/routes/memory.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"memory.js","sourceRoot":"","sources":["../../../src/sidecar/routes/memory.ts"],"names":[],"mappings":"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"}
@@ -57,10 +57,10 @@ function queryRouterStats(db) {
57
57
  const today = db
58
58
  .prepare(`SELECT
59
59
  COUNT(*) as total_requests,
60
- SUM(inputTokens) as total_input_tokens,
61
- SUM(outputTokens) as total_output_tokens,
60
+ SUM(input_tokens) as total_input_tokens,
61
+ SUM(output_tokens) as total_output_tokens,
62
62
  SUM(cost) as total_cost,
63
- AVG(latencyMs) as avg_latency,
63
+ AVG(latency_ms) as avg_latency,
64
64
  SUM(CASE WHEN success = 0 THEN 1 ELSE 0 END) as error_count
65
65
  FROM router_logs
66
66
  WHERE timestamp >= datetime('now', '-1 day')`)
@@ -84,7 +84,7 @@ function queryRouterStats(db) {
84
84
  model,
85
85
  COUNT(*) as count,
86
86
  SUM(cost) as total_cost,
87
- SUM(inputTokens + outputTokens) as total_tokens
87
+ SUM(input_tokens + output_tokens) as total_tokens
88
88
  FROM router_logs
89
89
  WHERE timestamp >= datetime('now', '-30 days')
90
90
  GROUP BY model
@@ -232,7 +232,7 @@ function handleLiveMetrics(routerDbPath) {
232
232
  const live = db
233
233
  .prepare(`SELECT
234
234
  COUNT(*) as messages_today,
235
- SUM(inputTokens + outputTokens) as tokens_today,
235
+ SUM(input_tokens + output_tokens) as tokens_today,
236
236
  SUM(cost) as cost_today
237
237
  FROM router_logs
238
238
  WHERE timestamp >= datetime('now', 'start of day')`)
@@ -1 +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"}
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;AAWxC,wBAAgB,aAAa,CAAC,OAAO,EAAE,UAAU,GAAG,YAAY,CAiD/D"}
@@ -35,6 +35,10 @@ var __importStar = (this && this.__importStar) || (function () {
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
36
  exports.handleRestart = handleRestart;
37
37
  const utils_1 = require("../utils");
38
+ /** Strict whitelist of service names that can be restarted */
39
+ const ALLOWED_SERVICES = new Set([
40
+ "openclaw", "ironclaw", "claw-router", "claw-sidecar", "caddy",
41
+ ]);
38
42
  function handleRestart(_config) {
39
43
  return async (req, res) => {
40
44
  let body = {};
@@ -48,8 +52,13 @@ function handleRestart(_config) {
48
52
  const service = body.service ?? "openclaw";
49
53
  const results = {};
50
54
  const restart = async (svc) => {
55
+ // SECURITY: validate service name against whitelist before exec
56
+ if (!ALLOWED_SERVICES.has(svc)) {
57
+ results[svc] = "rejected: invalid service name";
58
+ return;
59
+ }
51
60
  try {
52
- const { stdout, stderr } = await (0, utils_1.execCommand)(`systemctl restart ${svc}`);
61
+ const { stdout, stderr } = await (0, utils_1.execSafeCommand)("sudo", ["systemctl", "restart", svc]);
53
62
  results[svc] = stdout || stderr || "restarted";
54
63
  }
55
64
  catch (err) {
@@ -65,7 +74,7 @@ function handleRestart(_config) {
65
74
  await restart("claw-router");
66
75
  }
67
76
  else {
68
- await restart("openclaw");
77
+ await restart(service);
69
78
  }
70
79
  (0, utils_1.sendJson)(res, 200, {
71
80
  restarted: true,
@@ -1 +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"}
1
+ {"version":3,"file":"restart.js","sourceRoot":"","sources":["../../../src/sidecar/routes/restart.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAcA,sCAiDC;AA7DD,oCAAgE;AAOhE,8DAA8D;AAC9D,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC;IAC/B,UAAU,EAAE,UAAU,EAAE,aAAa,EAAE,cAAc,EAAE,OAAO;CAC/D,CAAC,CAAC;AAEH,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,gEAAgE;YAChE,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC/B,OAAO,CAAC,GAAG,CAAC,GAAG,gCAAgC,CAAC;gBAChD,OAAO;YACT,CAAC;YACD,IAAI,CAAC;gBACH,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,IAAA,uBAAe,EAC9C,MAAM,EAAE,CAAC,WAAW,EAAE,SAAS,EAAE,GAAG,CAAC,CACtC,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,OAAO,CAAC,CAAC;YACzB,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"}
@@ -1,5 +1,4 @@
1
1
  import { ClawConfig } from "../../config";
2
2
  import { RouteHandler } from "./health";
3
3
  export declare function handleGetRouterConfig(config: ClawConfig): RouteHandler;
4
- export declare function handleUpdateStrategy(config: ClawConfig): RouteHandler;
5
4
  //# sourceMappingURL=router-config.d.ts.map
@@ -1 +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"}
1
+ {"version":3,"file":"router-config.d.ts","sourceRoot":"","sources":["../../../src/sidecar/routes/router-config.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAExC,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,UAAU,GAAG,YAAY,CAOtE"}
@@ -1,149 +1,12 @@
1
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
2
  Object.defineProperty(exports, "__esModule", { value: true });
36
3
  exports.handleGetRouterConfig = handleGetRouterConfig;
37
- exports.handleUpdateStrategy = handleUpdateStrategy;
38
- const fs = __importStar(require("fs/promises"));
39
- const path = __importStar(require("path"));
40
4
  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
5
  function handleGetRouterConfig(config) {
65
6
  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
7
  (0, utils_1.sendJson)(res, 200, {
142
- updated: true,
143
- strategy: body.strategy,
144
- previousStrategy: config.strategy,
145
- configFile: config.configFile,
146
- reload: reloadResult,
8
+ mode: "passthrough",
9
+ routerPort: config.routerPort,
147
10
  });
148
11
  };
149
12
  }
@@ -1 +1 @@
1
- {"version":3,"file":"router-config.js","sourceRoot":"","sources":["../../../src/sidecar/routes/router-config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"router-config.js","sourceRoot":"","sources":["../../../src/sidecar/routes/router-config.ts"],"names":[],"mappings":";;AAKA,sDAOC;AAVD,oCAAoC;AAGpC,SAAgB,qBAAqB,CAAC,MAAkB;IACtD,OAAO,KAAK,EAAE,IAAqB,EAAE,GAAmB,EAAiB,EAAE;QACzE,IAAA,gBAAQ,EAAC,GAAG,EAAE,GAAG,EAAE;YACjB,IAAI,EAAE,aAAa;YACnB,UAAU,EAAE,MAAM,CAAC,UAAU;SAC9B,CAAC,CAAC;IACL,CAAC,CAAC;AACJ,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"skills.d.ts","sourceRoot":"","sources":["../../../src/sidecar/routes/skills.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAoBxC,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,UAAU,GAAG,YAAY,CAuCjE;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,UAAU,GAAG,YAAY,CA0EjE"}
1
+ {"version":3,"file":"skills.d.ts","sourceRoot":"","sources":["../../../src/sidecar/routes/skills.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAoBxC,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,UAAU,GAAG,YAAY,CA0CjE;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,UAAU,GAAG,YAAY,CA0EjE"}