sensorium-mcp 2.16.165 → 2.16.166
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/claude-keeper.d.ts.map +1 -1
- package/dist/claude-keeper.js +10 -4
- package/dist/claude-keeper.js.map +1 -1
- package/dist/daily-session.d.ts.map +1 -1
- package/dist/daily-session.js +50 -25
- package/dist/daily-session.js.map +1 -1
- package/dist/dashboard/routes/threads.d.ts.map +1 -1
- package/dist/dashboard/routes/threads.js +66 -6
- package/dist/dashboard/routes/threads.js.map +1 -1
- package/dist/dashboard/spa.html +10 -10
- package/dist/data/memory/schema.d.ts.map +1 -1
- package/dist/data/memory/schema.js +49 -4
- package/dist/data/memory/schema.js.map +1 -1
- package/dist/data/memory/thread-registry.d.ts.map +1 -1
- package/dist/data/memory/thread-registry.js +6 -2
- package/dist/data/memory/thread-registry.js.map +1 -1
- package/dist/index.js +31 -0
- package/dist/index.js.map +1 -1
- package/dist/watcher-service.d.ts.map +1 -1
- package/dist/watcher-service.js +46 -179
- package/dist/watcher-service.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../src/data/memory/schema.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,aAAa,MAAM,gBAAgB,CAAC;AAQ3C,MAAM,MAAM,QAAQ,GAAG,aAAa,CAAC,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../src/data/memory/schema.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,aAAa,MAAM,gBAAgB,CAAC;AAQ3C,MAAM,MAAM,QAAQ,GAAG,aAAa,CAAC,QAAQ,CAAC;AAglB9C,wBAAgB,YAAY,IAAI,QAAQ,CAqCvC;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,EAAE,EAAE,QAAQ,GAAG,IAAI,CAWzD"}
|
|
@@ -199,7 +199,12 @@ const MIGRATIONS = {
|
|
|
199
199
|
log.info("[migration-12] Created thread_registry table");
|
|
200
200
|
},
|
|
201
201
|
13: (db) => {
|
|
202
|
-
|
|
202
|
+
// session_reset_at may already exist if the DB was created with the latest SCHEMA_SQL
|
|
203
|
+
const cols = db.prepare("PRAGMA table_info(thread_registry)").all();
|
|
204
|
+
const hasCol = cols.some(c => c.name === "session_reset_at");
|
|
205
|
+
if (!hasCol) {
|
|
206
|
+
db.exec("ALTER TABLE thread_registry ADD COLUMN session_reset_at TEXT");
|
|
207
|
+
}
|
|
203
208
|
log.info("[migration-13] Added session_reset_at column to thread_registry");
|
|
204
209
|
},
|
|
205
210
|
};
|
|
@@ -266,7 +271,7 @@ function ensureSchemaIntegrity(db) {
|
|
|
266
271
|
log.info("[memory] Self-heal: adding missing is_guardrail column");
|
|
267
272
|
db.exec("ALTER TABLE semantic_notes ADD COLUMN is_guardrail INTEGER NOT NULL DEFAULT 0");
|
|
268
273
|
db.exec("CREATE INDEX IF NOT EXISTS idx_sem_guardrail ON semantic_notes(is_guardrail) WHERE is_guardrail = 1 AND valid_to IS NULL");
|
|
269
|
-
stampVersion(
|
|
274
|
+
stampVersion(8); // migration 8 added is_guardrail
|
|
270
275
|
}
|
|
271
276
|
if (!semanticNoteCols.includes("pinned")) {
|
|
272
277
|
log.info("[memory] Self-heal: adding missing pinned column");
|
|
@@ -278,13 +283,13 @@ function ensureSchemaIntegrity(db) {
|
|
|
278
283
|
log.info("[memory] Self-heal: adding missing thread_id column to semantic_notes");
|
|
279
284
|
db.exec("ALTER TABLE semantic_notes ADD COLUMN thread_id INTEGER");
|
|
280
285
|
db.exec("CREATE INDEX IF NOT EXISTS idx_sem_thread ON semantic_notes(thread_id) WHERE valid_to IS NULL");
|
|
281
|
-
stampVersion(
|
|
286
|
+
stampVersion(4); // migration 4 added thread_id
|
|
282
287
|
}
|
|
283
288
|
if (!semanticNoteCols.includes("priority")) {
|
|
284
289
|
log.info("[memory] Self-heal: adding missing priority column to semantic_notes");
|
|
285
290
|
db.exec("ALTER TABLE semantic_notes ADD COLUMN priority INTEGER NOT NULL DEFAULT 0");
|
|
286
291
|
db.exec("CREATE INDEX IF NOT EXISTS idx_sem_priority ON semantic_notes(priority DESC) WHERE valid_to IS NULL");
|
|
287
|
-
stampVersion(
|
|
292
|
+
stampVersion(3); // migration 3 added priority
|
|
288
293
|
}
|
|
289
294
|
// Also check episodes table for thread_id
|
|
290
295
|
const episodeCols = db
|
|
@@ -320,6 +325,46 @@ function ensureSchemaIntegrity(db) {
|
|
|
320
325
|
`);
|
|
321
326
|
stampVersion(11);
|
|
322
327
|
}
|
|
328
|
+
const hasThreadRegistry = db
|
|
329
|
+
.prepare("SELECT COUNT(*) as cnt FROM sqlite_master WHERE type='table' AND name='thread_registry'")
|
|
330
|
+
.get();
|
|
331
|
+
if (hasThreadRegistry.cnt === 0) {
|
|
332
|
+
log.info("[memory] Self-heal: creating missing thread_registry table");
|
|
333
|
+
db.exec(`
|
|
334
|
+
CREATE TABLE IF NOT EXISTS thread_registry (
|
|
335
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
336
|
+
thread_id INTEGER NOT NULL UNIQUE,
|
|
337
|
+
name TEXT NOT NULL,
|
|
338
|
+
type TEXT NOT NULL CHECK(type IN ('root','daily','branch','worker')),
|
|
339
|
+
root_thread_id INTEGER,
|
|
340
|
+
badge TEXT NOT NULL DEFAULT 'root',
|
|
341
|
+
client TEXT DEFAULT 'claude',
|
|
342
|
+
max_retries INTEGER DEFAULT 5,
|
|
343
|
+
cooldown_ms INTEGER DEFAULT 300000,
|
|
344
|
+
keep_alive INTEGER DEFAULT 0,
|
|
345
|
+
created_at TEXT NOT NULL,
|
|
346
|
+
last_active_at TEXT,
|
|
347
|
+
session_reset_at TEXT,
|
|
348
|
+
status TEXT NOT NULL DEFAULT 'active' CHECK(status IN ('active','archived','expired'))
|
|
349
|
+
);
|
|
350
|
+
CREATE INDEX IF NOT EXISTS idx_thread_reg_type ON thread_registry(type);
|
|
351
|
+
CREATE INDEX IF NOT EXISTS idx_thread_reg_root ON thread_registry(root_thread_id);
|
|
352
|
+
CREATE INDEX IF NOT EXISTS idx_thread_reg_status ON thread_registry(status);
|
|
353
|
+
`);
|
|
354
|
+
stampVersion(12);
|
|
355
|
+
stampVersion(13);
|
|
356
|
+
}
|
|
357
|
+
else {
|
|
358
|
+
const threadRegistryCols = db
|
|
359
|
+
.prepare("PRAGMA table_info(thread_registry)")
|
|
360
|
+
.all()
|
|
361
|
+
.map((r) => r.name);
|
|
362
|
+
if (!threadRegistryCols.includes("session_reset_at")) {
|
|
363
|
+
log.info("[memory] Self-heal: adding missing session_reset_at column to thread_registry");
|
|
364
|
+
db.exec("ALTER TABLE thread_registry ADD COLUMN session_reset_at TEXT");
|
|
365
|
+
stampVersion(13);
|
|
366
|
+
}
|
|
367
|
+
}
|
|
323
368
|
}
|
|
324
369
|
const SCHEMA_SQL = `
|
|
325
370
|
CREATE TABLE IF NOT EXISTS episodes (
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../src/data/memory/schema.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../src/data/memory/schema.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"thread-registry.d.ts","sourceRoot":"","sources":["../../../src/data/memory/thread-registry.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAK5C,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,QAAQ,GAAG,QAAQ,CAAC;IAC7C,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,MAAM,EAAE,QAAQ,GAAG,UAAU,GAAG,SAAS,CAAC;CAC3C;AA2BD,wBAAgB,cAAc,CAC5B,EAAE,EAAE,QAAQ,EACZ,KAAK,EAAE;IACL,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,mBAAmB,CAAC,MAAM,CAAC,CAAC;IAClC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB,GACA,mBAAmB,
|
|
1
|
+
{"version":3,"file":"thread-registry.d.ts","sourceRoot":"","sources":["../../../src/data/memory/thread-registry.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAK5C,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,QAAQ,GAAG,QAAQ,CAAC;IAC7C,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,MAAM,EAAE,QAAQ,GAAG,UAAU,GAAG,SAAS,CAAC;CAC3C;AA2BD,wBAAgB,cAAc,CAC5B,EAAE,EAAE,QAAQ,EACZ,KAAK,EAAE;IACL,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,mBAAmB,CAAC,MAAM,CAAC,CAAC;IAClC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB,GACA,mBAAmB,CAyBrB;AAED,wBAAgB,SAAS,CAAC,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,GAAG,mBAAmB,GAAG,IAAI,CAKpF;AAED,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,mBAAmB,CAAC,MAAM,CAAC,GAAG,mBAAmB,EAAE,CAKvG;AAED,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,GAAG,mBAAmB,EAAE,CAK1F;AAED,wBAAgB,cAAc,CAAC,EAAE,EAAE,QAAQ,GAAG,mBAAmB,EAAE,CAKlE;AAED,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,QAAQ,GAAG,mBAAmB,EAAE,CAKpE;AAED,wBAAgB,YAAY,CAC1B,EAAE,EAAE,QAAQ,EACZ,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,mBAAmB,EAAE,MAAM,GAAG,QAAQ,GAAG,cAAc,GAAG,WAAW,GAAG,QAAQ,GAAG,YAAY,GAAG,YAAY,GAAG,OAAO,CAAC,CAAC,GAC/I,OAAO,CAoBT;AAED,wBAAgB,WAAW,CAAC,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAIhE;AAED,wBAAgB,aAAa,CAAC,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAKrE;AAED,wBAAgB,YAAY,CAAC,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAKpE;AAED,wBAAgB,cAAc,CAAC,EAAE,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,GAAG,mBAAmB,GAAG,IAAI,CAO7F;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAKzE;AAID,wBAAgB,sBAAsB,CAAC,EAAE,EAAE,QAAQ,EAAE,iBAAiB,EAAE,MAAM,EAAE,GAAG,IAAI,CAUtF"}
|
|
@@ -27,10 +27,14 @@ function rowToEntry(row) {
|
|
|
27
27
|
// ─── CRUD ────────────────────────────────────────────────────────────────────
|
|
28
28
|
export function registerThread(db, entry) {
|
|
29
29
|
const now = nowISO();
|
|
30
|
-
db.prepare(`INSERT INTO thread_registry
|
|
30
|
+
db.prepare(`INSERT OR IGNORE INTO thread_registry
|
|
31
31
|
(thread_id, name, type, root_thread_id, badge, client, max_retries, cooldown_ms, keep_alive, created_at, last_active_at, status)
|
|
32
32
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 'active')`).run(entry.threadId, entry.name, entry.type, entry.rootThreadId ?? null, entry.badge ?? 'root', entry.client ?? 'claude', entry.maxRetries ?? 5, entry.cooldownMs ?? 300000, entry.keepAlive ? 1 : 0, now, now);
|
|
33
|
-
|
|
33
|
+
const result = getThread(db, entry.threadId);
|
|
34
|
+
if (!result) {
|
|
35
|
+
throw new Error(`registerThread: failed to retrieve thread after insert (threadId=${entry.threadId})`);
|
|
36
|
+
}
|
|
37
|
+
return result;
|
|
34
38
|
}
|
|
35
39
|
export function getThread(db, threadId) {
|
|
36
40
|
const row = db.prepare(`SELECT * FROM thread_registry WHERE thread_id = ?`).get(threadId);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"thread-registry.js","sourceRoot":"","sources":["../../../src/data/memory/thread-registry.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAuBpC,gFAAgF;AAEhF,SAAS,UAAU,CAAC,GAA4B;IAC9C,OAAO;QACL,EAAE,EAAE,GAAG,CAAC,EAAY;QACpB,QAAQ,EAAE,GAAG,CAAC,SAAmB;QACjC,IAAI,EAAE,GAAG,CAAC,IAAc;QACxB,IAAI,EAAE,GAAG,CAAC,IAAmC;QAC7C,YAAY,EAAG,GAAG,CAAC,cAAgC,IAAI,IAAI;QAC3D,KAAK,EAAE,GAAG,CAAC,KAAe;QAC1B,MAAM,EAAE,GAAG,CAAC,MAAgB;QAC5B,UAAU,EAAE,GAAG,CAAC,WAAqB;QACrC,UAAU,EAAE,GAAG,CAAC,WAAqB;QACrC,SAAS,EAAE,CAAC,CAAE,GAAG,CAAC,UAAqB;QACvC,SAAS,EAAE,GAAG,CAAC,UAAoB;QACnC,YAAY,EAAG,GAAG,CAAC,cAAgC,IAAI,IAAI;QAC3D,cAAc,EAAG,GAAG,CAAC,gBAAkC,IAAI,IAAI;QAC/D,MAAM,EAAE,GAAG,CAAC,MAAuC;KACpD,CAAC;AACJ,CAAC;AAED,gFAAgF;AAEhF,MAAM,UAAU,cAAc,CAC5B,EAAY,EACZ,KAUC;IAED,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC;IACrB,EAAE,CAAC,OAAO,CACR;;wDAEoD,CACrD,CAAC,GAAG,CACH,KAAK,CAAC,QAAQ,EACd,KAAK,CAAC,IAAI,EACV,KAAK,CAAC,IAAI,EACV,KAAK,CAAC,YAAY,IAAI,IAAI,EAC1B,KAAK,CAAC,KAAK,IAAI,MAAM,EACrB,KAAK,CAAC,MAAM,IAAI,QAAQ,EACxB,KAAK,CAAC,UAAU,IAAI,CAAC,EACrB,KAAK,CAAC,UAAU,IAAI,MAAM,EAC1B,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EACvB,GAAG,EACH,GAAG,CACJ,CAAC;IAEF,
|
|
1
|
+
{"version":3,"file":"thread-registry.js","sourceRoot":"","sources":["../../../src/data/memory/thread-registry.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -32,6 +32,8 @@ else {
|
|
|
32
32
|
const { setTopicRegistryDb, lookupTopicRegistry } = await import("./sessions.js");
|
|
33
33
|
const { initVideoTempCleanup } = await import("./integrations/openai/video.js");
|
|
34
34
|
const { cleanupStalePidFiles } = await import("./tools/thread-lifecycle.js");
|
|
35
|
+
const { log } = await import("./logger.js");
|
|
36
|
+
const { rotateAllDailySessions } = await import("./daily-session.js");
|
|
35
37
|
// ---------------------------------------------------------------------------
|
|
36
38
|
// Shared singletons
|
|
37
39
|
// ---------------------------------------------------------------------------
|
|
@@ -79,6 +81,33 @@ else {
|
|
|
79
81
|
memoryDb = null;
|
|
80
82
|
}
|
|
81
83
|
}
|
|
84
|
+
// ---------------------------------------------------------------------------
|
|
85
|
+
// Daily session rotation timer (runs in the MCP server process which has
|
|
86
|
+
// all env vars — OpenAI, Telegram, etc.)
|
|
87
|
+
// ---------------------------------------------------------------------------
|
|
88
|
+
const DAILY_ROTATION_HOUR = 4;
|
|
89
|
+
function startDailyRotationTimer() {
|
|
90
|
+
setInterval(async () => {
|
|
91
|
+
const now = new Date();
|
|
92
|
+
if (now.getHours() !== DAILY_ROTATION_HOUR || now.getMinutes() >= 5)
|
|
93
|
+
return;
|
|
94
|
+
try {
|
|
95
|
+
log.info("Starting daily session rotation...");
|
|
96
|
+
const results = await rotateAllDailySessions();
|
|
97
|
+
for (const r of results) {
|
|
98
|
+
if (r.error) {
|
|
99
|
+
log.error(`Daily rotation failed for root ${r.rootThreadId}: ${r.error}`);
|
|
100
|
+
}
|
|
101
|
+
else {
|
|
102
|
+
log.info(`Daily rotation complete for root ${r.rootThreadId}`);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
catch (err) {
|
|
107
|
+
log.error(`Daily rotation error: ${err instanceof Error ? err.message : String(err)}`);
|
|
108
|
+
}
|
|
109
|
+
}, 5 * 60_000);
|
|
110
|
+
}
|
|
82
111
|
const httpPort = process.env.MCP_HTTP_PORT ? parseInt(process.env.MCP_HTTP_PORT, 10) : undefined;
|
|
83
112
|
if (httpPort) {
|
|
84
113
|
startHttpServer(createMcpServer, getMemoryDb, closeMemoryDb);
|
|
@@ -86,6 +115,8 @@ else {
|
|
|
86
115
|
else {
|
|
87
116
|
await startStdioServer(createMcpServer, closeMemoryDb);
|
|
88
117
|
}
|
|
118
|
+
// Start daily rotation timer after server is listening
|
|
119
|
+
startDailyRotationTimer();
|
|
89
120
|
}
|
|
90
121
|
export {};
|
|
91
122
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;;;GAMG;AAEH,OAAO,CAAC,EAAE,CAAC,mBAAmB,EAAE,CAAC,GAAG,EAAE,EAAE;IACtC,OAAO,CAAC,KAAK,CAAC,+BAA+B,GAAG,CAAC,KAAK,IAAI,GAAG,EAAE,CAAC,CAAC;IACjE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC;AACH,OAAO,CAAC,EAAE,CAAC,oBAAoB,EAAE,CAAC,MAAM,EAAE,EAAE;IAC1C,OAAO,CAAC,KAAK,CAAC,gCAAgC,MAAM,YAAY,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;IACjG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC;AAEH,oFAAoF;AACpF,2EAA2E;AAC3E,IAAI,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;IACvC,MAAM,EAAE,mBAAmB,EAAE,GAAG,MAAM,MAAM,CAAC,sBAAsB,CAAC,CAAC;IACrE,MAAM,mBAAmB,EAAE,CAAC;AAC9B,CAAC;KAAM,CAAC;IAER,8EAA8E;IAE9E,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC;IAC/C,MAAM,EAAE,eAAe,EAAE,WAAW,EAAE,GAAG,MAAM,MAAM,CAAC,iBAAiB,CAAC,CAAC;IACzE,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC;IACrD,MAAM,EAAE,cAAc,EAAE,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,CAAC;IACzD,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAC;IAC7D,MAAM,EAAE,gBAAgB,EAAE,GAAG,MAAM,MAAM,CAAC,mBAAmB,CAAC,CAAC;IAC/D,MAAM,EAAE,qBAAqB,EAAE,GAAG,MAAM,MAAM,CAAC,qBAAqB,CAAC,CAAC;IACtE,MAAM,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,CAAC;IAClF,MAAM,EAAE,oBAAoB,EAAE,GAAG,MAAM,MAAM,CAAC,gCAAgC,CAAC,CAAC;IAChF,MAAM,EAAE,oBAAoB,EAAE,GAAG,MAAM,MAAM,CAAC,6BAA6B,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"watcher-service.d.ts","sourceRoot":"","sources":["../src/watcher-service.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"watcher-service.d.ts","sourceRoot":"","sources":["../src/watcher-service.ts"],"names":[],"mappings":"AAksBA,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC,CAiBzD"}
|
package/dist/watcher-service.js
CHANGED
|
@@ -9,7 +9,6 @@ import { Server } from "@modelcontextprotocol/sdk/server/index.js";
|
|
|
9
9
|
import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js";
|
|
10
10
|
import { CallToolRequestSchema, isInitializeRequest, ListToolsRequestSchema } from "@modelcontextprotocol/sdk/types.js";
|
|
11
11
|
import { startClaudeKeeper } from "./claude-keeper.js";
|
|
12
|
-
import { rotateAllDailySessions } from "./daily-session.js";
|
|
13
12
|
process.on("uncaughtException", (err) => {
|
|
14
13
|
console.error(`[fatal] Uncaught exception: ${err.stack ?? err}`);
|
|
15
14
|
process.exit(1);
|
|
@@ -326,150 +325,30 @@ function parsePidFile(filePath) {
|
|
|
326
325
|
}
|
|
327
326
|
}
|
|
328
327
|
/**
|
|
329
|
-
*
|
|
330
|
-
* Only returns threads whose processes are currently alive AND were started
|
|
331
|
-
* recently (within 24h). Stale PID files from old sessions are cleaned up.
|
|
328
|
+
* Clean up PID files for dead processes.
|
|
332
329
|
*/
|
|
333
330
|
function readGhostThreads() {
|
|
334
331
|
const pidsDir = join(CONFIG.dataDir, "pids");
|
|
335
|
-
// Read session store for name lookups (reverse map: threadId → name)
|
|
336
|
-
const sessionStorePath = join(homedir(), ".remote-copilot-mcp-sessions.json");
|
|
337
|
-
const threadNames = new Map();
|
|
338
|
-
try {
|
|
339
|
-
const sessions = JSON.parse(readFileSync(sessionStorePath, "utf-8"));
|
|
340
|
-
for (const chatTopics of Object.values(sessions)) {
|
|
341
|
-
for (const [name, tid] of Object.entries(chatTopics)) {
|
|
342
|
-
threadNames.set(tid, name);
|
|
343
|
-
}
|
|
344
|
-
}
|
|
345
|
-
}
|
|
346
|
-
catch { /* no sessions file */ }
|
|
347
|
-
// Collect threads from keep-alive config as the authoritative set of
|
|
348
|
-
// threads that SHOULD be respawned. Ghost threads spawned ad-hoc by
|
|
349
|
-
// agents will NOT be respawned — only keeper-managed threads survive.
|
|
350
|
-
const keepAliveThreadIds = new Set();
|
|
351
|
-
try {
|
|
352
|
-
const allSettings = readAllKeeperSettings();
|
|
353
|
-
for (const s of allSettings) {
|
|
354
|
-
if (s.enabled && s.threadId > 0)
|
|
355
|
-
keepAliveThreadIds.add(s.threadId);
|
|
356
|
-
}
|
|
357
|
-
}
|
|
358
|
-
catch { /* best effort */ }
|
|
359
|
-
const threads = [];
|
|
360
|
-
const STALE_CUTOFF_MS = 24 * 60 * 60 * 1000; // 24 hours
|
|
361
332
|
try {
|
|
362
333
|
for (const file of readdirSync(pidsDir)) {
|
|
363
334
|
if (!file.endsWith(".pid"))
|
|
364
335
|
continue;
|
|
365
|
-
const threadId = Number(file.replace(".pid", ""));
|
|
366
|
-
if (!Number.isFinite(threadId))
|
|
367
|
-
continue;
|
|
368
336
|
const fullPath = join(pidsDir, file);
|
|
369
337
|
const parsed = parsePidFile(fullPath);
|
|
370
|
-
// Clean up PID files for dead processes
|
|
371
338
|
if (!parsed || !alive(parsed.pid)) {
|
|
372
339
|
try {
|
|
373
340
|
unlinkSync(fullPath);
|
|
374
341
|
}
|
|
375
342
|
catch { /* ignore */ }
|
|
376
|
-
continue;
|
|
377
|
-
}
|
|
378
|
-
// Only respawn threads that are in the keep-alive config
|
|
379
|
-
if (!keepAliveThreadIds.has(threadId)) {
|
|
380
|
-
log("INFO", `Skipping ghost thread ${threadId} — not in keep-alive config`);
|
|
381
|
-
continue;
|
|
382
343
|
}
|
|
383
|
-
threads.push({
|
|
384
|
-
threadId,
|
|
385
|
-
name: parsed.name ?? threadNames.get(threadId) ?? `thread-${threadId}`,
|
|
386
|
-
});
|
|
387
344
|
}
|
|
388
345
|
}
|
|
389
346
|
catch { /* pids dir may not exist */ }
|
|
390
|
-
return threads;
|
|
391
347
|
}
|
|
392
|
-
/**
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
*/
|
|
397
|
-
async function respawnGhostThreads(threads) {
|
|
398
|
-
if (threads.length === 0)
|
|
399
|
-
return;
|
|
400
|
-
// Resolve base MCP config (same candidates as thread-lifecycle.ts)
|
|
401
|
-
const candidates = [
|
|
402
|
-
process.env.CLAUDE_MCP_CONFIG,
|
|
403
|
-
join(homedir(), ".claude", "settings.json"),
|
|
404
|
-
join(homedir(), ".claude", "mcp_config.json"),
|
|
405
|
-
join(homedir(), ".claude", ".mcp.json"),
|
|
406
|
-
].filter(Boolean);
|
|
407
|
-
const baseConfigPath = candidates.find((p) => existsSync(p));
|
|
408
|
-
if (!baseConfigPath) {
|
|
409
|
-
log("WARN", "Cannot re-spawn ghost threads: no MCP config found");
|
|
410
|
-
return;
|
|
411
|
-
}
|
|
412
|
-
// Generate a merged config that includes sensorium-watcher
|
|
413
|
-
const mergedConfigPath = join(CONFIG.dataDir, "ghost-respawn-mcp-config.json");
|
|
414
|
-
try {
|
|
415
|
-
const raw = readFileSync(baseConfigPath, "utf-8");
|
|
416
|
-
const config = JSON.parse(raw);
|
|
417
|
-
const servers = (config.mcpServers ?? {});
|
|
418
|
-
if (!servers["sensorium-watcher"]) {
|
|
419
|
-
servers["sensorium-watcher"] = {
|
|
420
|
-
type: "http",
|
|
421
|
-
url: `http://127.0.0.1:${CONFIG.httpPort}/mcp`,
|
|
422
|
-
};
|
|
423
|
-
config.mcpServers = servers;
|
|
424
|
-
}
|
|
425
|
-
writeFileSync(mergedConfigPath, JSON.stringify(config, null, 2), "utf-8");
|
|
426
|
-
}
|
|
427
|
-
catch (err) {
|
|
428
|
-
log("WARN", `Failed to generate merged MCP config for re-spawn: ${err}`);
|
|
429
|
-
return;
|
|
430
|
-
}
|
|
431
|
-
const claudeCmd = CONFIG.claudeCmd;
|
|
432
|
-
const useShell = process.platform === "win32";
|
|
433
|
-
const logsDir = join(CONFIG.dataDir, "logs");
|
|
434
|
-
const pidsDir = join(CONFIG.dataDir, "pids");
|
|
435
|
-
mkdirSync(logsDir, { recursive: true });
|
|
436
|
-
mkdirSync(pidsDir, { recursive: true });
|
|
437
|
-
for (const thread of threads) {
|
|
438
|
-
// Skip threads managed by a keeper — the keeper handles its own restart
|
|
439
|
-
if (keepers.has(thread.threadId))
|
|
440
|
-
continue;
|
|
441
|
-
log("INFO", `Re-spawning ghost thread ${thread.threadId} ("${thread.name}")`);
|
|
442
|
-
const dateStr = new Date().toISOString().slice(0, 10);
|
|
443
|
-
const safeName = thread.name.replaceAll(/[^a-zA-Z0-9_-]/g, "_");
|
|
444
|
-
const logFile = join(logsDir, `${safeName}_${thread.threadId}_${dateStr}.json`);
|
|
445
|
-
const prompt = `Start remote session with sensorium. Thread name = '${thread.name}'`;
|
|
446
|
-
try {
|
|
447
|
-
const logFd = openSync(logFile, "a");
|
|
448
|
-
const child = spawn(claudeCmd, [
|
|
449
|
-
"--verbose",
|
|
450
|
-
"--dangerously-skip-permissions",
|
|
451
|
-
"--mcp-config", mergedConfigPath,
|
|
452
|
-
"-p", prompt,
|
|
453
|
-
"--output-format", "stream-json",
|
|
454
|
-
"--include-partial-messages",
|
|
455
|
-
], {
|
|
456
|
-
detached: true,
|
|
457
|
-
stdio: ["ignore", logFd, logFd],
|
|
458
|
-
shell: useShell,
|
|
459
|
-
windowsHide: true,
|
|
460
|
-
});
|
|
461
|
-
closeSync(logFd);
|
|
462
|
-
if (child.pid) {
|
|
463
|
-
const pidFile = join(pidsDir, `${thread.threadId}.pid`);
|
|
464
|
-
writeFileSync(pidFile, JSON.stringify({ pid: child.pid, name: thread.name, startedAt: Date.now() }), "utf-8");
|
|
465
|
-
child.unref();
|
|
466
|
-
log("INFO", `Re-spawned ghost thread ${thread.threadId} (PID ${child.pid})`);
|
|
467
|
-
}
|
|
468
|
-
}
|
|
469
|
-
catch (err) {
|
|
470
|
-
log("ERROR", `Failed to re-spawn ghost thread ${thread.threadId}: ${err}`);
|
|
471
|
-
}
|
|
472
|
-
}
|
|
348
|
+
/** @deprecated Keeper system handles restarts — retained as no-op. */
|
|
349
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
350
|
+
async function respawnGhostThreads(_threads) {
|
|
351
|
+
// No-op: keepers handle their own restart via scheduleRestart() and applyKeeperSettings().
|
|
473
352
|
}
|
|
474
353
|
async function getRemoteVersion() {
|
|
475
354
|
try {
|
|
@@ -526,14 +405,8 @@ async function checkAndUpdate() {
|
|
|
526
405
|
writeMaintenanceFlag(remote);
|
|
527
406
|
log("INFO", `Grace period ${CONFIG.gracePeriodSeconds}s...`);
|
|
528
407
|
await sleep(CONFIG.gracePeriodSeconds * 1000);
|
|
529
|
-
//
|
|
530
|
-
|
|
531
|
-
// so we need to re-spawn them after the update.
|
|
532
|
-
const ghostThreads = readGhostThreads();
|
|
533
|
-
if (ghostThreads.length > 0) {
|
|
534
|
-
const desc = ghostThreads.map(t => String(t.threadId) + '("' + t.name + '")').join(", ");
|
|
535
|
-
log("INFO", `Saved ${ghostThreads.length} ghost thread(s) for re-spawn after update: ${desc}`);
|
|
536
|
-
}
|
|
408
|
+
// Clean up stale PID files before killing the server
|
|
409
|
+
readGhostThreads();
|
|
537
410
|
await stopMcpServer();
|
|
538
411
|
clearNpxCache();
|
|
539
412
|
setLocalVersion(remote);
|
|
@@ -542,12 +415,9 @@ async function checkAndUpdate() {
|
|
|
542
415
|
await waitForServerReady();
|
|
543
416
|
await killStale();
|
|
544
417
|
removeMaintenanceFlag();
|
|
545
|
-
//
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
await respawnGhostThreads(ghostThreads);
|
|
549
|
-
}
|
|
550
|
-
await notifyOperator(`\u2705 Watcher: update to v${remote} complete. Server ready.` + (ghostThreads.length > 0 ? ` Re-spawned ${ghostThreads.length} ghost thread(s).` : ""));
|
|
418
|
+
// Keepers detect their agents died and restart them naturally
|
|
419
|
+
// via scheduleRestart() and the applyKeeperSettings() poller.
|
|
420
|
+
await notifyOperator(`\u2705 Watcher: update to v${remote} complete. Server ready.`);
|
|
551
421
|
log("INFO", `Update to v${remote} complete.`);
|
|
552
422
|
}
|
|
553
423
|
finally {
|
|
@@ -557,7 +427,7 @@ async function checkAndUpdate() {
|
|
|
557
427
|
// Claude CLI keeper -----------------------------------------------------------
|
|
558
428
|
const SETTINGS_JSON_PATH = join(CONFIG.dataDir, "settings.json");
|
|
559
429
|
const KEEPER_SETTINGS_POLL_MS = 2 * 60_000;
|
|
560
|
-
function
|
|
430
|
+
function readKeeperSettingsFromFile() {
|
|
561
431
|
const raw = safeRead(SETTINGS_JSON_PATH);
|
|
562
432
|
const s = raw
|
|
563
433
|
? (() => { try {
|
|
@@ -617,6 +487,40 @@ function readAllKeeperSettings() {
|
|
|
617
487
|
}
|
|
618
488
|
return results;
|
|
619
489
|
}
|
|
490
|
+
/**
|
|
491
|
+
* Read keeper settings from the MCP server's thread_registry via HTTP API.
|
|
492
|
+
* Falls back to settings.json if the server is not ready (e.g. during startup).
|
|
493
|
+
*/
|
|
494
|
+
async function readAllKeeperSettings() {
|
|
495
|
+
// Try HTTP-based registry first
|
|
496
|
+
const port = CONFIG.mcpHttpPort || 3847;
|
|
497
|
+
try {
|
|
498
|
+
const res = await fetch(`http://127.0.0.1:${port}/api/threads/roots`, {
|
|
499
|
+
headers: CONFIG.mcpHttpSecret ? { 'Authorization': `Bearer ${CONFIG.mcpHttpSecret}` } : {},
|
|
500
|
+
signal: AbortSignal.timeout(5_000),
|
|
501
|
+
});
|
|
502
|
+
if (res.ok) {
|
|
503
|
+
const body = (await res.json());
|
|
504
|
+
const roots = body.threads ?? [];
|
|
505
|
+
return roots
|
|
506
|
+
.filter((r) => r.keepAlive)
|
|
507
|
+
.filter((r) => typeof r.threadId === 'number' && Number.isFinite(r.threadId) && r.threadId > 0 && r.threadId === Math.floor(r.threadId))
|
|
508
|
+
.map((r) => ({
|
|
509
|
+
enabled: true,
|
|
510
|
+
threadId: r.threadId,
|
|
511
|
+
maxRetries: (typeof r.maxRetries === 'number' ? r.maxRetries : null) ?? 5,
|
|
512
|
+
cooldownMs: (typeof r.cooldownMs === 'number' ? r.cooldownMs : null) ?? 300_000,
|
|
513
|
+
client: r.client === 'copilot' ? 'copilot' : 'claude',
|
|
514
|
+
sessionName: (typeof r.name === 'string' ? r.name : null) ?? `thread-${r.threadId}`,
|
|
515
|
+
}));
|
|
516
|
+
}
|
|
517
|
+
}
|
|
518
|
+
catch {
|
|
519
|
+
// Server not ready — fall back to settings.json
|
|
520
|
+
}
|
|
521
|
+
// Fallback: read from settings.json (legacy, for startup before server is ready)
|
|
522
|
+
return readKeeperSettingsFromFile();
|
|
523
|
+
}
|
|
620
524
|
function keeperSettingsChanged(a, b) {
|
|
621
525
|
return a.maxRetries !== b.maxRetries || a.cooldownMs !== b.cooldownMs || a.client !== b.client;
|
|
622
526
|
}
|
|
@@ -628,7 +532,7 @@ async function applyKeeperSettings() {
|
|
|
628
532
|
try {
|
|
629
533
|
if (CONFIG.mcpHttpPort <= 0)
|
|
630
534
|
return;
|
|
631
|
-
const allSettings = readAllKeeperSettings();
|
|
535
|
+
const allSettings = await readAllKeeperSettings();
|
|
632
536
|
const desiredThreadIds = new Set(allSettings.map(s => s.threadId));
|
|
633
537
|
// Stop keepers for threads that are no longer configured
|
|
634
538
|
for (const [tid, entry] of keepers) {
|
|
@@ -680,42 +584,6 @@ function startKeeperPoller() {
|
|
|
680
584
|
void applyKeeperSettings().catch((err) => log("ERROR", `Keeper settings poll failed: ${err}`));
|
|
681
585
|
}, KEEPER_SETTINGS_POLL_MS);
|
|
682
586
|
}
|
|
683
|
-
const DAILY_ROTATION_HOUR = 4; // 4 AM local time
|
|
684
|
-
function startDailyRotationTimer() {
|
|
685
|
-
// Check every 5 minutes if it's time for daily rotation
|
|
686
|
-
setInterval(async () => {
|
|
687
|
-
const now = new Date();
|
|
688
|
-
// Only trigger at the rotation hour (first 5-minute window)
|
|
689
|
-
if (now.getHours() !== DAILY_ROTATION_HOUR || now.getMinutes() >= 5)
|
|
690
|
-
return;
|
|
691
|
-
try {
|
|
692
|
-
log("INFO", "Starting daily session rotation...");
|
|
693
|
-
const results = await rotateAllDailySessions();
|
|
694
|
-
for (const result of results) {
|
|
695
|
-
if (result.error) {
|
|
696
|
-
log("WARN", `Daily rotation failed for root ${result.rootThreadId}: ${result.error}`);
|
|
697
|
-
continue;
|
|
698
|
-
}
|
|
699
|
-
log("INFO", `Daily rotation complete for root ${result.rootThreadId}: consolidated=${result.consolidated}`);
|
|
700
|
-
// Restart the keeper for this root thread to get fresh LLM context
|
|
701
|
-
const entry = keepers.get(result.rootThreadId);
|
|
702
|
-
if (entry) {
|
|
703
|
-
log("INFO", `Restarting keeper for root ${result.rootThreadId} after daily rotation`);
|
|
704
|
-
await entry.handle.stop();
|
|
705
|
-
keepers.delete(result.rootThreadId);
|
|
706
|
-
// applyKeeperSettings will restart it on the next poll cycle (within 2 min)
|
|
707
|
-
}
|
|
708
|
-
}
|
|
709
|
-
if (results.length > 0) {
|
|
710
|
-
// Force immediate keeper re-apply to restart stopped keepers
|
|
711
|
-
await applyKeeperSettings();
|
|
712
|
-
}
|
|
713
|
-
}
|
|
714
|
-
catch (err) {
|
|
715
|
-
log("ERROR", `Daily rotation error: ${err instanceof Error ? err.message : String(err)}`);
|
|
716
|
-
}
|
|
717
|
-
}, 5 * 60_000); // Check every 5 minutes
|
|
718
|
-
}
|
|
719
587
|
// Main loop -------------------------------------------------------------------
|
|
720
588
|
async function runLoop() {
|
|
721
589
|
log("INFO", `Watcher starting in ${CONFIG.mode} mode.`);
|
|
@@ -734,7 +602,6 @@ async function runLoop() {
|
|
|
734
602
|
startMcpServer();
|
|
735
603
|
void applyKeeperSettings().catch((err) => log("ERROR", `Keeper failed to start: ${err}`));
|
|
736
604
|
startKeeperPoller();
|
|
737
|
-
startDailyRotationTimer();
|
|
738
605
|
if (CONFIG.mode === "production") {
|
|
739
606
|
while (true) {
|
|
740
607
|
const ms = msUntilHour(CONFIG.pollAtHour);
|