@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.
Files changed (92) hide show
  1. package/README.md +1 -1
  2. package/dashboard/public/app.js +743 -0
  3. package/dashboard/public/index.html +350 -0
  4. package/dashboard/public/styles.css +571 -0
  5. package/dist/dashboard/helpers.d.ts +32 -0
  6. package/dist/dashboard/helpers.d.ts.map +1 -0
  7. package/dist/dashboard/helpers.js +122 -0
  8. package/dist/dashboard/helpers.js.map +1 -0
  9. package/dist/dashboard/router.d.ts +39 -0
  10. package/dist/dashboard/router.d.ts.map +1 -0
  11. package/dist/dashboard/router.js +94 -0
  12. package/dist/dashboard/router.js.map +1 -0
  13. package/dist/dashboard/routes/config.d.ts +3 -0
  14. package/dist/dashboard/routes/config.d.ts.map +1 -0
  15. package/dist/dashboard/routes/config.js +53 -0
  16. package/dist/dashboard/routes/config.js.map +1 -0
  17. package/dist/dashboard/routes/graph.d.ts +11 -0
  18. package/dist/dashboard/routes/graph.d.ts.map +1 -0
  19. package/dist/dashboard/routes/graph.js +131 -0
  20. package/dist/dashboard/routes/graph.js.map +1 -0
  21. package/dist/dashboard/routes/memories.d.ts +12 -0
  22. package/dist/dashboard/routes/memories.d.ts.map +1 -0
  23. package/dist/dashboard/routes/memories.js +199 -0
  24. package/dist/dashboard/routes/memories.js.map +1 -0
  25. package/dist/dashboard/routes/personas.d.ts +11 -0
  26. package/dist/dashboard/routes/personas.d.ts.map +1 -0
  27. package/dist/dashboard/routes/personas.js +71 -0
  28. package/dist/dashboard/routes/personas.js.map +1 -0
  29. package/dist/dashboard/routes/scripts.d.ts +9 -0
  30. package/dist/dashboard/routes/scripts.d.ts.map +1 -0
  31. package/dist/dashboard/routes/scripts.js +62 -0
  32. package/dist/dashboard/routes/scripts.js.map +1 -0
  33. package/dist/dashboard/routes/workspace.d.ts +10 -0
  34. package/dist/dashboard/routes/workspace.d.ts.map +1 -0
  35. package/dist/dashboard/routes/workspace.js +82 -0
  36. package/dist/dashboard/routes/workspace.js.map +1 -0
  37. package/dist/dashboard/server.d.ts +14 -0
  38. package/dist/dashboard/server.d.ts.map +1 -0
  39. package/dist/dashboard/server.js +97 -0
  40. package/dist/dashboard/server.js.map +1 -0
  41. package/dist/index.d.ts +3 -27
  42. package/dist/index.d.ts.map +1 -1
  43. package/dist/index.js +142 -46
  44. package/dist/index.js.map +1 -1
  45. package/dist/schemas/validation.d.ts +406 -0
  46. package/dist/schemas/validation.d.ts.map +1 -1
  47. package/dist/schemas/validation.js +231 -4
  48. package/dist/schemas/validation.js.map +1 -1
  49. package/dist/scripts/bootstrap_persona.d.ts.map +1 -1
  50. package/dist/scripts/bootstrap_persona.js +9 -4
  51. package/dist/scripts/bootstrap_persona.js.map +1 -1
  52. package/dist/scripts/bootstrap_tools.js +16 -25
  53. package/dist/scripts/bootstrap_tools.js.map +1 -1
  54. package/dist/scripts/setup-db.d.ts.map +1 -1
  55. package/dist/scripts/setup-db.js +40 -33
  56. package/dist/scripts/setup-db.js.map +1 -1
  57. package/dist/scripts/sleep_cycle.d.ts +12 -0
  58. package/dist/scripts/sleep_cycle.d.ts.map +1 -1
  59. package/dist/scripts/sleep_cycle.js +57 -38
  60. package/dist/scripts/sleep_cycle.js.map +1 -1
  61. package/dist/services/config.d.ts +31 -0
  62. package/dist/services/config.d.ts.map +1 -0
  63. package/dist/services/config.js +125 -0
  64. package/dist/services/config.js.map +1 -0
  65. package/dist/services/db.d.ts.map +1 -1
  66. package/dist/services/db.js +6 -4
  67. package/dist/services/db.js.map +1 -1
  68. package/dist/services/llm.d.ts.map +1 -1
  69. package/dist/services/llm.js +13 -6
  70. package/dist/services/llm.js.map +1 -1
  71. package/dist/services/memoryService.d.ts +10 -38
  72. package/dist/services/memoryService.d.ts.map +1 -1
  73. package/dist/services/memoryService.js +27 -78
  74. package/dist/services/memoryService.js.map +1 -1
  75. package/dist/services/personaService.d.ts +22 -0
  76. package/dist/services/personaService.d.ts.map +1 -0
  77. package/dist/services/personaService.js +148 -0
  78. package/dist/services/personaService.js.map +1 -0
  79. package/dist/tests/dashboard-schemas.test.d.ts +6 -0
  80. package/dist/tests/dashboard-schemas.test.d.ts.map +1 -0
  81. package/dist/tests/dashboard-schemas.test.js +171 -0
  82. package/dist/tests/dashboard-schemas.test.js.map +1 -0
  83. package/dist/tests/helpers.test.d.ts +5 -0
  84. package/dist/tests/helpers.test.d.ts.map +1 -0
  85. package/dist/tests/helpers.test.js +66 -0
  86. package/dist/tests/helpers.test.js.map +1 -0
  87. package/dist/tests/router.test.d.ts +5 -0
  88. package/dist/tests/router.test.d.ts.map +1 -0
  89. package/dist/tests/router.test.js +125 -0
  90. package/dist/tests/router.test.js.map +1 -0
  91. package/openclaw.plugin.json +23 -0
  92. 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":"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"}
@@ -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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"}