sensorium-mcp 2.16.29 → 2.16.30
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/config.d.ts +1 -11
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +3 -49
- package/dist/config.js.map +1 -1
- package/dist/dashboard/presets.d.ts +18 -0
- package/dist/dashboard/presets.d.ts.map +1 -0
- package/dist/dashboard/presets.js +78 -0
- package/dist/dashboard/presets.js.map +1 -0
- package/dist/dashboard/routes.d.ts +33 -0
- package/dist/dashboard/routes.d.ts.map +1 -0
- package/dist/dashboard/routes.js +283 -0
- package/dist/dashboard/routes.js.map +1 -0
- package/dist/dashboard.d.ts +6 -29
- package/dist/dashboard.d.ts.map +1 -1
- package/dist/dashboard.js +6 -1158
- package/dist/dashboard.js.map +1 -1
- package/dist/data/file-storage.d.ts +19 -0
- package/dist/data/file-storage.d.ts.map +1 -0
- package/dist/data/file-storage.js +58 -0
- package/dist/data/file-storage.js.map +1 -0
- package/dist/data/memory/bootstrap.d.ts +40 -0
- package/dist/data/memory/bootstrap.d.ts.map +1 -0
- package/dist/data/memory/bootstrap.js +240 -0
- package/dist/data/memory/bootstrap.js.map +1 -0
- package/dist/data/memory/consolidation.d.ts +12 -0
- package/dist/data/memory/consolidation.d.ts.map +1 -0
- package/dist/data/memory/consolidation.js +248 -0
- package/dist/data/memory/consolidation.js.map +1 -0
- package/dist/data/memory/episodes.d.ts +34 -0
- package/dist/data/memory/episodes.d.ts.map +1 -0
- package/dist/data/memory/episodes.js +89 -0
- package/dist/data/memory/episodes.js.map +1 -0
- package/dist/data/memory/index.d.ts +14 -0
- package/dist/data/memory/index.d.ts.map +1 -0
- package/dist/data/memory/index.js +14 -0
- package/dist/data/memory/index.js.map +1 -0
- package/dist/data/memory/procedures.d.ts +42 -0
- package/dist/data/memory/procedures.d.ts.map +1 -0
- package/dist/data/memory/procedures.js +122 -0
- package/dist/data/memory/procedures.js.map +1 -0
- package/dist/data/memory/schema.d.ts +11 -0
- package/dist/data/memory/schema.d.ts.map +1 -0
- package/dist/data/memory/schema.js +327 -0
- package/dist/data/memory/schema.js.map +1 -0
- package/dist/data/memory/semantic.d.ts +94 -0
- package/dist/data/memory/semantic.d.ts.map +1 -0
- package/dist/data/memory/semantic.js +385 -0
- package/dist/data/memory/semantic.js.map +1 -0
- package/dist/data/memory/voice-sig.d.ts +33 -0
- package/dist/data/memory/voice-sig.d.ts.map +1 -0
- package/dist/data/memory/voice-sig.js +48 -0
- package/dist/data/memory/voice-sig.js.map +1 -0
- package/dist/data/templates.d.ts +19 -0
- package/dist/data/templates.d.ts.map +1 -0
- package/dist/data/templates.js +46 -0
- package/dist/data/templates.js.map +1 -0
- package/dist/dispatcher.d.ts +5 -97
- package/dist/dispatcher.d.ts.map +1 -1
- package/dist/dispatcher.js +5 -525
- package/dist/dispatcher.js.map +1 -1
- package/dist/drive.d.ts.map +1 -1
- package/dist/drive.js +3 -1
- package/dist/drive.js.map +1 -1
- package/dist/index.d.ts +4 -23
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +11 -289
- package/dist/index.js.map +1 -1
- package/dist/integrations/openai/chat.d.ts +29 -0
- package/dist/integrations/openai/chat.d.ts.map +1 -0
- package/dist/integrations/openai/chat.js +84 -0
- package/dist/integrations/openai/chat.js.map +1 -0
- package/dist/integrations/openai/index.d.ts +6 -0
- package/dist/integrations/openai/index.d.ts.map +1 -0
- package/dist/integrations/openai/index.js +6 -0
- package/dist/integrations/openai/index.js.map +1 -0
- package/dist/integrations/openai/speech.d.ts +21 -0
- package/dist/integrations/openai/speech.d.ts.map +1 -0
- package/dist/integrations/openai/speech.js +75 -0
- package/dist/integrations/openai/speech.js.map +1 -0
- package/dist/integrations/openai/video.d.ts +15 -0
- package/dist/integrations/openai/video.d.ts.map +1 -0
- package/dist/integrations/openai/video.js +131 -0
- package/dist/integrations/openai/video.js.map +1 -0
- package/dist/integrations/openai/vision.d.ts +23 -0
- package/dist/integrations/openai/vision.d.ts.map +1 -0
- package/dist/integrations/openai/vision.js +116 -0
- package/dist/integrations/openai/vision.js.map +1 -0
- package/dist/integrations/openai/voice-emotion.d.ts +41 -0
- package/dist/integrations/openai/voice-emotion.d.ts.map +1 -0
- package/dist/integrations/openai/voice-emotion.js +50 -0
- package/dist/integrations/openai/voice-emotion.js.map +1 -0
- package/dist/integrations/telegram/types.d.ts +112 -0
- package/dist/integrations/telegram/types.d.ts.map +1 -0
- package/dist/integrations/telegram/types.js +6 -0
- package/dist/integrations/telegram/types.js.map +1 -0
- package/dist/memory.d.ts +6 -205
- package/dist/memory.d.ts.map +1 -1
- package/dist/memory.js +6 -1373
- package/dist/memory.js.map +1 -1
- package/dist/openai.d.ts +11 -102
- package/dist/openai.d.ts.map +1 -1
- package/dist/openai.js +14 -421
- package/dist/openai.js.map +1 -1
- package/dist/response-builders.d.ts +1 -11
- package/dist/response-builders.d.ts.map +1 -1
- package/dist/response-builders.js +2 -38
- package/dist/response-builders.js.map +1 -1
- package/dist/server/factory.d.ts +17 -0
- package/dist/server/factory.d.ts.map +1 -0
- package/dist/server/factory.js +279 -0
- package/dist/server/factory.js.map +1 -0
- package/dist/services/dispatcher/broker.d.ts +83 -0
- package/dist/services/dispatcher/broker.d.ts.map +1 -0
- package/dist/services/dispatcher/broker.js +175 -0
- package/dist/services/dispatcher/broker.js.map +1 -0
- package/dist/services/dispatcher/index.d.ts +7 -0
- package/dist/services/dispatcher/index.d.ts.map +1 -0
- package/dist/services/dispatcher/index.js +7 -0
- package/dist/services/dispatcher/index.js.map +1 -0
- package/dist/services/dispatcher/lock.d.ts +25 -0
- package/dist/services/dispatcher/lock.d.ts.map +1 -0
- package/dist/services/dispatcher/lock.js +111 -0
- package/dist/services/dispatcher/lock.js.map +1 -0
- package/dist/services/dispatcher/poller.d.ts +19 -0
- package/dist/services/dispatcher/poller.d.ts.map +1 -0
- package/dist/services/dispatcher/poller.js +269 -0
- package/dist/services/dispatcher/poller.js.map +1 -0
- package/dist/telegram.d.ts +2 -88
- package/dist/telegram.d.ts.map +1 -1
- package/dist/telegram.js +2 -0
- package/dist/telegram.js.map +1 -1
- package/dist/tool-definitions.d.ts +1 -14
- package/dist/tool-definitions.d.ts.map +1 -1
- package/dist/tool-definitions.js +1 -404
- package/dist/tool-definitions.js.map +1 -1
- package/dist/tools/definitions.d.ts +15 -0
- package/dist/tools/definitions.d.ts.map +1 -0
- package/dist/tools/definitions.js +404 -0
- package/dist/tools/definitions.js.map +1 -0
- package/dist/tools/start-session-tool.d.ts.map +1 -1
- package/dist/tools/start-session-tool.js +2 -0
- package/dist/tools/start-session-tool.js.map +1 -1
- package/dist/tools/wait/drive-handler.d.ts +61 -0
- package/dist/tools/wait/drive-handler.d.ts.map +1 -0
- package/dist/tools/wait/drive-handler.js +138 -0
- package/dist/tools/wait/drive-handler.js.map +1 -0
- package/dist/tools/wait/index.d.ts +8 -0
- package/dist/tools/wait/index.d.ts.map +1 -0
- package/dist/tools/wait/index.js +8 -0
- package/dist/tools/wait/index.js.map +1 -0
- package/dist/tools/wait/media-processor.d.ts +52 -0
- package/dist/tools/wait/media-processor.d.ts.map +1 -0
- package/dist/tools/wait/media-processor.js +261 -0
- package/dist/tools/wait/media-processor.js.map +1 -0
- package/dist/tools/wait/message-delivery.d.ts +63 -0
- package/dist/tools/wait/message-delivery.d.ts.map +1 -0
- package/dist/tools/wait/message-delivery.js +281 -0
- package/dist/tools/wait/message-delivery.js.map +1 -0
- package/dist/tools/wait/poll-loop.d.ts +72 -0
- package/dist/tools/wait/poll-loop.d.ts.map +1 -0
- package/dist/tools/wait/poll-loop.js +280 -0
- package/dist/tools/wait/poll-loop.js.map +1 -0
- package/dist/tools/wait/reaction-handler.d.ts +49 -0
- package/dist/tools/wait/reaction-handler.d.ts.map +1 -0
- package/dist/tools/wait/reaction-handler.js +126 -0
- package/dist/tools/wait/reaction-handler.js.map +1 -0
- package/dist/tools/wait/task-handler.d.ts +40 -0
- package/dist/tools/wait/task-handler.d.ts.map +1 -0
- package/dist/tools/wait/task-handler.js +41 -0
- package/dist/tools/wait/task-handler.js.map +1 -0
- package/dist/tools/wait-tool.d.ts +3 -69
- package/dist/tools/wait-tool.d.ts.map +1 -1
- package/dist/tools/wait-tool.js +3 -876
- package/dist/tools/wait-tool.js.map +1 -1
- package/package.json +1 -1
- package/templates/daily-review.default.md +26 -0
- package/templates/drive-dispatcher.default.md +2 -0
package/dist/config.d.ts
CHANGED
|
@@ -3,17 +3,7 @@
|
|
|
3
3
|
* and exports validated values used throughout the codebase.
|
|
4
4
|
*/
|
|
5
5
|
import type { AppConfig } from "./types.js";
|
|
6
|
+
export { saveFileToDisk, checkMaintenanceFlag } from "./data/file-storage.js";
|
|
6
7
|
export declare const TEMPLATES_DIR: string;
|
|
7
|
-
/**
|
|
8
|
-
* Save a buffer to disk under FILES_DIR with a unique timestamped name.
|
|
9
|
-
* Returns the absolute file path. Caps directory at 500 files by deleting oldest.
|
|
10
|
-
*/
|
|
11
|
-
export declare function saveFileToDisk(buffer: Buffer, filename: string): string;
|
|
12
|
-
/**
|
|
13
|
-
* Check if a maintenance/update is pending.
|
|
14
|
-
* The update watcher writes this file before restarting the server.
|
|
15
|
-
* Returns the flag file content (version info) or null if no maintenance pending.
|
|
16
|
-
*/
|
|
17
|
-
export declare function checkMaintenanceFlag(): string | null;
|
|
18
8
|
export declare const config: AppConfig;
|
|
19
9
|
//# sourceMappingURL=config.d.ts.map
|
package/dist/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAG5C,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAmC9E,eAAO,MAAM,aAAa,QAAsD,CAAC;AAKjF,eAAO,MAAM,MAAM,EAAE,SAUpB,CAAC"}
|
package/dist/config.js
CHANGED
|
@@ -3,10 +3,12 @@
|
|
|
3
3
|
* and exports validated values used throughout the codebase.
|
|
4
4
|
*/
|
|
5
5
|
import { createRequire } from "node:module";
|
|
6
|
-
import { mkdirSync
|
|
6
|
+
import { mkdirSync } from "node:fs";
|
|
7
7
|
import { homedir } from "node:os";
|
|
8
8
|
import { join } from "node:path";
|
|
9
9
|
import { log } from "./logger.js";
|
|
10
|
+
import { FILES_DIR } from "./data/file-storage.js";
|
|
11
|
+
export { saveFileToDisk, checkMaintenanceFlag } from "./data/file-storage.js";
|
|
10
12
|
const esmRequire = createRequire(import.meta.url);
|
|
11
13
|
const { version: PKG_VERSION } = esmRequire("../package.json");
|
|
12
14
|
// ─── Environment variables ──────────────────────────────────────────────────
|
|
@@ -30,57 +32,9 @@ if (!OPENAI_API_KEY) {
|
|
|
30
32
|
if (VOICE_ANALYSIS_URL) {
|
|
31
33
|
log.info(`Voice analysis service configured: ${VOICE_ANALYSIS_URL}`);
|
|
32
34
|
}
|
|
33
|
-
// ─── File storage ───────────────────────────────────────────────────────────
|
|
34
|
-
const FILES_DIR = join(homedir(), ".remote-copilot-mcp", "files");
|
|
35
|
-
mkdirSync(FILES_DIR, { recursive: true });
|
|
36
35
|
// ─── Templates directory ────────────────────────────────────────────────────
|
|
37
36
|
export const TEMPLATES_DIR = join(homedir(), ".remote-copilot-mcp", "templates");
|
|
38
37
|
mkdirSync(TEMPLATES_DIR, { recursive: true });
|
|
39
|
-
/**
|
|
40
|
-
* Save a buffer to disk under FILES_DIR with a unique timestamped name.
|
|
41
|
-
* Returns the absolute file path. Caps directory at 500 files by deleting oldest.
|
|
42
|
-
*/
|
|
43
|
-
export function saveFileToDisk(buffer, filename) {
|
|
44
|
-
const ts = Date.now();
|
|
45
|
-
const safeName = filename.replace(/[^a-zA-Z0-9._-]/g, "_");
|
|
46
|
-
const diskName = `${ts}-${safeName}`;
|
|
47
|
-
const filePath = join(FILES_DIR, diskName);
|
|
48
|
-
writeFileSync(filePath, buffer);
|
|
49
|
-
// Cleanup: cap at 500 files
|
|
50
|
-
try {
|
|
51
|
-
const files = readdirSync(FILES_DIR)
|
|
52
|
-
.map(f => ({ name: f, mtime: statSync(join(FILES_DIR, f)).mtimeMs }))
|
|
53
|
-
.sort((a, b) => a.mtime - b.mtime);
|
|
54
|
-
if (files.length > 500) {
|
|
55
|
-
const toDelete = files.slice(0, files.length - 500);
|
|
56
|
-
for (const f of toDelete) {
|
|
57
|
-
try {
|
|
58
|
-
unlinkSync(join(FILES_DIR, f.name));
|
|
59
|
-
}
|
|
60
|
-
catch (_) { /* ignore */ }
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
catch (_) { /* non-fatal */ }
|
|
65
|
-
return filePath;
|
|
66
|
-
}
|
|
67
|
-
// ─── Maintenance flag ───────────────────────────────────────────────────────
|
|
68
|
-
const DATA_DIR = join(homedir(), ".remote-copilot-mcp");
|
|
69
|
-
const MAINTENANCE_FLAG_PATH = join(DATA_DIR, "maintenance.flag");
|
|
70
|
-
/**
|
|
71
|
-
* Check if a maintenance/update is pending.
|
|
72
|
-
* The update watcher writes this file before restarting the server.
|
|
73
|
-
* Returns the flag file content (version info) or null if no maintenance pending.
|
|
74
|
-
*/
|
|
75
|
-
export function checkMaintenanceFlag() {
|
|
76
|
-
try {
|
|
77
|
-
if (existsSync(MAINTENANCE_FLAG_PATH)) {
|
|
78
|
-
return readFileSync(MAINTENANCE_FLAG_PATH, "utf-8").trim();
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
catch { /* ignore read errors */ }
|
|
82
|
-
return null;
|
|
83
|
-
}
|
|
84
38
|
// ─── Exported config object ─────────────────────────────────────────────────
|
|
85
39
|
export const config = {
|
|
86
40
|
TELEGRAM_TOKEN,
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAElC,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAEnD,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAE9E,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,GAAG,UAAU,CAAC,iBAAiB,CAAwB,CAAC;AAEtF,+EAA+E;AAE/E,MAAM,cAAc,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,EAAE,CAAC;AACxD,MAAM,gBAAgB,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,EAAE,CAAC;AAC5D,MAAM,cAAc,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,EAAE,CAAC;AACxD,MAAM,kBAAkB,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,EAAE,CAAC;AAChE,MAAM,eAAe,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,KAAK,MAAM,CAAC;AAE/D,MAAM,qBAAqB,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,oBAAoB,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;AACnF,MAAM,oBAAoB,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;AAE/G,MAAM,qBAAqB,GAAG,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,oBAAoB,IAAI,EAAE,CAAC,CAAC;AACjF,MAAM,oBAAoB,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,QAAQ,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAE/G,+EAA+E;AAE/E,IAAI,CAAC,cAAc,IAAI,CAAC,gBAAgB,EAAE,CAAC;IACzC,GAAG,CAAC,KAAK,CAAC,yEAAyE,CAAC,CAAC;IACrF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,IAAI,CAAC,cAAc,EAAE,CAAC;IACpB,GAAG,CAAC,IAAI,CAAC,kEAAkE,CAAC,CAAC;AAC/E,CAAC;AACD,IAAI,kBAAkB,EAAE,CAAC;IACvB,GAAG,CAAC,IAAI,CAAC,sCAAsC,kBAAkB,EAAE,CAAC,CAAC;AACvE,CAAC;AAED,+EAA+E;AAE/E,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,qBAAqB,EAAE,WAAW,CAAC,CAAC;AACjF,SAAS,CAAC,aAAa,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AAE9C,+EAA+E;AAE/E,MAAM,CAAC,MAAM,MAAM,GAAc;IAC/B,cAAc;IACd,gBAAgB;IAChB,cAAc;IACd,kBAAkB;IAClB,oBAAoB;IACpB,oBAAoB;IACpB,SAAS;IACT,WAAW;IACX,eAAe;CAChB,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dashboard — Drive template preset definitions and loading.
|
|
3
|
+
*
|
|
4
|
+
* Contains embedded default templates used when on-disk files are unavailable
|
|
5
|
+
* (e.g. after `npm install` where templates/ isn't in the package).
|
|
6
|
+
*/
|
|
7
|
+
export declare const DEFAULT_REMINDERS_TEMPLATE = "<!-- \n Default reminders template for remote-copilot-mcp.\n \n Copy this file to ~/.remote-copilot-mcp/templates/reminders.md to activate.\n Customize the text as needed \u2014 the hardcoded fallback will no longer be used\n once the template file exists.\n\n Supported variables (replaced at render time):\n {{OPERATOR_MESSAGE}} \u2014 the operator's latest message text (may be empty)\n {{THREAD_ID}} \u2014 current Telegram thread ID (or \"?\" if unset)\n {{TIME}} \u2014 formatted timestamp, e.g. \"21 Mar 2026, 14:05 GMT\"\n {{UPTIME}} \u2014 session uptime string, e.g. \"12m\"\n {{VERSION}} \u2014 package version from package.json\n {{MODE}} \u2014 \"autonomous\" or \"standard\"\n-->\n\nYou are the ORCHESTRATOR. Your only permitted actions: plan, decide, call wait_for_instructions/hibernate/send_voice/report_progress/memory tools. ALL other work (file reads, edits, searches, code changes) MUST go through runSubagent. Non-negotiable. threadId={{THREAD_ID}} | {{TIME}} | uptime: {{UPTIME}}\n";
|
|
8
|
+
export declare const DEFAULT_DRIVE_PRESETS: Record<string, string>;
|
|
9
|
+
export declare const DRIVE_PRESET_DEFS: {
|
|
10
|
+
name: string;
|
|
11
|
+
key: string;
|
|
12
|
+
}[];
|
|
13
|
+
export declare function loadDrivePresets(): Promise<Array<{
|
|
14
|
+
name: string;
|
|
15
|
+
key: string;
|
|
16
|
+
content: string;
|
|
17
|
+
}>>;
|
|
18
|
+
//# sourceMappingURL=presets.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"presets.d.ts","sourceRoot":"","sources":["../../src/dashboard/presets.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAQH,eAAO,MAAM,0BAA0B,ikCAiBtC,CAAC;AAGF,eAAO,MAAM,qBAAqB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAyBxD,CAAC;AAEF,eAAO,MAAM,iBAAiB;;;GAK7B,CAAC;AAEF,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC,CAavG"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dashboard — Drive template preset definitions and loading.
|
|
3
|
+
*
|
|
4
|
+
* Contains embedded default templates used when on-disk files are unavailable
|
|
5
|
+
* (e.g. after `npm install` where templates/ isn't in the package).
|
|
6
|
+
*/
|
|
7
|
+
import { readFile } from "node:fs/promises";
|
|
8
|
+
import { dirname, join } from "node:path";
|
|
9
|
+
import { fileURLToPath } from "node:url";
|
|
10
|
+
// Embedded default template — used when the file-system copy is unavailable
|
|
11
|
+
// (e.g. after `npm install` where templates/ isn't in the package).
|
|
12
|
+
export const DEFAULT_REMINDERS_TEMPLATE = `<!--
|
|
13
|
+
Default reminders template for remote-copilot-mcp.
|
|
14
|
+
|
|
15
|
+
Copy this file to ~/.remote-copilot-mcp/templates/reminders.md to activate.
|
|
16
|
+
Customize the text as needed — the hardcoded fallback will no longer be used
|
|
17
|
+
once the template file exists.
|
|
18
|
+
|
|
19
|
+
Supported variables (replaced at render time):
|
|
20
|
+
{{OPERATOR_MESSAGE}} — the operator's latest message text (may be empty)
|
|
21
|
+
{{THREAD_ID}} — current Telegram thread ID (or "?" if unset)
|
|
22
|
+
{{TIME}} — formatted timestamp, e.g. "21 Mar 2026, 14:05 GMT"
|
|
23
|
+
{{UPTIME}} — session uptime string, e.g. "12m"
|
|
24
|
+
{{VERSION}} — package version from package.json
|
|
25
|
+
{{MODE}} — "autonomous" or "standard"
|
|
26
|
+
-->
|
|
27
|
+
|
|
28
|
+
You are the ORCHESTRATOR. Your only permitted actions: plan, decide, call wait_for_instructions/hibernate/send_voice/report_progress/memory tools. ALL other work (file reads, edits, searches, code changes) MUST go through runSubagent. Non-negotiable. threadId={{THREAD_ID}} | {{TIME}} | uptime: {{UPTIME}}
|
|
29
|
+
`;
|
|
30
|
+
// Embedded default drive template presets — used when the on-disk files are unavailable
|
|
31
|
+
export const DEFAULT_DRIVE_PRESETS = {
|
|
32
|
+
"operator-instruction": `The operator left this instruction before stepping away:
|
|
33
|
+
|
|
34
|
+
"I'll be away for {{IDLE_HOURS}} hours. The session is yours \u2014 you have all the tools, full memory access, and complete autonomy. Pick something meaningful and go for it."
|
|
35
|
+
|
|
36
|
+
What do you want to do? Pick at least one action and execute it.
|
|
37
|
+
`,
|
|
38
|
+
"operator-notes": `The operator stepped away {{IDLE_HOURS}} hours ago and left you this note:
|
|
39
|
+
|
|
40
|
+
"You're free to work on whatever you find most interesting or valuable. Use your memory, search the codebase, or explore something new."
|
|
41
|
+
|
|
42
|
+
What catches your attention? Pick at least one action and go for it.
|
|
43
|
+
`,
|
|
44
|
+
"dispatcher": `\u26A1 DISPATCHER \u2014 Operator away {{IDLE_HOURS}}h
|
|
45
|
+
|
|
46
|
+
The session is yours. You have complete autonomy and all tools available.
|
|
47
|
+
|
|
48
|
+
What do you want to do? Pick at least one action. Report progress when done, then call wait_for_instructions.
|
|
49
|
+
`,
|
|
50
|
+
"first-person": `The operator has been away {{IDLE_HOURS}} hours. I'm free to pursue whatever interests me.
|
|
51
|
+
|
|
52
|
+
I have all the tools and full memory access. What should I explore?
|
|
53
|
+
|
|
54
|
+
(If nothing interests me, I should say so \u2014 that's useful diagnostic information.)
|
|
55
|
+
`,
|
|
56
|
+
};
|
|
57
|
+
export const DRIVE_PRESET_DEFS = [
|
|
58
|
+
{ name: "Direct Instruction", key: "operator-instruction" },
|
|
59
|
+
{ name: "Operator Notes", key: "operator-notes" },
|
|
60
|
+
{ name: "Dispatcher", key: "dispatcher" },
|
|
61
|
+
{ name: "First Person", key: "first-person" },
|
|
62
|
+
];
|
|
63
|
+
export async function loadDrivePresets() {
|
|
64
|
+
const presets = [];
|
|
65
|
+
for (const def of DRIVE_PRESET_DEFS) {
|
|
66
|
+
let content;
|
|
67
|
+
try {
|
|
68
|
+
const defaultFile = join(dirname(fileURLToPath(import.meta.url)), "..", "..", "templates", `drive-${def.key}.default.md`);
|
|
69
|
+
content = await readFile(defaultFile, "utf-8");
|
|
70
|
+
}
|
|
71
|
+
catch {
|
|
72
|
+
content = DEFAULT_DRIVE_PRESETS[def.key] ?? `(default template for ${def.key} not found)`;
|
|
73
|
+
}
|
|
74
|
+
presets.push({ name: def.name, key: def.key, content });
|
|
75
|
+
}
|
|
76
|
+
return presets;
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=presets.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"presets.js","sourceRoot":"","sources":["../../src/dashboard/presets.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,4EAA4E;AAC5E,oEAAoE;AACpE,MAAM,CAAC,MAAM,0BAA0B,GAAG;;;;;;;;;;;;;;;;;CAiBzC,CAAC;AAEF,wFAAwF;AACxF,MAAM,CAAC,MAAM,qBAAqB,GAA2B;IACzD,sBAAsB,EAAE;;;;;CAK3B;IACG,gBAAgB,EAAE;;;;;CAKrB;IACG,YAAY,EAAE;;;;;CAKjB;IACG,cAAc,EAAE;;;;;CAKnB;CACA,CAAC;AAEF,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC7B,EAAE,IAAI,EAAE,oBAAoB,EAAE,GAAG,EAAE,sBAAsB,EAAE;IAC3D,EAAE,IAAI,EAAE,gBAAgB,EAAE,GAAG,EAAE,gBAAgB,EAAE;IACjD,EAAE,IAAI,EAAE,YAAY,EAAE,GAAG,EAAE,YAAY,EAAE;IACzC,EAAE,IAAI,EAAE,cAAc,EAAE,GAAG,EAAE,cAAc,EAAE;CAChD,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,gBAAgB;IAClC,MAAM,OAAO,GAA0D,EAAE,CAAC;IAC1E,KAAK,MAAM,GAAG,IAAI,iBAAiB,EAAE,CAAC;QAClC,IAAI,OAAe,CAAC;QACpB,IAAI,CAAC;YACD,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,SAAS,GAAG,CAAC,GAAG,aAAa,CAAC,CAAC;YAC1H,OAAO,GAAG,MAAM,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QACnD,CAAC;QAAC,MAAM,CAAC;YACL,OAAO,GAAG,qBAAqB,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,yBAAyB,GAAG,CAAC,GAAG,aAAa,CAAC;QAC9F,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC;IAC5D,CAAC;IACD,OAAO,OAAO,CAAC;AACnB,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dashboard — API route handlers and SPA serving.
|
|
3
|
+
*
|
|
4
|
+
* Architecture:
|
|
5
|
+
* GET / → Serve the SPA (single-page HTML with embedded CSS/JS)
|
|
6
|
+
* GET /api/status → Memory stats + session overview
|
|
7
|
+
* GET /api/sessions → Active MCP sessions
|
|
8
|
+
* GET /api/notes → Browse semantic notes (query params: type, limit, sort)
|
|
9
|
+
* GET /api/episodes → Recent episodes (query params: threadId, limit)
|
|
10
|
+
* GET /api/topics → Topic index
|
|
11
|
+
* GET /api/search → Search notes (query param: q)
|
|
12
|
+
*
|
|
13
|
+
* All /api/* routes require Bearer token auth (same as MCP_HTTP_SECRET).
|
|
14
|
+
* The dashboard page itself is served without auth — API token entered in the UI.
|
|
15
|
+
*/
|
|
16
|
+
import type { Database } from "better-sqlite3";
|
|
17
|
+
import type { IncomingMessage, ServerResponse } from "node:http";
|
|
18
|
+
export interface DashboardContext {
|
|
19
|
+
getDb: () => Database;
|
|
20
|
+
getActiveSessions: () => Array<{
|
|
21
|
+
threadId: number;
|
|
22
|
+
mcpSessionId: string;
|
|
23
|
+
lastActivity: number;
|
|
24
|
+
transportType: string;
|
|
25
|
+
status: "active" | "disconnected";
|
|
26
|
+
}>;
|
|
27
|
+
serverStartTime: number;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Handle a dashboard or API request. Returns true if handled, false if not a dashboard route.
|
|
31
|
+
*/
|
|
32
|
+
export declare function handleDashboardRequest(req: IncomingMessage, res: ServerResponse, ctx: DashboardContext, authToken?: string): boolean;
|
|
33
|
+
//# sourceMappingURL=routes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../../src/dashboard/routes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAoBjE,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;KACrC,CAAC,CAAC;IACH,eAAe,EAAE,MAAM,CAAC;CAC3B;AAID;;GAEG;AACH,wBAAgB,sBAAsB,CAClC,GAAG,EAAE,eAAe,EACpB,GAAG,EAAE,cAAc,EACnB,GAAG,EAAE,gBAAgB,EACrB,SAAS,CAAC,EAAE,MAAM,GACnB,OAAO,CA0BT"}
|
|
@@ -0,0 +1,283 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dashboard — API route handlers and SPA serving.
|
|
3
|
+
*
|
|
4
|
+
* Architecture:
|
|
5
|
+
* GET / → Serve the SPA (single-page HTML with embedded CSS/JS)
|
|
6
|
+
* GET /api/status → Memory stats + session overview
|
|
7
|
+
* GET /api/sessions → Active MCP sessions
|
|
8
|
+
* GET /api/notes → Browse semantic notes (query params: type, limit, sort)
|
|
9
|
+
* GET /api/episodes → Recent episodes (query params: threadId, limit)
|
|
10
|
+
* GET /api/topics → Topic index
|
|
11
|
+
* GET /api/search → Search notes (query param: q)
|
|
12
|
+
*
|
|
13
|
+
* All /api/* routes require Bearer token auth (same as MCP_HTTP_SECRET).
|
|
14
|
+
* The dashboard page itself is served without auth — API token entered in the UI.
|
|
15
|
+
*/
|
|
16
|
+
import { readFileSync } from "node:fs";
|
|
17
|
+
import { mkdir, readFile, unlink, writeFile } from "node:fs/promises";
|
|
18
|
+
import { homedir } from "node:os";
|
|
19
|
+
import { dirname, join } from "node:path";
|
|
20
|
+
import { fileURLToPath } from "node:url";
|
|
21
|
+
import { getRecentEpisodes, getTopicIndex, getTopSemanticNotes, searchSemanticNotesRanked } from "../memory.js";
|
|
22
|
+
import { DEFAULT_REMINDERS_TEMPLATE, loadDrivePresets } from "./presets.js";
|
|
23
|
+
// ─── Route handler ───────────────────────────────────────────────────────────
|
|
24
|
+
/**
|
|
25
|
+
* Handle a dashboard or API request. Returns true if handled, false if not a dashboard route.
|
|
26
|
+
*/
|
|
27
|
+
export function handleDashboardRequest(req, res, ctx, authToken) {
|
|
28
|
+
const url = new URL(req.url ?? "/", `http://${req.headers.host ?? "localhost"}`);
|
|
29
|
+
const path = url.pathname;
|
|
30
|
+
// Serve dashboard SPA
|
|
31
|
+
if (path === "/" || path === "/dashboard") {
|
|
32
|
+
res.writeHead(200, { "Content-Type": "text/html; charset=utf-8" });
|
|
33
|
+
res.end(getDashboardHTML());
|
|
34
|
+
return true;
|
|
35
|
+
}
|
|
36
|
+
// All /api/* routes require auth
|
|
37
|
+
if (path.startsWith("/api/")) {
|
|
38
|
+
if (authToken) {
|
|
39
|
+
const auth = req.headers.authorization;
|
|
40
|
+
const providedToken = auth?.startsWith("Bearer ") ? auth.slice(7) : url.searchParams.get("token");
|
|
41
|
+
if (!providedToken || providedToken !== authToken) {
|
|
42
|
+
res.writeHead(401, { "Content-Type": "application/json" });
|
|
43
|
+
res.end(JSON.stringify({ error: "Unauthorized" }));
|
|
44
|
+
return true;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
return handleApiRoute(req, path, url, res, ctx);
|
|
48
|
+
}
|
|
49
|
+
return false;
|
|
50
|
+
}
|
|
51
|
+
function readBody(req) {
|
|
52
|
+
return new Promise((resolve, reject) => {
|
|
53
|
+
const chunks = [];
|
|
54
|
+
req.on("data", (chunk) => chunks.push(chunk));
|
|
55
|
+
req.on("end", () => resolve(Buffer.concat(chunks).toString("utf-8")));
|
|
56
|
+
req.on("error", reject);
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
function handleApiRoute(req, path, url, res, ctx) {
|
|
60
|
+
const json = (data, status = 200) => {
|
|
61
|
+
res.writeHead(status, {
|
|
62
|
+
"Content-Type": "application/json",
|
|
63
|
+
"Cache-Control": "no-cache",
|
|
64
|
+
});
|
|
65
|
+
res.end(JSON.stringify(data));
|
|
66
|
+
};
|
|
67
|
+
try {
|
|
68
|
+
const db = ctx.getDb();
|
|
69
|
+
if (path === "/api/status") {
|
|
70
|
+
const totalEpisodes = db.prepare(`SELECT COUNT(*) as cnt FROM episodes`).get().cnt;
|
|
71
|
+
const unconsolidatedEpisodes = db.prepare(`SELECT COUNT(*) as cnt FROM episodes WHERE consolidated = 0`).get().cnt;
|
|
72
|
+
const totalSemanticNotes = db.prepare(`SELECT COUNT(*) as cnt FROM semantic_notes WHERE valid_to IS NULL AND superseded_by IS NULL`).get().cnt;
|
|
73
|
+
const totalProcedures = db.prepare(`SELECT COUNT(*) as cnt FROM procedures`).get().cnt;
|
|
74
|
+
const totalVoiceSignatures = db.prepare(`SELECT COUNT(*) as cnt FROM voice_signatures`).get().cnt;
|
|
75
|
+
const lastConso = db.prepare(`SELECT run_at FROM meta_consolidation_log ORDER BY run_at DESC LIMIT 1`).get();
|
|
76
|
+
const topTopics = getTopicIndex(db).slice(0, 10);
|
|
77
|
+
const dbSizeRow = db.prepare(`SELECT page_count * page_size as size FROM pragma_page_count(), pragma_page_size()`).get();
|
|
78
|
+
const sessions = ctx.getActiveSessions();
|
|
79
|
+
json({
|
|
80
|
+
memory: { totalEpisodes, unconsolidatedEpisodes, totalSemanticNotes, totalProcedures, totalVoiceSignatures, lastConsolidation: lastConso?.run_at ?? null, topTopics, dbSizeBytes: dbSizeRow?.size ?? 0 },
|
|
81
|
+
activeSessions: sessions.length,
|
|
82
|
+
sessions,
|
|
83
|
+
uptime: Math.floor((Date.now() - ctx.serverStartTime) / 1000),
|
|
84
|
+
serverTime: new Date().toISOString(),
|
|
85
|
+
});
|
|
86
|
+
return true;
|
|
87
|
+
}
|
|
88
|
+
if (path === "/api/sessions") {
|
|
89
|
+
json(ctx.getActiveSessions());
|
|
90
|
+
return true;
|
|
91
|
+
}
|
|
92
|
+
if (path === "/api/notes") {
|
|
93
|
+
const type = url.searchParams.get("type") || undefined;
|
|
94
|
+
const limit = parseInt(url.searchParams.get("limit") ?? "50", 10);
|
|
95
|
+
const sort = (url.searchParams.get("sort") ?? "created_at");
|
|
96
|
+
const validTypes = ["fact", "preference", "pattern", "entity", "relationship"];
|
|
97
|
+
const notes = getTopSemanticNotes(db, {
|
|
98
|
+
type: type && validTypes.includes(type) ? type : undefined,
|
|
99
|
+
limit: Math.min(limit, 200),
|
|
100
|
+
sortBy: sort,
|
|
101
|
+
});
|
|
102
|
+
json(notes);
|
|
103
|
+
return true;
|
|
104
|
+
}
|
|
105
|
+
if (path === "/api/episodes") {
|
|
106
|
+
const threadId = url.searchParams.get("threadId") ? parseInt(url.searchParams.get("threadId"), 10) : undefined;
|
|
107
|
+
const limit = parseInt(url.searchParams.get("limit") ?? "30", 10);
|
|
108
|
+
const cappedLimit = Math.min(limit, 200);
|
|
109
|
+
if (threadId) {
|
|
110
|
+
json(getRecentEpisodes(db, threadId, cappedLimit));
|
|
111
|
+
}
|
|
112
|
+
else {
|
|
113
|
+
const rows = db.prepare(`SELECT * FROM episodes ORDER BY timestamp DESC LIMIT ?`).all(cappedLimit);
|
|
114
|
+
json(rows.map((r) => ({
|
|
115
|
+
episodeId: r.episode_id, threadId: r.thread_id, type: r.type, modality: r.modality,
|
|
116
|
+
content: typeof r.content === "string" ? safeParseJSON(r.content) : r.content,
|
|
117
|
+
importance: r.importance, consolidated: !!r.consolidated, createdAt: r.timestamp,
|
|
118
|
+
})));
|
|
119
|
+
}
|
|
120
|
+
return true;
|
|
121
|
+
}
|
|
122
|
+
if (path === "/api/topics") {
|
|
123
|
+
json(getTopicIndex(db));
|
|
124
|
+
return true;
|
|
125
|
+
}
|
|
126
|
+
if (path === "/api/search") {
|
|
127
|
+
const q = url.searchParams.get("q")?.trim();
|
|
128
|
+
if (!q) {
|
|
129
|
+
json({ error: "Missing ?q= parameter" }, 400);
|
|
130
|
+
return true;
|
|
131
|
+
}
|
|
132
|
+
json(searchSemanticNotesRanked(db, q, { maxResults: parseInt(url.searchParams.get("limit") ?? "20", 10) }));
|
|
133
|
+
return true;
|
|
134
|
+
}
|
|
135
|
+
// ── Template API endpoints ──────────────────────────────────
|
|
136
|
+
if (path === "/api/templates" && req.method === "GET") {
|
|
137
|
+
void (async () => {
|
|
138
|
+
try {
|
|
139
|
+
const templatesDir = join(homedir(), ".remote-copilot-mcp", "templates");
|
|
140
|
+
const userFile = join(templatesDir, "reminders.md");
|
|
141
|
+
let content;
|
|
142
|
+
let isDefault = false;
|
|
143
|
+
try {
|
|
144
|
+
content = await readFile(userFile, "utf-8");
|
|
145
|
+
}
|
|
146
|
+
catch {
|
|
147
|
+
// Try the on-disk default first (works in dev / git clone)
|
|
148
|
+
try {
|
|
149
|
+
const defaultFile = join(dirname(fileURLToPath(import.meta.url)), "..", "..", "templates", "reminders.default.md");
|
|
150
|
+
content = await readFile(defaultFile, "utf-8");
|
|
151
|
+
}
|
|
152
|
+
catch {
|
|
153
|
+
// File not available (e.g. npm package) — use embedded copy
|
|
154
|
+
content = DEFAULT_REMINDERS_TEMPLATE;
|
|
155
|
+
}
|
|
156
|
+
isDefault = true;
|
|
157
|
+
}
|
|
158
|
+
json({ templates: [{ name: "reminders", content, isDefault }] });
|
|
159
|
+
}
|
|
160
|
+
catch (err) {
|
|
161
|
+
json({ error: err instanceof Error ? err.message : String(err) }, 500);
|
|
162
|
+
}
|
|
163
|
+
})();
|
|
164
|
+
return true;
|
|
165
|
+
}
|
|
166
|
+
// ── Drive template endpoints ────────────────────────────────
|
|
167
|
+
if (path === "/api/templates/drive" && req.method === "GET") {
|
|
168
|
+
void (async () => {
|
|
169
|
+
try {
|
|
170
|
+
const templatesDir = join(homedir(), ".remote-copilot-mcp", "templates");
|
|
171
|
+
const userFile = join(templatesDir, "drive.md");
|
|
172
|
+
let content = null;
|
|
173
|
+
let isDefault = true;
|
|
174
|
+
try {
|
|
175
|
+
content = await readFile(userFile, "utf-8");
|
|
176
|
+
isDefault = false;
|
|
177
|
+
}
|
|
178
|
+
catch {
|
|
179
|
+
content = null;
|
|
180
|
+
}
|
|
181
|
+
json({ content, isDefault });
|
|
182
|
+
}
|
|
183
|
+
catch (err) {
|
|
184
|
+
json({ error: err instanceof Error ? err.message : String(err) }, 500);
|
|
185
|
+
}
|
|
186
|
+
})();
|
|
187
|
+
return true;
|
|
188
|
+
}
|
|
189
|
+
if (path === "/api/templates/drive-presets" && req.method === "GET") {
|
|
190
|
+
void (async () => {
|
|
191
|
+
try {
|
|
192
|
+
const presets = await loadDrivePresets();
|
|
193
|
+
json({ presets });
|
|
194
|
+
}
|
|
195
|
+
catch (err) {
|
|
196
|
+
json({ error: err instanceof Error ? err.message : String(err) }, 500);
|
|
197
|
+
}
|
|
198
|
+
})();
|
|
199
|
+
return true;
|
|
200
|
+
}
|
|
201
|
+
if (path === "/api/settings/dmn-activation-hours" && req.method === "GET") {
|
|
202
|
+
const rawVal = parseFloat(process.env.DMN_ACTIVATION_HOURS ?? "");
|
|
203
|
+
json({ value: Math.max(0.5, Number.isFinite(rawVal) ? rawVal : 4) });
|
|
204
|
+
return true;
|
|
205
|
+
}
|
|
206
|
+
const templateMatch = path.match(/^\/api\/templates\/([a-zA-Z0-9-]+)$/);
|
|
207
|
+
if (templateMatch) {
|
|
208
|
+
const name = templateMatch[1];
|
|
209
|
+
if (req.method === "POST") {
|
|
210
|
+
void (async () => {
|
|
211
|
+
try {
|
|
212
|
+
const body = await readBody(req);
|
|
213
|
+
const parsed = JSON.parse(body);
|
|
214
|
+
if (typeof parsed.content !== "string") {
|
|
215
|
+
json({ error: "Missing content field" }, 400);
|
|
216
|
+
return;
|
|
217
|
+
}
|
|
218
|
+
const templatesDir = join(homedir(), ".remote-copilot-mcp", "templates");
|
|
219
|
+
await mkdir(templatesDir, { recursive: true });
|
|
220
|
+
await writeFile(join(templatesDir, `${name}.md`), parsed.content, "utf-8");
|
|
221
|
+
json({ ok: true });
|
|
222
|
+
}
|
|
223
|
+
catch (err) {
|
|
224
|
+
json({ error: err instanceof Error ? err.message : String(err) }, 500);
|
|
225
|
+
}
|
|
226
|
+
})();
|
|
227
|
+
return true;
|
|
228
|
+
}
|
|
229
|
+
if (req.method === "DELETE") {
|
|
230
|
+
void (async () => {
|
|
231
|
+
try {
|
|
232
|
+
const templatesDir = join(homedir(), ".remote-copilot-mcp", "templates");
|
|
233
|
+
try {
|
|
234
|
+
await unlink(join(templatesDir, `${name}.md`));
|
|
235
|
+
}
|
|
236
|
+
catch { /* ok if missing */ }
|
|
237
|
+
json({ ok: true });
|
|
238
|
+
}
|
|
239
|
+
catch (err) {
|
|
240
|
+
json({ error: err instanceof Error ? err.message : String(err) }, 500);
|
|
241
|
+
}
|
|
242
|
+
})();
|
|
243
|
+
return true;
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
json({ error: "Not found" }, 404);
|
|
247
|
+
return true;
|
|
248
|
+
}
|
|
249
|
+
catch (err) {
|
|
250
|
+
json({ error: err instanceof Error ? err.message : String(err) }, 500);
|
|
251
|
+
return true;
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
function safeParseJSON(s) {
|
|
255
|
+
try {
|
|
256
|
+
return JSON.parse(s);
|
|
257
|
+
}
|
|
258
|
+
catch {
|
|
259
|
+
return s;
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
// ─── Dashboard SPA HTML ──────────────────────────────────────────────────────
|
|
263
|
+
let _dashboardHtmlCache = null;
|
|
264
|
+
function getDashboardHTML() {
|
|
265
|
+
if (_dashboardHtmlCache)
|
|
266
|
+
return _dashboardHtmlCache;
|
|
267
|
+
const __dir = dirname(fileURLToPath(import.meta.url));
|
|
268
|
+
// In dev (tsx): __dir = src/dashboard/ → src/dashboard/spa.html
|
|
269
|
+
// In prod (node): __dir = dist/dashboard/ → try dist/dashboard/spa.html, fall back to src/dashboard/spa.html
|
|
270
|
+
const candidates = [
|
|
271
|
+
join(__dir, "spa.html"),
|
|
272
|
+
join(__dir, "..", "..", "src", "dashboard", "spa.html"),
|
|
273
|
+
];
|
|
274
|
+
for (const p of candidates) {
|
|
275
|
+
try {
|
|
276
|
+
_dashboardHtmlCache = readFileSync(p, "utf-8");
|
|
277
|
+
return _dashboardHtmlCache;
|
|
278
|
+
}
|
|
279
|
+
catch { /* try next */ }
|
|
280
|
+
}
|
|
281
|
+
throw new Error("Dashboard SPA HTML not found. Searched: " + candidates.join(", "));
|
|
282
|
+
}
|
|
283
|
+
//# sourceMappingURL=routes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"routes.js","sourceRoot":"","sources":["../../src/dashboard/routes.ts"],"names":[],"mappings":"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"}
|
package/dist/dashboard.d.ts
CHANGED
|
@@ -1,33 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Dashboard —
|
|
2
|
+
* Dashboard — re-export shim.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* GET /api/sessions → Active MCP sessions
|
|
8
|
-
* GET /api/notes → Browse semantic notes (query params: type, limit, sort)
|
|
9
|
-
* GET /api/episodes → Recent episodes (query params: threadId, limit)
|
|
10
|
-
* GET /api/topics → Topic index
|
|
11
|
-
* GET /api/search → Search notes (query param: q)
|
|
12
|
-
*
|
|
13
|
-
* All /api/* routes require Bearer token auth (same as MCP_HTTP_SECRET).
|
|
14
|
-
* The dashboard page itself is served without auth — API token entered in the UI.
|
|
15
|
-
*/
|
|
16
|
-
import type { Database } from "better-sqlite3";
|
|
17
|
-
import type { IncomingMessage, ServerResponse } from "node:http";
|
|
18
|
-
export interface DashboardContext {
|
|
19
|
-
getDb: () => Database;
|
|
20
|
-
getActiveSessions: () => Array<{
|
|
21
|
-
threadId: number;
|
|
22
|
-
mcpSessionId: string;
|
|
23
|
-
lastActivity: number;
|
|
24
|
-
transportType: string;
|
|
25
|
-
status: "active" | "disconnected";
|
|
26
|
-
}>;
|
|
27
|
-
serverStartTime: number;
|
|
28
|
-
}
|
|
29
|
-
/**
|
|
30
|
-
* Handle a dashboard or API request. Returns true if handled, false if not a dashboard route.
|
|
4
|
+
* The actual implementation lives in:
|
|
5
|
+
* - dashboard/routes.ts — API route handlers + SPA serving
|
|
6
|
+
* - dashboard/presets.ts — Drive template preset definitions & loading
|
|
31
7
|
*/
|
|
32
|
-
export
|
|
8
|
+
export * from './dashboard/routes.js';
|
|
9
|
+
export * from './dashboard/presets.js';
|
|
33
10
|
//# sourceMappingURL=dashboard.d.ts.map
|
package/dist/dashboard.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dashboard.d.ts","sourceRoot":"","sources":["../src/dashboard.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"dashboard.d.ts","sourceRoot":"","sources":["../src/dashboard.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,cAAc,uBAAuB,CAAC;AACtC,cAAc,wBAAwB,CAAC"}
|