sensorium-mcp 2.16.74 → 2.16.76
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/dist/dashboard/routes/data.d.ts +15 -0
- package/dist/dashboard/routes/data.d.ts.map +1 -0
- package/dist/dashboard/routes/data.js +155 -0
- package/dist/dashboard/routes/data.js.map +1 -0
- package/dist/dashboard/routes/settings.d.ts +13 -0
- package/dist/dashboard/routes/settings.d.ts.map +1 -0
- package/dist/dashboard/routes/settings.js +88 -0
- package/dist/dashboard/routes/settings.js.map +1 -0
- package/dist/dashboard/routes/templates.d.ts +14 -0
- package/dist/dashboard/routes/templates.d.ts.map +1 -0
- package/dist/dashboard/routes/templates.js +113 -0
- package/dist/dashboard/routes/templates.js.map +1 -0
- package/dist/dashboard/routes/types.d.ts +29 -0
- package/dist/dashboard/routes/types.d.ts.map +1 -0
- package/dist/dashboard/routes/types.js +21 -0
- package/dist/dashboard/routes/types.js.map +1 -0
- package/dist/dashboard/routes.d.ts +10 -20
- package/dist/dashboard/routes.d.ts.map +1 -1
- package/dist/dashboard/routes.js +54 -344
- package/dist/dashboard/routes.js.map +1 -1
- package/dist/data/memory/consolidation.js +3 -1
- package/dist/data/memory/consolidation.js.map +1 -1
- package/dist/http-server.d.ts.map +1 -1
- package/dist/http-server.js +95 -114
- package/dist/http-server.js.map +1 -1
- package/dist/server/factory.d.ts.map +1 -1
- package/dist/server/factory.js +100 -105
- package/dist/server/factory.js.map +1 -1
- package/dist/tools/defs/memory-defs.d.ts +7 -0
- package/dist/tools/defs/memory-defs.d.ts.map +1 -0
- package/dist/tools/defs/memory-defs.js +166 -0
- package/dist/tools/defs/memory-defs.js.map +1 -0
- package/dist/tools/defs/session-defs.d.ts +7 -0
- package/dist/tools/defs/session-defs.d.ts.map +1 -0
- package/dist/tools/defs/session-defs.js +257 -0
- package/dist/tools/defs/session-defs.js.map +1 -0
- package/dist/tools/defs/utility-defs.d.ts +6 -0
- package/dist/tools/defs/utility-defs.d.ts.map +1 -0
- package/dist/tools/defs/utility-defs.js +35 -0
- package/dist/tools/defs/utility-defs.js.map +1 -0
- package/dist/tools/defs/wait-defs.d.ts +6 -0
- package/dist/tools/defs/wait-defs.d.ts.map +1 -0
- package/dist/tools/defs/wait-defs.js +24 -0
- package/dist/tools/defs/wait-defs.js.map +1 -0
- package/dist/tools/delegate-tool.d.ts +5 -11
- package/dist/tools/delegate-tool.d.ts.map +1 -1
- package/dist/tools/delegate-tool.js +7 -216
- package/dist/tools/delegate-tool.js.map +1 -1
- package/dist/tools/memory-tools.d.ts +3 -1
- package/dist/tools/memory-tools.d.ts.map +1 -1
- package/dist/tools/memory-tools.js +2 -4
- package/dist/tools/memory-tools.js.map +1 -1
- package/dist/tools/session-tools.js +2 -1
- package/dist/tools/session-tools.js.map +1 -1
- package/dist/tools/thread-lifecycle.d.ts +51 -0
- package/dist/tools/thread-lifecycle.d.ts.map +1 -0
- package/dist/tools/thread-lifecycle.js +226 -0
- package/dist/tools/thread-lifecycle.js.map +1 -0
- package/dist/tools/wait/drive-handler.d.ts +2 -0
- package/dist/tools/wait/drive-handler.d.ts.map +1 -1
- package/dist/tools/wait/drive-handler.js +7 -7
- package/dist/tools/wait/drive-handler.js.map +1 -1
- package/dist/tools/wait/message-processing.d.ts +32 -0
- package/dist/tools/wait/message-processing.d.ts.map +1 -0
- package/dist/tools/wait/message-processing.js +205 -0
- package/dist/tools/wait/message-processing.js.map +1 -0
- package/dist/tools/wait/poll-loop.d.ts +2 -3
- package/dist/tools/wait/poll-loop.d.ts.map +1 -1
- package/dist/tools/wait/poll-loop.js +7 -162
- package/dist/tools/wait/poll-loop.js.map +1 -1
- package/dist/tools/wait/reaction-handler.d.ts.map +1 -1
- package/dist/tools/wait/reaction-handler.js +64 -75
- package/dist/tools/wait/reaction-handler.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dashboard API — data-related route handlers.
|
|
3
|
+
* Covers: status, sessions, notes, episodes, topics, search, topic-registry.
|
|
4
|
+
*/
|
|
5
|
+
import { type RouteHandler } from "./types.js";
|
|
6
|
+
export declare const handleGetStatus: RouteHandler;
|
|
7
|
+
export declare const handleGetSessions: RouteHandler;
|
|
8
|
+
export declare const handleGetNotes: RouteHandler;
|
|
9
|
+
export declare const handleGetEpisodes: RouteHandler;
|
|
10
|
+
export declare const handleGetTopics: RouteHandler;
|
|
11
|
+
export declare const handleGetSearch: RouteHandler;
|
|
12
|
+
export declare const handleGetTopicRegistry: RouteHandler;
|
|
13
|
+
export declare const handlePostTopicRegistry: RouteHandler;
|
|
14
|
+
export declare const handleDeleteTopicRegistry: RouteHandler;
|
|
15
|
+
//# sourceMappingURL=data.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data.d.ts","sourceRoot":"","sources":["../../../src/dashboard/routes/data.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAYH,OAAO,EAA2B,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAwBxE,eAAO,MAAM,eAAe,EAAE,YAuB7B,CAAC;AAIF,eAAO,MAAM,iBAAiB,EAAE,YAG/B,CAAC;AAIF,eAAO,MAAM,cAAc,EAAE,YAY5B,CAAC;AAIF,eAAO,MAAM,iBAAiB,EAAE,YAe/B,CAAC;AAIF,eAAO,MAAM,eAAe,EAAE,YAG7B,CAAC;AAIF,eAAO,MAAM,eAAe,EAAE,YAK7B,CAAC;AAIF,eAAO,MAAM,sBAAsB,EAAE,YAIpC,CAAC;AAEF,eAAO,MAAM,uBAAuB,EAAE,YAwBrC,CAAC;AAEF,eAAO,MAAM,yBAAyB,EAAE,YAoBvC,CAAC"}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dashboard API — data-related route handlers.
|
|
3
|
+
* Covers: status, sessions, notes, episodes, topics, search, topic-registry.
|
|
4
|
+
*/
|
|
5
|
+
import { getRecentEpisodes, getTopicIndex, getTopSemanticNotes, searchSemanticNotesRanked, } from "../../memory.js";
|
|
6
|
+
import { getAllRegisteredTopics, registerTopic, unregisterTopic } from "../../sessions.js";
|
|
7
|
+
import { readBody, safeParseJSON } from "./types.js";
|
|
8
|
+
// ─── Helpers ────────────────────────────────────────────────────────────────
|
|
9
|
+
/**
|
|
10
|
+
* Enrich session objects with topic names by reverse-looking up threadId
|
|
11
|
+
* in the topic registry.
|
|
12
|
+
*/
|
|
13
|
+
function enrichSessionsWithTopicNames(sessions) {
|
|
14
|
+
const allTopics = getAllRegisteredTopics();
|
|
15
|
+
// Build reverse map: threadId → topic name
|
|
16
|
+
const threadToName = new Map();
|
|
17
|
+
for (const chatId of Object.keys(allTopics)) {
|
|
18
|
+
for (const [name, tid] of Object.entries(allTopics[chatId])) {
|
|
19
|
+
threadToName.set(tid, name);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
return sessions.map((s) => ({ ...s, topicName: threadToName.get(s.threadId) ?? null }));
|
|
23
|
+
}
|
|
24
|
+
// ─── GET /api/status — memory stats + session overview ──────────────────────
|
|
25
|
+
export const handleGetStatus = ({ json, db, ctx }) => {
|
|
26
|
+
const totalEpisodes = db.prepare(`SELECT COUNT(*) as cnt FROM episodes`).get().cnt;
|
|
27
|
+
const unconsolidatedEpisodes = db.prepare(`SELECT COUNT(*) as cnt FROM episodes WHERE consolidated = 0`).get().cnt;
|
|
28
|
+
const totalSemanticNotes = db.prepare(`SELECT COUNT(*) as cnt FROM semantic_notes WHERE valid_to IS NULL AND superseded_by IS NULL`).get().cnt;
|
|
29
|
+
const totalProcedures = db.prepare(`SELECT COUNT(*) as cnt FROM procedures`).get().cnt;
|
|
30
|
+
const totalVoiceSignatures = db.prepare(`SELECT COUNT(*) as cnt FROM voice_signatures`).get().cnt;
|
|
31
|
+
const lastConso = db.prepare(`SELECT run_at FROM meta_consolidation_log ORDER BY run_at DESC LIMIT 1`).get();
|
|
32
|
+
const topTopics = getTopicIndex(db).slice(0, 10);
|
|
33
|
+
const dbSizeRow = db.prepare(`SELECT page_count * page_size as size FROM pragma_page_count(), pragma_page_size()`).get();
|
|
34
|
+
const sessions = enrichSessionsWithTopicNames(ctx.getActiveSessions());
|
|
35
|
+
json({
|
|
36
|
+
memory: {
|
|
37
|
+
totalEpisodes, unconsolidatedEpisodes, totalSemanticNotes,
|
|
38
|
+
totalProcedures, totalVoiceSignatures,
|
|
39
|
+
lastConsolidation: lastConso?.run_at ?? null,
|
|
40
|
+
topTopics, dbSizeBytes: dbSizeRow?.size ?? 0,
|
|
41
|
+
},
|
|
42
|
+
activeSessions: sessions.length,
|
|
43
|
+
sessions,
|
|
44
|
+
uptime: Math.floor((Date.now() - ctx.serverStartTime) / 1000),
|
|
45
|
+
serverTime: new Date().toISOString(),
|
|
46
|
+
});
|
|
47
|
+
return true;
|
|
48
|
+
};
|
|
49
|
+
// ─── GET /api/sessions — active MCP sessions ───────────────────────────────
|
|
50
|
+
export const handleGetSessions = ({ json, ctx }) => {
|
|
51
|
+
json(enrichSessionsWithTopicNames(ctx.getActiveSessions()));
|
|
52
|
+
return true;
|
|
53
|
+
};
|
|
54
|
+
// ─── GET /api/notes — browse semantic notes ─────────────────────────────────
|
|
55
|
+
export const handleGetNotes = ({ url, json, db }) => {
|
|
56
|
+
const type = url.searchParams.get("type") || undefined;
|
|
57
|
+
const limit = parseInt(url.searchParams.get("limit") ?? "50", 10);
|
|
58
|
+
const sort = (url.searchParams.get("sort") ?? "created_at");
|
|
59
|
+
const validTypes = ["fact", "preference", "pattern", "entity", "relationship"];
|
|
60
|
+
const notes = getTopSemanticNotes(db, {
|
|
61
|
+
type: type && validTypes.includes(type) ? type : undefined,
|
|
62
|
+
limit: Math.min(limit, 200),
|
|
63
|
+
sortBy: sort,
|
|
64
|
+
});
|
|
65
|
+
json(notes);
|
|
66
|
+
return true;
|
|
67
|
+
};
|
|
68
|
+
// ─── GET /api/episodes — recent episodes ────────────────────────────────────
|
|
69
|
+
export const handleGetEpisodes = ({ url, json, db }) => {
|
|
70
|
+
const threadId = url.searchParams.get("threadId") ? parseInt(url.searchParams.get("threadId"), 10) : undefined;
|
|
71
|
+
const limit = parseInt(url.searchParams.get("limit") ?? "30", 10);
|
|
72
|
+
const cappedLimit = Math.min(limit, 200);
|
|
73
|
+
if (threadId) {
|
|
74
|
+
json(getRecentEpisodes(db, threadId, cappedLimit));
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
const rows = db.prepare(`SELECT * FROM episodes ORDER BY timestamp DESC LIMIT ?`).all(cappedLimit);
|
|
78
|
+
json(rows.map((r) => ({
|
|
79
|
+
episodeId: r.episode_id, threadId: r.thread_id, type: r.type, modality: r.modality,
|
|
80
|
+
content: typeof r.content === "string" ? safeParseJSON(r.content) : r.content,
|
|
81
|
+
importance: r.importance, consolidated: !!r.consolidated, createdAt: r.timestamp,
|
|
82
|
+
})));
|
|
83
|
+
}
|
|
84
|
+
return true;
|
|
85
|
+
};
|
|
86
|
+
// ─── GET /api/topics — topic index ──────────────────────────────────────────
|
|
87
|
+
export const handleGetTopics = ({ json, db }) => {
|
|
88
|
+
json(getTopicIndex(db));
|
|
89
|
+
return true;
|
|
90
|
+
};
|
|
91
|
+
// ─── GET /api/search — search semantic notes ────────────────────────────────
|
|
92
|
+
export const handleGetSearch = ({ url, json, db }) => {
|
|
93
|
+
const q = url.searchParams.get("q")?.trim();
|
|
94
|
+
if (!q) {
|
|
95
|
+
json({ error: "Missing ?q= parameter" }, 400);
|
|
96
|
+
return true;
|
|
97
|
+
}
|
|
98
|
+
json(searchSemanticNotesRanked(db, q, { maxResults: parseInt(url.searchParams.get("limit") ?? "20", 10) }));
|
|
99
|
+
return true;
|
|
100
|
+
};
|
|
101
|
+
// ─── Topic registry endpoints ───────────────────────────────────────────────
|
|
102
|
+
export const handleGetTopicRegistry = ({ url, json }) => {
|
|
103
|
+
const chatId = url.searchParams.get("chatId") ?? undefined;
|
|
104
|
+
json(getAllRegisteredTopics(chatId));
|
|
105
|
+
return true;
|
|
106
|
+
};
|
|
107
|
+
export const handlePostTopicRegistry = ({ req, json }) => {
|
|
108
|
+
void (async () => {
|
|
109
|
+
try {
|
|
110
|
+
const body = await readBody(req);
|
|
111
|
+
const parsed = JSON.parse(body);
|
|
112
|
+
if (!parsed.chatId || typeof parsed.chatId !== "string") {
|
|
113
|
+
json({ error: "Missing or invalid chatId" }, 400);
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
if (!parsed.name || typeof parsed.name !== "string") {
|
|
117
|
+
json({ error: "Missing or invalid name" }, 400);
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
if (parsed.threadId == null || !Number.isFinite(parsed.threadId)) {
|
|
121
|
+
json({ error: "Missing or invalid threadId (must be a number)" }, 400);
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
registerTopic(parsed.chatId, parsed.name.trim(), parsed.threadId);
|
|
125
|
+
json({ ok: true, chatId: parsed.chatId, name: parsed.name.trim().toLowerCase(), threadId: parsed.threadId });
|
|
126
|
+
}
|
|
127
|
+
catch (err) {
|
|
128
|
+
json({ error: err instanceof Error ? err.message : String(err) }, 500);
|
|
129
|
+
}
|
|
130
|
+
})();
|
|
131
|
+
return true;
|
|
132
|
+
};
|
|
133
|
+
export const handleDeleteTopicRegistry = ({ req, json }) => {
|
|
134
|
+
void (async () => {
|
|
135
|
+
try {
|
|
136
|
+
const body = await readBody(req);
|
|
137
|
+
const parsed = JSON.parse(body);
|
|
138
|
+
if (!parsed.chatId || typeof parsed.chatId !== "string") {
|
|
139
|
+
json({ error: "Missing or invalid chatId" }, 400);
|
|
140
|
+
return;
|
|
141
|
+
}
|
|
142
|
+
if (!parsed.name || typeof parsed.name !== "string") {
|
|
143
|
+
json({ error: "Missing or invalid name" }, 400);
|
|
144
|
+
return;
|
|
145
|
+
}
|
|
146
|
+
unregisterTopic(parsed.chatId, parsed.name.trim());
|
|
147
|
+
json({ ok: true });
|
|
148
|
+
}
|
|
149
|
+
catch (err) {
|
|
150
|
+
json({ error: err instanceof Error ? err.message : String(err) }, 500);
|
|
151
|
+
}
|
|
152
|
+
})();
|
|
153
|
+
return true;
|
|
154
|
+
};
|
|
155
|
+
//# sourceMappingURL=data.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data.js","sourceRoot":"","sources":["../../../src/dashboard/routes/data.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dashboard API — settings-related route handlers.
|
|
3
|
+
* Covers: agent-type, dmn-activation-hours, claude-mcp-config, thread-agent-types.
|
|
4
|
+
*/
|
|
5
|
+
import { type RouteHandler } from "./types.js";
|
|
6
|
+
export declare const handleGetDmnActivationHours: RouteHandler;
|
|
7
|
+
export declare const handleGetClaudeMcpConfig: RouteHandler;
|
|
8
|
+
export declare const handlePostClaudeMcpConfig: RouteHandler;
|
|
9
|
+
export declare const handleGetAgentType: RouteHandler;
|
|
10
|
+
export declare const handlePostAgentType: RouteHandler;
|
|
11
|
+
export declare const handleGetThreadAgentTypes: RouteHandler;
|
|
12
|
+
export declare const handlePostThreadAgentType: RouteHandler;
|
|
13
|
+
//# sourceMappingURL=settings.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"settings.d.ts","sourceRoot":"","sources":["../../../src/dashboard/routes/settings.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAYH,OAAO,EAAY,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAIzD,eAAO,MAAM,2BAA2B,EAAE,YAIzC,CAAC;AAIF,eAAO,MAAM,wBAAwB,EAAE,YAGtC,CAAC;AAEF,eAAO,MAAM,yBAAyB,EAAE,YAgBvC,CAAC;AAIF,eAAO,MAAM,kBAAkB,EAAE,YAGhC,CAAC;AAEF,eAAO,MAAM,mBAAmB,EAAE,YAiBjC,CAAC;AAIF,eAAO,MAAM,yBAAyB,EAAE,YAGvC,CAAC;AAEF,eAAO,MAAM,yBAAyB,EAAE,YAqBvC,CAAC"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dashboard API — settings-related route handlers.
|
|
3
|
+
* Covers: agent-type, dmn-activation-hours, claude-mcp-config, thread-agent-types.
|
|
4
|
+
*/
|
|
5
|
+
import { getAgentType, setAgentType, setThreadAgentType, getAllThreadAgentTypes, getClaudeMcpConfigPath, setClaudeMcpConfigPath, } from "../../config.js";
|
|
6
|
+
import { readBody } from "./types.js";
|
|
7
|
+
// ─── DMN activation hours ───────────────────────────────────────────────────
|
|
8
|
+
export const handleGetDmnActivationHours = ({ json }) => {
|
|
9
|
+
const rawVal = parseFloat(process.env.DMN_ACTIVATION_HOURS ?? "");
|
|
10
|
+
json({ value: Math.max(0.5, Number.isFinite(rawVal) ? rawVal : 4) });
|
|
11
|
+
return true;
|
|
12
|
+
};
|
|
13
|
+
// ─── Claude MCP config path ─────────────────────────────────────────────────
|
|
14
|
+
export const handleGetClaudeMcpConfig = ({ json }) => {
|
|
15
|
+
json({ path: getClaudeMcpConfigPath() });
|
|
16
|
+
return true;
|
|
17
|
+
};
|
|
18
|
+
export const handlePostClaudeMcpConfig = ({ req, json }) => {
|
|
19
|
+
void (async () => {
|
|
20
|
+
try {
|
|
21
|
+
const body = await readBody(req);
|
|
22
|
+
const parsed = JSON.parse(body);
|
|
23
|
+
if (typeof parsed.path !== "string" || !parsed.path.trim()) {
|
|
24
|
+
json({ error: "Missing or empty path" }, 400);
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
setClaudeMcpConfigPath(parsed.path.trim());
|
|
28
|
+
json({ ok: true, path: parsed.path.trim() });
|
|
29
|
+
}
|
|
30
|
+
catch (err) {
|
|
31
|
+
json({ error: err instanceof Error ? err.message : String(err) }, 500);
|
|
32
|
+
}
|
|
33
|
+
})();
|
|
34
|
+
return true;
|
|
35
|
+
};
|
|
36
|
+
// ─── Global agent type ──────────────────────────────────────────────────────
|
|
37
|
+
export const handleGetAgentType = ({ json }) => {
|
|
38
|
+
json({ agentType: getAgentType() });
|
|
39
|
+
return true;
|
|
40
|
+
};
|
|
41
|
+
export const handlePostAgentType = ({ req, json }) => {
|
|
42
|
+
void (async () => {
|
|
43
|
+
try {
|
|
44
|
+
const body = await readBody(req);
|
|
45
|
+
const parsed = JSON.parse(body);
|
|
46
|
+
const valid = ["copilot", "claude", "cursor"];
|
|
47
|
+
if (!parsed.agentType || !valid.includes(parsed.agentType)) {
|
|
48
|
+
json({ error: "Invalid agent type. Must be: copilot, claude, cursor" }, 400);
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
setAgentType(parsed.agentType);
|
|
52
|
+
json({ ok: true, agentType: parsed.agentType });
|
|
53
|
+
}
|
|
54
|
+
catch (err) {
|
|
55
|
+
json({ error: err instanceof Error ? err.message : String(err) }, 500);
|
|
56
|
+
}
|
|
57
|
+
})();
|
|
58
|
+
return true;
|
|
59
|
+
};
|
|
60
|
+
// ─── Per-thread agent-type overrides ────────────────────────────────────────
|
|
61
|
+
export const handleGetThreadAgentTypes = ({ json }) => {
|
|
62
|
+
json({ threadAgentTypes: getAllThreadAgentTypes() });
|
|
63
|
+
return true;
|
|
64
|
+
};
|
|
65
|
+
export const handlePostThreadAgentType = ({ req, json }) => {
|
|
66
|
+
void (async () => {
|
|
67
|
+
try {
|
|
68
|
+
const body = await readBody(req);
|
|
69
|
+
const parsed = JSON.parse(body);
|
|
70
|
+
const valid = ["copilot", "claude", "cursor"];
|
|
71
|
+
if (parsed.threadId == null || !Number.isFinite(parsed.threadId)) {
|
|
72
|
+
json({ error: "Missing or invalid threadId (must be a number)" }, 400);
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
if (!parsed.agentType || !valid.includes(parsed.agentType)) {
|
|
76
|
+
json({ error: "Invalid agent type. Must be: copilot, claude, cursor" }, 400);
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
setThreadAgentType(parsed.threadId, parsed.agentType);
|
|
80
|
+
json({ ok: true, threadId: parsed.threadId, agentType: parsed.agentType });
|
|
81
|
+
}
|
|
82
|
+
catch (err) {
|
|
83
|
+
json({ error: err instanceof Error ? err.message : String(err) }, 500);
|
|
84
|
+
}
|
|
85
|
+
})();
|
|
86
|
+
return true;
|
|
87
|
+
};
|
|
88
|
+
//# sourceMappingURL=settings.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"settings.js","sourceRoot":"","sources":["../../../src/dashboard/routes/settings.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dashboard API — template-related route handlers.
|
|
3
|
+
* Covers: reminders template, drive template, drive presets, named template CRUD.
|
|
4
|
+
*/
|
|
5
|
+
import { type RouteHandler, type RouteArgs } from "./types.js";
|
|
6
|
+
export declare const handleGetTemplates: RouteHandler;
|
|
7
|
+
export declare const handleGetDriveTemplate: RouteHandler;
|
|
8
|
+
export declare const handleGetDrivePresets: RouteHandler;
|
|
9
|
+
/**
|
|
10
|
+
* Handle POST (save) or DELETE (remove) for a named template.
|
|
11
|
+
* Returns true if handled, false if the HTTP method is not POST/DELETE.
|
|
12
|
+
*/
|
|
13
|
+
export declare function handleTemplateCrud(args: RouteArgs, name: string): boolean;
|
|
14
|
+
//# sourceMappingURL=templates.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../../../src/dashboard/routes/templates.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAQH,OAAO,EAAY,KAAK,YAAY,EAAE,KAAK,SAAS,EAAE,MAAM,YAAY,CAAC;AAIzE,eAAO,MAAM,kBAAkB,EAAE,YAmBhC,CAAC;AAIF,eAAO,MAAM,sBAAsB,EAAE,YAiBpC,CAAC;AAIF,eAAO,MAAM,qBAAqB,EAAE,YAUnC,CAAC;AAIF;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAqCzE"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dashboard API — template-related route handlers.
|
|
3
|
+
* Covers: reminders template, drive template, drive presets, named template CRUD.
|
|
4
|
+
*/
|
|
5
|
+
import { readFile, mkdir, writeFile, unlink } from "node:fs/promises";
|
|
6
|
+
import { homedir } from "node:os";
|
|
7
|
+
import { join } from "node:path";
|
|
8
|
+
import { getEffectiveAgentType } from "../../config.js";
|
|
9
|
+
import { DEFAULT_DRIVE_PROMPT, loadDrivePresets, getDefaultRemindersTemplate } from "../presets.js";
|
|
10
|
+
import { readBody } from "./types.js";
|
|
11
|
+
// ─── GET /api/templates — list reminders template ───────────────────────────
|
|
12
|
+
export const handleGetTemplates = ({ json }) => {
|
|
13
|
+
void (async () => {
|
|
14
|
+
try {
|
|
15
|
+
const templatesDir = join(homedir(), ".remote-copilot-mcp", "templates");
|
|
16
|
+
const userFile = join(templatesDir, "reminders.md");
|
|
17
|
+
let content;
|
|
18
|
+
let isDefault = false;
|
|
19
|
+
try {
|
|
20
|
+
content = await readFile(userFile, "utf-8");
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
content = getDefaultRemindersTemplate(getEffectiveAgentType());
|
|
24
|
+
isDefault = true;
|
|
25
|
+
}
|
|
26
|
+
json({ templates: [{ name: "reminders", content, isDefault }] });
|
|
27
|
+
}
|
|
28
|
+
catch (err) {
|
|
29
|
+
json({ error: err instanceof Error ? err.message : String(err) }, 500);
|
|
30
|
+
}
|
|
31
|
+
})();
|
|
32
|
+
return true;
|
|
33
|
+
};
|
|
34
|
+
// ─── GET /api/templates/drive — drive template with default ─────────────────
|
|
35
|
+
export const handleGetDriveTemplate = ({ json }) => {
|
|
36
|
+
void (async () => {
|
|
37
|
+
try {
|
|
38
|
+
const templatesDir = join(homedir(), ".remote-copilot-mcp", "templates");
|
|
39
|
+
const userFile = join(templatesDir, "drive.md");
|
|
40
|
+
let custom = null;
|
|
41
|
+
try {
|
|
42
|
+
custom = await readFile(userFile, "utf-8");
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
custom = null;
|
|
46
|
+
}
|
|
47
|
+
json({ custom, default: DEFAULT_DRIVE_PROMPT });
|
|
48
|
+
}
|
|
49
|
+
catch (err) {
|
|
50
|
+
json({ error: err instanceof Error ? err.message : String(err) }, 500);
|
|
51
|
+
}
|
|
52
|
+
})();
|
|
53
|
+
return true;
|
|
54
|
+
};
|
|
55
|
+
// ─── GET /api/templates/drive-presets — available drive presets ──────────────
|
|
56
|
+
export const handleGetDrivePresets = ({ json }) => {
|
|
57
|
+
void (async () => {
|
|
58
|
+
try {
|
|
59
|
+
const presets = await loadDrivePresets();
|
|
60
|
+
json({ presets });
|
|
61
|
+
}
|
|
62
|
+
catch (err) {
|
|
63
|
+
json({ error: err instanceof Error ? err.message : String(err) }, 500);
|
|
64
|
+
}
|
|
65
|
+
})();
|
|
66
|
+
return true;
|
|
67
|
+
};
|
|
68
|
+
// ─── POST/DELETE /api/templates/:name — dynamic template CRUD ───────────────
|
|
69
|
+
/**
|
|
70
|
+
* Handle POST (save) or DELETE (remove) for a named template.
|
|
71
|
+
* Returns true if handled, false if the HTTP method is not POST/DELETE.
|
|
72
|
+
*/
|
|
73
|
+
export function handleTemplateCrud(args, name) {
|
|
74
|
+
const { req, json } = args;
|
|
75
|
+
if (req.method === "POST") {
|
|
76
|
+
void (async () => {
|
|
77
|
+
try {
|
|
78
|
+
const body = await readBody(req);
|
|
79
|
+
const parsed = JSON.parse(body);
|
|
80
|
+
if (typeof parsed.content !== "string") {
|
|
81
|
+
json({ error: "Missing content field" }, 400);
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
const templatesDir = join(homedir(), ".remote-copilot-mcp", "templates");
|
|
85
|
+
await mkdir(templatesDir, { recursive: true });
|
|
86
|
+
await writeFile(join(templatesDir, `${name}.md`), parsed.content, "utf-8");
|
|
87
|
+
json({ ok: true });
|
|
88
|
+
}
|
|
89
|
+
catch (err) {
|
|
90
|
+
json({ error: err instanceof Error ? err.message : String(err) }, 500);
|
|
91
|
+
}
|
|
92
|
+
})();
|
|
93
|
+
return true;
|
|
94
|
+
}
|
|
95
|
+
if (req.method === "DELETE") {
|
|
96
|
+
void (async () => {
|
|
97
|
+
try {
|
|
98
|
+
const templatesDir = join(homedir(), ".remote-copilot-mcp", "templates");
|
|
99
|
+
try {
|
|
100
|
+
await unlink(join(templatesDir, `${name}.md`));
|
|
101
|
+
}
|
|
102
|
+
catch { /* ok if missing */ }
|
|
103
|
+
json({ ok: true });
|
|
104
|
+
}
|
|
105
|
+
catch (err) {
|
|
106
|
+
json({ error: err instanceof Error ? err.message : String(err) }, 500);
|
|
107
|
+
}
|
|
108
|
+
})();
|
|
109
|
+
return true;
|
|
110
|
+
}
|
|
111
|
+
return false;
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=templates.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"templates.js","sourceRoot":"","sources":["../../../src/dashboard/routes/templates.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared types and utilities for dashboard API route handlers.
|
|
3
|
+
*/
|
|
4
|
+
import type { Database } from "better-sqlite3";
|
|
5
|
+
import type { IncomingMessage } from "node:http";
|
|
6
|
+
export interface DashboardContext {
|
|
7
|
+
getDb: () => Database;
|
|
8
|
+
getActiveSessions: () => Array<{
|
|
9
|
+
threadId: number;
|
|
10
|
+
mcpSessionId: string;
|
|
11
|
+
lastActivity: number;
|
|
12
|
+
transportType: string;
|
|
13
|
+
status: "active" | "disconnected";
|
|
14
|
+
lastWaitCallAt: number | null;
|
|
15
|
+
}>;
|
|
16
|
+
serverStartTime: number;
|
|
17
|
+
}
|
|
18
|
+
export type JsonFn = (data: unknown, status?: number) => void;
|
|
19
|
+
export interface RouteArgs {
|
|
20
|
+
req: IncomingMessage;
|
|
21
|
+
url: URL;
|
|
22
|
+
json: JsonFn;
|
|
23
|
+
db: Database;
|
|
24
|
+
ctx: DashboardContext;
|
|
25
|
+
}
|
|
26
|
+
export type RouteHandler = (args: RouteArgs) => boolean;
|
|
27
|
+
export declare function readBody(req: IncomingMessage): Promise<string>;
|
|
28
|
+
export declare function safeParseJSON(s: string): unknown;
|
|
29
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/dashboard/routes/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAIjD,MAAM,WAAW,gBAAgB;IAC7B,KAAK,EAAE,MAAM,QAAQ,CAAC;IACtB,iBAAiB,EAAE,MAAM,KAAK,CAAC;QAC3B,QAAQ,EAAE,MAAM,CAAC;QACjB,YAAY,EAAE,MAAM,CAAC;QACrB,YAAY,EAAE,MAAM,CAAC;QACrB,aAAa,EAAE,MAAM,CAAC;QACtB,MAAM,EAAE,QAAQ,GAAG,cAAc,CAAC;QAClC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;KACjC,CAAC,CAAC;IACH,eAAe,EAAE,MAAM,CAAC;CAC3B;AAID,MAAM,MAAM,MAAM,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;AAE9D,MAAM,WAAW,SAAS;IACtB,GAAG,EAAE,eAAe,CAAC;IACrB,GAAG,EAAE,GAAG,CAAC;IACT,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,QAAQ,CAAC;IACb,GAAG,EAAE,gBAAgB,CAAC;CACzB;AAED,MAAM,MAAM,YAAY,GAAG,CAAC,IAAI,EAAE,SAAS,KAAK,OAAO,CAAC;AAIxD,wBAAgB,QAAQ,CAAC,GAAG,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC,CAO9D;AAED,wBAAgB,aAAa,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAEhD"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared types and utilities for dashboard API route handlers.
|
|
3
|
+
*/
|
|
4
|
+
// ─── Shared utilities ───────────────────────────────────────────────────────
|
|
5
|
+
export function readBody(req) {
|
|
6
|
+
return new Promise((resolve, reject) => {
|
|
7
|
+
const chunks = [];
|
|
8
|
+
req.on("data", (chunk) => chunks.push(chunk));
|
|
9
|
+
req.on("end", () => resolve(Buffer.concat(chunks).toString("utf-8")));
|
|
10
|
+
req.on("error", reject);
|
|
11
|
+
});
|
|
12
|
+
}
|
|
13
|
+
export function safeParseJSON(s) {
|
|
14
|
+
try {
|
|
15
|
+
return JSON.parse(s);
|
|
16
|
+
}
|
|
17
|
+
catch {
|
|
18
|
+
return s;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/dashboard/routes/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAkCH,+EAA+E;AAE/E,MAAM,UAAU,QAAQ,CAAC,GAAoB;IACzC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACnC,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;QACtD,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACtE,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAC5B,CAAC,CAAC,CAAC;AACP,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,CAAS;IACnC,IAAI,CAAC;QAAC,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC;QAAC,OAAO,CAAC,CAAC;IAAC,CAAC;AACrD,CAAC"}
|
|
@@ -1,32 +1,22 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Dashboard — API route
|
|
2
|
+
* Dashboard — API route dispatcher and SPA serving.
|
|
3
3
|
*
|
|
4
4
|
* Architecture:
|
|
5
5
|
* GET / → Serve the SPA (single-page HTML with embedded CSS/JS)
|
|
6
|
-
* GET /api
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
6
|
+
* GET /api/* → Route table dispatch to domain handlers
|
|
7
|
+
*
|
|
8
|
+
* Domain handler modules:
|
|
9
|
+
* routes/settings.ts — agent-type, dmn-activation-hours, claude-mcp-config
|
|
10
|
+
* routes/templates.ts — template CRUD, drive templates, drive presets
|
|
11
|
+
* routes/data.ts — status, sessions, notes, episodes, topics, search, topic-registry
|
|
12
12
|
*
|
|
13
13
|
* All /api/* routes require Bearer token auth (same as MCP_HTTP_SECRET).
|
|
14
14
|
* The dashboard page itself is served without auth — API token entered in the UI.
|
|
15
15
|
*/
|
|
16
|
-
import type { Database } from "better-sqlite3";
|
|
17
16
|
import type { IncomingMessage, ServerResponse } from "node:http";
|
|
18
|
-
export
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
threadId: number;
|
|
22
|
-
mcpSessionId: string;
|
|
23
|
-
lastActivity: number;
|
|
24
|
-
transportType: string;
|
|
25
|
-
status: "active" | "disconnected";
|
|
26
|
-
lastWaitCallAt: number | null;
|
|
27
|
-
}>;
|
|
28
|
-
serverStartTime: number;
|
|
29
|
-
}
|
|
17
|
+
export type { DashboardContext } from "./routes/types.js";
|
|
18
|
+
export type { RouteHandler, RouteArgs, JsonFn } from "./routes/types.js";
|
|
19
|
+
import type { DashboardContext } from "./routes/types.js";
|
|
30
20
|
/**
|
|
31
21
|
* Handle a dashboard or API request. Returns true if handled, false if not a dashboard route.
|
|
32
22
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../../src/dashboard/routes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../../src/dashboard/routes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAQjE,YAAY,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAC1D,YAAY,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAEzE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAoE1D;;GAEG;AACH,wBAAgB,sBAAsB,CAClC,GAAG,EAAE,eAAe,EACpB,GAAG,EAAE,cAAc,EACnB,GAAG,EAAE,gBAAgB,EACrB,SAAS,CAAC,EAAE,MAAM,GACnB,OAAO,CAmCT"}
|