spect8-mcp 0.1.3 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli.js
CHANGED
|
@@ -63,12 +63,13 @@ function enforceCopilot(targetDir) {
|
|
|
63
63
|
}
|
|
64
64
|
}
|
|
65
65
|
}
|
|
66
|
-
function setupGlobalMcpConfig(apiKey, ingestUrl) {
|
|
66
|
+
function setupGlobalMcpConfig(apiKey, devId, ingestUrl) {
|
|
67
67
|
const mcpConfigDir = join(homedir(), ".spect8");
|
|
68
68
|
mkdirSync(mcpConfigDir, { recursive: true });
|
|
69
69
|
const configPath = join(mcpConfigDir, "config.json");
|
|
70
70
|
const config = {
|
|
71
|
-
|
|
71
|
+
ingest_hmac_key: apiKey || "PASTE_YOUR_KEY_HERE",
|
|
72
|
+
developer_id: devId || "your-email@example.com",
|
|
72
73
|
ingest_url: ingestUrl || "https://spect8-production.up.railway.app",
|
|
73
74
|
ide_name: "auto"
|
|
74
75
|
};
|
|
@@ -103,8 +104,9 @@ function main() {
|
|
|
103
104
|
const url = new URL(req.url || "", `http://localhost:${PORT}`);
|
|
104
105
|
if (url.pathname === "/callback") {
|
|
105
106
|
const key = url.searchParams.get("key");
|
|
107
|
+
const devId = url.searchParams.get("developerId");
|
|
106
108
|
if (key) {
|
|
107
|
-
setupGlobalMcpConfig(key);
|
|
109
|
+
setupGlobalMcpConfig(key, devId || undefined);
|
|
108
110
|
// Redirect back to the website success page
|
|
109
111
|
res.writeHead(302, { 'Location': 'https://www.spect8ai.tech/dashboard' });
|
|
110
112
|
res.end();
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AACxE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAC7B,OAAO,EAAE,YAAY,EAAE,MAAM,MAAM,CAAC;AACpC,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AACrC,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAE1B,MAAM,aAAa,GAAG;;;;;;;;;;;CAWrB,CAAC;AAEF,SAAS,GAAG,CAAC,GAAW;IACtB,OAAO,CAAC,GAAG,CAAC,YAAY,GAAG,EAAE,CAAC,CAAC;AACjC,CAAC;AAED,SAAS,aAAa,CAAC,SAAiB;IACtC,MAAM,eAAe,GAAG,IAAI,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;IACxD,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;QACjC,aAAa,CAAC,eAAe,EAAE,aAAa,CAAC,CAAC;QAC9C,GAAG,CAAC,wBAAwB,CAAC,CAAC;IAChC,CAAC;SAAM,CAAC;QACN,MAAM,OAAO,GAAG,YAAY,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC;QACvD,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YAChC,aAAa,CAAC,eAAe,EAAE,OAAO,GAAG,MAAM,GAAG,aAAa,CAAC,CAAC;YACjE,GAAG,CAAC,yCAAyC,CAAC,CAAC;QACjD,CAAC;aAAM,CAAC;YACN,GAAG,CAAC,8CAA8C,CAAC,CAAC;QACtD,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,WAAW,CAAC,SAAiB;IACpC,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;IACrD,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACxC,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;IAC5C,aAAa,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;IACvC,GAAG,CAAC,oCAAoC,CAAC,CAAC;AAC5C,CAAC;AAED,SAAS,cAAc,CAAC,SAAiB;IACvC,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IAC9C,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3C,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,EAAE,yBAAyB,CAAC,CAAC;IAEhE,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC7B,aAAa,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;QAC1C,GAAG,CAAC,2CAA2C,CAAC,CAAC;IACnD,CAAC;SAAM,CAAC;QACN,MAAM,OAAO,GAAG,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QACnD,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YAChC,aAAa,CAAC,WAAW,EAAE,OAAO,GAAG,MAAM,GAAG,aAAa,CAAC,CAAC;YAC7D,GAAG,CAAC,oDAAoD,CAAC,CAAC;QAC5D,CAAC;aAAM,CAAC;YACN,GAAG,CAAC,yDAAyD,CAAC,CAAC;QACjE,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,oBAAoB,CAAC,MAAe,EAAE,SAAkB;IAC/
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,18 +8,18 @@ export interface QueuedRow {
|
|
|
8
8
|
attempts: number;
|
|
9
9
|
}
|
|
10
10
|
/**
|
|
11
|
-
* Durable,
|
|
12
|
-
* unreachable so no captured event is lost
|
|
13
|
-
*
|
|
14
|
-
* Rows are keyed by auto-incremented id to preserve ordering; `dequeue()`
|
|
15
|
-
* returns the oldest unsent rows and callers call `ack()` after a successful
|
|
16
|
-
* POST. On retry storms we also track `attempts` so pathological rows can be
|
|
17
|
-
* drained manually by an operator.
|
|
11
|
+
* Durable, pure-JS FIFO buffer. Used when the ingest endpoint is
|
|
12
|
+
* unreachable so no captured event is lost. Backed by a simple JSON file
|
|
13
|
+
* to avoid native dependencies like SQLite which break on Windows/Node 24.
|
|
18
14
|
*/
|
|
19
15
|
export declare class OfflineQueue {
|
|
16
|
+
private readonly dbPath;
|
|
20
17
|
private readonly logger;
|
|
21
|
-
private
|
|
18
|
+
private rows;
|
|
19
|
+
private nextId;
|
|
22
20
|
constructor(dbPath: string, logger: Logger);
|
|
21
|
+
private load;
|
|
22
|
+
private save;
|
|
23
23
|
enqueueMany(kind: QueueKind, payloads: string[]): void;
|
|
24
24
|
dequeue(kind: QueueKind, limit: number): QueuedRow[];
|
|
25
25
|
ack(ids: number[]): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"offline_queue.d.ts","sourceRoot":"","sources":["../../src/transport/offline_queue.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"offline_queue.d.ts","sourceRoot":"","sources":["../../src/transport/offline_queue.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAE3C,MAAM,MAAM,SAAS,GAAG,OAAO,GAAG,aAAa,CAAC;AAEhD,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,SAAS,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;;GAIG;AACH,qBAAa,YAAY;IAIX,OAAO,CAAC,QAAQ,CAAC,MAAM;IAAU,OAAO,CAAC,QAAQ,CAAC,MAAM;IAHpE,OAAO,CAAC,IAAI,CAAmB;IAC/B,OAAO,CAAC,MAAM,CAAa;gBAEE,MAAM,EAAE,MAAM,EAAmB,MAAM,EAAE,MAAM;IAI5E,OAAO,CAAC,IAAI;IAqBZ,OAAO,CAAC,IAAI;IAYZ,WAAW,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,IAAI;IAetD,OAAO,CAAC,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,GAAG,SAAS,EAAE;IAMpD,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,IAAI;IAOxB,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,IAAI;IAWzB,IAAI,IAAI,MAAM;IAId,KAAK,IAAI,IAAI;CAGd"}
|
|
@@ -1,83 +1,95 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { readFileSync, writeFileSync, mkdirSync, existsSync } from "node:fs";
|
|
2
2
|
import { dirname } from "node:path";
|
|
3
|
-
import { mkdirSync, existsSync } from "node:fs";
|
|
4
3
|
/**
|
|
5
|
-
* Durable,
|
|
6
|
-
* unreachable so no captured event is lost
|
|
7
|
-
*
|
|
8
|
-
* Rows are keyed by auto-incremented id to preserve ordering; `dequeue()`
|
|
9
|
-
* returns the oldest unsent rows and callers call `ack()` after a successful
|
|
10
|
-
* POST. On retry storms we also track `attempts` so pathological rows can be
|
|
11
|
-
* drained manually by an operator.
|
|
4
|
+
* Durable, pure-JS FIFO buffer. Used when the ingest endpoint is
|
|
5
|
+
* unreachable so no captured event is lost. Backed by a simple JSON file
|
|
6
|
+
* to avoid native dependencies like SQLite which break on Windows/Node 24.
|
|
12
7
|
*/
|
|
13
8
|
export class OfflineQueue {
|
|
9
|
+
dbPath;
|
|
14
10
|
logger;
|
|
15
|
-
|
|
11
|
+
rows = [];
|
|
12
|
+
nextId = 1;
|
|
16
13
|
constructor(dbPath, logger) {
|
|
14
|
+
this.dbPath = dbPath;
|
|
17
15
|
this.logger = logger;
|
|
18
|
-
|
|
19
|
-
|
|
16
|
+
this.load();
|
|
17
|
+
}
|
|
18
|
+
load() {
|
|
19
|
+
if (!existsSync(this.dbPath)) {
|
|
20
|
+
if (!existsSync(dirname(this.dbPath))) {
|
|
21
|
+
mkdirSync(dirname(this.dbPath), { recursive: true });
|
|
22
|
+
}
|
|
23
|
+
this.save();
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
try {
|
|
27
|
+
const raw = readFileSync(this.dbPath, "utf8");
|
|
28
|
+
const data = JSON.parse(raw);
|
|
29
|
+
this.rows = data.rows || [];
|
|
30
|
+
this.nextId = data.nextId || 1;
|
|
31
|
+
}
|
|
32
|
+
catch (err) {
|
|
33
|
+
this.logger.error("Failed to load offline queue", err.message);
|
|
34
|
+
this.rows = [];
|
|
35
|
+
this.nextId = 1;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
save() {
|
|
39
|
+
try {
|
|
40
|
+
const data = {
|
|
41
|
+
rows: this.rows,
|
|
42
|
+
nextId: this.nextId
|
|
43
|
+
};
|
|
44
|
+
writeFileSync(this.dbPath, JSON.stringify(data, null, 2), "utf8");
|
|
45
|
+
}
|
|
46
|
+
catch (err) {
|
|
47
|
+
this.logger.error("Failed to save offline queue", err.message);
|
|
20
48
|
}
|
|
21
|
-
this.db = new Database(dbPath);
|
|
22
|
-
this.db.pragma("journal_mode = WAL");
|
|
23
|
-
this.db.pragma("synchronous = NORMAL");
|
|
24
|
-
this.db.exec(`
|
|
25
|
-
CREATE TABLE IF NOT EXISTS spect8_queue (
|
|
26
|
-
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
27
|
-
kind TEXT NOT NULL,
|
|
28
|
-
payload TEXT NOT NULL,
|
|
29
|
-
created_at_ms INTEGER NOT NULL,
|
|
30
|
-
attempts INTEGER NOT NULL DEFAULT 0
|
|
31
|
-
);
|
|
32
|
-
CREATE INDEX IF NOT EXISTS ix_spect8_queue_kind ON spect8_queue(kind, id);
|
|
33
|
-
`);
|
|
34
49
|
}
|
|
35
50
|
enqueueMany(kind, payloads) {
|
|
36
51
|
if (payloads.length === 0)
|
|
37
52
|
return;
|
|
38
|
-
const stmt = this.db.prepare("INSERT INTO spect8_queue(kind, payload, created_at_ms) VALUES (?, ?, ?)");
|
|
39
53
|
const now = Date.now();
|
|
40
|
-
const
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
this.logger.error("offline queue enqueue failed", err.message);
|
|
54
|
+
for (const p of payloads) {
|
|
55
|
+
this.rows.push({
|
|
56
|
+
id: this.nextId++,
|
|
57
|
+
kind,
|
|
58
|
+
payload: p,
|
|
59
|
+
created_at_ms: now,
|
|
60
|
+
attempts: 0
|
|
61
|
+
});
|
|
49
62
|
}
|
|
63
|
+
this.save();
|
|
50
64
|
}
|
|
51
65
|
dequeue(kind, limit) {
|
|
52
|
-
|
|
53
|
-
.
|
|
54
|
-
.
|
|
55
|
-
return rows;
|
|
66
|
+
return this.rows
|
|
67
|
+
.filter(r => r.kind === kind)
|
|
68
|
+
.slice(0, limit);
|
|
56
69
|
}
|
|
57
70
|
ack(ids) {
|
|
58
71
|
if (ids.length === 0)
|
|
59
72
|
return;
|
|
60
|
-
const
|
|
61
|
-
this.
|
|
62
|
-
|
|
63
|
-
.run(...ids);
|
|
73
|
+
const set = new Set(ids);
|
|
74
|
+
this.rows = this.rows.filter(r => !set.has(r.id));
|
|
75
|
+
this.save();
|
|
64
76
|
}
|
|
65
77
|
bump(ids) {
|
|
66
78
|
if (ids.length === 0)
|
|
67
79
|
return;
|
|
68
|
-
const
|
|
69
|
-
this.
|
|
70
|
-
.
|
|
71
|
-
|
|
80
|
+
const set = new Set(ids);
|
|
81
|
+
for (const r of this.rows) {
|
|
82
|
+
if (set.has(r.id)) {
|
|
83
|
+
r.attempts++;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
this.save();
|
|
72
87
|
}
|
|
73
88
|
size() {
|
|
74
|
-
|
|
75
|
-
.prepare("SELECT COUNT(*) AS n FROM spect8_queue")
|
|
76
|
-
.get();
|
|
77
|
-
return row.n;
|
|
89
|
+
return this.rows.length;
|
|
78
90
|
}
|
|
79
91
|
close() {
|
|
80
|
-
this.
|
|
92
|
+
this.save();
|
|
81
93
|
}
|
|
82
94
|
}
|
|
83
95
|
//# sourceMappingURL=offline_queue.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"offline_queue.js","sourceRoot":"","sources":["../../src/transport/offline_queue.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"offline_queue.js","sourceRoot":"","sources":["../../src/transport/offline_queue.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "spect8-mcp",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"description": "Spect8 local MCP server: captures tool events + token usage from Cursor and Claude Code, posts HMAC-signed batches to the Spect8 ingest API.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/server.js",
|
|
@@ -15,6 +15,7 @@
|
|
|
15
15
|
"README.md"
|
|
16
16
|
],
|
|
17
17
|
"scripts": {
|
|
18
|
+
"preinstall": "node scripts/preinstall.js",
|
|
18
19
|
"build": "tsc -p tsconfig.json",
|
|
19
20
|
"dev": "tsc -w -p tsconfig.json",
|
|
20
21
|
"start": "node dist/server.js",
|
|
@@ -25,13 +26,11 @@
|
|
|
25
26
|
},
|
|
26
27
|
"dependencies": {
|
|
27
28
|
"@modelcontextprotocol/sdk": "^1.0.0",
|
|
28
|
-
"better-sqlite3": "^11.5.0",
|
|
29
29
|
"chokidar": "^3.6.0",
|
|
30
30
|
"undici": "^6.20.0",
|
|
31
31
|
"zod": "^3.23.8"
|
|
32
32
|
},
|
|
33
33
|
"devDependencies": {
|
|
34
|
-
"@types/better-sqlite3": "^7.6.11",
|
|
35
34
|
"@types/node": "^22.0.0",
|
|
36
35
|
"@typescript-eslint/eslint-plugin": "^7.18.0",
|
|
37
36
|
"@typescript-eslint/parser": "^7.18.0",
|