@christopherlittle51/postclaw 1.0.4 → 1.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.
- package/README.md +1 -1
- package/dashboard/public/app.js +743 -0
- package/dashboard/public/index.html +350 -0
- package/dashboard/public/styles.css +571 -0
- package/dist/dashboard/helpers.d.ts +32 -0
- package/dist/dashboard/helpers.d.ts.map +1 -0
- package/dist/dashboard/helpers.js +122 -0
- package/dist/dashboard/helpers.js.map +1 -0
- package/dist/dashboard/router.d.ts +39 -0
- package/dist/dashboard/router.d.ts.map +1 -0
- package/dist/dashboard/router.js +94 -0
- package/dist/dashboard/router.js.map +1 -0
- package/dist/dashboard/routes/config.d.ts +3 -0
- package/dist/dashboard/routes/config.d.ts.map +1 -0
- package/dist/dashboard/routes/config.js +53 -0
- package/dist/dashboard/routes/config.js.map +1 -0
- package/dist/dashboard/routes/graph.d.ts +11 -0
- package/dist/dashboard/routes/graph.d.ts.map +1 -0
- package/dist/dashboard/routes/graph.js +131 -0
- package/dist/dashboard/routes/graph.js.map +1 -0
- package/dist/dashboard/routes/memories.d.ts +12 -0
- package/dist/dashboard/routes/memories.d.ts.map +1 -0
- package/dist/dashboard/routes/memories.js +199 -0
- package/dist/dashboard/routes/memories.js.map +1 -0
- package/dist/dashboard/routes/personas.d.ts +11 -0
- package/dist/dashboard/routes/personas.d.ts.map +1 -0
- package/dist/dashboard/routes/personas.js +71 -0
- package/dist/dashboard/routes/personas.js.map +1 -0
- package/dist/dashboard/routes/scripts.d.ts +9 -0
- package/dist/dashboard/routes/scripts.d.ts.map +1 -0
- package/dist/dashboard/routes/scripts.js +62 -0
- package/dist/dashboard/routes/scripts.js.map +1 -0
- package/dist/dashboard/routes/workspace.d.ts +10 -0
- package/dist/dashboard/routes/workspace.d.ts.map +1 -0
- package/dist/dashboard/routes/workspace.js +82 -0
- package/dist/dashboard/routes/workspace.js.map +1 -0
- package/dist/dashboard/server.d.ts +14 -0
- package/dist/dashboard/server.d.ts.map +1 -0
- package/dist/dashboard/server.js +97 -0
- package/dist/dashboard/server.js.map +1 -0
- package/dist/index.d.ts +3 -27
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +142 -46
- package/dist/index.js.map +1 -1
- package/dist/schemas/validation.d.ts +406 -0
- package/dist/schemas/validation.d.ts.map +1 -1
- package/dist/schemas/validation.js +231 -4
- package/dist/schemas/validation.js.map +1 -1
- package/dist/scripts/bootstrap_persona.d.ts.map +1 -1
- package/dist/scripts/bootstrap_persona.js +9 -4
- package/dist/scripts/bootstrap_persona.js.map +1 -1
- package/dist/scripts/bootstrap_tools.js +16 -25
- package/dist/scripts/bootstrap_tools.js.map +1 -1
- package/dist/scripts/setup-db.d.ts.map +1 -1
- package/dist/scripts/setup-db.js +40 -33
- package/dist/scripts/setup-db.js.map +1 -1
- package/dist/scripts/sleep_cycle.d.ts +12 -0
- package/dist/scripts/sleep_cycle.d.ts.map +1 -1
- package/dist/scripts/sleep_cycle.js +57 -38
- package/dist/scripts/sleep_cycle.js.map +1 -1
- package/dist/services/config.d.ts +31 -0
- package/dist/services/config.d.ts.map +1 -0
- package/dist/services/config.js +125 -0
- package/dist/services/config.js.map +1 -0
- package/dist/services/db.d.ts.map +1 -1
- package/dist/services/db.js +6 -4
- package/dist/services/db.js.map +1 -1
- package/dist/services/llm.d.ts.map +1 -1
- package/dist/services/llm.js +13 -6
- package/dist/services/llm.js.map +1 -1
- package/dist/services/memoryService.d.ts +10 -38
- package/dist/services/memoryService.d.ts.map +1 -1
- package/dist/services/memoryService.js +27 -78
- package/dist/services/memoryService.js.map +1 -1
- package/dist/services/personaService.d.ts +22 -0
- package/dist/services/personaService.d.ts.map +1 -0
- package/dist/services/personaService.js +148 -0
- package/dist/services/personaService.js.map +1 -0
- package/dist/tests/dashboard-schemas.test.d.ts +6 -0
- package/dist/tests/dashboard-schemas.test.d.ts.map +1 -0
- package/dist/tests/dashboard-schemas.test.js +171 -0
- package/dist/tests/dashboard-schemas.test.js.map +1 -0
- package/dist/tests/helpers.test.d.ts +5 -0
- package/dist/tests/helpers.test.d.ts.map +1 -0
- package/dist/tests/helpers.test.js +66 -0
- package/dist/tests/helpers.test.js.map +1 -0
- package/dist/tests/router.test.d.ts +5 -0
- package/dist/tests/router.test.d.ts.map +1 -0
- package/dist/tests/router.test.js +125 -0
- package/dist/tests/router.test.js.map +1 -0
- package/openclaw.plugin.json +23 -0
- package/package.json +7 -2
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Dashboard API Routes — Memory management endpoints.
|
|
4
|
+
*
|
|
5
|
+
* GET /api/memories — List memories (paginated, filterable)
|
|
6
|
+
* POST /api/memories — Create memory
|
|
7
|
+
* PUT /api/memories/:id — Update memory
|
|
8
|
+
* DELETE /api/memories/:id — Archive memory
|
|
9
|
+
* POST /api/memories/import — Import from markdown content
|
|
10
|
+
*/
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.registerMemoryRoutes = registerMemoryRoutes;
|
|
13
|
+
const helpers_js_1 = require("../helpers.js");
|
|
14
|
+
const db_js_1 = require("../../services/db.js");
|
|
15
|
+
const memoryService_js_1 = require("../../services/memoryService.js");
|
|
16
|
+
const validation_js_1 = require("../../schemas/validation.js");
|
|
17
|
+
// =============================================================================
|
|
18
|
+
// REGISTER ROUTES
|
|
19
|
+
// =============================================================================
|
|
20
|
+
function registerMemoryRoutes(router) {
|
|
21
|
+
// LIST — paginated, filterable
|
|
22
|
+
router.get("/api/memories", async (_req, res, ctx) => {
|
|
23
|
+
const q = validation_js_1.MemoryListQuerySchema.parse(ctx.query);
|
|
24
|
+
const sql = (0, db_js_1.getSql)();
|
|
25
|
+
const rows = await sql.begin(async (tx) => {
|
|
26
|
+
await tx `SELECT set_config('app.current_agent_id', ${q.agentId}, true)`;
|
|
27
|
+
// Build dynamic WHERE clauses
|
|
28
|
+
const conditions = [`agent_id = '${q.agentId}'`];
|
|
29
|
+
if (q.archived === "false")
|
|
30
|
+
conditions.push("is_archived = false");
|
|
31
|
+
else if (q.archived === "true")
|
|
32
|
+
conditions.push("is_archived = true");
|
|
33
|
+
if (q.category)
|
|
34
|
+
conditions.push(`category = '${q.category}'`);
|
|
35
|
+
if (q.tier)
|
|
36
|
+
conditions.push(`tier = '${q.tier}'`);
|
|
37
|
+
const whereClause = conditions.join(" AND ");
|
|
38
|
+
const searchClause = q.search
|
|
39
|
+
? `AND content ILIKE '%${q.search.replace(/'/g, "''")}%'`
|
|
40
|
+
: "";
|
|
41
|
+
return await tx.unsafe(`
|
|
42
|
+
SELECT id, content, category, tier, volatility, access_scope,
|
|
43
|
+
access_count, usefulness_score, is_archived, is_pointer,
|
|
44
|
+
confidence, metadata, created_at, updated_at, expires_at
|
|
45
|
+
FROM memory_semantic
|
|
46
|
+
WHERE ${whereClause} ${searchClause}
|
|
47
|
+
ORDER BY created_at DESC
|
|
48
|
+
LIMIT ${q.limit} OFFSET ${q.offset}
|
|
49
|
+
`);
|
|
50
|
+
});
|
|
51
|
+
// Also get total count
|
|
52
|
+
const countResult = await sql.begin(async (tx) => {
|
|
53
|
+
await tx `SELECT set_config('app.current_agent_id', ${q.agentId}, true)`;
|
|
54
|
+
const archived = q.archived === "true" ? true : q.archived === "false" ? false : null;
|
|
55
|
+
if (archived === null) {
|
|
56
|
+
return await tx `SELECT count(*)::int as total FROM memory_semantic WHERE agent_id = ${q.agentId}`;
|
|
57
|
+
}
|
|
58
|
+
return await tx `SELECT count(*)::int as total FROM memory_semantic WHERE agent_id = ${q.agentId} AND is_archived = ${archived}`;
|
|
59
|
+
});
|
|
60
|
+
(0, helpers_js_1.sendJson)(res, 200, {
|
|
61
|
+
ok: true,
|
|
62
|
+
data: { memories: rows, total: countResult[0]?.total || 0 },
|
|
63
|
+
});
|
|
64
|
+
});
|
|
65
|
+
// CREATE
|
|
66
|
+
router.post("/api/memories", async (req, res, ctx) => {
|
|
67
|
+
const agentId = ctx.query.agentId || "main";
|
|
68
|
+
const body = await (0, helpers_js_1.parseBody)(req);
|
|
69
|
+
if (!body)
|
|
70
|
+
return (0, helpers_js_1.sendError)(res, 400, "Invalid JSON body");
|
|
71
|
+
try {
|
|
72
|
+
const data = validation_js_1.DashboardMemoryCreateSchema.parse(body);
|
|
73
|
+
await (0, memoryService_js_1.ensureAgent)(agentId);
|
|
74
|
+
const result = await (0, memoryService_js_1.storeMemory)(agentId, data.content, data.scope, {
|
|
75
|
+
category: data.category,
|
|
76
|
+
tier: data.tier,
|
|
77
|
+
volatility: data.volatility,
|
|
78
|
+
metadata: data.metadata,
|
|
79
|
+
});
|
|
80
|
+
(0, helpers_js_1.sendJson)(res, 201, { ok: true, data: result });
|
|
81
|
+
}
|
|
82
|
+
catch (err) {
|
|
83
|
+
(0, helpers_js_1.sendError)(res, 400, err instanceof Error ? err.message : "Create failed");
|
|
84
|
+
}
|
|
85
|
+
});
|
|
86
|
+
// UPDATE
|
|
87
|
+
router.put("/api/memories/:id", async (req, res, ctx) => {
|
|
88
|
+
const agentId = ctx.query.agentId || "main";
|
|
89
|
+
const body = await (0, helpers_js_1.parseBody)(req);
|
|
90
|
+
if (!body)
|
|
91
|
+
return (0, helpers_js_1.sendError)(res, 400, "Invalid JSON body");
|
|
92
|
+
try {
|
|
93
|
+
const data = validation_js_1.DashboardMemoryUpdateSchema.parse(body);
|
|
94
|
+
const sql = (0, db_js_1.getSql)();
|
|
95
|
+
const rows = await sql.begin(async (tx) => {
|
|
96
|
+
await tx `SELECT set_config('app.current_agent_id', ${agentId}, true)`;
|
|
97
|
+
const current = await tx `
|
|
98
|
+
SELECT * FROM memory_semantic WHERE id = ${ctx.params.id} AND agent_id = ${agentId}
|
|
99
|
+
`;
|
|
100
|
+
if (current.length === 0)
|
|
101
|
+
return [];
|
|
102
|
+
// Re-embed if content changed
|
|
103
|
+
let embedding = current[0].embedding;
|
|
104
|
+
let contentHash = current[0].content_hash;
|
|
105
|
+
if (data.content && data.content !== current[0].content) {
|
|
106
|
+
embedding = JSON.stringify(await (0, db_js_1.getEmbedding)(data.content));
|
|
107
|
+
contentHash = (0, db_js_1.hashContent)(data.content);
|
|
108
|
+
}
|
|
109
|
+
return await tx `
|
|
110
|
+
UPDATE memory_semantic SET
|
|
111
|
+
content = ${data.content ?? current[0].content},
|
|
112
|
+
content_hash = ${contentHash},
|
|
113
|
+
category = ${data.category !== undefined ? data.category : current[0].category},
|
|
114
|
+
tier = ${data.tier ?? current[0].tier},
|
|
115
|
+
volatility = ${data.volatility ?? current[0].volatility},
|
|
116
|
+
is_archived = ${data.is_archived ?? current[0].is_archived},
|
|
117
|
+
metadata = ${data.metadata ? JSON.stringify(data.metadata) : current[0].metadata},
|
|
118
|
+
embedding = ${embedding}
|
|
119
|
+
WHERE id = ${ctx.params.id} AND agent_id = ${agentId}
|
|
120
|
+
RETURNING id, content, category, tier, is_archived
|
|
121
|
+
`;
|
|
122
|
+
});
|
|
123
|
+
if (rows.length === 0)
|
|
124
|
+
return (0, helpers_js_1.sendError)(res, 404, "Memory not found");
|
|
125
|
+
(0, helpers_js_1.sendJson)(res, 200, { ok: true, data: rows[0] });
|
|
126
|
+
}
|
|
127
|
+
catch (err) {
|
|
128
|
+
(0, helpers_js_1.sendError)(res, 400, err instanceof Error ? err.message : "Update failed");
|
|
129
|
+
}
|
|
130
|
+
});
|
|
131
|
+
// GET ONE
|
|
132
|
+
router.get("/api/memories/:id", async (_req, res, ctx) => {
|
|
133
|
+
const agentId = ctx.query.agentId || "main";
|
|
134
|
+
const sql = (0, db_js_1.getSql)();
|
|
135
|
+
const rows = await sql.begin(async (tx) => {
|
|
136
|
+
await tx `SELECT set_config('app.current_agent_id', ${agentId}, true)`;
|
|
137
|
+
return await tx `
|
|
138
|
+
SELECT id, content, category, tier, access_scope,
|
|
139
|
+
access_count, usefulness_score, is_archived, is_pointer,
|
|
140
|
+
confidence, metadata, created_at, updated_at, expires_at
|
|
141
|
+
FROM memory_semantic
|
|
142
|
+
WHERE id = ${ctx.params.id} AND agent_id = ${agentId}
|
|
143
|
+
`;
|
|
144
|
+
});
|
|
145
|
+
if (rows.length === 0)
|
|
146
|
+
return (0, helpers_js_1.sendError)(res, 404, "Memory not found");
|
|
147
|
+
(0, helpers_js_1.sendJson)(res, 200, { ok: true, data: rows[0] });
|
|
148
|
+
});
|
|
149
|
+
// DELETE (archive)
|
|
150
|
+
router.delete("/api/memories/:id", async (_req, res, ctx) => {
|
|
151
|
+
const agentId = ctx.query.agentId || "main";
|
|
152
|
+
const sql = (0, db_js_1.getSql)();
|
|
153
|
+
const rows = await sql.begin(async (tx) => {
|
|
154
|
+
await tx `SELECT set_config('app.current_agent_id', ${agentId}, true)`;
|
|
155
|
+
return await tx `
|
|
156
|
+
UPDATE memory_semantic SET is_archived = true
|
|
157
|
+
WHERE id = ${ctx.params.id} AND agent_id = ${agentId}
|
|
158
|
+
RETURNING id
|
|
159
|
+
`;
|
|
160
|
+
});
|
|
161
|
+
if (rows.length === 0)
|
|
162
|
+
return (0, helpers_js_1.sendError)(res, 404, "Memory not found");
|
|
163
|
+
(0, helpers_js_1.sendJson)(res, 200, { ok: true, data: { archived: true } });
|
|
164
|
+
});
|
|
165
|
+
// IMPORT from markdown
|
|
166
|
+
router.post("/api/memories/import", async (req, res, ctx) => {
|
|
167
|
+
const agentId = ctx.query.agentId || "main";
|
|
168
|
+
const body = await (0, helpers_js_1.parseBody)(req);
|
|
169
|
+
if (!body)
|
|
170
|
+
return (0, helpers_js_1.sendError)(res, 400, "Invalid JSON body");
|
|
171
|
+
try {
|
|
172
|
+
const data = validation_js_1.MemoryImportSchema.parse(body);
|
|
173
|
+
await (0, memoryService_js_1.ensureAgent)(agentId);
|
|
174
|
+
// Split markdown by headings or double newlines into chunks
|
|
175
|
+
const chunks = data.content
|
|
176
|
+
.split(/(?=^#{1,3}\s)/m)
|
|
177
|
+
.flatMap((section) => section.split(/\n{2,}/))
|
|
178
|
+
.map((s) => s.trim())
|
|
179
|
+
.filter((s) => s.length > 10);
|
|
180
|
+
const results = [];
|
|
181
|
+
for (const chunk of chunks) {
|
|
182
|
+
const result = await (0, memoryService_js_1.storeMemory)(agentId, chunk, "private", {
|
|
183
|
+
tier: data.tier,
|
|
184
|
+
source_uri: data.source_filename,
|
|
185
|
+
category: "imported",
|
|
186
|
+
});
|
|
187
|
+
results.push(result);
|
|
188
|
+
}
|
|
189
|
+
(0, helpers_js_1.sendJson)(res, 201, {
|
|
190
|
+
ok: true,
|
|
191
|
+
data: { imported: results.length, chunks: results },
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
catch (err) {
|
|
195
|
+
(0, helpers_js_1.sendError)(res, 400, err instanceof Error ? err.message : "Import failed");
|
|
196
|
+
}
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
//# sourceMappingURL=memories.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memories.js","sourceRoot":"","sources":["../../../dashboard/routes/memories.ts"],"names":[],"mappings":";AAAA;;;;;;;;GAQG;;AAiBH,oDA8LC;AA5MD,8CAA+D;AAC/D,gDAA0F;AAC1F,sEAA2E;AAC3E,+DAKqC;AAErC,gFAAgF;AAChF,kBAAkB;AAClB,gFAAgF;AAEhF,SAAgB,oBAAoB,CAAC,MAAc;IACjD,+BAA+B;IAC/B,MAAM,CAAC,GAAG,CAAC,eAAe,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;QACnD,MAAM,CAAC,GAAG,qCAAqB,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACjD,MAAM,GAAG,GAAG,IAAA,cAAM,GAAE,CAAC;QAErB,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,KAAK,CAAC,KAAK,EAAE,EAAO,EAAE,EAAE;YAC7C,MAAM,EAAE,CAAA,6CAA6C,CAAC,CAAC,OAAO,SAAS,CAAC;YAExE,8BAA8B;YAC9B,MAAM,UAAU,GAAa,CAAC,eAAe,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC;YAC3D,IAAI,CAAC,CAAC,QAAQ,KAAK,OAAO;gBAAE,UAAU,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;iBAC9D,IAAI,CAAC,CAAC,QAAQ,KAAK,MAAM;gBAAE,UAAU,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;YACtE,IAAI,CAAC,CAAC,QAAQ;gBAAE,UAAU,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC;YAC9D,IAAI,CAAC,CAAC,IAAI;gBAAE,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC;YAElD,MAAM,WAAW,GAAG,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC7C,MAAM,YAAY,GAAG,CAAC,CAAC,MAAM;gBAC3B,CAAC,CAAC,uBAAuB,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI;gBACzD,CAAC,CAAC,EAAE,CAAC;YAEP,OAAO,MAAM,EAAE,CAAC,MAAM,CAAC;;;;;gBAKb,WAAW,IAAI,YAAY;;gBAE3B,CAAC,CAAC,KAAK,WAAW,CAAC,CAAC,MAAM;OACnC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,uBAAuB;QACvB,MAAM,WAAW,GAAG,MAAM,GAAG,CAAC,KAAK,CAAC,KAAK,EAAE,EAAO,EAAE,EAAE;YACpD,MAAM,EAAE,CAAA,6CAA6C,CAAC,CAAC,OAAO,SAAS,CAAC;YACxE,MAAM,QAAQ,GAAG,CAAC,CAAC,QAAQ,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;YACtF,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;gBACtB,OAAO,MAAM,EAAE,CAAA,uEAAuE,CAAC,CAAC,OAAO,EAAE,CAAC;YACpG,CAAC;YACD,OAAO,MAAM,EAAE,CAAA,uEAAuE,CAAC,CAAC,OAAO,sBAAsB,QAAQ,EAAE,CAAC;QAClI,CAAC,CAAC,CAAC;QAEH,IAAA,qBAAQ,EAAC,GAAG,EAAE,GAAG,EAAE;YACjB,EAAE,EAAE,IAAI;YACR,IAAI,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE;SAC5D,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,SAAS;IACT,MAAM,CAAC,IAAI,CAAC,eAAe,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;QACnD,MAAM,OAAO,GAAG,GAAG,CAAC,KAAK,CAAC,OAAO,IAAI,MAAM,CAAC;QAC5C,MAAM,IAAI,GAAG,MAAM,IAAA,sBAAS,EAAC,GAAG,CAAC,CAAC;QAClC,IAAI,CAAC,IAAI;YAAE,OAAO,IAAA,sBAAS,EAAC,GAAG,EAAE,GAAG,EAAE,mBAAmB,CAAC,CAAC;QAE3D,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,2CAA2B,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACrD,MAAM,IAAA,8BAAW,EAAC,OAAO,CAAC,CAAC;YAC3B,MAAM,MAAM,GAAG,MAAM,IAAA,8BAAW,EAAC,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,KAAK,EAAE;gBAClE,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,UAAU,EAAE,IAAI,CAAC,UAAU;gBAC3B,QAAQ,EAAE,IAAI,CAAC,QAAQ;aACxB,CAAC,CAAC;YACH,IAAA,qBAAQ,EAAC,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;QACjD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAA,sBAAS,EAAC,GAAG,EAAE,GAAG,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC;QAC5E,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,SAAS;IACT,MAAM,CAAC,GAAG,CAAC,mBAAmB,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;QACtD,MAAM,OAAO,GAAG,GAAG,CAAC,KAAK,CAAC,OAAO,IAAI,MAAM,CAAC;QAC5C,MAAM,IAAI,GAAG,MAAM,IAAA,sBAAS,EAAC,GAAG,CAAC,CAAC;QAClC,IAAI,CAAC,IAAI;YAAE,OAAO,IAAA,sBAAS,EAAC,GAAG,EAAE,GAAG,EAAE,mBAAmB,CAAC,CAAC;QAE3D,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,2CAA2B,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACrD,MAAM,GAAG,GAAG,IAAA,cAAM,GAAE,CAAC;YAErB,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,KAAK,CAAC,KAAK,EAAE,EAAO,EAAE,EAAE;gBAC7C,MAAM,EAAE,CAAA,6CAA6C,OAAO,SAAS,CAAC;gBAEtE,MAAM,OAAO,GAAG,MAAM,EAAE,CAAA;qDACqB,GAAG,CAAC,MAAM,CAAC,EAAE,mBAAmB,OAAO;SACnF,CAAC;gBACF,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;oBAAE,OAAO,EAAE,CAAC;gBAEpC,8BAA8B;gBAC9B,IAAI,SAAS,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;gBACrC,IAAI,WAAW,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC;gBAC1C,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;oBACxD,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,IAAA,oBAAY,EAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;oBAC7D,WAAW,GAAG,IAAA,mBAAW,EAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBAC1C,CAAC;gBAED,OAAO,MAAM,EAAE,CAAA;;wBAEC,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO;6BAC7B,WAAW;yBACf,IAAI,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ;qBACrE,IAAI,CAAC,IAAI,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI;2BACtB,IAAI,CAAC,UAAU,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC,UAAU;4BACvC,IAAI,CAAC,WAAW,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC,WAAW;yBAC7C,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ;0BAClE,SAAS;uBACZ,GAAG,CAAC,MAAM,CAAC,EAAE,mBAAmB,OAAO;;SAErD,CAAC;YACJ,CAAC,CAAC,CAAC;YAEH,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO,IAAA,sBAAS,EAAC,GAAG,EAAE,GAAG,EAAE,kBAAkB,CAAC,CAAC;YACtE,IAAA,qBAAQ,EAAC,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAClD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAA,sBAAS,EAAC,GAAG,EAAE,GAAG,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC;QAC5E,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,UAAU;IACV,MAAM,CAAC,GAAG,CAAC,mBAAmB,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;QACvD,MAAM,OAAO,GAAG,GAAG,CAAC,KAAK,CAAC,OAAO,IAAI,MAAM,CAAC;QAC5C,MAAM,GAAG,GAAG,IAAA,cAAM,GAAE,CAAC;QAErB,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,KAAK,CAAC,KAAK,EAAE,EAAO,EAAE,EAAE;YAC7C,MAAM,EAAE,CAAA,6CAA6C,OAAO,SAAS,CAAC;YACtE,OAAO,MAAM,EAAE,CAAA;;;;;qBAKA,GAAG,CAAC,MAAM,CAAC,EAAE,mBAAmB,OAAO;OACrD,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAA,sBAAS,EAAC,GAAG,EAAE,GAAG,EAAE,kBAAkB,CAAC,CAAC;QACtE,IAAA,qBAAQ,EAAC,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;IAEH,mBAAmB;IACnB,MAAM,CAAC,MAAM,CAAC,mBAAmB,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;QAC1D,MAAM,OAAO,GAAG,GAAG,CAAC,KAAK,CAAC,OAAO,IAAI,MAAM,CAAC;QAC5C,MAAM,GAAG,GAAG,IAAA,cAAM,GAAE,CAAC;QAErB,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,KAAK,CAAC,KAAK,EAAE,EAAO,EAAE,EAAE;YAC7C,MAAM,EAAE,CAAA,6CAA6C,OAAO,SAAS,CAAC;YACtE,OAAO,MAAM,EAAE,CAAA;;qBAEA,GAAG,CAAC,MAAM,CAAC,EAAE,mBAAmB,OAAO;;OAErD,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAA,sBAAS,EAAC,GAAG,EAAE,GAAG,EAAE,kBAAkB,CAAC,CAAC;QACtE,IAAA,qBAAQ,EAAC,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;IAEH,uBAAuB;IACvB,MAAM,CAAC,IAAI,CAAC,sBAAsB,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;QAC1D,MAAM,OAAO,GAAG,GAAG,CAAC,KAAK,CAAC,OAAO,IAAI,MAAM,CAAC;QAC5C,MAAM,IAAI,GAAG,MAAM,IAAA,sBAAS,EAAC,GAAG,CAAC,CAAC;QAClC,IAAI,CAAC,IAAI;YAAE,OAAO,IAAA,sBAAS,EAAC,GAAG,EAAE,GAAG,EAAE,mBAAmB,CAAC,CAAC;QAE3D,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,kCAAkB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC5C,MAAM,IAAA,8BAAW,EAAC,OAAO,CAAC,CAAC;YAE3B,4DAA4D;YAC5D,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO;iBACxB,KAAK,CAAC,gBAAgB,CAAC;iBACvB,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;iBAC7C,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;iBACpB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;YAEhC,MAAM,OAAO,GAAG,EAAE,CAAC;YACnB,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;gBAC3B,MAAM,MAAM,GAAG,MAAM,IAAA,8BAAW,EAAC,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE;oBAC1D,IAAI,EAAE,IAAI,CAAC,IAAI;oBACf,UAAU,EAAE,IAAI,CAAC,eAAe;oBAChC,QAAQ,EAAE,UAAU;iBACrB,CAAC,CAAC;gBACH,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACvB,CAAC;YAED,IAAA,qBAAQ,EAAC,GAAG,EAAE,GAAG,EAAE;gBACjB,EAAE,EAAE,IAAI;gBACR,IAAI,EAAE,EAAE,QAAQ,EAAE,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE;aACpD,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAA,sBAAS,EAAC,GAAG,EAAE,GAAG,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC;QAC5E,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dashboard API Routes — Persona management endpoints.
|
|
3
|
+
*
|
|
4
|
+
* GET /api/personas — List all persona entries
|
|
5
|
+
* POST /api/personas — Create persona entry
|
|
6
|
+
* PUT /api/personas/:id — Update persona entry
|
|
7
|
+
* DELETE /api/personas/:id — Delete persona entry
|
|
8
|
+
*/
|
|
9
|
+
import { Router } from "../router.js";
|
|
10
|
+
export declare function registerPersonaRoutes(router: Router): void;
|
|
11
|
+
//# sourceMappingURL=personas.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"personas.d.ts","sourceRoot":"","sources":["../../../dashboard/routes/personas.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAetC,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAkD1D"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Dashboard API Routes — Persona management endpoints.
|
|
4
|
+
*
|
|
5
|
+
* GET /api/personas — List all persona entries
|
|
6
|
+
* POST /api/personas — Create persona entry
|
|
7
|
+
* PUT /api/personas/:id — Update persona entry
|
|
8
|
+
* DELETE /api/personas/:id — Delete persona entry
|
|
9
|
+
*/
|
|
10
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
|
+
exports.registerPersonaRoutes = registerPersonaRoutes;
|
|
12
|
+
const helpers_js_1 = require("../helpers.js");
|
|
13
|
+
const personaService_js_1 = require("../../services/personaService.js");
|
|
14
|
+
// =============================================================================
|
|
15
|
+
// REGISTER ROUTES
|
|
16
|
+
// =============================================================================
|
|
17
|
+
function registerPersonaRoutes(router) {
|
|
18
|
+
// LIST
|
|
19
|
+
router.get("/api/personas", async (_req, res, ctx) => {
|
|
20
|
+
const agentId = ctx.query.agentId || "main";
|
|
21
|
+
const rows = await (0, personaService_js_1.listPersonas)(agentId);
|
|
22
|
+
(0, helpers_js_1.sendJson)(res, 200, { ok: true, data: rows });
|
|
23
|
+
});
|
|
24
|
+
// GET ONE
|
|
25
|
+
router.get("/api/personas/:id", async (_req, res, ctx) => {
|
|
26
|
+
const agentId = ctx.query.agentId || "main";
|
|
27
|
+
const persona = await (0, personaService_js_1.getPersona)(agentId, ctx.params.id);
|
|
28
|
+
if (!persona)
|
|
29
|
+
return (0, helpers_js_1.sendError)(res, 404, "Persona not found");
|
|
30
|
+
(0, helpers_js_1.sendJson)(res, 200, { ok: true, data: persona });
|
|
31
|
+
});
|
|
32
|
+
// CREATE
|
|
33
|
+
router.post("/api/personas", async (req, res, ctx) => {
|
|
34
|
+
const agentId = ctx.query.agentId || "main";
|
|
35
|
+
const body = await (0, helpers_js_1.parseBody)(req);
|
|
36
|
+
if (!body)
|
|
37
|
+
return (0, helpers_js_1.sendError)(res, 400, "Invalid JSON body");
|
|
38
|
+
try {
|
|
39
|
+
const persona = await (0, personaService_js_1.createPersona)(agentId, body);
|
|
40
|
+
(0, helpers_js_1.sendJson)(res, 201, { ok: true, data: persona });
|
|
41
|
+
}
|
|
42
|
+
catch (err) {
|
|
43
|
+
(0, helpers_js_1.sendError)(res, 400, err instanceof Error ? err.message : "Create failed");
|
|
44
|
+
}
|
|
45
|
+
});
|
|
46
|
+
// UPDATE
|
|
47
|
+
router.put("/api/personas/:id", async (req, res, ctx) => {
|
|
48
|
+
const agentId = ctx.query.agentId || "main";
|
|
49
|
+
const body = await (0, helpers_js_1.parseBody)(req);
|
|
50
|
+
if (!body)
|
|
51
|
+
return (0, helpers_js_1.sendError)(res, 400, "Invalid JSON body");
|
|
52
|
+
try {
|
|
53
|
+
const persona = await (0, personaService_js_1.updatePersona)(agentId, ctx.params.id, body);
|
|
54
|
+
if (!persona)
|
|
55
|
+
return (0, helpers_js_1.sendError)(res, 404, "Persona not found");
|
|
56
|
+
(0, helpers_js_1.sendJson)(res, 200, { ok: true, data: persona });
|
|
57
|
+
}
|
|
58
|
+
catch (err) {
|
|
59
|
+
(0, helpers_js_1.sendError)(res, 400, err instanceof Error ? err.message : "Update failed");
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
// DELETE
|
|
63
|
+
router.delete("/api/personas/:id", async (req, res, ctx) => {
|
|
64
|
+
const agentId = ctx.query.agentId || "main";
|
|
65
|
+
const deleted = await (0, personaService_js_1.deletePersona)(agentId, ctx.params.id);
|
|
66
|
+
if (!deleted)
|
|
67
|
+
return (0, helpers_js_1.sendError)(res, 404, "Persona not found");
|
|
68
|
+
(0, helpers_js_1.sendJson)(res, 200, { ok: true, data: { deleted: true } });
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=personas.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"personas.js","sourceRoot":"","sources":["../../../dashboard/routes/personas.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dashboard API Routes — Script execution endpoints.
|
|
3
|
+
*
|
|
4
|
+
* POST /api/scripts/sleep — Trigger sleep cycle
|
|
5
|
+
* POST /api/scripts/persona-import — Trigger persona bootstrap
|
|
6
|
+
*/
|
|
7
|
+
import { Router } from "../router.js";
|
|
8
|
+
export declare function registerScriptRoutes(router: Router): void;
|
|
9
|
+
//# sourceMappingURL=scripts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scripts.d.ts","sourceRoot":"","sources":["../../../dashboard/routes/scripts.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAQtC,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAkDzD"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Dashboard API Routes — Script execution endpoints.
|
|
4
|
+
*
|
|
5
|
+
* POST /api/scripts/sleep — Trigger sleep cycle
|
|
6
|
+
* POST /api/scripts/persona-import — Trigger persona bootstrap
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.registerScriptRoutes = registerScriptRoutes;
|
|
10
|
+
const helpers_js_1 = require("../helpers.js");
|
|
11
|
+
const validation_js_1 = require("../../schemas/validation.js");
|
|
12
|
+
// =============================================================================
|
|
13
|
+
// REGISTER ROUTES
|
|
14
|
+
// =============================================================================
|
|
15
|
+
function registerScriptRoutes(router) {
|
|
16
|
+
// SLEEP CYCLE
|
|
17
|
+
router.post("/api/scripts/sleep", async (req, res) => {
|
|
18
|
+
const body = await (0, helpers_js_1.parseBody)(req);
|
|
19
|
+
const data = validation_js_1.ScriptRunSchema.parse(body || {});
|
|
20
|
+
try {
|
|
21
|
+
const { runSleepCycle } = await import("../../scripts/sleep_cycle.js");
|
|
22
|
+
// Run async — don't block the response
|
|
23
|
+
const statsPromise = runSleepCycle({ agentId: data.agentId });
|
|
24
|
+
// Return immediately, but also await and log
|
|
25
|
+
(0, helpers_js_1.sendJson)(res, 202, {
|
|
26
|
+
ok: true,
|
|
27
|
+
data: { status: "started", agentId: data.agentId },
|
|
28
|
+
});
|
|
29
|
+
statsPromise.then((stats) => {
|
|
30
|
+
console.log(`[Dashboard] Sleep cycle completed:`, stats);
|
|
31
|
+
}).catch((err) => {
|
|
32
|
+
console.error(`[Dashboard] Sleep cycle failed:`, err);
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
catch (err) {
|
|
36
|
+
(0, helpers_js_1.sendError)(res, 500, err instanceof Error ? err.message : "Script failed");
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
// PERSONA IMPORT
|
|
40
|
+
router.post("/api/scripts/persona-import", async (req, res) => {
|
|
41
|
+
const body = await (0, helpers_js_1.parseBody)(req);
|
|
42
|
+
if (!body)
|
|
43
|
+
return (0, helpers_js_1.sendError)(res, 400, "Invalid JSON body");
|
|
44
|
+
const data = validation_js_1.ScriptRunSchema.parse(body);
|
|
45
|
+
if (!data.file)
|
|
46
|
+
return (0, helpers_js_1.sendError)(res, 400, "Missing 'file' path");
|
|
47
|
+
try {
|
|
48
|
+
const { bootstrapPersona } = await import("../../scripts/bootstrap_persona.js");
|
|
49
|
+
(0, helpers_js_1.sendJson)(res, 202, {
|
|
50
|
+
ok: true,
|
|
51
|
+
data: { status: "started", file: data.file, agentId: data.agentId },
|
|
52
|
+
});
|
|
53
|
+
bootstrapPersona(data.file, { agentId: data.agentId })
|
|
54
|
+
.then(() => console.log(`[Dashboard] Persona import completed: ${data.file}`))
|
|
55
|
+
.catch((err) => console.error(`[Dashboard] Persona import failed:`, err));
|
|
56
|
+
}
|
|
57
|
+
catch (err) {
|
|
58
|
+
(0, helpers_js_1.sendError)(res, 500, err instanceof Error ? err.message : "Script failed");
|
|
59
|
+
}
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=scripts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scripts.js","sourceRoot":"","sources":["../../../dashboard/routes/scripts.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;AAUH,oDAkDC;AAzDD,8CAA+D;AAC/D,+DAA8D;AAE9D,gFAAgF;AAChF,kBAAkB;AAClB,gFAAgF;AAEhF,SAAgB,oBAAoB,CAAC,MAAc;IACjD,cAAc;IACd,MAAM,CAAC,IAAI,CAAC,oBAAoB,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;QACnD,MAAM,IAAI,GAAG,MAAM,IAAA,sBAAS,EAAC,GAAG,CAAC,CAAC;QAClC,MAAM,IAAI,GAAG,+BAAe,CAAC,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;QAE/C,IAAI,CAAC;YACH,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,8BAA8B,CAAC,CAAC;YACvE,uCAAuC;YACvC,MAAM,YAAY,GAAG,aAAa,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;YAE9D,6CAA6C;YAC7C,IAAA,qBAAQ,EAAC,GAAG,EAAE,GAAG,EAAE;gBACjB,EAAE,EAAE,IAAI;gBACR,IAAI,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE;aACnD,CAAC,CAAC;YAEH,YAAY,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE;gBAC1B,OAAO,CAAC,GAAG,CAAC,oCAAoC,EAAE,KAAK,CAAC,CAAC;YAC3D,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;gBACf,OAAO,CAAC,KAAK,CAAC,iCAAiC,EAAE,GAAG,CAAC,CAAC;YACxD,CAAC,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAA,sBAAS,EAAC,GAAG,EAAE,GAAG,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC;QAC5E,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,iBAAiB;IACjB,MAAM,CAAC,IAAI,CAAC,6BAA6B,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;QAC5D,MAAM,IAAI,GAAG,MAAM,IAAA,sBAAS,EAAC,GAAG,CAAC,CAAC;QAClC,IAAI,CAAC,IAAI;YAAE,OAAO,IAAA,sBAAS,EAAC,GAAG,EAAE,GAAG,EAAE,mBAAmB,CAAC,CAAC;QAE3D,MAAM,IAAI,GAAG,+BAAe,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACzC,IAAI,CAAC,IAAI,CAAC,IAAI;YAAE,OAAO,IAAA,sBAAS,EAAC,GAAG,EAAE,GAAG,EAAE,qBAAqB,CAAC,CAAC;QAElE,IAAI,CAAC;YACH,MAAM,EAAE,gBAAgB,EAAE,GAAG,MAAM,MAAM,CAAC,oCAAoC,CAAC,CAAC;YAEhF,IAAA,qBAAQ,EAAC,GAAG,EAAE,GAAG,EAAE;gBACjB,EAAE,EAAE,IAAI;gBACR,IAAI,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE;aACpE,CAAC,CAAC;YAEH,gBAAgB,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC;iBACnD,IAAI,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,yCAAyC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;iBAC7E,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,oCAAoC,EAAE,GAAG,CAAC,CAAC,CAAC;QAC9E,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAA,sBAAS,EAAC,GAAG,EAAE,GAAG,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC;QAC5E,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dashboard API Routes — Workspace & agent endpoints.
|
|
3
|
+
*
|
|
4
|
+
* GET /api/agents — List agents
|
|
5
|
+
* GET /api/workspace-files — List .md files from workspace dir
|
|
6
|
+
* GET /api/workspace-files/:filename — Read workspace .md file content
|
|
7
|
+
*/
|
|
8
|
+
import { Router } from "../router.js";
|
|
9
|
+
export declare function registerWorkspaceRoutes(router: Router): void;
|
|
10
|
+
//# sourceMappingURL=workspace.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace.d.ts","sourceRoot":"","sources":["../../../dashboard/routes/workspace.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAiBtC,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAkE5D"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Dashboard API Routes — Workspace & agent endpoints.
|
|
4
|
+
*
|
|
5
|
+
* GET /api/agents — List agents
|
|
6
|
+
* GET /api/workspace-files — List .md files from workspace dir
|
|
7
|
+
* GET /api/workspace-files/:filename — Read workspace .md file content
|
|
8
|
+
*/
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.registerWorkspaceRoutes = registerWorkspaceRoutes;
|
|
11
|
+
const helpers_js_1 = require("../helpers.js");
|
|
12
|
+
const db_js_1 = require("../../services/db.js");
|
|
13
|
+
const promises_1 = require("node:fs/promises");
|
|
14
|
+
const node_path_1 = require("node:path");
|
|
15
|
+
// =============================================================================
|
|
16
|
+
// CONFIG — workspace directory (set during startup)
|
|
17
|
+
// =============================================================================
|
|
18
|
+
// Workspace directory is now stored in the database per agent.
|
|
19
|
+
// =============================================================================
|
|
20
|
+
// REGISTER ROUTES
|
|
21
|
+
// =============================================================================
|
|
22
|
+
function registerWorkspaceRoutes(router) {
|
|
23
|
+
// LIST AGENTS
|
|
24
|
+
router.get("/api/agents", async (_req, res) => {
|
|
25
|
+
try {
|
|
26
|
+
const sql = (0, db_js_1.getSql)();
|
|
27
|
+
const rows = await sql `
|
|
28
|
+
SELECT id, name, is_active, created_at FROM agents ORDER BY created_at ASC
|
|
29
|
+
`;
|
|
30
|
+
(0, helpers_js_1.sendJson)(res, 200, { ok: true, data: rows });
|
|
31
|
+
}
|
|
32
|
+
catch (err) {
|
|
33
|
+
(0, helpers_js_1.sendError)(res, 500, err instanceof Error ? err.message : "Failed to list agents");
|
|
34
|
+
}
|
|
35
|
+
});
|
|
36
|
+
// LIST WORKSPACE .md FILES
|
|
37
|
+
router.get("/api/workspace-files", async (_req, res, ctx) => {
|
|
38
|
+
const agentId = ctx.query.agentId || "main";
|
|
39
|
+
const sql = (0, db_js_1.getSql)();
|
|
40
|
+
try {
|
|
41
|
+
const agents = await sql `SELECT workspace_dir FROM agents WHERE id = ${agentId}`;
|
|
42
|
+
const workspaceDir = agents[0]?.workspace_dir;
|
|
43
|
+
if (!workspaceDir) {
|
|
44
|
+
return (0, helpers_js_1.sendJson)(res, 200, { ok: true, data: [] });
|
|
45
|
+
}
|
|
46
|
+
const entries = await (0, promises_1.readdir)(workspaceDir, { withFileTypes: true });
|
|
47
|
+
const mdFiles = entries
|
|
48
|
+
.filter((e) => e.isFile() && (0, node_path_1.extname)(e.name).toLowerCase() === ".md")
|
|
49
|
+
.map((e) => ({
|
|
50
|
+
name: e.name,
|
|
51
|
+
path: (0, node_path_1.join)(workspaceDir, e.name),
|
|
52
|
+
}));
|
|
53
|
+
(0, helpers_js_1.sendJson)(res, 200, { ok: true, data: mdFiles });
|
|
54
|
+
}
|
|
55
|
+
catch (err) {
|
|
56
|
+
(0, helpers_js_1.sendError)(res, 500, err instanceof Error ? err.message : "Failed to read workspace");
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
// READ WORKSPACE .md FILE
|
|
60
|
+
router.get("/api/workspace-files/:filename", async (_req, res, ctx) => {
|
|
61
|
+
const agentId = ctx.query.agentId || "main";
|
|
62
|
+
const sql = (0, db_js_1.getSql)();
|
|
63
|
+
try {
|
|
64
|
+
const agents = await sql `SELECT workspace_dir FROM agents WHERE id = ${agentId}`;
|
|
65
|
+
const workspaceDir = agents[0]?.workspace_dir;
|
|
66
|
+
if (!workspaceDir) {
|
|
67
|
+
return (0, helpers_js_1.sendError)(res, 404, "Workspace directory not configured for this agent");
|
|
68
|
+
}
|
|
69
|
+
const filename = ctx.params.filename;
|
|
70
|
+
// Security: only allow .md files, no path traversal
|
|
71
|
+
if (!filename.endsWith(".md") || filename.includes("..") || filename.includes("/")) {
|
|
72
|
+
return (0, helpers_js_1.sendError)(res, 400, "Only .md files allowed, no path traversal");
|
|
73
|
+
}
|
|
74
|
+
const content = await (0, promises_1.readFile)((0, node_path_1.join)(workspaceDir, filename), "utf-8");
|
|
75
|
+
(0, helpers_js_1.sendJson)(res, 200, { ok: true, data: { name: filename, content } });
|
|
76
|
+
}
|
|
77
|
+
catch {
|
|
78
|
+
(0, helpers_js_1.sendError)(res, 404, `File not found in workspace`);
|
|
79
|
+
}
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=workspace.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace.js","sourceRoot":"","sources":["../../../dashboard/routes/workspace.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PostClaw Dashboard Server — HTTP server lifecycle.
|
|
3
|
+
*
|
|
4
|
+
* Serves the dashboard UI and REST API on a configurable port.
|
|
5
|
+
* Follows the same start/stop pattern as the sleep cycle service.
|
|
6
|
+
*/
|
|
7
|
+
export interface DashboardOptions {
|
|
8
|
+
port?: number;
|
|
9
|
+
bindAddress?: string;
|
|
10
|
+
workspaceDir?: string;
|
|
11
|
+
}
|
|
12
|
+
export declare function startDashboard(opts?: DashboardOptions): void;
|
|
13
|
+
export declare function stopDashboard(): void;
|
|
14
|
+
//# sourceMappingURL=server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../dashboard/server.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAyBH,MAAM,WAAW,gBAAgB;IAC/B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,wBAAgB,cAAc,CAAC,IAAI,GAAE,gBAAqB,GAAG,IAAI,CAiEhE;AAMD,wBAAgB,aAAa,IAAI,IAAI,CAOpC"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* PostClaw Dashboard Server — HTTP server lifecycle.
|
|
4
|
+
*
|
|
5
|
+
* Serves the dashboard UI and REST API on a configurable port.
|
|
6
|
+
* Follows the same start/stop pattern as the sleep cycle service.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.startDashboard = startDashboard;
|
|
10
|
+
exports.stopDashboard = stopDashboard;
|
|
11
|
+
const node_http_1 = require("node:http");
|
|
12
|
+
const node_path_1 = require("node:path");
|
|
13
|
+
const router_js_1 = require("./router.js");
|
|
14
|
+
const helpers_js_1 = require("./helpers.js");
|
|
15
|
+
const personas_js_1 = require("./routes/personas.js");
|
|
16
|
+
const memories_js_1 = require("./routes/memories.js");
|
|
17
|
+
const graph_js_1 = require("./routes/graph.js");
|
|
18
|
+
const scripts_js_1 = require("./routes/scripts.js");
|
|
19
|
+
const workspace_js_1 = require("./routes/workspace.js");
|
|
20
|
+
const config_js_1 = require("./routes/config.js");
|
|
21
|
+
// =============================================================================
|
|
22
|
+
// SERVER STATE
|
|
23
|
+
// =============================================================================
|
|
24
|
+
let _server = null;
|
|
25
|
+
const DEFAULT_PORT = 3333;
|
|
26
|
+
const DEFAULT_BIND = "127.0.0.1";
|
|
27
|
+
function startDashboard(opts = {}) {
|
|
28
|
+
if (_server) {
|
|
29
|
+
console.log("[Dashboard] Already running, skipping start");
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
const port = opts.port || DEFAULT_PORT;
|
|
33
|
+
const bind = opts.bindAddress || DEFAULT_BIND;
|
|
34
|
+
// Security warning for non-localhost binds
|
|
35
|
+
if (bind !== "127.0.0.1" && bind !== "localhost") {
|
|
36
|
+
console.warn(`[Dashboard] ⚠️ WARNING: Binding to ${bind} exposes the dashboard to the network!`);
|
|
37
|
+
console.warn(`[Dashboard] ⚠️ The dashboard has NO authentication. Only bind to 0.0.0.0 on trusted networks.`);
|
|
38
|
+
}
|
|
39
|
+
const router = new router_js_1.Router();
|
|
40
|
+
(0, personas_js_1.registerPersonaRoutes)(router);
|
|
41
|
+
(0, memories_js_1.registerMemoryRoutes)(router);
|
|
42
|
+
(0, graph_js_1.registerGraphRoutes)(router);
|
|
43
|
+
(0, scripts_js_1.registerScriptRoutes)(router);
|
|
44
|
+
(0, workspace_js_1.registerWorkspaceRoutes)(router);
|
|
45
|
+
(0, config_js_1.registerConfigRoutes)(router);
|
|
46
|
+
// Resolve static file directories
|
|
47
|
+
// At runtime __dirname = dist/dashboard/, so go up 2 levels to project root
|
|
48
|
+
// Static files are NOT compiled by tsc — they live in dashboard/public/
|
|
49
|
+
const projectRoot = (0, node_path_1.join)((0, node_path_1.dirname)(__filename), "..", "..");
|
|
50
|
+
const publicDir = (0, node_path_1.join)(projectRoot, "dashboard", "public");
|
|
51
|
+
const ambientDir = (0, node_path_1.join)(projectRoot, "node_modules", "@ambientcss", "css");
|
|
52
|
+
_server = (0, node_http_1.createServer)(async (req, res) => {
|
|
53
|
+
const url = req.url || "/";
|
|
54
|
+
const pathname = url.split("?")[0];
|
|
55
|
+
// API routes
|
|
56
|
+
if (pathname.startsWith("/api/")) {
|
|
57
|
+
const handled = await router.handle(req, res);
|
|
58
|
+
if (!handled)
|
|
59
|
+
(0, helpers_js_1.sendError)(res, 404, "Not found");
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
// Serve AmbientCSS assets under /vendor/
|
|
63
|
+
if (pathname.startsWith("/vendor/ambient")) {
|
|
64
|
+
const vendorPath = pathname.replace("/vendor/ambient", "");
|
|
65
|
+
const served = await (0, helpers_js_1.serveStatic)(res, [ambientDir], vendorPath || "/ambient.css");
|
|
66
|
+
if (!served)
|
|
67
|
+
(0, helpers_js_1.sendError)(res, 404, "Vendor file not found");
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
// Static files
|
|
71
|
+
const served = await (0, helpers_js_1.serveStatic)(res, [publicDir], pathname);
|
|
72
|
+
if (!served) {
|
|
73
|
+
// SPA fallback — serve index.html for any unmatched path
|
|
74
|
+
const fallback = await (0, helpers_js_1.serveStatic)(res, [publicDir], "/index.html");
|
|
75
|
+
if (!fallback)
|
|
76
|
+
(0, helpers_js_1.sendError)(res, 404, "Dashboard files not found");
|
|
77
|
+
}
|
|
78
|
+
});
|
|
79
|
+
_server.listen(port, bind, () => {
|
|
80
|
+
console.log(`[Dashboard] 🖥️ Dashboard running at http://${bind}:${port}`);
|
|
81
|
+
});
|
|
82
|
+
_server.on("error", (err) => {
|
|
83
|
+
console.error("[Dashboard] Server error:", err);
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
// =============================================================================
|
|
87
|
+
// SHUTDOWN
|
|
88
|
+
// =============================================================================
|
|
89
|
+
function stopDashboard() {
|
|
90
|
+
if (_server) {
|
|
91
|
+
_server.close(() => {
|
|
92
|
+
console.log("[Dashboard] Server stopped");
|
|
93
|
+
});
|
|
94
|
+
_server = null;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../dashboard/server.ts"],"names":[],"mappings":"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"}
|