@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,308 @@
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.handleListVault = handleListVault;
40
+ exports.handleAddVault = handleAddVault;
41
+ exports.handleListAllowlist = handleListAllowlist;
42
+ exports.handleAddAllowlist = handleAddAllowlist;
43
+ exports.handleSecurityAlerts = handleSecurityAlerts;
44
+ const better_sqlite3_1 = __importDefault(require("better-sqlite3"));
45
+ const fs = __importStar(require("fs"));
46
+ const url = __importStar(require("url"));
47
+ const utils_1 = require("../utils");
48
+ // ---------------------------------------------------------------------------
49
+ // Schema
50
+ // ---------------------------------------------------------------------------
51
+ const SECURITY_SCHEMA = `
52
+ CREATE TABLE IF NOT EXISTS vault (
53
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
54
+ key TEXT NOT NULL UNIQUE,
55
+ value TEXT NOT NULL,
56
+ created_at TEXT NOT NULL DEFAULT (datetime('now')),
57
+ updated_at TEXT NOT NULL DEFAULT (datetime('now'))
58
+ );
59
+
60
+ CREATE TABLE IF NOT EXISTS allowlist (
61
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
62
+ type TEXT NOT NULL CHECK(type IN ('domain', 'ip', 'tool')),
63
+ value TEXT NOT NULL,
64
+ description TEXT,
65
+ created_at TEXT NOT NULL DEFAULT (datetime('now')),
66
+ UNIQUE(type, value)
67
+ );
68
+
69
+ CREATE TABLE IF NOT EXISTS security_alerts (
70
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
71
+ severity TEXT NOT NULL CHECK(severity IN ('low', 'medium', 'high', 'critical')),
72
+ type TEXT NOT NULL,
73
+ message TEXT NOT NULL,
74
+ details TEXT,
75
+ acknowledged INTEGER NOT NULL DEFAULT 0,
76
+ created_at TEXT NOT NULL DEFAULT (datetime('now'))
77
+ );
78
+ CREATE INDEX IF NOT EXISTS idx_alerts_severity ON security_alerts(severity);
79
+ CREATE INDEX IF NOT EXISTS idx_alerts_created ON security_alerts(created_at);
80
+ `;
81
+ // ---------------------------------------------------------------------------
82
+ // DB helper
83
+ // ---------------------------------------------------------------------------
84
+ function openSecurityDb(config) {
85
+ const dbPath = `${config.dataDir}/data/security.db`;
86
+ const dir = `${config.dataDir}/data`;
87
+ if (!fs.existsSync(dir)) {
88
+ fs.mkdirSync(dir, { recursive: true });
89
+ }
90
+ const db = new better_sqlite3_1.default(dbPath);
91
+ db.pragma("journal_mode = WAL");
92
+ db.exec(SECURITY_SCHEMA);
93
+ return db;
94
+ }
95
+ // ---------------------------------------------------------------------------
96
+ // Vault
97
+ // ---------------------------------------------------------------------------
98
+ function handleListVault(config) {
99
+ return async (_req, res) => {
100
+ if (config.mode !== "secure") {
101
+ (0, utils_1.sendJson)(res, 501, {
102
+ error: "Not implemented",
103
+ message: "Vault management requires secure mode (IronClaw). Upgrade to access this feature.",
104
+ upgradeUrl: "https://agentplugged.ai/pricing",
105
+ });
106
+ return;
107
+ }
108
+ let db = null;
109
+ try {
110
+ db = openSecurityDb(config);
111
+ const rows = db
112
+ .prepare("SELECT id, key, created_at, updated_at FROM vault ORDER BY key ASC")
113
+ .all();
114
+ const items = rows.map((r) => ({
115
+ id: r.id,
116
+ key: r.key,
117
+ masked: "***",
118
+ createdAt: r.created_at,
119
+ updatedAt: r.updated_at,
120
+ }));
121
+ (0, utils_1.sendJson)(res, 200, { items, total: items.length });
122
+ }
123
+ catch (err) {
124
+ (0, utils_1.sendError)(res, 500, `Failed to list vault: ${err.message}`);
125
+ }
126
+ finally {
127
+ db?.close();
128
+ }
129
+ };
130
+ }
131
+ function handleAddVault(config) {
132
+ return async (req, res) => {
133
+ if (config.mode !== "secure") {
134
+ (0, utils_1.sendJson)(res, 501, {
135
+ error: "Not implemented",
136
+ message: "Vault management requires secure mode (IronClaw). Upgrade to access this feature.",
137
+ upgradeUrl: "https://agentplugged.ai/pricing",
138
+ });
139
+ return;
140
+ }
141
+ let db = null;
142
+ try {
143
+ const chunks = [];
144
+ for await (const chunk of req)
145
+ chunks.push(chunk);
146
+ const body = JSON.parse(Buffer.concat(chunks).toString());
147
+ if (!body.key || typeof body.key !== "string" || !body.key.trim()) {
148
+ (0, utils_1.sendError)(res, 400, "key is required and must be a non-empty string");
149
+ return;
150
+ }
151
+ if (!body.value || typeof body.value !== "string" || !body.value.trim()) {
152
+ (0, utils_1.sendError)(res, 400, "value is required and must be a non-empty string");
153
+ return;
154
+ }
155
+ const key = body.key.trim();
156
+ const value = body.value;
157
+ db = openSecurityDb(config);
158
+ db
159
+ .prepare("INSERT OR REPLACE INTO vault (key, value, updated_at) VALUES (?, ?, datetime('now'))")
160
+ .run(key, value);
161
+ (0, utils_1.sendJson)(res, 201, { ok: true, key });
162
+ }
163
+ catch (err) {
164
+ (0, utils_1.sendError)(res, 500, `Failed to add vault entry: ${err.message}`);
165
+ }
166
+ finally {
167
+ db?.close();
168
+ }
169
+ };
170
+ }
171
+ // ---------------------------------------------------------------------------
172
+ // Allowlist
173
+ // ---------------------------------------------------------------------------
174
+ function handleListAllowlist(config) {
175
+ return async (req, res) => {
176
+ if (config.mode !== "secure") {
177
+ (0, utils_1.sendJson)(res, 501, {
178
+ error: "Not implemented",
179
+ message: "Allowlist management requires secure mode (IronClaw). Upgrade to access this feature.",
180
+ upgradeUrl: "https://agentplugged.ai/pricing",
181
+ });
182
+ return;
183
+ }
184
+ let db = null;
185
+ try {
186
+ const parsedUrl = url.parse(req.url ?? "", true);
187
+ const typeFilter = parsedUrl.query["type"];
188
+ db = openSecurityDb(config);
189
+ let rows;
190
+ if (typeFilter && ["domain", "ip", "tool"].includes(typeFilter)) {
191
+ rows = db
192
+ .prepare("SELECT * FROM allowlist WHERE type = ? ORDER BY type, value")
193
+ .all(typeFilter);
194
+ }
195
+ else {
196
+ rows = db
197
+ .prepare("SELECT * FROM allowlist ORDER BY type, value")
198
+ .all();
199
+ }
200
+ (0, utils_1.sendJson)(res, 200, { items: rows, total: rows.length });
201
+ }
202
+ catch (err) {
203
+ (0, utils_1.sendError)(res, 500, `Failed to list allowlist: ${err.message}`);
204
+ }
205
+ finally {
206
+ db?.close();
207
+ }
208
+ };
209
+ }
210
+ function handleAddAllowlist(config) {
211
+ return async (req, res) => {
212
+ if (config.mode !== "secure") {
213
+ (0, utils_1.sendJson)(res, 501, {
214
+ error: "Not implemented",
215
+ message: "Allowlist management requires secure mode (IronClaw). Upgrade to access this feature.",
216
+ upgradeUrl: "https://agentplugged.ai/pricing",
217
+ });
218
+ return;
219
+ }
220
+ let db = null;
221
+ try {
222
+ const chunks = [];
223
+ for await (const chunk of req)
224
+ chunks.push(chunk);
225
+ const body = JSON.parse(Buffer.concat(chunks).toString());
226
+ const validTypes = ["domain", "ip", "tool"];
227
+ if (!body.type || !validTypes.includes(body.type)) {
228
+ (0, utils_1.sendError)(res, 400, "type is required and must be one of: domain, ip, tool");
229
+ return;
230
+ }
231
+ if (!body.value || typeof body.value !== "string" || !body.value.trim()) {
232
+ (0, utils_1.sendError)(res, 400, "value is required and must be a non-empty string");
233
+ return;
234
+ }
235
+ const type = body.type;
236
+ const value = body.value.trim();
237
+ const description = body.description ?? null;
238
+ db = openSecurityDb(config);
239
+ db
240
+ .prepare("INSERT OR IGNORE INTO allowlist (type, value, description) VALUES (?, ?, ?)")
241
+ .run(type, value, description);
242
+ (0, utils_1.sendJson)(res, 201, { ok: true, type, value });
243
+ }
244
+ catch (err) {
245
+ (0, utils_1.sendError)(res, 500, `Failed to add allowlist entry: ${err.message}`);
246
+ }
247
+ finally {
248
+ db?.close();
249
+ }
250
+ };
251
+ }
252
+ // ---------------------------------------------------------------------------
253
+ // Security alerts
254
+ // ---------------------------------------------------------------------------
255
+ function handleSecurityAlerts(config) {
256
+ return async (req, res) => {
257
+ if (config.mode !== "secure") {
258
+ (0, utils_1.sendJson)(res, 501, {
259
+ error: "Not implemented",
260
+ message: "Security alerts require secure mode (IronClaw). Upgrade to access this feature.",
261
+ upgradeUrl: "https://agentplugged.ai/pricing",
262
+ });
263
+ return;
264
+ }
265
+ let db = null;
266
+ try {
267
+ const parsedUrl = url.parse(req.url ?? "", true);
268
+ const severityFilter = parsedUrl.query["severity"];
269
+ const acknowledgedFilter = parsedUrl.query["acknowledged"];
270
+ const limit = Math.min(500, Math.max(1, parseInt(parsedUrl.query["limit"] ?? "50", 10)));
271
+ db = openSecurityDb(config);
272
+ const conditions = [];
273
+ const params = [];
274
+ const validSeverities = ["low", "medium", "high", "critical"];
275
+ if (severityFilter && validSeverities.includes(severityFilter)) {
276
+ conditions.push("severity = ?");
277
+ params.push(severityFilter);
278
+ }
279
+ if (acknowledgedFilter === "0" || acknowledgedFilter === "1") {
280
+ conditions.push("acknowledged = ?");
281
+ params.push(parseInt(acknowledgedFilter, 10));
282
+ }
283
+ const where = conditions.length > 0 ? `WHERE ${conditions.join(" AND ")}` : "";
284
+ const countRow = db
285
+ .prepare(`SELECT COUNT(*) as total FROM security_alerts ${where}`)
286
+ .get(...params);
287
+ const total = countRow?.total ?? 0;
288
+ params.push(limit);
289
+ const alerts = db
290
+ .prepare(`SELECT * FROM security_alerts ${where} ORDER BY created_at DESC LIMIT ?`)
291
+ .all(...params);
292
+ (0, utils_1.sendJson)(res, 200, {
293
+ alerts: alerts.map((a) => ({
294
+ ...a,
295
+ acknowledged: a.acknowledged === 1,
296
+ })),
297
+ total,
298
+ });
299
+ }
300
+ catch (err) {
301
+ (0, utils_1.sendError)(res, 500, `Failed to fetch security alerts: ${err.message}`);
302
+ }
303
+ finally {
304
+ db?.close();
305
+ }
306
+ };
307
+ }
308
+ //# sourceMappingURL=security.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"security.js","sourceRoot":"","sources":["../../../src/sidecar/routes/security.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import { ClawConfig } from "../../config";
2
+ import { RouteHandler } from "./health";
3
+ export declare function handleListSkills(config: ClawConfig): RouteHandler;
4
+ export declare function handlePushSkills(config: ClawConfig): RouteHandler;
5
+ //# sourceMappingURL=skills.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,146 @@
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.handleListSkills = handleListSkills;
37
+ exports.handlePushSkills = handlePushSkills;
38
+ const fs = __importStar(require("fs/promises"));
39
+ const path = __importStar(require("path"));
40
+ const utils_1 = require("../utils");
41
+ function getSkillsDir(config) {
42
+ return path.join(config.runtimeDir, "workspace", "skills");
43
+ }
44
+ function handleListSkills(config) {
45
+ return async (_req, res) => {
46
+ const skillsDir = getSkillsDir(config);
47
+ try {
48
+ await fs.mkdir(skillsDir, { recursive: true });
49
+ const entries = await fs.readdir(skillsDir, { withFileTypes: true });
50
+ const skills = [];
51
+ for (const entry of entries) {
52
+ if (!entry.isFile())
53
+ continue;
54
+ if (!entry.name.endsWith(".md") && !entry.name.endsWith(".txt")) {
55
+ continue;
56
+ }
57
+ const filePath = path.join(skillsDir, entry.name);
58
+ const [content, stat] = await Promise.all([
59
+ fs.readFile(filePath, "utf-8"),
60
+ fs.stat(filePath),
61
+ ]);
62
+ skills.push({
63
+ name: entry.name.replace(/\.(md|txt)$/, ""),
64
+ content,
65
+ size: stat.size,
66
+ updatedAt: stat.mtime.toISOString(),
67
+ });
68
+ }
69
+ (0, utils_1.sendJson)(res, 200, {
70
+ skills,
71
+ count: skills.length,
72
+ directory: skillsDir,
73
+ });
74
+ }
75
+ catch (err) {
76
+ (0, utils_1.sendError)(res, 500, `Failed to list skills: ${err.message}`);
77
+ }
78
+ };
79
+ }
80
+ function handlePushSkills(config) {
81
+ return async (req, res) => {
82
+ let body;
83
+ try {
84
+ body = (await (0, utils_1.parseBody)(req));
85
+ }
86
+ catch {
87
+ (0, utils_1.sendError)(res, 400, "Invalid JSON body");
88
+ return;
89
+ }
90
+ if (!body.skills || !Array.isArray(body.skills)) {
91
+ (0, utils_1.sendError)(res, 422, "Body must contain a 'skills' array");
92
+ return;
93
+ }
94
+ if (body.skills.length === 0) {
95
+ (0, utils_1.sendError)(res, 422, "Skills array must not be empty");
96
+ return;
97
+ }
98
+ for (const skill of body.skills) {
99
+ if (!skill.name || typeof skill.name !== "string") {
100
+ (0, utils_1.sendError)(res, 422, "Each skill must have a 'name' string field");
101
+ return;
102
+ }
103
+ if (typeof skill.content !== "string") {
104
+ (0, utils_1.sendError)(res, 422, `Skill '${skill.name}' must have a 'content' string field`);
105
+ return;
106
+ }
107
+ // Prevent path traversal
108
+ if (skill.name.includes("..") || skill.name.includes("/") || skill.name.includes("\\")) {
109
+ (0, utils_1.sendError)(res, 422, `Skill name '${skill.name}' is invalid`);
110
+ return;
111
+ }
112
+ }
113
+ const skillsDir = getSkillsDir(config);
114
+ try {
115
+ await fs.mkdir(skillsDir, { recursive: true });
116
+ const written = [];
117
+ for (const skill of body.skills) {
118
+ const sanitizedName = skill.name.endsWith(".md")
119
+ ? skill.name
120
+ : `${skill.name}.md`;
121
+ const filePath = path.join(skillsDir, sanitizedName);
122
+ await fs.writeFile(filePath, skill.content, "utf-8");
123
+ written.push(sanitizedName);
124
+ }
125
+ // Restart openclaw to pick up new skills
126
+ let restartResult;
127
+ try {
128
+ const { stdout, stderr } = await (0, utils_1.execCommand)("systemctl restart openclaw");
129
+ restartResult = stdout || stderr || "restarted";
130
+ }
131
+ catch (err) {
132
+ restartResult = `restart failed: ${err.message}`;
133
+ }
134
+ (0, utils_1.sendJson)(res, 201, {
135
+ written,
136
+ count: written.length,
137
+ directory: skillsDir,
138
+ restart: restartResult,
139
+ });
140
+ }
141
+ catch (err) {
142
+ (0, utils_1.sendError)(res, 500, `Failed to push skills: ${err.message}`);
143
+ }
144
+ };
145
+ }
146
+ //# sourceMappingURL=skills.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skills.js","sourceRoot":"","sources":["../../../src/sidecar/routes/skills.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 handleUpdateSoul(config: ClawConfig): RouteHandler;
4
+ //# sourceMappingURL=soul.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"soul.d.ts","sourceRoot":"","sources":["../../../src/sidecar/routes/soul.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AA6CxC,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,UAAU,GAAG,YAAY,CAoEjE"}
@@ -0,0 +1,115 @@
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.handleUpdateSoul = handleUpdateSoul;
37
+ const fs = __importStar(require("fs/promises"));
38
+ const path = __importStar(require("path"));
39
+ const utils_1 = require("../utils");
40
+ function buildPersonaMarkdown(soul) {
41
+ const lines = [];
42
+ lines.push("# Agent Persona");
43
+ lines.push("");
44
+ if (soul.name) {
45
+ lines.push(`**Name**: ${soul.name}`);
46
+ }
47
+ if (soul.personality) {
48
+ lines.push(`**Personality**: ${soul.personality}`);
49
+ }
50
+ if (soul.language) {
51
+ lines.push(`**Language**: ${soul.language}`);
52
+ }
53
+ if (soul.template) {
54
+ lines.push(`**Template**: ${soul.template}`);
55
+ }
56
+ if (soul.rules && soul.rules.length > 0) {
57
+ lines.push("");
58
+ lines.push("## Rules");
59
+ for (const rule of soul.rules) {
60
+ lines.push(`- ${rule}`);
61
+ }
62
+ }
63
+ lines.push("");
64
+ return lines.join("\n");
65
+ }
66
+ function handleUpdateSoul(config) {
67
+ return async (req, res) => {
68
+ let body;
69
+ try {
70
+ body = (await (0, utils_1.parseBody)(req));
71
+ }
72
+ catch {
73
+ (0, utils_1.sendError)(res, 400, "Invalid JSON body");
74
+ return;
75
+ }
76
+ if (!body.name &&
77
+ !body.personality &&
78
+ !body.language &&
79
+ !body.rules &&
80
+ !body.template) {
81
+ (0, utils_1.sendError)(res, 422, "At least one of name, personality, language, rules, or template must be provided");
82
+ return;
83
+ }
84
+ if (body.rules !== undefined && !Array.isArray(body.rules)) {
85
+ (0, utils_1.sendError)(res, 422, "'rules' must be an array of strings");
86
+ return;
87
+ }
88
+ const personaPath = path.join(config.runtimeDir, "workspace", "persona.md");
89
+ const markdown = buildPersonaMarkdown(body);
90
+ try {
91
+ await fs.mkdir(path.dirname(personaPath), { recursive: true });
92
+ await fs.writeFile(personaPath, markdown, "utf-8");
93
+ }
94
+ catch (err) {
95
+ (0, utils_1.sendError)(res, 500, `Failed to write persona file: ${err.message}`);
96
+ return;
97
+ }
98
+ // Restart openclaw to apply new persona
99
+ let restartResult;
100
+ try {
101
+ const { stdout, stderr } = await (0, utils_1.execCommand)("systemctl restart openclaw");
102
+ restartResult = stdout || stderr || "restarted";
103
+ }
104
+ catch (err) {
105
+ restartResult = `restart failed: ${err.message}`;
106
+ }
107
+ (0, utils_1.sendJson)(res, 200, {
108
+ updated: true,
109
+ personaPath,
110
+ persona: body,
111
+ restart: restartResult,
112
+ });
113
+ };
114
+ }
115
+ //# sourceMappingURL=soul.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"soul.js","sourceRoot":"","sources":["../../../src/sidecar/routes/soul.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 handleDeployTeam(config: ClawConfig): RouteHandler;
4
+ //# sourceMappingURL=team.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"team.d.ts","sourceRoot":"","sources":["../../../src/sidecar/routes/team.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAkDxC,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,UAAU,GAAG,YAAY,CA+FjE"}